mirror of
https://github.com/FerraSoft/bottohelp.git
synced 2026-08-06 21:55:03 +00:00
177 lines
8.1 KiB
Python
177 lines
8.1 KiB
Python
import sqlite3
|
|
import os
|
|
|
|
def final_migration():
|
|
"""Финальная миграция для полного соответствия схеме models.py"""
|
|
try:
|
|
# Создаем резервную копию текущей базы данных
|
|
if os.path.exists('telegram_bot.db'):
|
|
backup_name = f"telegram_bot_backup_{sqlite3.datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.db"
|
|
os.rename('telegram_bot.db', backup_name)
|
|
print(f"Создана резервная копия: {backup_name}")
|
|
|
|
# Создаем новую базу данных с правильной схемой
|
|
conn = sqlite3.connect('telegram_bot.db')
|
|
cursor = conn.cursor()
|
|
|
|
print("СОЗДАНИЕ НОВОЙ БАЗЫ ДАННЫХ ПО ПРАВИЛЬНОЙ СХЕМЕ")
|
|
|
|
# Создаем все таблицы согласно схеме из models.py
|
|
tables_sql = [
|
|
'''CREATE TABLE users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
telegram_id INTEGER UNIQUE NOT NULL,
|
|
username TEXT,
|
|
first_name TEXT,
|
|
last_name TEXT,
|
|
joined_date DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
last_activity DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
reputation INTEGER DEFAULT 0,
|
|
rank TEXT DEFAULT 'Новичок',
|
|
warnings INTEGER DEFAULT 0,
|
|
is_active BOOLEAN DEFAULT 1,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)''',
|
|
|
|
'''CREATE TABLE scores (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER UNIQUE NOT NULL,
|
|
total_score INTEGER DEFAULT 0,
|
|
message_count INTEGER DEFAULT 0,
|
|
game_wins INTEGER DEFAULT 0,
|
|
donations_total REAL DEFAULT 0.0,
|
|
last_updated DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
)''',
|
|
|
|
'''CREATE TABLE achievements (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT UNIQUE NOT NULL,
|
|
description TEXT NOT NULL,
|
|
condition_type TEXT NOT NULL,
|
|
condition_value TEXT NOT NULL,
|
|
badge TEXT NOT NULL,
|
|
is_active BOOLEAN DEFAULT 1,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)''',
|
|
|
|
'''CREATE TABLE user_achievements (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
achievement_id INTEGER NOT NULL,
|
|
unlocked_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id),
|
|
FOREIGN KEY (achievement_id) REFERENCES achievements(id),
|
|
UNIQUE(user_id, achievement_id)
|
|
)''',
|
|
|
|
'''CREATE TABLE warnings (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
reason TEXT NOT NULL,
|
|
admin_id INTEGER NOT NULL,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id),
|
|
FOREIGN KEY (admin_id) REFERENCES users(id)
|
|
)''',
|
|
|
|
'''CREATE TABLE donations (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
amount REAL NOT NULL,
|
|
year INTEGER NOT NULL DEFAULT (strftime('%Y', 'now')),
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
)''',
|
|
|
|
'''CREATE TABLE errors (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
admin_id INTEGER NOT NULL,
|
|
error_type TEXT NOT NULL,
|
|
title TEXT NOT NULL,
|
|
description TEXT,
|
|
status TEXT DEFAULT 'new',
|
|
priority TEXT DEFAULT 'medium',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
ai_analysis TEXT,
|
|
todo_added BOOLEAN DEFAULT 0,
|
|
resolved_at DATETIME,
|
|
FOREIGN KEY (admin_id) REFERENCES users(id)
|
|
)''',
|
|
|
|
'''CREATE TABLE scheduled_posts (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
chat_id INTEGER NOT NULL,
|
|
text TEXT NOT NULL,
|
|
image_path TEXT,
|
|
schedule_time DATETIME NOT NULL,
|
|
created_by INTEGER DEFAULT 0,
|
|
status TEXT DEFAULT 'pending',
|
|
published_at DATETIME,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)''',
|
|
|
|
'''CREATE TABLE games (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
type TEXT NOT NULL,
|
|
status TEXT DEFAULT 'active',
|
|
participants TEXT,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)'''
|
|
]
|
|
|
|
# Создаем таблицы
|
|
for i, sql in enumerate(tables_sql, 1):
|
|
cursor.execute(sql)
|
|
print(f"Создана таблица {i}/{len(tables_sql)}")
|
|
|
|
# Инициализируем достижения
|
|
achievements = [
|
|
("Первое сообщение", "Отправить первое сообщение в чате", "messages", "1", "💬"),
|
|
("Болтун", "Отправить 100 сообщений", "messages", "100", "🗣️"),
|
|
("Коммуникатор", "Отправить 1000 сообщений", "messages", "1000", "📢"),
|
|
("Первая игра", "Сыграть первую игру", "games", "1", "🎮"),
|
|
("Игрок", "Выиграть 10 игр", "games", "10", "🏆"),
|
|
("Чемпион", "Выиграть 100 игр", "games", "100", "👑"),
|
|
("Первый донат", "Сделать первый донат", "donations", "1", "💰"),
|
|
("Меценат", "Пожертвовать 1000 рублей", "donations", "1000", "🏦"),
|
|
("Благотворитель", "Пожертвовать 10000 рублей", "donations", "10000", "💎"),
|
|
("Новичок", "Набрать 100 очков", "score", "100", "🌟"),
|
|
("Активист", "Набрать 1000 очков", "score", "1000", "⭐"),
|
|
("Эксперт", "Набрать 10000 очков", "score", "10000", "🏅"),
|
|
("Легенда", "Набрать 100000 очков", "score", "100000", "👑"),
|
|
("Долгожитель", "Быть активным 7 дней", "days_active", "7", "📅"),
|
|
("Ветеран", "Быть активным 30 дней", "days_active", "30", "🎖️"),
|
|
]
|
|
|
|
# Добавляем достижения
|
|
for name, description, condition_type, condition_value, badge in achievements:
|
|
cursor.execute("""
|
|
INSERT INTO achievements (name, description, condition_type, condition_value, badge)
|
|
VALUES (?, ?, ?, ?, ?)
|
|
""", (name, description, condition_type, condition_value, badge))
|
|
|
|
print(f"Добавлено {len(achievements)} достижений")
|
|
|
|
# Проверяем созданные таблицы
|
|
cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
|
|
tables = cursor.fetchall()
|
|
table_names = [table[0] for table in tables]
|
|
|
|
print(f"СОЗДАНО ТАБЛИЦ: {len(table_names)}")
|
|
print(f"СПИСОК ТАБЛИЦ: {table_names}")
|
|
|
|
conn.commit()
|
|
conn.close()
|
|
|
|
print("ФИНАЛЬНАЯ МИГРАЦИЯ ЗАВЕРШЕНА УСПЕШНО!")
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"Ошибка финальной миграции: {e}")
|
|
return False
|
|
|
|
if __name__ == "__main__":
|
|
final_migration() |