Complete rewrite
This commit is contained in:
125
src/irc/user.go
Normal file
125
src/irc/user.go
Normal file
@@ -0,0 +1,125 @@
|
||||
package irc
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"slices"
|
||||
|
||||
"git.chromaticdragon.app/pyrex/minimal-irc-server/v2/src/transport"
|
||||
)
|
||||
|
||||
type User struct {
|
||||
clientId transport.ClientId
|
||||
hostString *string
|
||||
sourceString *string
|
||||
nick *Nick
|
||||
username *string
|
||||
realName *string
|
||||
|
||||
hasReceivedAuthHandshakeReply bool
|
||||
|
||||
channels []canonicalChannelName
|
||||
}
|
||||
|
||||
func NewUsersSystem() *UsersSystem {
|
||||
return &UsersSystem{
|
||||
clientIdIndex: make(map[transport.ClientId]*User),
|
||||
nickIndex: make(map[canonicalNick]*User),
|
||||
channelNameIndex: make(map[canonicalChannelName]map[*User]struct{}),
|
||||
}
|
||||
}
|
||||
|
||||
func (user *User) recomputeSourceString() {
|
||||
nick := "unknown"
|
||||
if user.nick != nil {
|
||||
nick = (*user.nick).Value
|
||||
}
|
||||
hstr := fmt.Sprintf("clients/%d", user.clientId)
|
||||
sstr := fmt.Sprintf("%s!%s", nick, hstr)
|
||||
user.hostString = &hstr
|
||||
user.sourceString = &sstr
|
||||
}
|
||||
|
||||
func (user *User) GetClientId() transport.ClientId {
|
||||
return user.clientId
|
||||
}
|
||||
|
||||
func (user *User) GetHostString() string {
|
||||
return *user.hostString
|
||||
}
|
||||
|
||||
func (user *User) GetSourceString() string {
|
||||
return *user.sourceString
|
||||
}
|
||||
|
||||
func (user *User) GetNick() *Nick {
|
||||
return user.nick
|
||||
}
|
||||
|
||||
func (user *User) SetNick(newNick *Nick) error {
|
||||
oldNick := user.nick
|
||||
return Dispatch(
|
||||
func(nch NickChangeHandler) error {
|
||||
return nch.AskPermissionForNickChange(user, oldNick, newNick)
|
||||
},
|
||||
func(nch NickChangeHandler) {
|
||||
nch.HandleNickChange(user, oldNick, newNick)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func (user *User) GetUsername() *string {
|
||||
return user.username
|
||||
}
|
||||
|
||||
func (user *User) SetUsername(username *string) {
|
||||
user.username = username
|
||||
}
|
||||
|
||||
func (user *User) GetRealName() *string {
|
||||
return user.realName
|
||||
}
|
||||
|
||||
func (user *User) SetRealName(realName *string) {
|
||||
user.realName = realName
|
||||
}
|
||||
|
||||
func (user *User) GetHasReceivedAuthHandshakeReply() bool {
|
||||
return user.hasReceivedAuthHandshakeReply
|
||||
}
|
||||
|
||||
func (user *User) SetHasReceivedAuthHandshakeReply(value bool) {
|
||||
user.hasReceivedAuthHandshakeReply = value
|
||||
}
|
||||
|
||||
func (user *User) IsInChannel(channelName ChannelName) bool {
|
||||
return slices.ContainsFunc(user.channels, func(existingChannel canonicalChannelName) bool {
|
||||
return channelName.canonical == existingChannel
|
||||
})
|
||||
}
|
||||
|
||||
func (user *User) GetChannels() []canonicalChannelName {
|
||||
return user.channels
|
||||
|
||||
}
|
||||
|
||||
func (user *User) Join(channelName ChannelName) error {
|
||||
return Dispatch(
|
||||
func(pjh PartJoinHandler) error {
|
||||
return pjh.AskPermissionForJoin(user, channelName)
|
||||
},
|
||||
func(pjh PartJoinHandler) {
|
||||
pjh.HandleJoin(user, channelName)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func (user *User) Part(channelName ChannelName, reason *string) error {
|
||||
return Dispatch(
|
||||
func(pjh PartJoinHandler) error {
|
||||
return pjh.AskPermissionForPart(user, channelName, reason)
|
||||
},
|
||||
func(pjh PartJoinHandler) {
|
||||
pjh.HandlePart(user, channelName, reason)
|
||||
},
|
||||
)
|
||||
}
|
Reference in New Issue
Block a user