Python discord.ext.commands.group() Examples

The following are 30 code examples of discord.ext.commands.group(). You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may also want to check out all available functions/classes of the module discord.ext.commands , or try the search function .
Example #1
Source File: deck.py    From SML-Cogs with MIT License 6 votes vote down vote up
def decklink_to_cards(self, url):
        """Convert decklink to cards."""
        card_keys = None
        # search for Clash Royale decks
        m_crlink = re.search('(http|ftp|https)://link.clashroyale.com/deck/..\?deck=[\d\;]+', url)

        # search for royaleapi deck stats link
        m_rapilink = re.match('(https|http)://royaleapi.com/decks/stats/([a-z,-]+)/?', url)
        m_rapilink_section = re.match('(https|http)://royaleapi.com/decks/stats/([a-z,-]+)/.+', url)

        if m_crlink:
            url = m_crlink.group()
            decklinks = re.findall('2\d{7}', url)
            card_keys = []
            for decklink in decklinks:
                card_key = await self.card_decklink_to_key(decklink)
                if card_key is not None:
                    card_keys.append(card_key)
        elif m_rapilink and not m_rapilink_section:
            s = m_rapilink.group(2)
            card_keys = s.split(',')

        return card_keys 
Example #2
Source File: database.py    From GW2Bot with MIT License 6 votes vote down vote up
def cache_pois(self):
        async def bulk_write(group):
            requests = []
            for item in group:
                item["_id"] = item.pop("id")
                requests.append(
                    ReplaceOne({"_id": item["_id"]}, item, upsert=True))
            try:
                await self.db.pois.bulk_write(requests)
            except BulkWriteError as e:
                self.log.exception("BWE while caching continents")

        continents = await self.call_api("continents/1/floors?ids=all")
        pois = []
        for continent in continents:
            for region in continent["regions"].values():
                for game_map in region["maps"].values():
                    for poi in game_map["points_of_interest"].values():
                        del poi["chat_link"]
                        poi["continent_id"] = continent["id"]
                        pois.append(poi)
                        if len(pois) > 200:
                            await bulk_write(pois)
                            pois = []
        print("Continents done") 
Example #3
Source File: logstash.py    From SML-Cogs with MIT License 6 votes vote down vote up
def get_channel_params(self, channel: Channel):
        """Return extra fields for channel."""
        extra = {
            'id': channel.id,
            'name': channel.name,
            'server': self.get_server_params(channel.server),
            'position': channel.position,
            'is_default': channel.is_default,
            'created_at': channel.created_at.isoformat(),
            'type': {
                'text': channel.type == ChannelType.text,
                'voice': channel.type == ChannelType.voice,
                'private': channel.type == ChannelType.private,
                'group': channel.type == ChannelType.group
            }
        }
        return extra 
Example #4
Source File: draftroyale.py    From SML-Cogs with MIT License 6 votes vote down vote up
def draftutil_cards(self, ctx):
        """List available cards by emojis."""
        emojis = [v["emoji"] for k, v in self.crdata["Cards"].items()]

        groups = grouper(emojis, 25)
        for group in groups:
            out = []
            for emoji in group:
                if emoji is not None:
                    out.append('<:{}:{}>'.format(emoji, self.emojis[emoji]))
            await self.bot.say(' '.join(out))
        # out = []
        # for emoji in emojis:
        #     if emoji is not None:
        #         out.append('<:{}:{}>'.format(emoji, self.emojis[emoji]))
        # em = discord.Embed()
        # em.add_field(name="", value="".join(out))
        # await self.bot.say(embed=em) 
Example #5
Source File: homebrew.py    From avrae with GNU General Public License v3.0 6 votes vote down vote up
def tome_sub(self, ctx, url):
        """Subscribes to another user's tome."""
        tome_id_match = re.search(r"homebrew/spells/([0-9a-f]{24})/?", url)
        if not tome_id_match:
            return await ctx.send("Invalid tome URL.")
        try:
            tome = await Tome.from_id(ctx, tome_id_match.group(1))
        except NoActiveBrew:
            return await ctx.send("Pack not found.")

        if not tome.public:
            return await ctx.send("This tome is not public.")

        await tome.subscribe(ctx)
        await ctx.send(f"Subscribed to {tome.name}. "  # by {tome.owner['username']}. "  # todo
                       f"Use `{ctx.prefix}tome {tome.name}` to select it.") 
Example #6
Source File: loot.py    From NabBot with Apache License 2.0 6 votes vote down vote up
def loot_show(self, ctx, *, item: str):
        """Shows item info from loot database."""
        result, item_list = await self.item_show(item)

        if not item_list:
            return await ctx.error("There's no item with that name.")
        item = item_list[0]
        embed = discord.Embed(title=item["name"], description=f"Group: {item['group']}",
                              colour=discord.Colour.from_rgb(item["red"], item["green"], item["blue"]))
        content = ""
        for item in item_list:
            content += "ID: {id} | Size: {sizeX}x{sizeY} | {size}px | rgb: {red},{green},{blue} | " \
                       "sell: {value_sell:,} | buy: {value_buy:,}\n".format(**item)
        fields = split_message(content, FIELD_VALUE_LIMIT)
        name = "Frame info"
        for i, field in enumerate(fields[:5]):
            if i:
                name = "\u200F"
            embed.add_field(name=name, value=field, inline=False)
        if len(fields) > 5:
            embed.set_footer(text="Too many frames to display all information.")
        embed.set_image(url="attachment://results.png")
        await ctx.send(embed=embed, file=discord.File(io.BytesIO(result), "results.png")) 
Example #7
Source File: buyrole.py    From refactored-cogs with Mozilla Public License 2.0 6 votes vote down vote up
def uniquegroup(self, ctx, role: discord.Role, groupid: int):
        """Set a role to a unique group ID,
        This means that a user cannot have more then one role from the same group.

        Any role sharing the same ID will be considered a group.
        GroupID 0 will not be considered unique and can share other roles."""
        server = ctx.message.server
        if role.id not in self.settings_dict[server.id]['roles']:
            await self.bot.say('This role ins\'t in the buyrole list')
        elif groupid < 0:
            await self.bot.say('The group ID cannot be negative.')
        else:
            # Set the uniquegroup ID here, logic will remain in a subfunction of buyrole
            self.settings_dict[server.id]['roles'][role.id]['uniquegroup'] = groupid
            self.save_json()
            if groupid == 0:
                await self.bot.say('Unique Group ID set. {} isn\'t considered unique.'.format(role.name))
            else:
                await self.bot.say('Unique Group ID set. {} will now be unique in group ID {}'.format(role.name, groupid)) 
Example #8
Source File: roles.py    From NabBot with Apache License 2.0 6 votes vote down vote up
def autorole_remove(self, ctx: NabCtx, role: InsensitiveRole, *, guild: str):
        """Removes an autorole rule.

        Role names, mentions and ids are accepted. Role names with multiple words need to be quoted.

        Note that members that currently have the role won't be affected."""
        group: discord.Role = role
        guild = guild.replace("\"", "")
        exists = await ctx.pool.fetchval("SELECT true FROM role_auto WHERE role_id = $1 AND lower(rule) = $2",
                                         group.id, guild.lower())
        if not exists:
            await ctx.error("That rule doesn't exist.")
            return

        # Can't modify role higher than the owner's top role
        top_role: discord.Role = ctx.author.top_role
        if group >= top_role:
            await ctx.error("You can't delete a role rule for a role higher than yours.")
            return

        await ctx.success(f"Auto role rule removed. Note that the role won't be removed from current members.")
        await ctx.pool.execute("DELETE FROM role_auto WHERE role_id = $1 AND lower(rule) = $2", group.id, guild.lower()) 
Example #9
Source File: clashroyale.py    From RemixBot with MIT License 5 votes vote down vote up
def crmembers(self, ctx):
        '''A command group that finds the worst and best members in a clan'''
        await ctx.send(f'Proper usage: `{ctx.prefix}members <best | worst> <clan_tag>`') 
Example #10
Source File: utility.py    From RemixBot with MIT License 5 votes vote down vote up
def math(self, ctx):
        '''A command group for math commands'''
        await ctx.send('Available commands:\n`add <a> <b>`\n`subtract <a> <b>`\n`multiply <a> <b>`\n`divide <a> <b>`\n`remainder <a> <b>`\n`power <a> <b>`\n`factorial <a>`') 
Example #11
Source File: log.py    From Discord-SelfBot with MIT License 5 votes vote down vote up
def log(self, ctx):
        """Command group for managing logging."""
        if ctx.invoked_subcommand is None:
            await edit(ctx, content='\N{HEAVY EXCLAMATION MARK SYMBOL} ``on``, ``off``, ``status``, ``show``, ``key <word>``, ``guild``, ``channel``, ``blacklist channel``, ``blacklist <word>`` or ``blacklist user <user>``', ttl=5)

    # Log On 
Example #12
Source File: adventure.py    From Dumb-Cogs with MIT License 5 votes vote down vote up
def add_synonym(self, other):
        """Every word in a group of synonyms shares the same list."""
        self.synonyms.extend(other.synonyms)
        other.synonyms = self.synonyms 
Example #13
Source File: roles.py    From NabBot with Apache License 2.0 5 votes vote down vote up
def group(self, ctx: NabCtx, *, _group: InsensitiveRole):
        """Joins or leaves a group (role).

        If you're not in the group, you will be added.
        If you're already in the group, you will be removed.

        To see a list of joinable groups, use `group list`"""
        group: discord.Role = _group
        exists = await ctx.pool.fetchval("SELECT true FROM role_joinable WHERE role_id = $1", group.id)
        if not exists:
            await ctx.error(f"Group `{group.name}` doesn't exists.")
            return

        # Check if user already has the role
        member_role = discord.utils.get(ctx.author.roles, id=group.id)

        try:
            if member_role is None:
                await ctx.author.add_roles(group, reason="Joined group")
            else:
                await ctx.author.remove_roles(member_role, reason="Left group")
        except discord.Forbidden:
            await ctx.error("I need `Manage Roles` to manage groups.")
        except discord.HTTPException:
            await ctx.error("Something went wrong. Try again later.")
        else:
            if member_role is None:
                await ctx.success(f"Joined `{group.name}`.")
            else:
                await ctx.success(f"You left `{group.name}`.") 
Example #14
Source File: roles.py    From NabBot with Apache License 2.0 5 votes vote down vote up
def group_add(self, ctx: NabCtx, *, name: str):
        """Creates a new group for members to join.

        The group can be a new role that will be created with this command.
        If the name matches an existent role, that role will become joinable.

        You need `Manage Roles` permissions to use this command."""
        name = name.replace("\"", "")
        forbidden = ["add", "remove", "delete", "list"]
        converter = InsensitiveRole()
        try:
            role = await converter.convert(ctx, name)
        except commands.BadArgument:
            try:
                if name.lower() in forbidden:
                    raise discord.InvalidArgument()
                role = await ctx.guild.create_role(name=name, reason="Created joinable role")
            except discord.Forbidden:
                await ctx.error("I need `Manage Roles` permission to create a group.")
                return
            except discord.InvalidArgument:
                await ctx.error("Invalid group name.")
                return

        exists = await ctx.pool.fetchval("SELECT true FROM role_joinable WHERE role_id = $1", role.id)
        if exists:
            await ctx.error(f"Group `{role.name}` already exists.")
            return

        # Can't make joinable group a role higher than the owner's top role
        top_role: discord.Role = ctx.author.top_role
        if role >= top_role:
            await ctx.error("You can't make a group from a role higher or equals than your highest role.")
            return

        await ctx.pool.execute("INSERT INTO role_joinable(server_id, role_id) VALUES($1, $2)", ctx.guild.id, role.id)
        await ctx.success(f"Group `{role.name}` created successfully.") 
Example #15
Source File: roles.py    From NabBot with Apache License 2.0 5 votes vote down vote up
def group_remove(self, ctx: NabCtx, *, _group: InsensitiveRole):
        """Removes a group.

        Removes a group, making members unable to join.
        When removing a group, you can optionally delete the role too."""
        group: discord.Role = _group
        exists = await ctx.pool.fetchval("SELECT true FROM role_joinable WHERE role_id = $1", group.id)
        if not exists:
            await ctx.error(f"`{group.name}` is not a group.")
            return

        # Can't modify role higher than the owner's top role
        top_role: discord.Role = ctx.author.top_role
        if group >= top_role:
            await ctx.error("You can't delete a group of a role higher than your highest role.")
            return

        msg = await ctx.send(f"Group `{group.name}` will be removed."
                             f"Do you want to remove the role too?")
        confirm = await ctx.react_confirm(msg, timeout=60, delete_after=True)
        if confirm is True:
            try:
                await group.delete(reason=f"Group removed by {ctx.author}")
                await ctx.success(f"Group `{group.name}`  was removed and the role was deleted.")
            except discord.Forbidden:
                await ctx.error(f"I need `Manage Roles` permission to delete the role.\n"
                                f"{ctx.tick()} Group `{group.name}` removed.")
        else:
            await ctx.success(f"Group `{group.name}` was removed.")
        await ctx.pool.execute("DELETE FROM role_joinable WHERE role_id = $1", group.id) 
Example #16
Source File: sync.py    From GW2Bot with MIT License 5 votes vote down vote up
def guildsync(self, ctx):
        """In game guild rank to discord roles synchronization commands
        This group allows you to set up a link between your ingame roster and discord.
        When enabled, new roles will be created for each of your ingame ranks,
        and ingame members are periodically synced to have the
        correct role in discord."""
        if ctx.invoked_subcommand is None:
            await ctx.send_help(ctx.command) 
Example #17
Source File: general.py    From GW2Bot with MIT License 5 votes vote down vote up
def guild_default(self, ctx, *, guild_name=None):
        """ Set your preferred guild for guild commands on this Discord Server.
        Commands from the guild command group invoked
        without a guild name will default to this guild.

        Invoke this command without an argument to reset the default guild.
        """
        guild = ctx.guild
        if guild_name is None:
            await self.bot.database.set_guild(guild, {
                "guild_ingame": None,
            }, self)
            return await ctx.send(
                "Your preferred guild is now reset for "
                "this server. Invoke this command with a guild "
                "name to set a default guild.")
        endpoint_id = "guild/search?name=" + guild_name.replace(' ', '%20')
        # Guild ID to Guild Name
        try:
            guild_id = await self.call_api(endpoint_id)
            guild_id = guild_id[0]
        except (IndexError, APINotFound):
            return await ctx.send("Invalid guild name")
        except APIForbidden:
            return await ctx.send(
                "You don't have enough permissions in game to "
                "use this command")
        except APIError as e:
            return await self.error_handler(ctx, e)

        # Write to DB, overwrites existing guild
        await self.bot.database.set_guild(guild, {
            "guild_ingame": guild_id,
        }, self)
        await ctx.send("Your default guild is now set to {} for this server. "
                       "All commands from the `guild` command group "
                       "invoked without a specified guild will default to "
                       "this guild. To reset, simply invoke this command "
                       "without specifying a guild".format(guild_name.title())) 
Example #18
Source File: discordgram_ccs.py    From SML-Cogs with MIT License 5 votes vote down vote up
def discordgramccsreply(self, ctx, id, *, msg):
        """Reply to a Discordgram by ID."""
        author = ctx.message.author
        server = ctx.message.server

        if server.id not in self.settings:
            return
        if not id.isdigit():
            await self.bot.say("id must be a number.")
            return

        id = int(id)
        messages = self.settings[server.id]["MESSAGES"]
        if id >= len(messages):
            await self.bot.say("That is not a valid Discordgram id.")
            return
        message = messages[id]
        channel_id = self.settings[server.id]["CHANNEL"]
        channel = self.bot.get_channel(channel_id)

        bot_msg = await self.bot.get_message(
            channel, message["BOT_MESSAGE_ID"])

        transformations = {
            '@everyone': '@\u200beveryone',
            '@here': '@\u200bhere'
        }
        def repl2(obj):
            return transformations.get(obj.group(0), '')
        pattern = re.compile('|'.join(transformations.keys()))
        msg = pattern.sub(repl2, msg)

        comment = "**{}:** {}".format(author.display_name, msg)

        prev_content = bot_msg.clean_content.rsplit('::', 1)
        content = "{}\n{}\n\n::{}".format(
            prev_content[0].rstrip(),
            comment.rstrip(),
            prev_content[1].rstrip())
        await self.bot.edit_message(bot_msg, new_content=content) 
Example #19
Source File: Reminders.py    From NotSoBot with MIT License 5 votes vote down vote up
def get_time(self, txt):
    time = 0
    if txt.isdigit():
      time += int(txt)
    elif txt.split()[0].isdigit():
      s = txt.split()[0]
      time += int(s)
      txt = txt[len(s):]
    else:
      match = self.time_regex.match(txt)
      if match is None or not match.group(0):
        return False
      months = match.group('months')
      weeks = match.group('weeks')
      days = match.group('days')
      hours = match.group('hours')
      minutes = match.group('minutes')
      seconds = match.group('seconds')
      if months:
        time += int(months) * 2592000
      if weeks:
        time += int(weeks) * 604800
      if days:
        time += int(days) * 86400
      if hours:
        time += int(hours) * 3600
      if minutes:
        time += int(minutes) * 60
      if seconds:
        time += int(seconds)
    text = re.sub(self.time_regex, '', txt)
    if text and text[0] == ' ':
      text = text[1:]
    return time, text 
Example #20
Source File: antilink.py    From refactored-cogs with Mozilla Public License 2.0 5 votes vote down vote up
def _new_message(self, message):
        """Finds the message and checks it for regex"""
        user = message.author
        if message.server is None:
            return
        if message.server.id in self.json:

            if self.json[message.server.id]['toggle'] is True:

                roles = [r.name for r in user.roles]
                bot_admin = settings.get_server_admin(message.server)
                bot_mod = settings.get_server_mod(message.server)
                if message.channel.id in self.json[message.server.id]['excluded_channels']:
                    return
                elif user.id == settings.owner:
                    return
                elif bot_admin in roles:
                    return
                elif bot_mod in roles:
                    return
                elif user.permissions_in(message.channel).manage_messages is True:
                    return
                elif user == message.server.me:
                    return

                if self.json[message.server.id]['strict']:
                    for match in self.regex_url.finditer(message.content):
                        if self.emoji_string not in match.group(0):
                            asyncio.sleep(0.5)
                            await self.bot.delete_message(message)
                            if self.json[message.server.id]['dm'] is True:
                                await self.bot.send_message(message.author, self.json[message.server.id]['message'])
                            break
                elif self.regex.search(message.content) is not None or self.regex_discordme.search(message.content) is not None:

                    asyncio.sleep(0.5)
                    await self.bot.delete_message(message)
                    if self.json[message.server.id]['dm'] is True:
                        await self.bot.send_message(message.author, self.json[message.server.id]['message']) 
Example #21
Source File: _utils.py    From Dozer with GNU General Public License v3.0 5 votes vote down vote up
def group(**kwargs):
    """Links command groups"""
    kwargs.setdefault('cls', Group)
    return commands.group(**kwargs) 
Example #22
Source File: _utils.py    From Dozer with GNU General Public License v3.0 5 votes vote down vote up
def group(self, *args, **kwargs):
        """Initiates a command group"""
        kwargs.setdefault('cls', Group)
        return super(Group, self).command(*args, **kwargs) 
Example #23
Source File: sheetManager.py    From avrae with GNU General Public License v3.0 5 votes vote down vote up
def beyond(self, ctx, url: str, *args):
        """
        Loads a character sheet from [D&D Beyond](https://www.dndbeyond.com/), resetting all settings.
        __Valid Arguments__
        `-nocc` - Do not automatically create custom counters for limited use features.
        """

        loading = await ctx.send('Loading character data from Beyond...')
        url = DDB_URL_RE.match(url)
        if url is None:
            return await loading.edit(content="This is not a D&D Beyond link.")
        url = url.group(1)

        override = await self._confirm_overwrite(ctx, f"beyond-{url}")
        if not override: return await ctx.send("Character overwrite unconfirmed. Aborting.")

        parser = BeyondSheetParser(url)
        await self._load_sheet(ctx, parser, args, loading) 
Example #24
Source File: reminders.py    From code-jam-5 with MIT License 5 votes vote down vote up
def convert(self, ctx, argument):
        """Custom converter for the `>reminders` group command.

        This function does the following lookups:

            1. By day (`Monday`, `Tuesday`, `Wednesday` etc.)
            2. By Goal ID (1, 2, 5, 10 etc.)
            3. By goal name (`Ride Bike`, `Drink Water`, etc.)

        Returns
        ---------
        reminder : :class:`list` of :class:`~Reminder`: The reminder being requested.
        """
        if argument.lower() in REMINDER_DAYS:
            # it's a day of week
            reminder = ctx.db.get_reminders_on_day(argument.capitalize())
            if not reminder:
                raise commands.BadArgument(f'No reminders found on {argument}.')
            return list(reminder)

        try:
            # it's a goal ID
            goal_id = int(argument)

            reminder = await ctx.db.get_reminder_by_goal_id_async(goal_id)
            if not reminder:
                raise commands.BadArgument('Goal ID not found.')
            return [reminder]
        except ValueError:
            pass

        reminder = await ctx.db.get_reminder_by_goal_name_async(argument)
        if not reminder:
            raise commands.BadArgument('Goal name not found.')
        return [reminder] 
Example #25
Source File: initTracker.py    From avrae with GNU General Public License v3.0 5 votes vote down vote up
def status(self, ctx, name: str, *, args: str = ''):
        """Gets the status of a combatant or group.
        __Valid Arguments__
        private - PMs the controller of the combatant a more detailed status."""
        combat = await Combat.from_ctx(ctx)
        combatant = await combat.select_combatant(name, select_group=True)
        if combatant is None:
            await ctx.send("Combatant or group not found.")
            return

        private = 'private' in args.lower()
        if not isinstance(combatant, CombatantGroup):
            private = private and str(ctx.author.id) == combatant.controller
            status = combatant.get_status(private=private)
            if private and isinstance(combatant, MonsterCombatant):
                status = f"{status}\n* This creature is a {combatant.monster_name}."
        else:
            status = "\n".join([co.get_status(private=private and str(ctx.author.id) == co.controller) for co in
                                combatant.get_combatants()])

        if private:
            controller = ctx.guild.get_member(int(combatant.controller))
            if controller:
                await controller.send("```markdown\n" + status + "```")
        else:
            await ctx.send("```markdown\n" + status + "```") 
Example #26
Source File: initTracker.py    From avrae with GNU General Public License v3.0 5 votes vote down vote up
def remove_effect(self, ctx, name: str, effect: str = None):
        """Removes a status effect from a combatant or group. Removes all if effect is not passed."""
        combat = await Combat.from_ctx(ctx)

        targets = []

        target = await combat.select_combatant(name, select_group=True)
        if isinstance(target, CombatantGroup):
            targets.extend(target.get_combatants())
        else:
            targets.append(target)

        out = ""

        for combatant in targets:
            if effect is None:
                combatant.remove_all_effects()
                out += f"All effects removed from {combatant.name}.\n"
            else:
                to_remove = await combatant.select_effect(effect)
                children_removed = ""
                if to_remove.children:
                    children_removed = f"Also removed {len(to_remove.children)} child effects.\n"
                to_remove.remove()
                out += f'Effect {to_remove.name} removed from {combatant.name}.\n{children_removed}'
        await ctx.send(out)
        await combat.final() 
Example #27
Source File: initTracker.py    From avrae with GNU General Public License v3.0 5 votes vote down vote up
def remove_combatant(self, ctx, *, name: str):
        """Removes a combatant or group from the combat.
        Usage: !init remove <NAME>"""
        combat = await Combat.from_ctx(ctx)

        combatant = await combat.select_combatant(name, select_group=True)
        if combatant is None:
            return await ctx.send("Combatant not found.")

        if combatant is combat.current_combatant:
            return await ctx.send("You cannot remove a combatant on their own turn.")

        if combatant.group is not None:
            group = combat.get_group(combatant.group)
            if len(group.get_combatants()) <= 1 and group is combat.current_combatant:
                return await ctx.send(
                    "You cannot remove a combatant if they are the only remaining combatant in this turn.")
        combat.remove_combatant(combatant)
        await ctx.send("{} removed from combat.".format(combatant.name))
        await combat.final() 
Example #28
Source File: events.py    From GW2Bot with MIT License 5 votes vote down vote up
def timer_embed(self, ctx, group):
        time = datetime.datetime.utcnow()
        position = (
            60 * time.hour + time.minute
        ) % 120  # this gets the minutes elapsed in the current 2 hour window
        maps = self.gamedata["event_timers"][group]
        title = {
            "hot": "HoT Event Timer",
            "pof": "PoF Event Timer",
            "day": "Day/Night cycle"
        }.get(group)
        embed = discord.Embed(title=title,
                              color=await self.get_embed_color(ctx))
        for location in maps:
            duration_so_far = 0
            current_phase = None
            index = 0
            phases = location["phases"]
            for i, phase in enumerate(phases):
                if position < duration_so_far:
                    break
                current_phase = phase["name"]
                index = i
                duration_so_far += phase["duration"]
            index += 1
            if index == len(phases):
                if phases[0]["name"] == phases[index - 1]["name"]:
                    index = 1
                    duration_so_far += phases[0]["duration"]
                else:
                    index = 0
            next_phase = phases[index]["name"]
            time_until = duration_so_far - position
            value = ("Current phase: **{}**"
                     "\nNext phase: **{}** in **{}** minutes".format(
                         current_phase, next_phase, time_until))
            embed.add_field(name=location["name"], value=value, inline=False)
        embed.set_footer(text=self.bot.user.name,
                         icon_url=self.bot.user.avatar_url)
        return embed 
Example #29
Source File: recensor.py    From calebj-cogs with GNU General Public License v3.0 5 votes vote down vote up
def check_match(predicate: Callable[[str], Optional[SRE_Match]], string: str) -> dict:
    """
    Match task worker.

    Takes a predicate returning a regex match and the string to pass it.
    Returns a dict of time elapsed and match information (if any) or any match exception.
    """
    t0 = time.perf_counter()
    ret = {}

    try:
        match = predicate(string)
    except Exception as e:
        match = None
        ret['exception'] = e

    elapsed = time.perf_counter() - t0

    ret['time'] = elapsed

    if match:
        ret['match'] = match.group(0)
        ret['span'] = match.span(0)
        groups = match.groups()

        if groups:
            ret.update({
                'group_matches' : tuple(match.group(i + 1) for i in range(len(groups))),
                'group_spans'   : tuple(match.span(i + 1) for i in range(len(groups))),
                'groupdict'     : match.groupdict(),
                'groups'        : groups
            })

    return ret 
Example #30
Source File: recensor.py    From calebj-cogs with GNU General Public License v3.0 5 votes vote down vote up
def check_match_iter(predicate: Callable[[str], Iterator[SRE_Match]], string: str) -> List[dict]:
    """
    Finditer match task worker.
    """
    ret_list = []
    match_iter = predicate(string)

    while True:
        t0 = time.perf_counter()
        ret = {}

        try:
            match = next(match_iter)
        except StopIteration:
            break
        except Exception as e:
            match = None
            ret['exception'] = e

        elapsed = time.perf_counter() - t0

        ret['time'] = elapsed

        if match:
            ret['match'] = match.group(0)
            ret['span'] = match.span(0)
            groups = match.groups()

            if groups:
                ret.update({
                    'group_spans' : tuple(match.span(i + 1) for i in range(len(groups))),
                    'groupdict'   : match.groupdict(),
                    'groups'      : groups
                })

        ret_list.append(ret)

        if 'exception' in ret:
            break

    return ret_list