implement SSL for standard payload encryption, e.g. using Letsencrypt certificates
Authentication:
make sure that noone else can make a draw for a given player by providing a player token for each game session
Optional Encryption:
add triple diffie-hellman protocol (3DH) for end-to-end encryption on session creation; this heavy encryption overhead is reasonable because message payloads are rather small; disadvantage: the gameserver cannot see the draws anymore
Implement Creation of Game Sessions / Submission of Draws
use existing logic from Chess.GameLib package
add a little implementation of IChessPlayer interface, e.g. RemoteChessPlayer; this may be very similar to UIChessPlayer from WPF Chess Client project
Implement Storage of Game Sessions
first, store game sessions as static list (RAM)
then add a little file database to facilitate the purpose (e.g. SQLite), so the game sessions can be reloaded on service recovery after a server failure
Implement Stats and Gamelog Creation
Game Log: use the Chess.DataTools package and extend it with a PGN format serializer (not just a deserializer)
Stats: think of other useful stats and return them in a useful format (optional), e.g. time elapsed for making each draw, average gain / loss of draws
"New Game": start a new game, ask user when aborting a running game. Also set the difficulty level of the AI (optional at first).
"Exit": shut down the application
Main View:
"Choose Drawing Piece": Click the piece to be drawn, all possible draws are shown by highlighting the new positions, change the piece if another allied piece is clicked
"Confirm Draw": After choosing the drawing chess piece, the user clicks onto a possible target position. Then the draw will be applied to the board and the AI starts computing a good answer draw which gets automatically applied. In the meantime the user must not put any actions except aborting the game, reverting his last draw or starting a new game. (The screen may not freeze!!!)
"Revert Draw": An additional button that reverts the last draw of the AI and the player's draw. In case the AI already made a draw the draw just gets reverted. Otherwise the best draws computation for the old situation needs to be aborted.