Пример #1
0
 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
Пример #2
0
 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)
Пример #3
0
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)
Пример #4
0
 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)
Пример #5
0
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
Пример #6
0
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)
Пример #7
0
 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)
Пример #8
0
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))
Пример #9
0
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
Пример #10
0
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)
Пример #11
0
 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}'
     ))
Пример #12
0
 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.")
Пример #13
0
 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')
Пример #14
0
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()
    ]
Пример #15
0
 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)
Пример #16
0
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()
    ]