from discord.ext import commands from backup_bot.logger import logger from os.path import isdir from os import mkdir import shelve from datetime import datetime from discord import File, Embed from collections import OrderedDict extension_name = "backup" logger = logger.getChild(extension_name) @commands.command("backup") async def backup_cmd(ctx: commands.Context): embed = Embed(title="Backup", description="In progress... \N{hourglass}") msg = await ctx.send(embed=embed) file_name = f"backup/{datetime.now().strftime('%d-%m-%Y %H:%M')}" with shelve.open(file_name, writeback=True) as file: file["channels"] = OrderedDict() file["users"] = OrderedDict() file["categories"] = OrderedDict() for c in ctx.guild.text_channels: embed_field_name = c.name if c.category: embed_field_name = f"{c.category} > {embed_field_name}" if c.category_id not in file["categories"]: file["categories"][c.category_id] = {"name": c.category.name, "position": c.category.position, "nsfw": c.category.is_nsfw()} embed = msg.embeds[0] if len(embed.fields) != 0: embed.set_field_at(-1, name=embed.fields[-1].name, value="\N{check mark}", inline=False) embed.add_field(name=embed_field_name, value="\N{hourglass}", inline=False) await msg.edit(embed=embed) file["channels"][c.id] = {"name": c.name, "id": c.id, "category_id": c.category_id, "topic": c.topic, "position": c.position, "slowmode_delay": c.slowmode_delay, "nsfw": c.is_nsfw(), "messages": []} async for m in c.history(limit=None): if m.author.id not in file["users"]: file["users"][m.author.id] = {"name": m.author.name, "discriminator": m.author.discriminator, "display_name": m.author.display_name, "avatar": m.author.avatar} file["channels"][c.id]["messages"].append({"author_id": m.author.id, "content": m.content, "embeds": m.embeds, # "attachments": m.attachments, "pinned": m.pinned, "reactions": m.reactions, "created_at": m.created_at, "edited_at": m.edited_at}) embed = msg.embeds[0] embed.set_field_at(-1, name=embed.fields[-1].name, value="\N{check mark}", inline=False) embed.description = "Finish ! \N{check mark}" await msg.edit(embed=embed) await ctx.send(file=File(file_name + ".db", "backup.db")) def setup(bot: commands.Bot): logger.info(f"Loading of {extension_name} extension") if not isdir("backup"): logger.info(f"Create backup folder") mkdir("backup") try: bot.add_command(backup_cmd) except Exception as e: logger.error(f"Error loading extension {extension_name}: {e}") else: logger.info(f"Extension {extension_name} load successful") def teardown(bot: commands.Bot): logger.info(f"Unloading of {extension_name} extension") try: bot.remove_command("backup") except Exception as e: logger.error(f"Error unloading extension {extension_name}: {e}") else: logger.info(f"Extension {extension_name} unload successful")