# 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//', 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) local_game = request.form.get('local_game') return render_template('join_game.html', game_id=game_id, players=players, player_name=player_name, local_game=local_game) return render_template('join_game.html', game_id=game_id, players=players) #play game page @app.route('/game//player/', methods=['GET']) @app.route('/game//player//local/', methods=['GET']) def game(game_id, player_name, local_game=None): local_game = local_game == 'True' 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, local_game=False) 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, local_game=local_game) 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)