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]