Module aethersprite.extensions.base.poll

Poll cog

Functions

async def on_raw_reaction_add(payload: discord.raw_models.RawReactionActionEvent)
Expand source code
async def on_raw_reaction_add(payload: RawReactionActionEvent):
    """Handle on_reaction_add event."""

    assert bot.user
    assert payload.member

    if payload.user_id == bot.user.id or payload.message_id not in polls:
        return

    poll = polls[payload.message_id]
    channel = payload.member.guild.get_channel(payload.channel_id)
    assert channel
    msg: Message = await channel.fetch_message(  # type: ignore
        payload.message_id,
    )

    async def _delete():
        assert payload.member
        prompt = poll["prompt"]
        delete = payload.member.id in poll["delete"]
        confirm = payload.member.id in poll["confirm"]

        if delete and confirm:
            await msg.delete()
            del polls[msg.id]
            log.info(f"{payload.member} deleted poll {msg.id} - {prompt}")

    if _allowed("poll.createroles", msg, payload.member):
        if payload.emoji.name == WASTEBASKET:
            poll["delete"].add(payload.member.id)
            polls[msg.id] = poll
            await _delete()

            return

        if payload.emoji.name == CHECK_MARK:
            poll["confirm"].add(payload.member.id)
            polls[msg.id] = poll
            await _delete()

            return

        if payload.emoji.name == PROHIBITED:
            poll["open"] = False
            polls[msg.id] = poll
            await msg.edit(embed=_get_embed(poll))

            return

    opts = poll["options"]

    if (
        payload.emoji.name not in opts
        or not poll["open"]
        or not _allowed("poll.voteroles", msg, payload.member)
    ):
        await msg.remove_reaction(payload.emoji.name, payload.member)

        return

    await _update_poll(payload.member, msg, payload.emoji.name, 1)

Handle on_reaction_add event.

async def on_raw_reaction_remove(payload: discord.raw_models.RawReactionActionEvent)
Expand source code
async def on_raw_reaction_remove(payload: RawReactionActionEvent):
    "Handle on_reaction_remove event."

    assert bot.user
    assert payload.guild_id

    if payload.user_id == bot.user.id or payload.message_id not in polls:
        return

    poll = polls[payload.message_id]
    guild = bot.get_guild(payload.guild_id)
    assert guild
    member = guild.get_member(payload.user_id)
    assert member
    channel = guild.get_channel(payload.channel_id)
    assert channel
    msg: Message = await channel.fetch_message(  # type: ignore
        payload.message_id,
    )

    if payload.emoji.name == WASTEBASKET and member.id in poll["delete"]:
        poll["delete"].remove(member.id)
        polls[msg.id] = poll

        return

    if payload.emoji.name == CHECK_MARK and member.id in poll["confirm"]:
        poll["confirm"].remove(member.id)
        polls[msg.id] = poll

        return

    if payload.emoji.name == PROHIBITED and _allowed(
        "poll.createroles", msg, member
    ):
        poll["open"] = True
        polls[msg.id] = poll
        await msg.edit(embed=_get_embed(poll))

        return

    if payload.emoji.name not in poll["options"] or not poll["open"]:
        return

    await _update_poll(member, msg, payload.emoji.name, -1)

Handle on_reaction_remove event.

async def on_ready()
Expand source code
async def on_ready():
    # clear out old polls
    now = datetime.utcnow()

    for k, p in polls.items():
        ts: datetime = p["timestamp"]

        if (now - ts).total_seconds() >= POLL_EXPIRY:
            del polls[k]
async def setup(bot_: discord.ext.commands.bot.Bot)
Expand source code
async def setup(bot_: Bot):
    global bot

    bot = bot_

    # settings
    register(
        "poll.createroles",
        None,
        lambda _: True,
        False,
        "Roles allowed to create polls. Defaults to anyone.",
        filter=create_filter,
    )
    register(
        "poll.voteroles",
        None,
        lambda _: True,
        False,
        "Roles allowed to vote in polls. Defaults to anyone.",
        filter=vote_filter,
    )

    # events
    bot.add_listener(on_raw_reaction_add)
    bot.add_listener(on_raw_reaction_remove)
    bot.add_listener(on_ready)

    bot.add_command(poll)
async def teardown(bot: discord.ext.commands.bot.Bot)
Expand source code
async def teardown(bot: Bot):
    global settings

    for key in (
        "poll.createroles",
        "poll.voteroles",
    ):
        del settings[key]