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)
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
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))
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)
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()
def remove_emoji(self, emoji_id): session.query(Karma_emoji).\ filter(Karma_emoji.emoji_ID == utils.str_emoji_id(emoji_id)).\ delete() session.commit()
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()
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()
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