Passed
Push — master ( b312a6...ff6cab )
by Daniil
01:51
created

main.generate_call_message()   A

Complexity

Conditions 2

Size

Total Lines 10
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 9
nop 0
dl 0
loc 10
rs 9.95
c 0
b 0
f 0
1
import datetime
2
import json
3
import os
4
import re
5
6
from bot import Bot
7
from database import Database
8
from keyboard import Keyboards
9
from scheduler import Date
10
from scheduler import Schedule
11
12
db = Database(os.environ["DATABASE_URL"])
13
bot = Bot()
14
kbs = Keyboards()
15
16
bot.update_version()
17
18
19
def generate_call_message():
20
    f = db.get_names_using_status(bot.event["message"]["from_id"])
21
    students_ids = db.get_call_ids(bot.event["message"]["from_id"])
22
    if students_ids:
23
        mentions = bot.generate_mentions(ids=students_ids, names=f)
24
    else:
25
        mentions = ""
26
    message = db.get_call_message(bot.event["message"]["from_id"]) or ""
27
    message = f"{mentions}\n{message}"
28
    return message
29
30
31
def send_call_confirm():
32
    chat_id = int(str(db.get_conversation(bot.event["message"]["from_id"]))[-1])
33
    message = generate_call_message()
34
    if message != "\n":
35
        bot.send_message(
36
            msg=f"В {'тестовую ' if chat_id == 1 else 'основную '}"
37
            f"беседу будет отправлено сообщение:",
38
            pid=bot.event["message"]["from_id"],
39
            keyboard=kbs.prompt(bot.event["message"]["from_id"]),
40
        )
41
        bot.send_message(msg=message, pid=bot.event["message"]["from_id"])
42
    else:
43
        db.empty_call_storage(bot.event["message"]["from_id"])
44
        bot.send_message(
45
            msg="Сообщение не может быть пустым. Отмена...",
46
            pid=bot.event["message"]["from_id"],
47
            keyboard=kbs.generate_main_menu(bot.current_is_admin()),
48
        )
49
50
51
for event in bot.longpoll.listen():
52
    bot.event = {
53
        "type": event.type,
54
        "client_info": event.object.client_info,
55
        "message": event.object.message,
56
    }
57
    if (
58
        bot.event["type"] == bot.NEW_MESSAGE
59
        and bot.event["message"]["text"]
60
        and bot.event["message"]["out"] == 0
61
        and bot.event["message"]["from_id"] == bot.event["message"]["peer_id"]
62
    ):
63
64
        if not db.is_user_exist(bot.event["message"]["from_id"]):
65
            db.create_user(bot.event["message"]["from_id"])
66
        if not db.is_session_exist(bot.event["message"]["from_id"]):
67
            db.create_session(bot.event["message"]["from_id"])
68
        try:
69
            payload = json.loads(bot.event["message"]["payload"])
70
        except KeyError:
71
            payload = {"button": ""}
72
        text = bot.event["message"]["text"].lower()
73
74
        # :blockstart: Перезапуск интерфейса
75
        if text in ["начать", "старт"]:
76
            bot.send_gui()
77
        # :blockend: Перезапуск интерфейса
78
79
        # :blockstart: Возврат на главный экран
80
        elif payload["button"] == "home":
81
            bot.send_gui(text="Главный экран")
82
        # :blockend: Возврат на главный экран
83
84
        # :blockstart: Призыв
85
        elif payload["button"] == "call":
86
            db.update_session_state(
87
                bot.event["message"]["from_id"], "ask_for_call_message"
88
            )
89
            if not db.call_session_exist(bot.event["message"]["from_id"]):
90
                db.create_call_session(bot.event["message"]["from_id"])
91
            bot.send_message(
92
                msg="Отправьте сообщение к призыву (вложения не поддерживаются)",
93
                pid=bot.event["message"]["from_id"],
94
                keyboard=kbs.skip(),
95
            )
96
        elif payload["button"] == "letter":
97
            bot.send_message(
98
                msg=f"Отправка клавиатуры с фамилиями на букву \"{payload['letter']}\"",
99
                pid=bot.event["message"]["from_id"],
100
                keyboard=kbs.generate_names_keyboard(payload["letter"]),
101
            )
102
        elif payload["button"] == "student":
103
            db.append_to_call_ids(
104
                bot.event["message"]["from_id"], db.get_vk_id(payload["id"])
105
            )
106
            bot.send_message(
107
                msg=f"{payload['name']} добавлен к списку призыва.",
108
                pid=bot.event["message"]["from_id"],
109
            )
110
        elif payload["button"] == "back":
111
            bot.send_message(
112
                msg="Отправка клавиатуры с алфавитом.",
113
                pid=bot.event["message"]["from_id"],
114
                keyboard=kbs.generate_alphabet_keyboard(),
115
            )
116
        elif payload["button"] == "skip":
117
            db.update_session_state(bot.event["message"]["from_id"], "call_configuring")
118
            bot.send_message(
119
                msg="Отправка клавиатуры с алфавитом.",
120
                pid=bot.event["message"]["from_id"],
121
                keyboard=kbs.generate_alphabet_keyboard(),
122
            )
123
        elif (
124
            db.get_session_state(bot.event["message"]["from_id"])
125
            == "ask_for_call_message"
126
        ):
127
            db.update_call_message(
128
                bot.event["message"]["from_id"], bot.event["message"]["text"]
129
            )
130
            bot.send_message(
131
                msg="Отправка клавиатуры призыва",
132
                pid=bot.event["message"]["from_id"],
133
                keyboard=kbs.generate_alphabet_keyboard(),
134
            )
135
            db.update_session_state(bot.event["message"]["from_id"], "call_configuring")
136
        elif payload["button"] == "send_to_all":
137
            ids = ",".join(db.get_active_students_ids())
138
            db.update_call_ids(bot.event["message"]["from_id"], ids)
139
            bot.send_message(
140
                msg="Все студенты отмечены как получатели уведомления",
141
                pid=bot.event["message"]["from_id"],
142
            )
143
            send_call_confirm()
144
        elif payload["button"] == "save":
145
            send_call_confirm()
146
        elif (
147
            payload["button"] == "cancel"
148
            and db.get_session_state(bot.event["message"]["from_id"])
149
            == "call_configuring"
150
        ):
151
            db.empty_call_storage(bot.event["message"]["from_id"])
152
            db.update_session_state(bot.event["message"]["from_id"], "main")
153
            bot.send_gui("Выполнение команды отменено.")
154
        elif (
155
            payload["button"] == "confirm"
156
            and db.get_session_state(bot.event["message"]["from_id"])
157
            == "call_configuring"
158
        ):
159
            bot.log.log.info("Отправка призыва...")
160
            cid = db.get_conversation(bot.event["message"]["from_id"])
161
            text = generate_call_message()
162
            bot.send_message(pid=cid, msg=text)
163
            db.empty_call_storage(bot.event["message"]["from_id"])
164
            db.update_session_state(bot.event["message"]["from_id"], "main")
165
            bot.send_gui(text="Сообщение отправлено.")
166
        elif (
167
            payload["button"] == "deny"
168
            and db.get_session_state(bot.event["message"]["from_id"])
169
            == "call_configuring"
170
        ):
171
            db.update_call_message(bot.event["message"]["from_id"], " ")
172
            db.update_call_ids(bot.event["message"]["from_id"], " ")
173
            db.update_session_state(bot.event["message"]["from_id"], "main")
174
            bot.send_gui(text="Выполнение команды отменено.")
175
        elif payload["button"] == "chconv_call":
176
            conv = db.get_conversation(bot.event["message"]["from_id"])
177
            chat = int(str(conv)[-1])
178
            if chat == 1:
179
                db.update_conversation(bot.event["message"]["from_id"], 2000000002)
180
                chat = 2
181
            elif chat == 2:
182
                db.update_conversation(bot.event["message"]["from_id"], 2000000001)
183
                chat = 1
184
            msg = db.get_call_message(bot.event["message"]["from_id"])
185
            bot.send_message(
186
                msg=f"Теперь это сообщение будет отправлено в "
187
                f"{'тестовую' if chat == 1 else 'основную'} беседу:",
188
                pid=bot.event["message"]["from_id"],
189
            )
190
        elif payload["button"] == "chnames_call":
191
            if db.get_names_using_status(bot.event["message"]["from_id"]):
192
                status = 0
193
            else:
194
                status = 1
195
            db.update_names_using_status(bot.event["message"]["from_id"], status)
196
            send_call_confirm()
197
        # :blockend: Призыв
198
199
        # :blockstart: Расписание
200
        elif payload["button"] == "schedule":
201
            bot.send_message(
202
                msg="Отправка клавиатуры с расписанием.",
203
                pid=bot.event["message"]["from_id"],
204
                keyboard=kbs.generate_schedule_keyboard(),
205
            )
206
        elif payload["button"] == "today":
207
            d = Date()
208
            s = Schedule(d.today)
209
            schedule = s.parse()
210
            if schedule:
211
                bot.send_message(msg=schedule, pid=bot.event["message"]["from_id"])
212
            else:
213
                bot.send_message(
214
                    msg="Расписание отсутствует.", pid=bot.event["message"]["from_id"]
215
                )
216
        elif payload["button"] == "tomorrow":
217
            d = Date()
218
            s = Schedule(d.tomorrow)
219
            schedule = s.parse()
220
            if schedule:
221
                bot.send_message(msg=schedule, pid=bot.event["message"]["from_id"])
222
            else:
223
                bot.send_message(
224
                    msg="Расписание отсутствует.", pid=bot.event["message"]["from_id"]
225
                )
226
        elif payload["button"] == "day_after_tomorrow":
227
            d = Date()
228
            s = Schedule(d.day_after_tomorrow)
229
            schedule = s.parse()
230
            if schedule:
231
                bot.send_message(msg=schedule, pid=bot.event["message"]["from_id"])
232
            else:
233
                bot.send_message(
234
                    msg="Расписание отсутствует.", pid=bot.event["message"]["from_id"]
235
                )
236
        elif payload["button"] == "arbitrary":
237
            bot.send_message(
238
                msg="Напишите дату в формате ДД-ММ-ГГГГ.",
239
                pid=bot.event["message"]["from_id"],
240
                keyboard=kbs.cancel(),
241
            )
242
            db.update_session_state(
243
                bot.event["message"]["from_id"], "ask_for_schedule_date"
244
            )
245
        elif (
246
            payload["button"] == "cancel"
247
            and db.get_session_state(bot.event["message"]["from_id"])
248
            == "ask_for_schedule_date"
249
        ):
250
            db.update_session_state(bot.event["message"]["from_id"], "main")
251
            bot.send_message(
252
                msg="Выполнение команды отменено.",
253
                pid=bot.event["message"]["from_id"],
254
                keyboard=kbs.generate_schedule_keyboard(),
255
            )
256
        elif (
257
            db.get_session_state(bot.event["message"]["from_id"])
258
            == "ask_for_schedule_date"
259
        ):
260
            if re.match(
261
                r"^\d\d(.|-|/)\d\d(.|-|/)20\d\d$", bot.event["message"]["text"]
262
            ):
263
                try:
264
                    d = datetime.datetime.strptime(
265
                        bot.event["message"]["text"], "%d-%m-%Y"
266
                    ).strftime("%Y-%m-%d")
267
                except ValueError:
268
                    bot.send_message(
269
                        msg="Неверный формат даты. Попробуйте еще раз.",
270
                        pid=bot.event["message"]["from_id"],
271
                    )
272
                else:
273
                    s = Schedule(d)
274
                    schedule = s.parse()
275
                    if schedule:
276
                        bot.send_message(
277
                            msg=schedule,
278
                            pid=bot.event["message"]["from_id"],
279
                            keyboard=kbs.generate_schedule_keyboard(),
280
                        )
281
                        db.update_session_state(bot.event["message"]["from_id"], "main")
282
                    else:
283
                        bot.send_message(
284
                            msg="Расписание отсутствует.\nПопробуй указать другую "
285
                            "дату.",
286
                            pid=bot.event["message"]["from_id"],
287
                        )
288
                        db.update_session_state(
289
                            bot.event["message"]["from_id"], "ask_for_schedule_date"
290
                        )
291
            else:
292
                bot.send_message(
293
                    msg="Неверный формат даты. Попробуйте еще раз.",
294
                    pid=bot.event["message"]["from_id"],
295
                )
296
        # :blockend: Расписание
297
298
        # :blockstart: Рассылки
299
        elif payload["button"] == "mailings":
300
            bot.send_message(
301
                msg="Отправка клавиатуры со списком рассылок.",
302
                pid=bot.event["message"]["from_id"],
303
                keyboard=kbs.generate_mailings_keyboard(),
304
            )
305
        elif payload["button"] == "mailing":
306
            if not db.mailing_session_exist(bot.event["message"]["from_id"]):
307
                db.create_mailing_session(bot.event["message"]["from_id"])
308
            db.update_mailing_session(bot.event["message"]["from_id"], payload["slug"])
309
            bot.send_message(
310
                msg=f"Меню управления рассылкой \"{payload['name']}\":",
311
                pid=bot.event["message"]["from_id"],
312
                keyboard=kbs.generate_mailing_mgmt(
313
                    is_admin=bot.current_is_admin(),
314
                    slug=payload["slug"],
315
                    user_id=bot.event["message"]["from_id"],
316
                ),
317
            )
318
        elif payload["button"] == "subscribe":
319
            db.query(
320
                f"UPDATE vk_subscriptions SET {payload['slug']}=1 WHERE "
321
                f"user_id={payload['user_id']}"
322
            )
323
            bot.send_message(
324
                msg="Вы были успешно подписаны на рассылку.",
325
                pid=bot.event["message"]["from_id"],
326
                keyboard=kbs.generate_mailing_mgmt(
327
                    is_admin=bot.current_is_admin(),
328
                    slug=payload["slug"],
329
                    user_id=bot.event["message"]["from_id"],
330
                ),
331
            )
332
        elif payload["button"] == "unsubscribe":
333
            db.query(
334
                f"UPDATE vk_subscriptions SET {payload['slug']}=0 WHERE "
335
                f"user_id={payload['user_id']}"
336
            )
337
            bot.send_message(
338
                msg="Вы были успешно отписаны от рассылки.",
339
                pid=bot.event["message"]["from_id"],
340
                keyboard=kbs.generate_mailing_mgmt(
341
                    is_admin=bot.current_is_admin(),
342
                    slug=payload["slug"],
343
                    user_id=bot.event["message"]["from_id"],
344
                ),
345
            )
346
        elif payload["button"] == "send_mailing":
347
            db.update_session_state(
348
                bot.event["message"]["from_id"], "ask_for_mailing_message"
349
            )
350
            bot.send_message(
351
                msg="Отправьте текст рассылки (вложения не поддерживаются)",
352
                pid=bot.event["message"]["from_id"],
353
                keyboard=kbs.cancel(),
354
            )
355
        elif (
356
            payload["button"] == "cancel"
357
            and db.get_session_state(bot.event["message"]["from_id"])
358
            == "ask_for_mailing_message"
359
        ):
360
            bot.send_message(
361
                msg="Выполнение команды отменено",
362
                pid=bot.event["message"]["from_id"],
363
                keyboard=kbs.generate_main_menu(bot.current_is_admin()),
364
            )
365
            db.update_session_state(bot.event["message"]["from_id"], "main")
366
        elif (
367
            db.get_session_state(bot.event["message"]["from_id"])
368
            == "ask_for_mailing_message"
369
        ):
370
            db.update_mailing_message(
371
                bot.event["message"]["from_id"], bot.event["message"]["text"]
372
            )
373
            bot.send_message(
374
                msg="Всем подписчикам рассылки будет отправлено сообщение с указанным вами текстом",
375
                pid=bot.event["message"]["from_id"],
376
                keyboard=kbs.prompt(),
377
                forward=f"{bot.event['message']['id']}",
378
            )
379
            db.update_session_state(bot.event["message"]["from_id"], "prompt_mailing")
380
        elif (
381
            payload["button"] == "confirm"
382
            and db.get_session_state(bot.event["message"]["from_id"])
383
            == "prompt_mailing"
384
        ):
385
            subscs = db.fetch_subcribers(
386
                db.get_mailing_session(bot.event["message"]["from_id"])
387
            )
388
            bot.send_mailing(
389
                subscs, db.get_mailing_message(bot.event["message"]["from_id"])
390
            )
391
            bot.send_message(
392
                msg="Рассылка отправлена.",
393
                pid=bot.event["message"]["from_id"],
394
                keyboard=kbs.generate_mailings_keyboard(),
395
            )
396
        elif (
397
            payload["button"] == "deny"
398
            and db.get_session_state(bot.event["message"]["from_id"])
399
            == "prompt_mailing"
400
        ):
401
            db.empty_mailing_storage(bot.event["message"]["from_id"])
402
            bot.send_message(
403
                msg="Отправка рассылки отменена.",
404
                pid=bot.event["message"]["from_id"],
405
                keyboard=kbs.generate_mailings_keyboard(),
406
            )
407
        # :blockend: Рассылки
408
409
        # :blockstart: Параметры
410
        elif payload["button"] == "prefs":
411
            bot.send_message(
412
                msg="Параметры",
413
                pid=bot.event["message"]["from_id"],
414
                keyboard=kbs.generate_prefs_keyboard(),
415
            )
416
417
        elif payload["button"] == "chconv":
418
            chat = db.get_conversation(bot.event["message"]["from_id"])
419
            if chat == 2000000001:
420
                bot.send_message(
421
                    msg="Тестовая беседа сейчас активна",
422
                    pid=bot.event["message"]["from_id"],
423
                    keyboard=kbs.generate_conv_selector(chat),
424
                )
425
            elif chat == 2000000002:
426
                bot.send_message(
427
                    msg="Основная беседа сейчас активна",
428
                    pid=bot.event["message"]["from_id"],
429
                    keyboard=kbs.generate_conv_selector(chat),
430
                )
431
432
        elif payload["button"] == "select_main_conv":
433
            chat = 2000000002
434
            db.update_conversation(bot.event["message"]["from_id"], chat)
435
            bot.send_message(
436
                msg="Основная беседа активна.",
437
                pid=bot.event["message"]["from_id"],
438
                keyboard=kbs.generate_conv_selector(chat),
439
            )
440
        elif payload["button"] == "select_test_conv":
441
            chat = 2000000001
442
            db.update_conversation(bot.event["message"]["from_id"], chat)
443
            bot.send_message(
444
                msg="Тестовая беседа активна.",
445
                pid=bot.event["message"]["from_id"],
446
                keyboard=kbs.generate_conv_selector(chat),
447
            )
448
449
        elif payload["button"] == "names":
450
            status = db.get_names_using_status(bot.event["message"]["from_id"])
451
            msg = (
452
                f"Использование имён в призыве "
453
                f"{'активно' if status else 'неактивно'}."
454
            )
455
            bot.send_message(
456
                msg=msg,
457
                pid=bot.event["message"]["from_id"],
458
                keyboard=kbs.generate_names_selector(status),
459
            )
460
461
        elif payload["button"] == "off_using_names":
462
            status = 0
463
            db.update_names_using_status(bot.event["message"]["from_id"], status)
464
            bot.send_message(
465
                msg="Использование имён в призыве отключено.",
466
                pid=bot.event["message"]["from_id"],
467
                keyboard=kbs.generate_names_selector(bool(status)),
468
            )
469
        elif payload["button"] == "on_using_names":
470
            status = 1
471
            db.update_names_using_status(bot.event["message"]["from_id"], status)
472
            bot.send_message(
473
                msg="Использование имён в призыве включено.",
474
                pid=bot.event["message"]["from_id"],
475
                keyboard=kbs.generate_names_selector(bool(status)),
476
            )
477
        # :blockend: Параметры
478