forked from External/ergo
fix #1617
Prevent LUSERS stats from getting out of sync when modes are modified on offline clients.
This commit is contained in:
parent
fed002d11a
commit
eb2dfa78c9
1 changed files with 9 additions and 4 deletions
11
irc/modes.go
11
irc/modes.go
|
|
@ -32,6 +32,9 @@ var (
|
||||||
// to confirm that the client actually has a valid operclass)
|
// to confirm that the client actually has a valid operclass)
|
||||||
func ApplyUserModeChanges(client *Client, changes modes.ModeChanges, force bool, oper *Oper) modes.ModeChanges {
|
func ApplyUserModeChanges(client *Client, changes modes.ModeChanges, force bool, oper *Oper) modes.ModeChanges {
|
||||||
applied := make(modes.ModeChanges, 0)
|
applied := make(modes.ModeChanges, 0)
|
||||||
|
// #1617: if the user is offline, they are not counted in LUSERS,
|
||||||
|
// so don't modify the LUSERS stats for +i or +o.
|
||||||
|
present := len(client.Sessions()) != 0
|
||||||
|
|
||||||
for _, change := range changes {
|
for _, change := range changes {
|
||||||
if change.Mode != modes.ServerNotice {
|
if change.Mode != modes.ServerNotice {
|
||||||
|
|
@ -42,9 +45,9 @@ func ApplyUserModeChanges(client *Client, changes modes.ModeChanges, force bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
if client.SetMode(change.Mode, true) {
|
if client.SetMode(change.Mode, true) {
|
||||||
if change.Mode == modes.Invisible {
|
if change.Mode == modes.Invisible && present {
|
||||||
client.server.stats.ChangeInvisible(1)
|
client.server.stats.ChangeInvisible(1)
|
||||||
} else if change.Mode == modes.Operator {
|
} else if change.Mode == modes.Operator && present {
|
||||||
client.server.stats.ChangeOperators(1)
|
client.server.stats.ChangeOperators(1)
|
||||||
}
|
}
|
||||||
applied = append(applied, change)
|
applied = append(applied, change)
|
||||||
|
|
@ -53,11 +56,13 @@ func ApplyUserModeChanges(client *Client, changes modes.ModeChanges, force bool,
|
||||||
case modes.Remove:
|
case modes.Remove:
|
||||||
var removedSnomasks string
|
var removedSnomasks string
|
||||||
if client.SetMode(change.Mode, false) {
|
if client.SetMode(change.Mode, false) {
|
||||||
if change.Mode == modes.Invisible {
|
if change.Mode == modes.Invisible && present {
|
||||||
client.server.stats.ChangeInvisible(-1)
|
client.server.stats.ChangeInvisible(-1)
|
||||||
} else if change.Mode == modes.Operator {
|
} else if change.Mode == modes.Operator {
|
||||||
removedSnomasks = client.server.snomasks.String(client)
|
removedSnomasks = client.server.snomasks.String(client)
|
||||||
|
if present {
|
||||||
client.server.stats.ChangeOperators(-1)
|
client.server.stats.ChangeOperators(-1)
|
||||||
|
}
|
||||||
applyOper(client, nil, nil)
|
applyOper(client, nil, nil)
|
||||||
if removedSnomasks != "" {
|
if removedSnomasks != "" {
|
||||||
client.server.snomasks.RemoveClient(client)
|
client.server.snomasks.RemoveClient(client)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue