ysn-rfd/text-dataset-tiny-code-script-py-format
USED of tahamajs/medicine_ds_persian for .parquet file USED of Alijafarixcs2/persian-it-llama2-2k for .parquet file USED of Abirate/english_quotes for .jsonl file NEW FILES (05/12/2025) NEW FILES (12/26/2025) NEW FILES (02/15/2026)
31.7k
1# data_manager.py2 3import os4import json5import logging6from datetime import datetime, timedelta7 8# --- تنظیمات مسیر فایلها ---9BASE_DIR = os.path.dirname(os.path.abspath(__file__))10DATA_FILE = os.path.join(BASE_DIR, "bot_data.json")11LOG_FILE = os.path.join(BASE_DIR, "bot.log")12 13# --- کش دادههای گلوبال ---14DATA = {15 "users": {},16 "banned_users": set(),17 "stats": {18 "total_messages": 0,19 "total_users": 0,20 "avg_response_time": 0.0,21 "max_response_time": 0.0,22 "min_response_time": float('inf'),23 "total_responses": 024 },25 "welcome_message": "سلام {user_mention}! 🤖\n\nمن یک ربات هوشمند هستم. هر سوالی دارید بپرسید.",26 "goodbye_message": "کاربر {user_mention} گروه را ترک کرد. خداحافظ!",27 "maintenance_mode": False,28 "blocked_words": [],29 "scheduled_broadcasts": [],30 "bot_start_time": datetime.now().strftime('%Y-%m-%d %H:%M:%S')31}32 33logger = logging.getLogger(__name__)34 35def load_data():36 """دادهها را از فایل JSON بارگذاری کرده و در کش گلوبال ذخیره میکند."""37 global DATA38 try:39 if not os.path.exists(DATA_FILE):40 logger.info(f"فایل داده در {DATA_FILE} یافت نشد. یک فایل جدید ایجاد میشود.")41 save_data()42 return43 44 with open(DATA_FILE, 'r', encoding='utf-8') as f:45 loaded_data = json.load(f)46 loaded_data['banned_users'] = set(loaded_data.get('banned_users', []))47 48 # اطمینان از وجود کلیدهای جدید در فایلهای قدیمی49 if 'blocked_words' not in loaded_data: loaded_data['blocked_words'] = []50 if 'scheduled_broadcasts' not in loaded_data: loaded_data['scheduled_broadcasts'] = []51 if 'maintenance_mode' not in loaded_data: loaded_data['maintenance_mode'] = False52 if 'bot_start_time' not in loaded_data: loaded_data['bot_start_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')53 if 'avg_response_time' not in loaded_data['stats']:54 loaded_data['stats']['avg_response_time'] = 0.055 loaded_data['stats']['max_response_time'] = 0.056 loaded_data['stats']['min_response_time'] = float('inf')57 loaded_data['stats']['total_responses'] = 058 59 DATA.update(loaded_data)60 logger.info(f"دادهها با موفقیت از {DATA_FILE} بارگذاری شدند.")61 62 except json.JSONDecodeError as e:63 logger.error(f"خطا در خواندن JSON از {DATA_FILE}: {e}. ربات با دادههای اولیه شروع به کار میکند.")64 except Exception as e:65 logger.error(f"خطای غیرمنتظره هنگام بارگذاری دادهها: {e}. ربات با دادههای اولیه شروع به کار میکند.")66 67def save_data():68 """کش گلوبال دادهها را در فایل JSON ذخیره میکند."""69 global DATA70 try:71 data_to_save = DATA.copy()72 data_to_save['banned_users'] = list(DATA['banned_users'])73 74 with open(DATA_FILE, 'w', encoding='utf-8') as f:75 json.dump(data_to_save, f, indent=4, ensure_ascii=False)76 logger.debug(f"دادهها با موفقیت در {DATA_FILE} ذخیره شدند.")77 except Exception as e:78 logger.error(f"خطای مهلک: امکان ذخیره دادهها در {DATA_FILE} وجود ندارد. خطا: {e}")79 80def update_user_stats(user_id: int, user):81 """آمار کاربر را پس از هر پیام بهروز کرده و دادهها را ذخیره میکند."""82 global DATA83 now_str = datetime.now().strftime('%Y-%m-%d %H:%M:%S')84 user_id_str = str(user_id)85 86 if user_id_str not in DATA['users']:87 DATA['users'][user_id_str] = {88 'first_name': user.first_name,89 'username': user.username,90 'first_seen': now_str,91 'message_count': 092 }93 DATA['stats']['total_users'] += 194 logger.info(f"کاربر جدید ثبت شد: {user_id} ({user.first_name})")95 96 DATA['users'][user_id_str]['last_seen'] = now_str97 DATA['users'][user_id_str]['message_count'] += 198 DATA['stats']['total_messages'] += 199 100 save_data()101 102def update_response_stats(response_time: float):103 """آمار زمان پاسخگویی را بهروز میکند."""104 global DATA105 106 if DATA['stats']['total_responses'] == 0:107 DATA['stats']['min_response_time'] = response_time108 109 DATA['stats']['total_responses'] += 1110 111 # محاسبه میانگین جدید112 current_avg = DATA['stats']['avg_response_time']113 total_responses = DATA['stats']['total_responses']114 new_avg = ((current_avg * (total_responses - 1)) + response_time) / total_responses115 DATA['stats']['avg_response_time'] = new_avg116 117 # بهروزرسانی حداکثر و حداقل زمان پاسخگویی118 if response_time > DATA['stats']['max_response_time']:119 DATA['stats']['max_response_time'] = response_time120 121 if response_time < DATA['stats']['min_response_time']:122 DATA['stats']['min_response_time'] = response_time123 124 save_data()125 126def is_user_banned(user_id: int) -> bool:127 """بررسی میکند آیا کاربر مسدود شده است یا خیر."""128 return user_id in DATA['banned_users']129 130def ban_user(user_id: int):131 """کاربر را مسدود کرده و ذخیره میکند."""132 DATA['banned_users'].add(user_id)133 save_data()134 135def unban_user(user_id: int):136 """مسدودیت کاربر را برداشته و ذخیره میکند."""137 DATA['banned_users'].discard(user_id)138 save_data()139 140def contains_blocked_words(text: str) -> bool:141 """بررسی میکند آیا متن حاوی کلمات مسدود شده است یا خیر."""142 if not DATA['blocked_words']:143 return False144 145 text_lower = text.lower()146 for word in DATA['blocked_words']:147 if word in text_lower:148 return True149 150 return False151 152def get_active_users(days: int) -> list:153 """لیست کاربران فعال در بازه زمانی مشخص را برمیگرداند."""154 now = datetime.now()155 cutoff_date = now - timedelta(days=days)156 157 active_users = []158 for user_id, user_info in DATA['users'].items():159 if 'last_seen' in user_info:160 try:161 last_seen = datetime.strptime(user_info['last_seen'], '%Y-%m-%d %H:%M:%S')162 if last_seen >= cutoff_date:163 active_users.append(int(user_id))164 except ValueError:165 continue166 167 return active_users168 169def get_users_by_message_count(min_count: int) -> list:170 """لیست کاربران با تعداد پیام بیشتر یا مساوی مقدار مشخص را برمیگرداند."""171 users = []172 for user_id, user_info in DATA['users'].items():173 if user_info.get('message_count', 0) >= min_count:174 users.append(int(user_id))175 176 return users177 178# بارگذاری اولیه دادهها در زمان ایمپورت شدن ماژول179load_data()180 