mirror of
https://github.com/ergochat/ergo.git
synced 2024-11-15 00:19:29 +01:00
fix #2113
Persisting always-on clients was panicking if client X believed it was a member of channel Y, but channel Y didn't have a record of client X.
This commit is contained in:
parent
a4d160b76d
commit
4aa1aa371d
@ -545,11 +545,14 @@ func (channel *Channel) ClientStatus(client *Client) (present bool, joinTimeSecs
|
||||
|
||||
// helper for persisting channel-user modes for always-on clients;
|
||||
// return the channel name and all channel-user modes for a client
|
||||
func (channel *Channel) alwaysOnStatus(client *Client) (chname string, status alwaysOnChannelStatus) {
|
||||
func (channel *Channel) alwaysOnStatus(client *Client) (ok bool, chname string, status alwaysOnChannelStatus) {
|
||||
channel.stateMutex.RLock()
|
||||
defer channel.stateMutex.RUnlock()
|
||||
chname = channel.name
|
||||
data := channel.members[client]
|
||||
data, ok := channel.members[client]
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
status.Modes = data.modes.String()
|
||||
status.JoinTime = data.joinTime
|
||||
return
|
||||
|
@ -1803,7 +1803,11 @@ func (client *Client) performWrite(additionalDirtyBits uint) {
|
||||
channels := client.Channels()
|
||||
channelToModes := make(map[string]alwaysOnChannelStatus, len(channels))
|
||||
for _, channel := range channels {
|
||||
chname, status := channel.alwaysOnStatus(client)
|
||||
ok, chname, status := channel.alwaysOnStatus(client)
|
||||
if !ok {
|
||||
client.server.logger.Error("internal", "client and channel membership out of sync", chname, client.Nick())
|
||||
continue
|
||||
}
|
||||
channelToModes[chname] = status
|
||||
}
|
||||
client.server.accounts.saveChannels(account, channelToModes)
|
||||
|
Loading…
Reference in New Issue
Block a user