mirror of
				https://github.com/TitanEmbeds/Titan.git
				synced 2025-11-04 07:47:10 +01:00 
			
		
		
		
	Move columns found in discord api on the guilds table into redis
This commit is contained in:
		@@ -155,10 +155,15 @@ def prepare_guild_members_list(members, bans):
 | 
			
		||||
@admin.route("/administrate_guild/<guild_id>", methods=["GET"])
 | 
			
		||||
@is_admin
 | 
			
		||||
def administrate_guild(guild_id):
 | 
			
		||||
    guild = redisqueue.get_guild(guild_id)
 | 
			
		||||
    if not guild:
 | 
			
		||||
        abort(404)
 | 
			
		||||
        return
 | 
			
		||||
    db_guild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
			
		||||
    if not db_guild:
 | 
			
		||||
        abort(500)
 | 
			
		||||
        return
 | 
			
		||||
        db_guild = Guilds(guild["id"])
 | 
			
		||||
        db.session.add(db_guild)
 | 
			
		||||
        db.session.commit()
 | 
			
		||||
    session["redirect"] = None
 | 
			
		||||
    cosmetics = db.session.query(Cosmetics).filter(Cosmetics.user_id == session['user_id']).first()
 | 
			
		||||
    permissions=[]
 | 
			
		||||
@@ -169,8 +174,8 @@ def administrate_guild(guild_id):
 | 
			
		||||
    all_bans = db.session.query(UnauthenticatedBans).filter(UnauthenticatedBans.guild_id == guild_id).all()
 | 
			
		||||
    users = prepare_guild_members_list(all_members, all_bans)
 | 
			
		||||
    dbguild_dict = {
 | 
			
		||||
        "id": db_guild.guild_id,
 | 
			
		||||
        "name": db_guild.name,
 | 
			
		||||
        "id": guild["id"],
 | 
			
		||||
        "name": guild["name"],
 | 
			
		||||
        "unauth_users": db_guild.unauth_users,
 | 
			
		||||
        "visitor_view": db_guild.visitor_view,
 | 
			
		||||
        "webhook_messages": db_guild.webhook_messages,
 | 
			
		||||
@@ -178,7 +183,7 @@ def administrate_guild(guild_id):
 | 
			
		||||
        "bracket_links": db_guild.bracket_links,
 | 
			
		||||
        "mentions_limit": db_guild.mentions_limit,
 | 
			
		||||
        "unauth_captcha": db_guild.unauth_captcha,
 | 
			
		||||
        "icon": db_guild.icon,
 | 
			
		||||
        "icon": guild["icon"],
 | 
			
		||||
        "invite_link": db_guild.invite_link if db_guild.invite_link != None else "",
 | 
			
		||||
        "guest_icon": db_guild.guest_icon if db_guild.guest_icon != None else "",
 | 
			
		||||
        "post_timeout": db_guild.post_timeout,
 | 
			
		||||
 
 | 
			
		||||
@@ -104,7 +104,7 @@ def get_online_discord_users(guild_id, embed):
 | 
			
		||||
    apimembers_filtered = {}
 | 
			
		||||
    for member in apimembers:
 | 
			
		||||
        apimembers_filtered[int(member["id"])] = member
 | 
			
		||||
    guild_roles = json.loads(db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first().roles)
 | 
			
		||||
    guild_roles = redisqueue.get_guild(guild_id)["roles"]
 | 
			
		||||
    guildroles_filtered = {}
 | 
			
		||||
    for role in guild_roles:
 | 
			
		||||
        guildroles_filtered[role["id"]] = role
 | 
			
		||||
@@ -144,19 +144,17 @@ def get_online_embed_users(guild_id):
 | 
			
		||||
    return users
 | 
			
		||||
 | 
			
		||||
def get_guild_emojis(guild_id):
 | 
			
		||||
    dbguild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
			
		||||
    return json.loads(dbguild.emojis)
 | 
			
		||||
    return redisqueue.get_guild(guild_id)["emojis"]
 | 
			
		||||
 | 
			
		||||
def get_guild_roles(guild_id):
 | 
			
		||||
    dbguild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
			
		||||
    return json.loads(dbguild.roles)
 | 
			
		||||
    return redisqueue.get_guild(guild_id)["roles"]
 | 
			
		||||
 | 
			
		||||
# Returns webhook url if exists and can post w/webhooks, otherwise None
 | 
			
		||||
def get_channel_webhook_url(guild_id, channel_id):
 | 
			
		||||
    if not guild_webhooks_enabled(guild_id):
 | 
			
		||||
        return None
 | 
			
		||||
    dbguild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
			
		||||
    guild_webhooks = json.loads(dbguild.webhooks)
 | 
			
		||||
    guild = redisqueue.get_guild(guild_id)
 | 
			
		||||
    guild_webhooks = guild["webhooks"]
 | 
			
		||||
    name = "[Titan] "
 | 
			
		||||
    username = session["username"]
 | 
			
		||||
    if len(username) > 19:
 | 
			
		||||
@@ -517,8 +515,7 @@ def user_info(guild_id, user_id):
 | 
			
		||||
        usr["avatar"] = member["avatar"]
 | 
			
		||||
        usr["avatar_url"] = generate_avatar_url(usr["id"], usr["avatar"], usr["discriminator"], True)
 | 
			
		||||
        roles = get_member_roles(guild_id, user_id)
 | 
			
		||||
        dbguild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
			
		||||
        guild_roles = json.loads(dbguild.roles)
 | 
			
		||||
        guild_roles = redisqueue.get_guild(guild_id)["roles"]
 | 
			
		||||
        for r in roles:
 | 
			
		||||
            for gr in guild_roles:
 | 
			
		||||
                if gr["id"] == r:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
from flask import Blueprint, render_template, abort, redirect, url_for, session, request
 | 
			
		||||
from flask_babel import gettext
 | 
			
		||||
from titanembeds.utils import check_guild_existance, guild_query_unauth_users_bool, guild_accepts_visitors, guild_unauthcaptcha_enabled, is_int
 | 
			
		||||
from titanembeds.utils import check_guild_existance, guild_query_unauth_users_bool, guild_accepts_visitors, guild_unauthcaptcha_enabled, is_int, redisqueue
 | 
			
		||||
from titanembeds.oauth import generate_guild_icon_url, generate_avatar_url
 | 
			
		||||
from titanembeds.database import db, Guilds, UserCSS, list_disabled_guilds
 | 
			
		||||
from config import config
 | 
			
		||||
@@ -64,15 +64,16 @@ def parse_url_domain(url):
 | 
			
		||||
@embed.route("/<int:guild_id>")
 | 
			
		||||
def guild_embed(guild_id):
 | 
			
		||||
    if check_guild_existance(guild_id):
 | 
			
		||||
        guild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
			
		||||
        guild = redisqueue.get_guild(guild_id)
 | 
			
		||||
        dbguild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
			
		||||
        guild_dict = {
 | 
			
		||||
            "id": guild.guild_id,
 | 
			
		||||
            "name": guild.name,
 | 
			
		||||
            "unauth_users": guild.unauth_users,
 | 
			
		||||
            "icon": guild.icon,
 | 
			
		||||
            "invite_link": guild.invite_link,
 | 
			
		||||
            "invite_domain": parse_url_domain(guild.invite_link),
 | 
			
		||||
            "post_timeout": guild.post_timeout,
 | 
			
		||||
            "id": guild["id"],
 | 
			
		||||
            "name": guild["name"],
 | 
			
		||||
            "unauth_users": dbguild.unauth_users,
 | 
			
		||||
            "icon": guild["icon"],
 | 
			
		||||
            "invite_link": dbguild.invite_link,
 | 
			
		||||
            "invite_domain": parse_url_domain(dbguild.invite_link),
 | 
			
		||||
            "post_timeout": dbguild.post_timeout,
 | 
			
		||||
        }
 | 
			
		||||
        customcss = get_custom_css()
 | 
			
		||||
        return render_template("embed.html.j2",
 | 
			
		||||
 
 | 
			
		||||
@@ -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, redisqueue
 | 
			
		||||
from titanembeds.database import db, Guilds
 | 
			
		||||
from titanembeds.database import db
 | 
			
		||||
from flask_socketio import Namespace, emit, disconnect, join_room, leave_room
 | 
			
		||||
import functools
 | 
			
		||||
from flask import request, session
 | 
			
		||||
@@ -57,8 +57,7 @@ class Gateway(Namespace):
 | 
			
		||||
                msg = {"unauthenticated": False, "id": str(session["user_id"])}
 | 
			
		||||
            emit("embed_user_disconnect", msg, room="GUILD_"+guild_id)
 | 
			
		||||
            if guild_webhooks_enabled(guild_id): # Delete webhooks
 | 
			
		||||
                dbguild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
			
		||||
                guild_webhooks = json.loads(dbguild.webhooks)
 | 
			
		||||
                guild_webhooks = redisqueue.get_guild(guild_id)["webhooks"]
 | 
			
		||||
                name = "[Titan] "
 | 
			
		||||
                username = session["username"]
 | 
			
		||||
                if len(username) > 19:
 | 
			
		||||
@@ -128,7 +127,7 @@ class Gateway(Namespace):
 | 
			
		||||
        member = redisqueue.get_guild_member(guild_id, user_id)
 | 
			
		||||
        if not member:
 | 
			
		||||
            return None
 | 
			
		||||
        guild_roles = json.loads(db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first().roles)
 | 
			
		||||
        guild_roles = redisqueue.get_guild(guild_id)["roles"]
 | 
			
		||||
        guildroles_filtered = {}
 | 
			
		||||
        for role in guild_roles:
 | 
			
		||||
            guildroles_filtered[role["id"]] = role
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@ from config import config
 | 
			
		||||
from titanembeds.decorators import discord_users_only
 | 
			
		||||
from titanembeds.database import db, Guilds, UnauthenticatedUsers, UnauthenticatedBans, Cosmetics, UserCSS, Patreon, set_titan_token, get_titan_token, add_badge, list_disabled_guilds
 | 
			
		||||
from titanembeds.oauth import authorize_url, token_url, make_authenticated_session, get_current_authenticated_user, get_user_managed_servers, check_user_can_administrate_guild, check_user_permission, generate_avatar_url, generate_guild_icon_url, generate_bot_invite_url
 | 
			
		||||
from titanembeds.utils import redisqueue
 | 
			
		||||
import time
 | 
			
		||||
import datetime
 | 
			
		||||
import paypalrestsdk
 | 
			
		||||
@@ -188,11 +189,16 @@ def edit_custom_css_delete(css_id):
 | 
			
		||||
def administrate_guild(guild_id):
 | 
			
		||||
    if not check_user_can_administrate_guild(guild_id):
 | 
			
		||||
        return redirect(url_for("user.dashboard"))
 | 
			
		||||
    db_guild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
			
		||||
    if not db_guild:
 | 
			
		||||
    guild = redisqueue.get_guild(guild_id)
 | 
			
		||||
    if not guild:
 | 
			
		||||
        session["redirect"] = url_for("user.administrate_guild", guild_id=guild_id, _external=True)
 | 
			
		||||
        return redirect(url_for("user.add_bot", guild_id=guild_id))
 | 
			
		||||
    session["redirect"] = None
 | 
			
		||||
    db_guild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
			
		||||
    if not db_guild:
 | 
			
		||||
        db_guild = Guilds(guild["id"])
 | 
			
		||||
        db.session.add(db_guild)
 | 
			
		||||
        db.session.commit()
 | 
			
		||||
    permissions=[]
 | 
			
		||||
    if check_user_permission(guild_id, 5):
 | 
			
		||||
        permissions.append("Manage Embed Settings")
 | 
			
		||||
@@ -206,7 +212,7 @@ def administrate_guild(guild_id):
 | 
			
		||||
    users = prepare_guild_members_list(all_members, all_bans)
 | 
			
		||||
    dbguild_dict = {
 | 
			
		||||
        "id": db_guild.guild_id,
 | 
			
		||||
        "name": db_guild.name,
 | 
			
		||||
        "name": guild["name"],
 | 
			
		||||
        "unauth_users": db_guild.unauth_users,
 | 
			
		||||
        "visitor_view": db_guild.visitor_view,
 | 
			
		||||
        "webhook_messages": db_guild.webhook_messages,
 | 
			
		||||
@@ -214,7 +220,7 @@ def administrate_guild(guild_id):
 | 
			
		||||
        "bracket_links": db_guild.bracket_links,
 | 
			
		||||
        "mentions_limit": db_guild.mentions_limit,
 | 
			
		||||
        "unauth_captcha": db_guild.unauth_captcha,
 | 
			
		||||
        "icon": db_guild.icon,
 | 
			
		||||
        "icon": guild["icon"],
 | 
			
		||||
        "invite_link": db_guild.invite_link if db_guild.invite_link != None else "",
 | 
			
		||||
        "guest_icon": db_guild.guest_icon if db_guild.guest_icon != None else "",
 | 
			
		||||
        "post_timeout": db_guild.post_timeout,
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ from titanembeds.database import db
 | 
			
		||||
class Guilds(db.Model):
 | 
			
		||||
    __tablename__ = "guilds"
 | 
			
		||||
    guild_id = db.Column(db.BigInteger, nullable=False, primary_key=True)       # Discord guild id
 | 
			
		||||
    name = db.Column(db.String(255), nullable=False)                            # Name
 | 
			
		||||
    unauth_users = db.Column(db.Boolean(), nullable=False, default=1)           # If allowed unauth users
 | 
			
		||||
    visitor_view = db.Column(db.Boolean(), nullable=False, default=0)           # If users are automatically "signed in" and can view chat
 | 
			
		||||
    webhook_messages = db.Column(db.Boolean(), nullable=False, default=0)       # Use webhooks to send messages instead of the bot
 | 
			
		||||
@@ -12,12 +11,6 @@ class Guilds(db.Model):
 | 
			
		||||
    bracket_links = db.Column(db.Boolean(), nullable=False, default=1)          # If appending brackets to links to prevent embed
 | 
			
		||||
    unauth_captcha = db.Column(db.Boolean(), nullable=False, server_default="1")# Enforce captcha on guest users
 | 
			
		||||
    mentions_limit = db.Column(db.Integer, nullable=False, default=11)          # If there is a limit on the number of mentions in a msg
 | 
			
		||||
    roles = db.Column(db.Text().with_variant(db.Text(4294967295), 'mysql'), nullable=False)                      # Guild Roles
 | 
			
		||||
    channels = db.Column(db.Text().with_variant(db.Text(4294967295), 'mysql'), nullable=False)                   # Guild channels
 | 
			
		||||
    webhooks = db.Column(db.Text().with_variant(db.Text(4294967295), 'mysql'), nullable=False)                   # Guild webhooks
 | 
			
		||||
    emojis = db.Column(db.Text().with_variant(db.Text(4294967295), 'mysql'), nullable=False)                     # Guild Emojis
 | 
			
		||||
    owner_id = db.Column(db.BigInteger, nullable=False)                        # Snowflake of the owner
 | 
			
		||||
    icon = db.Column(db.String(255))                                            # The icon string, null if none
 | 
			
		||||
    invite_link = db.Column(db.String(255))                                     # Custom Discord Invite Link
 | 
			
		||||
    post_timeout = db.Column(db.Integer, nullable=False, server_default="5")    # Seconds to elapse before another message can be posted from the widget
 | 
			
		||||
    max_message_length = db.Column(db.Integer, nullable=False, server_default="300") # Chars length the message should be before being rejected by the server
 | 
			
		||||
@@ -25,9 +18,8 @@ class Guilds(db.Model):
 | 
			
		||||
    banned_words_global_included = db.Column(db.Boolean(), nullable=False, server_default="0") # Add global banned words to the list
 | 
			
		||||
    banned_words = db.Column(db.Text(), nullable=False, server_default="[]")    # JSON list of strings to block from sending
 | 
			
		||||
 | 
			
		||||
    def __init__(self, guild_id, name, roles, channels, webhooks, emojis, owner_id, icon):
 | 
			
		||||
    def __init__(self, guild_id):
 | 
			
		||||
        self.guild_id = guild_id
 | 
			
		||||
        self.name = name
 | 
			
		||||
        self.unauth_users = True # defaults to true
 | 
			
		||||
        self.visitor_view = False
 | 
			
		||||
        self.webhook_messages = False
 | 
			
		||||
@@ -36,12 +28,6 @@ class Guilds(db.Model):
 | 
			
		||||
        self.bracket_links = True
 | 
			
		||||
        self.unauth_captcha = True
 | 
			
		||||
        self.mentions_limit = -1 # -1 = unlimited mentions
 | 
			
		||||
        self.roles = roles
 | 
			
		||||
        self.channels = channels
 | 
			
		||||
        self.webhooks = webhooks
 | 
			
		||||
        self.emojis = emojis
 | 
			
		||||
        self.owner_id = owner_id
 | 
			
		||||
        self.icon = icon
 | 
			
		||||
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
        return '<Guilds {0} {1}>'.format(self.id, self.guild_id)
 | 
			
		||||
 
 | 
			
		||||
@@ -108,4 +108,9 @@ class RedisQueue:
 | 
			
		||||
            member = self.get_guild_member(guild_id, usr_id)
 | 
			
		||||
            if member:
 | 
			
		||||
                members.append(member)
 | 
			
		||||
        return members
 | 
			
		||||
        return members
 | 
			
		||||
    
 | 
			
		||||
    def get_guild(self, guild_id):
 | 
			
		||||
        key = "/guilds/{}".format(guild_id)
 | 
			
		||||
        q = self.get(key, "get_guild", {"guild_id": guild_id})
 | 
			
		||||
        return q
 | 
			
		||||
@@ -70,8 +70,8 @@ def guild_ratelimit_key():
 | 
			
		||||
    return (ip + guild_id)
 | 
			
		||||
 | 
			
		||||
def check_guild_existance(guild_id):
 | 
			
		||||
    dbGuild = Guilds.query.filter_by(guild_id=guild_id).first()
 | 
			
		||||
    if not dbGuild:
 | 
			
		||||
    guild = redisqueue.get_guild(guild_id)
 | 
			
		||||
    if not guild:
 | 
			
		||||
        return False
 | 
			
		||||
    else:
 | 
			
		||||
        return True
 | 
			
		||||
@@ -210,10 +210,10 @@ def get_guild_channels(guild_id, force_everyone=False):
 | 
			
		||||
    bot_member_roles = get_member_roles(guild_id, config["client-id"])
 | 
			
		||||
    if guild_id not in bot_member_roles:
 | 
			
		||||
        bot_member_roles.append(guild_id)
 | 
			
		||||
    dbguild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
			
		||||
    guild_channels = json.loads(dbguild.channels)
 | 
			
		||||
    guild_roles = json.loads(dbguild.roles)
 | 
			
		||||
    guild_owner = str(dbguild.owner_id)
 | 
			
		||||
    guild = redisqueue.get_guild(guild_id)
 | 
			
		||||
    guild_channels = guild["channels"]
 | 
			
		||||
    guild_roles = guild["roles"]
 | 
			
		||||
    guild_owner = guild["owner_id"]
 | 
			
		||||
    result_channels = []
 | 
			
		||||
    for channel in guild_channels:
 | 
			
		||||
        if channel['type'] in ["text", "category"]:
 | 
			
		||||
@@ -293,13 +293,13 @@ def get_channel_permission(channel, guild_id, guild_owner, guild_roles, member_r
 | 
			
		||||
    
 | 
			
		||||
def bot_can_create_webhooks(guild):
 | 
			
		||||
    perm = 0
 | 
			
		||||
    guild_roles = json.loads(guild.roles)
 | 
			
		||||
    guild_roles = guild["roles"]
 | 
			
		||||
    # @everyone
 | 
			
		||||
    for role in guild_roles:
 | 
			
		||||
        if role["id"] == guild.guild_id:
 | 
			
		||||
        if role["id"] == guild["id"]:
 | 
			
		||||
            perm |= role["permissions"]
 | 
			
		||||
            continue
 | 
			
		||||
    member_roles = get_member_roles(guild.guild_id, config["client-id"])
 | 
			
		||||
    member_roles = get_member_roles(guild["id"], config["client-id"])
 | 
			
		||||
    # User Guild Roles
 | 
			
		||||
    for m_role in member_roles:
 | 
			
		||||
        for g_role in guild_roles:
 | 
			
		||||
@@ -314,7 +314,8 @@ def guild_webhooks_enabled(guild_id):
 | 
			
		||||
    dbguild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
			
		||||
    if not dbguild.webhook_messages:
 | 
			
		||||
        return False
 | 
			
		||||
    return bot_can_create_webhooks(dbguild)
 | 
			
		||||
    guild = redisqueue.get_guild(guild_id)
 | 
			
		||||
    return bot_can_create_webhooks(guild)
 | 
			
		||||
 | 
			
		||||
def guild_unauthcaptcha_enabled(guild_id):
 | 
			
		||||
    dbguild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user