From c0346d81a8667318920763d886f2a20a6e0dcfad Mon Sep 17 00:00:00 2001 From: Armatik Date: Fri, 18 Aug 2023 23:06:18 +0300 Subject: [PATCH] New unstable code --- src/OpenAI/GPT35turbo/OA_processing.py | 8 +- src/TelegramBot/main.py | 342 ++++++++++++++++++++++++- src/config.ini | 7 + 3 files changed, 349 insertions(+), 8 deletions(-) diff --git a/src/OpenAI/GPT35turbo/OA_processing.py b/src/OpenAI/GPT35turbo/OA_processing.py index 2731e27..3af9c63 100644 --- a/src/OpenAI/GPT35turbo/OA_processing.py +++ b/src/OpenAI/GPT35turbo/OA_processing.py @@ -122,10 +122,16 @@ def openai_message_processing(message_id): count_length += len(message['content']) while count_length > max_token_count - min_token_for_answer: message_formated_text.pop(1) + count_length = 0 for message in message_formated_text: count_length += len(message['content']) except IndexError: - message_formated_text = "" + message_formated_text = [ + { + "role": "system", + "content": "Выведи сообщение об ошибке." + } + ] response = openai_response(message_formated_text) return response else: diff --git a/src/TelegramBot/main.py b/src/TelegramBot/main.py index 0b690b3..8899f91 100644 --- a/src/TelegramBot/main.py +++ b/src/TelegramBot/main.py @@ -7,6 +7,8 @@ import configparser import sqlite3 import asyncio import sys +import datetime +from time import mktime from aiogram import Bot, Dispatcher, executor, types from aiogram.contrib.fsm_storage.memory import MemoryStorage @@ -57,22 +59,333 @@ cursor.execute("""CREATE TABLE IF NOT EXISTS message_list ( # Создаём таблицу user_list cursor.execute("""CREATE TABLE IF NOT EXISTS user_list ( user_id INTEGER PRIMARY KEY, + user_name TEXT NOT NULL, user_role INTEGER, user_stats INTEGER )""") - #запись информации о чате в базу данных + +async def empty_role(id): + cursor.execute("UPDATE user_list SET user_role = ? WHERE user_id = ?", (0, id)) + database.commit() + + +async def check(id): + #проверка что у человека есть роль + user_role = cursor.execute("SELECT user_role FROM user_list WHERE user_id = ?", (id,)).fetchone()[0] + if user_role not in [0, 1, 2]: + await empty_role(id) + + +async def get_role_name(rolenum): + rolenum = int(rolenum) + if rolenum == 0: + role = config['Roles']['user'] + elif rolenum == 1: + role = config['Roles']['moderator'] + elif rolenum == 2: + role = config['Roles']['admin'] + return role + + +async def check_admin(id, chat_id): + #Проверка что человек есть в списке администраторов чата + chat_admins = await bot.get_chat_administrators(chat_id) + flag = False + for admin in chat_admins: + if admin.user.id == id: + flag = True + return flag + + +async def check_moderator(id): + #Проверка что человек имеет роль модератора + if cursor.execute("SELECT user_role FROM user_list WHERE user_id = ?", (id,)).fetchone()[0] >= 1: + return True + else: + return False + + + +async def time_to_seconds(time): + #Конвертация текстового указания времени по типу 3h, 5m, 10s в минуты + print("t_to_s") + if time[-1] == 'd': + return int(time[:-1])*86400 + elif time[-1] == 'h': + return int(time[:-1])*3600 + elif time[-1] == 'm': + return int(time[:-1])*60 + elif time[-1] == 's': + return int(time[:-1]) + + +async def short_time_to_time(time): + #Конвертация времени в длинное название + if time[-1] == 'd': + return f"{time[:-1]} дней" + elif time[-1] == 'h': + return f"{time[:-1]} часов" + elif time[-1] == 'm': + return f"{time[:-1]} минут" + elif time[-1] == 's': + return f"{time[:-1]} секунд" + + +@dp.message_handler(commands=['mute']) +async def mute(message: types.Message): + #Проверка что отправитель является администратором чата + print("start mute") + if await check_moderator(message.from_user.id): + print("moderator checked") + #Проверка отвечает ли сообщение на другое сообщение + if message.reply_to_message is not None: + time = message.text.split(' ')[1] + #получаем id отправителя сообщение на которое отвечает message + target_id = message.reply_to_message.from_user.id + target_name = cursor.execute("SELECT user_name FROM user_list WHERE user_id = ?", (target_id,)).fetchone()[0] + #Проверка что человек пользователь + if cursor.execute("SELECT user_role FROM user_list WHERE user_id = ?", (target_id,)).fetchone()[0] == 0: + #ограничения прав пользователя по отправке сообщений на time секунд + time_sec = await time_to_seconds(message.text.split(' ')[1]) + if time_sec <= 30 or time_sec >= 31536000: + await message.reply("Время мута должно быть больше 30 секунд и меньше 365 дней") + return + await bot.restrict_chat_member(message.chat.id, target_id, until_date=time.time()+time_sec) + await message.reply( + f"Пользователь {target_name} замьючен на {short_time_to_time(time)}") + else: + target_tag = message.text.split(' ')[1] + target_tag = target_tag[1:] + target_id = int(cursor.execute("SELECT user_id FROM user_list WHERE user_name = ?", (target_tag,)).fetchone()[0]) + target_name = cursor.execute("SELECT user_name FROM user_list WHERE user_id = ?", (target_id,)).fetchone()[0] + #ограничения прав пользователя по отправке сообщений на time секунд + time_mute = message.text.split(' ')[2] + + if cursor.execute("SELECT user_role FROM user_list WHERE user_id = ?", (target_id,)).fetchone()[0] == 0: + #ограничения прав пользователя по отправке сообщений на time секунд + time_sec = await time_to_seconds(message.text.split(' ')[2]) + if time_sec <= 30 or time_sec >= 31536000: + await message.reply("Время мута должно быть больше 30 секунд и меньше 365 дней") + return + date_string = "2022-01-01 00:00:00" + date_time = datetime.datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S") + unix_time = int(mktime(date_time.timetuple())) + await bot.restrict_chat_member(message.chat.id, target_id, until_date=unix_time+time_sec, permissions=types.ChatPermissions(can_send_messages=False)) + await message.reply( + f"Пользователь {target_name} замьючен на {short_time_to_time(time_mute)}.") + + +@dp.message_handler(commands=['unmute']) +async def unmute(message: types.Message): + if await check_moderator(message.from_user.id): + if message.reply_to_message is not None: + target_id = message.reply_to_message.from_user.id + target_name = cursor.execute("SELECT user_name FROM user_list WHERE user_id = ?", (target_id,)).fetchone()[0] + await bot.restrict_chat_member(message.chat.id, target_id, until_date=0, permissions=types.ChatPermissions(can_send_messages=True)) + await message.reply( + f"Пользователь [{target_name}](tg://user?id={target_id}) размьючен", + parse_mode="Markdown") + else: + target_tag = message.text.split(' ')[1] + target_tag = target_tag[1:] + target_id = int(cursor.execute("SELECT user_id FROM user_list WHERE user_name = ?", (target_tag,)).fetchone()[0]) + target_name = cursor.execute("SELECT user_name FROM user_list WHERE user_id = ?", (target_id,)).fetchone()[0] + if cursor.execute("SELECT user_role FROM user_list WHERE user_id = ?", (target_id,)).fetchone()[0] == 0: + await bot.restrict_chat_member(message.chat.id, target_id, until_date=0, permissions=types.ChatPermissions(can_send_messages=True)) + await message.reply( + f"Пользователь [{target_name}](tg://user?id={target_id}) размьючен", + parse_mode="Markdown") + + +@dp.message_handler(commands=['chat_info']) +async def chat_info(message: types.Message): + #Выводит информацию о чате. Название, количество пользователей, количество администраторов, количество модераторов, количество сообщений. + if await check_moderator(message.from_user.id): + chat_id = message.chat.id + chat_title = message.chat.title + chat_members = await bot.get_chat_members_count(chat_id) + chat_admins = await bot.get_chat_administrators(chat_id) + chat_moderators = cursor.execute("SELECT COUNT(user_id) FROM user_list WHERE user_role = 1").fetchone()[0] + chat_messages = cursor.execute("SELECT COUNT(message_id) FROM message_list WHERE chat_id = ?", (chat_id,)).fetchone()[0] + print("ready") + await message.reply( + f"Название чата: {chat_title}\n" + f"Количество пользователей: {chat_members}\n" + f"Количество администраторов: {len(chat_admins)}\n" + f"Количество модераторов: {chat_moderators}\n" + f"Количество сообщений: {chat_messages}") + else: + await message.reply( + f"У вас недостаточно прав для выполнения этой команды.") + @dp.message_handler(commands=['start']) async def start(message: types.Message): - chat_id = message.chat.id - chat_role = 0 - chat_stats = 1 - cursor.execute("INSERT INTO chat_list VALUES (?, ?, ?)", (chat_id, chat_role, chat_stats)) - database.commit() + #проверка что чат есть в базе данных + if cursor.execute("SELECT chat_id FROM chat_list WHERE chat_id = ?", (message.chat.id,)).fetchone() is None: + chat_id = message.chat.id + chat_role = 0 + chat_stats = 1 + cursor.execute("INSERT INTO chat_list VALUES (?, ?, ?)", (chat_id, chat_role, chat_stats)) + database.commit() + await message.reply( + f"{config['Telegram']['start_answer']}", + parse_mode="Markdown") + else: + await message.reply( + f"Чат уже инициализирован.", + parse_mode="Markdown") + # Проверка наличия столбца имени пользователя в базе данных, если его нет, то добавить. + try: + cursor.execute("SELECT user_name FROM user_list") + # sqlite3.OperationalError: no such column: user_name + except sqlite3.OperationalError: + cursor.execute("ALTER TABLE user_list ADD COLUMN user_name TEXT") + database.commit() + await message.reply("База данных пользователей реструктурирована.") + + +@dp.message_handler(commands=['top10']) +async def top10(message: types.Message): + #топ 10 пользователей по количеству сообщений в user_stats в формате: Имя пользователя - количество сообщений + top10 = cursor.execute("SELECT user_id, user_stats FROM user_list ORDER BY user_stats DESC LIMIT 10").fetchall() + top10_message = '' + for user in top10: + username = (cursor.execute("SELECT user_name FROM user_list WHERE user_id = ?", (user[0],)).fetchone())[0] + top10_message += f"{username} - {user[1]}\n" + #в начале сообщения берём текст из config.ini и вставляем в него топ 10 пользователей await message.reply( - f"{config['Telegram']['start_answer']}", + f"{config['Telegram']['top10_answer']}\n{top10_message}") + + +@dp.message_handler(commands=['stats']) +async def stat(message: types.Message): + #статистика пользователя в формате: Имя пользователя - количество сообщений + user_stats = cursor.execute("SELECT user_stats FROM user_list WHERE user_id = ?", (message.from_user.id,)).fetchone() + your_id = message.from_id + your_name = message.from_user.username + await message.reply( + f"[{your_name}](tg://user?id={str(your_id)}) - {user_stats[0]}", parse_mode="Markdown") + +@dp.message_handler(commands=['aboutme']) +async def aboutme(message: types.Message): + your_id = message.from_id + await check(your_id) + your_name = message.from_user.username + user_stats = cursor.execute("SELECT user_stats FROM user_list WHERE user_id = ?", (message.from_user.id,)).fetchone() + rolenum = cursor.execute("SELECT user_role FROM user_list WHERE user_id = ?", (message.from_user.id,)).fetchone() + role = await get_role_name(rolenum[0]) + #Имя пользователя на следующей строке статистика сообщений на следующей строке права пользователя + #если пользователь есть в списке администраторов чата, то выдаём роль администратор + chat_admins = await bot.get_chat_administrators(message.chat.id) + default_for_admin = int(config['Roles']['default_for_admin']) + no_answer = False + if rolenum[0] < default_for_admin: + for admin in chat_admins: + if admin.user.id == your_id: + if default_for_admin == 0: + await message.reply( + f"Вы обнаружены в списке администраторов чата! \n" + f"Вам будет выдана роль: {config['Roles']['user']}\n" + f"Имя: [{your_name}](tg://user?id={str(your_id)})\n" + f"Кол-во сообщений: {user_stats[0]}\n" + f"Роль: {role}", + parse_mode="Markdown") + no_answer = True + elif default_for_admin == 1: + await message.reply( + f"Вы обнаружены в списке администраторов чата.\n" + f"Вам будет выдана роль: {config['Roles']['moderator']}\n" + f"Имя: [{your_name}](tg://user?id={str(your_id)})\n" + f"Кол-во сообщений: {user_stats[0]}\n" + f"Роль: {role}", + parse_mode="Markdown") + no_answer = True + elif default_for_admin == 2: + await message.reply( + f"Вы обнаружены в списке администраторов чата.\n" + f"Вам будет выдана роль: {config['Roles']['admin']}\n" + f"Имя: [{your_name}](tg://user?id={str(your_id)})\n" + f"Кол-во сообщений: {user_stats[0]}\n" + f"Роль: {role}", + parse_mode="Markdown") + no_answer = True + cursor.execute("UPDATE user_list SET user_role = ? WHERE user_id = ?", (default_for_admin, your_id)) + database.commit() + if no_answer == False: + await message.reply( + f"Имя: [{your_name}](tg://user?id={str(your_id)})\n" + f"Кол-во сообщений: {user_stats[0]}\n" + f"Роль: {role}", + parse_mode="Markdown") + +@dp.message_handler(commands=['setrole']) +async def setrole(message: types.Message): + user_role = cursor.execute("SELECT user_role FROM user_list WHERE user_id = ?", (message.from_user.id,)).fetchone() + user_name = message.from_user.username + target_name = message.text.split()[1] + target_name = target_name[1:] + target_role = cursor.execute("SELECT user_role FROM user_list WHERE user_name = ?", (target_name,)).fetchone()[0] + user_id = cursor.execute("SELECT user_id FROM user_list WHERE user_name = ?", (target_name,)).fetchone() + user_id = user_id[0] + if await check_admin(user_id, message.chat.id) and target_role == 2: + await message.reply("Вы не можете изменить роль этому пользователю!") + else: + if user_role[0] == 2: + try: + #Получаем id пользователя по нику в базе данных + role = message.text.split()[2] + if role == "0" or role == config['Roles']['user']: + role = config['Roles']['user'] + rolenum = 0 + elif role == "1" or role == config['Roles']['moderator']: + role = config['Roles']['moderator'] + rolenum = 1 + elif role == "2" or role == config['Roles']['admin']: + role = config['Roles']['admin'] + rolenum = 2 + cursor.execute("UPDATE user_list SET user_role = ? WHERE user_id = ?", (rolenum, user_id)) + database.commit() + await message.reply( + f"Пользователю [{target_name}](tg://user?id={str(user_id)}) выдана роль: {role}", + parse_mode="Markdown") + except: + await message.reply( + f"Ошибка! Проверьте правильность написания команды.", + parse_mode="Markdown") + else: + await message.reply( + f"Ошибка! У вас нет прав на использование этой команды.", + parse_mode="Markdown") + + +@dp.message_handler(commands=['about']) +async def about(message: types.Message): + #проверка что в сообщении есть тег пользователя + if len(message.text.split()) == 2: + try: + target_name = message.text.split()[1] + target_name = target_name[1:] + target_id = cursor.execute("SELECT user_id FROM user_list WHERE user_name = ?", (target_name,)).fetchone() + target_id = target_id[0] + await check(target_id) + except: + await message.reply( + f"Ошибка! Проверьте правильность написания тега пользователя.", + parse_mode="Markdown") + user_stats = cursor.execute("SELECT user_stats FROM user_list WHERE user_id = ?", (target_id,)).fetchone()[0] + user_role = cursor.execute("SELECT user_role FROM user_list WHERE user_id = ?", (target_id,)).fetchone()[0] + user_role = await get_role_name(user_role) + await message.reply( + f"Имя: {target_name}\n" + f"Кол-во сообщений: {user_stats}\n" + f"Роль: {user_role}") + else: + await message.reply( + f"Ошибка! Проверьте правильность написания команды.") + from src.OpenAI.GPT35turbo.OA_processing import openai_message_processing @@ -96,6 +409,21 @@ async def in_message(message: types.Message): # Запись сообщения в базу данных cursor.execute("INSERT INTO message_list VALUES (?, ?, ?, ?)", (message.message_id, message.text, message.from_user.id, 0)) + #Проверка что отправителя сообщения нет в базе данных + if cursor.execute("SELECT user_id FROM user_list WHERE user_id = ?", (message.from_user.id,)).fetchone() is None: + # Запись отправителя сообщения в базу данных + cursor.execute("INSERT INTO user_list VALUES (?, ?, ?, ?)", + (message.from_user.id, message.from_user.username, 1, 0)) + #Запись статистики отправителя сообщения в базу данных + else: + cursor.execute("UPDATE user_list SET user_stats = user_stats + 1 WHERE user_id = ?", + (message.from_user.id,)) + #Записываем информацию в статистику чата. + cursor.execute("UPDATE chat_list SET chat_stats = chat_stats + 1 WHERE chat_id = ?", (chat_id,)) + #Проверка на наличие имени пользователя в базе данных + if cursor.execute("SELECT user_name FROM user_list WHERE user_id = ?", (message.from_user.id,)).fetchone() is not message.from_user.username: + cursor.execute("UPDATE user_list SET user_name = ? WHERE user_id = ?", + (message.from_user.username, message.from_user.id)) if message.reply_to_message is not None: # Запись ответа на сообщение в базу данных cursor.execute("UPDATE message_list SET answer_id = ? WHERE message_id = ?", diff --git a/src/config.ini b/src/config.ini index a022632..229bfe0 100644 --- a/src/config.ini +++ b/src/config.ini @@ -15,6 +15,13 @@ reply_ignore=0 # Содержит в себе все id топиков чата для чатов с форумным типом, если не заполнить контекст бота СЛОМАЕТСЯ! # Пример заполнения для одного из чатов: 0| 643885| 476959| 1| 476977| 633077| 630664| 476966| 634567 start_answer= Привет! Я OCAB, открытый чат бот с ИИ для вашего чата! +top10_answer= Вот топ 10 самых разговорчивых пользователей чата: + +[Roles] +user= Пользователь +moderator= Модератор +admin= Администратор +default_for_admin= 2 [Openai]