Complete rewrite

This commit is contained in:
2025-10-01 21:24:29 -07:00
parent 5b29c26102
commit 5b0b6a48a9
18 changed files with 371 additions and 374 deletions

125
src/irc/user.go Normal file
View 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)
},
)
}