Skip to content

Commit 980ef6b

Browse files
committed
Add basic nick tracking functions.
irc.SetupNickTracker() Adds nessesarry callbacks irc.Channels Populated by said callvbacks
1 parent a6b1561 commit 980ef6b

File tree

4 files changed

+118
-1
lines changed

4 files changed

+118
-1
lines changed

irc.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@ func IRC(nick, user string) *Connection {
486486
PingFreq: 15 * time.Minute,
487487
SASLMech: "PLAIN",
488488
QuitMessage: "",
489+
Channels: make(map[string]Channel),
489490
}
490491
irc.setupCallbacks()
491492
return irc

irc_nicktrack.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package irc
2+
3+
import (
4+
"regexp"
5+
"strings"
6+
)
7+
8+
//Struct to store Channel Info
9+
type Channel struct {
10+
Topic string
11+
Mode string
12+
Users map[string]User
13+
}
14+
15+
type User struct {
16+
Host string
17+
Mode string
18+
}
19+
20+
var mode_split = regexp.MustCompile("([%@+]{0,1})(.+)") //Half-Op, //Op, //Voice
21+
22+
func (irc *Connection) SetupNickTrack() {
23+
// 353: RPL_NAMEREPLY per RFC1459
24+
// will typically receive this on channel joins and when NAMES is
25+
// called via GetNicksOnCHan
26+
irc.AddCallback("353", func(e *Event) {
27+
// get chan
28+
channelName := e.Arguments[2]
29+
// check if chan exists in map
30+
_, ok := irc.Channels[channelName]
31+
32+
// if not make one
33+
if ok != true {
34+
irc.Channels[channelName] = Channel{Users: make(map[string]User)}
35+
}
36+
// split the datat into a slice
37+
for _, modenick := range strings.Split(e.Message(), " ") {
38+
nickandmode := mode_split.FindStringSubmatch(modenick)
39+
u := User{}
40+
if len(nickandmode) == 3 {
41+
if nickandmode[1] == "@" {
42+
u.Mode = "+o" // Ooof should be mode struct?
43+
} else if nickandmode[1] == "+" {
44+
u.Mode = "+v" // Ooof should be mode struct?
45+
} else if nickandmode[1] == "%" {
46+
u.Mode = "+h"
47+
}
48+
irc.Channels[channelName].Users[nickandmode[2]] = u
49+
} else {
50+
irc.Channels[channelName].Users[modenick] = u
51+
}
52+
}
53+
})
54+
55+
irc.AddCallback("MODE", func(e *Event) {
56+
channelName := e.Arguments[0]
57+
if len(e.Arguments) == 3 { // 3 == for channel 2 == for user on server
58+
if _, ok := irc.Channels[channelName]; ok != true {
59+
irc.Channels[channelName] = Channel{Users: make(map[string]User)}
60+
}
61+
if _, ok := irc.Channels[channelName].Users[e.Arguments[2]]; ok != true {
62+
irc.Channels[channelName].Users[e.Arguments[2]] = User{Mode: e.Arguments[1]}
63+
} else {
64+
u := irc.Channels[channelName].Users[e.Arguments[2]]
65+
u.Mode = e.Arguments[1]
66+
irc.Channels[channelName].Users[e.Arguments[2]] = u
67+
}
68+
}
69+
})
70+
71+
//Really hacky since the message from the server does not include the channel
72+
irc.AddCallback("NICK", func(e *Event) {
73+
if len(e.Arguments) == 1 { // Sanity check
74+
for k, _ := range irc.Channels {
75+
if _, ok := irc.Channels[k].Users[e.Nick]; ok {
76+
u := irc.Channels[k].Users[e.Nick]
77+
u.Host = e.Host
78+
irc.Channels[k].Users[e.Arguments[0]] = u //New nick
79+
delete(irc.Channels[k].Users, e.Nick) //Delete old
80+
}
81+
}
82+
}
83+
})
84+
85+
irc.AddCallback("JOIN", func(e *Event) {
86+
channelName := e.Arguments[0]
87+
if _, ok := irc.Channels[channelName]; ok != true {
88+
irc.Channels[channelName] = Channel{Users: make(map[string]User)}
89+
}
90+
irc.Channels[channelName].Users[e.Nick] = User{Host: e.Source}
91+
})
92+
93+
irc.AddCallback("PART", func(e *Event) {
94+
channelName := e.Arguments[0]
95+
delete(irc.Channels[channelName].Users, e.Nick)
96+
})
97+
98+
irc.AddCallback("QUIT", func(e *Event) {
99+
for k, _ := range irc.Channels {
100+
delete(irc.Channels[k].Users, e.Nick)
101+
}
102+
})
103+
}

irc_struct.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ type Connection struct {
4747

4848
stopped bool
4949
quit bool
50+
51+
Channels map[string]Channel
5052
}
5153

5254
// A struct to represent an event.

irc_test.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ func TestConnection(t *testing.T) {
197197
teststr := randStr(20)
198198
testmsgok := false
199199

200+
irccon1.SetupNickTrack()
201+
irccon2.SetupNickTrack()
202+
200203
irccon1.AddCallback("001", func(e *Event) { irccon1.Join(channel) })
201204
irccon2.AddCallback("001", func(e *Event) { irccon2.Join(channel) })
202205
irccon1.AddCallback("366", func(e *Event) {
@@ -223,10 +226,18 @@ func TestConnection(t *testing.T) {
223226
})
224227

225228
irccon2.AddCallback("PRIVMSG", func(e *Event) {
226-
t.Log(e.Message())
227229
if e.Message() == teststr {
228230
if e.Nick == ircnick1 {
229231
testmsgok = true
232+
if _, ok := irccon2.Channels[channel]; !ok {
233+
t.Error("Nick tracker did not create channel in map")
234+
}
235+
if _, ok := irccon2.Channels[channel].Users[ircnick1]; !ok {
236+
t.Errorf("Nick tracker did not track other bot nick. List: %v", irccon2.Channels[channel].Users)
237+
}
238+
if _, ok := irccon2.Channels[channel].Users[ircnick2]; !ok {
239+
t.Errorf("Nick tracker did not track own nick. List: %v", irccon2.Channels[channel].Users)
240+
}
230241
irccon2.Quit()
231242
} else {
232243
t.Fatal("Test message came from an unexpected nickname")

0 commit comments

Comments
 (0)