from PIL import Image import configparser import webbrowser import datetime import database import services import random import parser import flask import os import io app = flask.Flask(__name__) CONFIG = configparser.ConfigParser() CONFIG.read("edaweb.conf") shown_images = set() def get_pfp_img(db:database.Database): global shown_images dbimg = db.get_pfp_images() if len(shown_images) == len(dbimg): shown_images = set() folder = set(dbimg).difference(shown_images) choice = random.choice(list(folder)) shown_images.add(choice) return choice def get_correct_article_headers(db:database.Database, title): db_headers = list(db.get_header_articles()) if title in [i[0] for i in db_headers]: out = [] for i in db_headers: if i[0] != title: out.append(i) return out + [("index", "/")] else: return db_headers + [("index", "/")] def get_template_items(title, db): return { "links": db.get_header_links(), "image": get_pfp_img(db), "title": title, "articles": get_correct_article_headers(db, title) } @app.route("/") def index(): with database.Database() as db: recentTweets = [] with open(os.path.join("static", "index.md"), "r") as f: return flask.render_template( "index.html", **get_template_items("eden's site :3", db), markdown = parser.parse_text(f.read()), featured_thoughts = db.get_featured_thoughts(), tweets = db.get_cached_tweets(7) + [("view all tweets...", db.get_my_twitter())], commits = db.get_cached_commits(since = datetime.datetime.now() - datetime.timedelta(days = 7)) ) @app.route("/discord") def discord(): with database.Database() as db: return flask.render_template( "discord.html", **get_template_items("discord", db), discord = CONFIG["discord"]["username"] ) @app.route("/services") def serve_services(): with database.Database() as db: return flask.render_template( "services.html", **get_template_items("services", db), docker = services.get_docker_stats(), qbit = services.get_qbit_stats(), trans = services.get_trans_stats(), pihole = services.get_pihole_stats() ) @app.route("/thought") def get_thought(): thought_id = flask.request.args.get("id", type=int) with database.Database() as db: try: category_name, title, dt, parsed = parser.get_thought_from_id(db, thought_id) except TypeError: flask.abort(404) return return flask.render_template_string( '{% extends "template.html" %}\n{% block content %}\n' + parsed + '\n{% endblock %}', **get_template_items(title, db), thought = True, dt = "published: " + str(dt), category = category_name, othercategories = db.get_categories_not(category_name) ) @app.route("/thoughts") def get_thoughts(): with database.Database() as db: all_ = db.get_all_thoughts() tree = {} for id_, title, dt, category in all_: if category not in tree.keys(): tree[category] = [(id_, title, dt)] else: tree[category].append((id_, title, str(dt))) return flask.render_template( "thoughts.html", **get_template_items("thoughts", db), tree = tree ) @app.route("/img/") def serve_image(filename): imdirpath = os.path.join(".", "static", "images") if filename in os.listdir(imdirpath): try: w = int(flask.request.args['w']) h = int(flask.request.args['h']) except (KeyError, ValueError): return flask.send_from_directory(imdirpath, filename) img = Image.open(os.path.join(imdirpath, filename)) img.thumbnail((w, h), Image.ANTIALIAS) io_ = io.BytesIO() img.save(io_, format='JPEG') return flask.Response(io_.getvalue(), mimetype='image/jpeg') else: flask.abort(404) @app.route("/random") def serve_random(): try: tags = flask.request.args['tags'].split(" ") except KeyError: flask.abort(400) with database.Database() as db: return flask.render_template( "random.html", **get_template_items("random image", db), sbi = services.get_random_image(tags) ) @app.route("/api/") def serve_api_request(infoRequest): if infoRequest == "commits": try: return flask.jsonify(services.request_recent_commits(since = datetime.datetime.fromtimestamp(int(flask.request.args['since'])))) except (ValueError, KeyError): flask.abort(400) elif infoRequest == "tweets": try: return flask.jsonify(services.request_recent_tweets(int(flask.request.args['toGet']))) except (ValueError, KeyError): flask.abort(400) else: flask.abort(404) @app.route("/preview") def preview(): if "PREVIEW" in os.environ: with database.Database() as db: return flask.render_template_string( os.environ["PREVIEW"], **get_template_items(os.environ["PREVIEW_TITLE"], db), thought = True, dt = "preview rendered: " + str(datetime.datetime.now()), category = os.environ["CATEGORY"], othercategories = db.get_categories_not(os.environ["CATEGORY"]) ) else: flask.abort(404) if __name__ == "__main__": app.run(host = "0.0.0.0", debug = True)