diff --git a/requirements.txt b/requirements.txt index c6e6dcf..4ff3b91 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,6 @@ bidict==0.22.1 +certifi==2022.12.7 +charset-normalizer==3.0.1 click==8.1.3 colorama==0.4.6 dnspython==2.3.0 @@ -6,10 +8,13 @@ eventlet==0.33.3 Flask==2.2.2 Flask-SocketIO==5.3.2 greenlet==2.0.2 +idna==3.4 itsdangerous==2.1.2 Jinja2==3.1.2 MarkupSafe==2.1.2 python-engineio==4.3.4 python-socketio==5.7.2 +requests==2.28.2 six==1.16.0 +urllib3==1.26.14 Werkzeug==2.2.2 diff --git a/venture/app.py b/venture/app.py index 7b290e8..a973cf3 100644 --- a/venture/app.py +++ b/venture/app.py @@ -1,22 +1,14 @@ from flask import Flask, request from flask_socketio import SocketIO, emit, join_room, rooms +import requests from gencode import make_code from game import Game -games = {} - app = Flask('venture') socketio = SocketIO(app, cors_allowed_origins="*") -def with_game(listener): - global games - room = rooms()[1] - game = games[room] - def inner(event, data={}): - data['game'] = game - listener(game, data) - return inner +games = {} @socketio.on('new-game') def on_newgame(): @@ -26,6 +18,8 @@ def on_newgame(): join_room(code) emit('set-code', {'code': code}) +## Contestant + @socketio.on('contestant-join') def on_join_contestant(data): sid = request.sid @@ -35,6 +29,23 @@ def on_join_contestant(data): games[room].add_contestant(sid, signature) emit('contestant-joined', {'sid': sid, 'signature': signature }, to=room) +## Host + +@socketio.on('host-join') +def on_join_host(data): + sid = request.sid + room = data['room'] + join_room(room) + games[room].add_host(sid) + emit('host-joined', {'sid': sid}, to=room) + +@socketio.on('host-start') +def on_host_start(): + room = rooms()[0] + game = games[room] + game.get_questions() + emit('categories', [c.name for c in game.categories[:6]], to=room) + def main(): socketio.run(app, host='0.0.0.0', debug=True) diff --git a/venture/game.py b/venture/game.py index 128a3f2..4c41991 100644 --- a/venture/game.py +++ b/venture/game.py @@ -1,13 +1,54 @@ -class Game: - def __init__(self, code): - self.code = code - self.locked = True - self.players = {} - def add_contestant(self, sid, signature): - self.players[sid] = Contestant(signature) - -class Contestant: - def __init__(self, signature): - self.signature = signature - self.points = 0 - +import requests +from random import randrange +MAX_CATEGORIES = 28100 + +class Game: + def __init__(self, code): + self.code = code + self.locked = True + self.players = {} + self.categories = [] + def add_contestant(self, sid, signature): + self.players[sid] = Contestant(signature) + def add_host(self, sid): + self.host = sid + def get_questions(self): + while len(self.categories) < 12: + category_id = randrange(MAX_CATEGORIES) + r = requests.get('https://jservice.io/api/category?id=%d' % category_id) + j = r.json() + category = check_and_build_category(j) + if category: + self.categories.append(category) + +class Contestant: + def __init__(self, signature): + self.signature = signature + self.points = 0 + +class Category: + def __init__(self, name): + self.name = name + self.questions = [] + +class Question: + def __init__(self, value, question, answer): + self.value = value + self.question = question + self.answer = answer + +def check_and_build_category(j): + if not j or not j['title'] or not j['clues_count'] or j['clues_count'] < 5: + return None + category = Category(j['title']) + questions = [Question(c['value'], c['question'], c['answer']) for c in j['clues']] + for value in [200, 400, 600, 800, 1000]: + for question in questions: + if question.value == value: + category.questions.append(question) + break + if len(category.questions) == 5: + return category + else: + return None +