mirror of
https://github.com/TitanEmbeds/Titan.git
synced 2024-11-15 02:21:21 +01:00
Merge pull request #19 from EndenDragon/visitorsview
Implemented Visitor View
This commit is contained in:
commit
5610197041
@ -6,6 +6,7 @@ class Guilds(Base):
|
|||||||
guild_id = db.Column(db.String(255)) # Discord guild id
|
guild_id = db.Column(db.String(255)) # Discord guild id
|
||||||
name = db.Column(db.String(255)) # Name
|
name = db.Column(db.String(255)) # Name
|
||||||
unauth_users = db.Column(db.Boolean()) # If allowed unauth users
|
unauth_users = db.Column(db.Boolean()) # If allowed unauth users
|
||||||
|
visitor_view = db.Column(db.Boolean()) # If users are automatically "signed in" and can view chat
|
||||||
chat_links = db.Column(db.Boolean()) # If users can post links
|
chat_links = db.Column(db.Boolean()) # If users can post links
|
||||||
bracket_links = db.Column(db.Boolean()) # If appending brackets to links to prevent embed
|
bracket_links = db.Column(db.Boolean()) # If appending brackets to links to prevent embed
|
||||||
mentions_limit = db.Column(db.Integer) # If there is a limit on the number of mentions in a msg
|
mentions_limit = db.Column(db.Integer) # If there is a limit on the number of mentions in a msg
|
||||||
@ -20,6 +21,7 @@ class Guilds(Base):
|
|||||||
self.guild_id = guild_id
|
self.guild_id = guild_id
|
||||||
self.name = name
|
self.name = name
|
||||||
self.unauth_users = True # defaults to true
|
self.unauth_users = True # defaults to true
|
||||||
|
self.visitor_view = False
|
||||||
self.chat_links = True
|
self.chat_links = True
|
||||||
self.bracket_links = True
|
self.bracket_links = True
|
||||||
self.mentions_limit = -1 # -1 = unlimited mentions
|
self.mentions_limit = -1 # -1 = unlimited mentions
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
"""Added visitor view column to guilds table
|
||||||
|
|
||||||
|
Revision ID: b1124468bb2e
|
||||||
|
Revises: 95ab6a63135d
|
||||||
|
Create Date: 2017-06-08 06:31:28.953304
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = 'b1124468bb2e'
|
||||||
|
down_revision = '95ab6a63135d'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.add_column('guilds', sa.Column('visitor_view', sa.Boolean(), nullable=False))
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.drop_column('guilds', 'visitor_view')
|
||||||
|
# ### end Alembic commands ###
|
@ -1,6 +1,6 @@
|
|||||||
from titanembeds.database import db, Guilds, UnauthenticatedUsers, UnauthenticatedBans, AuthenticatedUsers, KeyValueProperties, GuildMembers, Messages, get_channel_messages, list_all_guild_members
|
from titanembeds.database import db, Guilds, UnauthenticatedUsers, UnauthenticatedBans, AuthenticatedUsers, KeyValueProperties, GuildMembers, Messages, get_channel_messages, list_all_guild_members
|
||||||
from titanembeds.decorators import valid_session_required, discord_users_only
|
from titanembeds.decorators import valid_session_required, discord_users_only
|
||||||
from titanembeds.utils import check_guild_existance, guild_query_unauth_users_bool, get_client_ipaddr, discord_api, rate_limiter, channel_ratelimit_key, guild_ratelimit_key
|
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
|
||||||
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
|
||||||
from flask import Blueprint, abort, jsonify, session, request
|
from flask import Blueprint, abort, jsonify, session, request
|
||||||
from sqlalchemy import and_
|
from sqlalchemy import and_
|
||||||
@ -162,8 +162,8 @@ def get_dbguild_channels(guild_id):
|
|||||||
q = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
|
q = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
|
||||||
return json.loads(q.channels)
|
return json.loads(q.channels)
|
||||||
|
|
||||||
def get_guild_channels(guild_id):
|
def get_guild_channels(guild_id, force_everyone=False):
|
||||||
if user_unauthenticated():
|
if user_unauthenticated() or force_everyone:
|
||||||
member_roles = [guild_id] #equivilant to @everyone role
|
member_roles = [guild_id] #equivilant to @everyone role
|
||||||
else:
|
else:
|
||||||
member_roles = get_member_roles(guild_id, session['user_id'])
|
member_roles = get_member_roles(guild_id, session['user_id'])
|
||||||
@ -177,7 +177,7 @@ def get_guild_channels(guild_id):
|
|||||||
for channel in guild_channels:
|
for channel in guild_channels:
|
||||||
if channel['type'] == "text":
|
if channel['type'] == "text":
|
||||||
result = {"channel": channel, "read": False, "write": False, "mention_everyone": False}
|
result = {"channel": channel, "read": False, "write": False, "mention_everyone": False}
|
||||||
if guild_owner == session['user_id']:
|
if guild_owner == session.get("user_id"):
|
||||||
result["read"] = True
|
result["read"] = True
|
||||||
result["write"] = True
|
result["write"] = True
|
||||||
result["mention_everyone"] = True
|
result["mention_everyone"] = True
|
||||||
@ -219,7 +219,7 @@ def get_guild_channels(guild_id):
|
|||||||
|
|
||||||
# member specific
|
# member specific
|
||||||
for overwrite in channel["permission_overwrites"]:
|
for overwrite in channel["permission_overwrites"]:
|
||||||
if overwrite["type"] == "member" and overwrite["id"] == session["user_id"]:
|
if overwrite["type"] == "member" and overwrite["id"] == session.get("user_id"):
|
||||||
channel_perm = (channel_perm & ~overwrite['deny']) | overwrite['allow']
|
channel_perm = (channel_perm & ~overwrite['deny']) | overwrite['allow']
|
||||||
break
|
break
|
||||||
|
|
||||||
@ -240,8 +240,8 @@ def get_guild_channels(guild_id):
|
|||||||
result_channels.append(result)
|
result_channels.append(result)
|
||||||
return sorted(result_channels, key=lambda k: k['channel']['position'])
|
return sorted(result_channels, key=lambda k: k['channel']['position'])
|
||||||
|
|
||||||
def filter_guild_channel(guild_id, channel_id):
|
def filter_guild_channel(guild_id, channel_id, force_everyone=False):
|
||||||
channels = get_guild_channels(guild_id)
|
channels = get_guild_channels(guild_id, force_everyone)
|
||||||
for chan in channels:
|
for chan in channels:
|
||||||
if chan["channel"]["id"] == channel_id:
|
if chan["channel"]["id"] == channel_id:
|
||||||
return chan
|
return chan
|
||||||
@ -327,6 +327,25 @@ def fetch():
|
|||||||
response.status_code = status_code
|
response.status_code = status_code
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
@api.route("/fetch_visitor", methods=["GET"])
|
||||||
|
@rate_limiter.limit("2 per 2 second", key_func = channel_ratelimit_key)
|
||||||
|
def fetch_visitor():
|
||||||
|
guild_id = request.args.get("guild_id")
|
||||||
|
channel_id = request.args.get('channel_id')
|
||||||
|
after_snowflake = request.args.get('after', None, type=int)
|
||||||
|
if not guild_accepts_visitors(guild_id):
|
||||||
|
abort(403)
|
||||||
|
messages = {}
|
||||||
|
chan = filter_guild_channel(guild_id, channel_id, True)
|
||||||
|
if not chan.get("read"):
|
||||||
|
status_code = 401
|
||||||
|
else:
|
||||||
|
messages = get_channel_messages(channel_id, after_snowflake)
|
||||||
|
status_code = 200
|
||||||
|
response = jsonify(messages=messages)
|
||||||
|
response.status_code = status_code
|
||||||
|
return response
|
||||||
|
|
||||||
@api.route("/post", methods=["POST"])
|
@api.route("/post", methods=["POST"])
|
||||||
@valid_session_required(api=True)
|
@valid_session_required(api=True)
|
||||||
@rate_limiter.limit("1 per 10 second", key_func = channel_ratelimit_key)
|
@rate_limiter.limit("1 per 10 second", key_func = channel_ratelimit_key)
|
||||||
@ -393,21 +412,36 @@ def create_unauthenticated_user():
|
|||||||
response.status_code = 403
|
response.status_code = 403
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
def process_query_guild(guild_id, visitor=False):
|
||||||
|
widget = discord_api.get_widget(guild_id)
|
||||||
|
channels = get_guild_channels(guild_id, visitor)
|
||||||
|
discordmembers = get_online_discord_users(guild_id, widget)
|
||||||
|
embedmembers = get_online_embed_users(guild_id)
|
||||||
|
emojis = get_guild_emojis(guild_id)
|
||||||
|
if visitor:
|
||||||
|
for channel in channels:
|
||||||
|
channel["write"] = False
|
||||||
|
return jsonify(channels=channels, discordmembers=discordmembers, embedmembers=embedmembers, emojis=emojis, instant_invite=widget.get("instant_invite"))
|
||||||
|
|
||||||
@api.route("/query_guild", methods=["GET"])
|
@api.route("/query_guild", methods=["GET"])
|
||||||
@valid_session_required(api=True)
|
@valid_session_required(api=True)
|
||||||
def query_guild():
|
def query_guild():
|
||||||
guild_id = request.args.get('guild_id')
|
guild_id = request.args.get('guild_id')
|
||||||
if check_guild_existance(guild_id):
|
if check_guild_existance(guild_id):
|
||||||
if check_user_in_guild(guild_id):
|
if check_user_in_guild(guild_id):
|
||||||
widget = discord_api.get_widget(guild_id)
|
return process_query_guild(guild_id)
|
||||||
channels = get_guild_channels(guild_id)
|
|
||||||
discordmembers = get_online_discord_users(guild_id, widget)
|
|
||||||
embedmembers = get_online_embed_users(guild_id)
|
|
||||||
emojis = get_guild_emojis(guild_id)
|
|
||||||
return jsonify(channels=channels, discordmembers=discordmembers, embedmembers=embedmembers, emojis=emojis, instant_invite=widget.get("instant_invite"))
|
|
||||||
abort(403)
|
abort(403)
|
||||||
abort(404)
|
abort(404)
|
||||||
|
|
||||||
|
@api.route("/query_guild_visitor", methods=["GET"])
|
||||||
|
def query_guild_visitor():
|
||||||
|
guild_id = request.args.get('guild_id')
|
||||||
|
if check_guild_existance(guild_id):
|
||||||
|
if not guild_accepts_visitors(guild_id):
|
||||||
|
abort(403)
|
||||||
|
return process_query_guild(guild_id, True)
|
||||||
|
abort(404)
|
||||||
|
|
||||||
@api.route("/create_authenticated_user", methods=["POST"])
|
@api.route("/create_authenticated_user", methods=["POST"])
|
||||||
@discord_users_only(api=True)
|
@discord_users_only(api=True)
|
||||||
def create_authenticated_user():
|
def create_authenticated_user():
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
from flask import Blueprint, render_template, abort, redirect, url_for, session, request
|
from flask import Blueprint, render_template, abort, redirect, url_for, session, request
|
||||||
from titanembeds.utils import check_guild_existance, guild_query_unauth_users_bool
|
from titanembeds.utils import check_guild_existance, guild_query_unauth_users_bool, guild_accepts_visitors
|
||||||
from titanembeds.oauth import generate_guild_icon_url, generate_avatar_url
|
from titanembeds.oauth import generate_guild_icon_url, generate_avatar_url
|
||||||
from titanembeds.database import db, Guilds, UserCSS
|
from titanembeds.database import db, Guilds, UserCSS
|
||||||
from config import config
|
from config import config
|
||||||
@ -42,6 +42,7 @@ def guild_embed(guild_id):
|
|||||||
guild_id=guild_id, guild=guild_dict,
|
guild_id=guild_id, guild=guild_dict,
|
||||||
generate_guild_icon=generate_guild_icon_url,
|
generate_guild_icon=generate_guild_icon_url,
|
||||||
unauth_enabled=guild_query_unauth_users_bool(guild_id),
|
unauth_enabled=guild_query_unauth_users_bool(guild_id),
|
||||||
|
visitors_enabled=guild_accepts_visitors(guild_id),
|
||||||
client_id=config['client-id'],
|
client_id=config['client-id'],
|
||||||
css=get_custom_css()
|
css=get_custom_css()
|
||||||
)
|
)
|
||||||
|
@ -175,6 +175,7 @@ def administrate_guild(guild_id):
|
|||||||
"id": db_guild.guild_id,
|
"id": db_guild.guild_id,
|
||||||
"name": db_guild.name,
|
"name": db_guild.name,
|
||||||
"unauth_users": db_guild.unauth_users,
|
"unauth_users": db_guild.unauth_users,
|
||||||
|
"visitor_view": db_guild.visitor_view,
|
||||||
"chat_links": db_guild.chat_links,
|
"chat_links": db_guild.chat_links,
|
||||||
"bracket_links": db_guild.bracket_links,
|
"bracket_links": db_guild.bracket_links,
|
||||||
"mentions_limit": db_guild.mentions_limit,
|
"mentions_limit": db_guild.mentions_limit,
|
||||||
@ -192,6 +193,7 @@ def update_administrate_guild(guild_id):
|
|||||||
if not db_guild:
|
if not db_guild:
|
||||||
abort(400)
|
abort(400)
|
||||||
db_guild.unauth_users = request.form.get("unauth_users", db_guild.unauth_users) in ["true", True]
|
db_guild.unauth_users = request.form.get("unauth_users", db_guild.unauth_users) in ["true", True]
|
||||||
|
db_guild.visitor_view = request.form.get("visitor_view", db_guild.visitor_view) in ["true", True]
|
||||||
db_guild.chat_links = request.form.get("chat_links", db_guild.chat_links) in ["true", True]
|
db_guild.chat_links = request.form.get("chat_links", db_guild.chat_links) in ["true", True]
|
||||||
db_guild.bracket_links = request.form.get("bracket_links", db_guild.bracket_links) in ["true", True]
|
db_guild.bracket_links = request.form.get("bracket_links", db_guild.bracket_links) in ["true", True]
|
||||||
db_guild.mentions_limit = request.form.get("mentions_limit", db_guild.mentions_limit)
|
db_guild.mentions_limit = request.form.get("mentions_limit", db_guild.mentions_limit)
|
||||||
|
@ -6,6 +6,7 @@ class Guilds(db.Model):
|
|||||||
guild_id = db.Column(db.String(255), nullable=False) # Discord guild id
|
guild_id = db.Column(db.String(255), nullable=False) # Discord guild id
|
||||||
name = db.Column(db.String(255), nullable=False) # Name
|
name = db.Column(db.String(255), nullable=False) # Name
|
||||||
unauth_users = db.Column(db.Boolean(), nullable=False, default=1) # If allowed unauth users
|
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
|
||||||
chat_links = db.Column(db.Boolean(), nullable=False, default=1) # If users can post links
|
chat_links = db.Column(db.Boolean(), nullable=False, default=1) # If users can post links
|
||||||
bracket_links = db.Column(db.Boolean(), nullable=False, default=1) # If appending brackets to links to prevent embed
|
bracket_links = db.Column(db.Boolean(), nullable=False, default=1) # If appending brackets to links to prevent embed
|
||||||
mentions_limit = db.Column(db.Integer, nullable=False, default=11) # If there is a limit on the number of mentions in a msg
|
mentions_limit = db.Column(db.Integer, nullable=False, default=11) # If there is a limit on the number of mentions in a msg
|
||||||
@ -20,6 +21,7 @@ class Guilds(db.Model):
|
|||||||
self.guild_id = guild_id
|
self.guild_id = guild_id
|
||||||
self.name = name
|
self.name = name
|
||||||
self.unauth_users = True # defaults to true
|
self.unauth_users = True # defaults to true
|
||||||
|
self.visitor_view = False
|
||||||
self.chat_links = True
|
self.chat_links = True
|
||||||
self.bracket_links = True
|
self.bracket_links = True
|
||||||
self.mentions_limit = -1 # -1 = unlimited mentions
|
self.mentions_limit = -1 # -1 = unlimited mentions
|
||||||
|
@ -233,6 +233,14 @@ a {
|
|||||||
#nameplate {
|
#nameplate {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#visitor_mode_message {
|
||||||
|
margin-right: auto;
|
||||||
|
margin-left: auto;
|
||||||
|
display: block;
|
||||||
|
width: 305px;
|
||||||
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: Whitney;
|
font-family: Whitney;
|
||||||
font-style: light;
|
font-style: light;
|
||||||
@ -289,21 +297,47 @@ margin-top:-2px
|
|||||||
margin-top: 4px;
|
margin-top: 4px;
|
||||||
margin-right: 4px
|
margin-right: 4px
|
||||||
}
|
}
|
||||||
#chatcontent > p { display: table; }
|
#chatcontent > p {
|
||||||
#chatcontent > p > span { display: table-row }
|
display: table;
|
||||||
#chatcontent > p > span.chatusername { display: table-header-group }
|
}
|
||||||
#chatcontent > p > span.chatmessage { display: table-footer-group;display:inline-block!important;color:rgb(195,196,197) }
|
#chatcontent > p > span {
|
||||||
::-webkit-input-placeholder { color:rgb(99,99,99) }
|
display: table-row
|
||||||
:-moz-placeholder { color:rgb(99,99,99) }
|
}
|
||||||
::-moz-placeholder { color:rgb(99,99,99) }
|
#chatcontent > p > span.chatusername {
|
||||||
:-ms-input-placeholder { color:rgb(99,99,99) }
|
display: table-header-group
|
||||||
::-ms-input-placeholder { color:rgb(99,99,99) }
|
}
|
||||||
|
#chatcontent > p > span.chatmessage {
|
||||||
|
display: table-footer-group;
|
||||||
|
display: inline-block!important;
|
||||||
|
color: rgb(195, 196, 197)
|
||||||
|
}
|
||||||
|
::-webkit-input-placeholder {
|
||||||
|
color: rgb(99, 99, 99)
|
||||||
|
}
|
||||||
|
:-moz-placeholder {
|
||||||
|
color: rgb(99, 99, 99)
|
||||||
|
}
|
||||||
|
::-moz-placeholder {
|
||||||
|
color: rgb(99, 99, 99)
|
||||||
|
}
|
||||||
|
:-ms-input-placeholder {
|
||||||
|
color: rgb(99, 99, 99)
|
||||||
|
}
|
||||||
|
::-ms-input-placeholder {
|
||||||
|
color: rgb(99, 99, 99)
|
||||||
|
}
|
||||||
body > div.navbar-fixed > nav > div {
|
body > div.navbar-fixed > nav > div {
|
||||||
background:#263238
|
background: #263238 background: -webkit-linear-gradient(#263238, #37474f, #455a64);
|
||||||
background: -webkit-linear-gradient(#263238, #37474f, #455a64); /* For Safari 5.1 to 6.0 */
|
/* For Safari 5.1 to 6.0 */
|
||||||
background: -o-linear-gradient(#263238, #37474f, #455a64); /* For Opera 11.1 to 12.0 */
|
|
||||||
background: -moz-linear-gradient(#263238, #37474f, #455a64); /* For Firefox 3.6 to 15 */
|
background: -o-linear-gradient(#263238, #37474f, #455a64);
|
||||||
background: linear-gradient(#263238, #37474f, #455a64); /* Standard syntax */
|
/* For Opera 11.1 to 12.0 */
|
||||||
|
|
||||||
|
background: -moz-linear-gradient(#263238, #37474f, #455a64);
|
||||||
|
/* For Firefox 3.6 to 15 */
|
||||||
|
|
||||||
|
background: linear-gradient(#263238, #37474f, #455a64);
|
||||||
|
/* Standard syntax */
|
||||||
}
|
}
|
||||||
div.divider {
|
div.divider {
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
@ -318,7 +352,9 @@ margin-right:10px;
|
|||||||
#members-nav > li:nth-child(6) > a {
|
#members-nav > li:nth-child(6) > a {
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
#members-btn > i { visibility:hidden }
|
#members-btn > i {
|
||||||
|
visibility: hidden
|
||||||
|
}
|
||||||
#members-btn {
|
#members-btn {
|
||||||
visibility: visible;
|
visibility: visible;
|
||||||
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNiIgaGVpZ2h0PSIyNiI+CiAgPGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgIDxwYXRoIGQ9Ik0xIDFoMjR2MjRIMVYxeiIvPgogICAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE2Ljc3MjA3NTQgMTQuNjc5MTc3OGMtLjIyNDkwOTctLjIyNTY4ODYtLjQ3NDE1NzMtLjQzNTE2ODEtLjc0MjA3NTQtLjYyOTE3NzguMzUtLjAzLjY4LS4wNS45Ny0uMDUgMi4zMyAwIDcgMS4xNyA3IDMuNVYyMGgtNHYtMWMwLTEuODgxNjkxNC0xLjQwNzcwNTYtMy4zMjMwMTQzLTMuMjI3OTI0Ni00LjMyMDgyMjJ6bS0xLjQzODU3MzUtOC4xNzU4NTM0QzE1LjgwOTgwODIgNi4xODUyNTE3MyAxNi4zODI3ODQ1IDYgMTcgNmMxLjY2IDAgMi45OSAxLjM0IDIuOTkgM3MtMS4zMyAzLTIuOTkgM2MtLjYxNzE5MTQgMC0xLjE5MDE0NzEtLjE4NTIzNzMtMS42NjY0NDIzLS41MDMyODcyQzE1Ljc1NzQ4MzIgMTAuNzYyMTQwOTUgMTYgOS45MDk1NTYgMTYgOS4wMDAwNjY5M2MwLS45MDk1Mjg5Ni0uMjQyNTM4MS0xLjc2MjE0ODgtLjY2NjQ5ODEtMi40OTY3NDI1M3pNMTAgMTNjMi4yMSAwIDQtMS43OSA0LTRzLTEuNzktNC00LTQtNCAxLjc5LTQgNCAxLjc5IDQgNCA0em0wIDJjLTIuNjcgMC04IDEuMzQtOCA0djJoMTZ2LTJjMC0yLjY2LTUuMzMtNC04LTR6Ii8+CiAgPC9nPgo8L3N2Zz4=);
|
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNiIgaGVpZ2h0PSIyNiI+CiAgPGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgIDxwYXRoIGQ9Ik0xIDFoMjR2MjRIMVYxeiIvPgogICAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE2Ljc3MjA3NTQgMTQuNjc5MTc3OGMtLjIyNDkwOTctLjIyNTY4ODYtLjQ3NDE1NzMtLjQzNTE2ODEtLjc0MjA3NTQtLjYyOTE3NzguMzUtLjAzLjY4LS4wNS45Ny0uMDUgMi4zMyAwIDcgMS4xNyA3IDMuNVYyMGgtNHYtMWMwLTEuODgxNjkxNC0xLjQwNzcwNTYtMy4zMjMwMTQzLTMuMjI3OTI0Ni00LjMyMDgyMjJ6bS0xLjQzODU3MzUtOC4xNzU4NTM0QzE1LjgwOTgwODIgNi4xODUyNTE3MyAxNi4zODI3ODQ1IDYgMTcgNmMxLjY2IDAgMi45OSAxLjM0IDIuOTkgM3MtMS4zMyAzLTIuOTkgM2MtLjYxNzE5MTQgMC0xLjE5MDE0NzEtLjE4NTIzNzMtMS42NjY0NDIzLS41MDMyODcyQzE1Ljc1NzQ4MzIgMTAuNzYyMTQwOTUgMTYgOS45MDk1NTYgMTYgOS4wMDAwNjY5M2MwLS45MDk1Mjg5Ni0uMjQyNTM4MS0xLjc2MjE0ODgtLjY2NjQ5ODEtMi40OTY3NDI1M3pNMTAgMTNjMi4yMSAwIDQtMS43OSA0LTRzLTEuNzktNC00LTQtNCAxLjc5LTQgNCAxLjc5IDQgNCA0em0wIDJjLTIuNjcgMC04IDEuMzQtOCA0djJoMTZ2LTJjMC0yLjY2LTUuMzMtNC04LTR6Ii8+CiAgPC9nPgo8L3N2Zz4=);
|
||||||
@ -332,5 +368,3 @@ background: linear-gradient(to right, #f9f9f9 90%, #fff);
|
|||||||
#channels-list > li:hover {
|
#channels-list > li:hover {
|
||||||
-webkit-filter: brightness(150%);
|
-webkit-filter: brightness(150%);
|
||||||
}
|
}
|
||||||
#loginmodal {
|
|
||||||
}
|
|
||||||
|
@ -7,6 +7,15 @@ $('#unauth_users').change(function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#visitor_view').change(function() {
|
||||||
|
var pathname = window.location.pathname;
|
||||||
|
var checked = $(this).is(':checked')
|
||||||
|
var payload = {"visitor_view": checked}
|
||||||
|
$.post(pathname, payload, function(data) {
|
||||||
|
Materialize.toast('Updated visitor mode setting!', 2000)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
$('#chat_links').change(function() {
|
$('#chat_links').change(function() {
|
||||||
var pathname = window.location.pathname;
|
var pathname = window.location.pathname;
|
||||||
var checked = $(this).is(':checked')
|
var checked = $(this).is(':checked')
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
/* global bot_client_id */
|
/* global bot_client_id */
|
||||||
/* global moment */
|
/* global moment */
|
||||||
/* global localStorage */
|
/* global localStorage */
|
||||||
|
/* global visitors_enabled */
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
const theme_options = ["DiscordDark", "BetterTitan"]; // All the avaliable theming names
|
const theme_options = ["DiscordDark", "BetterTitan"]; // All the avaliable theming names
|
||||||
@ -21,6 +22,7 @@
|
|||||||
var fetch_error_count = 0; // Number of errors fetch has encountered
|
var fetch_error_count = 0; // Number of errors fetch has encountered
|
||||||
var priority_query_guild = false; // So you have selected a channel? Let's populate it.
|
var priority_query_guild = false; // So you have selected a channel? Let's populate it.
|
||||||
var current_username_discrim; // Current username/discrim pair, eg EndenDraogn#4151
|
var current_username_discrim; // Current username/discrim pair, eg EndenDraogn#4151
|
||||||
|
var visitor_mode = false; // Keep track of if using the visitor mode or authenticate mode
|
||||||
|
|
||||||
function element_in_view(element, fullyInView) {
|
function element_in_view(element, fullyInView) {
|
||||||
var pageTop = $(window).scrollTop();
|
var pageTop = $(window).scrollTop();
|
||||||
@ -36,9 +38,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function query_guild() {
|
function query_guild() {
|
||||||
|
var url = "/api/query_guild";
|
||||||
|
if (visitor_mode) {
|
||||||
|
url = url += "_visitor";
|
||||||
|
}
|
||||||
var funct = $.ajax({
|
var funct = $.ajax({
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
url: "/api/query_guild",
|
url: url,
|
||||||
data: {"guild_id": guild_id}
|
data: {"guild_id": guild_id}
|
||||||
});
|
});
|
||||||
return funct.promise();
|
return funct.promise();
|
||||||
@ -65,10 +71,14 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function fetch(channel_id, after=null) {
|
function fetch(channel_id, after=null) {
|
||||||
|
var url = "/api/fetch";
|
||||||
|
if (visitor_mode) {
|
||||||
|
url += "_visitor";
|
||||||
|
}
|
||||||
var funct = $.ajax({
|
var funct = $.ajax({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
url: "/api/fetch",
|
url: url,
|
||||||
data: {"guild_id": guild_id,"channel_id": channel_id, "after": after}
|
data: {"guild_id": guild_id,"channel_id": channel_id, "after": after}
|
||||||
});
|
});
|
||||||
return funct.promise();
|
return funct.promise();
|
||||||
@ -118,6 +128,10 @@
|
|||||||
$("#userembedmodal").modal("open");
|
$("#userembedmodal").modal("open");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$("#visitor_login_btn").click(function () {
|
||||||
|
$("#loginmodal").modal("open");
|
||||||
|
});
|
||||||
|
|
||||||
$( "#theme-selector" ).change(function() {
|
$( "#theme-selector" ).change(function() {
|
||||||
var theme = $("#theme-selector option:selected").val();
|
var theme = $("#theme-selector option:selected").val();
|
||||||
changeTheme(theme);
|
changeTheme(theme);
|
||||||
@ -172,6 +186,20 @@
|
|||||||
return decodeURIComponent(results[2].replace(/\+/g, " "));
|
return decodeURIComponent(results[2].replace(/\+/g, " "));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setVisitorMode(enabled) {
|
||||||
|
if (!visitors_enabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
visitor_mode = enabled;
|
||||||
|
if (visitor_mode) {
|
||||||
|
$("#visitor_mode_message").show();
|
||||||
|
$("#messagebox").hide();
|
||||||
|
} else {
|
||||||
|
$("#visitor_mode_message").hide();
|
||||||
|
$("#messagebox").show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function primeEmbed() {
|
function primeEmbed() {
|
||||||
$("#focusmodal").modal("close");
|
$("#focusmodal").modal("close");
|
||||||
has_already_been_focused = true;
|
has_already_been_focused = true;
|
||||||
@ -181,8 +209,10 @@
|
|||||||
$("#modal_invite_btn").attr("href", data.instant_invite);
|
$("#modal_invite_btn").attr("href", data.instant_invite);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var login_modal_dismissible = visitors_enabled;
|
||||||
|
|
||||||
$("#loginmodal").modal({
|
$("#loginmodal").modal({
|
||||||
dismissible: false, // Modal can be dismissed by clicking outside of the modal
|
dismissible: login_modal_dismissible, // Modal can be dismissed by clicking outside of the modal
|
||||||
opacity: .5, // Opacity of modal background
|
opacity: .5, // Opacity of modal background
|
||||||
inDuration: 300, // Transition in duration
|
inDuration: 300, // Transition in duration
|
||||||
outDuration: 200, // Transition out duration
|
outDuration: 200, // Transition out duration
|
||||||
@ -196,6 +226,16 @@
|
|||||||
var guild = query_guild();
|
var guild = query_guild();
|
||||||
guild.fail(function() {
|
guild.fail(function() {
|
||||||
unlock_login_fields();
|
unlock_login_fields();
|
||||||
|
if (visitors_enabled) {
|
||||||
|
setVisitorMode(true);
|
||||||
|
var guild2 = query_guild();
|
||||||
|
guild2.done(function(data) {
|
||||||
|
initialize_embed(data);
|
||||||
|
});
|
||||||
|
guild2.fail(function() {
|
||||||
|
setVisitorMode(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
guild.done(function(data) {
|
guild.done(function(data) {
|
||||||
@ -375,12 +415,14 @@
|
|||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
var usr = create_authenticated_user();
|
var usr = create_authenticated_user();
|
||||||
usr.done(function(data) {
|
usr.done(function(data) {
|
||||||
|
setVisitorMode(false);
|
||||||
initialize_embed();
|
initialize_embed();
|
||||||
return;
|
return;
|
||||||
});
|
});
|
||||||
usr.fail(function(data) {
|
usr.fail(function(data) {
|
||||||
if (data.status == 403) {
|
if (data.status == 403) {
|
||||||
Materialize.toast('Authentication error! You have been banned.', 10000);
|
Materialize.toast('Authentication error! You have been banned.', 10000);
|
||||||
|
setVisitorMode(true);
|
||||||
} else if (index < 10) {
|
} else if (index < 10) {
|
||||||
_wait_for_discord_login(index + 1);
|
_wait_for_discord_login(index + 1);
|
||||||
}
|
}
|
||||||
@ -524,9 +566,13 @@
|
|||||||
}
|
}
|
||||||
fet.done(function(data) {
|
fet.done(function(data) {
|
||||||
var status = data.status;
|
var status = data.status;
|
||||||
|
if (visitor_mode) {
|
||||||
|
update_embed_userchip(false, null, "Titan", "0001", null);
|
||||||
|
} else {
|
||||||
update_embed_userchip(status.authenticated, status.avatar, status.username, status.user_id, status.discriminator);
|
update_embed_userchip(status.authenticated, status.avatar, status.username, status.user_id, status.discriminator);
|
||||||
|
}
|
||||||
last_message_id = fill_discord_messages(data.messages, jumpscroll);
|
last_message_id = fill_discord_messages(data.messages, jumpscroll);
|
||||||
if (status.manage_embed) {
|
if (!visitor_mode && status.manage_embed) {
|
||||||
$("#administrate_link").show();
|
$("#administrate_link").show();
|
||||||
} else {
|
} else {
|
||||||
$("#administrate_link").hide();
|
$("#administrate_link").hide();
|
||||||
@ -554,6 +600,10 @@
|
|||||||
$('#loginmodal').modal('open');
|
$('#loginmodal').modal('open');
|
||||||
Materialize.toast('Session expired! You have been logged out.', 10000);
|
Materialize.toast('Session expired! You have been logged out.', 10000);
|
||||||
}
|
}
|
||||||
|
setVisitorMode(true);
|
||||||
|
if (visitor_mode) {
|
||||||
|
fetchtimeout = setTimeout(run_fetch_routine, 5000);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
fet.catch(function(data) {
|
fet.catch(function(data) {
|
||||||
if (500 <= data.status && data.status < 600) {
|
if (500 <= data.status && data.status < 600) {
|
||||||
@ -600,6 +650,7 @@
|
|||||||
lock_login_fields();
|
lock_login_fields();
|
||||||
var usr = create_unauthenticated_user($(this).val());
|
var usr = create_unauthenticated_user($(this).val());
|
||||||
usr.done(function(data) {
|
usr.done(function(data) {
|
||||||
|
setVisitorMode(false);
|
||||||
initialize_embed();
|
initialize_embed();
|
||||||
});
|
});
|
||||||
usr.fail(function(data) {
|
usr.fail(function(data) {
|
||||||
@ -611,6 +662,7 @@
|
|||||||
Materialize.toast('Illegal username provided! Only alphanumeric, spaces, dashes, and underscores allowed in usernames.', 10000);
|
Materialize.toast('Illegal username provided! Only alphanumeric, spaces, dashes, and underscores allowed in usernames.', 10000);
|
||||||
}
|
}
|
||||||
unlock_login_fields();
|
unlock_login_fields();
|
||||||
|
setVisitorMode(true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,19 @@
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
<p class="flow-text">Toggle Visitor Mode</p>
|
||||||
|
<p>Visitors are able to view the channels that @everyone has access to. However, they are not able to send messages until they login using the usual methods.</p>
|
||||||
|
<div class="switch">
|
||||||
|
<label>
|
||||||
|
Disable
|
||||||
|
<input type="checkbox" id="visitor_view" name="visitor_view" {% if guild['visitor_view'] %}checked{% endif %} >
|
||||||
|
<span class="lever"></span>
|
||||||
|
Enable
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
<p class="flow-text">Chat Links</p>
|
<p class="flow-text">Chat Links</p>
|
||||||
<div class="switch">
|
<div class="switch">
|
||||||
<label>
|
<label>
|
||||||
|
@ -151,7 +151,10 @@
|
|||||||
<div class="left"><img id="currentuserimage" src="" class="circle left currentuserimage" style="display: none;"></div>
|
<div class="left"><img id="currentuserimage" src="" class="circle left currentuserimage" style="display: none;"></div>
|
||||||
<div id="currentusername" class="currentusername left"><span id="curuser_name">Titan</span><span id="curuser_discrim">#0001</span></div>
|
<div id="currentusername" class="currentusername left"><span id="curuser_name">Titan</span><span id="curuser_discrim">#0001</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div id="messageboxouter" class="input-field inline"><textarea placeholder="Enter message" id="messagebox" type="text" class="materialize-textarea" rows="1"></textarea></div>
|
<div id="messageboxouter" class="input-field inline">
|
||||||
|
<textarea placeholder="Enter message" id="messagebox" type="text" class="materialize-textarea" rows="1"></textarea>
|
||||||
|
<span id="visitor_mode_message" style="display:none;">Please login to post a message. <a id="visitor_login_btn" class="waves-effect waves-light btn">Login</a></span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
@ -188,6 +191,7 @@
|
|||||||
<script>
|
<script>
|
||||||
const guild_id = "{{ guild_id }}";
|
const guild_id = "{{ guild_id }}";
|
||||||
const bot_client_id = "{{ client_id }}";
|
const bot_client_id = "{{ client_id }}";
|
||||||
|
const visitors_enabled = {% if visitors_enabled %}true{% else %}false{% endif %};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript" src="{{ url_for('static', filename='js/embed.js') }}"></script>
|
<script type="text/javascript" src="{{ url_for('static', filename='js/embed.js') }}"></script>
|
||||||
|
@ -65,6 +65,10 @@ def check_guild_existance(guild_id):
|
|||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def guild_accepts_visitors(guild_id):
|
||||||
|
dbGuild = Guilds.query.filter_by(guild_id=guild_id).first()
|
||||||
|
return dbGuild.visitor_view
|
||||||
|
|
||||||
def guild_query_unauth_users_bool(guild_id):
|
def guild_query_unauth_users_bool(guild_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()
|
||||||
return dbGuild.unauth_users
|
return dbGuild.unauth_users
|
||||||
|
Loading…
Reference in New Issue
Block a user