mirror of
				https://github.com/TitanEmbeds/Titan.git
				synced 2025-11-04 07:47:10 +01:00 
			
		
		
		
	Remove guild members table for storing in redis
This commit is contained in:
		@@ -105,23 +105,6 @@ class Titan(discord.AutoShardedClient):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    async def on_guild_join(self, guild):
 | 
					    async def on_guild_join(self, guild):
 | 
				
			||||||
        await self.database.update_guild(guild)
 | 
					        await self.database.update_guild(guild)
 | 
				
			||||||
        for member in guild.members:
 | 
					 | 
				
			||||||
            await self.database.update_guild_member(member, True, False)
 | 
					 | 
				
			||||||
        if guild.me.guild_permissions.ban_members:
 | 
					 | 
				
			||||||
            banned = await guild.bans()
 | 
					 | 
				
			||||||
            for ban in banned:
 | 
					 | 
				
			||||||
                member = discord.Member(user={
 | 
					 | 
				
			||||||
                    "username": ban.name,
 | 
					 | 
				
			||||||
                    "id": ban.id,
 | 
					 | 
				
			||||||
                    "discriminator": ban.discriminator,
 | 
					 | 
				
			||||||
                    "avatar": ban.avatar,
 | 
					 | 
				
			||||||
                    "bot": ban.bot
 | 
					 | 
				
			||||||
                })
 | 
					 | 
				
			||||||
                await self.database.update_guild_member(member, False, True)
 | 
					 | 
				
			||||||
        for channel in list(guild.channels):
 | 
					 | 
				
			||||||
            chanperm = channel.permissions_for(channel.guild.me)
 | 
					 | 
				
			||||||
            if not chanperm.read_messages or not chanperm.read_message_history or not isinstance(channel, discord.channel.TextChannel):
 | 
					 | 
				
			||||||
                continue
 | 
					 | 
				
			||||||
        await self.postStats()
 | 
					        await self.postStats()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def on_guild_remove(self, guild):
 | 
					    async def on_guild_remove(self, guild):
 | 
				
			||||||
@@ -163,24 +146,21 @@ class Titan(discord.AutoShardedClient):
 | 
				
			|||||||
        await self.socketio.on_channel_update(channelafter)
 | 
					        await self.socketio.on_channel_update(channelafter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def on_member_join(self, member):
 | 
					    async def on_member_join(self, member):
 | 
				
			||||||
        await self.database.update_guild_member(member, active=True, banned=False)
 | 
					        await self.redisqueue.add_member(member)
 | 
				
			||||||
        await self.socketio.on_guild_member_add(member)
 | 
					        await self.socketio.on_guild_member_add(member)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def on_member_remove(self, member):
 | 
					    async def on_member_remove(self, member):
 | 
				
			||||||
        await self.database.update_guild_member(member, active=False, banned=False)
 | 
					        await self.redisqueue.remove_member(member)
 | 
				
			||||||
        await self.socketio.on_guild_member_remove(member)
 | 
					        await self.socketio.on_guild_member_remove(member)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def on_member_update(self, memberbefore, memberafter):
 | 
					    async def on_member_update(self, memberbefore, memberafter):
 | 
				
			||||||
        await self.database.update_guild_member(memberafter)
 | 
					        await self.redisqueue.update_member(memberafter)
 | 
				
			||||||
        await self.socketio.on_guild_member_update(memberafter)
 | 
					        await self.socketio.on_guild_member_update(memberafter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def on_member_ban(self, guild, user):
 | 
					    async def on_member_ban(self, guild, user):
 | 
				
			||||||
        if self.user.id == user.id:
 | 
					        if self.user.id == user.id:
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
        await self.database.update_guild_member(user, active=False, banned=True, guild=guild)
 | 
					        await self.redisqueue.ban_member(guild, user)
 | 
				
			||||||
 | 
					 | 
				
			||||||
    async def on_member_unban(self, guild, user):
 | 
					 | 
				
			||||||
        await self.database.unban_server_user(user, guild)
 | 
					 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    async def on_guild_emojis_update(self, guild, before, after):
 | 
					    async def on_guild_emojis_update(self, guild, before, after):
 | 
				
			||||||
        if len(after) == 0:
 | 
					        if len(after) == 0:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ import datetime
 | 
				
			|||||||
db = Gino()
 | 
					db = Gino()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from titanembeds.database.guilds import Guilds
 | 
					from titanembeds.database.guilds import Guilds
 | 
				
			||||||
from titanembeds.database.guild_members import GuildMembers
 | 
					 | 
				
			||||||
from titanembeds.database.unauthenticated_users import UnauthenticatedUsers
 | 
					from titanembeds.database.unauthenticated_users import UnauthenticatedUsers
 | 
				
			||||||
from titanembeds.database.unauthenticated_bans import UnauthenticatedBans
 | 
					from titanembeds.database.unauthenticated_bans import UnauthenticatedBans
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -71,82 +70,6 @@ class DatabaseInterface(object):
 | 
				
			|||||||
            await Messages.delete.where(Messages.guild_id == int(guild.id)).gino.status()
 | 
					            await Messages.delete.where(Messages.guild_id == int(guild.id)).gino.status()
 | 
				
			||||||
            await gui.delete()
 | 
					            await gui.delete()
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
    async def update_guild_member(self, member, active=True, banned=False, guild=None):
 | 
					 | 
				
			||||||
        if guild:
 | 
					 | 
				
			||||||
            dbmember = await GuildMembers.query \
 | 
					 | 
				
			||||||
                .where(GuildMembers.guild_id == int(guild.id)) \
 | 
					 | 
				
			||||||
                .where(GuildMembers.user_id == int(member.id)) \
 | 
					 | 
				
			||||||
                .order_by(GuildMembers.id).gino.all()
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            dbmember = await GuildMembers.query \
 | 
					 | 
				
			||||||
                .where(GuildMembers.guild_id == int(member.guild.id)) \
 | 
					 | 
				
			||||||
                .where(GuildMembers.user_id == int(member.id)) \
 | 
					 | 
				
			||||||
                .order_by(GuildMembers.id).gino.all()
 | 
					 | 
				
			||||||
        if not dbmember:
 | 
					 | 
				
			||||||
            await GuildMembers.create(
 | 
					 | 
				
			||||||
                guild_id = int(member.guild.id),
 | 
					 | 
				
			||||||
                user_id = int(member.id),
 | 
					 | 
				
			||||||
                username = member.name,
 | 
					 | 
				
			||||||
                discriminator = int(member.discriminator),
 | 
					 | 
				
			||||||
                nickname = member.nick,
 | 
					 | 
				
			||||||
                avatar = member.avatar,
 | 
					 | 
				
			||||||
                active = active,
 | 
					 | 
				
			||||||
                banned = banned,
 | 
					 | 
				
			||||||
                roles = json.dumps(list_role_ids(member.roles))
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            if len(dbmember) > 1:
 | 
					 | 
				
			||||||
                for mem in dbmember[1:]:
 | 
					 | 
				
			||||||
                    await mem.delete()
 | 
					 | 
				
			||||||
            dbmember = dbmember[0]
 | 
					 | 
				
			||||||
            if dbmember.banned != banned or dbmember.active != active or dbmember.username != member.name or dbmember.discriminator != int(member.discriminator) or dbmember.nickname != member.nick or dbmember.avatar != member.avatar or set(json.loads(dbmember.roles)) != set(list_role_ids(member.roles)):
 | 
					 | 
				
			||||||
                await dbmember.update(
 | 
					 | 
				
			||||||
                    banned = banned,
 | 
					 | 
				
			||||||
                    active = active,
 | 
					 | 
				
			||||||
                    username = member.name,
 | 
					 | 
				
			||||||
                    discriminator = int(member.discriminator),
 | 
					 | 
				
			||||||
                    nickname = member.nick,
 | 
					 | 
				
			||||||
                    avatar = member.avatar,
 | 
					 | 
				
			||||||
                    roles = json.dumps(list_role_ids(member.roles))
 | 
					 | 
				
			||||||
                ).apply()
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    async def unban_server_user(self, user, server):
 | 
					 | 
				
			||||||
        await GuildMembers.update.values(banned = False) \
 | 
					 | 
				
			||||||
            .where(GuildMembers.guild_id == int(server.id)) \
 | 
					 | 
				
			||||||
            .where(GuildMembers.user_id == int(user.id)) \
 | 
					 | 
				
			||||||
            .gino.status()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    async def flag_unactive_guild_members(self, guild_id, guild_members):
 | 
					 | 
				
			||||||
        async with db.transaction():
 | 
					 | 
				
			||||||
            async for member in GuildMembers.query \
 | 
					 | 
				
			||||||
                .where(GuildMembers.guild_id == int(guild_id)) \
 | 
					 | 
				
			||||||
                .where(GuildMembers.active == True).gino.iterate():
 | 
					 | 
				
			||||||
                dismember = discord.utils.get(guild_members, id=member.user_id)
 | 
					 | 
				
			||||||
                if not dismember:
 | 
					 | 
				
			||||||
                    await member.update(active = False).apply()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    async def flag_unactive_bans(self, guild_id, guildbans):
 | 
					 | 
				
			||||||
        for usr in guildbans:
 | 
					 | 
				
			||||||
            dbusr = await GuildMembers.query \
 | 
					 | 
				
			||||||
                .where(GuildMembers.guild_id == int(guild_id)) \
 | 
					 | 
				
			||||||
                .where(GuildMembers.user_id == int(usr.id)) \
 | 
					 | 
				
			||||||
                .where(GuildMembers.active == False).gino.first()
 | 
					 | 
				
			||||||
            if dbusr:
 | 
					 | 
				
			||||||
                dbusr.update(banned=True).apply()
 | 
					 | 
				
			||||||
            else:
 | 
					 | 
				
			||||||
                await GuildMembers.create(
 | 
					 | 
				
			||||||
                    guild_id = int(guild_id),
 | 
					 | 
				
			||||||
                    user_id = int(usr.id),
 | 
					 | 
				
			||||||
                    username = usr.name,
 | 
					 | 
				
			||||||
                    discriminator = int(usr.discriminator),
 | 
					 | 
				
			||||||
                    nickname = None,
 | 
					 | 
				
			||||||
                    avatar = usr.avatar,
 | 
					 | 
				
			||||||
                    active = False,
 | 
					 | 
				
			||||||
                    banned = True,
 | 
					 | 
				
			||||||
                    roles = "[]"
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
                
 | 
					 | 
				
			||||||
    async def ban_unauth_user_by_query(self, guild_id, placer_id, username, discriminator):
 | 
					    async def ban_unauth_user_by_query(self, guild_id, placer_id, username, discriminator):
 | 
				
			||||||
        dbuser = None
 | 
					        dbuser = None
 | 
				
			||||||
        if discriminator:
 | 
					        if discriminator:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,14 +0,0 @@
 | 
				
			|||||||
from titanembeds.database import db
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class GuildMembers(db.Model):
 | 
					 | 
				
			||||||
    __tablename__ = "guild_members"
 | 
					 | 
				
			||||||
    id = db.Column(db.Integer, primary_key=True)    # Auto incremented id
 | 
					 | 
				
			||||||
    guild_id = db.Column(db.BigInteger)            # Discord guild id
 | 
					 | 
				
			||||||
    user_id = db.Column(db.BigInteger)             # Discord user id
 | 
					 | 
				
			||||||
    username = db.Column(db.String(255))            # Name
 | 
					 | 
				
			||||||
    discriminator = db.Column(db.Integer)           # User discriminator
 | 
					 | 
				
			||||||
    nickname = db.Column(db.String(255))            # User nickname
 | 
					 | 
				
			||||||
    avatar = db.Column(db.String(255))              # The avatar str of the user
 | 
					 | 
				
			||||||
    active = db.Column(db.Boolean())                # If the user is a member of the guild
 | 
					 | 
				
			||||||
    banned = db.Column(db.Boolean())                # If the user is banned in the guild
 | 
					 | 
				
			||||||
    roles = db.Column(db.Text())                    # Member roles
 | 
					 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
from titanembeds.utils import get_formatted_message
 | 
					from titanembeds.utils import get_formatted_message, get_formatted_user
 | 
				
			||||||
from urllib.parse import urlparse
 | 
					from urllib.parse import urlparse
 | 
				
			||||||
import asyncio_redis
 | 
					import asyncio_redis
 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
@@ -77,6 +77,15 @@ class RedisQueue:
 | 
				
			|||||||
                    break
 | 
					                    break
 | 
				
			||||||
        return (unformatted_item, formatted_item)
 | 
					        return (unformatted_item, formatted_item)
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    async def enforce_expiring_key(self, key):
 | 
				
			||||||
 | 
					        ttl = await self.connection.ttl(key)
 | 
				
			||||||
 | 
					        newttl = 0
 | 
				
			||||||
 | 
					        if ttl == -1:
 | 
				
			||||||
 | 
					            newttl = 60 * 5 # 5 minutes
 | 
				
			||||||
 | 
					        if ttl >= 0:
 | 
				
			||||||
 | 
					            newttl = ttl
 | 
				
			||||||
 | 
					        await self.connection.expire(key, newttl)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    async def on_get_channel_messages(self, key, params):
 | 
					    async def on_get_channel_messages(self, key, params):
 | 
				
			||||||
        channel = self.bot.get_channel(int(params["channel_id"]))
 | 
					        channel = self.bot.get_channel(int(params["channel_id"]))
 | 
				
			||||||
        if not channel or not isinstance(channel, discord.channel.TextChannel):
 | 
					        if not channel or not isinstance(channel, discord.channel.TextChannel):
 | 
				
			||||||
@@ -86,7 +95,7 @@ class RedisQueue:
 | 
				
			|||||||
        async for message in channel.history(limit=50):
 | 
					        async for message in channel.history(limit=50):
 | 
				
			||||||
            formatted = get_formatted_message(message)
 | 
					            formatted = get_formatted_message(message)
 | 
				
			||||||
            messages.append(json.dumps(formatted))
 | 
					            messages.append(json.dumps(formatted))
 | 
				
			||||||
        await self.connection.sadd(key, messages)
 | 
					        await self.connection.sadd(key, [""] + messages)
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    async def push_message(self, message):
 | 
					    async def push_message(self, message):
 | 
				
			||||||
        if message.guild:
 | 
					        if message.guild:
 | 
				
			||||||
@@ -108,3 +117,64 @@ class RedisQueue:
 | 
				
			|||||||
    async def update_message(self, message):
 | 
					    async def update_message(self, message):
 | 
				
			||||||
        await self.delete_message(message)
 | 
					        await self.delete_message(message)
 | 
				
			||||||
        await self.push_message(message)
 | 
					        await self.push_message(message)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async def on_get_guild_member(self, key, params):
 | 
				
			||||||
 | 
					        member = self.bot.get_guild(int(params["guild_id"])).get_member(int(params["user_id"]))
 | 
				
			||||||
 | 
					        if not member:
 | 
				
			||||||
 | 
					            await self.connection.set(key, "")
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					        user = get_formatted_user(member)
 | 
				
			||||||
 | 
					        await self.enforce_expiring_key(key)
 | 
				
			||||||
 | 
					        await self.connection.set(key, json.dumps(user))
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    async def on_get_guild_member_named(self, key, params):
 | 
				
			||||||
 | 
					        guild = self.bot.get_guild(int(params["guild_id"]))
 | 
				
			||||||
 | 
					        query = params["query"]
 | 
				
			||||||
 | 
					        result = None
 | 
				
			||||||
 | 
					        members = guild.members
 | 
				
			||||||
 | 
					        if len(query) > 5 and query[-5] == '#':
 | 
				
			||||||
 | 
					            potential_discriminator = query[-4:]
 | 
				
			||||||
 | 
					            result = discord.utils.get(members, name=query[:-5], discriminator=potential_discriminator)
 | 
				
			||||||
 | 
					            if not result:
 | 
				
			||||||
 | 
					                result = discord.utils.get(members, nick=query[:-5], discriminator=potential_discriminator)
 | 
				
			||||||
 | 
					        if not result:
 | 
				
			||||||
 | 
					            result = ""
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            result_id = result.id
 | 
				
			||||||
 | 
					            result = json.dumps({"user_id": result_id})
 | 
				
			||||||
 | 
					            get_guild_member_key = "Queue/guilds/{}/members/{}".format(guild.id, result_id)
 | 
				
			||||||
 | 
					            get_guild_member_param = {"guild_id": guild.id, "user_id": result_id}
 | 
				
			||||||
 | 
					            await self.on_get_guild_member(get_guild_member_key, get_guild_member_param)
 | 
				
			||||||
 | 
					        await self.connection.set(key, result)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    async def on_list_guild_members(self, key, params):
 | 
				
			||||||
 | 
					        guild = self.bot.get_guild(int(params["guild_id"]))
 | 
				
			||||||
 | 
					        members = guild.members
 | 
				
			||||||
 | 
					        member_ids = []
 | 
				
			||||||
 | 
					        for member in members:
 | 
				
			||||||
 | 
					            member_ids.append(json.dumps({"user_id": member.id}))
 | 
				
			||||||
 | 
					            get_guild_member_key = "Queue/guilds/{}/members/{}".format(guild.id, member.id)
 | 
				
			||||||
 | 
					            get_guild_member_param = {"guild_id": guild.id, "user_id": member.id}
 | 
				
			||||||
 | 
					            await self.on_get_guild_member(get_guild_member_key, get_guild_member_param)
 | 
				
			||||||
 | 
					        await self.connection.sadd(key, member_ids)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    async def add_member(self, member):
 | 
				
			||||||
 | 
					        key = "Queue/guilds/{}/members".format(member.guild.id)
 | 
				
			||||||
 | 
					        exists = await self.connection.exists(key)
 | 
				
			||||||
 | 
					        if exists:
 | 
				
			||||||
 | 
					            await self.connection.sadd(key, [json.dumps({"user_id": member.id})])
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    async def remove_member(self, member, guild=None):
 | 
				
			||||||
 | 
					        if not guild:
 | 
				
			||||||
 | 
					            guild = member.guild
 | 
				
			||||||
 | 
					        guild_member_key = "Queue/guilds/{}/members/{}".format(guild.id, member.id)
 | 
				
			||||||
 | 
					        list_members_key = "Queue/guilds/{}/members".format(guild.id)
 | 
				
			||||||
 | 
					        await self.connection.srem(list_members_key, [json.dumps({"user_id": member.id})])
 | 
				
			||||||
 | 
					        await self.connection.delete([guild_member_key])
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    async def update_member(self, member):
 | 
				
			||||||
 | 
					        await self.remove_member(member)
 | 
				
			||||||
 | 
					        await self.add_member(member)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async def ban_member(self, guild, user):
 | 
				
			||||||
 | 
					        await self.remove_member(user, guild)
 | 
				
			||||||
@@ -50,6 +50,8 @@ def get_formatted_user(user):
 | 
				
			|||||||
        "status": str(user.status),
 | 
					        "status": str(user.status),
 | 
				
			||||||
        "username": user.name,
 | 
					        "username": user.name,
 | 
				
			||||||
        "nick": None,
 | 
					        "nick": None,
 | 
				
			||||||
 | 
					        "bot": user.bot,
 | 
				
			||||||
 | 
					        "roles": []
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if userobj["color"] == "000000":
 | 
					    if userobj["color"] == "000000":
 | 
				
			||||||
        userobj["color"] = None
 | 
					        userobj["color"] = None
 | 
				
			||||||
@@ -63,13 +65,13 @@ def get_formatted_user(user):
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    roles = sorted(user.roles, key=lambda k: k.position, reverse=True)
 | 
					    roles = sorted(user.roles, key=lambda k: k.position, reverse=True)
 | 
				
			||||||
    for role in roles:
 | 
					    for role in roles:
 | 
				
			||||||
        if role.hoist:
 | 
					        userobj["roles"].append(role.id)
 | 
				
			||||||
 | 
					        if role.hoist and userobj["hoist-role"] == None:
 | 
				
			||||||
            userobj["hoist-role"] = {
 | 
					            userobj["hoist-role"] = {
 | 
				
			||||||
                "id": str(role.id),
 | 
					                "id": str(role.id),
 | 
				
			||||||
                "name": role.name,
 | 
					                "name": role.name,
 | 
				
			||||||
                "position": role.position,
 | 
					                "position": role.position,
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            break
 | 
					 | 
				
			||||||
    return userobj
 | 
					    return userobj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_message_author(message):
 | 
					def get_message_author(message):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					"""Removed guild members table
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Revision ID: 1d2c2dc41e86
 | 
				
			||||||
 | 
					Revises: 52271b243ba2
 | 
				
			||||||
 | 
					Create Date: 2018-07-17 23:45:18.803232
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# revision identifiers, used by Alembic.
 | 
				
			||||||
 | 
					revision = '1d2c2dc41e86'
 | 
				
			||||||
 | 
					down_revision = '52271b243ba2'
 | 
				
			||||||
 | 
					branch_labels = None
 | 
				
			||||||
 | 
					depends_on = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from alembic import op
 | 
				
			||||||
 | 
					import sqlalchemy as sa
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def upgrade():
 | 
				
			||||||
 | 
					    # ### commands auto generated by Alembic - please adjust! ###
 | 
				
			||||||
 | 
					    op.drop_table('guild_members')
 | 
				
			||||||
 | 
					    # ### end Alembic commands ###
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def downgrade():
 | 
				
			||||||
 | 
					    # ### commands auto generated by Alembic - please adjust! ###
 | 
				
			||||||
 | 
					    op.create_table('guild_members',
 | 
				
			||||||
 | 
					    sa.Column('id', sa.INTEGER(), nullable=False),
 | 
				
			||||||
 | 
					    sa.Column('guild_id', sa.BIGINT(), autoincrement=False, nullable=False),
 | 
				
			||||||
 | 
					    sa.Column('user_id', sa.BIGINT(), autoincrement=False, nullable=False),
 | 
				
			||||||
 | 
					    sa.Column('username', sa.VARCHAR(length=255), autoincrement=False, nullable=False),
 | 
				
			||||||
 | 
					    sa.Column('discriminator', sa.INTEGER(), autoincrement=False, nullable=False),
 | 
				
			||||||
 | 
					    sa.Column('nickname', sa.VARCHAR(length=255), autoincrement=False, nullable=True),
 | 
				
			||||||
 | 
					    sa.Column('avatar', sa.VARCHAR(length=255), autoincrement=False, nullable=True),
 | 
				
			||||||
 | 
					    sa.Column('active', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=False),
 | 
				
			||||||
 | 
					    sa.Column('banned', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False),
 | 
				
			||||||
 | 
					    sa.Column('roles', sa.TEXT(), autoincrement=False, nullable=False),
 | 
				
			||||||
 | 
					    sa.PrimaryKeyConstraint('id', name='idx_25210_primary')
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    # ### end Alembic commands ###
 | 
				
			||||||
@@ -1,9 +1,9 @@
 | 
				
			|||||||
from flask import Blueprint, url_for, redirect, session, render_template, abort, request, jsonify
 | 
					from flask import Blueprint, url_for, redirect, session, render_template, abort, request, jsonify
 | 
				
			||||||
from flask_socketio import emit
 | 
					from flask_socketio import emit
 | 
				
			||||||
from functools import wraps
 | 
					from functools import wraps
 | 
				
			||||||
from titanembeds.database import db, get_administrators_list, Cosmetics, Guilds, UnauthenticatedUsers, UnauthenticatedBans, TitanTokens, TokenTransactions, get_titan_token, set_titan_token, list_disabled_guilds, DisabledGuilds, UserCSS, AuthenticatedUsers, DiscordBotsOrgTransactions, GuildMembers
 | 
					from titanembeds.database import db, get_administrators_list, Cosmetics, Guilds, UnauthenticatedUsers, UnauthenticatedBans, TitanTokens, TokenTransactions, get_titan_token, set_titan_token, list_disabled_guilds, DisabledGuilds, UserCSS, AuthenticatedUsers, DiscordBotsOrgTransactions
 | 
				
			||||||
from titanembeds.oauth import generate_guild_icon_url
 | 
					from titanembeds.oauth import generate_guild_icon_url
 | 
				
			||||||
from titanembeds.utils import get_online_embed_user_keys
 | 
					from titanembeds.utils import get_online_embed_user_keys, redisqueue
 | 
				
			||||||
import datetime
 | 
					import datetime
 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
from sqlalchemy import func
 | 
					from sqlalchemy import func
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
from titanembeds.database import db, Guilds, UnauthenticatedUsers, UnauthenticatedBans, AuthenticatedUsers, GuildMembers, list_all_guild_members, get_guild_member, get_administrators_list, get_badges, DiscordBotsOrgTransactions
 | 
					from titanembeds.database import db, Guilds, UnauthenticatedUsers, UnauthenticatedBans, AuthenticatedUsers, get_administrators_list, get_badges, DiscordBotsOrgTransactions
 | 
				
			||||||
from titanembeds.decorators import valid_session_required, discord_users_only, abort_if_guild_disabled
 | 
					from titanembeds.decorators import valid_session_required, discord_users_only, abort_if_guild_disabled
 | 
				
			||||||
from titanembeds.utils import check_guild_existance, guild_accepts_visitors, guild_query_unauth_users_bool, get_client_ipaddr, discord_api, rate_limiter, channel_ratelimit_key, guild_ratelimit_key, user_unauthenticated, checkUserRevoke, checkUserBanned, update_user_status, check_user_in_guild, get_guild_channels, guild_webhooks_enabled, guild_unauthcaptcha_enabled, get_member_roles, get_online_embed_user_keys, redis_store, redisqueue
 | 
					from titanembeds.utils import check_guild_existance, guild_accepts_visitors, guild_query_unauth_users_bool, get_client_ipaddr, discord_api, rate_limiter, channel_ratelimit_key, guild_ratelimit_key, user_unauthenticated, checkUserRevoke, checkUserBanned, update_user_status, check_user_in_guild, get_guild_channels, guild_webhooks_enabled, guild_unauthcaptcha_enabled, get_member_roles, get_online_embed_user_keys, redis_store, redisqueue
 | 
				
			||||||
from titanembeds.oauth import user_has_permission, generate_avatar_url, check_user_can_administrate_guild
 | 
					from titanembeds.oauth import user_has_permission, generate_avatar_url, check_user_can_administrate_guild
 | 
				
			||||||
@@ -79,8 +79,8 @@ def format_post_content(guild_id, channel_id, message, dbUser):
 | 
				
			|||||||
        else:
 | 
					        else:
 | 
				
			||||||
            username = session['username']
 | 
					            username = session['username']
 | 
				
			||||||
            if dbUser:
 | 
					            if dbUser:
 | 
				
			||||||
                if dbUser.nickname:
 | 
					                if dbUser["nick"]:
 | 
				
			||||||
                    username = dbUser.nickname
 | 
					                    username = dbUser["nick"]
 | 
				
			||||||
            message = u"**<{}#{}>** {}".format(username, session['discriminator'], message) # I would like to do a @ mention, but i am worried about notify spam
 | 
					            message = u"**<{}#{}>** {}".format(username, session['discriminator'], message) # I would like to do a @ mention, but i am worried about notify spam
 | 
				
			||||||
    return (message, illegal_post, illegal_reasons)
 | 
					    return (message, illegal_post, illegal_reasons)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -100,10 +100,10 @@ def filter_guild_channel(guild_id, channel_id, force_everyone=False):
 | 
				
			|||||||
    return None
 | 
					    return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_online_discord_users(guild_id, embed):
 | 
					def get_online_discord_users(guild_id, embed):
 | 
				
			||||||
    apimembers = list_all_guild_members(guild_id)
 | 
					    apimembers = redisqueue.list_guild_members(guild_id)
 | 
				
			||||||
    apimembers_filtered = {}
 | 
					    apimembers_filtered = {}
 | 
				
			||||||
    for member in apimembers:
 | 
					    for member in apimembers:
 | 
				
			||||||
        apimembers_filtered[member["user"]["id"]] = member
 | 
					        apimembers_filtered[member["id"]] = member
 | 
				
			||||||
    guild_roles = json.loads(db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first().roles)
 | 
					    guild_roles = json.loads(db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first().roles)
 | 
				
			||||||
    guildroles_filtered = {}
 | 
					    guildroles_filtered = {}
 | 
				
			||||||
    for role in guild_roles:
 | 
					    for role in guild_roles:
 | 
				
			||||||
@@ -151,13 +151,13 @@ def get_online_embed_users(guild_id):
 | 
				
			|||||||
        users['unauthenticated'].append(meta)
 | 
					        users['unauthenticated'].append(meta)
 | 
				
			||||||
    for user in auths:
 | 
					    for user in auths:
 | 
				
			||||||
        client_id = user.client_id
 | 
					        client_id = user.client_id
 | 
				
			||||||
        usrdb = db.session.query(GuildMembers).filter(GuildMembers.guild_id == guild_id).filter(GuildMembers.user_id == client_id).first()
 | 
					        usrdb = redisqueue.get_guild_member(guild_id, client_id)
 | 
				
			||||||
        meta = {
 | 
					        meta = {
 | 
				
			||||||
            'id': str(usrdb.user_id),
 | 
					            'id': str(usrdb["id"]),
 | 
				
			||||||
            'username': usrdb.username,
 | 
					            'username': usrdb["username"],
 | 
				
			||||||
            'nickname': usrdb.nickname,
 | 
					            'nickname': usrdb["nick"],
 | 
				
			||||||
            'discriminator': usrdb.discriminator,
 | 
					            'discriminator': usrdb["discriminator"],
 | 
				
			||||||
            'avatar_url': generate_avatar_url(usrdb.user_id, usrdb.avatar),
 | 
					            'avatar_url': generate_avatar_url(usrdb["id"], usrdb["avatar"]),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        users['authenticated'].append(meta)
 | 
					        users['authenticated'].append(meta)
 | 
				
			||||||
    return users
 | 
					    return users
 | 
				
			||||||
@@ -194,16 +194,16 @@ def get_channel_webhook_url(guild_id, channel_id):
 | 
				
			|||||||
    return webhook["content"]
 | 
					    return webhook["content"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_all_users(guild_id):
 | 
					def get_all_users(guild_id):
 | 
				
			||||||
    users = db.session.query(GuildMembers).filter(GuildMembers.guild_id == guild_id, GuildMembers.active == True).all()
 | 
					    users = redisqueue.list_guild_members(guild_id)
 | 
				
			||||||
    mem = []
 | 
					    mem = []
 | 
				
			||||||
    for u in users:
 | 
					    for u in users:
 | 
				
			||||||
        mem.append({
 | 
					        mem.append({
 | 
				
			||||||
            "id": str(u.user_id),
 | 
					            "id": str(u["id"]),
 | 
				
			||||||
            "avatar": u.avatar,
 | 
					            "avatar": u["avatar"],
 | 
				
			||||||
            "avatar_url": generate_avatar_url(u.user_id, u.avatar, u.discriminator, True),
 | 
					            "avatar_url": generate_avatar_url(u["id"], u["avatar"], u["discriminator"], True),
 | 
				
			||||||
            "username": u.username,
 | 
					            "username": u["username"],
 | 
				
			||||||
            "nickname": u.nickname,
 | 
					            "nickname": u["nick"],
 | 
				
			||||||
            "discriminator": u.discriminator
 | 
					            "discriminator": u["discriminator"]
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
    return mem
 | 
					    return mem
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -295,7 +295,7 @@ def post():
 | 
				
			|||||||
    channel_id = request.form.get('channel_id')
 | 
					    channel_id = request.form.get('channel_id')
 | 
				
			||||||
    content = request.form.get('content')
 | 
					    content = request.form.get('content')
 | 
				
			||||||
    if "user_id" in session:
 | 
					    if "user_id" in session:
 | 
				
			||||||
        dbUser = GuildMembers.query.filter(GuildMembers.guild_id == guild_id).filter(GuildMembers.user_id == str(session['user_id'])).first()
 | 
					        dbUser = redisqueue.get_guild_member(guild_id, session["user_id"])
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        dbUser = None
 | 
					        dbUser = None
 | 
				
			||||||
    if user_unauthenticated():
 | 
					    if user_unauthenticated():
 | 
				
			||||||
@@ -331,8 +331,8 @@ def post():
 | 
				
			|||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    username = session["username"]
 | 
					                    username = session["username"]
 | 
				
			||||||
                    if dbUser:
 | 
					                    if dbUser:
 | 
				
			||||||
                        if dbUser.nickname:
 | 
					                        if dbUser["nick"]:
 | 
				
			||||||
                            username = dbUser.nickname
 | 
					                            username = dbUser["nick"]
 | 
				
			||||||
                    # if content.startswith("(Titan Dev) "):
 | 
					                    # if content.startswith("(Titan Dev) "):
 | 
				
			||||||
                    #     content = content[12:]
 | 
					                    #     content = content[12:]
 | 
				
			||||||
                    #     username = "(Titan Dev) " + username
 | 
					                    #     username = "(Titan Dev) " + username
 | 
				
			||||||
@@ -527,13 +527,13 @@ def user_info(guild_id, user_id):
 | 
				
			|||||||
        "roles": [],
 | 
					        "roles": [],
 | 
				
			||||||
        "badges": [],
 | 
					        "badges": [],
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    member = db.session.query(GuildMembers).filter(GuildMembers.guild_id == guild_id, GuildMembers.user_id == user_id).first()
 | 
					    member = redisqueue.get_guild_member(guild_id, user_id)
 | 
				
			||||||
    if member:
 | 
					    if member:
 | 
				
			||||||
        usr["id"] = str(member.user_id)
 | 
					        usr["id"] = str(member["id"])
 | 
				
			||||||
        usr["username"] = member.username
 | 
					        usr["username"] = member["username"]
 | 
				
			||||||
        usr["nickname"] = member.nickname
 | 
					        usr["nickname"] = member["nick"]
 | 
				
			||||||
        usr["discriminator"] = member.discriminator
 | 
					        usr["discriminator"] = member["discriminator"]
 | 
				
			||||||
        usr["avatar"] = member.avatar
 | 
					        usr["avatar"] = member["avatar"]
 | 
				
			||||||
        usr["avatar_url"] = generate_avatar_url(usr["id"], usr["avatar"], usr["discriminator"], True)
 | 
					        usr["avatar_url"] = generate_avatar_url(usr["id"], usr["avatar"], usr["discriminator"], True)
 | 
				
			||||||
        roles = get_member_roles(guild_id, user_id)
 | 
					        roles = get_member_roles(guild_id, user_id)
 | 
				
			||||||
        dbguild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
					        dbguild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
				
			||||||
@@ -543,7 +543,7 @@ def user_info(guild_id, user_id):
 | 
				
			|||||||
                if gr["id"] == r:
 | 
					                if gr["id"] == r:
 | 
				
			||||||
                    usr["roles"].append(gr)
 | 
					                    usr["roles"].append(gr)
 | 
				
			||||||
        usr["badges"] = get_badges(user_id)
 | 
					        usr["badges"] = get_badges(user_id)
 | 
				
			||||||
        if redis_store.get("DiscordBotsOrgVoted/" + str(member.user_id)):
 | 
					        if redis_store.get("DiscordBotsOrgVoted/" + str(member["id"])):
 | 
				
			||||||
            usr["badges"].append("discordbotsorgvoted")
 | 
					            usr["badges"].append("discordbotsorgvoted")
 | 
				
			||||||
    return jsonify(usr)
 | 
					    return jsonify(usr)
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
from titanembeds.utils import socketio, guild_accepts_visitors, get_client_ipaddr, discord_api, check_user_in_guild, get_guild_channels, update_user_status, guild_webhooks_enabled, redis_store
 | 
					from titanembeds.utils import socketio, guild_accepts_visitors, get_client_ipaddr, discord_api, check_user_in_guild, get_guild_channels, update_user_status, guild_webhooks_enabled, redis_store, redisqueue
 | 
				
			||||||
from titanembeds.database import db, GuildMembers, get_guild_member, Guilds
 | 
					from titanembeds.database import db, Guilds
 | 
				
			||||||
from flask_socketio import Namespace, emit, disconnect, join_room, leave_room
 | 
					from flask_socketio import Namespace, emit, disconnect, join_room, leave_room
 | 
				
			||||||
import functools
 | 
					import functools
 | 
				
			||||||
from flask import request, session
 | 
					from flask import request, session
 | 
				
			||||||
@@ -38,7 +38,7 @@ class Gateway(Namespace):
 | 
				
			|||||||
            if session["unauthenticated"]:
 | 
					            if session["unauthenticated"]:
 | 
				
			||||||
                emit("embed_user_connect", {"unauthenticated": True, "username": session["username"], "discriminator": session["user_id"]}, room="GUILD_"+guild_id)
 | 
					                emit("embed_user_connect", {"unauthenticated": True, "username": session["username"], "discriminator": session["user_id"]}, room="GUILD_"+guild_id)
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                nickname = db.session.query(GuildMembers).filter(GuildMembers.guild_id == guild_id, GuildMembers.user_id == session["user_id"]).first().nickname
 | 
					                nickname = redisqueue.get_guild_member(guild_id, session["user_id"]).get("nickname")
 | 
				
			||||||
                emit("embed_user_connect", {"unauthenticated": False, "id": str(session["user_id"]), "nickname": nickname, "username": session["username"],"discriminator": session["discriminator"], "avatar_url": session["avatar"]}, room="GUILD_"+guild_id)
 | 
					                emit("embed_user_connect", {"unauthenticated": False, "id": str(session["user_id"]), "nickname": nickname, "username": session["username"],"discriminator": session["discriminator"], "avatar_url": session["avatar"]}, room="GUILD_"+guild_id)
 | 
				
			||||||
        emit("identified")
 | 
					        emit("identified")
 | 
				
			||||||
        self.teardown_db_session()
 | 
					        self.teardown_db_session()
 | 
				
			||||||
@@ -125,17 +125,17 @@ class Gateway(Namespace):
 | 
				
			|||||||
        
 | 
					        
 | 
				
			||||||
    def get_user_color(self, guild_id, user_id):
 | 
					    def get_user_color(self, guild_id, user_id):
 | 
				
			||||||
        color = None
 | 
					        color = None
 | 
				
			||||||
        member = db.session.query(GuildMembers).filter(GuildMembers.guild_id == guild_id, GuildMembers.user_id == user_id).first()
 | 
					        member = redisqueue.get_guild_member(guild_id, user_id)
 | 
				
			||||||
        if not member:
 | 
					        if not member:
 | 
				
			||||||
            return None
 | 
					            return None
 | 
				
			||||||
        guild_roles = json.loads(db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first().roles)
 | 
					        guild_roles = json.loads(db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first().roles)
 | 
				
			||||||
        guildroles_filtered = {}
 | 
					        guildroles_filtered = {}
 | 
				
			||||||
        for role in guild_roles:
 | 
					        for role in guild_roles:
 | 
				
			||||||
            guildroles_filtered[role["id"]] = role
 | 
					            guildroles_filtered[role["id"]] = role
 | 
				
			||||||
        member_roleids = json.loads(member.roles)
 | 
					        member_roleids = member["roles"]
 | 
				
			||||||
        member_roles = []
 | 
					        member_roles = []
 | 
				
			||||||
        for roleid in member_roleids:
 | 
					        for roleid in member_roleids:
 | 
				
			||||||
            role = guildroles_filtered.get(roleid)
 | 
					            role = guildroles_filtered.get(str(roleid))
 | 
				
			||||||
            if not role:
 | 
					            if not role:
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            member_roles.append(role)
 | 
					            member_roles.append(role)
 | 
				
			||||||
@@ -148,6 +148,7 @@ class Gateway(Namespace):
 | 
				
			|||||||
        return color
 | 
					        return color
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    def on_lookup_user_info(self, data):
 | 
					    def on_lookup_user_info(self, data):
 | 
				
			||||||
 | 
					        print("test")
 | 
				
			||||||
        guild_id = data["guild_id"]
 | 
					        guild_id = data["guild_id"]
 | 
				
			||||||
        name = data["name"]
 | 
					        name = data["name"]
 | 
				
			||||||
        discriminator = data["discriminator"]
 | 
					        discriminator = data["discriminator"]
 | 
				
			||||||
@@ -162,28 +163,36 @@ class Gateway(Namespace):
 | 
				
			|||||||
            "avatar_url": None,
 | 
					            "avatar_url": None,
 | 
				
			||||||
            "discordbotsorgvoted": False,
 | 
					            "discordbotsorgvoted": False,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        member = db.session.query(GuildMembers).filter(GuildMembers.guild_id == guild_id, GuildMembers.username == name, GuildMembers.discriminator == discriminator).first()
 | 
					        member = redisqueue.get_guild_member_named(guild_id, "{}#{}".format(name, discriminator))
 | 
				
			||||||
 | 
					        print("test1")
 | 
				
			||||||
        if member:
 | 
					        if member:
 | 
				
			||||||
            usr["id"] = str(member.user_id)
 | 
					            print("test1.5")
 | 
				
			||||||
            usr["username"] = member.username
 | 
					            usr["id"] = str(member["id"])
 | 
				
			||||||
            usr["nickname"] = member.nickname
 | 
					            usr["username"] = member["username"]
 | 
				
			||||||
            usr["avatar"] = member.avatar
 | 
					            usr["nickname"] = member["nick"]
 | 
				
			||||||
 | 
					            usr["avatar"] = member["avatar"]
 | 
				
			||||||
 | 
					            print("test1.54")
 | 
				
			||||||
            usr["color"] = self.get_user_color(guild_id, usr["id"])
 | 
					            usr["color"] = self.get_user_color(guild_id, usr["id"])
 | 
				
			||||||
 | 
					            print("test1.55")
 | 
				
			||||||
            if (usr["avatar"]):
 | 
					            if (usr["avatar"]):
 | 
				
			||||||
                usr["avatar_url"] = "https://cdn.discordapp.com/avatars/{}/{}.png".format(usr["id"], usr["avatar"])
 | 
					                usr["avatar_url"] = "https://cdn.discordapp.com/avatars/{}/{}.png".format(usr["id"], usr["avatar"])
 | 
				
			||||||
            usr["roles"] = json.loads(member.roles)
 | 
					            usr["roles"] = member["roles"]
 | 
				
			||||||
            usr["discordbotsorgvoted"] = bool(redis_store.get("DiscordBotsOrgVoted/" + str(member.user_id)))
 | 
					            usr["discordbotsorgvoted"] = bool(redis_store.get("DiscordBotsOrgVoted/" + str(member["id"])))
 | 
				
			||||||
 | 
					            print("test1.6")
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            member = db.session.query(GuildMembers).filter(GuildMembers.guild_id == guild_id, GuildMembers.nickname == name, GuildMembers.discriminator == discriminator).first()
 | 
					            print("test2")
 | 
				
			||||||
 | 
					            member = redisqueue.get_guild_member_named(guild_id, name)
 | 
				
			||||||
 | 
					            print("test3")
 | 
				
			||||||
            if member:
 | 
					            if member:
 | 
				
			||||||
                usr["id"] = str(member.user_id)
 | 
					                usr["id"] = str(member["id"])
 | 
				
			||||||
                usr["username"] = member.username
 | 
					                usr["username"] = member["username"]
 | 
				
			||||||
                usr["nickname"] = member.nickname
 | 
					                usr["nickname"] = member["nick"]
 | 
				
			||||||
                usr["avatar"] = member.avatar
 | 
					                usr["avatar"] = member["avatar"]
 | 
				
			||||||
                usr["color"] = self.get_user_color(guild_id, usr["id"])
 | 
					                usr["color"] = self.get_user_color(guild_id, usr["id"])
 | 
				
			||||||
                if (usr["avatar"]):
 | 
					                if (usr["avatar"]):
 | 
				
			||||||
                    usr["avatar_url"] = "https://cdn.discordapp.com/avatars/{}/{}.png".format(usr["id"], usr["avatar"])
 | 
					                    usr["avatar_url"] = "https://cdn.discordapp.com/avatars/{}/{}.png".format(usr["id"], usr["avatar"])
 | 
				
			||||||
                usr["roles"] = json.loads(member.roles)
 | 
					                usr["roles"] = member["roles"]
 | 
				
			||||||
                usr["discordbotsorgvoted"] = bool(redis_store.get("DiscordBotsOrgVoted/" + str(member.user_id)))
 | 
					                usr["discordbotsorgvoted"] = bool(redis_store.get("DiscordBotsOrgVoted/" + str(member["id"])))
 | 
				
			||||||
 | 
					        print("test4")
 | 
				
			||||||
        emit("lookup_user_info", usr)
 | 
					        emit("lookup_user_info", usr)
 | 
				
			||||||
        self.teardown_db_session()
 | 
					        self.teardown_db_session()
 | 
				
			||||||
@@ -6,7 +6,6 @@ from .guilds import Guilds
 | 
				
			|||||||
from .unauthenticated_users import UnauthenticatedUsers
 | 
					from .unauthenticated_users import UnauthenticatedUsers
 | 
				
			||||||
from .unauthenticated_bans import UnauthenticatedBans
 | 
					from .unauthenticated_bans import UnauthenticatedBans
 | 
				
			||||||
from .authenticated_users import AuthenticatedUsers
 | 
					from .authenticated_users import AuthenticatedUsers
 | 
				
			||||||
from .guild_members import GuildMembers, list_all_guild_members, get_guild_member
 | 
					 | 
				
			||||||
from .cosmetics import Cosmetics, set_badges, get_badges, add_badge, remove_badge
 | 
					from .cosmetics import Cosmetics, set_badges, get_badges, add_badge, remove_badge
 | 
				
			||||||
from .user_css import UserCSS
 | 
					from .user_css import UserCSS
 | 
				
			||||||
from .administrators import Administrators, get_administrators_list
 | 
					from .administrators import Administrators, get_administrators_list
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,48 +0,0 @@
 | 
				
			|||||||
from titanembeds.database import db
 | 
					 | 
				
			||||||
import json
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class GuildMembers(db.Model):
 | 
					 | 
				
			||||||
    __tablename__ = "guild_members"
 | 
					 | 
				
			||||||
    id = db.Column(db.Integer, primary_key=True)                    # Auto incremented id
 | 
					 | 
				
			||||||
    guild_id = db.Column(db.BigInteger, nullable=False)            # Discord guild id
 | 
					 | 
				
			||||||
    user_id = db.Column(db.BigInteger, nullable=False)             # Discord user id
 | 
					 | 
				
			||||||
    username = db.Column(db.String(255), nullable=False)            # Name
 | 
					 | 
				
			||||||
    discriminator = db.Column(db.Integer, nullable=False)           # User discriminator
 | 
					 | 
				
			||||||
    nickname = db.Column(db.String(255))                            # User nickname
 | 
					 | 
				
			||||||
    avatar = db.Column(db.String(255))                              # The avatar str of the user
 | 
					 | 
				
			||||||
    active = db.Column(db.Boolean(), nullable=False)                # If the user is a member of the guild
 | 
					 | 
				
			||||||
    banned = db.Column(db.Boolean(), nullable=False)                # If the user is banned in the guild
 | 
					 | 
				
			||||||
    roles = db.Column(db.Text(), nullable=False)                    # Member roles
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __init__(self, guild_id, user_id, username, discriminator, nickname, avatar, active, banned, roles):
 | 
					 | 
				
			||||||
        self.guild_id = guild_id
 | 
					 | 
				
			||||||
        self.user_id = user_id
 | 
					 | 
				
			||||||
        self.username = username
 | 
					 | 
				
			||||||
        self.discriminator = discriminator
 | 
					 | 
				
			||||||
        self.nickname = nickname
 | 
					 | 
				
			||||||
        self.avatar = avatar
 | 
					 | 
				
			||||||
        self.active = active
 | 
					 | 
				
			||||||
        self.banned = banned
 | 
					 | 
				
			||||||
        self.roles = roles
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __repr__(self):
 | 
					 | 
				
			||||||
        return '<GuildMembers {0} {1} {2} {3} {4}>'.format(self.id, self.guild_id, self.user_id, self.username, self.discriminator)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def list_all_guild_members(guild_id):
 | 
					 | 
				
			||||||
    memlist = []
 | 
					 | 
				
			||||||
    members = db.session.query(GuildMembers).filter(GuildMembers.guild_id == guild_id).all()
 | 
					 | 
				
			||||||
    for member in members:
 | 
					 | 
				
			||||||
        memlist.append({
 | 
					 | 
				
			||||||
            "user": {
 | 
					 | 
				
			||||||
                "username": member.username,
 | 
					 | 
				
			||||||
                "discriminator": member.discriminator,
 | 
					 | 
				
			||||||
                "id": member.user_id,
 | 
					 | 
				
			||||||
                "avatar": member.avatar
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            "roles": json.loads(member.roles),
 | 
					 | 
				
			||||||
            "nickname": member.nickname,
 | 
					 | 
				
			||||||
        })
 | 
					 | 
				
			||||||
    return memlist
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def get_guild_member(guild_id, member_id):
 | 
					 | 
				
			||||||
    return db.session.query(GuildMembers).filter(GuildMembers.guild_id == guild_id, GuildMembers.user_id == member_id).first()
 | 
					 | 
				
			||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
from titanembeds.utils import redis_store
 | 
					from titanembeds.utils import redis_store
 | 
				
			||||||
from titanembeds.database import get_guild_member
 | 
					 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -16,20 +15,21 @@ class RedisQueue:
 | 
				
			|||||||
            "params": params
 | 
					            "params": params
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        loop_count = 0
 | 
					        loop_count = 0
 | 
				
			||||||
        while not data and loop_count < 10:
 | 
					        while (not data and data != "") and loop_count < 50:
 | 
				
			||||||
            if loop_count % 5 == 0:
 | 
					            if loop_count % 25 == 0:
 | 
				
			||||||
                redis_store.publish("discord-api-req", json.dumps(payload))
 | 
					                redis_store.publish("discord-api-req", json.dumps(payload))
 | 
				
			||||||
            time.sleep(0.5)
 | 
					            time.sleep(0.1)
 | 
				
			||||||
            data = self._get(key, data_type)
 | 
					            data = self._get(key, data_type)
 | 
				
			||||||
            loop_count += 1
 | 
					            loop_count += 1
 | 
				
			||||||
        redis_store.expire(key, 60 * 5)
 | 
					        redis_store.expire(key, 60 * 5)
 | 
				
			||||||
        if data == None:
 | 
					        if data == None or data == "":
 | 
				
			||||||
            return None
 | 
					            return None
 | 
				
			||||||
        if data_type == "set":
 | 
					        if data_type == "set":
 | 
				
			||||||
            data = list(data)
 | 
					            data = list(data)
 | 
				
			||||||
            data_parsed = []
 | 
					            data_parsed = []
 | 
				
			||||||
            for d in data:
 | 
					            for d in data:
 | 
				
			||||||
                data_parsed.append(json.loads(d))
 | 
					                if d != "":
 | 
				
			||||||
 | 
					                    data_parsed.append(json.loads(d))
 | 
				
			||||||
            return data_parsed
 | 
					            return data_parsed
 | 
				
			||||||
        return json.loads(data)
 | 
					        return json.loads(data)
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -61,28 +61,51 @@ class RedisQueue:
 | 
				
			|||||||
                "embeds": x["embeds"],
 | 
					                "embeds": x["embeds"],
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if message["author"]["id"] not in guild_members:
 | 
					            if message["author"]["id"] not in guild_members:
 | 
				
			||||||
                member = get_guild_member(guild_id, message["author"]["id"])
 | 
					                member = self.get_guild_member(guild_id, message["author"]["id"])
 | 
				
			||||||
                guild_members[message["author"]["id"]] = member
 | 
					                guild_members[message["author"]["id"]] = member
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                member = guild_members[message["author"]["id"]]
 | 
					                member = guild_members[message["author"]["id"]]
 | 
				
			||||||
            message["author"]["nickname"] = None
 | 
					            message["author"]["nickname"] = None
 | 
				
			||||||
            if member:
 | 
					            if member:
 | 
				
			||||||
                message["author"]["nickname"] = member.nickname
 | 
					                message["author"]["nickname"] = member["nick"]
 | 
				
			||||||
                message["author"]["avatar"] = member.avatar
 | 
					                message["author"]["avatar"] = member["avatar"]
 | 
				
			||||||
                message["author"]["discriminator"] = member.discriminator
 | 
					                message["author"]["discriminator"] = member["discriminator"]
 | 
				
			||||||
                message["author"]["username"] = member.username
 | 
					                message["author"]["username"] = member["username"]
 | 
				
			||||||
            for mention in message["mentions"]:
 | 
					            for mention in message["mentions"]:
 | 
				
			||||||
                if mention["id"] not in guild_members:
 | 
					                if mention["id"] not in guild_members:
 | 
				
			||||||
                    author = get_guild_member(guild_id, mention["id"])
 | 
					                    author = self.get_guild_member(guild_id, mention["id"])
 | 
				
			||||||
                    guild_members[mention["id"]] = author
 | 
					                    guild_members[mention["id"]] = author
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    author = guild_members[mention["id"]]
 | 
					                    author = guild_members[mention["id"]]
 | 
				
			||||||
                mention["nickname"] = None
 | 
					                mention["nickname"] = None
 | 
				
			||||||
                if author:
 | 
					                if author:
 | 
				
			||||||
                    mention["nickname"] = author.nickname
 | 
					                    mention["nickname"] = author["nick"]
 | 
				
			||||||
                    mention["avatar"] = author.avatar
 | 
					                    mention["avatar"] = author["avatar"]
 | 
				
			||||||
                    mention["username"] = author.username
 | 
					                    mention["username"] = author["username"]
 | 
				
			||||||
                    mention["discriminator"] = author.discriminator
 | 
					                    mention["discriminator"] = author["discriminator"]
 | 
				
			||||||
            msgs.append(message)
 | 
					            msgs.append(message)
 | 
				
			||||||
        sorted_msgs = sorted(msgs, key=lambda k: k['id'], reverse=True) 
 | 
					        sorted_msgs = sorted(msgs, key=lambda k: k['id'], reverse=True) 
 | 
				
			||||||
        return sorted_msgs
 | 
					        return sorted_msgs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_guild_member(self, guild_id, user_id):
 | 
				
			||||||
 | 
					        key = "/guilds/{}/members/{}".format(guild_id, user_id)
 | 
				
			||||||
 | 
					        q = self.get(key, "get_guild_member", {"guild_id": guild_id, "user_id": user_id})
 | 
				
			||||||
 | 
					        return q
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def get_guild_member_named(self, guild_id, query):
 | 
				
			||||||
 | 
					        key = "/custom/guilds/{}/member_named/{}".format(guild_id, query)
 | 
				
			||||||
 | 
					        guild_member_id = self.get(key, "get_guild_member_named", {"guild_id": guild_id, "query": query})
 | 
				
			||||||
 | 
					        if guild_member_id:
 | 
				
			||||||
 | 
					            return self.get_guild_member(guild_id, guild_member_id["user_id"])
 | 
				
			||||||
 | 
					        return None
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def list_guild_members(self, guild_id):
 | 
				
			||||||
 | 
					        key = "/guilds/{}/members".format(guild_id)
 | 
				
			||||||
 | 
					        member_ids = self.get(key, "list_guild_members", {"guild_id": guild_id}, data_type="set")
 | 
				
			||||||
 | 
					        members = []
 | 
				
			||||||
 | 
					        for member_id in member_ids:
 | 
				
			||||||
 | 
					            usr_id = member_id["user_id"]
 | 
				
			||||||
 | 
					            member = self.get_guild_member(guild_id, usr_id)
 | 
				
			||||||
 | 
					            if member:
 | 
				
			||||||
 | 
					                members.append(member)
 | 
				
			||||||
 | 
					        return members
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
from titanembeds.database import db, Guilds, UnauthenticatedUsers, UnauthenticatedBans, AuthenticatedUsers, GuildMembers, get_guild_member
 | 
					from titanembeds.database import db, Guilds, UnauthenticatedUsers, UnauthenticatedBans, AuthenticatedUsers
 | 
				
			||||||
from titanembeds.constants import LANGUAGES
 | 
					from titanembeds.constants import LANGUAGES
 | 
				
			||||||
from flask import request, session
 | 
					from flask import request, session
 | 
				
			||||||
from flask_limiter import Limiter
 | 
					from flask_limiter import Limiter
 | 
				
			||||||
@@ -98,8 +98,8 @@ def checkUserRevoke(guild_id, user_key=None):
 | 
				
			|||||||
        banned = checkUserBanned(guild_id)
 | 
					        banned = checkUserBanned(guild_id)
 | 
				
			||||||
        if banned:
 | 
					        if banned:
 | 
				
			||||||
            return revoked
 | 
					            return revoked
 | 
				
			||||||
        dbUser = GuildMembers.query.filter(GuildMembers.guild_id == guild_id).filter(GuildMembers.user_id == session["user_id"]).first()
 | 
					        dbUser = redisqueue.get_guild_member(guild_id, session["user_id"])
 | 
				
			||||||
        revoked = not dbUser or not dbUser.active
 | 
					        revoked = not dbUser
 | 
				
			||||||
    return revoked
 | 
					    return revoked
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
def checkUserBanned(guild_id, ip_address=None):
 | 
					def checkUserBanned(guild_id, ip_address=None):
 | 
				
			||||||
@@ -114,11 +114,9 @@ def checkUserBanned(guild_id, ip_address=None):
 | 
				
			|||||||
                    banned = False
 | 
					                    banned = False
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        banned = False
 | 
					        banned = False
 | 
				
			||||||
        dbUser = GuildMembers.query.filter(GuildMembers.guild_id == guild_id).filter(GuildMembers.user_id == session["user_id"]).first()
 | 
					        #dbUser = redisqueue.get_guild_member(guild_id, session["user_id"])
 | 
				
			||||||
        if not dbUser:
 | 
					        #if not dbUser:
 | 
				
			||||||
            banned = False
 | 
					        #    banned = True # TODO: Figure out ban logic with guild member
 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            banned = dbUser.banned
 | 
					 | 
				
			||||||
    return banned
 | 
					    return banned
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from titanembeds.oauth import check_user_can_administrate_guild, user_has_permission
 | 
					from titanembeds.oauth import check_user_can_administrate_guild, user_has_permission
 | 
				
			||||||
@@ -163,9 +161,9 @@ def update_user_status(guild_id, username, user_key=None):
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        if status['banned'] or status['revoked']:
 | 
					        if status['banned'] or status['revoked']:
 | 
				
			||||||
            return status
 | 
					            return status
 | 
				
			||||||
        dbMember = get_guild_member(guild_id, status["user_id"])
 | 
					        dbMember = redisqueue.get_guild_member(guild_id, status["user_id"])
 | 
				
			||||||
        if dbMember:
 | 
					        if dbMember:
 | 
				
			||||||
            status["nickname"] = dbMember.nickname
 | 
					            status["nickname"] = dbMember["nick"]
 | 
				
			||||||
        bump_user_presence_timestamp(guild_id, "AuthenticatedUsers", status["user_id"])
 | 
					        bump_user_presence_timestamp(guild_id, "AuthenticatedUsers", status["user_id"])
 | 
				
			||||||
    return status
 | 
					    return status
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -195,18 +193,8 @@ def check_user_in_guild(guild_id):
 | 
				
			|||||||
        return dbUser is not None and not checkUserRevoke(guild_id)
 | 
					        return dbUser is not None and not checkUserRevoke(guild_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_member_roles(guild_id, user_id):
 | 
					def get_member_roles(guild_id, user_id):
 | 
				
			||||||
    q = db.session.query(GuildMembers).filter(GuildMembers.guild_id == guild_id).filter(GuildMembers.user_id == user_id).first()
 | 
					    q = redisqueue.get_guild_member(guild_id, user_id)
 | 
				
			||||||
    roles = [guild_id]
 | 
					    return q["roles"]
 | 
				
			||||||
    if not q:
 | 
					 | 
				
			||||||
        member = discord_api.get_guild_member(guild_id, user_id)
 | 
					 | 
				
			||||||
        if member["success"]:
 | 
					 | 
				
			||||||
            roles = member["content"]["roles"]
 | 
					 | 
				
			||||||
            member = GuildMembers(guild_id, user_id, member["content"]["user"]["username"], int(member["content"]["user"]["discriminator"]), member["content"].get("nick", None), member["content"]["user"]["avatar"], True, False, json.dumps(roles))
 | 
					 | 
				
			||||||
            db.session.add(member)
 | 
					 | 
				
			||||||
            db.session.commit()
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        roles = json.loads(q.roles)
 | 
					 | 
				
			||||||
    return roles
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_guild_channels(guild_id, force_everyone=False):
 | 
					def get_guild_channels(guild_id, force_everyone=False):
 | 
				
			||||||
    if user_unauthenticated() or force_everyone:
 | 
					    if user_unauthenticated() or force_everyone:
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user