From ecc8e42d3318ac8fa4f90b8e132c55b569605db9 Mon Sep 17 00:00:00 2001 From: Jiri Kalvoda Date: Sun, 11 Sep 2022 22:35:02 +0200 Subject: [PATCH] =?UTF-8?q?Strategick=C3=A1:=20Dal=C5=A1=C3=AD=20kr=C5=AF?= =?UTF-8?q?=C4=8Dek=20webu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/hra/db.py | 37 +++++++++++++++++++++++++++++++++++++ server/hra/game.py | 13 +++++++++++++ server/hra/web/__init__.py | 14 +++++++++++--- server/hra/web/api.py | 32 ++++++++++++++++++++++++++++++++ server/hra/web/pages.py | 4 ++++ 5 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 server/hra/game.py create mode 100644 server/hra/web/api.py diff --git a/server/hra/db.py b/server/hra/db.py index 5b8eb32..b782830 100644 --- a/server/hra/db.py +++ b/server/hra/db.py @@ -12,6 +12,8 @@ from sqlalchemy.sql.expression import CTE from sqlalchemy.sql.functions import ReturnTypeFromArgs from sqlalchemy.sql.sqltypes import Numeric from typing import Any, Optional, List, Tuple +import secrets +import string import hra.config as config @@ -45,10 +47,45 @@ class User(Base): id = Column(Integer, primary_key=True) org = Column(Boolean) + token = Column(String(80), unique=True, nullable=False) username = Column(String(80), unique=True, nullable=False) passwd = Column(String(80), nullable=False) + def gen_token(self): + self.token = ''.join(secrets.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for i in range(15)) + + def __repr__(self): return '' % self.username +class Game(Base): + __tablename__ = 'games' + + game_id = Column(Integer, primary_key=True) + configuration = Column(JSONB, nullable=False) + game_mode = Column(String(80), nullable=False) + teams_count = Column(Integer, nullable=False) + + + def current_state(self) -> 'State': + return get_session().query(State).filter_by(game_id=self.game_id).order_by(State.round.desc()).first() + + +class State(Base): + __tablename__ = 'states' + + game_id = Column(Integer, ForeignKey('games.game_id'), primary_key=True, nullable=False) + round = Column(Integer) + state = Column(JSONB) + + game = relationship('Game', primaryjoin='State.game_id == Game.game_id') + +class Move(Base): + __tablename__ = 'moves' + + game_id = Column(Integer, ForeignKey('games.game_id'), primary_key=True, nullable=False) + round = Column(Integer) + team_id = Column(Integer) + move = Column(JSONB) + game = relationship('Game', primaryjoin='Move.game_id == Game.game_id') diff --git a/server/hra/game.py b/server/hra/game.py new file mode 100644 index 0000000..f32916b --- /dev/null +++ b/server/hra/game.py @@ -0,0 +1,13 @@ + +class Logic(): + def __init__(self, teams_count, configuration): + pass + + def zero_state(self): + return {} + + def step(self, actions): + pass + + +logic_by_mode = {"base": Logic} diff --git a/server/hra/web/__init__.py b/server/hra/web/__init__.py index f888eea..f4548a8 100644 --- a/server/hra/web/__init__.py +++ b/server/hra/web/__init__.py @@ -54,10 +54,17 @@ def init_request(): # nic dalšího (v ostrém nasazení je servíruje uwsgi) return - if 'uid' in session: - user = db.get_session().query(db.User).filter_by(id=session['uid']).first() + user = None + if path.startswith('/api/'): + token = request.args.get('token') + if token is not None: + user = db.get_session().query(db.User).filter_by(token=token).first() + if user is None: + raise werkzeug.exceptions.Forbidden("Wrong token.") + else: - user = None + if 'uid' in session: + user = db.get_session().query(db.User).filter_by(id=session['uid']).first() path = request.path if path.startswith('/org/'): if not user or not user.org: @@ -89,3 +96,4 @@ app.before_request(init_request) import hra.web.pages +import hra.web.api diff --git a/server/hra/web/api.py b/server/hra/web/api.py new file mode 100644 index 0000000..0a79a5d --- /dev/null +++ b/server/hra/web/api.py @@ -0,0 +1,32 @@ +from flask import Flask, redirect, flash, render_template, session, g, request, get_flashed_messages +import werkzeug.exceptions +import time +from datetime import datetime +import json + +import hra.config as config +import hra.web.html as html +import hra.db as db +from hra.web import app, NeedLoginError +import hra.web.jinja_mac as jinja_mac + + +def get_context(): + if g.user is None: + raise NeedLoginError + game_id = request.args.get('game') or 1 + team_id = request.args.get('team') or 0 + game = db.get_session().query(db.Game).filter_by(game_id=game_id).first() + print(game_id, game, team_id) + if game is None: + raise werkzeug.exceptions.NotFound("No such game") + return game, team_id + +@app.route("/api/state", methods=['GET']) +def api_state(): + game, team_id = get_context() + state = game.current_state() + return json.dumps({ + "round": state.round, + "state": state.state, + }) diff --git a/server/hra/web/pages.py b/server/hra/web/pages.py index 5adae33..37c8f6b 100644 --- a/server/hra/web/pages.py +++ b/server/hra/web/pages.py @@ -101,6 +101,7 @@ def registration(): f = RegistrationForm() if f.validate_on_submit(): u = db.User(org=False, username=f.username.data, passwd=hash_passwd(f.passwd.data)) + u.gen_token() try: db.get_session().add(u) db.get_session().commit() @@ -163,6 +164,9 @@ def print_time(t): @app.route("/", methods=['GET', 'POST']) def web_index(): b = BasePage() + if g.user: + with b.p(): + b(f"Váš token je: {g.user.token}") return b._print_file()