initial commit
This commit is contained in:
0
demweb/__init__.py
Normal file
0
demweb/__init__.py
Normal file
85
demweb/app.py
Normal file
85
demweb/app.py
Normal 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
10
demweb/extensions.py
Normal 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
84
demweb/models.py
Normal 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))
|
||||
|
Reference in New Issue
Block a user