| INIT_SQLS = [ |
| |
| """CREATE TABLE IF NOT EXISTS archives ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| archive_id TEXT, |
| media_id INTEGER, |
| media_type TEXT, |
| file_name TEXT, |
| dataset_name TEXT, |
| account TEXT, |
| account_key TEXT, |
| title TEXT, |
| year INTEGER, |
| season_number INTEGER, |
| episode_number INTEGER, |
| quality TEXT, |
| file_size INTEGER, |
| status TEXT DEFAULT 'archived', |
| telegram_file_unique_id TEXT, |
| timestamp TEXT, |
| genres TEXT, |
| rating REAL, |
| progress_status TEXT, |
| progress_details TEXT, |
| archive_space TEXT, |
| source TEXT, |
| audio TEXT, |
| network TEXT, |
| highlights TEXT, |
| full_metadata TEXT, |
| storage_channel_id INTEGER, |
| storage_msg_id INTEGER, |
| created_at TEXT DEFAULT (datetime('now')) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS users ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER UNIQUE NOT NULL, |
| username TEXT, first_name TEXT, last_name TEXT, |
| photo_url TEXT, language_code TEXT DEFAULT 'en', |
| stars_balance INTEGER DEFAULT 0, kernels_balance INTEGER DEFAULT 0, |
| total_earned_kernels INTEGER DEFAULT 0, total_spent_kernels INTEGER DEFAULT 0, |
| is_premium INTEGER DEFAULT 0, last_active_at TEXT, |
| total_watch_time INTEGER DEFAULT 0, points INTEGER DEFAULT 0, |
| created_at TEXT DEFAULT (datetime('now')) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS watch_history ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER NOT NULL, tmdb_id INTEGER NOT NULL, |
| media_type TEXT NOT NULL, season_number INTEGER, episode_number INTEGER, |
| progress_seconds INTEGER DEFAULT 0, duration_seconds INTEGER DEFAULT 0, |
| watch_count INTEGER DEFAULT 1, completed INTEGER DEFAULT 0, |
| last_watched_at TEXT, |
| UNIQUE(user_id, tmdb_id, media_type, COALESCE(season_number, 0), COALESCE(episode_number, 0)) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS user_list ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER NOT NULL, tmdb_id INTEGER NOT NULL, |
| media_type TEXT NOT NULL CHECK(media_type IN ('movie', 'tv')), |
| title TEXT NOT NULL DEFAULT '', poster_url TEXT, |
| added_at TEXT DEFAULT (datetime('now')), |
| UNIQUE(user_id, tmdb_id, media_type) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS ratings ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER NOT NULL, tmdb_id INTEGER NOT NULL, |
| media_type TEXT NOT NULL, rating INTEGER NOT NULL CHECK(rating >= 1 AND rating <= 10), |
| review TEXT, created_at TEXT DEFAULT (datetime('now')), |
| updated_at TEXT DEFAULT (datetime('now')), |
| UNIQUE(user_id, tmdb_id, media_type) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS friendships ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER NOT NULL, friend_id INTEGER NOT NULL, |
| status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending','accepted','rejected')), |
| created_at TEXT DEFAULT (datetime('now')), |
| UNIQUE(user_id, friend_id) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS conversations ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER NOT NULL, participant_id INTEGER NOT NULL, |
| last_message TEXT, last_message_at TEXT, unread_count INTEGER DEFAULT 0, |
| created_at TEXT DEFAULT (datetime('now')), |
| UNIQUE(user_id, participant_id) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS messages ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| conversation_id INTEGER NOT NULL, sender_id INTEGER NOT NULL, |
| content TEXT NOT NULL, created_at TEXT DEFAULT (datetime('now')) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS watch_parties ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| room_code TEXT UNIQUE NOT NULL, host_id INTEGER NOT NULL, |
| tmdb_id INTEGER, media_type TEXT, title TEXT, |
| is_public INTEGER DEFAULT 1, password TEXT DEFAULT '', |
| max_participants INTEGER DEFAULT 10, |
| status TEXT DEFAULT 'waiting' CHECK(status IN ('waiting','playing','paused','ended')), |
| created_at TEXT DEFAULT (datetime('now')) |
| )""", |
| """CREATE TABLE IF NOT EXISTS party_members ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| party_id INTEGER NOT NULL, user_id INTEGER NOT NULL, |
| role TEXT DEFAULT 'member' CHECK(role IN ('host','member')), |
| joined_at TEXT DEFAULT (datetime('now')), |
| UNIQUE(party_id, user_id) |
| )""", |
| """CREATE TABLE IF NOT EXISTS party_chat ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| party_id INTEGER NOT NULL, user_id INTEGER NOT NULL, |
| user_name TEXT NOT NULL DEFAULT '', content TEXT NOT NULL, |
| created_at TEXT DEFAULT (datetime('now')) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS products ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| name_en TEXT NOT NULL, name_ar TEXT NOT NULL, |
| description_en TEXT, description_ar TEXT, |
| category TEXT, rarity TEXT, |
| price_stars INTEGER DEFAULT 0, price_kernels INTEGER DEFAULT 0, |
| image_url TEXT, sort_order INTEGER DEFAULT 0, active INTEGER DEFAULT 1, |
| is_purchasable INTEGER DEFAULT 1, preview_images TEXT DEFAULT '[]', |
| tags TEXT DEFAULT '', payment_method TEXT DEFAULT 'stars', |
| created_at TEXT DEFAULT (datetime('now')), updated_at TEXT DEFAULT (datetime('now')) |
| )""", |
| """CREATE TABLE IF NOT EXISTS asset_items ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| product_id INTEGER, type TEXT, name_en TEXT, |
| image_url TEXT, rarity TEXT, sort_order INTEGER DEFAULT 0, |
| file_url TEXT DEFAULT '', preview_url TEXT DEFAULT '', |
| metadata TEXT DEFAULT '{}' |
| )""", |
| """CREATE TABLE IF NOT EXISTS user_assets ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER NOT NULL, asset_type TEXT, asset_id INTEGER, |
| is_active INTEGER DEFAULT 0, acquired_at TEXT DEFAULT (datetime('now')) |
| )""", |
| """CREATE TABLE IF NOT EXISTS purchases ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER NOT NULL, product_id INTEGER, |
| stars_amount INTEGER DEFAULT 0, status TEXT DEFAULT 'completed', |
| purchased_at TEXT DEFAULT (datetime('now')) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS notifications ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER NOT NULL, title TEXT NOT NULL, body TEXT, |
| type TEXT DEFAULT 'info', is_read INTEGER DEFAULT 0, |
| created_at TEXT DEFAULT (datetime('now')) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS achievements ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| name TEXT UNIQUE NOT NULL, description TEXT, icon TEXT, |
| category TEXT, total_required INTEGER DEFAULT 1 |
| )""", |
| """CREATE TABLE IF NOT EXISTS user_achievements ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER NOT NULL, achievement_id INTEGER NOT NULL, |
| progress INTEGER DEFAULT 0, total INTEGER DEFAULT 1, |
| is_unlocked INTEGER DEFAULT 0, unlocked_at TEXT, |
| UNIQUE(user_id, achievement_id) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS daily_streaks ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER NOT NULL UNIQUE, streak_count INTEGER DEFAULT 0, |
| last_claim_date TEXT |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS comments ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER NOT NULL, tmdb_id INTEGER NOT NULL, |
| media_type TEXT NOT NULL, content TEXT NOT NULL, |
| rating INTEGER, created_at TEXT DEFAULT (datetime('now')) |
| )""", |
| """CREATE TABLE IF NOT EXISTS comment_likes ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| comment_id INTEGER NOT NULL, user_id INTEGER NOT NULL, |
| created_at TEXT DEFAULT (datetime('now')), |
| UNIQUE(comment_id, user_id) |
| )""", |
| """CREATE TABLE IF NOT EXISTS comment_reports ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| comment_id INTEGER NOT NULL, user_id INTEGER NOT NULL, |
| reason TEXT NOT NULL, created_at TEXT DEFAULT (datetime('now')) |
| )""", |
| """CREATE TABLE IF NOT EXISTS rating_helpful ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| rating_id INTEGER NOT NULL, user_id INTEGER NOT NULL, |
| created_at TEXT DEFAULT (datetime('now')), |
| UNIQUE(rating_id, user_id) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS archive_progress ( |
| archive_id TEXT PRIMARY KEY, |
| status TEXT DEFAULT 'pending', |
| file_name TEXT, account TEXT, account_key TEXT, quality TEXT, |
| file_unique_id TEXT, step TEXT, progress_pct INTEGER DEFAULT 0, |
| message TEXT, updated_at REAL |
| )""", |
| ] |
|
|
| INDEX_SQLS = [ |
| "CREATE INDEX IF NOT EXISTS idx_archives_media_id ON archives(media_id)", |
| "CREATE INDEX IF NOT EXISTS idx_archives_media_type ON archives(media_type)", |
| "CREATE INDEX IF NOT EXISTS idx_archives_status ON archives(status)", |
| "CREATE INDEX IF NOT EXISTS idx_archives_type_status ON archives(media_type, status)", |
| "CREATE INDEX IF NOT EXISTS idx_archives_account ON archives(account_key)", |
| "CREATE INDEX IF NOT EXISTS idx_archives_unique_id ON archives(telegram_file_unique_id)", |
| "CREATE INDEX IF NOT EXISTS idx_watch_history_user ON watch_history(user_id)", |
| "CREATE INDEX IF NOT EXISTS idx_watch_history_tmdb ON watch_history(tmdb_id, media_type)", |
| "CREATE INDEX IF NOT EXISTS idx_friendships_user ON friendships(user_id, status)", |
| "CREATE INDEX IF NOT EXISTS idx_friendships_friend ON friendships(friend_id, status)", |
| "CREATE INDEX IF NOT EXISTS idx_messages_conv ON messages(conversation_id)", |
| "CREATE INDEX IF NOT EXISTS idx_notifications_user ON notifications(user_id, is_read)", |
| "CREATE INDEX IF NOT EXISTS idx_user_assets_user ON user_assets(user_id)", |
| "CREATE INDEX IF NOT EXISTS idx_purchases_user ON purchases(user_id)", |
| "CREATE INDEX IF NOT EXISTS idx_party_members_party ON party_members(party_id)", |
| "CREATE INDEX IF NOT EXISTS idx_party_chat_party ON party_chat(party_id)", |
| "CREATE INDEX IF NOT EXISTS idx_conversations_user ON conversations(user_id)", |
| ] |
|
|
| FTS_SQLS = [ |
| "CREATE VIRTUAL TABLE IF NOT EXISTS archives_fts USING fts5(title, overview, content='archives', content_rowid='id')", |
| ] |
|
|
| SEED_SQLS = [ |
| """INSERT OR IGNORE INTO products (id, name_en, name_ar, category, rarity, price_stars, price_kernels, image_url, sort_order) |
| VALUES |
| (1, 'Gold Frame', 'ุฅุทุงุฑ ุฐูุจู', 'frames', 'legendary', 500, 50, '/assets/badges/gold-frame.svg', 1), |
| (2, 'Silver Frame', 'ุฅุทุงุฑ ูุถู', 'frames', 'epic', 300, 30, '/assets/badges/silver-frame.svg', 2), |
| (3, 'Neon Theme', 'ุณู
ุฉ ูููู', 'themes', 'epic', 400, 40, '/assets/badges/neon-theme.svg', 3), |
| (4, 'Dark Mode Pro', 'ุงููุถุน ุงูุฏุงูู ุจุฑู', 'themes', 'rare', 200, 20, '/assets/badges/dark-pro.svg', 4), |
| (5, 'Rainbow Badge', 'ุดุงุฑุฉ ููุณ ูุฒุญ', 'badges', 'legendary', 1000, 100, '/assets/badges/rainbow.svg', 5), |
| (6, 'PopCorn Crown', 'ุชุงุฌ ุจูุจููุฑู', 'badges', 'legendary', 2000, 200, '/assets/badges/crown.svg', 6) |
| """, |
| """INSERT OR IGNORE INTO asset_items (product_id, type, name_en, image_url, rarity, sort_order) |
| VALUES |
| (1, 'frame', 'Gold Frame', '/assets/badges/gold-frame.svg', 'legendary', 1), |
| (2, 'frame', 'Silver Frame', '/assets/badges/silver-frame.svg', 'epic', 2), |
| (3, 'theme', 'Neon Theme', '/assets/badges/neon-theme.svg', 'epic', 3), |
| (4, 'theme', 'Dark Mode Pro', '/assets/badges/dark-pro.svg', 'rare', 4), |
| (5, 'badge', 'Rainbow Badge', '/assets/badges/rainbow.svg', 'legendary', 5), |
| (6, 'badge', 'PopCorn Crown', '/assets/badges/crown.svg', 'legendary', 6) |
| """, |
| """INSERT OR IGNORE INTO achievements (id, name, description, icon, category, total_required) VALUES |
| (1, 'First Watch', 'Watch your first movie', '\U0001f3ac', 'watching', 1), |
| (2, 'Movie Marathon', 'Watch 10 movies', '\U0001f4fa', 'watching', 10), |
| (3, 'PopCorn Lover', 'Watch 50 movies', '\U0001f37f', 'watching', 50), |
| (4, 'Binge Watcher', 'Watch 100 movies', '\U0001f525', 'watching', 100), |
| (5, 'Social Butterfly', 'Make 5 friends', '\U0001f98b', 'social', 5), |
| (6, 'Party Starter', 'Create 3 watch parties', '\U0001f389', 'social', 3), |
| (7, 'Collector', 'Buy 5 items from the store', '\U0001f48e', 'store', 5), |
| (8, 'High Roller', 'Earn 1000 kernels', '\U0001f4b0', 'earning', 1000) |
| """, |
| |
| """CREATE TABLE IF NOT EXISTS social_posts ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER NOT NULL, |
| post_type TEXT DEFAULT 'status', |
| content TEXT, |
| media_type TEXT, |
| media_id INTEGER, |
| image_url TEXT, |
| is_spoiler INTEGER DEFAULT 0, |
| tags TEXT, |
| likes_count INTEGER DEFAULT 0, |
| comments_count INTEGER DEFAULT 0, |
| shares_count INTEGER DEFAULT 0, |
| views_count INTEGER DEFAULT 0, |
| status TEXT DEFAULT 'active', |
| created_at TEXT DEFAULT (datetime('now')) |
| )""", |
| """CREATE TABLE IF NOT EXISTS social_likes ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| post_id INTEGER NOT NULL, |
| user_id INTEGER NOT NULL, |
| created_at TEXT DEFAULT (datetime('now')), |
| UNIQUE(post_id, user_id) |
| )""", |
| """CREATE TABLE IF NOT EXISTS social_saves ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| post_id INTEGER NOT NULL, |
| user_id INTEGER NOT NULL, |
| created_at TEXT DEFAULT (datetime('now')), |
| UNIQUE(post_id, user_id) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS clubs ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| name TEXT NOT NULL, |
| description TEXT, |
| cover_image TEXT, |
| owner_user_id INTEGER NOT NULL, |
| is_private INTEGER DEFAULT 0, |
| tags TEXT, |
| weekly_movie_tmdb_id INTEGER, |
| member_count INTEGER DEFAULT 0, |
| rules TEXT, |
| status TEXT DEFAULT 'active', |
| created_at TEXT DEFAULT (datetime('now')) |
| )""", |
| """CREATE TABLE IF NOT EXISTS club_members ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| club_id INTEGER NOT NULL, |
| user_id INTEGER NOT NULL, |
| role TEXT DEFAULT 'member', |
| joined_at TEXT DEFAULT (datetime('now')), |
| UNIQUE(club_id, user_id) |
| )""", |
| |
| """CREATE TABLE IF NOT EXISTS daily_quests ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| title TEXT NOT NULL, |
| description TEXT, |
| xp_reward INTEGER DEFAULT 50, |
| stars_reward INTEGER DEFAULT 0, |
| kernels_reward INTEGER DEFAULT 0, |
| icon TEXT, |
| sort_order INTEGER DEFAULT 0, |
| is_active INTEGER DEFAULT 1 |
| )""", |
| """CREATE TABLE IF NOT EXISTS user_quests ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER NOT NULL, |
| quest_id INTEGER NOT NULL, |
| progress INTEGER DEFAULT 0, |
| completed INTEGER DEFAULT 0, |
| date TEXT DEFAULT (datetime('now', 'start of day')), |
| UNIQUE(user_id, quest_id, date) |
| )""", |
| """CREATE TABLE IF NOT EXISTS weekly_challenges ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| title TEXT NOT NULL, |
| description TEXT, |
| xp_reward INTEGER DEFAULT 200, |
| stars_reward INTEGER DEFAULT 50, |
| kernels_reward INTEGER DEFAULT 10, |
| icon TEXT, |
| is_active INTEGER DEFAULT 1, |
| starts_at TEXT, |
| ends_at TEXT |
| )""", |
| """CREATE TABLE IF NOT EXISTS season_pass_levels ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| level_num INTEGER NOT NULL UNIQUE, |
| xp_required INTEGER NOT NULL, |
| free_reward TEXT, |
| premium_reward TEXT |
| )""", |
| """CREATE TABLE IF NOT EXISTS user_season_pass ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id INTEGER NOT NULL, |
| level_num INTEGER NOT NULL, |
| claimed INTEGER DEFAULT 0, |
| claimed_at TEXT, |
| UNIQUE(user_id, level_num) |
| )""", |
| |
| """INSERT OR IGNORE INTO daily_quests (id, title, description, xp_reward, icon, sort_order) VALUES |
| (1, 'ุดุงูุฏ ูููู
ุงู', 'ุดุงูุฏ ุฃู ูููู
ุงูููู
', 50, '\U0001f3ac', 1), |
| (2, 'ููู
3 ุฃููุงู
', 'ุฃุถู ุชูููู
ู ูุซูุงุซุฉ ุฃููุงู
', 30, '\u2b50', 2), |
| (3, 'ุดุงุฑู ูู ุญููุฉ', 'ุงูุถู
ุฃู ุฃูุดุฆ ุญููุฉ ู
ุดุงูุฏุฉ', 60, '\U0001f465', 3), |
| (4, 'ุงูุชุจ ู
ุฑุงุฌุนุฉ', 'ุดุงุฑู ุฑุฃูู ุจูููู
ุดุงูุฏุชู', 40, '\U0001f4dd', 4), |
| (5, 'ุชุตูุญ 10 ุฏูุงุฆู', 'ุชุตูุญ ุงูุชุทุจูู ูู
ุฏุฉ 10 ุฏูุงุฆู', 20, '\u23f1\ufe0f', 5) |
| """, |
| """INSERT OR IGNORE INTO weekly_challenges (id, title, description, xp_reward, stars_reward, icon) VALUES |
| (1, 'ู
ุงุฑุงุซูู ุฃููุงู
', 'ุดุงูุฏ 5 ุฃููุงู
ูุฐุง ุงูุฃุณุจูุน', 200, 50, '\U0001f3c3'), |
| (2, 'ู
ุณุชูุดู ุงูุฃููุงุน', 'ุฌุฑุจ 3 ุฃููุงุน ู
ุฎุชููุฉ ู
ู ุงูุฃููุงู
', 150, 30, '\U0001f9ed'), |
| (3, 'ุงุฌุชู
ุงุนู', 'ุดุงุฑู ูู 3 ุญููุงุช ู
ุดุงูุฏุฉ', 180, 40, '\U0001f91d') |
| """, |
| """INSERT OR IGNORE INTO season_pass_levels (level_num, xp_required, free_reward, premium_reward) VALUES |
| (1, 0, '10 Stars', '20 Stars'), |
| (2, 100, '5 Kernels', '15 Kernels'), |
| (3, 250, '20 Stars', '๐จ Asset Common'), |
| (4, 500, '10 Kernels', '30 Stars'), |
| (5, 800, '50 Stars', '๐จ Asset Rare'), |
| (6, 1200, '15 Kernels', '100 Stars'), |
| (7, 1800, '100 Stars', '๐ Premium 1 Month'), |
| (8, 2500, '30 Kernels', '๐จ Asset Epic'), |
| (9, 4000, '200 Stars', '๐ 500 Kernels'), |
| (10, 6000, '๐จ Asset Legendary', '๐ Premium 3 Months') |
| """, |
| ] |
|
|