-
Notifications
You must be signed in to change notification settings - Fork 0
/
quran.py
152 lines (127 loc) · 5.29 KB
/
quran.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
import logging
from random import shuffle
import admin_commands
import config
from admin_commands import ADMIN_COMMANDS
from utils import ignore_exception
@ignore_exception
def restart_reading(bot, res):
all_list = list(range(1, config.MAX_PAGE))
shuffle(all_list)
res['remaining'] = all_list
res['finished'] = res.get('finished', 0) + 1
admin_commands.send_to_admin(f'one cycle finished,\n Total:{res["finished"]}. Restarting')
def select_page(bot, user, res):
if 'remaining' not in res:
restart_reading(bot, res)
remainings = res['remaining']
if len(remainings) == 0:
restart_reading(bot, res)
remainings = res['remaining']
chosen = remainings.pop()
res['remaining'] = remainings
logging.info(f'Page {chosen} choosed for user {user[:5]}')
res[f'user:{user}:page_count'] = res.get(f'user:{user}:page_count', 0) + 1
return chosen
@ignore_exception
def bad_command(bot, user, msg, res):
keyb = config.keyb['main']
[error, success] = bot.send_text(user, "دستور نا مفهوم", keyb)
logging.warning(f"bad command: {msg}")
for admin in config.bot_admins:
bot.send_text(admin, "Bad command: %s" % msg, config.keyb['admin'])
return [error, success]
@ignore_exception
def user_report(bot, user, res, **kwargs):
finished = res['finished']
remainings = len(res['remaining'])
report = "تعداد صفحات خوانده شده توسط شما: %s" % res[f'user:{user}:page_count']
report += f'\n تا کنون بوسیله این بات {finished} بار ختم صورت گرفته است.'
report += f'\nاز ختم جاری {remainings} صفحه باقی مانده است.'
return bot.send_text(user, report, config.keyb['main'])
# @ignore_exception
def process_text(bot, user, msg, res):
if msg.startswith('/'):
cmd = msg[1:].split()[0]
if cmd in ADMIN_COMMANDS.keys():
error, success = ADMIN_COMMANDS[cmd](bot, user=user, res=res, msg=msg)
else:
if cmd == 'ghari':
error, success = send_voice(bot, user, res, msg)
elif cmd == 'pages':
error, success = send_page(bot, user, res, msg)
elif msg == 'صفحه جدید':
page = select_page(bot, user=user, res=res)
error, success = send_page(bot, user, res, f"/pages 0 {page}")
elif msg == 'گزارشات':
error, success = user_report(bot, user, res)
elif msg == 'return':
error, success = bot.send_text(user, 'بازگشت به منو اصلی', config.keyb['main'])
else:
error, success = bad_command(bot, user, msg, res)
return error, success
def get_user_settings(user, res):
key = f'user:{user}:settings'
if key not in res:
res[key] = config.default_settings
return res[key]
def make_ghari_keyb(page):
keyb = [
[
dict(command=f'/ghari 1 {page:03}', text=f'ترتیل استاد {config.VOICE_KEYS[1]}'),
dict(command=f'/ghari 2 {page:03}', text=f'ترتیل استاد {config.VOICE_KEYS[2]}'), ], [
dict(command=f'/ghari 0 {page:03}', text='ترجمه صوتی صفحه'),
dict(command=f'/pages 1 {page:03}', text='نکات')
],
[
{'command': f'/read {page:03}', 'text': 'خواندم'},
{'command': 'return', 'text': 'منوی اصلی'}]
]
return keyb
@ignore_exception
def send_page(bot, user, res, msg):
cmd, page_type, page = msg.split()
page = int(page)
keyb = make_ghari_keyb(page)
pic = f'res:pages:{page_type}:{page:03}'
try:
url, size = res[pic]
[error, success] = bot.send_image(user, url, "", size, keyboard=keyb)
[error, success] = bot.change_keyboard(user, keyb)
except KeyError:
logging.error(f'Page not found {pic}')
bot.send_text(user, 'صفحه یافت نشد.')
error, success = True, False
return error, success
@ignore_exception
def send_voice(bot, user, res, msg, **kwargs):
error, success = False, True
cmd, voice, page = msg.split()
voice = f'res:voice:{voice}:{page}'
url, size, duration = res[voice]
[error, success] = bot.send_voice(user, url, "", size, duration)
return [error, success]
def start_bot(bot, res):
while True:
try:
messages = bot.get_messages()
for message in messages:
type_ = message['type']
msg = message['body'].lower().strip()
user = message['from']
logging.info(f"New message from {message['from'][:10]} : {type_}:{message['body']}")
if type_ in COMMAND_TYPES:
[error, success] = COMMAND_TYPES[type_](bot=bot, user=user, msg=msg, res=res)
else:
[error, success] = bad_command(bot, user, msg, res)
if success:
logging.debug('Message sent successfully')
else:
logging.warning('Sending message failed: {}'.format(error))
except Exception as e:
if bot:
for admin in config.bot_admins:
bot.send_text(admin, 'Exception Happened:\n' + str(e))
COMMAND_TYPES = {'START': admin_commands.start,
'STOP': admin_commands.stop,
'TEXT': process_text}