153 lines
5.5 KiB
Python
153 lines
5.5 KiB
Python
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}") |