Opera8 commited on
Commit
c5caabb
·
verified ·
1 Parent(s): 8166d74

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +13 -18
main.py CHANGED
@@ -93,7 +93,7 @@ def gregorian_to_jalali(gy, gm, gd):
93
  return jy, jm, jd
94
 
95
  # ==============================================================================
96
- # 🟢 پارت 4: دیتابیس SQLite (نسخه فوق‌سریع - فقط RAM برای پیام‌ها + پاکسازی هارد)
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
- # حافظه کش فقط در RAM (با ری‌استارت اسپیس پاک می‌شود)
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
- # 2️⃣ حذف جدول شناسه‌های قدیمی پیام‌ها برای همیشه
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
- print(f"🚀 دیتابیس آماده شد. تعداد کاربران: {len(db_dict)} | کش پیام‌ها پاکسازی شد.")
 
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
- # --- سیستم ضد تکرار پیام کاملاً منتقل شده به RAM ---
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]