forked from External/mage
[WIP] Consumable JSON game logs
As discussed in https://github.com/magefree/mage/issues/4515 This exposes a JSON log of game interactions that can be analyzed. This is just a first pass, to get up to speed with how the messaging works. It'd like to trim down the messages much further so they don't include redundant information in each message. Also gson supports much more advances serialization options; such as using the @Expose annotation. We should probably use that, but I ran into some issues (I'm not a java developer, so still learning). TODO: These currently only exist on the client side; ideally we'd submit this logs back up to a central server after the games completion; thinking this could be simple via an S3 file drop, and a Lambda function to process and expose the logs; maybe via a kafka stream. Examples of log messages are below: ``` { "gameId": "2cede8c5-ff8e-4f8c-b9ac-66af53c0a254", "sessionId": "5c4o149-678483-je42ycva-1-je42ycw2-4", "type": "GAME_SELECT", "value": { "gameView": { "priorityTime": 3000, "players": [ { "name": "computer", "life": 20, "counters": {} }, { "name": "hooptie", "life": 20, "counters": {} } ], "hand": { "425d774f-ee0c-4a9b-8516-c98f886943f0": { "name": "Springleaf Drum", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{1}" ], "convertedManaCost": 1, "type": 0, "paid": false, "id": "425d774f-ee0c-4a9b-8516-c98f886943f0" }, "dd41bb4b-7fc3-4a3c-a69c-d18e281a1bff": { "name": "Blade of the Bloodchief", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{1}" ], "convertedManaCost": 1, "type": 0, "paid": false, "id": "dd41bb4b-7fc3-4a3c-a69c-d18e281a1bff" }, "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806": { "name": "Ornithopter", "power": "0", "toughness": "2", "loyalty": "", "manaCost": [ "{0}" ], "convertedManaCost": 0, "type": 0, "paid": false, "id": "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806" }, "a2f9cc13-e71a-4c9c-96aa-5424ea1a6b64": { "name": "Springleaf Drum", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{1}" ], "convertedManaCost": 1, "type": 0, "paid": false, "id": "a2f9cc13-e71a-4c9c-96aa-5424ea1a6b64" }, "91239f4f-9003-4c48-8ca1-4c318f892489": { "name": "Cranial Plating", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{2}" ], "convertedManaCost": 2, "type": 0, "paid": false, "id": "91239f4f-9003-4c48-8ca1-4c318f892489" }, "feb268d8-0535-4a9c-8915-83dd92a08c4c": { "name": "Arcbound Ravager", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{2}" ], "convertedManaCost": 2, "type": 0, "paid": false, "id": "feb268d8-0535-4a9c-8915-83dd92a08c4c" } }, "canPlayInHand": [ "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806" ], "stack": {}, "combat": [], "phase": "PRECOMBAT_MAIN", "step": "PRECOMBAT_MAIN" }, "message": "Play spells and abilities.", "options": { "queryType": "SELECT" } } } { "gameId": "2cede8c5-ff8e-4f8c-b9ac-66af53c0a254", "sessionId": "5c4o149-678483-je42ycva-1-je42ycw2-4", "type": "SEND_PLAYER_UUID", "value": "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806" } { "gameId": "2cede8c5-ff8e-4f8c-b9ac-66af53c0a254", "sessionId": "5c4o149-678483-je42ycva-1-je42ycw2-4", "type": "GAME_CHOOSE_PILE", "value": { "choices": { "1ecf8671-be4c-4060-a76b-af614235a5b7": "Cast Ornithopter" } } } { "gameId": "2cede8c5-ff8e-4f8c-b9ac-66af53c0a254", "sessionId": "5c4o149-3v2cj2-je43178o-1-je43179f-4", "type": "GAME_INIT", "value": { "priorityTime": 3000, "players": [ { "name": "computer", "life": 20, "counters": {} }, { "name": "hooptie", "life": 20, "counters": {} } ], "hand": { "425d774f-ee0c-4a9b-8516-c98f886943f0": { "name": "Springleaf Drum", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{1}" ], "convertedManaCost": 1, "type": 0, "paid": false, "id": "425d774f-ee0c-4a9b-8516-c98f886943f0" }, "dd41bb4b-7fc3-4a3c-a69c-d18e281a1bff": { "name": "Blade of the Bloodchief", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{1}" ], "convertedManaCost": 1, "type": 0, "paid": false, "id": "dd41bb4b-7fc3-4a3c-a69c-d18e281a1bff" }, "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806": { "name": "Ornithopter", "power": "0", "toughness": "2", "loyalty": "", "manaCost": [ "{0}" ], "convertedManaCost": 0, "type": 0, "paid": false, "id": "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806" }, "a2f9cc13-e71a-4c9c-96aa-5424ea1a6b64": { "name": "Springleaf Drum", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{1}" ], "convertedManaCost": 1, "type": 0, "paid": false, "id": "a2f9cc13-e71a-4c9c-96aa-5424ea1a6b64" }, "91239f4f-9003-4c48-8ca1-4c318f892489": { "name": "Cranial Plating", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{2}" ], "convertedManaCost": 2, "type": 0, "paid": false, "id": "91239f4f-9003-4c48-8ca1-4c318f892489" }, "feb268d8-0535-4a9c-8915-83dd92a08c4c": { "name": "Arcbound Ravager", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{2}" ], "convertedManaCost": 2, "type": 0, "paid": false, "id": "feb268d8-0535-4a9c-8915-83dd92a08c4c" } }, "canPlayInHand": [ "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806" ], "stack": {}, "combat": [], "phase": "PRECOMBAT_MAIN", "step": "PRECOMBAT_MAIN" } } { "gameId": "2cede8c5-ff8e-4f8c-b9ac-66af53c0a254", "sessionId": "5c4o149-3v2cj2-je43178o-1-je43179f-4", "type": "GAME_SELECT", "value": { "gameView": { "priorityTime": 3000, "players": [ { "name": "computer", "life": 20, "counters": {} }, { "name": "hooptie", "life": 20, "counters": {} } ], "hand": { "425d774f-ee0c-4a9b-8516-c98f886943f0": { "name": "Springleaf Drum", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{1}" ], "convertedManaCost": 1, "type": 0, "paid": false, "id": "425d774f-ee0c-4a9b-8516-c98f886943f0" }, "dd41bb4b-7fc3-4a3c-a69c-d18e281a1bff": { "name": "Blade of the Bloodchief", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{1}" ], "convertedManaCost": 1, "type": 0, "paid": false, "id": "dd41bb4b-7fc3-4a3c-a69c-d18e281a1bff" }, "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806": { "name": "Ornithopter", "power": "0", "toughness": "2", "loyalty": "", "manaCost": [ "{0}" ], "convertedManaCost": 0, "type": 0, "paid": false, "id": "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806" }, "a2f9cc13-e71a-4c9c-96aa-5424ea1a6b64": { "name": "Springleaf Drum", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{1}" ], "convertedManaCost": 1, "type": 0, "paid": false, "id": "a2f9cc13-e71a-4c9c-96aa-5424ea1a6b64" }, "91239f4f-9003-4c48-8ca1-4c318f892489": { "name": "Cranial Plating", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{2}" ], "convertedManaCost": 2, "type": 0, "paid": false, "id": "91239f4f-9003-4c48-8ca1-4c318f892489" }, "feb268d8-0535-4a9c-8915-83dd92a08c4c": { "name": "Arcbound Ravager", "power": "0", "toughness": "0", "loyalty": "", "manaCost": [ "{2}" ], "convertedManaCost": 2, "type": 0, "paid": false, "id": "feb268d8-0535-4a9c-8915-83dd92a08c4c" } }, "canPlayInHand": [ "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806" ], "stack": {}, "combat": [], "phase": "PRECOMBAT_MAIN", "step": "PRECOMBAT_MAIN" }, "message": "Play spells and abilities.", "options": { "queryType": "SELECT" } } } { "gameId": "2cede8c5-ff8e-4f8c-b9ac-66af53c0a254", "sessionId": "5c4o149-678483-je42ycva-1-je42ycw2-4", "type": "SEND_PLAYER_UUID", "value": "1ecf8671-be4c-4060-a76b-af614235a5b7" } ```
This commit is contained in:
parent
871b035bb4
commit
6aeb3c7c3a
7 changed files with 239 additions and 5 deletions
|
|
@ -28,11 +28,17 @@
|
|||
package mage.view;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import mage.MageObject;
|
||||
import mage.abilities.costs.Cost;
|
||||
import mage.cards.Card;
|
||||
|
|
@ -54,6 +60,8 @@ import mage.game.stack.StackObject;
|
|||
import mage.players.Player;
|
||||
import mage.watchers.common.CastSpellLastTurnWatcher;
|
||||
import org.apache.log4j.Logger;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
@ -64,7 +72,6 @@ public class GameView implements Serializable {
|
|||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(GameView.class);
|
||||
|
||||
private final int priorityTime;
|
||||
private final List<PlayerView> players = new ArrayList<>();
|
||||
private CardsView hand;
|
||||
|
|
@ -351,4 +358,8 @@ public class GameView implements Serializable {
|
|||
return rollbackTurnsAllowed;
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
Gson gson = new GsonBuilder().create();
|
||||
return gson.toJson(this);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue