async def _load_settings(self): await self.guild.edit( name=self.data["name"], region=discord.VoiceRegion(self.data["region"]), afk_channel=self.guild.get_channel( self.id_translator.get(self.data["afk_channel"])), afk_timeout=self.data["afk_timeout"], # verification_level=discord.VerificationLevel(self.data["verification_level"]), system_channel=self.guild.get_channel( self.id_translator.get(self.data["system_channel"])))
async def server(ctx): server = ctx.guild online_members = 0 inactive_members = 0 busy_members = 0 bots = 0 bans = await server.bans() s_e = discord.Embed(title='Server information', description=server.description, color=discord.Color.from_rgb(255, 0, 0)) s_e.add_field(name="Server ID", value=server.id) s_e.add_field(name="Name", value=server.name) s_e.add_field(name="Server Owner", value=server.owner_id) for member in server.members: if member.bot == False: if member.status == discord.Status.online or member.status == discord.Status.idle or member.status == discord.Status.dnd: online_members += 1 elif member.status == discord.Status.idle: inactive_members += 1 elif member.status == discord.Status.dnd: busy_members += 1 else: bots += 1 statuses = ( f'<:online:747352635643920385> **{online_members}** Online \n<:idle:747490969984958544> **{inactive_members}** Inactive' + f'\n<:dnd:747492056087134289> **{busy_members}** Busy \n<:offline:747355444250542141> **{server.member_count - (online_members + bots)}** Offline' ) s_e.add_field(name="People statuses", value=statuses) members = ( f'**{server.member_count}** All \n**{server.member_count - bots}** People \n**{bots}** Bots' ) s_e.add_field(name="Server members", value=members) channels = f'<:textchannel:747403102650368032> {len(server.text_channels)} Text \n<:voicechannel:747410314630266960> {len(server.voice_channels)} Voice' s_e.add_field(name="Channels", value=channels) s_e.add_field(name="Emojis", value=f':grinning: {len(server.emojis)}') s_e.add_field(name="Bans", value=f'<:banhammer:747471683140452391> {len(bans)}') s_e.add_field(name="Roles", value=len(server.roles)) if server.region == discord.VoiceRegion('amsterdam'): s_e.add_field(name="Voice Region", value=":flag_nl: Nethelands") elif server.region == discord.VoiceRegion('brazil'): s_e.add_field(name="Voice Region", value=":flag_br: Brazil") elif server.region == discord.VoiceRegion('dubai'): s_e.add_field(name="Voice Region", value=":flag_ae: United Arab Emirates") elif server.region == discord.VoiceRegion('europe'): s_e.add_field(name="Voice Region", value=":flag_eu: Europe") elif server.region == discord.VoiceRegion('frankfurt'): s_e.add_field(name="Voice Region", value=":flag_de: Germany") elif server.region == discord.VoiceRegion('hongkong'): s_e.add_field(name="Voice Region", value=":flag_hk: Hong Kong") elif server.region == discord.VoiceRegion('india'): s_e.add_field(name="Voice Region", value=":flag_in: India") elif server.region == discord.VoiceRegion('japan'): s_e.add_field(name="Voice Region", value=":flag_jp: Japan") elif server.region == discord.VoiceRegion('london'): s_e.add_field(name="Voice Region", value=":flag_gb: United Kingdom") elif server.region == discord.VoiceRegion('russia'): s_e.add_field(name="Voice Region", value=":flag_ru: Russia") elif server.region == discord.VoiceRegion('singapore'): s_e.add_field(name="Voice Region", value=":flag_sg: Singapore") elif server.region == discord.VoiceRegion('southafrica'): s_e.add_field(name="Voice Region", value=":flag_za: South Africa") elif server.region == discord.VoiceRegion('south_korea'): s_e.add_field(name="Voice Region", value=":flag_kr: South Korea") elif server.region == discord.VoiceRegion('sydney'): s_e.add_field(name="Voice Region", value=":flag_au: Australia") elif (server.region == discord.VoiceRegion('us_central') or server.region == discord.VoiceRegion('us_east') or server.region == discord.VoiceRegion('vip_us_east') or server.region == discord.VoiceRegion('us_south') or server.region == discord.VoiceRegion('us_west') or server.region == discord.VoiceRegion('vip_us_west')): s_e.add_field(name="Voice Region", value=":flag_us: USA") s_e.add_field(name="Created at", value=calculator(server.created_at), inline=False) s_e.set_thumbnail(url=server.icon_url) s_e.set_footer(text=f"Caused by: {str(ctx.author)}", icon_url=ctx.author.avatar_url) await ctx.send(embed=s_e)
async def create_server(bot: discord.Client, server: dict, import_folder="", add_emojis=True): logging.info("Validating server JSON...") server_schema_path = "schemas/server_schema.json" with open(server_schema_path) as f: server_schema = json.load(f) # We need this for the json pointers in the schemas to work resolver = jsonschema.RefResolver("file:///" + os.getcwd() + "/schemas/", server_schema) # Validate the server dict jsonschema.validate(server, server_schema, resolver=resolver) logging.info(f"OK: server name \"{server['name']}\"") server_icon_bytes = None # Download the server icon. The icon argument for create_guild takes a # bytes-like object if import_folder and server["id"]: logging.info("Trying to find server icon in import folder...") candidate_path = f"{import_folder}/icons/{server['id']}" if os.path.exists(candidate_path): with open(candidate_path, "rb") as f: server_icon_bytes = f.read() else: logging.info("Downloading server icon...") try: # Server icon cannot be over 10.240MB # first element is the icon, second is the extension server_icon_bytes = get_icon_under_10mb(server["icon_url"])[0] except discord.errors.HTTPException: logging.error( "Could not download server icon, falling back to default") server_icon_bytes = None # A bot account in over 10 guilds cannot create guilds and will throw an # HTTPException # We have no way of verifying if `bot` is a real bot or a user account try: new_guild = await bot.create_guild( server["name"], region=discord.VoiceRegion(server["voice_region"]), icon=server_icon_bytes, ) except discord.errors.HTTPException as e: logging.critical(""" Could not create guild. Known problem: Bot accounts in more than 10 guilds are not allowed to create guilds. Solution: use `overwrite_server` Known problem: User is in too many guilds Solution: leave a guild or use alternate account or use `overwrite_server` """) return None # After the server is created, we can add the roles and stuff with other # functions # which can be used in `overwrite_server` # first: roles await append_roles(new_guild, server["roles"]) # second: categories, for synced perms # this adds channels with their perm overrides. await append_categories(bot, new_guild, server["categories"]) # third: emojis if add_emojis: await append_emojis(new_guild, server["emojis"], import_folder) """ await asyncio.gather( append_roles(bot, new_guild, server['roles']), append_emojis(bot, new_guild, server['emojis']), ) """ # return the server return new_guild
async def serverload(self, ctx, server=":"): # filenames cannot contain : so I'm using this as a workaround to make it only use the current server ID if no server is given """Load an entire server?!?!?!??! Loads in the saved data from a previously saved server. Usage: >serverload - Attempt to find a save of the current server and load it. >serverload <filename> - Find a saved server by filename (if a whole filename is not given, the latest save from all of the filenames that contain the given filename is used) """ if not os.path.exists("server_save") or not os.listdir("server_save"): return await ctx.send(self.bot.bot_prefix + "You have no servers saved!") saves = os.listdir("server_save") guild_saves = [x for x in saves if server in x or str(ctx.guild.id) in x] if not guild_saves: return await ctx.send(self.bot.bot_prefix + "That server couldn't be found in your saves.") parsed_guild_saves = [datetime.strptime(x.split("_")[2].split(".")[0], "%Y-%m-%d") for x in guild_saves] server_save = guild_saves[parsed_guild_saves.index(max(parsed_guild_saves))] await ctx.send(self.bot.bot_prefix + "Loading server... (this may take a few minutes, check console for progress)") print("Beginning server load process...") with open("server_save/" + server_save, "r") as f: g = json.load(f) print("Loading roles...") for role in ctx.guild.roles[:]: if role.name not in [x["name"] for x in g["roles"]]: await role.delete(reason="Loading saved server") for role in g["roles"]: permissions = discord.Permissions() permissions.update(**dict(role["permissions"])) if role["name"] not in [x.name for x in ctx.guild.roles]: await ctx.guild.create_role(name=role["name"], colour=discord.Colour.from_rgb(*role["colour"]), hoist=role["hoist"], mentionable=role["mentionable"], permissions=permissions, reason="Loading saved server") else: await [x for x in ctx.guild.roles if x.name == role["name"]][0].edit(name=role["name"], colour=discord.Colour.from_rgb(*role["colour"]), hoist=role["hoist"], mentionable=role["mentionable"], permissions=permissions, reason="Loading saved server") print("Loading text channels...") for channel in ctx.guild.text_channels: if channel.name not in [x["name"] for x in g["text_channels"]]: await channel.delete(reason="Loading saved server") for channel in g["text_channels"]: overwrites = [] for overwrite in channel["overwrites"]: if overwrite["type"] == "role": if overwrite["name"] not in [x.name for x in ctx.guild.roles]: pass else: role = [x for x in ctx.guild.roles if x.name == overwrite["name"]][0] permissions = discord.PermissionOverwrite() permissions.update(**dict(overwrite["permissions"])) overwrites.append((role, permissions)) else: if overwrite["name"] not in [x.name for x in ctx.guild.members]: pass else: member = [x for x in ctx.guild.members if x.name == overwrite["name"]][0] permissions = discord.PermissionOverwrite() permissions.update(**dict(overwrite["permissions"])) overwrites.append((member, permissions)) if channel["name"] in [x.name for x in ctx.guild.text_channels]: channel_obj = [x for x in ctx.guild.text_channels if x.name == channel["name"]][0] await channel_obj.edit(name=channel["name"], topic=channel["topic"], reason="Loading saved server") overwrites_dict = dict(overwrites) for overwrite in overwrites_dict: await channel_obj.set_permissions(overwrite, overwrite=overwrites_dict[overwrite], reason="Loading saved server") else: new_chan = await ctx.guild.create_text_channel(channel["name"], overwrites=dict(overwrites), reason="Loading saved server") await new_chan.edit(topic=channel["topic"], nsfw=channel["nsfw"], reason="Loading saved server") print("Loading voice channels...") for channel in ctx.guild.voice_channels: if channel.name not in [x["name"] for x in g["voice_channels"]]: await channel.delete(reason="Loading saved server") for channel in g["voice_channels"]: if channel["name"] not in [x.name for x in ctx.guild.voice_channels]: overwrites = [] for overwrite in channel["overwrites"]: if overwrite["type"] == "role": if overwrite["name"] not in [x.name for x in ctx.guild.roles]: pass else: role = [x for x in ctx.guild.roles if x.name == overwrite["name"]][0] permissions = discord.PermissionOverwrite() permissions.update(**dict(overwrite["permissions"])) overwrites.append((role, permissions)) else: if overwrite["name"] not in [x.name for x in ctx.guild.members]: pass else: members = [x for x in ctx.guild.members if x.name == overwrite["name"]][0] permissions = discord.PermissionOverwrite() permissions.update(**dict(overwrite["permissions"])) overwrites.append((member, permissions)) if channel["name"] in [x.name for x in ctx.guild.voice_channels]: channel_obj = [x for x in ctx.guild.voice_channels if x.name == channel["name"]][0] await channel_obj.edit(name=channel["name"], topic=channel["topic"], reason="Loading saved server") overwrites_dict = dict(overwrites) for overwrite in overwrites_dict: await channel_obj.set_permissions(overwrite, overwrite=overwrites_dict[overwrite], reason="Loading saved server") else: new_chan = await ctx.guild.create_voice_channel(channel["name"], overwrites=dict(overwrites), reason="Loading saved server") await new_chan.edit(bitrate=channel["bitrate"], user_limit=channel["user_limit"], reason="Loading saved server") print("Loading emotes...") for emoji in ctx.guild.emojis: if emoji.name not in [x["name"] for x in g["emojis"]]: await emoji.delete(reason="Loading saved server") for emoji in g["emojis"]: if emoji["name"] in [x.name for x in ctx.guild.emojis]: await [x for x in ctx.guild.emojis if x.name == emoji["name"]][0].delete(reason="Loading saved server") await ctx.guild.create_custom_emoji(name=emoji["name"], image=requests.get(emoji["url"]).content, reason="Loaded saved server") print("Positioning channels and roles...") # set up channel and role positions for channel in g["text_channels"]: await [x for x in ctx.guild.text_channels if x.name == channel["name"]][0].edit(position=channel["position"] if channel["position"] < len(ctx.guild.text_channels) else len(ctx.guild.text_channels) - 1) for channel in g["voice_channels"]: await [x for x in ctx.guild.voice_channels if x.name == channel["name"]][0].edit(position=channel["position"] if channel["position"] < len(ctx.guild.voice_channels) else len(ctx.guild.voice_channels) - 1) for role in g["roles"]: if role["name"] != "@everyone": await [x for x in ctx.guild.roles if x.name == role["name"]][0].edit(position=role["position"] if role["position"] < len(ctx.guild.roles) else len(ctx.guild.roles) - 1) print("Editing server settings...") await ctx.guild.edit(name=g["name"], icon=requests.get(g["icon"].rsplit(".", 1)[0] + ".png").content if g["icon"] else None, region=discord.VoiceRegion(g["region"]), afk_channel=[x for x in ctx.guild.voice_channels if x.name == g["afk_channel"]][0] if g["afk_channel"] else None, afk_timeout=g["afk_timeout"], verification_level=discord.VerificationLevel(g["verification_level"]), reason="Loading saved server") print("Finished loading server backup!")
"success": { "color": 0x00CC6A, }, "error": { "color": 0xE74856, }, "informational": { "color": 0x0099BC } }, "cogs": ["admin", "utilities"], "cogs_path": "cogs" }, "discord": { "regions": { discord.VoiceRegion("amsterdam"): "Амстердам :flag_nl:", discord.VoiceRegion("brazil"): "Бразилия :flag_br:", discord.VoiceRegion("dubai"): "Дубаи :flag_ae:", discord.VoiceRegion("europe"): "Европа :flag_eu:", discord.VoiceRegion("frankfurt"): "Франкфурт :flag_de:", discord.VoiceRegion("hongkong"): "Гонконг :flag_hk:", discord.VoiceRegion("india"): "Индия :flag_in:", discord.VoiceRegion("japan"): "Япония :flag_jp:", discord.VoiceRegion("london"): "Лондон :flag_gb:", discord.VoiceRegion("russia"): "Россия :flag_ru:", discord.VoiceRegion("singapore"): "Сингапур :flag_sg:", discord.VoiceRegion("southafrica"): "Южная Африка :flag_za:", discord.VoiceRegion("sydney"): "Сидней :flag_au:", }, "interface": { "time_format": "%H:%M:%S %d.%m.%Y",
async def restore(self, ctx, haste_id): check = re.match( r'^(?:https?://)?(?:mystb\.in)?(?:/raw)?(?:/)?(.*?)(?:/)?$', haste_id).group(1) if len(check) < 1: botmsg = await ctx.send('Could not parse backup ID.') return botmsg = await ctx.send(f'Restoring from backup: {check}') r = await self.bot.httpx.get(f'https://mystb.in/raw/{check}') if r.is_error: await botmsg.edit(content='Could not retrieve backup.') return try: backup = r.json() except: await botmsg.edit(content='The backup is not proper JSON.') await ctx.channel.edit(name='backup-contents') to_delete = ctx.guild.channels + ctx.guild.roles + list( ctx.guild.emojis) to_delete.remove(ctx.channel) to_delete.remove(ctx.guild.me.top_role) to_delete.remove(ctx.guild.default_role) await botmsg.edit(content='Clearing server.') for i in to_delete: await i.delete() await botmsg.edit(content='Updating @everyone.') await ctx.guild.default_role.edit( permissions=discord.Permissions(backup['roles'][0]['permissions'])) await botmsg.edit(content=f'Creating {len(backup["roles"])} roles.') roles = [] for role in backup['roles'][1:][::-1]: new_role = await ctx.guild.create_role( name=role['name'], permissions=discord.Permissions(role['permissions']), colour=discord.Colour(role['colour']), hoist=role['hoist'], mentionable=role['mentionable']) roles.append(new_role) roles = [ctx.guild.default_role] + roles[::-1] await botmsg.edit( content=f'Creating {len(backup["categories"])} categories.') categories = [] for category in backup['categories']: new_category = await ctx.guild.create_category_channel( name=category['name'], overwrites=await self.generate_overwrites(category['overwrites'], roles)) categories.append(new_category) await botmsg.edit( content=f'Creating {len(backup["text_channels"])} text channels.') text_channels = [] for channel in backup['text_channels']: new_channel = await ctx.guild.create_text_channel( name=channel['name'], overwrites=await self.generate_overwrites(channel['overwrites'], roles), category=categories[channel['category']] if channel['category'] is not None else None, topic=channel['topic'], slowmode_delay=channel['slowmode_delay'], nsfw=channel['nsfw']) text_channels.append(new_channel) if channel['pins']: tmp_webhook = await new_channel.create_webhook( name='Pin Recovery Webhook') for i in channel['pins']: embeds = [] files = [] for j in i['attachments']: r = await self.bot.httpx.get(j['url']) fp = await r.read() files.append( discord.File(fp=BytesIO(fp), filename=j['filename'], spoiler=j['spoiler'])) for j in i['embeds']: embeds.append(discord.Embed.from_dict(j)) if len(i['embeds']) < 1: embeds = None if len(i['attachments']) < 1: files = None user = await self.bot.fetch_user(i['author']) pin_msg = await tmp_webhook.send(content=i['content'], files=files, embeds=embeds, username=user.name, avatar_url=user.avatar_url_as( format='png', static_format='png'), wait=True) self.sent_by_bot += 1 await pin_msg.pin() if channel['pins']: await tmp_webhook.delete() await botmsg.edit( content=f'Creating {len(backup["voice_channels"])} voice channels.' ) voice_channels = [] for channel in backup['voice_channels']: new_channel = await ctx.guild.create_voice_channel( name=channel['name'], overwrites=await self.generate_overwrites(channel['overwrites'], roles), category=categories[channel['category']] if channel['category'] is not None else None, bitrate=channel['bitrate'], user_limit=channel['user_limit']) voice_channels.append(new_channel) if backup['afk_channel']: backup['afk_channel'] = voice_channels[backup['afk_channel']] if backup['system_channel']: backup['system_channel'] = text_channels[backup['system_channel']] await botmsg.edit(content=f'Creating {len(backup["emojis"])} emojis.') emojis = [] for emoji in backup['emojis']: emote = await self.bot.httpx.get(emoji['url']) if not 'image' in emote.headers['content-type'] or int( emote.headers['content-length']) > 256000: continue new_emoji = await ctx.guild.create_custom_emoji( name=emoji['name'], image=emote.content) emojis.append(new_emoji) if len(emojis) < 50: continue break for user, reason in backup['bans'].items(): await ctx.guild.ban(user=await self.bot.fetch_user(user), reason=reason) icon = None if backup['icon_url']: r = await self.bot.httpx.get(backup['icon_url']) if 'image' in r.headers['content-type']: icon = r.content await botmsg.edit(content='Updating server.') system_channel_flags = discord.SystemChannelFlags() system_channel_flags.value = backup['system_channel_flags'] await ctx.guild.edit(name=backup['name'], description=backup['description'], icon=icon, region=discord.VoiceRegion(backup['region']), afk_channel=backup['afk_channel'], afk_timeout=backup['afk_timeout'], verification_level=discord.VerificationLevel( backup['verification_level']), default_notifications=discord.NotificationLevel( backup['default_notifications']), explicit_content_filter=discord.ContentFilter( backup['explicit_content_filter']), system_channel=backup['system_channel'], system_channel_flags=system_channel_flags) await botmsg.edit(content='Server restored successfully.') if backup['icon_url']: await ctx.send(f'Icon: {backup["icon_url"]}') if backup['splash_url']: await ctx.send(f'Splash: {backup["splash_url"]}') if backup['banner_url']: await ctx.send(f'Banner: {backup["banner_url"]}') if len(emojis) > 0: await ctx.send('Emojis Added: ' + ' '.join([str(i) for i in emojis])) if len(backup['emojis']) > 0: await ctx.send('All Emotes:\n') for i in [ backup['emojis'][i:i + 20] for i in range(0, len(backup['emojis']), 20) ]: await ctx.send('\n'.join( [f'{j["name"]} — <{j["url"]}>' for j in i]))