forked from brettbuddin/victor
/
campfire.go
118 lines (93 loc) · 2.72 KB
/
campfire.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
package victor
import (
"github.com/brettbuddin/victor/campfire"
"log"
)
type Campfire struct {
brain *Brain
account string
token string
rooms []int
client *campfire.Client
me *campfire.User
}
func NewCampfire(name string, account string, token string, rooms []int) *Campfire {
return &Campfire{
brain: NewBrain(name),
account: account,
token: token,
rooms: rooms,
client: campfire.NewClient(account, token),
}
}
func (self *Campfire) Run() {
log.Print("Starting up...")
rooms := self.rooms
channel := make(chan *campfire.Message)
for i := range rooms {
me, err := self.client.Me()
if err != nil {
log.Printf("Error fetching self: %s", err)
continue
}
log.Print("Fetched info about self.")
self.me = me
details, err := self.client.Room(rooms[i]).Show()
if err != nil {
log.Printf("Error fetching room info %i: %s", rooms[i], err)
continue
}
log.Print("Fetched room info.")
for _, user := range details.Users {
self.brain.RememberUser(&User{Id: user.Id, Name: user.Name})
log.Print("Remembering: " + user.Name)
}
room := self.client.Room(rooms[i])
err = room.Join()
if err != nil {
log.Printf("Error joining room %i: %s", rooms[i], err)
continue
}
log.Print("Joined room.")
room.Stream(channel)
log.Print("Listening...")
}
for {
in := <-channel
if in.UserId == self.me.Id {
continue
}
if in.Type == "TextMessage" {
msg := &TextMessage{
Id: in.Id,
Body: in.Body,
CreatedAt: in.CreatedAt,
Reply: self.reply(in.RoomId, in.UserId),
Send: func(text string) {
self.client.Room(in.RoomId).Say(text)
},
Paste: func(text string) {
self.client.Room(in.RoomId).Paste(text)
},
}
go self.brain.Receive(msg)
}
}
}
func (self *Campfire) Hear(expStr string, callback func(*TextMessage)) {
self.brain.Hear(expStr, callback)
}
func (self *Campfire) Respond(expStr string, callback func(*TextMessage)) {
self.brain.Respond(expStr, callback)
}
func (self *Campfire) reply(roomId int, userId int) func(string) {
room := self.client.Room(roomId)
user := self.brain.UserForId(userId)
prefix := ""
if user != nil {
prefix = user.Name + ": "
}
return func(text string) {
room.Say(prefix + text)
}
}