Team Ai
Datasetpublic

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)

sourceHugging Faceapache-2.0updated 4mo agoView on Hugging Face
3likes1.7kdownloads
data_manager.py180 linesDownload Raw Back to render-main
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