|
@@ -32,6 +32,9 @@ var (
|
32
|
32
|
// to confirm that the client actually has a valid operclass)
|
33
|
33
|
func ApplyUserModeChanges(client *Client, changes modes.ModeChanges, force bool, oper *Oper) modes.ModeChanges {
|
34
|
34
|
applied := make(modes.ModeChanges, 0)
|
|
35
|
+ // #1617: if the user is offline, they are not counted in LUSERS,
|
|
36
|
+ // so don't modify the LUSERS stats for +i or +o.
|
|
37
|
+ present := len(client.Sessions()) != 0
|
35
|
38
|
|
36
|
39
|
for _, change := range changes {
|
37
|
40
|
if change.Mode != modes.ServerNotice {
|
|
@@ -42,9 +45,9 @@ func ApplyUserModeChanges(client *Client, changes modes.ModeChanges, force bool,
|
42
|
45
|
}
|
43
|
46
|
|
44
|
47
|
if client.SetMode(change.Mode, true) {
|
45
|
|
- if change.Mode == modes.Invisible {
|
|
48
|
+ if change.Mode == modes.Invisible && present {
|
46
|
49
|
client.server.stats.ChangeInvisible(1)
|
47
|
|
- } else if change.Mode == modes.Operator {
|
|
50
|
+ } else if change.Mode == modes.Operator && present {
|
48
|
51
|
client.server.stats.ChangeOperators(1)
|
49
|
52
|
}
|
50
|
53
|
applied = append(applied, change)
|
|
@@ -53,11 +56,13 @@ func ApplyUserModeChanges(client *Client, changes modes.ModeChanges, force bool,
|
53
|
56
|
case modes.Remove:
|
54
|
57
|
var removedSnomasks string
|
55
|
58
|
if client.SetMode(change.Mode, false) {
|
56
|
|
- if change.Mode == modes.Invisible {
|
|
59
|
+ if change.Mode == modes.Invisible && present {
|
57
|
60
|
client.server.stats.ChangeInvisible(-1)
|
58
|
61
|
} else if change.Mode == modes.Operator {
|
59
|
62
|
removedSnomasks = client.server.snomasks.String(client)
|
60
|
|
- client.server.stats.ChangeOperators(-1)
|
|
63
|
+ if present {
|
|
64
|
+ client.server.stats.ChangeOperators(-1)
|
|
65
|
+ }
|
61
|
66
|
applyOper(client, nil, nil)
|
62
|
67
|
if removedSnomasks != "" {
|
63
|
68
|
client.server.snomasks.RemoveClient(client)
|