mirror of
https://github.com/TitanEmbeds/Titan.git
synced 2024-11-15 02:21:21 +01:00
Add voting statics to admin panel
This commit is contained in:
parent
bc4ad88372
commit
99afd2aeb7
@ -1,12 +1,13 @@
|
|||||||
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
|
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.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
|
||||||
import datetime
|
import datetime
|
||||||
import json
|
import json
|
||||||
from sqlalchemy import func
|
from sqlalchemy import func
|
||||||
|
import operator
|
||||||
|
|
||||||
admin = Blueprint("admin", __name__)
|
admin = Blueprint("admin", __name__)
|
||||||
|
|
||||||
@ -373,4 +374,75 @@ def new_custom_css_post():
|
|||||||
css = UserCSS(name, user_id, variables_enabled, variables, css)
|
css = UserCSS(name, user_id, variables_enabled, variables, css)
|
||||||
db.session.add(css)
|
db.session.add(css)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return jsonify({"id": css.id})
|
return jsonify({"id": css.id})
|
||||||
|
|
||||||
|
@admin.route("/voting", methods=["GET"])
|
||||||
|
@is_admin
|
||||||
|
def voting_get():
|
||||||
|
datestart = request.args.get("datestart")
|
||||||
|
timestart = request.args.get("timestart")
|
||||||
|
dateend = request.args.get("dateend")
|
||||||
|
timeend = request.args.get("timeend")
|
||||||
|
if not datestart or not timestart or not dateend or not timeend:
|
||||||
|
return render_template("admin_voting.html.j2")
|
||||||
|
start = datetime.datetime.strptime(datestart + " " + timestart, '%d %B, %Y %H:%M%p')
|
||||||
|
end = datetime.datetime.strptime(dateend + " " + timeend, '%d %B, %Y %H:%M%p')
|
||||||
|
users = db.session.query(DiscordBotsOrgTransactions).filter(DiscordBotsOrgTransactions.timestamp >= start, DiscordBotsOrgTransactions.timestamp <= end).order_by(DiscordBotsOrgTransactions.timestamp)
|
||||||
|
all_users = []
|
||||||
|
for u in users:
|
||||||
|
uid = u.user_id # Let's fix this OBO error
|
||||||
|
gmember = db.session.query(GuildMembers).filter(GuildMembers.user_id == uid).first()
|
||||||
|
if not gmember:
|
||||||
|
uid = u.user_id + 1
|
||||||
|
all_users.append({
|
||||||
|
"id": u.id,
|
||||||
|
"user_id": uid,
|
||||||
|
"timestamp": u.timestamp,
|
||||||
|
"action": u.action,
|
||||||
|
"referrer": u.referrer
|
||||||
|
})
|
||||||
|
overall_votes = {}
|
||||||
|
for u in all_users:
|
||||||
|
uid = u["user_id"]
|
||||||
|
action = u["action"]
|
||||||
|
if uid not in overall_votes:
|
||||||
|
overall_votes[uid] = 0
|
||||||
|
if action == "none":
|
||||||
|
overall_votes[uid] = overall_votes[uid] - 1
|
||||||
|
if action == "upvote":
|
||||||
|
overall_votes[uid] = overall_votes[uid] + 1
|
||||||
|
sorted_overall_votes = []
|
||||||
|
for uid, votes in sorted(overall_votes.items(), key=operator.itemgetter(1), reverse=True):
|
||||||
|
sorted_overall_votes.append(uid)
|
||||||
|
overall = []
|
||||||
|
for uid in sorted_overall_votes:
|
||||||
|
gmember = db.session.query(GuildMembers).filter(GuildMembers.user_id == uid).first()
|
||||||
|
u = {
|
||||||
|
"user_id": uid,
|
||||||
|
"votes": overall_votes[uid]
|
||||||
|
}
|
||||||
|
if gmember:
|
||||||
|
u["discord"] = gmember.username + "#" + str(gmember.discriminator)
|
||||||
|
overall.append(u)
|
||||||
|
referrer = {}
|
||||||
|
for u in all_users:
|
||||||
|
if not u["referrer"] or u["referrer"] == u["user_id"]:
|
||||||
|
continue
|
||||||
|
refer = u["referrer"]
|
||||||
|
if refer not in referrer:
|
||||||
|
referrer[refer] = 0
|
||||||
|
referrer[refer] = referrer[refer] + 1
|
||||||
|
sorted_referrers = []
|
||||||
|
for uid, votes in sorted(referrer.items(), key=operator.itemgetter(1), reverse=True):
|
||||||
|
sorted_referrers.append(uid)
|
||||||
|
referrals = []
|
||||||
|
for uid in sorted_referrers:
|
||||||
|
gmember = db.session.query(GuildMembers).filter(GuildMembers.user_id == uid).first()
|
||||||
|
u = {
|
||||||
|
"user_id": uid,
|
||||||
|
"votes": referrer[uid]
|
||||||
|
}
|
||||||
|
if gmember:
|
||||||
|
u["discord"] = gmember.username + "#" + str(gmember.discriminator)
|
||||||
|
referrals.append(u)
|
||||||
|
return render_template("admin_voting.html.j2", overall=overall, referrals=referrals)
|
@ -503,6 +503,6 @@ def webhook_discordbotsorg_vote():
|
|||||||
referrer = int(float(params["referrer"]))
|
referrer = int(float(params["referrer"]))
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
DBLTrans = DiscordBotsOrgTransactions(int(float(user_id)), vote_type, referrer)
|
DBLTrans = DiscordBotsOrgTransactions(int(user_id), vote_type, referrer)
|
||||||
db.session.add(DBLTrans)
|
db.session.add(DBLTrans)
|
||||||
return ('', 204)
|
return ('', 204)
|
33
webapp/titanembeds/static/js/admin_voting.js
Normal file
33
webapp/titanembeds/static/js/admin_voting.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
(function () {
|
||||||
|
$('.timepicker').pickatime({
|
||||||
|
default: 'now', // Set default time: 'now', '1:30AM', '16:30'
|
||||||
|
fromnow: 0, // set default time to * milliseconds from now (using with default = 'now')
|
||||||
|
twelvehour: true, // Use AM/PM or 24-hour format
|
||||||
|
donetext: 'OK', // text for done-button
|
||||||
|
cleartext: 'Clear', // text for clear-button
|
||||||
|
canceltext: 'Cancel', // Text for cancel-button
|
||||||
|
autoclose: true, // automatic close timepicker
|
||||||
|
ampmclickable: true, // make AM PM clickable
|
||||||
|
aftershow: function(){} //Function for after opening timepicker
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.datepicker').pickadate({
|
||||||
|
selectMonths: true, // Creates a dropdown to control month
|
||||||
|
selectYears: 15, // Creates a dropdown of 15 years to control year,
|
||||||
|
today: 'Today',
|
||||||
|
clear: 'Clear',
|
||||||
|
close: 'Ok',
|
||||||
|
closeOnSelect: true // Close upon selecting a date,
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#submit").click(function () {
|
||||||
|
var params = {
|
||||||
|
datestart: $("#datestart").val(),
|
||||||
|
timestart: $("#timestart").val(),
|
||||||
|
dateend: $("#dateend").val(),
|
||||||
|
timeend: $("#timeend").val()
|
||||||
|
}
|
||||||
|
var formatted = $.param( params );
|
||||||
|
location.assign("/admin/voting?" + formatted);
|
||||||
|
});
|
||||||
|
})();
|
@ -42,6 +42,13 @@
|
|||||||
<a class="waves-effect waves-light btn" href="{{ url_for('admin.list_custom_css_get') }}">Manage</a>
|
<a class="waves-effect waves-light btn" href="{{ url_for('admin.list_custom_css_get') }}">Manage</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col s12">
|
||||||
|
<div class="card-panel indigo lighten-5 z-depth-3 hoverable black-text">
|
||||||
|
<h4>Voting Statistics</h4>
|
||||||
|
<p class="flow-text">Discord Bot List Voting Statics.</p>
|
||||||
|
<a class="waves-effect waves-light btn" href="{{ url_for('admin.voting_get') }}">Manage</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="col s12">
|
<div class="col s12">
|
||||||
<div class="card-panel indigo lighten-5 z-depth-3 hoverable black-text">
|
<div class="card-panel indigo lighten-5 z-depth-3 hoverable black-text">
|
||||||
<h4>Disabled Servers</h4>
|
<h4>Disabled Servers</h4>
|
||||||
|
103
webapp/titanembeds/templates/admin_voting.html.j2
Normal file
103
webapp/titanembeds/templates/admin_voting.html.j2
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
{% extends 'site_layout.html.j2' %}
|
||||||
|
{% set title="Voting Statistics" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1>Viewing Vote Statistics</h1>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col s12">
|
||||||
|
<div class="card-panel indigo lighten-5 z-depth-3 hoverable black-text">
|
||||||
|
<p class="flow-text">Select Date/Time Range</p>
|
||||||
|
<table class="bordered striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Start</th>
|
||||||
|
<th>End</th>
|
||||||
|
<th>Submit</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div class="input-field inline">
|
||||||
|
<input id="datestart" type="text" class="datepicker" palceholder="Start Date">
|
||||||
|
</div>
|
||||||
|
<div class="input-field inline">
|
||||||
|
<input id="timestart" type="text" class="timepicker" palceholder="Start Time">
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div class="input-field inline">
|
||||||
|
<input id="dateend" type="text" class="datepicker" palceholder="End Date">
|
||||||
|
</div>
|
||||||
|
<div class="input-field inline">
|
||||||
|
<input id="timeend" type="text" class="timepicker" palceholder="End Time">
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a class="waves-effect waves-light btn" id="submit">Submit</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p>* Timezone will be whatever the server timezone is. Probably UTC.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col s12">
|
||||||
|
<div class="card-panel indigo lighten-5 z-depth-3 hoverable black-text">
|
||||||
|
<h3>Best Voters</h3>
|
||||||
|
<table class="bordered striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Place</th>
|
||||||
|
<th>User ID</th>
|
||||||
|
<th>Discord</th>
|
||||||
|
<th>Votes</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for usr in overall %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ loop.index }}</td>
|
||||||
|
<td>{{ usr.user_id }}</td>
|
||||||
|
<td>{{ usr.discord }}</td>
|
||||||
|
<td>{{ usr.votes }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col s12">
|
||||||
|
<div class="card-panel indigo lighten-5 z-depth-3 hoverable black-text">
|
||||||
|
<h3>Best Referrers</h3>
|
||||||
|
<table class="bordered striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Place</th>
|
||||||
|
<th>User ID</th>
|
||||||
|
<th>Discord</th>
|
||||||
|
<th>Referrals Redeemed</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for usr in referrals %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ loop.index }}</td>
|
||||||
|
<td>{{ usr.user_id }}</td>
|
||||||
|
<td>{{ usr.discord }}</td>
|
||||||
|
<td>{{ usr.votes }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
{% block script %}
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js" integrity="sha256-1hjUhpc44NwiNg8OwMu2QzJXhD8kcj+sJA3aCQZoUjg=" crossorigin="anonymous"></script>
|
||||||
|
<script type="text/javascript" src="{{ url_for('static', filename='js/admin_voting.js') }}"></script>
|
||||||
|
{% endblock %}
|
Loading…
Reference in New Issue
Block a user