import os import shutil from pyrogram import Client, enums, filters from pyrogram.types import Message from utils import config from utils.db import db # noinspection PyUnresolvedReferences from utils.misc import modules_help, prefix from utils.scripts import format_exc, restart if config.db_type in ['mongodb', 'mongo']: import bson def dump_mongo(collections, path, db_): for coll in collections: with open(os.path.join(path, f'{coll}.bson'), 'wb+') as f: for doc in db_[coll].find(): f.write(bson.BSON.encode(doc)) def restore_mongo(path, db_): for coll in os.listdir(path): if coll.endswith('.bson'): with open(os.path.join(path, coll), 'rb+') as f: db_[coll.split('.')[0]].insert_many(bson.decode_all(f.read())) @Client.on_message(filters.command(['backup', 'back'], prefix) & filters.me) async def backup(client: Client, message: Message): """ Backup the database """ try: if not os.path.exists('backups/'): os.mkdir('backups/') await message.edit('Backing up database...', parse_mode=enums.ParseMode.HTML) if config.db_type in ['mongo', 'mongodb']: dump_mongo(db._database.list_collection_names(), 'backups/', db._database) return await message.edit( 'Database backed up to: backups/ folder', parse_mode=enums.ParseMode.HTML, ) else: shutil.copy(config.db_name, f'backups/{config.db_name}') await client.send_document( 'me', caption='Database backup complete!\nType: ' '.restore in response to this message to restore the database.', document=f'backups/{config.db_name}', parse_mode=enums.ParseMode.HTML, ) return await message.edit( 'Database backed up successfully! (Check your favorites)', parse_mode=enums.ParseMode.HTML, ) except Exception as e: await message.edit(format_exc(e), parse_mode=enums.ParseMode.HTML) @Client.on_message(filters.command(['restore', 'res'], prefix) & filters.me) async def restore(client: Client, message: Message): """ Restore the database """ try: await message.edit('Restoring database...', parse_mode=enums.ParseMode.HTML) if config.db_type in ['mongo', 'mongodb']: restore_mongo('backups/', db._database) return await message.edit( 'Database restored from: backups/ folder', parse_mode=enums.ParseMode.HTML, ) else: if not message.reply_to_message or not message.reply_to_message.document: return await message.edit( 'Reply to a document to restore the database.', parse_mode=enums.ParseMode.HTML, ) elif not message.reply_to_message.document.file_name.casefold().endswith(('.db', '.sqlite', '.sqlite3')): return await message.edit( 'Reply to a database file to restore the database.', parse_mode=enums.ParseMode.HTML, ) await message.reply_to_message.download(f'backups/{message.reply_to_message.document.file_name}') shutil.copy(f'backups/{message.reply_to_message.document.file_name}', config.db_name) await message.edit( 'Database restored successfully!', parse_mode=enums.ParseMode.HTML, ) restart() except Exception as e: await message.edit(format_exc(e), parse_mode=enums.ParseMode.HTML) @Client.on_message(filters.command(['backupmods', 'bms'], prefix) & filters.me) async def backupmods(client: Client, message: Message): """ Backup the modules """ try: if not os.path.exists('backups/'): os.mkdir('backups/') await message.edit('Backing up modules...', parse_mode=enums.ParseMode.HTML) from utils.misc import modules_help for mod in modules_help: if os.path.isfile(f'modules/custom_modules/{mod}.py'): f = open(f'backups/{mod}.py', 'wb') f.write(open(f'modules/custom_modules/{mod}.py', 'rb').read()) await message.edit( text='All modules backed up to: backups/ folder', parse_mode=enums.ParseMode.HTML, ) except Exception as e: await message.edit(format_exc(e), parse_mode=enums.ParseMode.HTML) @Client.on_message(filters.command(['backupmod', 'bm'], prefix) & filters.me) async def backupmod(client: Client, message: Message): """ Backup the module """ try: if not os.path.exists('backups/'): os.mkdir('backups/') try: mod = message.text.split(maxsplit=1)[1].split('.')[0] except: return await message.edit( f'Usage: {prefix}backupmod [module]', parse_mode=enums.ParseMode.HTML, ) await message.edit('Backing up module...', parse_mode=enums.ParseMode.HTML) if os.path.isfile(f'modules/custom_modules/{mod}.py'): f = open(f'backups/{mod}.py', 'wb') f.write(open(f'modules/custom_modules/{mod}.py', 'rb').read()) else: return await message.edit( f'Module {mod} not found.', parse_mode=enums.ParseMode.HTML, ) await message.reply_document( document=f'backups/{mod}.py', caption=f'Module {mod} backed up to: backups/ folder', parse_mode=enums.ParseMode.HTML, ) except Exception as e: await message.edit(format_exc(e), parse_mode=enums.ParseMode.HTML) @Client.on_message(filters.command(['restoremod', 'resmod'], prefix) & filters.me) async def restoremod(client: Client, message: Message): """ Restore the module """ try: if not os.path.exists('backups/'): os.mkdir('backups/') try: mod = message.text.split(maxsplit=1)[1].split('.')[0] except: return await message.edit( f'Usage: {prefix}restoremod [module]', parse_mode=enums.ParseMode.HTML, ) await message.edit('Restoring module...', parse_mode=enums.ParseMode.HTML) if os.path.isfile(f'backups/{mod}.py'): f = open(f'modules/custom_modules/{mod}.py', 'wb') f.write(open(f'backups/{mod}.py', 'rb').read()) else: return await message.edit( f'Module {mod} not found.', parse_mode=enums.ParseMode.HTML, ) await message.edit( f'Module {mod} restored successfully!', parse_mode=enums.ParseMode.HTML, ) restart() except Exception as e: await message.edit(format_exc(e), parse_mode=enums.ParseMode.HTML) @Client.on_message(filters.command(['restoremods', 'resmods'], prefix) & filters.me) async def restoremods(client: Client, message: Message): """ Restore the modules """ try: if not os.path.exists('backups/'): os.mkdir('backups/') await message.edit('Restoring modules...', parse_mode=enums.ParseMode.HTML) for mod in os.listdir('backups/'): if mod.endswith('.py'): if os.path.isfile(f'modules/{mod}'): continue f = open(f'modules/custom_modules/{mod}', 'wb') f.write(open(f'backups/{mod}', 'rb').read()) await message.edit( text='All modules restored from: backups/ folder', parse_mode=enums.ParseMode.HTML, ) restart() except Exception as e: await message.edit(format_exc(e), parse_mode=enums.ParseMode.HTML) modules_help['backup'] = { 'backup': 'Backup database', 'restore [reply]': 'Restore database', 'backupmod [name]': 'Backup mod', 'backupmods': 'Backup all mods', 'resmod [name]': 'Restore mod', 'resmods': 'Restore all mods', }