示例#1
0
def update_discord_server(plugin, discord_server, attr=None):
    if attr is None:
        attr = {}

    discord_server = plugin.db.DiscordServer[discord_server.id]

    if discord_server.state == 3:
        discord_server.state = 2

    before_data = discord_server.to_dict()

    discord_server.set(**attr)

    after_data = discord_server.to_dict()

    update_approval_queue(plugin)

    changelog_post_update(plugin, before_data, after_data)

    before_channel = get_channel_for_name_and_category(
        plugin, before_data['category_channel_name'],
        before_data['genre_category_name'])
    after_channel = get_channel_for_name_and_category(
        plugin, after_data['category_channel_name'],
        after_data['genre_category_name'])

    if before_channel:
        update_discord_index(plugin, only_in_channel_id=before_channel.id)
    if after_channel and after_channel.id != before_channel.id:
        update_discord_index(plugin, only_in_channel_id=after_channel.id)
示例#2
0
def add_discord_server(plugin,
                       invite_code,
                       server_id,
                       server_name,
                       server_description,
                       invitee_id,
                       category_channel_name,
                       genre_category_name,
                       author_id,
                       sudo=False):
    state = 1
    if sudo:
        state = 2

    entry = plugin.db.DiscordServer(
        state=state,
        invite_code=invite_code,
        server_id=server_id,
        name=server_name,
        description=server_description,
        invitee_id=invitee_id,
        submitted_at=datetime.datetime.now(),
        category_channel_name=category_channel_name,
        genre_category_name=genre_category_name,
        # index_message_id=789,
        last_checked=datetime.datetime.now())

    if sudo:
        changelog_post_approval(plugin, entry, author_id)
        index_channel = get_channel_for_name_and_category(
            plugin, entry.category_channel_name, entry.genre_category_name)
        if index_channel:
            update_discord_index(plugin, only_in_channel_id=index_channel.id)
    else:
        update_approval_queue(plugin)
示例#3
0
def approve_queue_entry(plugin, entry, user_id):
    plugin.db.DiscordServer[entry.id].state = 2

    update_approval_queue(plugin)

    send_approval_message(plugin, entry)
    changelog_post_approval(plugin, entry, user_id)

    index_channel = get_channel_for_name_and_category(
        plugin, entry.category_channel_name, entry.genre_category_name)
    if index_channel:
        update_discord_index(plugin, only_in_channel_id=index_channel.id)
示例#4
0
def remove_discord_server(plugin, discord_server, author_user_id, reason=""):
    entry_data = discord_server.to_dict()

    discord_server.delete()

    update_approval_queue(plugin)

    changelog_post_removal(plugin, entry_data, author_user_id, reason)

    index_channel = get_channel_for_name_and_category(
        plugin, entry_data['category_channel_name'],
        entry_data['genre_category_name'])
    if index_channel:
        update_discord_index(plugin, only_in_channel_id=index_channel.id)
def start_servers_healthcheck(plugin):
    cutoff = datetime.datetime.now() - datetime.timedelta(hours=INVITE_CHECK_INTERVAL)

    for discord_server in orm.select(ds for ds in plugin.db.DiscordServer if ds.state == 2):
        if cutoff <= discord_server.last_checked:
            continue

        is_expired = False

        try:
            invite = plugin.client.api.invites_get(discord_server.invite_code)
        except APIException:
            is_expired = True

        if invite and not is_valid_invite(plugin, invite, discord_server.invitee_id,
                                          discord_server_entry=discord_server):
            is_expired = True

        discord_server.last_checked = datetime.datetime.now()
        if is_expired:
            discord_server.state = 3
            send_expiration_message(plugin, discord_server)
            changelog_post_expiration(plugin, discord_server)
            plugin.log.info(
                'invite expired '
                'server: #{entry[server_id]} discord.gg/{entry[invite_code]} '
                'name: {entry[name]} description: {entry[description]} '
                'category: {entry[category_channel_name]} genre: {entry[genre_category_name]} '
                'invitee: #{entry[invitee_id]} '
                'submitted at: {entry[submitted_at]} last checked: {entry[submitted_at]}'.format(
                    entry=discord_server.to_dict()))

            update_discord_index(plugin, only_in_channel_id=get_channel_for_name_and_category(plugin,
                                                                                              discord_server.category_channel_name,
                                                                                              discord_server.genre_category_name).id)

            orm.commit()
示例#6
0
    def command_update(self,
                       event,
                       invite,
                       category_channel=None,
                       name_and_description=""):
        if event.msg.channel.guild_id != self.config.indexGuildID:
            return

        if event.msg.channel.id not in self.config.addChannelIDs:
            return

        sudo = False
        if event.name == 'sudo-update':
            if not is_mod(self, event.msg.author.id):
                return
            sudo = True

        self.client.api.channels_typing(event.msg.channel.id)

        name = name_and_description.strip()
        description = ""
        if "|" in name:
            parts = name.split('|', 2)
            name = parts[0].strip()
            description = parts[1].strip()

        if len(name) > 32:
            event.msg.reply('name too long')
            return

        if len(description) > 100:
            event.msg.reply('description too long')
            return

        invite_code = extract_invite_code(invite)
        if len(invite_code) <= 0:
            event.msg.reply('no invite code found')
            return

        try:
            invite = self.client.api.invites_get(invite_code)
        except APIException:
            event.msg.reply('expired invite code')
            return

        if not is_valid_invite(
                self.client, invite, event.msg.author.id, sudo=sudo):
            event.msg.reply(
                'you can only submit invites you generated yourself')
            return

        discord_server_found = self.db.DiscordServer.get(
            server_id=invite.guild.id)
        if not discord_server_found:
            event.msg.reply('server not found in queue or index')
            return

        if category_channel is not None and not isinstance(
                category_channel, DiscoChannel):
            category_channel = self.state.channels.get(category_channel)

        if category_channel is not None and category_channel.guild_id != event.msg.channel.guild_id:
            event.msg.reply('invalid category channel')
            return

        genre_category_name = ""
        if category_channel is not None and category_channel.parent is not None:
            genre_category_name = category_channel.parent.name

        if not get_channel_for_name_and_category(self, category_channel.name,
                                                 genre_category_name):
            event.msg.reply('invalid category channel')
            return

        if discord_server_found.invitee_id != event.msg.author.id and sudo == False:
            event.msg.reply(
                'you can only edit entries your submitted yourself')
            return

        attr = {'invite_code': invite.code}
        response_text = 'Updated!'
        if len(name) > 0:
            attr['name'] = name
            attr['description'] = description
        if category_channel is not None and len(category_channel.name) > 0:
            if category_channel.name != discord_server_found.category_channel_name or genre_category_name != discord_server_found.genre_category_name:
                attr['category_channel_name'] = category_channel.name
                attr['genre_category_name'] = genre_category_name
                if not sudo:
                    attr['state'] = 4
                    response_text = 'Category changes have to be approved, we will inform you when it\'s done!'

        before_data = discord_server_found.to_dict()
        update_discord_server(self, discord_server_found, attr)
        self.log.info(
            '{author.username} #{author.id} updated '
            'server: #{entry[server_id]} discord.gg/{entry[invite_code]} '
            'name: {entry[name]} description: {entry[description]} '
            'category: {entry[category_channel_name]} genre: {entry[genre_category_name]} '
            'invitee: #{entry[invitee_id]} '
            'submitted at: {entry[submitted_at]} last checked: {entry[submitted_at]} '
            'index message id: {entry[index_message_id]} '
            'sudo: {sudo} '
            'new data: {attr}'.format(author=event.msg.author,
                                      entry=before_data,
                                      sudo=sudo,
                                      attr=attr))

        event.msg.reply(response_text)
示例#7
0
    def command_add(self, event, invite, category_channel,
                    name_and_description):
        if event.msg.channel.guild_id != self.config.indexGuildID:
            return

        if event.msg.channel.id not in self.config.addChannelIDs:
            return

        sudo = False
        if event.name == 'sudo-add':
            if not is_mod(self, event.msg.author.id):
                return
            sudo = True

        self.client.api.channels_typing(event.msg.channel.id)

        name = name_and_description.strip()
        description = ""
        if "|" in name:
            parts = name.split('|', 2)
            name = parts[0].strip()
            description = parts[1].strip()

        if len(name) > 32:
            event.msg.reply('name too long')
            return

        if len(description) > 100:
            event.msg.reply('description too long')
            return

        invite_code = extract_invite_code(invite)
        if len(invite_code) <= 0:
            event.msg.reply('no invite code found')
            return

        try:
            invite = self.client.api.invites_get(invite_code)
        except APIException:
            event.msg.reply('expired invite code')
            return

        if self.db.DiscordServer.get(server_id=invite.guild.id):
            event.msg.reply('server already in the index or queue')
            return

        if not is_valid_invite(
                self.client, invite, event.msg.author.id, sudo=sudo):
            event.msg.reply(
                'you can only submit invites you generated yourself')
            return

        if not isinstance(category_channel, DiscoChannel):
            category_channel = self.state.channels.get(category_channel)

        if category_channel is None or category_channel.guild_id != event.msg.channel.guild_id:
            event.msg.reply('invalid category channel')
            return

        genre_category_name = ""
        if category_channel.parent is not None:
            genre_category_name = category_channel.parent.name

        if not get_channel_for_name_and_category(self, category_channel.name,
                                                 genre_category_name):
            event.msg.reply('invalid category channel')
            return

        add_discord_server(self,
                           invite_code,
                           invite.guild.id,
                           name,
                           description,
                           invite.inviter.id,
                           category_channel.name,
                           genre_category_name,
                           event.msg.author.id,
                           sudo=sudo)

        if sudo:
            self.log.info(
                '{author.username} #{author.id} added '
                'server: {invite.guild.name} #{invite.guild.id} discord.gg/{invite_code} '
                'name: {name} description: {description} '
                'category: {category_channel_name} genre: {genre_category_name} '
                'invitee: {invite.inviter.username} #{invite.inviter.id} '
                'sudo: {sudo}'.format(
                    author=event.msg.author,
                    invite=invite,
                    invite_code=invite_code,
                    category_channel_name=category_channel.name,
                    genre_category_name=genre_category_name,
                    name=name,
                    description=description,
                    sudo=sudo))

            event.msg.reply('Added server!')
        else:
            self.log.info(
                '{author.username} #{author.id} added '
                'server to queue: {invite.guild.name} #{invite.guild.id} discord.gg/{invite_code} '
                'name: {name} description: {description} '
                'category: {category_channel_name} genre: {genre_category_name} '
                'invitee: {invite.inviter.username} #{invite.inviter.id} '
                'sudo: {sudo}'.format(
                    author=event.msg.author,
                    invite=invite,
                    invite_code=invite_code,
                    category_channel_name=category_channel.name,
                    genre_category_name=genre_category_name,
                    name=name,
                    description=description,
                    sudo=sudo))

            event.msg.reply('Added to queue!')