# 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": "..." } ``` `complete_field` is of dimension 9x9, `global_field` of 3x3 (indicating the status of each subfield). The possible values for a single field are ``` FIELD_EMPTY = 0 FIELD_USER_A = 1 FIELD_USER_B = 2 FIELD_DRAW = 3 ``` **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": } } ```