mirror of
https://gitflic.ru/project/maks1ms/ocab.git
synced 2024-12-23 16:23:01 +03:00
New unstable code
This commit is contained in:
parent
e66901a6b8
commit
c0346d81a8
@ -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:
|
||||
|
@ -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 = ?",
|
||||
|
@ -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]
|
||||
|
Loading…
Reference in New Issue
Block a user