ozai-webui/main.py

167 lines
5.6 KiB
Python

# Python
from flask import Flask, render_template, request
from flask_socketio import SocketIO, join_room
import requests
ozai_url = 'http://localhost:8000/api/'
app = Flask(__name__)
socketio = SocketIO(app)
#get tis from env variable
import os
app.config['SECRET_KEY'] = os.environ.get('OZAI_WEBUI_SECRET_KEY')
#home page
@app.route('/')
def home():
return render_template('home.html')
#static files
@app.route('/azul.webp')
def background():
#return the background image
return app.send_static_file('azul.webp')
@app.route('/socket.io.js')
def socketio_js():
#return the background image
return app.send_static_file('socket.io.js')
@app.route('/azul-flake.png')
def logo():
#return the background image
return app.send_static_file('azul-flake.png')
#game creation page
@app.route('/create', methods=['GET', 'POST'])
def create():
if request.method == 'POST':
# Handle the post request here
#get all the player names data from the form
player_names = []
for i in range(1, 5):
player_name = request.form['player' + str(i)]
#purge to long names
if len(player_name) > 20:
player_name = player_name[:20]
#sanitize the input
player_name = player_name.strip()
#replace spaces with underscores
player_name = player_name.replace(' ', '_')
# replace illegal characters with nothing
illegal_chars = ['<', '>', '(', ')', '[', ']', ',', '.', ':', ';', '-', '/', '|', '\\','=', 'exec', 'spectator']
for char in illegal_chars:
player_name = player_name.replace(char, '')
if player_name:
player_names.append(player_name)
player_names = {"player_names": player_names}
print(player_names)
response = requests.post(ozai_url + 'game', json=player_names)
if response.status_code == 200:
game_id = response.json()
print("Game ID:", game_id)
return render_template('create.html', game_id=game_id)
else:
print("Error:", response.status_code, response.text)#log the game id
#return the game id to the user
pass
return render_template('create.html')
#join page, for when the user has gotten a game id.
@app.route('/join', methods=['GET', 'POST'])
def join():
if request.method == 'POST':
#get game id from the form and redirect to the join_game page
game_id = request.form['game_id']
return render_template('join.html', game_id=game_id)
return render_template('join.html')
#select player name page
@app.route('/join_game/<game_id>/', methods=['GET','POST'])
def join_game(game_id):
#get players from servre api and return them to the user
response = requests.get(ozai_url + 'game/' + game_id)
if response.status_code != 200:
#return error message
return 'Game not found', 404
players = response.json().get('players')
if request.method == 'POST':
#get the chosen player name from the form and redirect to the game page
player_name = request.form['player']
print('Player Name:', player_name)
return render_template('join_game.html', game_id=game_id, players=players, player_name=player_name)
return render_template('join_game.html', game_id=game_id, players=players)
#play game page
@app.route('/game/<game_id>/player/<player_name>', methods=['GET'])
def game(game_id, player_name):
gamestate = requests.get(ozai_url + 'game/' + game_id).json()
#dont send player parameter if the player is a spectator
if player_name == 'spectator':
gamestate = requests.get(ozai_url + 'game/' + game_id).json()
return render_template('game.html', game_id=game_id, gamestate=gamestate)
elif player_name in gamestate['players']:
gamestate = requests.get(ozai_url + 'game/' + game_id + '?player=' + player_name).json()
return render_template('game.html', game_id=game_id, gamestate=gamestate, player_name=player_name)
else:
return 'Player not found', 404
@socketio.on('connect')
def ws_connect(message):
print('Client connected' + str(message))
pass
@socketio.on('join')
def ws_message(message):
print('Client message' + str(message))
game_id = message['game_id']
print('Game ID: ', game_id)
join_room(game_id)
@socketio.on('move')
def ws_message(data):
print('Client move' + str(data))
game_id = data['game_id']
player_name = data['player_name']
#if a move was made.
source = data['move']['source']
color = data['move']['color']
destination = data['move']['destination']
if source != "market":
source = int(source)-1
if destination != "floor":
destination = int(destination)-1
move = {
'player': str(player_name),
'policy': 'strict', # or 'loose' depending on your needs
'color': str(color),
'source': source,
'destination': destination
}
print(move)
response = requests.put(ozai_url + 'game/' + game_id, json=move)
if response.status_code == 200:
socketio.emit('move', data, room=game_id)
#send message to the other players, that the move was made
socketio.emit('move_status', 'sucsess', room=game_id)
else:
#send message to the player that the move was invalid
socketio.emit('move_status', response.text, room=game_id)
if __name__ == '__main__':
# app.run(debug=True, host='0.0.0.0', port=5000,ssl_context='adhoc')
socketio.run(app, debug=True, host='0.0.0.0', port=5000)