-
Notifications
You must be signed in to change notification settings - Fork 1
/
murkinabot.py
145 lines (93 loc) · 3.64 KB
/
murkinabot.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
# -*- coding: utf-8 -*-
"""
yksinkertainen ircbotti
komennot:
!test
!join
!quit
!anagram
!murkinat
!juhannusnimi
"""
import socket
import botcommands
from time import sleep
from config import *
class Ircbot:
def __init__(self ):
# määritellään botille pääkäyttäjät
self.users = OWNERS
# välttämättömiä tietoja
self.server = SERVER
self.port = PORT
self.username = USERNAME
self.realname = REALNAME
self.nick = NICKNAME
# luodaan socket
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# haetaan botille komennot
self.commands = botcommands.command_dict
# päälooppia toistettan kunnes done = 1
self.done = 0
# kanava jolle botti halutaan
self.channels = CHANNELS
# self.channel = '#murkinatesti'
def send( self, string, delay=0 ):
# tällä lähetetään viestejä
self.socket.send( string + '\n' )
print("[BOT] " + string)
if(delay > 0 ):
sleep(delay)
def sendWithDelay( self, string):
self.send(string + '\n', 0.3)
def connect( self ):
# yhdistetään serveriin ja läheteään omat tiedot
self.socket.connect((self.server, self.port))
self.send( 'NICK %s' % self.nick)
self.send( 'USER %s 0 * :%s' % (self.username, self.realname))
# liitytään kanavalle
for channel in self.channels:
self.send( 'JOIN %s' % channel )
def check( self, line ):
print("[SERVER] " + line)
line = line.split(' ')
# vastataan pingiin muuten serveri katkaisee yhteyden
if line[0] == 'PING':
self.send( 'PONG ' + line[1] )
else:
# vastataan komentoihin myös yksityiskeskutelussa
if line[2][0] != '#':
line[2] = line[0].split( '!' )[0][1:]
# suoritetaan komennot jos niitä on tullut
# line form :[email protected] PRIVMSG #murkinatesti :!murkinat ict
# f = open('requests.txt', 'w')
# kirjoitetaan tiedostoon kuka teki kyselyn ja millä parametrilla
# f.write("%s: %s" %(line[1],line[2]))
# TODO: Älä käytä try-exceptiä ohjelma flown hallintaan -> virheitä hankala huomata
if(len(line) > 3 and line[3] in self.commands.keys()):
try:
self.commands[ line[3] ].main( self , line )
except Exception as ex:
messageTemplate = "[WARNING] Exception of type {0} occured. Argumets:\n{1!r}"
message = messageTemplate.format(type(ex).__name__, ex.args)
print(message)
def testing(self):
# Testaa seuraavia komentoja
# self.commands[":!murkinat"].main(self, ['a', 'b', 'c', 'd','Tottis', 'ict', 'perse', 'ict', 'mikro', 'maccis'])
# self.commands[":!juhannisnimi"].main(self, ['a', 'b', 'c', 'd','Sami'])
self.commands[":!vitshumor"].main(self, ['a', 'b', 'c', 'd','digit'])
def mainloop( self ):
buffer = ''
while not self.done:
# vastaanotetaan dataa
buffer += self.socket.recv( 4096 )
buffer = buffer.split( '\r\n' )
for line in buffer[0:-1]:
self.check( line )
buffer = buffer[-1]
def main():
irc = Ircbot()
irc.connect()
irc.mainloop()
# irc.testing()
if __name__ == '__main__' : main()