|
@@ -1,27 +1,13 @@
|
1
|
1
|
package irc
|
2
|
2
|
|
3
|
|
-import (
|
4
|
|
- "strconv"
|
5
|
|
- "strings"
|
6
|
|
-)
|
7
|
|
-
|
8
|
3
|
type Message interface {
|
9
|
4
|
Handle(s *Server, c *Client)
|
10
|
5
|
}
|
11
|
6
|
|
12
|
|
-type NewMessageFunc func([]string) Message
|
13
|
|
-
|
14
|
7
|
type NickMessage struct {
|
15
|
8
|
nickname string
|
16
|
9
|
}
|
17
|
10
|
|
18
|
|
-func NewNickMessage(args []string) Message {
|
19
|
|
- if len(args) != 1 {
|
20
|
|
- return nil
|
21
|
|
- }
|
22
|
|
- return &NickMessage{args[0]}
|
23
|
|
-}
|
24
|
|
-
|
25
|
11
|
func (m *NickMessage) Handle(s *Server, c *Client) {
|
26
|
12
|
if s.nicks[m.nickname] != nil {
|
27
|
13
|
c.send <- ErrNickNameInUse(m.nickname)
|
|
@@ -42,21 +28,6 @@ type UserMessage struct {
|
42
|
28
|
realname string
|
43
|
29
|
}
|
44
|
30
|
|
45
|
|
-func NewUserMessage(args []string) Message {
|
46
|
|
- if len(args) != 4 {
|
47
|
|
- return nil
|
48
|
|
- }
|
49
|
|
- msg := new(UserMessage)
|
50
|
|
- msg.user = args[0]
|
51
|
|
- mode, err := strconv.ParseUint(args[1], 10, 8)
|
52
|
|
- if err == nil {
|
53
|
|
- msg.mode = uint8(mode)
|
54
|
|
- }
|
55
|
|
- msg.unused = args[2]
|
56
|
|
- msg.realname = args[3]
|
57
|
|
- return msg
|
58
|
|
-}
|
59
|
|
-
|
60
|
31
|
func (m *UserMessage) Handle(s *Server, c *Client) {
|
61
|
32
|
if c.username != "" {
|
62
|
33
|
c.send <- ErrAlreadyRegistered(c.Nick())
|
|
@@ -70,14 +41,6 @@ type QuitMessage struct {
|
70
|
41
|
message string
|
71
|
42
|
}
|
72
|
43
|
|
73
|
|
-func NewQuitMessage(args []string) Message {
|
74
|
|
- msg := QuitMessage{}
|
75
|
|
- if len(args) > 0 {
|
76
|
|
- msg.message = args[0]
|
77
|
|
- }
|
78
|
|
- return &msg
|
79
|
|
-}
|
80
|
|
-
|
81
|
44
|
func (m *QuitMessage) Handle(s *Server, c *Client) {
|
82
|
45
|
c.send <- MessageError()
|
83
|
46
|
delete(s.nicks, c.nick)
|
|
@@ -93,10 +56,6 @@ func (m *UnknownMessage) Handle(s *Server, c *Client) {
|
93
|
56
|
|
94
|
57
|
type PingMessage struct {}
|
95
|
58
|
|
96
|
|
-func NewPingMessage(args []string) Message {
|
97
|
|
- return &PingMessage{}
|
98
|
|
-}
|
99
|
|
-
|
100
|
59
|
func (m *PingMessage) Handle(s *Server, c *Client) {
|
101
|
60
|
c.send <- MessagePong()
|
102
|
61
|
}
|
|
@@ -110,49 +69,3 @@ func tryRegister(s *Server, c *Client) {
|
110
|
69
|
c.send <- ReplyMyInfo(c.Nick(), "irc.jlatt.com")
|
111
|
70
|
}
|
112
|
71
|
}
|
113
|
|
-
|
114
|
|
-func parseArg(line string) (string, string) {
|
115
|
|
- if line == "" {
|
116
|
|
- return "", ""
|
117
|
|
- }
|
118
|
|
-
|
119
|
|
- if strings.HasPrefix(line, ":") {
|
120
|
|
- return line[1:], ""
|
121
|
|
- }
|
122
|
|
-
|
123
|
|
- parts := strings.SplitN(line, " ", 2)
|
124
|
|
- arg := parts[0]
|
125
|
|
- rest := ""
|
126
|
|
- if len(parts) > 1 {
|
127
|
|
- rest = parts[1]
|
128
|
|
- }
|
129
|
|
- return arg, rest
|
130
|
|
-}
|
131
|
|
-
|
132
|
|
-func parseLine(line string) (string, []string) {
|
133
|
|
- args := make([]string, 0)
|
134
|
|
- for arg, rest := parseArg(line); arg != ""; arg, rest = parseArg(rest) {
|
135
|
|
- args = append(args, arg)
|
136
|
|
- }
|
137
|
|
- return args[0], args[1:]
|
138
|
|
-}
|
139
|
|
-
|
140
|
|
-var commands = map[string]NewMessageFunc {
|
141
|
|
- "NICK": NewNickMessage,
|
142
|
|
- "PING": NewPingMessage,
|
143
|
|
- "QUIT": NewQuitMessage,
|
144
|
|
- "USER": NewUserMessage,
|
145
|
|
-}
|
146
|
|
-
|
147
|
|
-func ParseMessage(line string) Message {
|
148
|
|
- command, args := parseLine(line)
|
149
|
|
- constructor := commands[command]
|
150
|
|
- var msg Message
|
151
|
|
- if constructor != nil {
|
152
|
|
- msg = constructor(args)
|
153
|
|
- }
|
154
|
|
- if msg == nil {
|
155
|
|
- msg = &UnknownMessage{command}
|
156
|
|
- }
|
157
|
|
- return msg
|
158
|
|
-}
|