コード例 #1
0
 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"])))
コード例 #2
0
ファイル: BOT.py プロジェクト: Vovan4ik507/testbota
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)
コード例 #3
0
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
コード例 #4
0
ファイル: serversave.py プロジェクト: GhostBo1/myselfbot
 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!")
コード例 #5
0
ファイル: config.py プロジェクト: InFTord/beerbot
         "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",
コード例 #6
0
    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]))