import json import click from datetime import datetime, timedelta from random import choice from os import makedirs, path, remove from flask import Flask, request, session, redirect from flask import render_template, flash, url_for from flask_session import Session from suchwow import config from suchwow.models import Post, Profile, Comment, Notification, db, Moderator from suchwow.routes import auth, comment, post, profile, leaderboard, api from suchwow.utils.decorators import login_required, moderator_required from suchwow.utils.helpers import post_webhook from suchwow.reddit import make_post from suchwow.discord import post_discord_webhook from suchwow import wownero app = Flask(__name__) app.config.from_envvar("FLASK_SECRETS") app.secret_key = app.config["SECRET_KEY"] Session(app) app.register_blueprint(post.bp) app.register_blueprint(auth.bp) app.register_blueprint(profile.bp) app.register_blueprint(comment.bp) app.register_blueprint(leaderboard.bp) app.register_blueprint(api.bp) @app.route("/") def index(): itp = 20 page = request.args.get("page", 1) submitter = request.args.get("submitter", None) try: page = int(page) except: flash("Wow, wtf hackerman. Cool it.") page = 1 posts = Post.select().where(Post.approved==True).order_by(Post.timestamp.desc()) if submitter: posts = posts.where(Post.submitter == submitter) posts = posts.paginate(page, itp) total_pages = Post.select().count() / itp return render_template("index.html", posts=posts, page=page, total_pages=total_pages) @app.route("/mod") @moderator_required def mod_queue(): posts = Post.select().where(Post.approved==False).order_by(Post.timestamp.asc()) return render_template("index.html", posts=posts) @app.route("/about") def about(): 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) def not_found(error): flash("nothing there, brah") return redirect(url_for("index")) @app.cli.command("init") def init(): # create subdirs for i in ["uploads", "db", "wallet"]: makedirs(f"{config.DATA_FOLDER}/{i}", exist_ok=True) # init db db.create_tables([Post, Profile, Comment, Notification, Moderator]) @app.cli.command("create_accounts") def create_accounts(): wallet = wownero.Wallet() for post in Post.select(): if post.account_index not in wallet.accounts(): account = wallet.new_account() print(f"Created account {account}") @app.cli.command("payout_users") def payout_users(): wallet = wownero.Wallet() _fa = wownero.from_atomic _aw = wownero.as_wownero for post in Post.select(): submitter = Profile.get(username=post.submitter) balances = wallet.balances(post.account_index) url = url_for('post.read', id=post.id, _external=True) if balances[1] > 0: print(f"Post #{post.id} has {balances[1]} funds unlocked and ready to send. Sweeping all funds to user's address ({submitter.address}).") sweep = wallet.sweep_all(account=post.account_index, dest_address=submitter.address) print(sweep) if "tx_hash_list" in sweep: amount = 0 for amt in sweep["amount_list"]: amount += int(amt) post_webhook(f"Paid out :moneybag: {_aw(_fa(amount))} WOW to `{post.submitter}` for post [{post.id}]({url})") @app.cli.command("add_admin") @click.argument("username") def add_admin(username): if not Moderator.filter(username=username): m = Moderator(username=username) m.save() print(f"Added {username}") post_webhook(f"Moderator `{username}` added :ship_it_parrot: by console :black_flag:") else: print("That moderator already exists") @app.cli.command("remove_admin") @click.argument("username") def remove_admin(username): m = Moderator.filter(username=username).first() if m: m.delete_instance() print(f"Deleted {username}") post_webhook(f"Moderator `{username}` removed :excuseme: by console :black_flag:") else: print("That moderator doesn't exist") if __name__ == "__main__": app.run()