-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbot_irc.py
More file actions
125 lines (91 loc) · 3.19 KB
/
bot_irc.py
File metadata and controls
125 lines (91 loc) · 3.19 KB
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
import irc.client
SERVER = "chat.freenode.net"
PORT = 6665
CHANNEL = "##mysteryonline"
class MessageQueue:
def __init__(self):
self.items = []
def enqueue(self, item):
self.items.insert(0, item)
def dequeue(self):
return self.items.pop()
class IRCConnection:
def __init__(self, server, port, channel, username):
self.reactor = irc.client.Reactor()
self.username = username
self.server = server
self.channel = channel
self._joined = False
self.msg_q = MessageQueue()
self.p_msg_q = MessageQueue()
self.on_first_join_handler = None
self.on_join_handler = None
self.on_users_handler = None
self.on_disconnect_handler = None
print("Creating connection.")
try:
self.connection = self.reactor.server().connect(self.server, port, username)
except irc.client.ServerConnectionError:
print('IRC: Could not connect to server')
raise
events = ["welcome", "join", "quit", "pubmsg", "nicknameinuse", "namreply", "privnotice", "privmsg", "pong"]
for e in events:
self.connection.add_global_handler(e, getattr(self, "on_" + e))
def get_msg(self):
return self.msg_q.dequeue()
def put_back_msg(self, msg):
self.msg_q.messages.append(msg)
def get_pm(self):
return self.p_msg_q.dequeue()
def send_msg(self, msg):
self.connection.privmsg(self.channel, msg)
def send_mode(self, username, msg):
self.connection.mode(username, msg)
def send_ping(self):
self.connection.ping(self.server)
def is_connected(self):
return self._joined
def process(self):
self.reactor.process_once()
def on_welcome(self, c, e):
print("on_welcome")
if irc.client.is_channel(self.channel):
c.join(self.channel)
else:
raise ChannelConnectionError("Couldn't connect to {}".format(self.channel))
def on_join(self, c, e):
print("On_join called")
if not self._joined:
self.on_first_join_handler()
self._joined = True
# nick = e.source.nick
# if c.nickname != nick:
# self.on_join_handler(nick)
def on_quit(self, c, e):
nick = e.source.nick
# self.on_disconnect_handler(nick)
def on_pubmsg(self, c, e):
msg = e.arguments[0]
self.msg_q.enqueue(msg)
def on_namreply(self, c, e):
pass
# self.on_users_handler(e.arguments[2])
def on_privnotice(self, c, e):
pass
# server_response = e.arguments[0]
# Logger.info('IRC: {}'.format(server_response))
def on_nicknameinuse(self, c, e):
pass
def on_privmsg(self, c, e):
msg = e.arguments[0]
self.p_msg_q.enqueue(msg)
def on_pong(self, c, e):
pass
# self.connection_manager.receive_pong()
def create_irc_connection():
result = IRCConnection(SERVER, PORT, CHANNEL, "RedHerringBot")
print("Created irc_connection")
return result
def create_own_connection(server, port, username):
irc = IRCConnection(server, port, '##mysteryonline', username)
return irc