mirror of
https://github.com/ergochat/ergo.git
synced 2024-12-23 11:12:44 +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;
|
// helper for persisting channel-user modes for always-on clients;
|
||||||
// return the channel name and all channel-user modes for a client
|
// 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()
|
channel.stateMutex.RLock()
|
||||||
defer channel.stateMutex.RUnlock()
|
defer channel.stateMutex.RUnlock()
|
||||||
chname = channel.name
|
chname = channel.name
|
||||||
data := channel.members[client]
|
data, ok := channel.members[client]
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
status.Modes = data.modes.String()
|
status.Modes = data.modes.String()
|
||||||
status.JoinTime = data.joinTime
|
status.JoinTime = data.joinTime
|
||||||
return
|
return
|
||||||
|
@ -1803,7 +1803,11 @@ func (client *Client) performWrite(additionalDirtyBits uint) {
|
|||||||
channels := client.Channels()
|
channels := client.Channels()
|
||||||
channelToModes := make(map[string]alwaysOnChannelStatus, len(channels))
|
channelToModes := make(map[string]alwaysOnChannelStatus, len(channels))
|
||||||
for _, channel := range 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
|
channelToModes[chname] = status
|
||||||
}
|
}
|
||||||
client.server.accounts.saveChannels(account, channelToModes)
|
client.server.accounts.saveChannels(account, channelToModes)
|
||||||
|
Loading…
Reference in New Issue
Block a user