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 restore_user(self, event, member): try: backup = GuildMemberBackup.get(guild_id=event.guild_id, user_id=member.user.id) except GuildMemberBackup.DoesNotExist: return kwargs = {} if event.config.persist.roles: roles = set(event.guild.roles.keys()) if event.config.persist.role_ids: roles &= set(event.config.persist.role_ids) roles = set(backup.roles) & roles if roles: kwargs['roles'] = list(roles) if event.config.persist.nickname and backup.nick is not None: kwargs['nick'] = backup.nick if event.config.persist.voice and (backup.mute or backup.deaf): kwargs['mute'] = backup.mute kwargs['deaf'] = backup.deaf if not kwargs: return self.bot.plugins.get('ModLogPlugin').create_debounce( event, member.user.id, 'restore') member.modify(**kwargs) self.bot.plugins.get('ModLogPlugin').log_action_ext( Actions.MEMBER_RESTORE, event)
def backups_clear(self, event, user_id): deleted = bool(GuildMemberBackup.delete().where( (GuildMemberBackup.user_id == user_id) & (GuildMemberBackup.guild_id == event.guild.id) ).execute()) if deleted: event.msg.reply(':ok_hand: I\'ve cleared the member backup for that user') else: raise CommandFail('I couldn\t find any member backups for that user')
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 on_guild_member_remove(self, event): if event.user.id in event.guild.members: GuildMemberBackup.create_from_member(event.guild.members.get(event.user.id))
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()