mirror of
				https://github.com/TitanEmbeds/Titan.git
				synced 2025-11-03 23:37:09 +01:00 
			
		
		
		
	Basic message relaying via WS
This commit is contained in:
		@@ -3,5 +3,7 @@ config = {
 | 
			
		||||
    
 | 
			
		||||
    'database-uri': "driver://username:password@host:port/database",
 | 
			
		||||
    
 | 
			
		||||
    'redis-uri': "redis://",
 | 
			
		||||
    
 | 
			
		||||
    'errorreporting-channelid': "",
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
from config import config
 | 
			
		||||
from titanembeds.database import DatabaseInterface
 | 
			
		||||
from titanembeds.commands import Commands
 | 
			
		||||
from titanembeds.socketio import SocketIOInterface
 | 
			
		||||
import discord
 | 
			
		||||
import aiohttp
 | 
			
		||||
import asyncio
 | 
			
		||||
@@ -17,6 +18,7 @@ class Titan(discord.Client):
 | 
			
		||||
        self.http.user_agent += ' TitanEmbeds-Bot'
 | 
			
		||||
        self.database = DatabaseInterface(self)
 | 
			
		||||
        self.command = Commands(self, self.database)
 | 
			
		||||
        self.socketio = SocketIOInterface(self, config["redis-uri"])
 | 
			
		||||
        
 | 
			
		||||
        self.database_connected = False
 | 
			
		||||
        self.loop.create_task(self.send_webserver_heartbeat())
 | 
			
		||||
@@ -123,6 +125,7 @@ class Titan(discord.Client):
 | 
			
		||||
            return
 | 
			
		||||
        await self.wait_until_dbonline()
 | 
			
		||||
        await self.database.push_message(message)
 | 
			
		||||
        await self.socketio.on_message(message)
 | 
			
		||||
 | 
			
		||||
        msg_arr = message.content.split() # split the message
 | 
			
		||||
        if len(message.content.split()) > 1 and message.server: #making sure there is actually stuff in the message and have arguments and check if it is sent in server (not PM)
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,8 @@ 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
 | 
			
		||||
 | 
			
		||||
class DatabaseInterface(object):
 | 
			
		||||
    # Courtesy of https://github.com/SunDwarf/Jokusoramame
 | 
			
		||||
    def __init__(self, bot):
 | 
			
		||||
@@ -58,38 +60,15 @@ class DatabaseInterface(object):
 | 
			
		||||
                        message.channel.id,
 | 
			
		||||
                        message.id,
 | 
			
		||||
                        message.content,
 | 
			
		||||
                        json.dumps(self.get_message_author(message)),
 | 
			
		||||
                        json.dumps(get_message_author(message)),
 | 
			
		||||
                        str(message.timestamp),
 | 
			
		||||
                        edit_ts,
 | 
			
		||||
                        json.dumps(self.get_message_mentions(message.mentions)),
 | 
			
		||||
                        json.dumps(get_message_mentions(message.mentions)),
 | 
			
		||||
                        json.dumps(message.attachments)
 | 
			
		||||
                    )
 | 
			
		||||
                    session.add(msg)
 | 
			
		||||
                    session.commit()
 | 
			
		||||
 | 
			
		||||
    def get_message_author(self, message):
 | 
			
		||||
        author = message.author
 | 
			
		||||
        obj = {
 | 
			
		||||
            "username": author.name,
 | 
			
		||||
            "discriminator": author.discriminator,
 | 
			
		||||
            "bot": author.bot,
 | 
			
		||||
            "id": author.id,
 | 
			
		||||
            "avatar": author.avatar
 | 
			
		||||
        }
 | 
			
		||||
        return obj
 | 
			
		||||
 | 
			
		||||
    def get_message_mentions(self, mentions):
 | 
			
		||||
        ments = []
 | 
			
		||||
        for author in mentions:
 | 
			
		||||
            ments.append({
 | 
			
		||||
                "username": author.name,
 | 
			
		||||
                "discriminator": author.discriminator,
 | 
			
		||||
                "bot": author.bot,
 | 
			
		||||
                "id": author.id,
 | 
			
		||||
                "avatar": author.avatar
 | 
			
		||||
            })
 | 
			
		||||
        return ments
 | 
			
		||||
 | 
			
		||||
    async def update_message(self, message):
 | 
			
		||||
        if message.server:
 | 
			
		||||
            async with threadpool():
 | 
			
		||||
@@ -101,9 +80,9 @@ class DatabaseInterface(object):
 | 
			
		||||
                    if msg:
 | 
			
		||||
                        msg.content = message.content
 | 
			
		||||
                        msg.edited_timestamp = message.edited_timestamp
 | 
			
		||||
                        msg.mentions = json.dumps(self.get_message_mentions(message.mentions))
 | 
			
		||||
                        msg.mentions = json.dumps(get_message_mentions(message.mentions))
 | 
			
		||||
                        msg.attachments = json.dumps(message.attachments)
 | 
			
		||||
                        msg.author = json.dumps(self.get_message_author(message))
 | 
			
		||||
                        msg.author = json.dumps(get_message_author(message))
 | 
			
		||||
                        session.commit()
 | 
			
		||||
 | 
			
		||||
    async def delete_message(self, message):
 | 
			
		||||
@@ -127,91 +106,23 @@ class DatabaseInterface(object):
 | 
			
		||||
                    gui = Guilds(
 | 
			
		||||
                        guild.id,
 | 
			
		||||
                        guild.name,
 | 
			
		||||
                        json.dumps(self.get_roles_list(guild.roles)),
 | 
			
		||||
                        json.dumps(self.get_channels_list(guild.channels)),
 | 
			
		||||
                        json.dumps(self.get_webhooks_list(server_webhooks)),
 | 
			
		||||
                        json.dumps(self.get_emojis_list(guild.emojis)),
 | 
			
		||||
                        json.dumps(get_roles_list(guild.roles)),
 | 
			
		||||
                        json.dumps(get_channels_list(guild.channels)),
 | 
			
		||||
                        json.dumps(get_webhooks_list(server_webhooks)),
 | 
			
		||||
                        json.dumps(get_emojis_list(guild.emojis)),
 | 
			
		||||
                        guild.owner_id,
 | 
			
		||||
                        guild.icon
 | 
			
		||||
                    )
 | 
			
		||||
                    session.add(gui)
 | 
			
		||||
                else:
 | 
			
		||||
                    gui.name = guild.name
 | 
			
		||||
                    gui.roles = json.dumps(self.get_roles_list(guild.roles))
 | 
			
		||||
                    gui.channels = json.dumps(self.get_channels_list(guild.channels))
 | 
			
		||||
                    gui.webhooks = json.dumps(self.get_webhooks_list(server_webhooks))
 | 
			
		||||
                    gui.emojis = json.dumps(self.get_emojis_list(guild.emojis))
 | 
			
		||||
                    gui.roles = json.dumps(get_roles_list(guild.roles))
 | 
			
		||||
                    gui.channels = json.dumps(get_channels_list(guild.channels))
 | 
			
		||||
                    gui.webhooks = json.dumps(get_webhooks_list(server_webhooks))
 | 
			
		||||
                    gui.emojis = json.dumps(get_emojis_list(guild.emojis))
 | 
			
		||||
                    gui.owner_id = guild.owner_id
 | 
			
		||||
                    gui.icon = guild.icon
 | 
			
		||||
                session.commit()
 | 
			
		||||
    
 | 
			
		||||
    def get_webhooks_list(self, guild_webhooks):
 | 
			
		||||
        webhooks = []
 | 
			
		||||
        for webhook in guild_webhooks:
 | 
			
		||||
            webhooks.append({
 | 
			
		||||
                "id": webhook.id,
 | 
			
		||||
                "guild_id": webhook.server.id,
 | 
			
		||||
                "channel_id": webhook.channel.id,
 | 
			
		||||
                "name": webhook.name,
 | 
			
		||||
                "token": webhook.token,
 | 
			
		||||
            })
 | 
			
		||||
        return webhooks
 | 
			
		||||
    
 | 
			
		||||
    def get_emojis_list(self, guildemojis):
 | 
			
		||||
        emojis = []
 | 
			
		||||
        for emote in guildemojis:
 | 
			
		||||
            emojis.append({
 | 
			
		||||
                "id": emote.id,
 | 
			
		||||
                "name": emote.name,
 | 
			
		||||
                "require_colons": emote.require_colons,
 | 
			
		||||
                "managed": emote.managed,
 | 
			
		||||
                "roles": self.list_role_ids(emote.roles),
 | 
			
		||||
                "url": emote.url
 | 
			
		||||
            })
 | 
			
		||||
        return emojis
 | 
			
		||||
 | 
			
		||||
    def get_roles_list(self, guildroles):
 | 
			
		||||
        roles = []
 | 
			
		||||
        for role in guildroles:
 | 
			
		||||
            roles.append({
 | 
			
		||||
                "id": role.id,
 | 
			
		||||
                "name": role.name,
 | 
			
		||||
                "color": role.color.value,
 | 
			
		||||
                "hoist": role.hoist,
 | 
			
		||||
                "position": role.position,
 | 
			
		||||
                "permissions": role.permissions.value
 | 
			
		||||
            })
 | 
			
		||||
        return roles
 | 
			
		||||
 | 
			
		||||
    def get_channels_list(self, guildchannels):
 | 
			
		||||
        channels = []
 | 
			
		||||
        for channel in guildchannels:
 | 
			
		||||
            if str(channel.type) == "text":
 | 
			
		||||
                overwrites = []
 | 
			
		||||
                for target, overwrite in channel.overwrites:
 | 
			
		||||
                    if isinstance(target, discord.Role):
 | 
			
		||||
                        type = "role"
 | 
			
		||||
                    else:
 | 
			
		||||
                        type = "member"
 | 
			
		||||
                    allow, deny = overwrite.pair()
 | 
			
		||||
                    allow = allow.value
 | 
			
		||||
                    deny = deny.value
 | 
			
		||||
                    overwrites.append({
 | 
			
		||||
                        "id": target.id,
 | 
			
		||||
                        "type": type,
 | 
			
		||||
                        "allow": allow,
 | 
			
		||||
                        "deny": deny,
 | 
			
		||||
                    })
 | 
			
		||||
 | 
			
		||||
                channels.append({
 | 
			
		||||
                    "id": channel.id,
 | 
			
		||||
                    "name": channel.name,
 | 
			
		||||
                    "topic": channel.topic,
 | 
			
		||||
                    "position": channel.position,
 | 
			
		||||
                    "type": str(channel.type),
 | 
			
		||||
                    "permission_overwrites": overwrites
 | 
			
		||||
                })
 | 
			
		||||
        return channels
 | 
			
		||||
 | 
			
		||||
    async def remove_unused_guilds(self, guilds):
 | 
			
		||||
        async with threadpool():
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								discordbot/titanembeds/socketio/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								discordbot/titanembeds/socketio/__init__.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
from .socketiointerface import SocketIOInterface
 | 
			
		||||
							
								
								
									
										26
									
								
								discordbot/titanembeds/socketio/socketiointerface.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								discordbot/titanembeds/socketio/socketiointerface.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
import socketio
 | 
			
		||||
from titanembeds.utils import get_message_author, get_message_mentions
 | 
			
		||||
 | 
			
		||||
class SocketIOInterface:
 | 
			
		||||
    def __init__(self, bot, redis_uri):
 | 
			
		||||
        self.io = socketio.AsyncRedisManager(redis_uri, write_only=True, channel='flask-socketio')
 | 
			
		||||
        self.bot = bot
 | 
			
		||||
    
 | 
			
		||||
    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,
 | 
			
		||||
            }
 | 
			
		||||
            await self.io.emit('MESSAGE_CREATE', data=msg, room=message.server.id, namespace='/gateway')
 | 
			
		||||
							
								
								
									
										92
									
								
								discordbot/titanembeds/utils.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								discordbot/titanembeds/utils.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,92 @@
 | 
			
		||||
import discord
 | 
			
		||||
 | 
			
		||||
def get_message_author(message):
 | 
			
		||||
    author = message.author
 | 
			
		||||
    obj = {
 | 
			
		||||
        "username": author.name,
 | 
			
		||||
        "discriminator": author.discriminator,
 | 
			
		||||
        "bot": author.bot,
 | 
			
		||||
        "id": author.id,
 | 
			
		||||
        "avatar": author.avatar
 | 
			
		||||
    }
 | 
			
		||||
    return obj
 | 
			
		||||
 | 
			
		||||
def get_message_mentions(mentions):
 | 
			
		||||
    ments = []
 | 
			
		||||
    for author in mentions:
 | 
			
		||||
        ments.append({
 | 
			
		||||
            "username": author.name,
 | 
			
		||||
            "discriminator": author.discriminator,
 | 
			
		||||
            "bot": author.bot,
 | 
			
		||||
            "id": author.id,
 | 
			
		||||
            "avatar": author.avatar
 | 
			
		||||
        })
 | 
			
		||||
    return ments
 | 
			
		||||
 | 
			
		||||
def get_webhooks_list(guild_webhooks):
 | 
			
		||||
    webhooks = []
 | 
			
		||||
    for webhook in guild_webhooks:
 | 
			
		||||
        webhooks.append({
 | 
			
		||||
            "id": webhook.id,
 | 
			
		||||
            "guild_id": webhook.server.id,
 | 
			
		||||
            "channel_id": webhook.channel.id,
 | 
			
		||||
            "name": webhook.name,
 | 
			
		||||
            "token": webhook.token,
 | 
			
		||||
        })
 | 
			
		||||
    return webhooks
 | 
			
		||||
 | 
			
		||||
def get_emojis_list(guildemojis):
 | 
			
		||||
    emojis = []
 | 
			
		||||
    for emote in guildemojis:
 | 
			
		||||
        emojis.append({
 | 
			
		||||
            "id": emote.id,
 | 
			
		||||
            "name": emote.name,
 | 
			
		||||
            "require_colons": emote.require_colons,
 | 
			
		||||
            "managed": emote.managed,
 | 
			
		||||
            "roles": list_role_ids(emote.roles),
 | 
			
		||||
            "url": emote.url
 | 
			
		||||
        })
 | 
			
		||||
    return emojis
 | 
			
		||||
 | 
			
		||||
def get_roles_list(guildroles):
 | 
			
		||||
    roles = []
 | 
			
		||||
    for role in guildroles:
 | 
			
		||||
        roles.append({
 | 
			
		||||
            "id": role.id,
 | 
			
		||||
            "name": role.name,
 | 
			
		||||
            "color": role.color.value,
 | 
			
		||||
            "hoist": role.hoist,
 | 
			
		||||
            "position": role.position,
 | 
			
		||||
            "permissions": role.permissions.value
 | 
			
		||||
        })
 | 
			
		||||
    return roles
 | 
			
		||||
 | 
			
		||||
def get_channels_list(guildchannels):
 | 
			
		||||
    channels = []
 | 
			
		||||
    for channel in guildchannels:
 | 
			
		||||
        if str(channel.type) == "text":
 | 
			
		||||
            overwrites = []
 | 
			
		||||
            for target, overwrite in channel.overwrites:
 | 
			
		||||
                if isinstance(target, discord.Role):
 | 
			
		||||
                    type = "role"
 | 
			
		||||
                else:
 | 
			
		||||
                    type = "member"
 | 
			
		||||
                allow, deny = overwrite.pair()
 | 
			
		||||
                allow = allow.value
 | 
			
		||||
                deny = deny.value
 | 
			
		||||
                overwrites.append({
 | 
			
		||||
                    "id": target.id,
 | 
			
		||||
                    "type": type,
 | 
			
		||||
                    "allow": allow,
 | 
			
		||||
                    "deny": deny,
 | 
			
		||||
                })
 | 
			
		||||
 | 
			
		||||
            channels.append({
 | 
			
		||||
                "id": channel.id,
 | 
			
		||||
                "name": channel.name,
 | 
			
		||||
                "topic": channel.topic,
 | 
			
		||||
                "position": channel.position,
 | 
			
		||||
                "type": str(channel.type),
 | 
			
		||||
                "permission_overwrites": overwrites
 | 
			
		||||
            })
 | 
			
		||||
    return channels
 | 
			
		||||
		Reference in New Issue
	
	Block a user