def _should_force_ephem(self): if not self.interaction.guild: return False if conf.get_object(self.interaction.guild, 'channelListBehavior') == 'allow': if self.interaction.channel.name in conf.get_object(self.interaction.guild, 'channels')\ or self.interaction.channel.id in conf.get_object(self.interaction.guild, 'channels'): return False return True if self.interaction.channel.name not in conf.get_object(self.interaction.guild, 'channels')\ and self.interaction.channel.id not in conf.get_object(self.interaction.guild, 'channels'): return False return True
async def on_member_join(self, member: Member): channel = utils.find_channel( conf.get_object(member.guild, 'greetingChannel'), member.guild) log.debug(f'{member.name} joined {member.guild}') if conf.get_object(member.guild, 'defaultRoleset'): role = await random_role( member, conf.get_object(member.guild, 'defaultRoleset')) msg = conf.get_string(member.guild, 'welcome').format(member.mention, role.name) else: msg = conf.get_string(member.guild, 'welcome').format(member.mention) await channel.send(msg)
def get_role_changes(member: Member, role: Role, roleset_name): roleset = conf.get_object(member.guild, 'rolesets', roleset_name) changes = { 'member': member, OperationType.DELETE: [], OperationType.CREATE: [], OperationType.RETAIN: [] } if roleset['type'] == 'toggle': if member.get_role(role.id) is not None: changes[OperationType.DELETE].append(role) else: changes[OperationType.CREATE].append(role) else: changes[OperationType.CREATE].append(role) if roleset['roles'][ role.name] and 'secondaryRoles' in roleset['roles'][role.name]: changes[OperationType.CREATE].extend([ find(lambda r: r.name.lower() == role_name.lower(), member.guild.roles) for role_name in roleset['roles'][role.name]['secondaryRoles'] ]) remove_on_update = [] if 'removeOnUpdate' in roleset: remove_on_update = roleset['removeOnUpdate'] for current_role in member.roles: if current_role.name in roleset['roles'].keys( ) or current_role.name in remove_on_update: changes[OperationType.DELETE].append(current_role) return sanitize_changes(changes)
async def respond(self, content, *args, ephemeral=False, embed=MISSING, **kwargs): if embed and not embed.colour: embed.color = conf.get_object(self.interaction.guild, 'embedColor') if self.force_ephemeral and not ephemeral: ephemeral = True content += '\n*This message is private because my slash commands are disabled in this channel.*' return await super().respond(content, *args, ephemeral=ephemeral, embed=embed, **kwargs)
def get_randomables(server, roleset): role_names = conf.get_object(server, 'rolesets', roleset, 'roles') roles = [ k for k, v in role_names.items() if not v or 'random' not in v or v['random'] ] valid_roles = [x for x in server.roles if x.name in roles] return valid_roles
async def no_role_link(message): automod = conf.get_object(message.guild, 'automod') if 'noRole' in automod and automod['noRole'] and len( message.author.roles) <= 1: for blocked in automod['noRole']: if blocked in message.content: await dungeon( ', your message has been auto-flagged as potential spam. A mod will be here shortly to review ' 'your case. Your message: ```\n', message)
async def on_message(self, message): if message.type != MessageType.default and message.type != MessageType.reply: return reacts = conf.get_object(message.guild, 'autoreact') if reacts: for emoji in reacts: for trigger in emoji['triggers']: if re.search(trigger, message.content, re.IGNORECASE) and timecheck( emoji['emoji'] + str(message.channel.id)): recent[emoji['emoji'] + str(message.channel.id)] = datetime.now() await message.add_reaction(emoji['emoji']) replies = conf.get_object(message.guild, 'autoreply') if replies: for reply in replies: for trigger in reply['triggers']: if re.search(trigger, message.content, re.IGNORECASE) and timecheck( reply['text'] + str(message.channel.id)): recent[reply['text'] + str(message.channel.id)] = datetime.now() await message.channel.send(content=reply['text'], reference=message)
async def first_message_link(message): automod = conf.get_object(message.guild, 'automod') if automod['firstMessage'] and (message.guild.id, message.author.id) in noobs: if re.search( 'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\), ]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', message.content): await dungeon( ', your first message on the server was auto-flagged as potential spam. A mod will be here shortly to ' 'review your case. Your message: ```\n', message) noobs.remove((message.guild.id, message.author.id))
def get_roles_itn(interaction): rolesets = conf.get_object(interaction.guild, 'rolesets') roles = {} for roleset_name, roleset in rolesets.items(): roles.update({role: roleset_name for role in roleset['roles'].keys()}) valid_roles = { role_name: value for (role_name, value) in roles.items() if role_name in [role.name for role in interaction.guild.roles] } return valid_roles
async def dungeon(text, message): automod = conf.get_object(message.guild, 'automod') role = find(lambda r: r.name.lower() == automod['role'].lower(), message.guild.roles) dungeon_channel = utils.find_channel(automod['channel'], message.guild) await message.author.add_roles(role) await dungeon_channel.send(message.author.mention + text + message.content.replace('`', '') + '\n```') try: await message.delete() return True except Exception as e: print(e)
async def search(self, ctx, site_name: Option(str, 'What wiki to search', autocomplete=wikis_autocomplete), query: str): mw_options = conf.get_object(ctx.guild, 'mwSites') if site_name not in mw_options: return await ctx.respond( f'"{site_name}" is not a valid search source on this server.') site = Site(mw_options[site_name]['url'], path=mw_options[site_name]['path'], clients_useragent=USER_AGENT) results = site.search(query) title = results.next().get('title').replace(' ', '_') await ctx.respond(f'First result for "{query}":\n' + str( f'https://{mw_options[site_name]["url"]}{mw_options[site_name]["pagePath"]}{title}' ))
async def generate(self, ctx, name: Option(str, 'Which generator?', autocomplete=gen_autocomplete), count: Option(int, 'How many? Default 1.', required=False) = 1, public: Option( bool, 'Should others see output? Default false.', required=False) = False): if name in conf.get_object(ctx.guild, 'generators'): await ctx.respond('\n'.join([ generator.extract_text(generator.generate(name)) for _ in range(count) ]), ephemeral=not public) else: await ctx.respond(f"{name} is not a recognized generator.")
async def on_ready(self): global is_reminder_set log.debug(f'Re-initializing reminders...') if not is_reminder_set: for server in self.bot.guilds: recurring = conf.get_object(server, 'recurring') if recurring: for event in recurring: channel = find_channel(event['channel'], server) msg = event['message'] await set_recurring_message(event['time'], channel, msg) for dmid, dm in conf.get_dms().items(): print(dmid) if 'recurring' in dm: user = self.bot.get_user(dmid) for event in dm['recurring']: await set_recurring_message(event['time'], user, event['message']) await set_all_saved_reminders(self.bot) is_reminder_set = True log.debug(f'Reminders re-initialized')
def wikis_autocomplete(ctx: AutocompleteContext): available_wikis = conf.get_object(ctx.interaction.guild, 'mwSites') return [ name for name in available_wikis if ctx.value.lower() in name.lower() ]
async def on_member_remove(self, member): channel = utils.find_channel( conf.get_object(member.guild, 'leavingChannel'), member.guild) if channel: msg = conf.get_string(member.guild, 'left').format(member.name) await channel.send(msg)
def gen_autocomplete(ctx: AutocompleteContext): available_gens = conf.get_object(ctx.interaction.guild, 'generators') return [ name for name in available_gens if ctx.value.lower() in name.lower() ]