kemoverse/web/app.py

92 lines
2.7 KiB
Python

#Kemoverse - a gacha-style bot for the Fediverse.
#Copyright © 2025 Waifu
#
#This program is free software: you can redistribute it and/or modify
#it under the terms of the GNU Affero General Public License as
#published by the Free Software Foundation, either version 3 of the
#License, or (at your option) any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU Affero General Public License for more details.
#
#You should have received a copy of the GNU Affero General Public License
#along with this program. If not, see https://www.gnu.org/licenses/.
import sqlite3
import sys
import os
# Add bot directory to path to import config
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'bot'))
import config
from flask import Flask, render_template, abort
from werkzeug.exceptions import HTTPException
app = Flask(__name__)
def get_db_connection():
conn = sqlite3.connect(config.DB_PATH)
conn.row_factory = sqlite3.Row
return conn
@app.errorhandler(HTTPException)
def handle_exception(error):
return render_template("_error.html", error=error), error.code
@app.route("/i404")
def i404():
return abort(404)
@app.route('/')
def index():
conn = get_db_connection()
players = conn.execute('SELECT id, username FROM players').fetchall()
top_players = conn.execute('''
SELECT players.id, players.username, COUNT(pulls.id) AS pull_count
FROM players
LEFT JOIN pulls ON players.id = pulls.player_id
GROUP BY players.id
ORDER BY pull_count DESC
LIMIT 5
''').fetchall()
conn.close()
return render_template('index.html', players=players, top_players=top_players)
@app.route('/player/<int:id>')
def player_profile(id):
conn = get_db_connection()
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute('SELECT * FROM players WHERE id = ?', (id,))
player = cursor.fetchone()
if player is None:
abort(404)
cursor.execute('''
SELECT pulls.timestamp, cards.name as card_name, cards.rarity
FROM pulls
JOIN cards ON pulls.card_id = cards.id
WHERE pulls.player_id = ?
ORDER BY pulls.timestamp DESC
''', (id,))
pulls = cursor.fetchall()
conn.close()
return render_template('player.html', player=player, pulls=pulls)
@app.route('/about')
def about():
return render_template('about.html')
@app.route('/submit')
def submit_character():
return render_template('submit.html')
if __name__ == '__main__':
app.run(host=config.BIND_ADDRESS, port=config.WEB_PORT, debug=True)