initial commit

This commit is contained in:
2021-05-14 20:29:29 +02:00
commit 30bb08712a
16 changed files with 34646 additions and 0 deletions

0
demweb/__init__.py Normal file
View File

85
demweb/app.py Normal file
View File

@ -0,0 +1,85 @@
from contextlib import nullcontext
from datetime import datetime
from flask import Flask, g, has_app_context, request
from .extensions import default_config
def register_extensions(app):
from .extensions import db
db.init_app(app)
def register_blueprints(app):
with app.app_context():
# Register blueprints
pass
def setup_logging(app):
# Logging
if app.debug:
@app.before_request
def log_before_request():
g.log_datetime = datetime.now()
@app.after_request
def log_after_request(response):
now = datetime.now()
delta = (now - g.log_datetime).total_seconds() * 1_000
dt = now.isoformat().replace('T', ' ').split('.')[0]
print(f'[{dt}] {request.method} {request.path} -> {response.status} ({delta:.2f}ms)')
return response
def register_shell_context(app):
import inspect
from pprint import pprint
from flask_sqlalchemy import get_debug_queries
from demweb import models
from demweb.extensions import db
@app.shell_context_processor
def make_shell_context():
return {
'app': app,
'db': db,
'query': get_debug_queries,
'print': pprint,
**dict(inspect.getmembers(models, inspect.isclass))
}
def fix_sqlalchemy_uwsgi_multiprocess_bug(app):
from demweb.extensions import db
def _dispose_db_pool():
print('uWSGI+SQLAlchemy: Disposing forked() db pool!')
with app.app_context() if not has_app_context() else nullcontext():
db.engine.dispose()
try:
from uwsgidecorators import postfork
postfork(_dispose_db_pool)
except ImportError:
pass
def create_app(test_config=None):
# Create flask application object
app = Flask(__name__)
if test_config is None:
app.config.update(default_config)
else:
app.config.update(test_config)
register_extensions(app)
register_blueprints(app)
register_shell_context(app)
setup_logging(app)
fix_sqlalchemy_uwsgi_multiprocess_bug(app)
return app

10
demweb/extensions.py Normal file
View File

@ -0,0 +1,10 @@
from flask_sqlalchemy import SQLAlchemy
import config
db = SQLAlchemy()
default_config = dict()
for key in dir(config):
if key.isupper():
default_config[key] = getattr(config, key)

84
demweb/models.py Normal file
View File

@ -0,0 +1,84 @@
# pylint: disable=no-member
from flask import current_app
from sqlalchemy.types import JSON
from demweb.extensions import db
class Session(db.Model):
id = db.Column(db.Integer, primary_key=True)
time = db.Column(db.DateTime, index=True)
length = db.Column(db.Float, index=True)
demoname = db.Column(db.String(255), unique=True)
mapname = db.Column(db.String(255))
mapmd5 = db.Column(db.String(32))
servername = db.Column(db.String(255))
frames = db.Column(db.Integer)
ticks = db.Column(db.Integer)
tickinterval = db.Column(db.Float)
dirty = db.Column(db.Boolean)
playtime = db.Column(db.Float, index=True)
rounds = db.Column(db.Integer, index=True)
ct_wins = db.Column(db.Integer, index=True)
t_wins = db.Column(db.Integer, index=True)
chats = db.Column(db.Integer, index=True)
deaths = db.Column(db.Integer, index=True)
kills = db.Column(db.Integer, index=True)
voice_active = db.Column(db.Float, index=True)
voice_total = db.Column(db.Float, index=True)
silence_chunks = db.Column(db.JSON(65535))
class Player(db.Model):
guid = db.Column(db.String(32), primary_key=True)
name = db.Column(db.String(32), primary_key=True)
first_seen = db.Column(db.DateTime, index=True)
last_seen = db.Column(db.DateTime, index=True)
playtime = db.Column(db.Float, index=True)
chats = db.Column(db.Integer, index=True)
deaths = db.Column(db.Integer, index=True)
kills = db.Column(db.Integer, index=True)
voicetime = db.Column(db.Float, index=True)
class PlayerNames(db.Model):
guid = db.Column(db.String(32), primary_key=True)
name = db.Column(db.String(32), primary_key=True)
time = db.Column(db.Float)
class PlayerSprays(db.Model):
guid = db.Column(db.String(32), primary_key=True)
spray = db.Column(db.String(32), primary_key=True)
class PlayerSession(db.Model):
player_guid = db.Column(db.String(32), db.ForeignKey('player.guid'), primary_key=True)
session_id = db.Column(db.Integer, db.ForeignKey('session.id'), primary_key=True)
playtime = db.Column(db.Float)
chats = db.Column(db.Integer)
deaths = db.Column(db.Integer)
kills = db.Column(db.Integer)
voicetime = db.Column(db.Float)
voice_chunks = db.Column(db.JSON(65535))
class Chat(db.Model):
id = db.Column(db.Integer, primary_key=True)
player_guid = db.Column(db.String(32), db.ForeignKey('player.guid'))
session_id = db.Column(db.Integer, db.ForeignKey('session.id'))
time = db.Column(db.DateTime, index=True)
name = db.Column(db.String(255))
chat = db.Column(db.String(1024))
class Event(db.Model):
id = db.Column(db.Integer, primary_key=True)
player_guid = db.Column(db.String(32), db.ForeignKey('player.guid'))
session_id = db.Column(db.Integer, db.ForeignKey('session.id'))
time = db.Column(db.DateTime, index=True)
event = db.Column(db.String(32), index=True)
data = db.Column(db.JSON(1024))