Bladeren bron

save reply source id at init time for nick changes

tags/v0.1.0
Jeremy Latt 10 jaren geleden
bovenliggende
commit
c805006ab8
3 gewijzigde bestanden met toevoegingen van 36 en 12 verwijderingen
  1. 20
    11
      irc/reply.go
  2. 6
    0
      irc/server.go
  3. 10
    1
      irc/types.go

+ 20
- 11
irc/reply.go Bestand weergeven

@@ -15,8 +15,14 @@ func joinedLen(names []string) int {
15 15
 }
16 16
 
17 17
 type BaseReply struct {
18
-	source  Identifier
18
+	id      string
19 19
 	message string
20
+	source  Identifier
21
+}
22
+
23
+func (reply *BaseReply) SetSource(source Identifier) {
24
+	reply.id = source.Id()
25
+	reply.source = source
20 26
 }
21 27
 
22 28
 func (reply *BaseReply) Source() Identifier {
@@ -33,22 +39,22 @@ func NewStringReply(source Identifier, code string,
33 39
 	reply := &StringReply{
34 40
 		code: code,
35 41
 	}
42
+	reply.SetSource(source)
36 43
 	reply.message = fmt.Sprintf(format, args...)
37
-	reply.source = source
38 44
 	return reply
39 45
 }
40 46
 
41 47
 func (reply *StringReply) Format(client *Client) []string {
42 48
 	message := fmt.Sprintf("%s %s", reply.code, reply.message)
43 49
 	if Identifier(client.server) != reply.source {
44
-		message = fmt.Sprintf(":%s %s", reply.source.Id(), message)
50
+		message = fmt.Sprintf(":%s %s", reply.id, message)
45 51
 	}
46 52
 	return []string{message}
47 53
 }
48 54
 
49 55
 func (reply *StringReply) String() string {
50 56
 	return fmt.Sprintf("Reply(source=%s, code=%s, message=%s)",
51
-		reply.source, reply.code, reply.message)
57
+		reply.id, reply.code, reply.message)
52 58
 }
53 59
 
54 60
 type NumericReply struct {
@@ -61,8 +67,8 @@ func NewNumericReply(source Identifier, code int, format string,
61 67
 	reply := &NumericReply{
62 68
 		code: code,
63 69
 	}
70
+	reply.SetSource(source)
64 71
 	reply.message = fmt.Sprintf(format, args...)
65
-	reply.source = source
66 72
 	return reply
67 73
 }
68 74
 
@@ -70,14 +76,14 @@ func (reply *NumericReply) Format(client *Client) []string {
70 76
 	message := fmt.Sprintf("%03d %s %s",
71 77
 		reply.code, client.Nick(), reply.message)
72 78
 	if Identifier(client.server) != reply.source {
73
-		message = fmt.Sprintf(":%s %s", reply.source.Id(), message)
79
+		message = fmt.Sprintf(":%s %s", reply.id, message)
74 80
 	}
75 81
 	return []string{message}
76 82
 }
77 83
 
78 84
 func (reply *NumericReply) String() string {
79 85
 	return fmt.Sprintf("Reply(source=%s, code=%d, message=%s)",
80
-		reply.source, reply.code, reply.message)
86
+		reply.id, reply.code, reply.message)
81 87
 }
82 88
 
83 89
 // names reply
@@ -88,12 +94,11 @@ type NamesReply struct {
88 94
 }
89 95
 
90 96
 func NewNamesReply(channel *Channel) Reply {
91
-	return &NamesReply{
92
-		BaseReply: &BaseReply{
93
-			source: channel,
94
-		},
97
+	reply := &NamesReply{
95 98
 		channel: channel,
96 99
 	}
100
+	reply.SetSource(channel)
101
+	return reply
97 102
 }
98 103
 
99 104
 func (reply *NamesReply) Format(client *Client) []string {
@@ -401,3 +406,7 @@ func ErrChanOPrivIsNeeded(channel *Channel) Reply {
401 406
 func ErrNoMOTD(server *Server) Reply {
402 407
 	return NewNumericReply(server, ERR_NOMOTD, ":MOTD File is missing")
403 408
 }
409
+
410
+func ErrNoNicknameGiven(server *Server) Reply {
411
+	return NewNumericReply(server, ERR_NONICKNAMEGIVEN, ":No nickname given")
412
+}

+ 6
- 0
irc/server.go Bestand weergeven

@@ -233,11 +233,17 @@ func (m *PassCommand) HandleServer(s *Server) {
233 233
 func (m *NickCommand) HandleServer(s *Server) {
234 234
 	c := m.Client()
235 235
 
236
+	if m.nickname == "" {
237
+		c.Reply(ErrNoNicknameGiven(s))
238
+		return
239
+	}
240
+
236 241
 	if s.clients[m.nickname] != nil {
237 242
 		c.Reply(ErrNickNameInUse(s, m.nickname))
238 243
 		return
239 244
 	}
240 245
 
246
+	// Make reply before changing nick.
241 247
 	reply := RplNick(c, m.nickname)
242 248
 
243 249
 	s.clients.Remove(c)

+ 10
- 1
irc/types.go Bestand weergeven

@@ -1,6 +1,7 @@
1 1
 package irc
2 2
 
3 3
 import (
4
+	"errors"
4 5
 	"fmt"
5 6
 )
6 7
 
@@ -51,9 +52,17 @@ func (channels ChannelNameMap) Remove(channel *Channel) error {
51 52
 
52 53
 type ClientNameMap map[string]*Client
53 54
 
55
+var (
56
+	ErrNickMissing   = errors.New("nick missing")
57
+	ErrNicknameInUse = errors.New("nickname in use")
58
+)
59
+
54 60
 func (clients ClientNameMap) Add(client *Client) error {
61
+	if !client.HasNick() {
62
+		return ErrNickMissing
63
+	}
55 64
 	if clients[client.nick] != nil {
56
-		return fmt.Errorf("%s: already set", client.nick)
65
+		return ErrNicknameInUse
57 66
 	}
58 67
 	clients[client.nick] = client
59 68
 	return nil

Laden…
Annuleren
Opslaan