From 2c51c0a6367a1a213138ca683797d437c027fd1c Mon Sep 17 00:00:00 2001 From: Verum Date: Wed, 26 Feb 2025 09:17:31 +0700 Subject: [PATCH] =?UTF-8?q?1.2=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=BE=D0=B2=D0=B0=D1=8F=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B0=20=D0=B2=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B7=D1=83=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B8=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=B5?= =?UTF-8?q?=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SQLite3/bd.py | 187 ++++++++++++++++++++++++++++++++++++++++----- SQLite3/bd_user.db | Bin 12288 -> 0 bytes 2 files changed, 170 insertions(+), 17 deletions(-) delete mode 100644 SQLite3/bd_user.db diff --git a/SQLite3/bd.py b/SQLite3/bd.py index 8e9923b..7b21e77 100644 --- a/SQLite3/bd.py +++ b/SQLite3/bd.py @@ -2,22 +2,175 @@ # Файл для работы с базой данных пользователей бота import sqlite3 +from aiogram import types +from datetime import datetime, timedelta, timezone + +from BotLibrary import username, types_message +from ProjectsFiles import Permissions + +bd_names: str = 'SQLite3/bd.db' # Функция создания базы данных -def create_user_db(bd_name : str = 'bd_user.db'): - db = sqlite3.connect(bd_name) - cursor = db.cursor() - cursor.execute(''' - CREATE TABLE IF NOT EXISTS users ( - user_id INTEGER PRIMARY KEY, - tg_id INTEGER NOT NULL, - username TEXT, - first_name TEXT, - last_name TEXT, - status TEXT, - last_message TEXT, - last_message_time TIMESTAMP, - UNIQUE(tg_id) - );''') - db.commit() - db.close() +async def create_user_db(bd_name: str = bd_names): + with sqlite3.connect(bd_name) as db: + cursor = db.cursor() + cursor.execute(''' + CREATE TABLE IF NOT EXISTS users ( + user_id INTEGER PRIMARY KEY, -- Убрали AUTOINCREMENT + tg_id INTEGER NOT NULL UNIQUE, + username TEXT, + first_name TEXT, + last_name TEXT, + role TEXT DEFAULT 'active', + status TEXT DEFAULT 'user' + );''') + + cursor.execute(''' + CREATE TABLE IF NOT EXISTS user_messages ( + user_id INTEGER PRIMARY KEY, -- Уникальный ключ + last_message TEXT, + last_message_id INTEGER, + last_message_time TEXT, + messages_per_day INTEGER DEFAULT 0, + messages_per_week INTEGER DEFAULT 0, + messages_per_month INTEGER DEFAULT 0, + total_messages INTEGER DEFAULT 0, + FOREIGN KEY (user_id) REFERENCES users (user_id) + );''') + + db.commit() + +# Функция добавления пользователя с последовательным user_id +async def add_user(tg_id: int, username: str, first_name: str, + last_name: str, role: str, status: str, bd_name: str = bd_names): + with sqlite3.connect(bd_name) as db: + cursor = db.cursor() + + # Проверяем, существует ли пользователь с таким tg_id + cursor.execute("SELECT user_id FROM users WHERE tg_id = ?", (tg_id,)) + if cursor.fetchone(): + return # Пользователь уже существует, ничего не добавляем + + # Находим максимальный user_id + cursor.execute("SELECT MAX(user_id) FROM users") + max_id = cursor.fetchone()[0] + new_user_id = 1 if max_id is None else max_id + 1 + + # Добавляем нового пользователя + cursor.execute(''' + INSERT INTO users (user_id, tg_id, username, first_name, last_name, role, status) + VALUES (?, ?, ?, ?, ?, ?, ?) + ''', (new_user_id, tg_id, username, first_name, last_name, role, status)) + + # Добавляем запись в user_messages + cursor.execute(''' + INSERT INTO user_messages (user_id) + VALUES (?) + ''', (new_user_id,)) + + db.commit() + +# Функция обновления пользователя +async def update_user(tg_id: int, username: str = None, first_name: str = None, last_name: str = None, + bd_name: str = bd_names, status: str = None, role: str = None): + updates = [] + params = [] + + if username: + updates.append("username = ?") + params.append(username) + if first_name: + updates.append("first_name = ?") + params.append(first_name) + if last_name: + updates.append("last_name = ?") + params.append(last_name) + if status: + updates.append("status = ?") + params.append(status) + if role: + updates.append("role = ?") + params.append(role) + + if updates: + query = f"UPDATE users SET {', '.join(updates)} WHERE tg_id = ?" + params.append(tg_id) + with sqlite3.connect(bd_name) as db: + cursor = db.cursor() + cursor.execute(query, params) + db.commit() + +# Функция обновления статистики сообщений пользователя +async def update_user_messages(tg_id: int, message: types.Message, bd_name: str = bd_names): + with sqlite3.connect(bd_name) as db: + cursor = db.cursor() + cursor.execute("SELECT user_id FROM users WHERE tg_id = ?", (tg_id,)) + user_id = cursor.fetchone() + if not user_id: + return # Пользователь не найден + user_id = user_id[0] + + # Проверяем, существует ли запись в user_messages + cursor.execute("SELECT last_message_time, messages_per_day, messages_per_week, messages_per_month, total_messages FROM user_messages WHERE user_id = ?", (user_id,)) + result = cursor.fetchone() + + now = message.date.astimezone(timezone.utc) # Время сообщения в UTC + last_message = message.text or types_message(message) + last_message_id = message.message_id + + if result: + last_message_time, messages_per_day, messages_per_week, messages_per_month, total_messages = result + if last_message_time: + last_message_time = datetime.fromisoformat(last_message_time).astimezone(timezone.utc) + # Сбрасываем статистику по времени + if now - last_message_time >= timedelta(days=1): + messages_per_day = 0 + if now - last_message_time >= timedelta(weeks=1): + messages_per_week = 0 + if now - last_message_time >= timedelta(days=30): + messages_per_month = 0 + else: + messages_per_day, messages_per_week, messages_per_month = 0, 0, 0 + + # Увеличиваем счетчики + messages_per_day += 1 + messages_per_week += 1 + messages_per_month += 1 + total_messages += 1 + else: + # Если записи нет, создаем новую (хотя это уже должно быть сделано в add_user) + messages_per_day, messages_per_week, messages_per_month, total_messages = 1, 1, 1, 1 + cursor.execute('INSERT INTO user_messages (user_id, last_message, last_message_id, last_message_time, messages_per_day, messages_per_week, messages_per_month, total_messages) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', + (user_id, last_message, last_message_id, now.isoformat(), messages_per_day, messages_per_week, messages_per_month, total_messages)) + db.commit() + return + + # Обновляем существующую запись + cursor.execute(''' + UPDATE user_messages + SET last_message = ?, last_message_id = ?, last_message_time = ?, + messages_per_day = ?, messages_per_week = ?, messages_per_month = ?, + total_messages = ? + WHERE user_id = ? + ''', (last_message, last_message_id, now.isoformat(), messages_per_day, + messages_per_week, messages_per_month, total_messages, user_id)) + db.commit() + +# Основная обработка SQL +async def base_sql(message: types.Message): + tg_id = message.from_user.id + usernames = username(message) + first_name = message.from_user.first_name + last_name = message.from_user.last_name + + if Permissions.sql_user: + await add_user(tg_id, usernames, first_name, last_name, role="active", status="user") + await update_user(tg_id=tg_id, first_name=first_name, last_name=last_name, status="user") + await update_user_messages(tg_id, message) + +# Функция для получения данных о пользователе +def get_user(tg_id: int, bd_name: str = bd_names): + with sqlite3.connect(bd_name) as db: + cursor = db.cursor() + cursor.execute("SELECT * FROM users WHERE tg_id = ?", (tg_id,)) + return cursor.fetchone() diff --git a/SQLite3/bd_user.db b/SQLite3/bd_user.db deleted file mode 100644 index ded9a83bc2cad16c6e3aad7689d9c549e4a38fa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI#O-sWt7zglVippRww_cy)3L*^8f>nYPySjB5xKoL&8-=~#l8I;WwokAR<@fPu z6Py%Z*nR#3NqCZ{Y4U3?>Gz`CWHeqZXUfnyYckH+B@ttc7xkd1+hXIxZBXj| zds^2T@2pbau==L)w(9}RLjVF0fB*y_009U<00Izzz&{gsY4c;x^Z09E)WbAe>1?T8 zQ@Kt=AO*?bDiY*|s8yxUV&gO)Q5Z{cBNFN+VJAq2bSs9Z^p#~M<(&9VQap&FQi5G( zu4WlYaW6~b<9w-2`rFJ@{V}19GAsRkA(uYOv{sWJFDcKZCbzo?JEAXxPPep`K^*o5 zqUDa_yOa5T<;c76ILqgw>{&lfi<^C_R%YSi)KR5v*V%jhiT$H$wrSc11p*L&00bZa w0SG_<0uX=z1Rwx`eHEzMgW>+aub&s^f&c^{009U<00Izz00bZa0SGvO4?{z0p8x;=