Browse Source

ONICK command to allow operators to change users' nicks

tags/v0.1.0
Jeremy Latt 10 years ago
parent
commit
8c44bb9ff3
5 changed files with 116 additions and 66 deletions
  1. 4
    0
      irc/client.go
  2. 12
    9
      irc/commands.go
  3. 1
    0
      irc/constants.go
  4. 99
    0
      irc/nickname.go
  5. 0
    57
      irc/server.go

+ 4
- 0
irc/client.go View File

@@ -227,6 +227,10 @@ func (client *Client) Friends() ClientSet {
227 227
 }
228 228
 
229 229
 func (client *Client) SetNickname(nickname Name) {
230
+	if client.HasNick() {
231
+		Log.error.Printf("%s nickname already set!", client)
232
+		return
233
+	}
230 234
 	client.nick = nickname
231 235
 	client.server.clients.Add(client)
232 236
 }

+ 12
- 9
irc/commands.go View File

@@ -40,6 +40,7 @@ var (
40 40
 		NAMES:   NewNamesCommand,
41 41
 		NICK:    NewNickCommand,
42 42
 		NOTICE:  NewNoticeCommand,
43
+		ONICK:   NewOperNickCommand,
43 44
 		OPER:    NewOperCommand,
44 45
 		PART:    NewPartCommand,
45 46
 		PASS:    NewPassCommand,
@@ -228,15 +229,6 @@ func NewPassCommand(args []string) (Command, error) {
228 229
 
229 230
 // NICK <nickname>
230 231
 
231
-type NickCommand struct {
232
-	BaseCommand
233
-	nickname Name
234
-}
235
-
236
-func (m *NickCommand) String() string {
237
-	return fmt.Sprintf("NICK(nickname=%s)", m.nickname)
238
-}
239
-
240 232
 func NewNickCommand(args []string) (Command, error) {
241 233
 	if len(args) != 1 {
242 234
 		return nil, NotEnoughArgsError
@@ -1006,3 +998,14 @@ func NewWhoWasCommand(args []string) (Command, error) {
1006 998
 	}
1007 999
 	return cmd, nil
1008 1000
 }
1001
+
1002
+func NewOperNickCommand(args []string) (Command, error) {
1003
+	if len(args) < 2 {
1004
+		return nil, NotEnoughArgsError
1005
+	}
1006
+
1007
+	return &OperNickCommand{
1008
+		target: NewName(args[0]),
1009
+		nick:   NewName(args[1]),
1010
+	}, nil
1011
+}

+ 1
- 0
irc/constants.go View File

@@ -21,6 +21,7 @@ const (
21 21
 	NAMES   StringCode = "NAMES"
22 22
 	NICK    StringCode = "NICK"
23 23
 	NOTICE  StringCode = "NOTICE"
24
+	ONICK   StringCode = "ONICK"
24 25
 	OPER    StringCode = "OPER"
25 26
 	PART    StringCode = "PART"
26 27
 	PASS    StringCode = "PASS"

+ 99
- 0
irc/nickname.go View File

@@ -0,0 +1,99 @@
1
+package irc
2
+
3
+import (
4
+	"fmt"
5
+)
6
+
7
+type NickCommand struct {
8
+	BaseCommand
9
+	nickname Name
10
+}
11
+
12
+func (m *NickCommand) String() string {
13
+	return fmt.Sprintf("NICK(nickname=%s)", m.nickname)
14
+}
15
+
16
+func (m *NickCommand) HandleRegServer(s *Server) {
17
+	client := m.Client()
18
+	if !client.authorized {
19
+		client.ErrPasswdMismatch()
20
+		client.Quit("bad password")
21
+		return
22
+	}
23
+
24
+	if client.capState == CapNegotiating {
25
+		client.capState = CapNegotiated
26
+	}
27
+
28
+	if m.nickname == "" {
29
+		client.ErrNoNicknameGiven()
30
+		return
31
+	}
32
+
33
+	if s.clients.Get(m.nickname) != nil {
34
+		client.ErrNickNameInUse(m.nickname)
35
+		return
36
+	}
37
+
38
+	if !m.nickname.IsNickname() {
39
+		client.ErrErroneusNickname(m.nickname)
40
+		return
41
+	}
42
+
43
+	client.SetNickname(m.nickname)
44
+	s.tryRegister(client)
45
+}
46
+
47
+func (msg *NickCommand) HandleServer(server *Server) {
48
+	client := msg.Client()
49
+
50
+	if msg.nickname == "" {
51
+		client.ErrNoNicknameGiven()
52
+		return
53
+	}
54
+
55
+	if !msg.nickname.IsNickname() {
56
+		client.ErrErroneusNickname(msg.nickname)
57
+		return
58
+	}
59
+
60
+	if msg.nickname == client.nick {
61
+		return
62
+	}
63
+
64
+	target := server.clients.Get(msg.nickname)
65
+	if (target != nil) && (target != client) {
66
+		client.ErrNickNameInUse(msg.nickname)
67
+		return
68
+	}
69
+
70
+	client.ChangeNickname(msg.nickname)
71
+}
72
+
73
+type OperNickCommand struct {
74
+	BaseCommand
75
+	target Name
76
+	nick   Name
77
+}
78
+
79
+func (msg *OperNickCommand) HandleServer(server *Server) {
80
+	client := msg.Client()
81
+
82
+	if !client.flags[Operator] {
83
+		client.ErrNoPrivileges()
84
+		return
85
+	}
86
+
87
+	if !msg.nick.IsNickname() {
88
+		client.ErrErroneusNickname(msg.nick)
89
+		return
90
+	}
91
+
92
+	target := server.clients.Get(msg.target)
93
+	if target == nil {
94
+		client.ErrNoSuchNick(msg.target)
95
+		return
96
+	}
97
+
98
+	target.ChangeNickname(msg.nick)
99
+}

+ 0
- 57
irc/server.go View File

@@ -289,37 +289,6 @@ func (msg *ProxyCommand) HandleRegServer(server *Server) {
289 289
 	msg.Client().hostname = msg.hostname
290 290
 }
291 291
 
292
-func (m *NickCommand) HandleRegServer(s *Server) {
293
-	client := m.Client()
294
-	if !client.authorized {
295
-		client.ErrPasswdMismatch()
296
-		client.Quit("bad password")
297
-		return
298
-	}
299
-
300
-	if client.capState == CapNegotiating {
301
-		client.capState = CapNegotiated
302
-	}
303
-
304
-	if m.nickname == "" {
305
-		client.ErrNoNicknameGiven()
306
-		return
307
-	}
308
-
309
-	if s.clients.Get(m.nickname) != nil {
310
-		client.ErrNickNameInUse(m.nickname)
311
-		return
312
-	}
313
-
314
-	if !m.nickname.IsNickname() {
315
-		client.ErrErroneusNickname(m.nickname)
316
-		return
317
-	}
318
-
319
-	client.SetNickname(m.nickname)
320
-	s.tryRegister(client)
321
-}
322
-
323 292
 func (msg *RFC1459UserCommand) HandleRegServer(server *Server) {
324 293
 	client := msg.Client()
325 294
 	if !client.authorized {
@@ -380,32 +349,6 @@ func (m *PongCommand) HandleServer(s *Server) {
380 349
 	// no-op
381 350
 }
382 351
 
383
-func (msg *NickCommand) HandleServer(server *Server) {
384
-	client := msg.Client()
385
-
386
-	if msg.nickname == "" {
387
-		client.ErrNoNicknameGiven()
388
-		return
389
-	}
390
-
391
-	if !msg.nickname.IsNickname() {
392
-		client.ErrErroneusNickname(msg.nickname)
393
-		return
394
-	}
395
-
396
-	if msg.nickname == client.nick {
397
-		return
398
-	}
399
-
400
-	target := server.clients.Get(msg.nickname)
401
-	if (target != nil) && (target != client) {
402
-		client.ErrNickNameInUse(msg.nickname)
403
-		return
404
-	}
405
-
406
-	client.ChangeNickname(msg.nickname)
407
-}
408
-
409 352
 func (m *UserCommand) HandleServer(s *Server) {
410 353
 	m.Client().ErrAlreadyRegistered()
411 354
 }

Loading…
Cancel
Save