@@ 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() {
@@ 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
+}