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)
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)
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)
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()
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)
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!')