diff --git a/accounts.go b/accounts.go index 7a8ef2c..b0bb02b 100644 --- a/accounts.go +++ b/accounts.go @@ -2,6 +2,7 @@ package main import ( "container/ring" + "encoding/json" "errors" "fmt" "sync" @@ -122,8 +123,35 @@ func (ac *account) PruneExpiredTxs() { } } -func genResponseJSON(actCSV string, message string) string { - return `{"account": "` + actCSV + `", "message": "` + message + `"}` +type accountState struct { + Balance string `json:"balance"` + Portfolio map[string]uint64 `json:"portfolio"` + PendingBuys []pendingTxState `json:"pendingBuys"` + PendingSells []pendingTxState `json:"pendingSells"` +} + +func (ac *account) GetState() accountState { + pendingBuys := make([]pendingTxState, len(ac.pendingBuys)) + for i, pb := range ac.pendingBuys { + pendingBuys[i] = pb.GetState() + } + + pendingSells := make([]pendingTxState, len(ac.pendingSells)) + for i, ps := range ac.pendingSells { + pendingSells[i] = ps.GetState() + } + + return accountState{ + Balance: ac.balance.String(), + Portfolio: ac.portfolio, + PendingBuys: pendingBuys, + PendingSells: pendingSells, + } +} + +type eventMessage struct { + Account accountState `json:"account"` + Message string `json:"message"` } func (ac *account) PushEvent(message string) { @@ -133,8 +161,13 @@ func (ac *account) PushEvent(message string) { return } - //socket.WriteMessage(websocket.TextMessage, []byte(message)) - socket.WriteMessage(websocket.TextMessage, []byte(genResponseJSON(ac.toCSV(), message))) + payload, err := json.Marshal(&eventMessage{ac.GetState(), message}) + if err != nil { + consoleLog.Errorf("Failed to json-ify %+v, %s", ac, message) + return + } + + socket.WriteMessage(websocket.TextMessage, payload) } type summaryItem struct { diff --git a/commands_buy.go b/commands_buy.go index ac6a894..9e6a7ee 100644 --- a/commands_buy.go +++ b/commands_buy.go @@ -143,3 +143,11 @@ func (b buyCmd) RollBack() { func (b buyCmd) IsExpired() bool { return time.Now().After(b.expiresAt) } + +func (b buyCmd) GetState() pendingTxState { + return pendingTxState{ + Stock: b.stock, + Amount: b.purchaseAmount.String(), + ExpiresAt: b.expiresAt.Format("15:04:05 Jan _2"), + } +} diff --git a/commands_sell.go b/commands_sell.go index 3bebd7e..b800202 100644 --- a/commands_sell.go +++ b/commands_sell.go @@ -143,3 +143,11 @@ func (s sellCmd) RollBack() { func (s sellCmd) IsExpired() bool { return time.Now().After(s.expiresAt) } + +func (s sellCmd) GetState() pendingTxState { + return pendingTxState{ + Stock: s.stock, + Amount: s.profit.String(), + ExpiresAt: s.expiresAt.Format("15:04:05 Jan _2"), + } +} diff --git a/pendingTx.go b/pendingTx.go index 703f141..6b43662 100644 --- a/pendingTx.go +++ b/pendingTx.go @@ -1,7 +1,14 @@ package main +type pendingTxState struct { + Stock string `json:"stock"` + Amount string `json:"amount"` + ExpiresAt string `json:"expiresAt"` +} + type pendingTx interface { Commit() RollBack() IsExpired() bool + GetState() pendingTxState } diff --git a/static/scripts.js b/static/scripts.js index 1a24108..eb90e1e 100644 --- a/static/scripts.js +++ b/static/scripts.js @@ -35,14 +35,16 @@ function doAuth(rawData) { }; conn.onmessage = function (evt) { jsonData = JSON.parse(evt.data) - var messages = jsonData["message"].split('\n'); - for (var i = 0; i < messages.length; i++) { - var item = document.createElement("div"); - item.innerText = messages[i]; - appendLog(item); + + message = jsonData["message"] + if (message !== "") { + var item = document.createElement("div"); + item.innerText = message; + appendLog(item) } - userData = jsonData["account"].split(",") - document.getElementById("balance").innerHTML = userData[1] + + userData = jsonData["account"] + document.getElementById("balance").innerHTML = userData["balance"] }; } else { var item = document.createElement("div");