From 2282c688f15d8cad72336a6e3ee9c35f8a4c496c Mon Sep 17 00:00:00 2001 From: David Florness Date: Mon, 18 Jan 2021 21:59:32 -0500 Subject: [PATCH] Begin work on save functionality --- cmd/tallyard/main.go | 4 ++++ election/election.go | 35 ++++++++++++++++++++++++----------- election/map.go | 8 ++------ election/msg.go | 2 +- election/voter.go | 4 ++++ 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/cmd/tallyard/main.go b/cmd/tallyard/main.go index a935e2c..bc47a3f 100644 --- a/cmd/tallyard/main.go +++ b/cmd/tallyard/main.go @@ -56,6 +56,9 @@ func main() { if data.Elections == nil { data.Elections = election.NewElectionsMap() } + data.Elections.Save = func() { + data.Save() + } syncer := client.Syncer.(*mautrix.DefaultSyncer) syncer.OnEvent(client.Store.(*mautrix.InMemoryStore).UpdateState) @@ -130,6 +133,7 @@ func main() { el.Lock() el.LocalVoter.Poly = math.NewRandomPoly(uint(len(*el.FinalVoters)-1), 1024, *el.LocalVoter.Ballot) + el.Save() el.Unlock() // TODO we may not have all voters' info diff --git a/election/election.go b/election/election.go index 00af9cc..28191ff 100644 --- a/election/election.go +++ b/election/election.go @@ -1,6 +1,7 @@ package election import ( + "encoding/json" "sync" "maunium.net/go/mautrix/event" @@ -10,21 +11,22 @@ import ( type Election struct { sync.RWMutex - Candidates []Candidate `json:"candidates"` - CreateEventId id.EventID `json:"create_event_id"` - CreationTimestamp int64 `json:"creation_timestamp"` - Creator id.UserID `json:"creator"` - FinalVoters *[]id.EventID `json:"final_voters,omitempty"` - Joins map[id.EventID]*Voter `json:"joins"` - LocalVoter *LocalVoter `json:"local_voter,omitempty"` - RoomID id.RoomID `json:"room_id"` - StartEvt *event.Event `json:"start_evt,omitempty"` - Title string `json:"title"` + Candidates []Candidate `json:"candidates"` + CreateEventId id.EventID `json:"create_event_id"` + CreationTimestamp int64 `json:"creation_timestamp"` + Creator id.UserID `json:"creator"` + FinalVoters *[]id.EventID `json:"final_voters,omitempty"` + Joins map[id.EventID]*Voter `json:"joins"` + LocalVoter *LocalVoter `json:"local_voter,omitempty"` + RoomID id.RoomID `json:"room_id"` + Save func() `json:"-"` + StartEvt *event.Event `json:"start_evt,omitempty"` + Title string `json:"title"` } func NewElection(candidates []Candidate, createEventId id.EventID, creationTimestamp int64, creator id.UserID, roomID id.RoomID, - title string) *Election { + title string, save func()) *Election { return &Election{ Candidates: candidates, CreateEventId: createEventId, @@ -32,6 +34,17 @@ func NewElection(candidates []Candidate, createEventId id.EventID, Creator: creator, Joins: make(map[id.EventID]*Voter), RoomID: roomID, + Save: save, Title: title, } } + +func (el *Election) UnmarshalJSON(b []byte) error { + err := json.Unmarshal(b, &el) + if err != nil { + return err + } + // ensure these are the same pointer + el.Joins[el.LocalVoter.JoinEvt.ID] = el.LocalVoter.Voter + return nil +} diff --git a/election/map.go b/election/map.go index 9ca94c9..2f63b52 100644 --- a/election/map.go +++ b/election/map.go @@ -13,6 +13,7 @@ type ElectionsMap struct{ M map[id.EventID]*Election L []*Election // sorted list of elections by CreationTimestamp (newest to oldest) Joins map[id.EventID]*Voter + Save func() } func NewElectionsMap() *ElectionsMap { @@ -63,12 +64,6 @@ func (em *ElectionsMap) GetI(i int) (*Election) { return em.L[i] } -func (em *ElectionsMap) Set(createEventID id.EventID, el *Election) { - em.Lock() - defer em.Unlock() - em.set(createEventID, el) -} - func (em *ElectionsMap) SetIfNotExists(createEventID id.EventID, el *Election) { em.Lock() defer em.Unlock() @@ -77,6 +72,7 @@ func (em *ElectionsMap) SetIfNotExists(createEventID id.EventID, el *Election) { return } em.set(createEventID, el) + em.Save() } func (em *ElectionsMap) set(createEventID id.EventID, el *Election) { diff --git a/election/msg.go b/election/msg.go index 9d87d0b..863f2fc 100644 --- a/election/msg.go +++ b/election/msg.go @@ -95,7 +95,7 @@ func OnCreateElectionMessage(evt *event.Event, elections *ElectionsMap) { return } elections.SetIfNotExists(evt.ID, NewElection(content.Candidates, evt.ID, - evt.Timestamp, evt.Sender, evt.RoomID, content.Title)) + evt.Timestamp, evt.Sender, evt.RoomID, content.Title, elections.Save)) } func getElection(client *mautrix.Client, roomID id.RoomID, createEventId id.EventID, elections *ElectionsMap) *Election { diff --git a/election/voter.go b/election/voter.go index 93114f1..964f3ff 100644 --- a/election/voter.go +++ b/election/voter.go @@ -109,6 +109,7 @@ func (el *Election) JoinElection(client *mautrix.Client) error { PrivKey: *privKey, } el.Joins[resp.EventID] = el.LocalVoter.Voter + el.Save() return nil } @@ -151,6 +152,7 @@ func (el *Election) StartElection(client *mautrix.Client) error { // OnStartElectionMessage(client, startEvt, elections) el.StartEvt = startEvt el.FinalVoters = &voters + el.Save() return nil } @@ -203,6 +205,7 @@ func (el *Election) SendEvals(client *mautrix.Client) error { el.LocalVoter.Eval = nil return err } + el.Save() return nil } @@ -228,6 +231,7 @@ func (el *Election) SendSum(client *mautrix.Client) error { return err } el.LocalVoter.Sum = sum + el.Save() return nil } -- 2.38.4