import sqlite3 from datetime import datetime from threading import Lock import telebot from backend_flask import app from config import DB_PATH from models import UserEvents, Users from utilities.database import db # Lock for database operations db_lock = Lock() def is_whitelisted(chat_id): """Проверяет, есть ли пользователь с заданным chat_id в базе данных и не заблокирован ли он.""" try: with app.app_context(): # Создаем контекст приложения user = db.session.query(Users).filter_by(chat_id=chat_id).first() if user: if user.is_blocked: return False, "Ваш доступ заблокирован." return True, None return False, None except Exception as e: telebot.logger.error(f"Ошибка при проверке пользователя: {e}") return False, "Произошла ошибка при проверке доступа." def rundeck_add_to_whitelist(chat_id, username, user_email): with db_lock: conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() # Проверка существования chat_id check_query = 'SELECT COUNT(*) FROM whitelist WHERE chat_id = ?' cursor.execute(check_query, (chat_id,)) count = cursor.fetchone()[0] if count > 0: conn.close() return False # Пользователь уже существует # Вставка нового пользователя insert_query = 'INSERT INTO whitelist (chat_id, username, user_email) VALUES (?, ?, ?)' telebot.logger.info( f"Rundeck executing query: {insert_query} with chat_id={chat_id}, username={username}, email={user_email}") cursor.execute(insert_query, (chat_id, username, user_email)) conn.commit() conn.close() return True # Успешное добавление def remove_from_whitelist(chat_id): with db_lock: conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() query = 'DELETE FROM whitelist WHERE chat_id = ?' telebot.logger.info(f"Executing query: {query} with chat_id={chat_id}") cursor.execute(query, (chat_id,)) conn.commit() conn.close() def get_admins(): with db_lock: conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute('SELECT chat_id FROM admins') admins = cursor.fetchall() admins = [i[0] for i in admins] conn.close() return admins def get_sorted_regions(): with db_lock: conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute('SELECT region_id, region_name FROM regions WHERE active = TRUE') regions = cursor.fetchall() conn.close() # Сортируем регионы по числовому значению region_id regions.sort(key=lambda x: int(x[0])) return regions def region_exists(region_id): with db_lock: conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute('SELECT COUNT(*) FROM regions WHERE region_id = ? AND active = TRUE', (region_id,)) count = cursor.fetchone()[0] conn.close() return count > 0 def get_user_subscribed_regions(chat_id): with db_lock: conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute(''' SELECT regions.region_id, regions.region_name FROM subscriptions JOIN regions ON subscriptions.region_id = regions.region_id WHERE subscriptions.chat_id = ? AND subscriptions.active = TRUE AND subscriptions.skip = FALSE ORDER BY regions.region_id ''', (chat_id,)) regions = cursor.fetchall() conn.close() # Сортируем регионы по числовому значению region_id regions.sort(key=lambda x: int(x[0])) return regions def is_subscribed(chat_id, region_id): with db_lock: conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute(''' SELECT COUNT(*) FROM subscriptions WHERE chat_id = ? AND region_id = ? AND active = TRUE AND skip = FALSE ''', (chat_id, region_id)) count = cursor.fetchone()[0] conn.close() return count > 0 def format_regions_list(regions): return '\n'.join([f"{region_id} - {region_name}" for region_id, region_name in regions]) def log_user_event(chat_id, username, action): """Логирует действие пользователя с использованием ORM.""" try: with app.app_context(): # Создаем контекст приложения timestamp = datetime.now(datetime.UTC) # Оставляем объект datetime для БД formatted_time = timestamp.strftime('%Y-%m-%d %H:%M:%S') # Форматируем для логов event = UserEvents( chat_id=chat_id, telegram_id=username, action=action, timestamp=timestamp # В БД передаем объект datetime ) db.session.add(event) db.session.commit() telebot.logger.info(f"User event logged: {chat_id} ({username}) - {action} at {formatted_time}.") except Exception as e: telebot.logger.error(f"Error logging user event: {e}")