From 9e64cbfc4c43277ef3d3e29b9cb9e06d64e20c8b Mon Sep 17 00:00:00 2001 From: armatik Date: Sat, 25 Nov 2023 19:46:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=80=D1=8B=D0=B5=20=D0=B4=D0=B8=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- requirements.txt | 3 - src/OpenAI/GPT35turbo/OA_processing.py | 198 -------- src/TelegramBot/MessageHandler.py | 8 - src/TelegramBot/MessageSendler.py | 0 src/TelegramBot/main.py | 566 ---------------------- src/bot/config.ini | 43 -- src/bot/config.yaml | 23 - src/bot/core/__init__.py | 0 src/bot/core/database/__init__.py | 0 src/bot/core/database/methods/__init__.py | 0 src/bot/core/database/models/__init__.py | 0 src/bot/core/filters/__init__.py | 0 src/bot/core/filters/basic.py | 5 - src/bot/core/handlers/__init__.py | 0 src/bot/core/handlers/basic.py | 4 - src/bot/core/keyboards/__init__.py | 0 src/bot/core/keyboards/basic.py | 3 - src/bot/core/middlewares/__init__.py | 0 src/bot/core/states/__init__.py | 0 src/bot/core/states/api.py | 3 - src/bot/core/states/states.py | 5 - src/bot/core/text_of_buttons.py | 1 - src/bot/core/utils/__init__.py | 0 src/bot/core/utils/registry.py | 14 - src/bot/core/utils/settings.py | 62 --- src/bot/main.py | 28 -- src/config.ini | 43 -- src/config.yaml | 23 - src/core.py | 1 - src/modules/AdminChat.py | 0 src/modules/Config.py | 21 - src/modules/DataBase.py | 131 ----- src/modules/Moderation.py | 0 src/modules/Roles.py | 33 -- 35 files changed, 1 insertion(+), 1219 deletions(-) delete mode 100644 requirements.txt delete mode 100644 src/OpenAI/GPT35turbo/OA_processing.py delete mode 100644 src/TelegramBot/MessageHandler.py delete mode 100644 src/TelegramBot/MessageSendler.py delete mode 100644 src/TelegramBot/main.py delete mode 100644 src/bot/config.ini delete mode 100644 src/bot/config.yaml delete mode 100644 src/bot/core/__init__.py delete mode 100644 src/bot/core/database/__init__.py delete mode 100644 src/bot/core/database/methods/__init__.py delete mode 100644 src/bot/core/database/models/__init__.py delete mode 100644 src/bot/core/filters/__init__.py delete mode 100644 src/bot/core/filters/basic.py delete mode 100644 src/bot/core/handlers/__init__.py delete mode 100644 src/bot/core/handlers/basic.py delete mode 100644 src/bot/core/keyboards/__init__.py delete mode 100644 src/bot/core/keyboards/basic.py delete mode 100644 src/bot/core/middlewares/__init__.py delete mode 100644 src/bot/core/states/__init__.py delete mode 100644 src/bot/core/states/api.py delete mode 100644 src/bot/core/states/states.py delete mode 100644 src/bot/core/text_of_buttons.py delete mode 100644 src/bot/core/utils/__init__.py delete mode 100644 src/bot/core/utils/registry.py delete mode 100644 src/bot/core/utils/settings.py delete mode 100644 src/bot/main.py delete mode 100644 src/config.ini delete mode 100644 src/config.yaml delete mode 100644 src/core.py delete mode 100644 src/modules/AdminChat.py delete mode 100644 src/modules/Config.py delete mode 100644 src/modules/DataBase.py delete mode 100644 src/modules/Moderation.py delete mode 100644 src/modules/Roles.py diff --git a/README.md b/README.md index 23f0a13..eac8228 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# OpenChatAiBot +# OpenChatAiBot V2 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 3bc6ce7..0000000 --- a/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -aiogram==3.1.1 -openai==0.27.8 -PyYAML==6.0.1 diff --git a/src/OpenAI/GPT35turbo/OA_processing.py b/src/OpenAI/GPT35turbo/OA_processing.py deleted file mode 100644 index 1bc959b..0000000 --- a/src/OpenAI/GPT35turbo/OA_processing.py +++ /dev/null @@ -1,198 +0,0 @@ -import sqlite3 -import os -import configparser -from openai import OpenAIError -import time - -mother_path = os.path.dirname(os.path.dirname(os.getcwd())) - -config = configparser.ConfigParser() -config.read(os.path.join(mother_path, 'src/config.ini')) - -database = sqlite3.connect(os.path.join(mother_path, 'DataBase/OCAB_DB.db')) -cursor = database.cursor() -reply_ignore = config['Telegram']['reply_ignore'].split('| ') -reply_ignore = list(map(int, reply_ignore)) -#print(reply_ignore) - -min_token_for_answer = int(config['Openai']['min_token_for_answer']) - -# Импорт библиотек - -import openai -max_token_count = int(config['Openai']['max_token_count']) - -# Создание файла лога если его нет -if not os.path.exists(os.path.join(mother_path, 'src/OpenAI/GPT35turbo/log.txt')): - with open(os.path.join(mother_path, 'src/OpenAI/GPT35turbo/log.txt'), 'w') as log_file: - log_file.write('') - - -def openai_response(message_formated_text): - # Запуск OpenAI - # Считаем размер полученного текста - #print(message_formated_text) - count_length = 0 - if len(message_formated_text) == 0: - message_formated_text = [ - { - "role": "user", - "content": "Напиши короткий ответ говорящий что контекст сообщения слишком длинный и попроси задать вопрос отдельно без ответа на другие сообщения по ключевому слову" - } - ] - for message in message_formated_text: - #print(message["content"]) - count_length += int(len(message["content"])) - #print(count_length) - try: - response = openai.ChatCompletion.create( - model="gpt-3.5-turbo", - messages=message_formated_text, - max_tokens=max_token_count - count_length - ) - except OpenAIError as ex: - if 'on requests per min. Limit: 3 / min. Please try again' in str(ex): - response = ('Извини мой процессор перегрелся, дай мне минутку отдохнуть') - elif 'Bad gateway.' in str(ex): - response = ( - 'Ой, где я? Кажется кто то перерзал мой интернет кабель, подожди немного пока я его починю') - #запись ошибки в лог с указанием времени и даты - with open(os.path.join(mother_path, 'src/OpenAI/GPT35turbo/log.txt'), 'a') as log_file: - log_file.write('\n' + time.strftime("%d.%m.%Y %H:%M:%S") + ' ' + str(ex)) - return response - -def sort_message_from_user(message_formated_text, message_id): - # print(int(*( - # cursor.execute("SELECT message_sender FROM message_list WHERE message_id = ?", (message_id,)).fetchone()))) - if int(*( - cursor.execute("SELECT message_sender FROM message_list WHERE message_id = ?", - (message_id,)).fetchone())) == 0: - message_formated_text.append({ - "role": "assistant", - "content": str(*(cursor.execute("SELECT message_text FROM message_list WHERE message_id = ?", - (message_id,)).fetchone())) - }) - else: - message_formated_text.append({ - "role": "user", - "content": str(*(cursor.execute("SELECT message_text FROM message_list WHERE message_id = ?", - (message_id,)).fetchone())) - }) - #Проверка что длина всех сообщений в кортеже не превышает max_token_count-min_token_for_answer - return message_formated_text - -def openai_collecting_message(message_id, message_formated_text): - # собирает цепочку сообщений для OpenAI длинной до max_token_count - # проверяем что сообщение отвечает на другое сообщение - #print(int(*(cursor.execute("SELECT answer_id FROM message_list WHERE message_id = ?", (message_id,)).fetchone()))) - #print(reply_ignore) - if int(*(cursor.execute("SELECT answer_id FROM message_list WHERE message_id = ?", (message_id,)).fetchone())) not in reply_ignore: - # Продолжаем искать ответы на сообщения - #print(int(*(cursor.execute("SELECT answer_id FROM message_list WHERE message_id = ?", (message_id,)).fetchone()))) - message_formated_text = openai_collecting_message(int(*(cursor.execute("SELECT answer_id FROM message_list WHERE message_id = ?", (message_id,)).fetchone())), message_formated_text) - #Проверяем ID отправителя сообщения, если 0 то это сообщение от бота - sort_message_from_user(message_formated_text, message_id) - else: - # Проверяем ID отправителя сообщения, если 0 то это сообщение от бота - sort_message_from_user(message_formated_text, message_id) - return message_formated_text - - -def openai_message_processing(message_id): - #проверяем на наличие сообщения в базе данных - if cursor.execute("SELECT message_text FROM message_list WHERE message_id = ?", (message_id,)).fetchone() is None: - return None - else: - # проверяем на то что сообщение влезает в max_token_count с учётом message_formated_text - message_formated_text = [ - { - "role": "system", - "content": config['Openai']['story_model'] - } - ] - if ((len(str(cursor.execute("SELECT message_text FROM message_list WHERE message_id")))) < (max_token_count - len(message_formated_text[0]['content']))): - message_formated_text = openai_collecting_message(message_id, message_formated_text) - count_length = 0 - # Обработка невозможности ответить на сообщение - try: - for message in message_formated_text: - 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 = [ - { - "role": "system", - "content": "Выведи сообщение об ошибке." - } - ] - response = openai_response(message_formated_text) - return response - else: - return f"Сообщение слишком длинное, максимальная длина сообщения \ - {max_token_count - len(message_formated_text[0]['content'])} символов, укоротите его на \ - {len(str(cursor.execute('SELECT message_text FROM message_list WHERE message_id'))) - max_token_count} символов" - -def openai_collecting_history_context(start_id, end_id, message_formated_text, message_id = 0): - # собираем список сообщений для OpenAI длинной до 14500 символов начиная с end_id и заканчивая start_id - if message_id == 0: - message_id = end_id - message_formated_text = openai_collecting_history_context(start_id, end_id, message_formated_text, message_id) - elif message_id > start_id: - message_formated_text = openai_collecting_history_context(start_id, end_id, message_formated_text, (message_id - 1)) - try: - message_formated_text.append({ - "role": "user", - "content": str(*(cursor.execute("SELECT message_text FROM message_list WHERE message_id = ?", - (message_id,)).fetchone())) - }) - except Exception: - pass - - return message_formated_text - -def openai_message_history_processing(start_id, end_id): - message_formated_text = [] - message_formated_text = openai_collecting_history_context(start_id, end_id, message_formated_text) - - max_token_count_history = 15000 - min_token_for_answer_history = 1500 - count_length = 0 - try: - for message in message_formated_text: - count_length += len(message['content']) - while count_length > max_token_count_history - min_token_for_answer_history: - message_formated_text.pop(1) - count_length = 0 - for message in message_formated_text: - count_length += len(message['content']) - except IndexError: - message_formated_text = [ - { - "role": "system", - "content": "Выведи сообщение об ошибке." - } - ] - message_formated_text.append({ - "role": "user", - "content": "Сделай пересказ всей истории сообщений без потери смысла от 3-его лица." - }) - try: - response = openai.ChatCompletion.create( - model="gpt-3.5-turbo-16k", - messages=message_formated_text, - max_tokens=max_token_count_history - count_length - ) - except OpenAIError as ex: - if 'on requests per min. Limit: 3 / min. Please try again' in str(ex): - response = ('Извини мой процессор перегрелся, дай мне минутку отдохнуть') - elif 'Bad gateway.' in str(ex): - response = ( - 'Ой, где я? Кажется кто то перерзал мой интернет кабель, подожди немного пока я его починю') - # запись ошибки в лог с указанием времени и даты - with open(os.path.join(mother_path, 'src/OpenAI/GPT35turbo/log.txt'), 'a') as log_file: - log_file.write('\n' + time.strftime("%d.%m.%Y %H:%M:%S") + ' ' + str(ex)) - return response \ No newline at end of file diff --git a/src/TelegramBot/MessageHandler.py b/src/TelegramBot/MessageHandler.py deleted file mode 100644 index e6b8759..0000000 --- a/src/TelegramBot/MessageHandler.py +++ /dev/null @@ -1,8 +0,0 @@ -# Получение сообщений в чате, и запись их в базу данных -from aiogram import types - -from src.TelegramBot.main import dp - -from main import cursor, config - -#импортировать функцию для обработки сообщений из OpenAI diff --git a/src/TelegramBot/MessageSendler.py b/src/TelegramBot/MessageSendler.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/TelegramBot/main.py b/src/TelegramBot/main.py deleted file mode 100644 index f2952ca..0000000 --- a/src/TelegramBot/main.py +++ /dev/null @@ -1,566 +0,0 @@ -# Импорт библиотек -import os -from contextlib import suppress - -import openai -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 -from aiogram.utils.exceptions import MessageCantBeDeleted, MessageToDeleteNotFound - -mother_path = os.path.dirname(os.path.dirname(os.getcwd())) -sys.path.insert(1, mother_path) - - -# Импорт переменных из файла .ini -config = configparser.ConfigParser() -config.read(os.path.join(mother_path, 'src/config.ini')) -TOKEN = config['Telegram']['token'] -OPENAI_API_KEY = (config['Openai']['api_key']) -bot_trigger_front = (config['Telegram']['bot_trigger_front']).split('|') -bot_trigger_all = (config['Telegram']['bot_trigger_all']).split('|') -# удаление лишних элементов массивов -bot_trigger_front.remove('') -bot_trigger_all.remove('') -DB_message_limit = int(config['DataBase']['message_limit']) - -# Инициализация бота - -bot = Bot(token=TOKEN) -dp = Dispatcher(bot, storage=MemoryStorage()) - -# Инициализация API OpenAI - -openai.api_key = OPENAI_API_KEY - -# Инициализация базы данных OCAB_DB в папке DataBase/OCAB_DB.db -# Создаём базу данных sqlite3 по пути /home/armatik/PycharmProjects/OpenChatAiBot/DataBase/OCAB_DB.db -database = sqlite3.connect(os.path.join(mother_path, 'DataBase/OCAB_DB.db')) -cursor = database.cursor() -# Создаём таблицу chat_list -cursor.execute("""CREATE TABLE IF NOT EXISTS chat_list ( - chat_id INTEGER PRIMARY KEY, - chat_role INTEGER NOT NULL, - chat_stats INTEGER NOT NULL -)""") -# Создаём таблицу message_list -cursor.execute("""CREATE TABLE IF NOT EXISTS message_list ( - message_id INTEGER PRIMARY KEY, - message_text TEXT NOT NULL, - message_sender INTEGER NOT NULL, - answer_id INTEGER -)""") -# Создаём таблицу 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 - user_rep 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 get_role(id): - #получение роли пользователя - user_role = cursor.execute("SELECT user_role FROM user_list WHERE user_id = ?", (id,)).fetchone()[0] - return await get_role_name(user_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 check_user(id): - #Проверка что человек имеет роль пользователя - if cursor.execute("SELECT user_role FROM user_list WHERE user_id = ?", (id,)).fetchone()[0] == 0: - return True - else: - return False - - -async def save_message(message): - #Сохранение сообщения в базу данных - cursor.execute("INSERT INTO message_list VALUES (?, ?, ?, ?)", (message.message_id, message.text, message.from_user.id, 0)) - if message.reply_to_message is not None: - cursor.execute("UPDATE message_list SET answer_id = ? WHERE message_id = ?", (message.reply_to_message.message_id, message.message_id)) - #Если отправитель не зарегистрирован в базе данных, то добавляем его - 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, 0, 1)) - #Добавляем статистику в чат и в данные пользователя, если пользователь не бот. - cursor.execute("UPDATE chat_list SET chat_stats = chat_stats + 1 WHERE chat_id = ?", (message.chat.id,)) - cursor.execute("UPDATE user_list SET user_stats = user_stats + 1 WHERE user_id = ?", (message.from_user.id,)) - database.commit() - - -async def time_to_seconds(time): - #Конвертация текстового указания времени по типу 3h, 5m, 10s в минуты - 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 str(f"{time[0:-1]} дней") - elif time[-1] == 'h': - return str(f"{time[0:-1]} часов") - elif time[-1] == 'm': - return str(f"{time[0:-1]} минут") - elif time[-1] == 's': - return str(f"{time[0:-1]} секунд") - - -@dp.message_handler(commands=['mute']) -async def mute(message: types.Message): - #Проверка что отправитель является администратором чата - try: - if await check_moderator(message.from_user.id): - #Проверка отвечает ли сообщение на другое сообщение - 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 - date_string = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - 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} замьючен на {await short_time_to_time(time)}") - else: - await message.reply(f"Пользователь [{target_name}](tg://user?id={target_id}) является {await get_role(target_id)} и не может быть замьючен", - parse_mode='Markdown') - return - 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 = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - 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} замьючен на {await short_time_to_time(time_mute)}.") - else: - await message.reply(f"Пользователь [{target_name}](tg://user?id={target_id}) является {await get_role(target_id)} и не может быть замьючен", - parse_mode="Markdown") - return - except: - await message.reply("Ошибка данных. Возможно пользователь ещё ничего не написал.") - - -@dp.message_handler(commands=['unmute']) -async def unmute(message: types.Message): - chat_id= message.chat.id - 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: - #возвращаем пользователю стандартные права как у новых пользователей - chat_permisson = await bot.get_chat(chat_id) - await bot.restrict_chat_member(message.chat.id, target_id, until_date=0, permissions=chat_permisson.permissions) - await message.reply( - f"Пользователь [{target_name}](tg://user?id={target_id}) размьючен", - parse_mode="Markdown") - - -#обрабатываем вход пользователя в чат -@dp.message_handler(content_types=['new_chat_members']) -async def new_chat_members(message: types.Message): - #проверяем что пользователь не бот - if not message.new_chat_members[0].is_bot: - #Заносим пользователя в базу данных - cursor.execute("INSERT INTO user_list VALUES (?, ?, ?, ?)", (message.new_chat_members[0].id, message.new_chat_members[0].username, 0, 0)) - - -@dp.message_handler(commands=['chatinfo']) -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 chat_stats FROM chat_list WHERE chat_id = ?", (chat_id,)).fetchone()[0] - await message.reply( - f"Название чата: {chat_title}\n" - f"Количество пользователей: {chat_members}\n" - f"Количество администраторов: {len(chat_admins)}\n" - f"Количество модераторов: {chat_moderators}\n" - f"Количество сообщений: {chat_messages}", - parse_mode="HTML") - await top10(message) - else: - await message.reply( - f"У вас недостаточно прав для выполнения этой команды.") - -@dp.message_handler(commands=['start']) -async def start(message: types.Message): - #проверка что чат есть в базе данных - 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") - except sqlite3.OperationalError: - cursor.execute("ALTER TABLE user_list ADD COLUMN user_name TEXT") - database.commit() - await message.reply("База данных пользователей реструктурирована.") - # Проверка наличия столбца репутации пользователя в базе данных, если его нет, то добавить. - try: - cursor.execute("SELECT user_rep FROM user_list") - except sqlite3.OperationalError: - cursor.execute("ALTER TABLE user_list ADD COLUMN user_rep INTEGER") - 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] - if username is None: - username = "Аноним" - top10_message += f"{username} - {user[1]}\n" - #в начале сообщения берём текст из config.ini и вставляем в него топ 10 пользователей - await message.reply( - f"{config['Telegram']['top10_answer']}\n{top10_message}") - - -@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() - user_rep = cursor.execute("SELECT user_rep FROM user_list WHERE user_id = ?", (message.from_user.id,)).fetchone() - if "None" in str(user_rep): - user_rep = 0 - cursor.execute("UPDATE user_list SET user_rep = ? WHERE user_id = ?", (user_rep, your_id)) - 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}\n" - f"Кол-во сообщений: {user_stats[0]}\n" - f"Репутация: {user_rep[0]}\n" - f"Роль: {role}", - parse_mode="HTML") - no_answer = True - elif default_for_admin == 1: - await message.reply( - f"Вы обнаружены в списке администраторов чата! \n" - f"Вам будет выдана роль: {config['Roles']['moderator']}\n" - f"Имя: {your_name}\n" - f"Кол-во сообщений: {user_stats[0]}\n" - f"Репутация: {user_rep[0]}\n" - f"Роль: {role}", - parse_mode="HTML") - no_answer = True - elif default_for_admin == 2: - await message.reply( - f"Вы обнаружены в списке администраторов чата! \n" - f"Вам будет выдана роль: {config['Roles']['admin']}\n" - f"Имя: {your_name}\n" - f"Кол-во сообщений: {user_stats[0]}\n" - f"Репутация: {user_rep[0]}\n" - f"Роль: {role}", - parse_mode="HTML") - 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}\n" - f"Кол-во сообщений: {user_stats[0]}\n" - f"Репутация: {user_rep[0]}\n" - f"Роль: {role}", - parse_mode="HTML") - -@dp.message_handler(commands=['setrole']) -async def setrole(message: types.Message): - try: - 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] - except: - await message.reply("Пользователь не найден!") - return - 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] - user_rep = cursor.execute("SELECT user_rep FROM user_list WHERE user_id = ?", (target_id,)).fetchone()[0] - if "None" in str(user_rep): - user_rep = 0 - cursor.execute("UPDATE user_list SET user_rep = ? WHERE user_id = ?", (user_rep, target_id)) - 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_rep}\n" - f"Роль: {user_role}", parse_mode="HTML") - else: - await message.reply( - f"Ошибка! Проверьте правильность написания команды.") - -from src.OpenAI.GPT35turbo.OA_processing import openai_message_history_processing - -@dp.message_handler(commands=['history']) -async def history(message: types.Message): - if message.reply_to_message is not None: - # Получаем id сообщения на которое отвечает message - start_message_id = message.reply_to_message.message_id - # Получаем id сообщения message - end_message_id = message.message_id - elif message.text.split()[1] != '': - end_message_id = message.message_id - start_message_id = end_message_id - int(message.text.split()[1]) - else: - await message.reply("Ошибка! Проверьте правильность написания команды.") - return - temp_message = await message.reply("Подождите немного, я обрабатываю историю сообщений... Функция ЭКСПЕРЕМЕНТАЛЬНАЯ " - "и может работать некорректно.") - # Получаем историю сообщений - response = openai_message_history_processing(start_message_id, end_message_id) - if response is None: - await message.reply("Я не понял тебя, попробуй перефразировать") - else: - bot_message_id = await message.reply(response['choices'][0]['message']['content'], parse_mode="markdown") - # заносим сообщение в базу данных в качестве message_id мы пишем id сообщения в bot_message_id - cursor.execute("INSERT INTO message_list VALUES (?, ?, ?, ?)", - (bot_message_id.message_id, response['choices'][0]['message']['content'], 0, message.message_id)) - # очищаем сообщение - asyncio.create_task(delete_message(temp_message, 0)) - -from src.OpenAI.GPT35turbo.OA_processing import openai_message_processing - - -async def delete_message(message: types.Message, sleep_time: int = 0): - await asyncio.sleep(sleep_time) - with suppress(MessageCantBeDeleted, MessageToDeleteNotFound): - await message.delete() - -@dp.message_handler() -async def in_message(message: types.Message): - chat_id = message.chat.id - # Получение сообщений в чате, и запись их в базу данных - if (message.chat.type == "private" or message.chat.type == "channel"): - await message.reply( - f"{config['Telegram']['private_answer']}", - parse_mode="Markdown") - elif (message.chat.type != "group" or message.chat.type != "supergroup") and \ - message.text != '' and message.text != ' ' and \ - (cursor.execute("SELECT chat_role FROM chat_list WHERE chat_id;") == 1): return None - else: - # Запись сообщения в базу данных - await save_message(message) - # Обработка сообщения OpenAI - send_answer = False - typing_mode = False - # импортируем массив триггеров из файла .ini - if message.reply_to_message and message.reply_to_message.from_user.id == (await bot.me).id: - send_answer = True - typing_mode = True - for trigger in bot_trigger_all: - if trigger.lower() in message.text.lower(): - send_answer = True - typing_mode = False - for trigger in bot_trigger_front: - if message.text.lower().startswith(trigger.lower()): - send_answer = True - typing_mode = False - - if send_answer == False: - # Если сообщение отвечает на другое сообщение, то проверяем наличие слова спасибо - if message.reply_to_message is not None: - if message.text.startswith("Спасибо"): - 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] - cursor.execute("UPDATE user_list SET user_rep = user_rep + 1 WHERE user_id = ?", (target_id,)) - database.commit() - await message.reply( - f"Спасибо, [{target_name}](tg://user?id={str(target_id)}) за ваш ответ!", - parse_mode="Markdown") - - if send_answer: - if typing_mode is False: - your_id = message.from_id - your_name = message.from_user.username - temp_msg = await message.reply( - f"[{your_name}](tg://user?id={str(your_id)}), Подожди немного и я обязательно отвечу тебе!", - parse_mode="Markdown") - # Пишем что бот печатает - await bot.send_chat_action(message.chat.id, "typing") - # Получаем ответ от OpenAI - response = openai_message_processing(message.message_id) - if response is None: - bot_message_id = await message.reply("Я не понял тебя, попробуй перефразировать") - if typing_mode is False: - asyncio.create_task(delete_message(temp_msg, 0)) - # заносим сообщение в базу данных в качестве message_id пишем id сообщения которое отправил бот - cursor.execute("INSERT INTO message_list VALUES (?, ?, ?, ?)", - (bot_message_id, "Я не понял тебя, попробуй перефразировать", 0, message.message_id)) - else: - bot_message_id = await message.reply(response['choices'][0]['message']['content'], parse_mode="markdown") - if typing_mode is False: - asyncio.create_task(delete_message(temp_msg, 0)) - # заносим сообщение в базу данных в качестве message_id мы пишем id сообщения в bot_message_id - cursor.execute("INSERT INTO message_list VALUES (?, ?, ?, ?)", - (bot_message_id.message_id, response['choices'][0]['message']['content'], 0, message.message_id)) - # очищаем базу данных от старых сообщений - cursor.execute("DELETE FROM message_list WHERE message_id < ?", (bot_message_id.message_id - DB_message_limit,)) - database.commit() - - -if __name__ == '__main__': - executor.start_polling(dp, skip_updates=True) \ No newline at end of file diff --git a/src/bot/config.ini b/src/bot/config.ini deleted file mode 100644 index 229bfe0..0000000 --- a/src/bot/config.ini +++ /dev/null @@ -1,43 +0,0 @@ -[Telegram] -token=**** -admin_password="Test_pass" -# Пока не используется - -# Массивы заполнять через запятую. Пример: test|test2 |test3, -bot_trigger_front= -# Живой пример: Арма |Армат |Арма, | -bot_trigger_all= -# Живой пример: @arma_ai_bot |помогите | -private_answer= -# Живой пример: Я не понимаю тебя, но я могу поговорить с тобой в группе [название группы](https://t.me/) и ещё в некоторых других группах -reply_ignore=0 -# По умолчанию: 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] -api_key=**** -chat_model=gpt-3.5-turbo -story_model= -# Тут должен быть текст истории бота, но я его не показываю))) -max_token_count=4000 -# максимальное количество токенов в сообщении -min_token_for_answer=800 -# минимальное количество токенов в сообщении ответа бота (чем больше, тем более длинный ответ ГАРАНТИРОВАН) - -[DataBase] -message_limit=3000 -# Максимальное количество сообщений в базе данных - -[AI_Dungeon] -use=openai -# "openai" or "YaGPT" Пока не используется \ No newline at end of file diff --git a/src/bot/config.yaml b/src/bot/config.yaml deleted file mode 100644 index 3392efe..0000000 --- a/src/bot/config.yaml +++ /dev/null @@ -1,23 +0,0 @@ -TELEGRAM: - TOKEN: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 - PRIVATE_ANSWER: - -BOT: - ANSWER: - HELP_ANSWER: - START_ANSWER: - ABOUT_ANSWER: - -ROLES: - ADMIN: - MODERATOR: - USER: - DEFAULT_FOR_ADMIN: - -DATABASE: - MESSAGE_LIMIT: - -GPT_MODULE: - TRIGGER_FRONT: - TRIGGER_ALL: - REPLY_IGNORE: diff --git a/src/bot/core/__init__.py b/src/bot/core/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/bot/core/database/__init__.py b/src/bot/core/database/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/bot/core/database/methods/__init__.py b/src/bot/core/database/methods/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/bot/core/database/models/__init__.py b/src/bot/core/database/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/bot/core/filters/__init__.py b/src/bot/core/filters/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/bot/core/filters/basic.py b/src/bot/core/filters/basic.py deleted file mode 100644 index afb25e6..0000000 --- a/src/bot/core/filters/basic.py +++ /dev/null @@ -1,5 +0,0 @@ -from aiogram.filters import BaseFilter -from aiogram.fsm.context import FSMContext -from aiogram.types import Message - -# You filters diff --git a/src/bot/core/handlers/__init__.py b/src/bot/core/handlers/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/bot/core/handlers/basic.py b/src/bot/core/handlers/basic.py deleted file mode 100644 index 8ae747f..0000000 --- a/src/bot/core/handlers/basic.py +++ /dev/null @@ -1,4 +0,0 @@ -from aiogram.fsm.context import FSMContext -from aiogram.types import Message - -# Your handlers diff --git a/src/bot/core/keyboards/__init__.py b/src/bot/core/keyboards/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/bot/core/keyboards/basic.py b/src/bot/core/keyboards/basic.py deleted file mode 100644 index b36ba01..0000000 --- a/src/bot/core/keyboards/basic.py +++ /dev/null @@ -1,3 +0,0 @@ -from aiogram.types import KeyboardButton, ReplyKeyboardMarkup - -# Your keyboards diff --git a/src/bot/core/middlewares/__init__.py b/src/bot/core/middlewares/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/bot/core/states/__init__.py b/src/bot/core/states/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/bot/core/states/api.py b/src/bot/core/states/api.py deleted file mode 100644 index bb802fd..0000000 --- a/src/bot/core/states/api.py +++ /dev/null @@ -1,3 +0,0 @@ -from aiogram.fsm.context import FSMContext - -# Your funcs diff --git a/src/bot/core/states/states.py b/src/bot/core/states/states.py deleted file mode 100644 index 62f0536..0000000 --- a/src/bot/core/states/states.py +++ /dev/null @@ -1,5 +0,0 @@ -from aiogram.fsm.state import State, StatesGroup - - -class MyState(StatesGroup): - state1 = State() diff --git a/src/bot/core/text_of_buttons.py b/src/bot/core/text_of_buttons.py deleted file mode 100644 index 7945727..0000000 --- a/src/bot/core/text_of_buttons.py +++ /dev/null @@ -1 +0,0 @@ -# Here text of buttons diff --git a/src/bot/core/utils/__init__.py b/src/bot/core/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/bot/core/utils/registry.py b/src/bot/core/utils/registry.py deleted file mode 100644 index 752362d..0000000 --- a/src/bot/core/utils/registry.py +++ /dev/null @@ -1,14 +0,0 @@ -from aiogram import Dispatcher - - -def registry_middlewares(dp: Dispatcher): - pass - - -def registry_handlers(dp: Dispatcher): - pass - - -def registry(dp: Dispatcher): - registry_middlewares(dp) - registry_handlers(dp) diff --git a/src/bot/core/utils/settings.py b/src/bot/core/utils/settings.py deleted file mode 100644 index bd4eb6f..0000000 --- a/src/bot/core/utils/settings.py +++ /dev/null @@ -1,62 +0,0 @@ -import openai - -import configparser -from dataclasses import dataclass - - - -@dataclass -class App: - telegram_token: str - openai_key: str - bot_trigger_front: list[str] - bot_trigger_all: list[str] - - -@dataclass -class Database: - path: str - message_limit: int - - -@dataclass -class Config: - app: App - database: Database - -def _clean_bot_trigger(bot_trigger_front, bot_trigger_all): - """удаление лишних элементов массивов""" - bot_trigger_front.remove('') - bot_trigger_all.remove('') - - -def get_settings(): - # Импорт переменных из файла .ini - config = configparser.ConfigParser() - config.read('core/config.ini') - - bot_trigger_front = (config['Telegram']['bot_trigger_front']).split('|') - bot_trigger_all = (config['Telegram']['bot_trigger_all']).split('|') - - _clean_bot_trigger(bot_trigger_front, bot_trigger_all) - - - return Config( - app=App( - telegram_token=config['Telegram']['token'], - openai_key=config['Openai']['api_key'], - bot_trigger_front = bot_trigger_front, - bot_trigger_all = bot_trigger_all, - ), - database=Database( - path="core/database/data.db", - message_limit=int(config['DataBase']['message_limit']), - ), - ) - -def _openai_init(settings: Config): - openai.api_key = settings.app.openai_key - - -settings = get_settings() -_openai_init(settings) \ No newline at end of file diff --git a/src/bot/main.py b/src/bot/main.py deleted file mode 100644 index d3f832b..0000000 --- a/src/bot/main.py +++ /dev/null @@ -1,28 +0,0 @@ -from asyncio import run - -from aiogram import Bot, Dispatcher - -from core.utils.registry import registry -from core.utils.settings import settings - - -async def start(bot: Bot, dp: Dispatcher): - try: - await dp.start_polling(bot) - finally: - await bot.session.close() - # close db connection here - - -def main(): - bot = Bot(token=settings.app.telegram_token) - - dp = Dispatcher() - - registry(dp) - - run(start(bot, dp)) - - -if __name__ == "__main__": - main() diff --git a/src/config.ini b/src/config.ini deleted file mode 100644 index 229bfe0..0000000 --- a/src/config.ini +++ /dev/null @@ -1,43 +0,0 @@ -[Telegram] -token=**** -admin_password="Test_pass" -# Пока не используется - -# Массивы заполнять через запятую. Пример: test|test2 |test3, -bot_trigger_front= -# Живой пример: Арма |Армат |Арма, | -bot_trigger_all= -# Живой пример: @arma_ai_bot |помогите | -private_answer= -# Живой пример: Я не понимаю тебя, но я могу поговорить с тобой в группе [название группы](https://t.me/) и ещё в некоторых других группах -reply_ignore=0 -# По умолчанию: 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] -api_key=**** -chat_model=gpt-3.5-turbo -story_model= -# Тут должен быть текст истории бота, но я его не показываю))) -max_token_count=4000 -# максимальное количество токенов в сообщении -min_token_for_answer=800 -# минимальное количество токенов в сообщении ответа бота (чем больше, тем более длинный ответ ГАРАНТИРОВАН) - -[DataBase] -message_limit=3000 -# Максимальное количество сообщений в базе данных - -[AI_Dungeon] -use=openai -# "openai" or "YaGPT" Пока не используется \ No newline at end of file diff --git a/src/config.yaml b/src/config.yaml deleted file mode 100644 index 3392efe..0000000 --- a/src/config.yaml +++ /dev/null @@ -1,23 +0,0 @@ -TELEGRAM: - TOKEN: 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 - PRIVATE_ANSWER: - -BOT: - ANSWER: - HELP_ANSWER: - START_ANSWER: - ABOUT_ANSWER: - -ROLES: - ADMIN: - MODERATOR: - USER: - DEFAULT_FOR_ADMIN: - -DATABASE: - MESSAGE_LIMIT: - -GPT_MODULE: - TRIGGER_FRONT: - TRIGGER_ALL: - REPLY_IGNORE: diff --git a/src/core.py b/src/core.py deleted file mode 100644 index 8b13789..0000000 --- a/src/core.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/modules/AdminChat.py b/src/modules/AdminChat.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/modules/Config.py b/src/modules/Config.py deleted file mode 100644 index 99e2c70..0000000 --- a/src/modules/Config.py +++ /dev/null @@ -1,21 +0,0 @@ -import os - -from yaml import load, Loader - - -class Config: - def __init__(self): - self.bot_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.getcwd()))) - self.config_dir = os.path.join(self.bot_dir, 'config.yaml') - - def get_config(self): - return load(open(self.config_dir), Loader=Loader) - - def get_bot_token(self): - return self.get_config()['BOT']['TOKEN'] - - def get_roles(self): - return self.get_config()['ROLES'] - - def get_bot_answers(self): - return self.get_config()['BOT']['ANSWER'] diff --git a/src/modules/DataBase.py b/src/modules/DataBase.py deleted file mode 100644 index b52ea2f..0000000 --- a/src/modules/DataBase.py +++ /dev/null @@ -1,131 +0,0 @@ -import os -import sqlite3 - - -class DataBase: - def __init__(self): - self.bot_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.getcwd()))) - self.db = sqlite3.connect(os.path.join(self.bot_dir, 'DataBase/OCAB_DB.db')) - self.cursor = self.db.cursor() - - # Проверки наличия таблиц в базе данных - def check_db(self): - self.check_chatdb() - self.check_userdb() - self.check_messagedb() - - def check_chatdb(self): - self.cursor.execute("""SELECT name FROM sqlite_master WHERE type='table' AND name='chat_list'""") - if self.cursor.fetchone() is None: - self.create_chatdb() - - def check_userdb(self): - self.cursor.execute("""SELECT name FROM sqlite_master WHERE type='table' AND name='user_list'""") - if self.cursor.fetchone() is None: - self.create_userdb() - - def check_messagedb(self): - self.cursor.execute("""SELECT name FROM sqlite_master WHERE type='table' AND name='message_list'""") - if self.cursor.fetchone() is None: - self.create_messagedb() - - # Создание таблиц в базе данных - def create_chatdb(self): - self.cursor.execute("""CREATE TABLE IF NOT EXISTS chat_list ( - chat_id INTEGER PRIMARY KEY, - chat_role INTEGER NOT NULL, - chat_stats INTEGER NOT NULL, - chat_federation INTEGER, - )""") - self.db.commit() - - def create_userdb(self): - self.cursor.execute("""CREATE TABLE IF NOT EXISTS user_list ( - user_id INTEGER PRIMARY KEY, - user_name TEXT NOT NULL, - user_tag TEXT, - user_role INTEGER, - user_stats INTEGER - user_rep INTEGER - )""") - self.db.commit() - - def create_messagedb(self): - self.cursor.execute("""CREATE TABLE IF NOT EXISTS message_list ( - message_id INTEGER PRIMARY KEY, - message_text TEXT NOT NULL, - message_id_sender INTEGER NOT NULL, - answer_to_id INTEGER - )""") - self.db.commit() - - async def add_chat(self, chat_id, chat_role, chat_stats=0, chat_federation=0): - self.cursor.execute("""INSERT INTO chat_list VALUES (?, ?, ?, ?)""", - (chat_id, chat_role, chat_stats, chat_federation)) - - async def add_user(self, user_id, user_name, user_tag=None, user_role=0, user_stats=0, user_rep=0): - self.cursor.execute("""INSERT INTO user_list VALUES (?, ?, ?, ?, ?, ?)""", - (user_id, user_name, user_tag, user_role, user_stats, user_rep)) - self.db.commit() - - async def add_message(self, message_id, message_text, message_sender, answer_id): - self.cursor.execute("""INSERT INTO message_list VALUES (?, ?, ?, ?)""", - (message_id, message_text, message_sender, answer_id)) - self.db.commit() - - async def get_chat(self, chat_id): - self.cursor.execute("""SELECT * FROM chat_list WHERE chat_id=?""", (chat_id,)) - return self.cursor.fetchone() - - async def get_user(self, user_id): - self.cursor.execute("""SELECT * FROM user_list WHERE user_id=?""", (user_id,)) - return self.cursor.fetchone() - - async def get_user_role(self, user_id): - self.cursor.execute("""SELECT user_role FROM user_list WHERE user_id=?""", (user_id,)) - return self.cursor.fetchone() - - async def get_message(self, message_id): - self.cursor.execute("""SELECT * FROM message_list WHERE message_id=?""", (message_id,)) - return self.cursor.fetchone() - - async def change_user_name(self, user_id, new_user_name): - self.cursor.execute("""UPDATE user_list SET user_name=? WHERE user_id=?""", (new_user_name, user_id)) - self.db.commit() - - async def change_user_role(self, user_id, new_user_role): - self.cursor.execute("""UPDATE user_list SET user_role=? WHERE user_id=?""", (new_user_role, user_id)) - self.db.commit() - - async def change_user_stats(self, user_id, new_user_stats): - self.cursor.execute("""UPDATE user_list SET user_stats=? WHERE user_id=?""", (new_user_stats, user_id)) - self.db.commit() - - async def change_user_rep(self, user_id, new_user_rep): - self.cursor.execute("""UPDATE user_list SET user_rep=? WHERE user_id=?""", (new_user_rep, user_id)) - self.db.commit() - - async def change_chat_role(self, chat_id, new_chat_role): - self.cursor.execute("""UPDATE chat_list SET chat_role=? WHERE chat_id=?""", (new_chat_role, chat_id)) - self.db.commit() - - async def change_chat_stats(self, chat_id, new_chat_stats): - self.cursor.execute("""UPDATE chat_list SET chat_stats=? WHERE chat_id=?""", (new_chat_stats, chat_id)) - self.db.commit() - - async def change_chat_federation(self, chat_id, new_chat_federation): - self.cursor.execute("""UPDATE chat_list SET chat_federation=? WHERE chat_id=?""", - (new_chat_federation, chat_id)) - self.db.commit() - - async def update_user_stats(self): - self.cursor.execute("""UPDATE user_list SET user_stats=user_stats+1""") - self.db.commit() - - async def update_user_rep(self): - self.cursor.execute("""UPDATE user_list SET user_rep=user_rep+1""") - self.db.commit() - - async def update_chat_stats(self): - self.cursor.execute("""UPDATE chat_list SET chat_stats=chat_stats+1""") - self.db.commit() diff --git a/src/modules/Moderation.py b/src/modules/Moderation.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/modules/Roles.py b/src/modules/Roles.py deleted file mode 100644 index ee13a4f..0000000 --- a/src/modules/Roles.py +++ /dev/null @@ -1,33 +0,0 @@ -from Config import Config -from DataBase import DataBase - - -class Roles: - def __init__(self): - self.DB = DataBase() - self.Config = Config() - self.user_role_name = self.Config.get_roles()['USER'] - self.moderator_role_name = self.Config.get_roles()['MODERATOR'] - self.admin_role_name = self.Config.get_roles()['ADMIN'] - - async def check_admin_permission(self, user_id): - if await self.DB.get_user_role(user_id) == 2: - return True - else: - return False - - async def check_moderator_permission(self, user_id): - if await self.DB.get_user_role(user_id) == 1: - return True - else: - return False - - async def get_role_name(self, role_number): - if role_number == 0: - return self.user_role_name - elif role_number == 1: - return self.moderator_role_name - elif role_number == 2: - return self.admin_role_name - else: - return None