Implement reactions

This commit is contained in:
Jeremy Zhang
2018-07-27 08:57:54 +00:00
parent 4aa785d4cc
commit 1629a8982c
7 changed files with 174 additions and 2 deletions

View File

@ -102,6 +102,18 @@ class Titan(discord.AutoShardedClient):
self.delete_list.append(message.id)
await self.redisqueue.delete_message(message)
await self.socketio.on_message_delete(message)
async def on_reaction_add(self, reaction, user):
await self.redisqueue.update_message(reaction.message)
await self.socketio.on_reaction_add(reaction.message)
async def on_reaction_remove(self, reaction, user):
await self.redisqueue.update_message(reaction.message)
await self.socketio.on_reaction_remove(reaction.message)
async def on_reaction_clear(self, message, reactions):
await self.redisqueue.update_message(message)
await self.socketio.on_reaction_clear(message)
async def on_guild_join(self, guild):
await self.redisqueue.update_guild(guild)
@ -206,6 +218,31 @@ class Titan(discord.AutoShardedClient):
msg = discord.Message(channel=channel, state=self._connection, data=data) # Procreate a fake message object
await self.on_message_delete(msg)
async def on_raw_reaction_add(self, payload):
message_id = payload.message_id
if not self.in_messages_cache(message_id):
channel = self.get_channel(payload.channel_id)
message = await channel.get_message(message_id)
await self.on_reaction_add(message.reactions[0], None)
async def on_raw_reaction_remove(self, payload):
message_id = payload.message_id
if not self.in_messages_cache(message_id):
partial = payload.emoji
emoji = self._connection._upgrade_partial_emoji(partial)
channel = self.get_channel(payload.channel_id)
message = await channel.get_message(message_id)
message._add_reaction({"me": payload.user_id == self.user.id}, emoji, payload.user_id)
reaction = message._remove_reaction({}, emoji, payload.user_id)
await self.on_reaction_remove(reaction, None)
async def on_raw_reaction_clear(self, payload):
message_id = payload.message_id
if not self.in_messages_cache(message_id):
channel = self.get_channel(payload.channel_id)
message = await channel.get_message(message_id)
await self.on_reaction_clear(message, [])
def in_messages_cache(self, msg_id):
for msg in self._connection._messages:
if msg.id == msg_id:

View File

@ -22,6 +22,21 @@ class SocketIOInterface:
msg = get_formatted_message(message)
await self.io.emit('MESSAGE_UPDATE', data=msg, room=str("CHANNEL_"+str(message.channel.id)), namespace='/gateway')
async def on_reaction_add(self, message):
if message.guild:
msg = get_formatted_message(message)
await self.io.emit('MESSAGE_REACTION_ADD', data=msg, room=str("CHANNEL_"+str(message.channel.id)), namespace='/gateway')
async def on_reaction_remove(self, message):
if message.guild:
msg = get_formatted_message(message)
await self.io.emit('MESSAGE_REACTION_REMOVE', data=msg, room=str("CHANNEL_"+str(message.channel.id)), namespace='/gateway')
async def on_reaction_clear(self, message):
if message.guild:
msg = get_formatted_message(message)
await self.io.emit('MESSAGE_REACTION_REMOVE_ALL', data=msg, room=str("CHANNEL_"+str(message.channel.id)), namespace='/gateway')
async def on_guild_member_add(self, member):
user = get_formatted_user(member)
await self.io.emit('GUILD_MEMBER_ADD', data=user, room=str("GUILD_"+str(member.guild.id)), namespace='/gateway')

View File

@ -36,6 +36,8 @@ def get_formatted_message(message):
member = message.guild.get_member(mention["id"])
if member:
mention["nickname"] = member.nick
if hasattr(message, "reactions"):
msg["reactions"] = get_message_reactions(message.reactions)
return msg
def get_formatted_user(user):
@ -246,4 +248,26 @@ def get_embeds_list(embeds):
em = []
for e in embeds:
em.append(e.to_dict())
return em
return em
def get_message_reactions(reactions):
reacts = []
for reaction in reactions:
reacts.append({
"emoji": get_partial_emoji(reaction.emoji),
"count": reaction.count
})
return reacts
def get_partial_emoji(emoji):
emote = {
"animated": False,
"id": None,
"name": str(emoji)
}
if isinstance(emoji, str):
return emote
emote["animated"] = emoji.animated
emote["id"] = str(emoji.id)
emote["name"] = emoji.name
return emote