Files
minimal-irc-server/src/irc/user.go

96 lines
2.1 KiB
Go

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 (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 {
return Perform(NickChangeAction{User: user, OldNick: user.nick, NewNick: 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 Perform(JoinAction{User: user, ChannelName: channelName})
}
func (user *User) Part(channelName ChannelName, reason *string) error {
return Perform(PartAction{User: user, ChannelName: channelName, Reason: reason})
}