def clear_infractions(self): expired = list(Infraction.select().where((Infraction.active == 1) & ( Infraction.expires_at < datetime.utcnow()))) for item in expired: guild = self.state.guilds.get(item.guild_id) if not guild: continue # TODO: hacky type_ = {i.index: i for i in Infraction.Types.attrs}[item.type_] if type_ == Infraction.Types.TEMPBAN: # TODO: debounce guild.delete_ban(item.user_id) elif type_ == Infraction.Types.TEMPMUTE: member = guild.get_member(item.user_id) if member: if item.metadata['role'] in member.roles: member.remove_role(item.metadata['role']) else: GuildMemberBackup.remove_role(item.guild_id, item.user_id, item.metadata['role']) # TODO: n+1 item.active = False item.save() self.queue_infractions()
def clear_infractions(self): expired = list(Infraction.select().where( (Infraction.active == 1) & (Infraction.expires_at < datetime.utcnow()) )) self.log.info('[INF] attempting to clear %s expired infractions', len(expired)) for item in expired: guild = self.state.guilds.get(item.guild_id) if not guild: self.log.warning('[INF] failed to clear infraction %s, no guild exists', item.id) continue # TODO: hacky type_ = {i.index: i for i in Infraction.Types.attrs}[item.type_] if type_ == Infraction.Types.TEMPBAN: # TODO: debounce guild.delete_ban(item.user_id) elif type_ == Infraction.Types.TEMPMUTE or Infraction.Types.TEMPROLE: member = guild.get_member(item.user_id) if member: if item.metadata['role'] in member.roles: member.remove_role(item.metadata['role']) else: GuildMemberBackup.remove_role( item.guild_id, item.user_id, item.metadata['role']) else: self.log.warning('[INF] failed to clear infraction %s, type is invalid %s', item.id, item.type_) continue # TODO: n+1 item.active = False item.save() # Wait a few seconds to backoff from a possible bad loop, and requeue new infractions gevent.sleep(5) self.queue_infractions()
def clear_infractions(self): expired = list(Infraction.select().where( (Infraction.active == 1) & (Infraction.expires_at < datetime.utcnow()) )) self.log.info('[INF] attempting to clear %s expired infractions', len(expired)) for item in expired: guild = self.state.guilds.get(item.guild_id) if not guild: self.log.warning('[INF] failed to clear infraction %s, no guild exists', item.id) continue # TODO: hacky type_ = {i.index: i for i in Infraction.Types.attrs}[item.type_] if type_ == Infraction.Types.TEMPBAN: self.call( 'ModLogPlugin.create_debounce', guild.id, ['GuildBanRemove'], user_id=item.user_id, ) guild.delete_ban(item.user_id) # TODO: perhaps join on users above and use username from db self.call( 'ModLogPlugin.log_action_ext', Actions.MEMBER_TEMPBAN_EXPIRE, guild.id, user_id=item.user_id, user=unicode(self.state.users.get(item.user_id) or item.user_id), inf=item ) elif type_ == Infraction.Types.TEMPMUTE or Infraction.Types.TEMPROLE: member = guild.get_member(item.user_id) if member: if item.metadata['role'] in member.roles: self.call( 'ModLogPlugin.create_debounce', guild.id, ['GuildMemberUpdate'], user_id=item.user_id, role_id=item.metadata['role'], ) member.remove_role(item.metadata['role']) self.call( 'ModLogPlugin.log_action_ext', Actions.MEMBER_TEMPMUTE_EXPIRE, guild.id, member=member, inf=item ) else: GuildMemberBackup.remove_role( item.guild_id, item.user_id, item.metadata['role']) else: self.log.warning('[INF] failed to clear infraction %s, type is invalid %s', item.id, item.type_) continue # TODO: n+1 item.active = False item.save() # Wait a few seconds to backoff from a possible bad loop, and requeue new infractions gevent.sleep(5) self.queue_infractions()