/
mode.go
122 lines (100 loc) · 1.97 KB
/
mode.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
* Copyright 2014 The starfruit Authors. All rights reserved.
* Use of this source code is governed by a BSD-style
* license that can be found in the LICENSE file.
*/
package module
import (
"github.com/flatpeach/starfruit/message"
"github.com/flatpeach/starfruit/server"
"github.com/flatpeach/starfruit/user"
)
type Mode struct{}
func (module *Mode) Handle(s *server.Server, u *user.User, m *message.Message) error {
// MODE <nickname> *( ( "+" / "-" ) *( "i" / "w" / "o" / "O" / "r" ) )
if len(m.Params) < 1 {
u.SendErrorNeedMoreParams("MODE")
return nil
}
nickName := m.Params[0]
if u.NickName != nickName {
u.SendMessage(message.New(
s.Config.Server.Name,
message.ERR_USERSDONTMATCH,
[]string{
u.NickName,
},
"Cannot change mode for other users",
))
return nil
}
if len(m.Params) == 1 {
// Return current user modes
u.SendMessage(message.New(
s.Config.Server.Name,
message.RPL_UMODEIS,
[]string{
u.NickName,
u.Modes(),
},
nil,
))
return nil
}
modes := m.Params[1]
if modes[0] != '+' && modes[0] != '-' {
return nil
}
operator := modes[0]
for _, mode := range modes[1:] {
if mode == 'a' {
continue
}
if operator == '+' {
if mode == 'o' || mode == 'O' {
continue
}
}
var m user.Mode
switch mode {
case 'i':
m = user.ModeInvisible
case 'w':
m = user.ModeReceiveWallops
case 'r':
m = user.ModeRestrictedUserConnection
case 'o':
m = user.ModeOperator
case 'O':
m = user.ModeLocalOperator
case 's':
m = user.ModeReceiveServiceNotice
default:
u.SendMessage(message.New(
s.Config.Server.Name,
message.ERR_UMODEUNKNOWNFLAG,
[]string{
u.NickName,
},
"Unknown MODE flag",
))
return nil
}
if m != 0 {
if operator == '+' {
u.MarkMode(m)
} else if operator == '-' {
u.ClearMode(m)
}
}
}
u.SendMessage(message.New(
s.Config.Server.Name,
"MODE",
[]string{
u.NickName,
},
modes,
))
return nil
}