-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbot.py
128 lines (113 loc) · 4.15 KB
/
bot.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
import telepot as tp
import sys
import time
import json
from getopt import getopt
from DatabaseConnector import Database
from AdminPage import AdminPage
from MessageHandler import MessageHandler
from APIConnector import APIRequestSender
from Helper import Messages
import logging
login = None
password = None
token = None
force_update = False
def usage():
print('python bot.py -t <token> -c <ororo_credentials> [-f] [-h] [-v]')
print(' -t <token> bot token aquired through BotFather')
print(' -c <credentials> login:password from ororo.tv')
print(' -f/--force_update forces update on one the admin\'s shows')
print(' -v use debug level logging')
def get_latest_episode(episodes):
curent_latest = None
for episode in episodes:
if curent_latest is None:
curent_latest = episode
elif int(curent_latest['season']) < int(episode['season']):
curent_latest = episode
elif (curent_latest['season'] == episode['season']) and (int(curent_latest['number']) < int(episode['number'])):
curent_latest = episode
return curent_latest
def update_tv_shows(api, db, bot):
logging.info('Updating TV Show')
shows_json = api.show_list_json()
if not shows_json:
return
for show in shows_json['shows']:
id = show['id']
show_db = db.get_show(id)
if not show_db:
logging.info(
'Found new TV show that wasn\'t in the list before %s',
show['name'])
db.add_show(id, show['name'], show['poster'],
show['imdb_rating'], show['desc'],
show['imdb_id'], show['slug'],
show['newest_video'])
continue
if show_db.newest_video != show['newest_video']:
db.update_show_newest_video(id, show['newest_video'])
s = api.show_json(id)
episode = get_latest_episode(s['episodes'])
db.add_episode(
episode['id'],
episode['name'],
episode['plot'],
id,
episode['season'],
episode['number']
)
for user in show_db.subscribers:
try:
logging.info("Notifying user %s", user.id)
bot.sendMessage(user.id, Messages.new_episode(
show_db.name + "\n" + episode['name'] +
'\nSeason: ' + str(episode['season']) +
'\nEpisode' + str(episode['number']), user.language
))
except Exception as e:
logging.error('Looks like bot has been blocked %s', e)
if __name__ == '__main__':
log_level = logging.WARNING
optlist, args = getopt(sys.argv[1:], 'hfc:t:v', ['force_update'])
for arg, value in optlist:
if arg == '-c':
login, password = value.split(':')
elif arg == '-t':
token = value
elif arg == '-h':
usage()
exit(0)
elif arg == '-v':
log_level = logging.INFO
elif arg in ['-f', 'force_update']:
force_update = True
logging.basicConfig(
format='%(asctime)s %(levelname)s:%(message)s',
level=log_level)
if token is None:
logging.critical('No token were provided. Abort')
exit(0)
else:
bot = tp.Bot(token)
if login is None or password is None:
logging.critical('No credentials for ororo. Abort')
exit
db = Database()
admin = AdminPage(bot)
handle = MessageHandler(bot, admin)
api = APIRequestSender((login, password), admin.handle_api_error)
try:
bot.message_loop({'chat': handle.on_chat_message,
'callback_query': handle.on_callback_query})
if force_update:
show = admin.get_admin().shows_subscribed[0]
db.update_show_newest_video(show.id, 0)
update_tv_shows(api, db, bot)
while True:
time.sleep(1000)
except:
admin.notify_one(
"Critical. bot is down. Please check logs or contact Vitaly Bushaev @bushaev")
raise