Exemple #1
0
    async def handle_raw_reaction_add(self, payload: RawReactionActionEvent):
        # Called from reactions.py
        if payload.message_id not in self.vote_cache:
            return

        vote = self.vote_cache[payload.message_id]
        chan = await get_or_fetch_channel(self.bot, payload.channel_id)

        emoji_str = str_emoji_id(payload.emoji)

        if emoji_str not in vote.options:
            msg = await chan.fetch_message(payload.message_id)
            usr = await get_or_fetch_user(self.bot, payload.user_id)
            await msg.remove_reaction(payload.emoji, usr)
            return

        if vote.is_one_of:
            msg: Message = await chan.fetch_message(payload.message_id)
            usr = await get_or_fetch_user(self.bot, payload.user_id)
            for r in msg.reactions:
                if str_emoji_id(r.emoji) == emoji_str:
                    continue

                if await r.users().find(lambda x: x.id == usr.id):
                    # Increment the counter here, so that on_raw_reaction_remove can decrement it again
                    vote.options[emoji_str].count += 1
                    await msg.remove_reaction(payload.emoji, usr)
                    return

        last_max_opt = max(vote.options.values(), key=lambda x: x.count).count

        vote.options[emoji_str].count += 1
        if vote.options[emoji_str].count >= last_max_opt:
            msg = await chan.fetch_message(payload.message_id)
            await self.update_bot_vote_message(msg, chan)
Exemple #2
0
 def emoji_value_raw(self, emoji_id):
     """Returns the value of an emoji.
     If the emoji has not been voted for, returns None."""
     emoji = session.query(Karma_emoji).\
         filter(Karma_emoji.emoji_ID == utils.str_emoji_id(emoji_id)).\
         one_or_none()
     return emoji.value if emoji else None
Exemple #3
0
    async def init_vote(self, message: Message):
        vote = self.vote_cache[message.id]
        handled_opts = []
        for msg_reaction in message.reactions:
            r_id = str_emoji_id(msg_reaction.emoji)
            if r_id in vote.options:
                vote.options[r_id].count = msg_reaction.count - 1
                handled_opts.append(r_id)
            else:
                async for u in msg_reaction.users():
                    await msg_reaction.remove(u)

        for opt in vote.options:
            if opt not in handled_opts:
                if vote.options[opt].is_unicode:
                    e = vote.options[opt].emoji
                else:
                    e = self.bot.get_emoji(int(vote.options[opt].emoji))
                await message.add_reaction(e)

        if vote.end_date is not None:
            sec = (vote.end_date - datetime.now()).total_seconds()
            if sec < 1:
                sec = 1
            asyncio.ensure_future(
                self.send_final_message(sec, message.id, message.channel.id))
Exemple #4
0
    async def on_raw_reaction_remove(self, payload: RawReactionActionEvent):
        if payload.message_id not in self.vote_cache:
            return

        vote = self.vote_cache[payload.message_id]
        if str_emoji_id(payload.emoji) not in vote.options:
            return

        chan = await get_or_fetch_channel(self.bot, payload.channel_id)
        emoji_str = str_emoji_id(payload.emoji)

        last_max_opt = max(vote.options.values(), key=lambda x: x.count).count

        vote.options[emoji_str].count -= 1
        if (vote.options[emoji_str].count + 1) == last_max_opt:
            msg = await chan.fetch_message(payload.message_id)
            await self.update_bot_vote_message(msg, chan)
Exemple #5
0
 def set_emoji_value(self, emoji_id, value: int):
     cursor = self.cursor()
     cursor.execute(
         'INSERT INTO bot_karma_emoji (emoji_id, value) '
         'VALUES (%s, %s) ON DUPLICATE KEY '
         'UPDATE value = %s',
         (utils.str_emoji_id(emoji_id), str(value), str(value)))
     self.db.commit()
Exemple #6
0
 def remove_emoji(self, emoji_id):
     session.query(Karma_emoji).\
         filter(Karma_emoji.emoji_ID == utils.str_emoji_id(emoji_id)).\
         delete()
     session.commit()
Exemple #7
0
 def set_emoji_value(self, emoji_id, value: int):
     emoji = Karma_emoji(emoji_ID=utils.str_emoji_id(emoji_id),
                         value=str(value))
     # Merge == 'insert on duplicate key update'
     session.merge(emoji)
     session.commit()
Exemple #8
0
 def remove_emoji(self, emoji_id):
     cursor = self.cursor()
     cursor.execute('DELETE FROM bot_karma_emoji '
                    'WHERE emoji_id = %s', (utils.str_emoji_id(emoji_id), ))
     self.db.commit()
Exemple #9
0
 def emoji_value_raw(self, emoji_id):
     """Returns the value of an emoji.
     If the emoji has not been voted for, returns None."""
     row = self.get_row("bot_karma_emoji", "emoji_id",
                        utils.str_emoji_id(emoji_id))
     return row[1] if row else None