92 lines
2.7 KiB
Python
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)
|