Преглед на файлове

clean up general command and name handling

tags/v0.1.0
Jeremy Latt преди 10 години
родител
ревизия
1a7f56a903
променени са 5 файла, в които са добавени 48 реда и са изтрити 29 реда
  1. 1
    8
      irc/channel.go
  2. 8
    5
      irc/client.go
  3. 8
    0
      irc/constants.go
  4. 5
    0
      irc/reply.go
  5. 26
    16
      irc/server.go

+ 1
- 8
irc/channel.go Целия файл

@@ -15,14 +15,7 @@ type Channel struct {
15 15
 }
16 16
 
17 17
 func IsChannel(target string) bool {
18
-	if target == "" {
19
-		return false
20
-	}
21
-	switch target[0] {
22
-	case '&', '#', '+', '!':
23
-		return true
24
-	}
25
-	return false
18
+	return ChannelNameExpr.MatchString(target)
26 19
 }
27 20
 
28 21
 // NewChannel creates a new channel from a `Server` and a `name`

+ 8
- 5
irc/client.go Целия файл

@@ -8,6 +8,10 @@ import (
8 8
 	"time"
9 9
 )
10 10
 
11
+func IsNickname(nick string) bool {
12
+	return NicknameExpr.MatchString(nick)
13
+}
14
+
11 15
 type Client struct {
12 16
 	atime       time.Time
13 17
 	awayMessage string
@@ -43,8 +47,7 @@ func NewClient(server *Server, conn net.Conn) *Client {
43 47
 		socket:   NewSocket(conn),
44 48
 	}
45 49
 
46
-	client.loginTimer = time.AfterFunc(LOGIN_TIMEOUT, client.ConnectionClosed)
47
-
50
+	client.loginTimer = time.AfterFunc(LOGIN_TIMEOUT, client.connectionClosed)
48 51
 	go client.readCommands()
49 52
 	go client.writeReplies()
50 53
 
@@ -94,7 +97,7 @@ func (client *Client) Touch() {
94 97
 
95 98
 func (client *Client) Idle() {
96 99
 	if client.quitTimer == nil {
97
-		client.quitTimer = time.AfterFunc(QUIT_TIMEOUT, client.ConnectionTimeout)
100
+		client.quitTimer = time.AfterFunc(QUIT_TIMEOUT, client.connectionTimeout)
98 101
 	} else {
99 102
 		client.quitTimer.Reset(QUIT_TIMEOUT)
100 103
 	}
@@ -102,7 +105,7 @@ func (client *Client) Idle() {
102 105
 	client.Reply(RplPing(client.server, client))
103 106
 }
104 107
 
105
-func (client *Client) ConnectionTimeout() {
108
+func (client *Client) connectionTimeout() {
106 109
 	msg := &QuitCommand{
107 110
 		message: "connection timeout",
108 111
 	}
@@ -110,7 +113,7 @@ func (client *Client) ConnectionTimeout() {
110 113
 	client.server.commands <- msg
111 114
 }
112 115
 
113
-func (client *Client) ConnectionClosed() {
116
+func (client *Client) connectionClosed() {
114 117
 	msg := &QuitCommand{
115 118
 		message: "connection closed",
116 119
 	}

+ 8
- 0
irc/constants.go Целия файл

@@ -2,16 +2,24 @@ package irc
2 2
 
3 3
 import (
4 4
 	"errors"
5
+	"regexp"
5 6
 	"time"
6 7
 )
7 8
 
8 9
 var (
10
+	// debugging flags
9 11
 	DEBUG_NET     = false
10 12
 	DEBUG_CLIENT  = false
11 13
 	DEBUG_CHANNEL = false
12 14
 	DEBUG_SERVER  = false
13 15
 
16
+	// errors
14 17
 	ErrAlreadyDestroyed = errors.New("already destroyed")
18
+
19
+	// regexps
20
+	ChannelNameExpr = regexp.MustCompile(`^[&!#+][[:word:]]{1,63}$`)
21
+	NicknameExpr    = regexp.MustCompile(
22
+		"^[[:alpha:]\\[\\]{}^`][[:word:]\\[\\]{}^`]{1,31}$")
15 23
 )
16 24
 
17 25
 const (

+ 5
- 0
irc/reply.go Целия файл

@@ -433,3 +433,8 @@ func ErrNoMOTD(server *Server) Reply {
433 433
 func ErrNoNicknameGiven(server *Server) Reply {
434 434
 	return NewNumericReply(server, ERR_NONICKNAMEGIVEN, ":No nickname given")
435 435
 }
436
+
437
+func ErrErroneusNickname(server *Server, nick string) Reply {
438
+	return NewNumericReply(server, ERR_ERRONEUSNICKNAME,
439
+		"%s :Erroneous nickname", nick)
440
+}

+ 26
- 16
irc/server.go Целия файл

@@ -54,37 +54,37 @@ func (server *Server) ReceiveCommands() {
54 54
 		case conn := <-server.conns:
55 55
 			NewClient(server, conn)
56 56
 
57
-		case command := <-server.commands:
57
+		case cmd := <-server.commands:
58
+			client := cmd.Client()
58 59
 			if DEBUG_SERVER {
59
-				log.Printf("%s → %s %+v", command.Client(), server, command)
60
+				log.Printf("%s → %s %s", client, server, cmd)
60 61
 			}
61
-			client := command.Client()
62 62
 
63 63
 			switch client.phase {
64 64
 			case Authorization:
65
-				authCommand, ok := command.(AuthServerCommand)
65
+				authCmd, ok := cmd.(AuthServerCommand)
66 66
 				if !ok {
67 67
 					client.Destroy()
68 68
 					continue
69 69
 				}
70
-				authCommand.HandleAuthServer(server)
70
+				authCmd.HandleAuthServer(server)
71 71
 
72 72
 			case Registration:
73
-				regCommand, ok := command.(RegServerCommand)
73
+				regCmd, ok := cmd.(RegServerCommand)
74 74
 				if !ok {
75 75
 					client.Destroy()
76 76
 					continue
77 77
 				}
78
-				regCommand.HandleRegServer(server)
78
+				regCmd.HandleRegServer(server)
79 79
 
80 80
 			default:
81
-				serverCommand, ok := command.(ServerCommand)
81
+				srvCmd, ok := cmd.(ServerCommand)
82 82
 				if !ok {
83
-					client.Reply(ErrUnknownCommand(server, command.Code()))
83
+					client.Reply(ErrUnknownCommand(server, cmd.Code()))
84 84
 					continue
85 85
 				}
86 86
 				client.Touch()
87
-				serverCommand.HandleServer(server)
87
+				srvCmd.HandleServer(server)
88 88
 			}
89 89
 		}
90 90
 	}
@@ -264,11 +264,16 @@ func (m *NickCommand) HandleRegServer(s *Server) {
264 264
 		return
265 265
 	}
266 266
 
267
-	if s.clients[m.nickname] != nil {
267
+	if s.clients.Get(m.nickname) != nil {
268 268
 		client.Reply(ErrNickNameInUse(s, m.nickname))
269 269
 		return
270 270
 	}
271 271
 
272
+	if !IsNickname(m.nickname) {
273
+		client.Reply(ErrErroneusNickname(s, m.nickname))
274
+		return
275
+	}
276
+
272 277
 	client.ChangeNickname(m.nickname)
273 278
 	s.clients.Add(client)
274 279
 	s.tryRegister(client)
@@ -304,7 +309,7 @@ func (msg *NickCommand) HandleServer(server *Server) {
304 309
 		return
305 310
 	}
306 311
 
307
-	if server.clients[msg.nickname] != nil {
312
+	if server.clients.Get(msg.nickname) != nil {
308 313
 		client.Reply(ErrNickNameInUse(server, msg.nickname))
309 314
 		return
310 315
 	}
@@ -395,7 +400,12 @@ func (msg *PrivMsgCommand) HandleServer(server *Server) {
395 400
 
396 401
 func (m *ModeCommand) HandleServer(s *Server) {
397 402
 	client := m.Client()
398
-	target := s.clients[m.nickname]
403
+	target := s.clients.Get(m.nickname)
404
+
405
+	if target == nil {
406
+		client.Reply(ErrNoSuchNick(s, m.nickname))
407
+		return
408
+	}
399 409
 
400 410
 	if client != target && !client.flags[Operator] {
401 411
 		client.Reply(ErrUsersDontMatch(s))
@@ -521,8 +531,8 @@ func (msg *IsOnCommand) HandleServer(server *Server) {
521 531
 
522 532
 	ison := make([]string, 0)
523 533
 	for _, nick := range msg.nicks {
524
-		if _, ok := server.clients[nick]; ok {
525
-			ison = append(ison, nick)
534
+		if iclient := server.clients.Get(nick); iclient != nil {
535
+			ison = append(ison, iclient.Nick())
526 536
 		}
527 537
 	}
528 538
 
@@ -546,7 +556,7 @@ func (msg *NoticeCommand) HandleServer(server *Server) {
546 556
 		return
547 557
 	}
548 558
 
549
-	target := server.clients[msg.target]
559
+	target := server.clients.Get(msg.target)
550 560
 	if target == nil {
551 561
 		client.Reply(ErrNoSuchNick(server, msg.target))
552 562
 		return

Loading…
Отказ
Запис