-
Notifications
You must be signed in to change notification settings - Fork 0
/
bot.py
188 lines (141 loc) · 7.7 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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
import telebot
import json
from telebot.types import ReplyKeyboardMarkup
from config import my_TOKEN
import logging
from gpt import GPT
from config import MAX_TOKENS
# @pomoshnik_ai_bot
bot = telebot.TeleBot(token=my_TOKEN)
# Объект GPT
gpt = GPT()
def save_to_json():
with open('users_history.json', 'w', encoding='utf-8') as f:
json.dump(users_history, f, indent=2, ensure_ascii=False)
def load_from_json():
# noinspection PyBroadException
try:
with open('users_history.json', 'r+', encoding='utf-8') as f:
data = json.load(f)
except Exception:
data = {}
return data
# Словарик для хранения задач пользователей и ответов GPT
users_history = load_from_json()
# Функция для создания клавиатуры с нужными кнопочками
def create_keyboard(buttons_list):
keyboard = ReplyKeyboardMarkup(row_width=2, resize_keyboard=True, one_time_keyboard=True)
keyboard.add(*buttons_list)
return keyboard
# Настройка логирования
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
filename="log_file.txt",
filemode="w")
# Приветственное сообщение /start
@bot.message_handler(commands=['start'])
def start(message):
user_name = message.from_user.first_name
bot.send_message(message.chat.id,
text=f"Привет, {user_name}! 👋/n"
"Я бот-помощник для решения математических задач\n"
f"Ты можешь прислать задачу, а я постараюсь ее решить.\n"
"Иногда ответы получаются слишком длинными - в этом случае ты можешь попросить продолжить.\n"
"Напиши /help для дополнительной информации",
reply_markup=create_keyboard(['/help']))
# Команда /help
@bot.message_handler(commands=['help'])
def support(message):
bot.send_message(message.from_user.id,
text="/start - приветствие\n"
"/help - помощь\n"
"/solve_task - команда, чтобы приступить к запросу к нейросети\n\n"
"PS: к сожалению, бот иногда может работать неисправно, а модель gpt - слабовата, заранее извиняюсь 😿",
reply_markup=create_keyboard(["/solve_task"]))
# дружелюбность и вежливость бота
def filter_bye(message):
word = "пока"
return word in message.text.lower()
def filter_hi(message):
word = "привет"
return word in message.text.lower()
def filter_wasup(message):
word = "как дела?"
return word in message.text.lower()
@bot.message_handler(content_types=['text'], func=filter_bye)
def say_bye(message):
user_name = message.from_user.first_name
logging.info("с кем-то попрощались")
bot.send_message(message.from_user.id, text=f"{user_name}, пока...")
@bot.message_handler(content_types=['text'], func=filter_wasup)
def say_wasup(message):
logging.info("кому-то ответили, как дела")
bot.send_message(message.from_user.id, text=f"Спасибо, что спросил_а! Дела отлично! 👍")
@bot.message_handler(content_types=['text'], func=filter_hi)
def say_wasup(message):
user_name = message.from_user.first_name
logging.info("с кем-то поздоровались")
bot.send_message(message.from_user.id, text=f"{user_name}, Привет! 🙃")
# команда дебаг, отправка логов файлом
@bot.message_handler(commands=['debug'])
def send_logs(message):
with open("log_file.txt", "rb") as f:
bot.send_document(message.chat.id, f)
logging.info("Кто-то использовал секретную функцию дебаг...")
# Команда /solve_task и регистрация функции get_promt() для обработки любого следующего сообщения от пользователя
@bot.message_handler(commands=['solve_task'])
def solve_task(message):
bot.send_message(message.chat.id, "Напиши новый вопрос:")
bot.register_next_step_handler(message, get_promt)
# Фильтр для обработки кнопочки "Продолжить решение"
def continue_filter(message):
button_text = 'Продолжить'
return message.text == button_text
# Получение задачи от пользователя или продолжение решения
@bot.message_handler(func=continue_filter)
def get_promt(message):
user_id = str(message.from_user.id)
if not message.text:
bot.send_message(user_id, "Необходимо отправить именно текстовое сообщение 😾")
bot.register_next_step_handler(message, get_promt)
return
# Получаем текст сообщения от пользователя
user_request = message.text
if gpt.count_tokens(user_request) >= gpt.MAX_TOKENS:
bot.send_message(user_id, "Запрос превышает количество символов 😿\nИсправь запрос")
logging.info("У кого-то запрос привысил количество символов")
bot.register_next_step_handler(message, get_promt)
return
if user_id not in users_history or users_history[user_id] == {}:
if user_request == "Продолжить":
bot.send_message(message.chat.id, "Кажется, вы еще не задали вопрос. 😟")
bot.register_next_step_handler(message, get_promt)
return
# Сохраняем промт пользователя и начало ответа GPT в словарик users_history
users_history[user_id] = {
'system_content': (
"Ты бот, с профессиональными знаниями в области математики."
"Ты обязательно должен подробно решать задачу по шагам, строго на русском языке."),
'user_content': user_request,
'assistant_content': "Решим задачу по шагам:"
}
save_to_json()
prompt = gpt.make_promt(users_history[user_id])
resp = gpt.send_request(prompt)
answer = resp.json()['choices'][0]['message']['content']
users_history[user_id]["assistant_content"] += answer
save_to_json()
keyboard = create_keyboard(["Продолжить", "Завершить"])
bot.send_message(message.chat.id, answer, reply_markup=keyboard)
@bot.message_handler(commands=['end'])
@bot.message_handler(content_types=['text'], func=lambda message: message.text.lower() == "завершить")
def end_task(message):
user_id = message.from_user.id
logging.info("Чьё-то решение завершилось")
bot.send_message(user_id, "Текущие решение завершено")
users_history[user_id] = {}
solve_task(message)
if __name__ == "__main__":
logging.info("Бот запущен")
bot.infinity_polling()