-
Notifications
You must be signed in to change notification settings - Fork 0
/
bot.py
155 lines (132 loc) · 6.78 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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import logging
import os
from functools import wraps
import telebot
from database import MemeSubreddit, BannedSubreddit, ClientInfo, session, Base, engine
from enums import FileContentType
from helpers import get_current_user, get_reddit_random_post
telebot.logger.setLevel(logging.DEBUG)
bot = telebot.TeleBot(os.getenv("TELEGRAM_BOT_TOKEN"))
def admin_only(func):
@wraps(func)
def wrapper(message):
current_user = session.query(ClientInfo).filter(ClientInfo.user_id == message.from_user.id).one()
if current_user.is_admin:
func(message)
else:
bot.send_message(
message.chat.id,
f"Прости, {message.from_user.first_name}, но у тебя нет доступа к этой команде"
)
return wrapper
@bot.message_handler(commands=["start"])
def start_message(message):
user = get_current_user(message.from_user.id)
if not user:
session.add(ClientInfo(user_id=message.from_user.id, username=message.from_user.username))
session.commit()
bot.send_message(
message.chat.id,
(
f'Привет, {message.from_user.first_name}.\n'
f'Воспользуйся командой /next, чтобы получить новый пост с Reddit!\n\n'
f'Если ты хочешь посмотреть только смешнявки, воспользуйся командой /funny.\n\n'
f'По всем вопросам обращайся сюда — @kad_ami'
)
)
@bot.message_handler(commands=["echo"])
def send_test_message(message):
bot.send_message(message.chat.id, f"Привет, {message.from_user.first_name}.\nВсё в порядке, я работаю!")
@bot.message_handler(commands=["next"])
def new_post_from_reddit(message):
post = get_reddit_random_post(message.from_user.id)
if post["type"] == FileContentType.GIF:
bot.send_animation(
message.chat.id,
post["url"],
caption=f"{post['title']}\n\n(from /r/{post['subreddit']})"
)
else:
bot.send_photo(
message.chat.id,
post["url"],
caption=f"{post['title']}\n\n(from /r/{post['subreddit']})"
)
@bot.message_handler(commands=["funny"])
def toggle_memes_only(message):
user = get_current_user(message.from_user.id)
if user.is_meme_only:
user.is_meme_only = False
text_message = 'Режим "смешных картинок" деактивирован!\nТеперь ты будешь получать случайные посты со всего Реддита.'
else:
user.is_meme_only = True
text_message = 'Режим "смешных картинок" активирован!\nТеперь ты будешь получать только посты со смешнявками.'
session.commit()
bot.send_message(message.chat.id, text_message)
@bot.message_handler(commands=["add_memes"])
def add_meme_to_list(message):
if message.reply_to_message:
meme_subreddits = session.query(MemeSubreddit).filter(MemeSubreddit.user == message.from_user.id).all()
try:
meme_subreddit = message.reply_to_message.caption.split("/r/")[1][:-1]
if meme_subreddit not in {subreddit.subreddit for subreddit in meme_subreddits}:
session.add(MemeSubreddit(subreddit=meme_subreddit, user=message.from_user.id))
session.commit()
bot.send_message(message.chat.id, f"/r/{meme_subreddit} успешно добавлен в список!")
else:
bot.send_message(message.chat.id, f"/r/{meme_subreddit} уже есть в списке!")
except:
bot.send_message(message.chat.id, "Что-то пошло не так!\nНе удалось обновить список!")
else:
bot.send_message(message.chat.id, "Отправь команду через Reply!")
@bot.message_handler(commands=["delete_memes"])
def delete_meme_from_list(message):
if message.reply_to_message:
meme_subreddits = session.query(MemeSubreddit).filter(MemeSubreddit.user == message.from_user.id).all()
try:
meme_subreddit = message.reply_to_message.caption.split("/r/")[1][:-1]
if meme_subreddit in {subreddit.subreddit for subreddit in meme_subreddits}:
(
session
.query(MemeSubreddit)
.filter(MemeSubreddit.user == message.from_user.id, MemeSubreddit.subreddit == meme_subreddit)
.delete()
)
session.commit()
bot.send_message(message.chat.id, f"/r/{meme_subreddit} успешно удалён из списка!")
else:
bot.send_message(message.chat.id, f"/r/{meme_subreddit} не найден в списке!")
except:
bot.send_message(message.chat.id, "Что-то пошло не так!\nНе удалось обновить список!")
else:
bot.send_message(message.chat.id, "Отправь команду через Reply!")
@bot.message_handler(commands=["ban"])
@admin_only
def ban_subreddit(message):
if message.reply_to_message:
banned_subreddits = session.query(BannedSubreddit).all()
try:
ban_subreddit = message.reply_to_message.caption.split('/r/')[1][:-1]
if ban_subreddit not in {subreddit.subreddit for subreddit in banned_subreddits}:
session.add(BannedSubreddit(subreddit=ban_subreddit, user=message.from_user.id))
bot.delete_message(message.chat.id, message.reply_to_message.message_id)
bot.send_message(message.chat.id, f"/r/{ban_subreddit} успешно добавлен в чёрный список!")
else:
bot.send_message(message.chat.id, f"/r/{ban_subreddit} уже есть в чёрном списке!")
except:
bot.send_message(message.chat.id, "Что-то пошло не так!\nНе удалось обновить список!")
else:
bot.send_message(message.chat.id, "Отправь команду через Reply!")
@bot.message_handler(commands=["bot_users"])
@admin_only
def get_all_users_of_bot(message):
message_text = "Список пользователей бота:\n\n" + "\n".join(
[f"@{client.username} | (ID = {client.user_id})" for client in session.query(ClientInfo).all()]
)
bot.send_message(message.chat.id, message_text)
if __name__ == '__main__':
print("Starting DB creation...")
Base.metadata.create_all(engine)
print("Finished DB creation...")
print("Bot is starting...")
bot.polling(none_stop=True)