From 6f02cb8dab0f0bffb4a4056c5b5b97a01334f034 Mon Sep 17 00:00:00 2001 From: David Florness Date: Sat, 23 Jan 2021 19:31:38 -0500 Subject: [PATCH] Create a mautrix store for saving rooms to disk This doesn't actually stop the syncer from starting at the beginning of time. This thing needs some work... --- cmd/tallyard/main.go | 13 ++++++++- matrix/rooms_disk_store.go | 56 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 matrix/rooms_disk_store.go diff --git a/cmd/tallyard/main.go b/cmd/tallyard/main.go index b110fc5..3e091f0 100644 --- a/cmd/tallyard/main.go +++ b/cmd/tallyard/main.go @@ -57,6 +57,17 @@ func main() { if err != nil { panic(err) } + store, err := matrix.NewRoomsDiskStore() + if err != nil { + panic(err) + } + defer func() { + err := store.Save() + if err != nil { + panic(err) + } + }() + client.Store = store elections, err := election.GetElections() if err != nil { @@ -64,7 +75,7 @@ func main() { } syncer := client.Syncer.(*mautrix.DefaultSyncer) - syncer.OnEvent(client.Store.(*mautrix.InMemoryStore).UpdateState) + syncer.OnEvent(client.Store.(*matrix.RoomsDiskStore).UpdateState) election.SetupEventHooks(client, syncer, elections) go func() { diff --git a/matrix/rooms_disk_store.go b/matrix/rooms_disk_store.go new file mode 100644 index 0000000..e852d62 --- /dev/null +++ b/matrix/rooms_disk_store.go @@ -0,0 +1,56 @@ +package matrix + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + + "github.com/kyoh86/xdg" + "maunium.net/go/mautrix" +) + +// TODO: this sucks; this is not what JSON is for + +type RoomsDiskStore struct { + *mautrix.InMemoryStore +} + +var roomsFname = xdg.DataHome() + "/tallyard/rooms.json" + +func NewRoomsDiskStore() (*RoomsDiskStore, error) { + t := &RoomsDiskStore{ + mautrix.NewInMemoryStore(), + } + if _, err := os.Stat(roomsFname); os.IsNotExist(err) { + return t, nil + } + roomBytes, err := ioutil.ReadFile(roomsFname) + if err != nil { + return t, fmt.Errorf("couldn't read rooms file: %s", err) + } + err = json.Unmarshal(roomBytes, &t.Rooms) + if err != nil { + return t, fmt.Errorf("couldn't unmarshal rooms file: %s", err) + } + for _, room := range t.Rooms { + for stateEventType, m := range room.State { + for _, evt := range m { + evt.Content.ParseRaw(stateEventType) + } + } + } + return t, nil +} + +func (t *RoomsDiskStore) Save() error { + jsonBytes, err := json.Marshal(t.Rooms) + if err != nil { + return fmt.Errorf("couldn't marshal rooms: %s", err) + } + err = ioutil.WriteFile(roomsFname, jsonBytes, 0600) + if err != nil { + return fmt.Errorf("couldn't write rooms: %s", err) + } + return nil +} -- 2.38.4