forked from J-Spade/slackov
-
Notifications
You must be signed in to change notification settings - Fork 0
/
slackbot.py
161 lines (113 loc) · 3.78 KB
/
slackbot.py
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import time
import datetime
import threading
import Queue
import json
from slackclient import SlackClient
# daemon thread; runs while the bot is running
# places lines from the server into the input queue
class _inputThread(threading.Thread):
def __init__ (self, client, queue):
self.client = client
self.inputqueue = queue
threading.Thread.__init__(self)
def run (self):
while 1:
messages = self.client.rtm_read()
for message in messages:
if (u'text' in message and u'reply_to' not in message):
self.inputqueue.put(message)
time.sleep(1)
def stop (self):
self._Thread__stop()
# takes lines from the input queue, and processes them
class _processThread(threading.Thread):
keepgoing = True
def __init__ (self, client, bot, channelids, users):
self.client = client
self.bot = bot
self.channelids = channelids
self.users = users
threading.Thread.__init__ (self)
def stop (self):
self.keepgoing = False
self._Thread__stop()
def run (self):
self.keepgoing = True
while self.keepgoing:
message = self.bot._inputqueue.get(True)
sender = message[u'user']
channel = message[u'channel']
text = message[u'text']
for id in self.users:
text = text.replace(str(id), str(self.users[id]))
currtime = str(datetime.datetime.now()).split(' ')[1].split('.')[0]
print '::#%s [%s] <%s> %s' % (channel, currtime, self.users[sender], text)
if (channel not in self.channelids) or (('<@%s>' % self.users[self.bot.ID]) in text):
self.bot.onPrivateMessageReceived(channel, sender, text)
else:
self.bot.onMessageReceived(channel, sender, text)
# sends lines from the output queue to the server
class _outputThread(threading.Thread):
def __init__ (self, client, queue):
self.client = client
self.outputqueue = queue
threading.Thread.__init__(self)
def run (self):
while 1:
message = self.outputqueue.get(True)
self.client.rtm_send_message(message[u'channel'], message[u'text'])
print '>> %s' % message[u'text']
time.sleep(1)
def stop (self):
self._Thread__stop()
class Slackbot:
def __init__ (self, token, client, id, avatarsource):
self.TOKEN = token
self.ID = id
self.AVATARSOURCE = avatarsource
self.CLIENT = client
self._inputqueue = Queue.Queue(50)
self._outputqueue = Queue.Queue(50)
self.users = {'USLACKBOT': 'slackbot'}
self.channelids = []
def start(self):
self.CLIENT = SlackClient(self.TOKEN)
print self.CLIENT
print 'CONNECTING...'
if self.CLIENT.rtm_connect():
print 'CONNECTED.'
channels = json.loads(self.CLIENT.api_call('channels.list', {}))['channels']
for chan in channels:
self.channelids.append(chan['id'])
print 'CHANNELS: %s' % self.channelids
userlist = json.loads(self.CLIENT.api_call('users.list', {}))['members']
for user in userlist:
self.users[str(user['id'])] = str(user['name'])
print 'USERS: %s' % self.users
self.inp = _inputThread(self.CLIENT, self._inputqueue)
self.process = _processThread(self.CLIENT, self, self.channelids, self.users)
self.out = _outputThread(self.CLIENT, self._outputqueue)
self.inp.start()
self.process.start()
self.out.start()
else:
print "Connection Failed."
# # functionality
def quit (self):
self.process.stop()
self.inp.stop()
self.out.stop()
self.onQuit()
def sendMessage (self, channel, text):
self._outputqueue.put({u'channel': channel, u'text': text})
# # event handling done by subclass
def onMessageReceived (self, channel, sender, message):
# This function must be overridden by a class that inherits IRCbot.
pass
def onPrivateMessageReceived (self, channel, sender, message):
# this function must be overriden by a class that inherits IRCbot.
pass
def onQuit(self):
# this function should be overridden by the class that inherits this one
pass