~edwargix/tallyard

6f02cb8dab0f0bffb4a4056c5b5b97a01334f034 — David Florness 5 years ago 13eac32
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...
2 files changed, 68 insertions(+), 1 deletions(-)

M cmd/tallyard/main.go
A matrix/rooms_disk_store.go
M cmd/tallyard/main.go => cmd/tallyard/main.go +12 -1
@@ 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() {

A matrix/rooms_disk_store.go => matrix/rooms_disk_store.go +56 -0
@@ 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
}