|
@@ -13,8 +13,8 @@ type Message interface {
|
13
|
13
|
}
|
14
|
14
|
|
15
|
15
|
var (
|
16
|
|
- ErrNotEnoughArgs = errors.New("not enough arguments")
|
17
|
|
- ErrUModeUnknownFlag = errors.New("unknown umode flag")
|
|
16
|
+ NotEnoughArgsError = errors.New("not enough arguments")
|
|
17
|
+ UModeUnknownFlagError = errors.New("unknown umode flag")
|
18
|
18
|
)
|
19
|
19
|
|
20
|
20
|
// unknown
|
|
@@ -38,7 +38,7 @@ type PingMessage struct {
|
38
|
38
|
|
39
|
39
|
func NewPingMessage(args []string) (Message, error) {
|
40
|
40
|
if len(args) < 1 {
|
41
|
|
- return nil, ErrNotEnoughArgs
|
|
41
|
+ return nil, NotEnoughArgsError
|
42
|
42
|
}
|
43
|
43
|
msg := &PingMessage{server: args[0]}
|
44
|
44
|
if len(args) > 1 {
|
|
@@ -60,7 +60,7 @@ type PongMessage struct {
|
60
|
60
|
|
61
|
61
|
func NewPongMessage(args []string) (Message, error) {
|
62
|
62
|
if len(args) < 1 {
|
63
|
|
- return nil, ErrNotEnoughArgs
|
|
63
|
+ return nil, NotEnoughArgsError
|
64
|
64
|
}
|
65
|
65
|
message := &PongMessage{server1: args[0]}
|
66
|
66
|
if len(args) > 1 {
|
|
@@ -73,6 +73,27 @@ func (m *PongMessage) Handle(s *Server, c *Client) {
|
73
|
73
|
// no-op
|
74
|
74
|
}
|
75
|
75
|
|
|
76
|
+// PASS <password>
|
|
77
|
+
|
|
78
|
+type PassMessage struct {
|
|
79
|
+ password string
|
|
80
|
+}
|
|
81
|
+
|
|
82
|
+func NewPassMessage(args []string) (Message, error) {
|
|
83
|
+ if len(args) < 1 {
|
|
84
|
+ return nil, NotEnoughArgsError
|
|
85
|
+ }
|
|
86
|
+ return &PassMessage{password: args[0]}
|
|
87
|
+}
|
|
88
|
+
|
|
89
|
+func (m *PassMessage) Handle(s *Server, c *Client) {
|
|
90
|
+ if m.password == server.password {
|
|
91
|
+ c.serverPass = true
|
|
92
|
+ } else {
|
|
93
|
+ c.send <- ErrPass
|
|
94
|
+ }
|
|
95
|
+}
|
|
96
|
+
|
76
|
97
|
// NICK
|
77
|
98
|
|
78
|
99
|
type NickMessage struct {
|
|
@@ -81,7 +102,7 @@ type NickMessage struct {
|
81
|
102
|
|
82
|
103
|
func NewNickMessage(args []string) (Message, error) {
|
83
|
104
|
if len(args) != 1 {
|
84
|
|
- return nil, ErrNotEnoughArgs
|
|
105
|
+ return nil, NotEnoughArgsError
|
85
|
106
|
}
|
86
|
107
|
return &NickMessage{args[0]}, nil
|
87
|
108
|
}
|
|
@@ -101,7 +122,7 @@ type UserMessage struct {
|
101
|
122
|
|
102
|
123
|
func NewUserMessage(args []string) (Message, error) {
|
103
|
124
|
if len(args) != 4 {
|
104
|
|
- return nil, ErrNotEnoughArgs
|
|
125
|
+ return nil, NotEnoughArgsError
|
105
|
126
|
}
|
106
|
127
|
msg := &UserMessage{
|
107
|
128
|
user: args[0],
|
|
@@ -119,7 +140,7 @@ func (m *UserMessage) Handle(s *Server, c *Client) {
|
119
|
140
|
s.UserLogin(c, m.user, m.realname)
|
120
|
141
|
}
|
121
|
142
|
|
122
|
|
-// QUIT
|
|
143
|
+// QUIT [ <Quit Message> ]
|
123
|
144
|
|
124
|
145
|
type QuitMessage struct {
|
125
|
146
|
message string
|
|
@@ -137,18 +158,19 @@ func (m *QuitMessage) Handle(s *Server, c *Client) {
|
137
|
158
|
s.Quit(c, m.message)
|
138
|
159
|
}
|
139
|
160
|
|
140
|
|
-// MODE
|
|
161
|
+// MODE <nickname> *( ( "+" / "-" ) *( "i" / "w" / "o" / "O" / "r" ) )
|
141
|
162
|
|
142
|
163
|
type ModeMessage struct {
|
143
|
164
|
nickname string
|
144
|
165
|
modes []string
|
145
|
166
|
}
|
146
|
167
|
|
147
|
|
-var MODE_RE = regexp.MustCompile("^[-+][a-zA-Z]+$")
|
|
168
|
+// mode s is accepted but ignored, like some other modes
|
|
169
|
+var MODE_RE = regexp.MustCompile("^[-+][iwroOs]+$")
|
148
|
170
|
|
149
|
171
|
func NewModeMessage(args []string) (Message, error) {
|
150
|
172
|
if len(args) < 1 {
|
151
|
|
- return nil, ErrNotEnoughArgs
|
|
173
|
+ return nil, NotEnoughArgsError
|
152
|
174
|
}
|
153
|
175
|
msg := &ModeMessage{
|
154
|
176
|
nickname: args[0],
|
|
@@ -174,7 +196,7 @@ func (m *ModeMessage) Handle(s *Server, c *Client) {
|
174
|
196
|
s.ChangeUserMode(c, m.modes)
|
175
|
197
|
}
|
176
|
198
|
|
177
|
|
-// JOIN
|
|
199
|
+// JOIN ( <channel> *( "," <channel> ) [ <key> *( "," <key> ) ] ) / "0"
|
178
|
200
|
|
179
|
201
|
type JoinMessage struct {
|
180
|
202
|
channels []string
|
|
@@ -224,7 +246,7 @@ type PartMessage struct {
|
224
|
246
|
|
225
|
247
|
func NewPartMessage(args []string) (Message, error) {
|
226
|
248
|
if len(args) < 1 {
|
227
|
|
- return nil, ErrNotEnoughArgs
|
|
249
|
+ return nil, NotEnoughArgsError
|
228
|
250
|
}
|
229
|
251
|
msg := &PartMessage{channels: strings.Split(args[0], ",")}
|
230
|
252
|
if len(args) > 1 {
|
|
@@ -255,7 +277,7 @@ type PrivMsgMessage struct {
|
255
|
277
|
|
256
|
278
|
func NewPrivMsgMessage(args []string) (Message, error) {
|
257
|
279
|
if len(args) < 2 {
|
258
|
|
- return nil, ErrNotEnoughArgs
|
|
280
|
+ return nil, NotEnoughArgsError
|
259
|
281
|
}
|
260
|
282
|
return &PrivMsgMessage{
|
261
|
283
|
target: args[0],
|
|
@@ -298,7 +320,7 @@ type TopicMessage struct {
|
298
|
320
|
|
299
|
321
|
func NewTopicMessage(args []string) (Message, error) {
|
300
|
322
|
if len(args) < 1 {
|
301
|
|
- return nil, ErrNotEnoughArgs
|
|
323
|
+ return nil, NotEnoughArgsError
|
302
|
324
|
}
|
303
|
325
|
msg := &TopicMessage{channel: args[0]}
|
304
|
326
|
if len(args) > 1 {
|
|
@@ -329,7 +351,7 @@ type InviteMessage struct {
|
329
|
351
|
|
330
|
352
|
func NewInviteMessage(args []string) (Message, error) {
|
331
|
353
|
if len(args) < 2 {
|
332
|
|
- return nil, ErrNotEnoughArgs
|
|
354
|
+ return nil, NotEnoughArgsError
|
333
|
355
|
}
|
334
|
356
|
return &InviteMessage{
|
335
|
357
|
nickname: args[0],
|
|
@@ -352,3 +374,28 @@ func (m *InviteMessage) Handle(s *Server, c *Client) {
|
352
|
374
|
|
353
|
375
|
channel.Invite(c, invitee)
|
354
|
376
|
}
|
|
377
|
+
|
|
378
|
+// OPER <name> <password>
|
|
379
|
+
|
|
380
|
+type OperMessage struct {
|
|
381
|
+ name string
|
|
382
|
+ password string
|
|
383
|
+}
|
|
384
|
+
|
|
385
|
+func NewOperMessage(args []string) Message {
|
|
386
|
+ if len(args) < 2 {
|
|
387
|
+ return nil, NotEnoughArgsError
|
|
388
|
+ }
|
|
389
|
+ return &OperMessage{
|
|
390
|
+ name: args[0],
|
|
391
|
+ password: args[1],
|
|
392
|
+ }
|
|
393
|
+}
|
|
394
|
+
|
|
395
|
+func (m *OperMessage) Handle(s *Server, c *Client) {
|
|
396
|
+ if s.operators[m.name] == m.password {
|
|
397
|
+ c.send <- RplYoureOper(s)
|
|
398
|
+ } else {
|
|
399
|
+ c.send <- ErrPasswdMismatch(s)
|
|
400
|
+ }
|
|
401
|
+}
|