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
|
|
@@ -106,7 +106,7 @@ CORRUPT_FILE = "/data/users_db.db"
|
|
| 106 |
BACKUP_JSON = "/data/users_db.json.bak"
|
| 107 |
|
| 108 |
last_saved_state = {}
|
| 109 |
-
# حافظه کش ف
|
| 110 |
recent_messages_dict = {}
|
| 111 |
# قفلها برای جلوگیری از تداخل رشتهها (Threads)
|
| 112 |
db_lock = threading.Lock()
|
|
@@ -119,21 +119,15 @@ def init_sqlite_db():
|
|
| 119 |
|
| 120 |
conn = sqlite3.connect(DB_FILE, timeout=60.0)
|
| 121 |
cursor = conn.cursor()
|
| 122 |
-
|
| 123 |
-
# 🚀 تنظیمات سرعت دیتابیس
|
| 124 |
cursor.execute('PRAGMA journal_mode=WAL;')
|
| 125 |
cursor.execute('PRAGMA synchronous=NORMAL;')
|
| 126 |
-
|
| 127 |
-
# 1️⃣ اطمینان از وجود و سلامت جدول کاربران (اطلاعات اصلی که نباید پاک شود)
|
| 128 |
cursor.execute('CREATE TABLE IF NOT EXISTS users (chat_id TEXT PRIMARY KEY, user_data TEXT)')
|
| 129 |
|
| 130 |
-
#
|
| 131 |
cursor.execute('DROP TABLE IF EXISTS processed_messages')
|
| 132 |
-
conn.commit()
|
| 133 |
-
|
| 134 |
-
# 3️⃣ آزادسازی فضای هارد دیسک و کاهش حجم فایل دیتابیس (حذف فیزیکی شناسههای قدیمی)
|
| 135 |
-
conn.execute('VACUUM')
|
| 136 |
|
|
|
|
| 137 |
conn.close()
|
| 138 |
|
| 139 |
if is_first_run:
|
|
@@ -169,20 +163,21 @@ def load_db():
|
|
| 169 |
conn.execute('PRAGMA journal_mode=WAL;')
|
| 170 |
cursor = conn.cursor()
|
| 171 |
|
| 172 |
-
#
|
| 173 |
cursor.execute("SELECT chat_id, user_data FROM users")
|
| 174 |
for row in cursor.fetchall():
|
| 175 |
db_dict[row[0]] = json.loads(row[1])
|
| 176 |
|
| 177 |
conn.close()
|
| 178 |
last_saved_state = copy.deepcopy(db_dict)
|
| 179 |
-
|
|
|
|
| 180 |
return db_dict
|
| 181 |
except Exception as e:
|
| 182 |
print(f"⚠️ ارور در لود نهایی: {e}")
|
| 183 |
return {}
|
| 184 |
|
| 185 |
-
# --- سیستم ذخیره سازی کاربران در پسزمینه ---
|
| 186 |
def background_save_worker(changed_data):
|
| 187 |
with db_lock:
|
| 188 |
try:
|
|
@@ -208,11 +203,12 @@ def save_db(db_data):
|
|
| 208 |
for cid, _ in changed:
|
| 209 |
last_saved_state[cid] = copy.deepcopy(db_data[cid])
|
| 210 |
|
|
|
|
| 211 |
threading.Thread(target=background_save_worker, args=(changed,), daemon=True).start()
|
| 212 |
|
| 213 |
-
# --- سیستم
|
| 214 |
def is_message_processed(message_id):
|
| 215 |
-
# چک کردن داخل RAM
|
| 216 |
return str(message_id) in recent_messages_dict
|
| 217 |
|
| 218 |
def mark_message_processed(message_id):
|
|
@@ -220,8 +216,7 @@ def mark_message_processed(message_id):
|
|
| 220 |
with msg_cache_lock:
|
| 221 |
# ثبت فقط در RAM
|
| 222 |
recent_messages_dict[msg_id_str] = True
|
| 223 |
-
|
| 224 |
-
# جلوگیری از پر شدن بیش از حد RAM (نگه داشتن فقط 15000 پیام آخر)
|
| 225 |
if len(recent_messages_dict) > 15000:
|
| 226 |
oldest_key = next(iter(recent_messages_dict))
|
| 227 |
del recent_messages_dict[oldest_key]
|
|
|
|
| 93 |
return jy, jm, jd
|
| 94 |
|
| 95 |
# ==============================================================================
|
| 96 |
+
# 🟢 پارت 4: دیتابیس SQLite (نسخه فوقسریع و بهینهشده بدون ذخیره شناسهها در هارد)
|
| 97 |
# ==============================================================================
|
| 98 |
import os
|
| 99 |
import sqlite3
|
|
|
|
| 106 |
BACKUP_JSON = "/data/users_db.json.bak"
|
| 107 |
|
| 108 |
last_saved_state = {}
|
| 109 |
+
# حافظه کش برای پیامهای پردازش شده صرفاً در RAM (با ریاستارت اسپیس کاملاً پاک میشود)
|
| 110 |
recent_messages_dict = {}
|
| 111 |
# قفلها برای جلوگیری از تداخل رشتهها (Threads)
|
| 112 |
db_lock = threading.Lock()
|
|
|
|
| 119 |
|
| 120 |
conn = sqlite3.connect(DB_FILE, timeout=60.0)
|
| 121 |
cursor = conn.cursor()
|
| 122 |
+
# 🚀 استفاده از WAL برای پشتیبانی از هزاران کاربر همزمان
|
|
|
|
| 123 |
cursor.execute('PRAGMA journal_mode=WAL;')
|
| 124 |
cursor.execute('PRAGMA synchronous=NORMAL;')
|
|
|
|
|
|
|
| 125 |
cursor.execute('CREATE TABLE IF NOT EXISTS users (chat_id TEXT PRIMARY KEY, user_data TEXT)')
|
| 126 |
|
| 127 |
+
# 🧹 پاکسازی دیتابیس: حذف جدول ذخیره پیامها (طبق درخواست، پیامها دیگر در هارد ذخیره نمیشوند)
|
| 128 |
cursor.execute('DROP TABLE IF EXISTS processed_messages')
|
|
|
|
|
|
|
|
|
|
|
|
|
| 129 |
|
| 130 |
+
conn.commit()
|
| 131 |
conn.close()
|
| 132 |
|
| 133 |
if is_first_run:
|
|
|
|
| 163 |
conn.execute('PRAGMA journal_mode=WAL;')
|
| 164 |
cursor = conn.cursor()
|
| 165 |
|
| 166 |
+
# لود کردن کاربران
|
| 167 |
cursor.execute("SELECT chat_id, user_data FROM users")
|
| 168 |
for row in cursor.fetchall():
|
| 169 |
db_dict[row[0]] = json.loads(row[1])
|
| 170 |
|
| 171 |
conn.close()
|
| 172 |
last_saved_state = copy.deepcopy(db_dict)
|
| 173 |
+
# شناسههای پیام دیگر از دیتابیس لود نمیشوند و رم همیشه هنگام شروع خالی است
|
| 174 |
+
print(f"🚀 دیتابیس آماده شد. تعداد کاربران: {len(db_dict)} | کش پیامها ریست شد.")
|
| 175 |
return db_dict
|
| 176 |
except Exception as e:
|
| 177 |
print(f"⚠️ ارور در لود نهایی: {e}")
|
| 178 |
return {}
|
| 179 |
|
| 180 |
+
# --- سیستم ذخیره سازی کاربران در پسزمینه (بدون معطل کردن ربات) ---
|
| 181 |
def background_save_worker(changed_data):
|
| 182 |
with db_lock:
|
| 183 |
try:
|
|
|
|
| 203 |
for cid, _ in changed:
|
| 204 |
last_saved_state[cid] = copy.deepcopy(db_data[cid])
|
| 205 |
|
| 206 |
+
# 🚀 پرتاب عملیات سنگین به یک پردازشگر دیگر تا ربات متوقف نشود
|
| 207 |
threading.Thread(target=background_save_worker, args=(changed,), daemon=True).start()
|
| 208 |
|
| 209 |
+
# --- سیستم بررسی پیام تکراری (اکنون ۱۰۰٪ فقط در RAM کار میکند) ---
|
| 210 |
def is_message_processed(message_id):
|
| 211 |
+
# چک کردن داخل RAM (زمان اجرا: 0.0001 ثانیه)
|
| 212 |
return str(message_id) in recent_messages_dict
|
| 213 |
|
| 214 |
def mark_message_processed(message_id):
|
|
|
|
| 216 |
with msg_cache_lock:
|
| 217 |
# ثبت فقط در RAM
|
| 218 |
recent_messages_dict[msg_id_str] = True
|
| 219 |
+
# جلوگیری از پر شدن بیش از حد RAM در استفادههای طولانی
|
|
|
|
| 220 |
if len(recent_messages_dict) > 15000:
|
| 221 |
oldest_key = next(iter(recent_messages_dict))
|
| 222 |
del recent_messages_dict[oldest_key]
|