Compare commits

..

1 Commits

Author SHA1 Message Date
lza_menace ff30728863 making graphs n shit
3 years ago

@ -1,6 +1,5 @@
import json import json
import click import click
from math import ceil
from datetime import datetime, timedelta from datetime import datetime, timedelta
from random import choice from random import choice
from os import makedirs, path, remove from os import makedirs, path, remove
@ -31,7 +30,7 @@ app.register_blueprint(api.bp)
@app.route("/") @app.route("/")
def index(): def index():
itp = 15 itp = 20
page = request.args.get("page", 1) page = request.args.get("page", 1)
submitter = request.args.get("submitter", None) submitter = request.args.get("submitter", None)
try: try:
@ -43,15 +42,9 @@ def index():
posts = Post.select().where(Post.approved==True).order_by(Post.timestamp.desc()) posts = Post.select().where(Post.approved==True).order_by(Post.timestamp.desc())
if submitter: if submitter:
posts = posts.where(Post.submitter == submitter) posts = posts.where(Post.submitter == submitter)
posts = posts.paginate(page, itp)
paginated_posts = posts.paginate(page, itp) total_pages = Post.select().count() / itp
total_pages = ceil(posts.count() / itp) return render_template("index.html", posts=posts, page=page, total_pages=total_pages)
return render_template(
"index.html",
posts=paginated_posts,
page=page,
total_pages=total_pages
)
@app.route("/mod") @app.route("/mod")
@moderator_required @moderator_required
@ -63,6 +56,17 @@ def mod_queue():
def about(): def about():
return render_template("about.html") return render_template("about.html")
@app.route("/stats")
def stats():
wow_txes = list()
posts = Post.select()
wallet = wownero.Wallet()
for post in posts:
txes = wallet.transfers(post.account_index)
if 'in' in txes:
wow_txes.append(txes['in'])
return render_template("stats.html", wow_txes=json.dumps(wow_txes))
@app.errorhandler(404) @app.errorhandler(404)
def not_found(error): def not_found(error):
flash("nothing there, brah") flash("nothing there, brah")
@ -126,14 +130,5 @@ def remove_admin(username):
else: else:
print("That moderator doesn't exist") print("That moderator doesn't exist")
@app.cli.command("show")
@click.argument("post_id")
def post_id(post_id):
p = Post.filter(id=post_id).first()
if p:
print(p.show())
else:
print("That post doesn't exist")
if __name__ == "__main__": if __name__ == "__main__":
app.run() app.run()

@ -1,5 +1,3 @@
import pickle
from datetime import datetime
from os import path, remove from os import path, remove
from io import BytesIO from io import BytesIO
from base64 import b64encode from base64 import b64encode
@ -22,42 +20,17 @@ bp = Blueprint("post", "post")
@bp.route("/posts/top") @bp.route("/posts/top")
def top(): def top():
top_posts = {} top_posts = {}
pickle_file = path.join(config.DATA_FOLDER, 'top_posts.pkl')
try:
mtime_ts = path.getmtime(pickle_file)
mtime = datetime.fromtimestamp(mtime_ts)
now = datetime.now()
diff = now - mtime
# If pickled data file is less than an hour old, load it and render page
# Otherwise, determine balances, build json, store pickled data, and render page
if diff.seconds < 3600:
with open(pickle_file, 'rb') as f:
print('Loading pickled data for /posts/top')
pickled_data = pickle.load(f)
return render_template("post/top.html", posts=pickled_data)
except:
pass
print('Generating and pickling new data for /posts/top')
posts = Post.select().where(Post.approved==True) posts = Post.select().where(Post.approved==True)
for post in posts: for post in posts:
transfers = [] transfers = []
incoming = wownero.Wallet().incoming_transfers(post.account_index) incoming = wownero.Wallet().incoming_transfers(post.account_index)
if "transfers" in incoming: if "transfers" in incoming:
for xfer in incoming["transfers"]: for xfer in incoming["transfers"]:
transfers.append(xfer["amount"]) transfers.append(wownero.from_atomic(xfer["amount"]))
total = wownero.from_atomic(sum(transfers)) total = sum(transfers)
if total > 0: if total > 0:
top_posts[float(total)] = post top_posts[float(total)] = post
return render_template("post/top.html", posts=sorted(top_posts.items(), reverse=True))
_t = sorted(top_posts.items(), reverse=True)[0:10]
with open(pickle_file, 'wb') as f:
f.write(pickle.dumps(_t))
return render_template("post/top.html", posts=_t)
@bp.route("/post/<id>") @bp.route("/post/<id>")
def read(id): def read(id):
@ -126,8 +99,7 @@ def create():
wallet = wownero.Wallet() wallet = wownero.Wallet()
account_index = wallet.new_account() account_index = wallet.new_account()
except: except:
flash("Suchwow wallet is fucked up! Try again later.") account_index = 0
return redirect(request.url)
post = Post( post = Post(
title=post_title, title=post_title,
text=request.form.get("text", ""), text=request.form.get("text", ""),
@ -156,9 +128,14 @@ def approve(id):
post_webhook(f"Post [{post.id}]({url}) approved :white_check_mark: by `{get_session_user()}` :fieri_parrot:") post_webhook(f"Post [{post.id}]({url}) approved :white_check_mark: by `{get_session_user()}` :fieri_parrot:")
flash("Approved") flash("Approved")
if current_app.config["DEBUG"] is False: if current_app.config["DEBUG"] is False:
if not post.to_reddit:
_r = make_post(post)
if not post.to_discord: if not post.to_discord:
_d = post_discord_webhook(post) _d = post_discord_webhook(post)
post_webhook(f"Post [{post.id}]({url}) submitted :dab_parrot: to Discord.") if _r and _d:
post_webhook(f"Post [{post.id}]({url}) submitted :dab_parrot: to Reddit and Discord.")
else:
post_webhook(f"Post [{post.id}]({url}) failed :this-is-fine-fire: to post to socials...Reddit: {_r} - Discord: {_d}")
return redirect(url_for("mod_queue")) return redirect(url_for("mod_queue"))
else: else:
flash("You can't approve this") flash("You can't approve this")

@ -791,7 +791,3 @@ ul.b {
.navbar-nav { .navbar-nav {
flex-direction: row; flex-direction: row;
} }
.current-page-btn {
font-size: 1.5em;
}

File diff suppressed because one or more lines are too long

@ -40,12 +40,15 @@
<p>No posts yet!</p> <p>No posts yet!</p>
{% endif %} {% endif %}
{% if total_pages %}
<div class="page-btn"> {% if page %}
{% for p in range(1, total_pages + 1) %} {% if page > 1 %}
<a href="{% if request.args.submitter %}/?submitter={{ request.args.submitter }}&{% else %}/?{% endif %}page={{ p }}" class="pure-button btn {% if p == page %}current-page-btn{% endif %}">{{ p }}</a> <a href="{% if request.args.submitter %}/?submitter={{ request.args.submitter }}&{% else %}/?{% endif %}page={{ page - 1 }}" style="padding:1em;">Back</a>
{% endfor %} {% endif %}
</div>
{% if page < total_pages and total_pages > 0 %}
<a href="{% if request.args.submitter %}/?submitter={{ request.args.submitter }}&{% else %}/?{% endif %}page={{ page + 1 }}" style="padding:1em;">Next</a>
{% endif %}
{% endif %} {% endif %}
</div> </div>

@ -21,6 +21,9 @@
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ url_for('about') }}">About</a> <a class="nav-link" href="{{ url_for('about') }}">About</a>
</li> </li>
<li class="nav-item">
<a class="nav-link" href="{{ url_for('stats') }}">Stats</a>
</li>
{% if session.auth == None %} {% if session.auth == None %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ url_for('auth.login') }}">Login</a> <a class="nav-link" href="{{ url_for('auth.login') }}">Login</a>

@ -5,13 +5,6 @@
<div class="container" style="width:40%;"> <div class="container" style="width:40%;">
<div class="submit"> <div class="submit">
<h1>Submit A Meme</h1> <h1>Submit A Meme</h1>
<h2>Rules</h2>
<ol>
<li>no super low effort memes (ex. putting a wow logo on a picture and that's it) but memes where you add something to the wow logo or around is fine</li>
<li>no nsfl and nsfw</li>
<li>it has to do somethign with crypto</li>
</ol>
<form method=post enctype=multipart/form-data class="form-horizontal"> <form method=post enctype=multipart/form-data class="form-horizontal">
<div class="form-group"> <div class="form-group">
<label class="sr-only" for="inlineFormInput">Title</label> <label class="sr-only" for="inlineFormInput">Title</label>

@ -31,9 +31,7 @@
{% if transfers.in %} {% if transfers.in %}
<ul> <ul>
{% for transfer in transfers.in %} {% for transfer in transfers.in %}
{% if transfer.amount > 0 %} <li style="word-break:break-all;list-style:none;">{{ transfer.amount / 100000000000 }} WOW (<a href="https://wownero.club/transaction/{{ transfer.txid }}" target="_blank">{{ transfer.txid }}</a>)</li>
<li style="word-break:break-all;list-style:none;">{{ transfer.amount / 100000000000 }} WOW (<a href="https://wownero.club/transaction/{{ transfer.txid }}" target="_blank">{{ transfer.txid }}</a>)</li>
{% endif %}
{% endfor %} {% endfor %}
</ul> </ul>
{% else %} {% else %}

@ -5,7 +5,7 @@
<div class="container" style="text-align:center;"> <div class="container" style="text-align:center;">
<div class="title"> <div class="title">
<h3>{% block title %}Top 10 Posts{% endblock %}</h3> <h3>{% block title %}Top Posts{% endblock %}</h3>
</div> </div>
{% if posts %} {% if posts %}

@ -0,0 +1,77 @@
{% extends 'base.html' %}
{% block content %}
<div class="container" style="text-align:center;">
<h3>Stats</h3>
<div style="width: 100%; text-align: center;">
<div class="charts">
<canvas id="wow_wallet"></canvas>
<canvas id="wow_earnings"></canvas>
<canvas id="swap_stats"></canvas>
</div>
</div>
<script src="/static/js/Chart.bundle.min.js"></script>
<script>
var monero = '#f96b0e';
var set_title = function(t){
return {
display: true,
text: t,
fontColor: 'white',
}
}
{% for i in wow_txes %}
// console.log("{{ i['in'] }}")
{% endfor %}
{#
var ctx = document.getElementById('wow_wallet').getContext('2d');
new Chart(ctx, {
type: 'line',
data: {
labels: [0, {% for i in wow_txes %}'{{ wow_txes[i].timestamp }}',{% endfor %}],
datasets: [{
label: 'Balance',
backgroundColor: wownero,
borderColor: wownero,
data: [
0, {% for i in wow_txes %}{{ wow_txes[i].total }},{% endfor %}
],
fill: false,
}]
},
options: {
title: set_title('Wownero Wallet Balance')
}
});
var ctx = document.getElementById('wow_earnings').getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['WOW', 'USD'],
datasets: [{
label: 'Wownero Earnings',
backgroundColor: wownero,
borderColor: wownero,
data: [
{{ earnings['wow'] | from_atomic_wow }}, {{ earnings['wow_as_ausd'] | from_atomic_usd }}
],
fill: false,
}]
},
options: {
title: set_title('Wownero Earnings')
}
});
#}
</script>
</div>
{% endblock %}
Loading…
Cancel
Save