Просмотр исходного кода

fix #1617

Prevent LUSERS stats from getting out of sync when modes are
modified on offline clients.
tags/v2.7.0-rc1
Shivaram Lingamneni 3 лет назад
Родитель
Сommit
eb2dfa78c9
1 измененных файлов: 9 добавлений и 4 удалений
  1. 9
    4
      irc/modes.go

+ 9
- 4
irc/modes.go Просмотреть файл

@@ -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)

Загрузка…
Отмена
Сохранить