mirror of
https://github.com/TitanEmbeds/Titan.git
synced 2024-11-14 10:01:21 +01:00
Completed guild dashbaord and database fixes
This commit is contained in:
parent
3e884fa2fa
commit
ea362dd45f
@ -129,11 +129,6 @@ def create_unauthenticated_user():
|
||||
status = {'banned': True}
|
||||
return jsonify(status=status)
|
||||
|
||||
@api.route("/new_guild", methods=["POST"])
|
||||
@discord_users_only(api=True)
|
||||
def post_new_guild():
|
||||
pass
|
||||
|
||||
@api.route("/query_guild", methods=["GET"])
|
||||
@valid_session_required(api=True)
|
||||
def query_guild():
|
||||
|
@ -54,8 +54,6 @@ def get_user_guilds():
|
||||
def get_user_managed_servers():
|
||||
guilds = get_user_guilds()
|
||||
if guilds.status_code != 200:
|
||||
print(guilds.text)
|
||||
print(guilds.headers)
|
||||
abort(guilds.status_code)
|
||||
guilds = guilds.json()
|
||||
filtered = []
|
||||
@ -87,7 +85,7 @@ def check_user_permission(guild_id, id):
|
||||
guilds = get_user_managed_servers_safe()
|
||||
for guild in guilds:
|
||||
if guild['id'] == guild_id:
|
||||
return user_has_permission(guild['permissions'], id)
|
||||
return user_has_permission(guild['permissions'], id) or guild['owner']
|
||||
return False
|
||||
|
||||
def generate_avatar_url(id, av):
|
||||
@ -174,13 +172,32 @@ def administrate_guild(guild_id):
|
||||
permissions.append("Ban Members")
|
||||
if check_user_permission(guild_id, 1):
|
||||
permissions.append("Kick Members")
|
||||
all_members = db.session.query(UnauthenticatedUsers).filter(UnauthenticatedUsers.guild_id == guild_id).all()
|
||||
all_members = db.session.query(UnauthenticatedUsers).filter(UnauthenticatedUsers.guild_id == guild_id).order_by(UnauthenticatedUsers.last_timestamp).all()
|
||||
all_bans = db.session.query(UnauthenticatedBans).filter(UnauthenticatedBans.guild_id == guild_id).all()
|
||||
users = prepare_guild_members_list(all_members, all_bans)
|
||||
users.reverse()
|
||||
dbguild_dict = {"unauth_users": db_guild.unauth_users}
|
||||
return render_template("administrate_guild.html.j2", guild=guild['content'], dbguild=dbguild_dict, members=users, permissions=permissions)
|
||||
|
||||
@user.route("/administrate_guild/<guild_id>", methods=["POST"])
|
||||
@discord_users_only()
|
||||
def update_administrate_guild(guild_id):
|
||||
if not check_user_can_administrate_guild(guild_id):
|
||||
abort(403)
|
||||
guild = discord_api.get_guild(guild_id)
|
||||
if guild['code'] != 200:
|
||||
abort(guild['code'])
|
||||
db_guild = db.session.query(Guilds).filter(Guilds.guild_id == guild_id).first()
|
||||
if db_guild is None:
|
||||
abort(400)
|
||||
db_guild.unauth_users = request.form.get("unauth_users", db_guild.unauth_users) in ["true", True]
|
||||
db.session.commit()
|
||||
return jsonify(
|
||||
id=db_guild.id,
|
||||
guild_id=db_guild.guild_id,
|
||||
unauth_users=db_guild.unauth_users,
|
||||
)
|
||||
|
||||
@user.route('/me')
|
||||
@discord_users_only()
|
||||
def me():
|
||||
@ -213,3 +230,67 @@ def prepare_guild_members_list(members, bans):
|
||||
continue
|
||||
all_users.append(user)
|
||||
return all_users
|
||||
|
||||
@user.route("/ban", methods=["POST"])
|
||||
@discord_users_only(api=True)
|
||||
def ban_unauthenticated_user():
|
||||
guild_id = request.form.get("guild_id", None)
|
||||
user_id = request.form.get("user_id", None)
|
||||
reason = request.form.get("reason", None)
|
||||
if reason is not None:
|
||||
reason = reason.strip()
|
||||
if reason == "":
|
||||
reason = None
|
||||
if not guild_id or not user_id:
|
||||
abort(400)
|
||||
if not check_user_permission(guild_id, 2):
|
||||
abort(401)
|
||||
db_user = db.session.query(UnauthenticatedUsers).filter(UnauthenticatedUsers.guild_id == guild_id, UnauthenticatedUsers.id == user_id).order_by(UnauthenticatedUsers.id.desc()).first()
|
||||
if db_user is None:
|
||||
abort(404)
|
||||
db_ban = db.session.query(UnauthenticatedBans).filter(UnauthenticatedBans.guild_id == guild_id, UnauthenticatedBans.ip_address == db_user.ip_address).first()
|
||||
if db_ban is not None:
|
||||
if db_ban.lifter_id is None:
|
||||
abort(409)
|
||||
db.session.delete(db_ban)
|
||||
db_ban = UnauthenticatedBans(guild_id, db_user.ip_address, db_user.username, db_user.discriminator, reason, session["user_id"])
|
||||
db.session.add(db_ban)
|
||||
db.session.commit()
|
||||
return ('', 204)
|
||||
|
||||
@user.route("/ban", methods=["DELETE"])
|
||||
@discord_users_only(api=True)
|
||||
def unban_unauthenticated_user():
|
||||
guild_id = request.args.get("guild_id", None)
|
||||
user_id = request.args.get("user_id", None)
|
||||
if not guild_id or not user_id:
|
||||
abort(400)
|
||||
if not check_user_permission(guild_id, 2):
|
||||
abort(401)
|
||||
db_user = db.session.query(UnauthenticatedUsers).filter(UnauthenticatedUsers.guild_id == guild_id, UnauthenticatedUsers.id == user_id).order_by(UnauthenticatedUsers.id.desc()).first()
|
||||
if db_user is None:
|
||||
abort(404)
|
||||
db_ban = db.session.query(UnauthenticatedBans).filter(UnauthenticatedBans.guild_id == guild_id, UnauthenticatedBans.ip_address == db_user.ip_address).first()
|
||||
if db_ban is None:
|
||||
abort(404)
|
||||
if db_ban.lifter_id is not None:
|
||||
abort(409)
|
||||
db_ban.liftBan(session["user_id"])
|
||||
return ('', 204)
|
||||
|
||||
@user.route("/revoke", methods=["POST"])
|
||||
@discord_users_only(api=True)
|
||||
def revoke_unauthenticated_user():
|
||||
guild_id = request.args.get("guild_id", None)
|
||||
user_id = request.args.get("user_id", None)
|
||||
if not guild_id or not user_id:
|
||||
abort(400)
|
||||
if not check_user_permission(guild_id, 1):
|
||||
abort(401)
|
||||
db_user = db.session.query(UnauthenticatedUsers).filter(UnauthenticatedUsers.guild_id == guild_id, UnauthenticatedUsers.id == user_id).order_by(UnauthenticatedUsers.id.desc()).first()
|
||||
if db_user is None:
|
||||
abort(404)
|
||||
if db_user.isRevoked():
|
||||
abort(409)
|
||||
db_user.revokeUser()
|
||||
return ('', 204)
|
||||
|
@ -1,5 +1,6 @@
|
||||
from titanembeds.database import db
|
||||
import datetime
|
||||
import time
|
||||
|
||||
class UnauthenticatedBans(db.Model):
|
||||
__tablename__ = "unauthenticated_bans"
|
||||
@ -18,9 +19,9 @@ class UnauthenticatedBans(db.Model):
|
||||
self.ip_address = ip_address
|
||||
self.last_username = last_username
|
||||
self.last_discriminator = last_discriminator
|
||||
self.timestamp = datetime.datetime.now
|
||||
self.timestamp = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
|
||||
self.reason = reason
|
||||
self.lifter_id = null
|
||||
self.lifter_id = None
|
||||
self.placer_id = placer_id
|
||||
|
||||
def liftBan(self, lifter_id):
|
||||
|
77
titanembeds/static/js/administrate_guild.js
Normal file
77
titanembeds/static/js/administrate_guild.js
Normal file
@ -0,0 +1,77 @@
|
||||
$('#unauth_users').change(function() {
|
||||
var pathname = window.location.pathname;
|
||||
var checked = $(this).is(':checked')
|
||||
var payload = {"unauth_users": checked}
|
||||
$.post(pathname, payload, function(data) {
|
||||
Materialize.toast('Updated guest users setting!', 2000)
|
||||
});
|
||||
});
|
||||
|
||||
function initiate_ban(guild_id, user_id) {
|
||||
var reason = prompt("Please enter your reason for ban");
|
||||
var payload = {
|
||||
"reason": reason,
|
||||
"guild_id": guild_id,
|
||||
"user_id": user_id,
|
||||
}
|
||||
var pathname = document.location.origin + "/user/ban"
|
||||
|
||||
if (reason != null) {
|
||||
$.post(pathname, payload)
|
||||
.done(function(){
|
||||
location.reload();
|
||||
})
|
||||
.fail(function(xhr, status, error) {
|
||||
if (error == "CONFLICT") {
|
||||
Materialize.toast('User is already banned!', 2000)
|
||||
} else {
|
||||
Materialize.toast('An error has occured!', 2000)
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function remove_ban(guild_id, user_id) {
|
||||
var payload = {
|
||||
"guild_id": guild_id,
|
||||
"user_id": user_id,
|
||||
}
|
||||
var pathname = document.location.origin + "/user/ban"
|
||||
|
||||
$.ajax({
|
||||
url: pathname + '?' + $.param(payload),
|
||||
type: 'DELETE',
|
||||
success: function() {
|
||||
location.reload();
|
||||
},
|
||||
error: function(jqxhr, status, error) {
|
||||
if (error == "CONFLICT") {
|
||||
Materialize.toast('User is already pardoned!', 2000)
|
||||
} else {
|
||||
Materialize.toast('An error has occured!', 2000)
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function revoke_user(guild_id, user_id) {
|
||||
var payload = {
|
||||
"guild_id": guild_id,
|
||||
"user_id": user_id,
|
||||
}
|
||||
var confirmation = confirm("Are you sure that you want to kick user?")
|
||||
var pathname = document.location.origin + "/user/revoke"
|
||||
if (confirmation) {
|
||||
$.post(pathname, payload)
|
||||
.done(function(){
|
||||
location.reload();
|
||||
})
|
||||
.fail(function(xhr, status, error) {
|
||||
if (error == "CONFLICT") {
|
||||
Materialize.toast('User is already revoked!', 2000)
|
||||
} else {
|
||||
Materialize.toast('An error has occured!', 2000)
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -20,9 +20,9 @@
|
||||
<div class="card-stacked">
|
||||
<div class="card-content">
|
||||
<p class="flow-text">Direct Link</p>
|
||||
<input disabled value="{{ url_for("embed.guild_embed", guild_id=guild['id'], _external=True) }}" id="disabled" type="text"> <!-- Switch to url_for later -->
|
||||
<input readonly value="{{ url_for("embed.guild_embed", guild_id=guild['id'], _external=True) }}" id="disabled" type="text" onClick="this.setSelectionRange(0, this.value.length)">
|
||||
<p class="flow-text">iFrame Embed</p>
|
||||
<input disabled value=" <iframe src="{{ url_for("embed.guild_embed", guild_id=guild['id'], _external=True) }}" height="200" width="300" /> " id="disabled" type="text"> <!-- Switch to url_for later -->
|
||||
<input readonly value=" <iframe src="{{ url_for("embed.guild_embed", guild_id=guild['id'], _external=True) }}" height="200" width="300" /> " id="disabled" type="text" onClick="this.setSelectionRange(0, this.value.length)">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -35,7 +35,6 @@
|
||||
<div class="card-stacked">
|
||||
<div class="card-content">
|
||||
<p class="flow-text">Unauthenticated (Guest) Users</p>
|
||||
<form action="#">
|
||||
<div class="switch">
|
||||
<label>
|
||||
Disable
|
||||
@ -44,7 +43,6 @@
|
||||
Enable
|
||||
</label>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -76,8 +74,12 @@
|
||||
<tbody>
|
||||
{% for member in members %}
|
||||
<tr>
|
||||
<td><a class="waves-effect waves-light btn orange" {% if "Kick Members" not in permissions %}disabled{% endif %} >Kick</a></td>
|
||||
<td><a class="waves-effect waves-light btn red" {% if "Ban Members" not in permissions %}disabled{% endif %} >Ban</a></td>
|
||||
<td><a class="waves-effect waves-light btn orange" {% if "Kick Members" not in permissions or member["kicked"] %}disabled{% endif %} >Kick</a></td>
|
||||
{% if not member["banned"] %}
|
||||
<td><a class="waves-effect waves-light btn red" {% if "Ban Members" not in permissions %}disabled{% endif %} {% if "Ban Members" in permissions %} onclick='initiate_ban( "{{ guild['id'] }}" , {{ member['id'] }} )' {% endif %} >Ban</a></td>
|
||||
{% else %}
|
||||
<td><a class="waves-effect waves-light btn red lighten-2" {% if "Ban Members" not in permissions %}disabled{% endif %} {% if "Ban Members" in permissions %} onclick='remove_ban( "{{ guild['id'] }}" , {{ member['id'] }} )' {% endif %} >Lift</a></td>
|
||||
{% endif %}
|
||||
<td>{{ member['username'] }}</td>
|
||||
<td>{{ member['discrim'] }}</td>
|
||||
<td>{{ member['last_visit'] }}</td>
|
||||
@ -90,6 +92,7 @@
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Note that all bans are by IP. Seeing duplicates? It is because users are generated a unique session on each browser load.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -98,3 +101,6 @@
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block script %}
|
||||
<script type="text/javascript" src="{{ url_for('static', filename='js/administrate_guild.js') }}"></script>
|
||||
{% endblock %}
|
||||
|
@ -51,5 +51,6 @@
|
||||
<!--Import jQuery before materialize.js-->
|
||||
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
|
||||
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.1/js/materialize.min.js" integrity="sha256-ToPQhpo/E89yaCd7+V8LUCjobNRkjilRXfho6x3twLU=" crossorigin="anonymous"></script>
|
||||
{% block script %}{% endblock %}
|
||||
</body>
|
||||
</html>
|
||||
|
Loading…
Reference in New Issue
Block a user