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 from suchwow.routes import auth, comment, post, profile, leaderboard from suchwow.utils.decorators import login_required 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.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().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("/about") def about(): return render_template("about.html") @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]) @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("post_new_memes") def post_new_memes(): # run every 5 mins all_posts = Post.select().order_by(Post.timestamp.desc()).where( (Post.to_reddit == False) | (Post.to_discord == False) ) for post in all_posts: diff = datetime.now() - post.timestamp recent_post = diff < timedelta(hours=2) if recent_post: if not post.to_reddit: make_post(post) if not post.to_discord: post_discord_webhook(post) return @app.cli.command("reddit_random") def reddit_random(): # run every 8 hours all_posts = Post.select().where(Post.reddit_url == None) post = choice(all_posts) make_post(post) @app.cli.command("payout_users") def payout_users(): wallet = wownero.Wallet() for post in Post.select(): submitter = Profile.get(username=post.submitter) balances = wallet.balances(post.account_index) 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) @app.cli.command("delete_post") @click.argument("post_id") def delete_post(post_id): post = Post.get(id=post_id) save_path_base = path.join(app.config["DATA_FOLDER"], "uploads") save_path = path.join(save_path_base, post.image_name) post.delete_instance() remove(save_path) print(f"Deleted post {post_id} and image {save_path}") if __name__ == "__main__": app.run()