Ejemplo n.º 1
0
async def check_gw2_roles(self, server: discord.Guild):
    gw2Api = Gw2Api(self.bot)
    gw2KeySql = Gw2KeySql(self.bot)

    for member in server.members:
        if not member.bot:
            # check each member has api key
            rs_api_key = await gw2KeySql.get_server_user_api_key(
                server.id, member.id)
            if len(rs_api_key) > 0:
                # user has api key in database
                api_key = rs_api_key[0]["key"]
                try:
                    is_valid_key = await gw2Api.check_api_key(api_key)
                except Exception as e:
                    self.bot.log.error(e)
                    return

                if not isinstance(is_valid_key, dict):
                    # key not valid anymore
                    removeAllGw2RolesFromUser(self, member)
                else:
                    try:
                        endpoint = "account"
                        api_req_acc = await gw2Api.call_api(endpoint,
                                                            key=api_key)
                        member_server_id = api_req_acc["world"]
                    except Exception as e:
                        self.bot.log.error(e)
                        return

                    try:
                        endpoint = f"worlds/{member_server_id}"
                        api_req_server = await gw2Api.call_api(endpoint,
                                                               key=api_key)
                        gw2_server_name = api_req_server["name"]
                    except Exception as e:
                        self.bot.log.error(e)
                        return

                    server_has_role = BotUtils.check_server_has_role(
                        self, server, gw2_server_name)
                    # discord doesnt have role that match gw2 member api key
                    if server_has_role is None:
                        await removeAllGw2RolesFromUser(self, member)
Ejemplo n.º 2
0
async def _add_key(self, ctx, api_key: str):
    #     if (isinstance(ctx.channel, discord.DMChannel)):
    #         msg = "GW2 add api command needs to be used in a server channel for proper roles to be assign!!!"
    #         await BotUtils.send_private_error_msg(self, ctx, msg)
    #         return

    gw2Configs = Gw2ConfigsSql(self.bot)
    rs_gw2_sc = await gw2Configs.get_gw2_server_configs(ctx.guild.id)
    if len(rs_gw2_sc) == 0 or (len(rs_gw2_sc) > 0
                               and rs_gw2_sc[0]["last_session"] == "N"):
        return await BotUtils.send_error_msg(
            self, ctx, "Unable to add api key.\n"
            "Last session is not active on this server.\n"
            f"To activate use: `{ctx.prefix}gw2 config lastsession on`")
    discord_user_id = ctx.message.author.id
    discord_server_id = ctx.message.guild.id

    # searching if API key already exists in bot database
    gw2KeySql = Gw2KeySql(self.bot)
    rs = await gw2KeySql.get_api_key(discord_server_id, api_key)
    if len(rs) == 0:
        gw2Api = Gw2Api(self.bot)
        is_valid_key = await gw2Api.check_api_key(api_key)
        if not isinstance(is_valid_key, dict):
            return await BotUtils.send_private_error_msg(
                self, ctx, f"{is_valid_key.args[1]}\n`{api_key}`")

        key_name = is_valid_key["name"]
        permissions = ','.join(is_valid_key["permissions"])

        try:
            # getting gw2 acc name
            api_req_acc_info = await gw2Api.call_api("account", key=api_key)
            gw2_acc_name = api_req_acc_info["name"]
            member_server_id = api_req_acc_info["world"]
        except Exception as e:
            await BotUtils.send_private_error_msg(self, ctx, e)
            return self.bot.log.error(ctx, e)

        try:
            # getting gw2 server name
            endpoint = f"worlds/{member_server_id}"
            api_req_server = await gw2Api.call_api(endpoint, key=api_key)
            gw2_server_name = api_req_server["name"]
        except Exception as e:
            await BotUtils.send_private_error_msg(self, ctx, e)
            self.bot.log.error(ctx, e)
            return

        # searching if user has 1 api key already
        rs = await gw2KeySql.get_server_user_api_key(discord_server_id,
                                                     discord_user_id)
        if len(rs) > 0:
            # update key
            updateObject = BotUtils.Object()
            updateObject.discord_user_id = discord_user_id
            updateObject.discord_server_id = discord_server_id
            updateObject.key_name = key_name
            updateObject.gw2_acc_name = gw2_acc_name
            updateObject.permissions = permissions
            updateObject.key = api_key
            updateObject.server_name = gw2_server_name
            await gw2KeySql.update_api_key(updateObject)
            msg = "Your API key was **replaced**.\n" \
                  f"Server: `{gw2_server_name}`\n" \
                  f"To get info about your new api key use: `{ctx.prefix}gw2 key info`"
            color = self.bot.gw2_settings["EmbedColor"]
            await BotUtils.send_private_msg(self, ctx, color, msg)
        else:
            # insert key
            insertObject = BotUtils.Object()
            insertObject.discord_user_id = discord_user_id
            insertObject.discord_server_id = discord_server_id
            insertObject.key_name = key_name
            insertObject.gw2_acc_name = gw2_acc_name
            insertObject.permissions = permissions
            insertObject.key = api_key
            insertObject.server_name = gw2_server_name
            await gw2KeySql.insert_api_key(insertObject)
            msg = "Your key was verified and was **added** to your discord account.\n" \
                  f"Server: `{gw2_server_name}`\n" \
                  f"To get info about your api key use: `{ctx.prefix}gw2 key info`"
            color = self.bot.gw2_settings["EmbedColor"]
            await BotUtils.send_private_msg(self, ctx, color, msg)

        # checking if the bot needs to assign gw2 server roles to user
        gw2Roles = Gw2RolesSql(self.bot)
        rs = await gw2Roles.get_gw2_server_role(ctx.message.channel.guild.id,
                                                gw2_server_name.lower())
        if len(rs) > 0:
            new_role = BotUtils.check_server_has_role(self, ctx.guild,
                                                      gw2_server_name.lower())
            if new_role is not None:
                await Gw2Utils.assignGw2GuildRoles(self, ctx,
                                                   ctx.message.author,
                                                   new_role, api_key)
        else:
            await Gw2Utils.removeAllGw2RolesFromUser(self, ctx.message.author)

    elif len(rs) == 1 and rs[0]["discord_user_id"] == discord_user_id:
        msg = "That API key is already registered by you or someone else.\n" \
              f"To get info about your api key use: `{ctx.prefix}gw2 key info`"
        await BotUtils.send_private_error_msg(self, ctx, msg)
    else:
        await BotUtils.send_private_error_msg(
            self, ctx, "That API key is already in use by someone else.")
Ejemplo n.º 3
0
async def _apirole(self, ctx, stats_sever: str):
    """(Configure if the bot should add role that matches gw2 servers)

    Categories with "Public" names in it wont be affect it.

    Example:
    Public Chat
    Public Raids
    Public Informations

    Example:
    gw2 config apirole on Blackgate
    gw2 config apirole off Blackgate
    """

    await ctx.message.channel.trigger_typing()
    new_status = stats_sever.split()[0]
    new_server_list = stats_sever.split()[1:]
    new_server = ' '.join(new_server_list)

    if new_status.lower() == "on":
        new_status = "Y"
    elif new_status.lower() == "off":
        new_status = "N"
    else:
        raise commands.BadArgument(message="BadArgument_Gw2ConfigStatus")

    # check gw2 server name passed by user
    correct_gw2_server_name = Gw2Utils.check_gw2_server_name_role(new_server)
    if correct_gw2_server_name is False:
        raise commands.BadArgument(message="BadArgument_Gw2ConfigServer")

    # check if server already has gw2 server role name
    server_has_role_already = BotUtils.check_server_has_role(
        self, ctx.guild, new_server)

    if new_status == "Y":
        if server_has_role_already is None:
            new_role = await ctx.guild.create_role(
                name=new_server,
                permissions=discord.Permissions(permissions=116771904))
        else:
            new_role = server_has_role_already

        new_role_overwrites = discord.PermissionOverwrite()
        everyone_role_overwrites = discord.PermissionOverwrite()
        everyone_role = BotUtils.get_server_everyone_role(ctx.guild)

        # hide all text and voice channels from public
        # but the first one and categories with public names in it
        everyone_role_overwrites.read_messages = False
        # text
        new_role_overwrites.add_reactions = True
        new_role_overwrites.attach_files = True
        new_role_overwrites.change_nickname = True
        new_role_overwrites.embed_links = True
        new_role_overwrites.external_emojis = True
        new_role_overwrites.read_message_history = True
        new_role_overwrites.read_messages = True
        new_role_overwrites.send_messages = True
        # voice
        new_role_overwrites.connect = True
        new_role_overwrites.deafen_members = True
        new_role_overwrites.mute_members = True
        new_role_overwrites.speak = True
        new_role_overwrites.use_voice_activation = True

        # assign new role to channels
        role_found = False
        for chan in ctx.guild.channels:
            if isinstance(chan, discord.CategoryChannel):
                if "public" not in chan.name.lower():
                    for rol in chan.overwrites:
                        if rol[0].name.lower() == new_role.name.lower():
                            role_found = True
                            break
                    if role_found is False:
                        await chan.set_permissions(
                            everyone_role, overwrite=everyone_role_overwrites)
                        await chan.set_permissions(
                            new_role, overwrite=new_role_overwrites)
                    role_found = False

        gw2Roles = Gw2RolesSql(self.bot)
        rs = await gw2Roles.get_gw2_server_role(ctx.message.channel.guild.id,
                                                new_role.name.lower())
        if len(rs) == 0:
            await gw2Roles.insert_gw2_server_role(ctx.message.channel.guild.id,
                                                  new_role.name.lower())

        color = discord.Color.green()
        msg = f"Guild Wars 2 API server roles `ACTIVATED`\n" \
              f"Role: `{new_role.name}`\n" \
              f"Members that have Gw2 API key on `{new_role.name}` will now have access to all channels."
        gw2KeySql = Gw2KeySql(self.bot)
        for member in ctx.message.channel.guild.members:
            if not member.bot:
                rs_api_key = await gw2KeySql.get_server_user_api_key(
                    ctx.message.channel.guild.id, member.id)
                if len(rs_api_key) > 0:
                    api_key = rs_api_key[0]["key"]
                    await Gw2Utils.assignGw2GuildRoles(self, ctx, member,
                                                       new_role, api_key)
    elif new_status == "N":
        color = discord.Color.red()
        if server_has_role_already is None:
            msg = f"Role `{new_server}` not found.\n" \
                  "Please activate that role before trying to deactivate it.\n" \
                  f"{ctx.prefix}gw2 config apirole on {new_server}"
        else:
            new_role = server_has_role_already
            msg = "Guild Wars 2 API server roles `DEACTIVATED`\n" \
                  "Role `REMOVED` from server.\n" \
                  f"Role: `{new_role.name}`"
            gw2Roles = Gw2RolesSql(self.bot)
            await gw2Roles.delete_gw2_server_roles(
                ctx.message.channel.guild.id, new_role.name.lower())
            for member in ctx.message.channel.guild.members:
                await Gw2Utils.removeGw2RoleFromServer(self, ctx.guild,
                                                       new_role)

    embed = discord.Embed(description=msg, color=color)
    await BotUtils.send_embed(self, ctx, embed, False, msg)