import os import shutil from pyrogram import Client, filters, enums from pyrogram.types import Message # noinspection PyUnresolvedReferences from utils.misc import modules_help, prefix from utils.scripts import format_exc, restart from utils.db import db from utils import config 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( f"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=f"Database backup complete!\nType: " f".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( f"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=f"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/") from utils.misc import modules_help 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/") from utils.misc import modules_help 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=f"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": f"Backup database", "restore [reply]": f"Restore database", "backupmod [name]": f"Backup mod", "backupmods": f"Backup all mods", "resmod [name]": f"Restore mod", "resmods": f"Restore all mods", }