Update main.py
Browse files
main.py
CHANGED
|
@@ -93,7 +93,7 @@ def gregorian_to_jalali(gy, gm, gd):
|
|
| 93 |
return jy, jm, jd
|
| 94 |
|
| 95 |
# ==============================================================================
|
| 96 |
-
# 🟢 پارت 4: دیتابیس SQLite (نسخه
|
| 97 |
# ==============================================================================
|
| 98 |
import os
|
| 99 |
import sqlite3
|
|
@@ -101,8 +101,8 @@ import json
|
|
| 101 |
import copy
|
| 102 |
import threading
|
| 103 |
|
| 104 |
-
# 🚀 انتقال
|
| 105 |
-
DB_FILE = "/data/
|
| 106 |
OLD_DB_V3 = "/data/users_v3.db"
|
| 107 |
|
| 108 |
last_saved_state = {}
|
|
@@ -121,49 +121,62 @@ def init_sqlite_db():
|
|
| 121 |
conn.execute('PRAGMA journal_mode=TRUNCATE;')
|
| 122 |
conn.execute('PRAGMA synchronous=FULL;')
|
| 123 |
|
| 124 |
-
# ایجاد جدول کاربران
|
| 125 |
conn.execute('CREATE TABLE IF NOT EXISTS users (chat_id TEXT PRIMARY KEY, user_data TEXT)')
|
| 126 |
conn.commit()
|
| 127 |
|
| 128 |
if is_first_run:
|
| 129 |
-
print("🚨 عملیات ا
|
| 130 |
-
|
| 131 |
|
| 132 |
conn.close()
|
| 133 |
except Exception as e:
|
| 134 |
print(f"❌ خطا در راه اندازی دیتابیس: {e}")
|
| 135 |
|
| 136 |
-
# 🧲 تابع
|
| 137 |
-
def
|
| 138 |
if not os.path.exists(old_file):
|
| 139 |
print(f"⚠️ فایل قدیمی {old_file} یافت نشد.")
|
| 140 |
return
|
| 141 |
|
| 142 |
-
print(f"🔍 در حال اس
|
| 143 |
extracted_count = 0
|
|
|
|
| 144 |
try:
|
| 145 |
old_conn = sqlite3.connect(old_file, timeout=20.0)
|
| 146 |
cursor = old_conn.cursor()
|
| 147 |
|
| 148 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 149 |
|
| 150 |
-
#
|
| 151 |
-
|
| 152 |
try:
|
|
|
|
| 153 |
row = cursor.fetchone()
|
| 154 |
-
if row
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
|
|
|
|
|
|
|
|
|
| 161 |
|
| 162 |
new_conn.commit()
|
| 163 |
old_conn.close()
|
| 164 |
-
print(f"✅
|
| 165 |
except Exception as e:
|
| 166 |
-
print(f"⚠️ توقف
|
| 167 |
|
| 168 |
def load_db():
|
| 169 |
global last_saved_state, recent_messages_dict
|
|
|
|
| 93 |
return jy, jm, jd
|
| 94 |
|
| 95 |
# ==============================================================================
|
| 96 |
+
# 🟢 پارت 4: دیتابیس SQLite (نسخه نجات جراحی - پریدن از روی سکتورهای خراب)
|
| 97 |
# ==============================================================================
|
| 98 |
import os
|
| 99 |
import sqlite3
|
|
|
|
| 101 |
import copy
|
| 102 |
import threading
|
| 103 |
|
| 104 |
+
# 🚀 انتقال به v6 برای انجام مجدد عملیات نجات (این بار به صورت خطبهخط جراحی)
|
| 105 |
+
DB_FILE = "/data/users_v6.db"
|
| 106 |
OLD_DB_V3 = "/data/users_v3.db"
|
| 107 |
|
| 108 |
last_saved_state = {}
|
|
|
|
| 121 |
conn.execute('PRAGMA journal_mode=TRUNCATE;')
|
| 122 |
conn.execute('PRAGMA synchronous=FULL;')
|
| 123 |
|
| 124 |
+
# ایجاد جدول کاربران
|
| 125 |
conn.execute('CREATE TABLE IF NOT EXISTS users (chat_id TEXT PRIMARY KEY, user_data TEXT)')
|
| 126 |
conn.commit()
|
| 127 |
|
| 128 |
if is_first_run:
|
| 129 |
+
print("🚨 عملیات نجات جراحی (دور زدن خرابیها) از فایل v3 آغاز شد...")
|
| 130 |
+
surgical_salvage(OLD_DB_V3, conn)
|
| 131 |
|
| 132 |
conn.close()
|
| 133 |
except Exception as e:
|
| 134 |
print(f"❌ خطا در راه اندازی دیتابیس: {e}")
|
| 135 |
|
| 136 |
+
# 🧲 تابع استخراج جراحی (رکورد به رکورد) برای پریدن از روی سکتورهای خراب دیتابیس
|
| 137 |
+
def surgical_salvage(old_file, new_conn):
|
| 138 |
if not os.path.exists(old_file):
|
| 139 |
print(f"⚠️ فایل قدیمی {old_file} یافت نشد.")
|
| 140 |
return
|
| 141 |
|
| 142 |
+
print(f"🔍 در حال اسکن عمیق و جراحی رکوردهای {old_file} ...")
|
| 143 |
extracted_count = 0
|
| 144 |
+
corrupt_count = 0
|
| 145 |
try:
|
| 146 |
old_conn = sqlite3.connect(old_file, timeout=20.0)
|
| 147 |
cursor = old_conn.cursor()
|
| 148 |
|
| 149 |
+
# ابتدا بالاترین شماره سطر (ROWID) را پیدا میکنیم تا بدانیم چقدر باید بگردیم
|
| 150 |
+
try:
|
| 151 |
+
cursor.execute("SELECT MAX(rowid) FROM users")
|
| 152 |
+
max_id = cursor.fetchone()[0]
|
| 153 |
+
if not max_id: max_id = 150000
|
| 154 |
+
except:
|
| 155 |
+
max_id = 150000 # اگر فایل خیلی خراب بود، تا 150 هزار رکورد را دستی میگردیم
|
| 156 |
+
|
| 157 |
+
print(f"تعداد رکوردهای احتمالی جهت اسکن: {max_id}. لطفا چند ثانیه صبر کنید...")
|
| 158 |
|
| 159 |
+
# جستجوی دانه به دانه: اگر یکی خراب بود، فقط همون رو رد میکنه و میره بعدی!
|
| 160 |
+
for i in range(1, max_id + 1):
|
| 161 |
try:
|
| 162 |
+
cursor.execute("SELECT chat_id, user_data FROM users WHERE rowid = ?", (i,))
|
| 163 |
row = cursor.fetchone()
|
| 164 |
+
if row:
|
| 165 |
+
new_conn.execute("INSERT OR IGNORE INTO users VALUES (?, ?)", row)
|
| 166 |
+
extracted_count += 1
|
| 167 |
+
except sqlite3.DatabaseError:
|
| 168 |
+
# این رکورد روی سکتور خراب هارد افتاده است -> رد میشویم
|
| 169 |
+
corrupt_count += 1
|
| 170 |
+
continue
|
| 171 |
+
except Exception:
|
| 172 |
+
corrupt_count += 1
|
| 173 |
+
continue
|
| 174 |
|
| 175 |
new_conn.commit()
|
| 176 |
old_conn.close()
|
| 177 |
+
print(f"✅ شاهکار نجات! {extracted_count} کاربر کاملا سالم استخراج شد و از روی {corrupt_count} رکورد خراب با موفقیت پریدیم.")
|
| 178 |
except Exception as e:
|
| 179 |
+
print(f"⚠️ توقف استخراج: {e} | تعداد نجاتیافته تا این لحظه: {extracted_count}")
|
| 180 |
|
| 181 |
def load_db():
|
| 182 |
global last_saved_state, recent_messages_dict
|