and so it begin
[alkobot.git] / alkobot.py
blob9d0714f1eeddefe8c799cf11677a6025f208c0b7
1 #!/usr/bin/env python
2 # coding: utf-8
4 from jabberbot import JabberBot, botcmd
5 from datetime import datetime
6 import time
7 import urllib2
8 import re
9 import random
10 import json
11 import config
14 class DrahyInfo(object):
15 re_wg_timeleft = re.compile(r'<tr.*><td.*>(\d+) Hod a (\d+) Min</td></tr>')
16 re_wg_inprogress = re.compile(r'<tr.*><td.*>.*do konce.*(\d+)\s*min\s*</td></tr>')
18 def __init__(self, url, maxAge = 60):
19 self.url = url
20 self.maxAge = maxAge
21 self.clear()
23 def clear(self):
24 self.stamp = 0
25 self.wg_hours, self.wg_minutes, self.wg_at = None, None, None
26 self.wg_left, self.wg_end = None, None
28 def getInfo(self):
29 stamp = time.time()
30 page = urllib2.urlopen(self.url).read()
31 # wintergrasp bude
32 found_wg1 = self.re_wg_timeleft.search(page)
33 found_wg2 = self.re_wg_inprogress.search(page)
34 if found_wg1:
35 self.wg_hours, self.wg_minutes = map(int, found_wg1.groups())
36 #self.wg_hours, self.wg_minutes = int(self.wg_hours), int(self.wg_minutes)
37 self.wg_at = stamp + self.wg_hours * 3600 + self.wg_minutes * 60
38 self.stamp = stamp
39 self.wg_left, self.wg_end = None, None
40 # wintergrasp uz byl
41 elif found_wg2:
42 self.wg_left = int(found_wg2.group(1))
43 self.wg_end = stamp + self.wg_left * 60
44 self.stamp = stamp
45 else:
46 self.clear()
48 def refresh(self):
49 if time.time() > self.maxAge + self.stamp:
50 print "refresh serverinfo"
51 self.getInfo()
52 #endclass DrahyInfo
55 class PlayerInfo(object):
56 def __init__(self, url, maxAge = 60):
57 self.url = url
58 self.maxAge = maxAge
59 self.players = {}
60 self.stamp = 0
62 def getInfo(self):
63 stamp = time.time()
64 page = urllib2.urlopen(self.url).read()
65 # vynechat balast na zacatku a konci [4:-3]
66 data = page.split("\n")[4]
67 data = data.replace("'", '"') # json do not like apostrophes
68 data = data.decode("cp1250") # drahy claims wrong codepage
69 data = json.loads(data)
70 self.players = dict([(i['name'].lower(), i) for i in data['online'] if type(i) is dict ])
71 self.stamp = stamp
73 def refresh(self):
74 if time.time() > self.maxAge + self.stamp:
75 print "refresh playerinfo"
76 self.getInfo()
78 def search(self, name):
79 self.refresh()
80 #print self.players.keys()
81 return self.players.get(name, {})
82 #endclass
85 class Alkobot1(JabberBot):
86 def __init__(self, serverInfo, playerInfo, *args, **kargs):
87 self.serverInfo = serverInfo
88 self.playerInfo = playerInfo
89 # initialize jabberbot
90 super(Alkobot1, self).__init__(*args, **kargs)
92 @botcmd
93 def wg(self, mess, args):
94 self.serverInfo.refresh()
95 if self.serverInfo.wg_end:
96 return "Bitka o wintergrasp končí v %s (za 00:%s)" % (
97 time.strftime("%H:%M", time.localtime(self.serverInfo.wg_end)),
98 self.serverInfo.wg_left,
100 elif self.serverInfo.wg_at:
101 return "Hospodo, wintergrasp začíná v %s (za %s:%s)" % (
102 time.strftime("%H:%M", time.localtime(self.serverInfo.wg_at)),
103 self.serverInfo.wg_hours,
104 self.serverInfo.wg_minutes,
106 else:
107 return "Nemám páru"
108 #enddef
110 @botcmd
111 def najdi(self, mess, args):
112 args = args.lower().strip()
113 if not args:
114 return "Koho?"
116 vyhybka = {
117 "metlos": "Ve stadtlu",
118 "ratus": "zere",
119 "radon": "zere",
121 if args in vyhybka:
122 return vyhybka[args]
124 player = self.playerInfo.search(args.lower().strip())
126 if player:
127 return "%(name)s je v %(zone)s" % player
128 else:
129 return "Nenašli moji rádcové, nenašli"
131 @botcmd
132 def cas(self, mess, args):
133 return str(datetime.now())
135 @botcmd
136 def foo(self, mess, args):
137 print "message", type(mess)
138 print mess
139 print "args", type(args)
140 print args
142 @botcmd
143 def kozy(self, mess, args):
144 if random.random() < 0.1:
145 return "ven!"
146 return "prasaku!"
148 @botcmd
149 def barman(self, mess, args):
150 return "jaaaaaaaaaaa"
153 # =======================================================
154 if __name__ == '__main__':
156 #bot = Example(username, password, only_direct=True)
157 bot = Alkobot1(
158 DrahyInfo("http://drahy.com/"),
159 PlayerInfo("http://drahy.com/components/pomm/pomm_play.php"),
160 config.username,
161 config.password)
162 bot.join_room(config.chatroom, config.nickname)
164 bot.serve_forever()