mirror of
				https://github.com/TitanEmbeds/Titan.git
				synced 2025-11-04 15:57:02 +01:00 
			
		
		
		
	WS Realtime for message actions and Sidebar members list presence update
This commit is contained in:
		@@ -139,10 +139,12 @@ class Titan(discord.Client):
 | 
			
		||||
    async def on_message_edit(self, message_before, message_after):
 | 
			
		||||
        await self.wait_until_dbonline()
 | 
			
		||||
        await self.database.update_message(message_after)
 | 
			
		||||
        await self.socketio.on_message_update(message_after)
 | 
			
		||||
 | 
			
		||||
    async def on_message_delete(self, message):
 | 
			
		||||
        await self.wait_until_dbonline()
 | 
			
		||||
        await self.database.delete_message(message)
 | 
			
		||||
        await self.socketio.on_message_delete(message)
 | 
			
		||||
 | 
			
		||||
    async def on_server_join(self, guild):
 | 
			
		||||
        await self.wait_until_dbonline()
 | 
			
		||||
@@ -201,14 +203,17 @@ class Titan(discord.Client):
 | 
			
		||||
    async def on_member_join(self, member):
 | 
			
		||||
        await self.wait_until_dbonline()
 | 
			
		||||
        await self.database.update_guild_member(member, active=True, banned=False)
 | 
			
		||||
        await self.socketio.on_guild_member_add(member)
 | 
			
		||||
 | 
			
		||||
    async def on_member_remove(self, member):
 | 
			
		||||
        await self.wait_until_dbonline()
 | 
			
		||||
        await self.database.update_guild_member(member, active=False, banned=False)
 | 
			
		||||
        await self.socketio.on_guild_member_remove(member)
 | 
			
		||||
 | 
			
		||||
    async def on_member_update(self, memberbefore, memberafter):
 | 
			
		||||
        await self.wait_until_dbonline()
 | 
			
		||||
        await self.database.update_guild_member(memberafter)
 | 
			
		||||
        await self.socketio.on_guild_member_update(memberafter)
 | 
			
		||||
 | 
			
		||||
    async def on_member_ban(self, member):
 | 
			
		||||
        await self.wait_until_dbonline()
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ from titanembeds.database.unauthenticated_users import UnauthenticatedUsers
 | 
			
		||||
from titanembeds.database.unauthenticated_bans import UnauthenticatedBans
 | 
			
		||||
from titanembeds.database.keyvalue_properties import KeyValueProperties
 | 
			
		||||
 | 
			
		||||
from titanembeds.utils import get_message_author, get_message_mentions, get_webhooks_list, get_emojis_list, get_roles_list, get_channels_list
 | 
			
		||||
from titanembeds.utils import get_message_author, get_message_mentions, get_webhooks_list, get_emojis_list, get_roles_list, get_channels_list, list_role_ids
 | 
			
		||||
 | 
			
		||||
class DatabaseInterface(object):
 | 
			
		||||
    # Courtesy of https://github.com/SunDwarf/Jokusoramame
 | 
			
		||||
@@ -167,7 +167,7 @@ class DatabaseInterface(object):
 | 
			
		||||
                        member.avatar,
 | 
			
		||||
                        active,
 | 
			
		||||
                        banned,
 | 
			
		||||
                        json.dumps(self.list_role_ids(member.roles))
 | 
			
		||||
                        json.dumps(list_role_ids(member.roles))
 | 
			
		||||
                    )
 | 
			
		||||
                    session.add(dbmember)
 | 
			
		||||
                else:
 | 
			
		||||
@@ -177,7 +177,7 @@ class DatabaseInterface(object):
 | 
			
		||||
                    dbmember.discriminator = member.discriminator
 | 
			
		||||
                    dbmember.nickname = member.nick
 | 
			
		||||
                    dbmember.avatar = member.avatar
 | 
			
		||||
                    dbmember.roles = json.dumps(self.list_role_ids(member.roles))
 | 
			
		||||
                    dbmember.roles = json.dumps(list_role_ids(member.roles))
 | 
			
		||||
                session.commit()
 | 
			
		||||
 | 
			
		||||
    async def unban_server_user(self, user, server):
 | 
			
		||||
@@ -205,12 +205,6 @@ class DatabaseInterface(object):
 | 
			
		||||
                if changed:
 | 
			
		||||
                    session.commit()
 | 
			
		||||
 | 
			
		||||
    def list_role_ids(self, usr_roles):
 | 
			
		||||
        ids = []
 | 
			
		||||
        for role in usr_roles:
 | 
			
		||||
            ids.append(role.id)
 | 
			
		||||
        return ids
 | 
			
		||||
 | 
			
		||||
    async def flag_unactive_bans(self, guild_id, guildbans):
 | 
			
		||||
        async with threadpool():
 | 
			
		||||
            with self.get_session() as session:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,35 +1,93 @@
 | 
			
		||||
import socketio
 | 
			
		||||
from titanembeds.utils import get_message_author, get_message_mentions
 | 
			
		||||
import time
 | 
			
		||||
from email import utils as emailutils
 | 
			
		||||
 | 
			
		||||
class SocketIOInterface:
 | 
			
		||||
    def __init__(self, bot, redis_uri):
 | 
			
		||||
        self.io = socketio.AsyncRedisManager(redis_uri, write_only=True, channel='flask-socketio')
 | 
			
		||||
        self.bot = bot
 | 
			
		||||
    
 | 
			
		||||
    def format_datetime(self, datetimeobj):
 | 
			
		||||
        return emailutils.formatdate(time.mktime(datetimeobj.timetuple())) # https://stackoverflow.com/questions/3453177/convert-python-datetime-to-rfc-2822
 | 
			
		||||
    
 | 
			
		||||
    def get_formatted_message(self, message):
 | 
			
		||||
        edit_ts = message.edited_timestamp
 | 
			
		||||
        if not edit_ts:
 | 
			
		||||
            edit_ts = None
 | 
			
		||||
        else:
 | 
			
		||||
            edit_ts = self.format_datetime(edit_ts)
 | 
			
		||||
        msg = {
 | 
			
		||||
            "id": message.id,
 | 
			
		||||
            "channel_id": message.channel.id,
 | 
			
		||||
            "content": message.content,
 | 
			
		||||
            "author": get_message_author(message),
 | 
			
		||||
            "timestamp": self.format_datetime(message.timestamp),
 | 
			
		||||
            "edited_timestamp": edit_ts,
 | 
			
		||||
            "mentions": get_message_mentions(message.mentions),
 | 
			
		||||
            "attachments": message.attachments,
 | 
			
		||||
        }
 | 
			
		||||
        nickname = None
 | 
			
		||||
        if hasattr(message.author, 'nick') and message.author.nick:
 | 
			
		||||
            nickname = message.author.nick
 | 
			
		||||
        msg["author"]["nickname"] = nickname
 | 
			
		||||
        for mention in msg["mentions"]:
 | 
			
		||||
            mention["nickname"] = None
 | 
			
		||||
            member = message.server.get_member(mention["id"])
 | 
			
		||||
            if member:
 | 
			
		||||
                mention["nickname"] = member.nick
 | 
			
		||||
        return msg
 | 
			
		||||
    
 | 
			
		||||
    async def on_message(self, message):
 | 
			
		||||
        if message.server:
 | 
			
		||||
            edit_ts = message.edited_timestamp
 | 
			
		||||
            if not edit_ts:
 | 
			
		||||
                edit_ts = None
 | 
			
		||||
            else:
 | 
			
		||||
                edit_ts = str(edit_ts)
 | 
			
		||||
            msg = {
 | 
			
		||||
                "id": message.id,
 | 
			
		||||
                "channel_id": message.channel.id,
 | 
			
		||||
                "content": message.content,
 | 
			
		||||
                "author": get_message_author(message),
 | 
			
		||||
                "timestamp": str(message.timestamp),
 | 
			
		||||
                "edited_timestamp": edit_ts,
 | 
			
		||||
                "mentions": get_message_mentions(message.mentions),
 | 
			
		||||
                "attachments": message.attachments,
 | 
			
		||||
            msg = self.get_formatted_message(message)
 | 
			
		||||
            await self.io.emit('MESSAGE_CREATE', data=msg, room=str("CHANNEL_"+message.channel.id), namespace='/gateway')
 | 
			
		||||
    
 | 
			
		||||
    async def on_message_delete(self, message):
 | 
			
		||||
        if message.server:
 | 
			
		||||
            msg = self.get_formatted_message(message)
 | 
			
		||||
            await self.io.emit('MESSAGE_DELETE', data=msg, room=str("CHANNEL_"+message.channel.id), namespace='/gateway')
 | 
			
		||||
    
 | 
			
		||||
    async def on_message_update(self, message):
 | 
			
		||||
        if message.server:
 | 
			
		||||
            msg = self.get_formatted_message(message)
 | 
			
		||||
            await self.io.emit('MESSAGE_UPDATE', data=msg, room=str("CHANNEL_"+message.channel.id), namespace='/gateway')
 | 
			
		||||
    
 | 
			
		||||
    def get_formatted_user(self, user):
 | 
			
		||||
        userobj = {
 | 
			
		||||
            "avatar": user.avatar,
 | 
			
		||||
            "avatar_url": user.avatar_url,
 | 
			
		||||
            "color": str(user.color)[1:],
 | 
			
		||||
            "discriminator": user.discriminator,
 | 
			
		||||
            "game": None,
 | 
			
		||||
            "hoist-role": None,
 | 
			
		||||
            "id": user.id,
 | 
			
		||||
            "status": str(user.status),
 | 
			
		||||
            "username": user.name,
 | 
			
		||||
        }
 | 
			
		||||
        if user.game:
 | 
			
		||||
            userobj["game"] = {
 | 
			
		||||
                "name": user.game.name
 | 
			
		||||
            }
 | 
			
		||||
            nickname = None
 | 
			
		||||
            if hasattr(message.author, 'nick') and message.author.nick:
 | 
			
		||||
                nickname = message.author.nick
 | 
			
		||||
            msg["author"]["nickname"] = nickname
 | 
			
		||||
            for mention in msg["mentions"]:
 | 
			
		||||
                mention["nickname"] = None
 | 
			
		||||
                member = message.server.get_member(mention["id"])
 | 
			
		||||
                if member:
 | 
			
		||||
                    mention["nickname"] = member.nick
 | 
			
		||||
            await self.io.emit('MESSAGE_CREATE', data=msg, room=str("CHANNEL_"+message.channel.id), namespace='/gateway')
 | 
			
		||||
        roles = sorted(user.roles, key=lambda k: k.position, reverse=True)
 | 
			
		||||
        for role in roles:
 | 
			
		||||
            if role.hoist:
 | 
			
		||||
                userobj["hoist-role"] = {
 | 
			
		||||
                    "id": role.id,
 | 
			
		||||
                    "name": role.name,
 | 
			
		||||
                    "position": role.position,
 | 
			
		||||
                }
 | 
			
		||||
                break
 | 
			
		||||
        return userobj
 | 
			
		||||
 | 
			
		||||
    async def on_guild_member_add(self, member):
 | 
			
		||||
        user = self.get_formatted_user(member)
 | 
			
		||||
        await self.io.emit('GUILD_MEMBER_ADD', data=user, room=str("GUILD_"+member.server.id), namespace='/gateway')
 | 
			
		||||
        
 | 
			
		||||
    async def on_guild_member_remove(self, member):
 | 
			
		||||
        user = self.get_formatted_user(member)
 | 
			
		||||
        await self.io.emit('GUILD_MEMBER_REMOVE', data=user, room=str("GUILD_"+member.server.id), namespace='/gateway')
 | 
			
		||||
        
 | 
			
		||||
    async def on_guild_member_update(self, member):
 | 
			
		||||
        user = self.get_formatted_user(member)
 | 
			
		||||
        await self.io.emit('GUILD_MEMBER_UPDATE', data=user, room=str("GUILD_"+member.server.id), namespace='/gateway')
 | 
			
		||||
@@ -89,4 +89,10 @@ def get_channels_list(guildchannels):
 | 
			
		||||
                "type": str(channel.type),
 | 
			
		||||
                "permission_overwrites": overwrites
 | 
			
		||||
            })
 | 
			
		||||
    return channels
 | 
			
		||||
    return channels
 | 
			
		||||
    
 | 
			
		||||
def list_role_ids(usr_roles):
 | 
			
		||||
    ids = []
 | 
			
		||||
    for role in usr_roles:
 | 
			
		||||
        ids.append(role.id)
 | 
			
		||||
    return ids
 | 
			
		||||
		Reference in New Issue
	
	Block a user