forked from sunDalik/funny-telegram-bot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjerk_of_the_day.py
144 lines (124 loc) · 6.13 KB
/
jerk_of_the_day.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
from telegram import ParseMode, Update
from telegram.ext import Updater, CommandHandler
from _secrets import jerk_aliases
import random
import redis_db
from utils import in_whitelist
from datetime import datetime, timedelta, time
import logging
from time import sleep
logger = logging.getLogger(__name__)
r = redis_db.connect()
JERKS_REG_SET = 'jerks_reg'
JERKS = 'jerks'
JERKS_META = 'jerks_meta'
def get_daily_jerk_word() -> list:
curr_date = datetime.now()
seed = int(str(curr_date.year % 100) + str(curr_date.month) + str(curr_date.day))
my_random = random.Random()
my_random.seed(seed)
return my_random.choice(jerk_aliases)
def jerk_reg(update: Update, context):
if not in_whitelist(update):
return
# set user id to regs
logger.info('[jerk_reg]')
reg_user_id = update.message.from_user.id
reg_user_name = update.message.from_user.username
already_register = r.sismember(JERKS_REG_SET, reg_user_id)
count = r.scard(JERKS_REG_SET)
redis_db.update_user_data(update.message.from_user)
if already_register:
update.message.reply_text(f"@{reg_user_name}, ты уже участник этой клоунады", quote=False)
return
# set user id and username
r.sadd(JERKS_REG_SET, reg_user_id)
update.message.reply_text(f"@{reg_user_name}, теперь ты участвуешь в лотерее вместе с {count} другими {get_daily_jerk_word()[3]}", quote=False)
def jerk_unreg(update: Update, context):
if not in_whitelist(update):
return
logger.info('[jerk_unreg]')
reg_user_id = update.message.from_user.id
reg_user_name = update.message.from_user.username
already_register = r.sismember(JERKS_REG_SET, reg_user_id)
if not already_register:
update.message.reply_text(f"@{reg_user_name}, ты и так не регистрировался", quote=False)
return
r.srem(JERKS_REG_SET, reg_user_id)
update.message.reply_text(f"Правильное решение, @{reg_user_name}. Вычеркнул тебя из списка", quote=False)
def jerk_roll(update: Update, context):
if (not in_whitelist(update)):
return
logger.info('[jerk_of_the_day]')
# r.hdel(JERKS_META, 'roll_time')
last_roll = r.hget(JERKS_META, 'roll_time')
datetime_format = '%Y-%m-%d %H:%M:%S'
cur_datetime = datetime.now()
cur_datetime_str = cur_datetime.strftime(datetime_format)
if last_roll:
last_roll_dt = datetime.strptime(last_roll, datetime_format)
is_same_day = cur_datetime.year == last_roll_dt.year and cur_datetime.month == last_roll_dt.month \
and cur_datetime.day == last_roll_dt.day
if is_same_day:
cur_jerk_id = r.hget(JERKS_META, 'last_jerk')
cur_jerk_username = redis_db.get_username_by_id(cur_jerk_id)
tomorrow = cur_datetime + timedelta(days=1)
time_to_next = datetime.combine(tomorrow, time.min) - cur_datetime
time_to_next_h, time_to_next_m = time_to_next.seconds // 3600, (time_to_next.seconds // 60) % 60
update.message.reply_text(f"Сегодняшний {get_daily_jerk_word()[0]} дня: <b>{cur_jerk_username}</b>.\n"
f"Следующий запуск будет доступен через: "
f"{time_to_next_h} ч. и {time_to_next_m} м.",
quote=False, parse_mode=ParseMode.HTML)
return
players = list(r.smembers(JERKS_REG_SET))
if (len(players) == 0):
update.message.reply_text("А че вы роллить собрались? Никто не зарегистрировался", quote=True)
winner_id = random.choice(players)
winner_username = redis_db.get_username_by_id(winner_id)
r.hset(JERKS_META, 'last_jerk', winner_id)
r.hset(JERKS_META, 'roll_time', cur_datetime_str)
r.hincrby(JERKS, winner_id, 1)
update.message.reply_text(f"Выбираю {get_daily_jerk_word()[1]} на сегодня", quote=False)
sleep(1.5)
update.message.reply_text(random.choice(["Хмм...", "Так-так-так...", "Расшифровываю результаты...", "Спрашиваем мнения экспертов...", "Дайте подумать..."]), quote=False)
sleep(1.5)
update.message.reply_text(f"А вот и победитель - @{winner_username}!", quote=False)
logger.info(f' WINNER for {cur_datetime_str} is {winner_id}: {winner_username}')
return
def get_jerk_stats(update: Update, context):
if (not in_whitelist(update)):
return
jerks_dict = {}
for key in r.hgetall(JERKS):
winner_username = redis_db.get_username_by_id(key)
win_count = r.hget(JERKS, key)
try:
jerks_dict[winner_username] = int(win_count) if win_count is not None else None
except ValueError:
jerks_dict[winner_username] = win_count
message = f"Вот статистика {get_daily_jerk_word()[2]}:\n"
i = 1
for k, v in dict(sorted(jerks_dict.items(), key=lambda item: item[1], reverse=True)).items():
message += f"{i}. {k} - {v}\n"
i += 1
update.message.reply_text(f"{message}", quote=False)
def get_jerk_regs(update: Update, context):
if (not in_whitelist(update)):
return
players = r.smembers(JERKS_REG_SET)
if (len(players) == 0):
update.message.reply_text(f"Никто не зарегистрировался на {get_daily_jerk_word()[1]} дня...", quote=False)
return
message = "Вот все известные мне персонажи:\n"
i = 1
for player in players:
message += f"{i}. {redis_db.get_username_by_id(player)}\n"
i += 1
update.message.reply_text(f"{message}", quote=False)
def subscribe(u: Updater):
u.dispatcher.add_handler(CommandHandler("reg", jerk_reg))
u.dispatcher.add_handler(CommandHandler("unreg", jerk_unreg))
u.dispatcher.add_handler(CommandHandler("jerk", jerk_roll))
u.dispatcher.add_handler(CommandHandler("jerkstats", get_jerk_stats))
u.dispatcher.add_handler(CommandHandler("jerkall", get_jerk_regs))
pass