# ultimate_tictactoe_server a python server backend for ultimate tic-tac-toe. communication with the web client is done by a (far from any standard and almost random) json protocol: ## setup server setup the database connection settings in `settings.py`. If files for a certificate are given, the websocket connection will be use the secured `wss://` websocket protocol instead of `ws://` (which is necessary if the client is accessed by `https://`). To create the necessary tables, the script `./create_database.py` can be used ## communication protocol with client **json match state:** ```json { 'complete_field': '[[...],[...],...]', 'global_field': '[[...],[...],...]', 'last_move': { "sub_x": "...", "sub_y": "...", "x": "...", "y": "..." } 'game_over': , 'is_draw': , 'player_won': >, 'current_player': >, 'player_a': "...", 'player_b': "..." } ``` **match**: server sends this to every user which is participating in a match if it's updated ```json { "type": "match_update", "data": { "id": "...", "revoke_time": , "match_state": > } } ``` **new temp session** NOT IMPLEMENTED YET (and maybe never will be) give the possibility to temporary login without a password client ```json { "type": "temp_session", "data": { "name": "" } } ``` server response: ```json { "type": "login_response", "data": { "success": , "id": "", "msg": "..." } } ``` **connect by session id** reconnect with the session id from the last session client ```json { "type": "reconnect", "data": { "id": "", } } ``` server response: ```json { "type": "reconnect_response", "data": { "success": , "msg": "..." } } ``` **login or register**: login with username and password. If the username does not exist yet, a new account is created automatically. After a successful login the server sends an elo update, friends update and match updates for each open match,. client: ```json { "type": "login", "data": { "name": "", "pw": "" } } ``` server response: ```json { "type": "login_response", "data": { "success": , "id": "", "msg": "..." } } ``` **match_request**: will be send by clients. If `player` is `null` the player will be matched with the next (or previous) player which sent a request without a player name client: ```json { "type": "match_request", "data": { "player": > } } ``` server_response: ```json { "type": "match_request_response", "data": { "success": "msg": "..." } } ``` **match_move**: sending moves to the server. The server will answer with a match update. client ```json { "type": "move", "data": { "id": "match_id", "sub_x": "...", "sub_y": "...", "x": "...", "y": "..." } } ``` **match update** (is also sent on match start and send for all matches after login) server: ```json { "type": "match_update", "data": { "id": "", "match_state": "" } } ``` **match close** client: ```json { "type": "end_match", "data": { "id": "" } } ``` **friend request**: ```json { "type": "friend_request", "data" : { "user": "" } } ``` response: ```json { "type": "friend_request_response", "data": { "success": "msg": "..." } } ``` **unfriend**: ```json { "type": "unfriend_request", "data" : { "user": "" } } ``` response: ```json { "type": "unfriend_request_response", "data": { "success": "msg": "..." } } ``` **friend update**: is sent by server after a login or reconnect ```json { "type": "friends_update", "data": { "friends": "", "elos": "" } } ``` **elo rank update**: is sent by server after login, reconnect or a finished match ```json { "type": "elo_update", "data": { "elo": , "rank": , "top_names": , "top_elos": } } ```