/
state_handlers.go
131 lines (115 loc) · 3.07 KB
/
state_handlers.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package bogon
import (
"fmt"
"strings"
"github.com/nickvanw/ircx"
irc "gopkg.in/sorcix/irc.v1"
)
func (c *Client) registerStateHandlers() {
c.bot.HandleFunc(irc.INVITE, c.inviteHandler)
c.bot.HandleFunc(irc.JOIN, c.joinHandler)
c.bot.HandleFunc(irc.KICK, c.kickHandler)
c.bot.HandleFunc(irc.MODE, c.modeHandler)
c.bot.HandleFunc(irc.RPL_NAMREPLY, c.namesHandler)
c.bot.HandleFunc(irc.NICK, c.nickHandler)
c.bot.HandleFunc(irc.ERR_NICKNAMEINUSE, c.nickTakenHandler)
c.bot.HandleFunc(irc.PART, c.partHandler)
c.bot.HandleFunc(irc.QUIT, c.quitHandler)
c.bot.HandleFunc(irc.RPL_TOPIC, c.topicHandler)
c.bot.HandleFunc(irc.TOPIC, c.topicChangeHandler)
// register handlers for encryption
c.bot.HandleFunc(irc.NOTICE, c.encryptionStartHandler)
c.bot.HandleFunc(irc.PRIVMSG, c.encryptionMsgHandler)
// register command handler
c.bot.HandleFunc(irc.PRIVMSG, c.commandHandler)
}
func (c *Client) inviteHandler(s ircx.Sender, m *irc.Message) {
var channel string
if len(m.Params) > 1 {
channel = m.Params[1]
} else {
channel = m.Trailing
}
msg := &irc.Message{
Command: irc.JOIN,
Params: []string{channel},
}
s.Send(msg)
}
func (c *Client) joinHandler(s ircx.Sender, m *irc.Message) {
var channel string
if len(m.Params) > 0 {
channel = m.Params[0]
} else {
channel = m.Trailing
}
if m.Prefix.Name == c.state.Name() {
c.state.NewChannel(channel)
} else {
c.state.NewUser(channel, m.Prefix.Name)
}
}
func (c *Client) kickHandler(s ircx.Sender, m *irc.Message) {
if m.Params[1] == c.state.Name() {
c.state.RemoveChannel(m.Params[0])
if c.state.Rejoin() {
msg := &irc.Message{
Command: irc.JOIN,
Params: []string{m.Params[0]},
}
s.Send(msg)
}
} else {
c.state.RemoveUser(m.Params[0], m.Params[1])
}
}
func (c *Client) modeHandler(s ircx.Sender, m *irc.Message) {
c.state.ParseModes(m.Params, m.Trailing)
}
func (c *Client) namesHandler(s ircx.Sender, m *irc.Message) {
channel, err := c.state.GetChan(m.Params[2])
if err != nil {
return
}
newNames := strings.Split(m.Trailing, " ")
channel.NewUser(newNames...)
}
func (c *Client) nickHandler(s ircx.Sender, m *irc.Message) {
if m.Name == c.state.Name() {
c.state.SetName(m.Trailing)
}
c.state.RenameUser(m.Name, m.Trailing)
}
func (c *Client) nickTakenHandler(s ircx.Sender, m *irc.Message) {
newName := fmt.Sprintf("%s|", c.state.Name())
msg := &irc.Message{
Command: irc.NICK,
Params: []string{newName},
}
c.state.SetName(newName)
s.Send(msg)
}
func (c *Client) partHandler(s ircx.Sender, m *irc.Message) {
if m.Prefix.Name == c.state.Name() {
c.state.RemoveChannel(m.Params[0])
} else {
c.state.RemoveUser(m.Params[0], m.Prefix.Name)
}
}
func (c *Client) quitHandler(s ircx.Sender, m *irc.Message) {
c.state.QuitUser(m.Prefix.Name)
}
func (c *Client) topicHandler(s ircx.Sender, m *irc.Message) {
channel, err := c.state.GetChan(m.Params[1])
if err != nil {
return
}
channel.SetTopic(m.Trailing)
}
func (c *Client) topicChangeHandler(s ircx.Sender, m *irc.Message) {
channel, err := c.state.GetChan(m.Params[0])
if err != nil {
return
}
channel.SetTopic(m.Trailing)
}