about summary refs log tree commit diff
path: root/sync.go
diff options
context:
space:
mode:
authorhanemile <mail@emile.space>2020-07-10 16:37:52 +0200
committerhanemile <mail@emile.space>2020-07-10 16:37:52 +0200
commit6c242710d7b1e4ba7c7d9b76437529d1d00c7c67 (patch)
tree028706a516365e365dd9807ee6d0ab57433b4807 /sync.go
parent162f9164fdd95281e8e559b5963a02a7a16d25b7 (diff)
the functions handling almost everything I need
Diffstat (limited to 'sync.go')
-rw-r--r--sync.go96
1 files changed, 96 insertions, 0 deletions
diff --git a/sync.go b/sync.go
new file mode 100644
index 0000000..b1f5544
--- /dev/null
+++ b/sync.go
@@ -0,0 +1,96 @@
+package matrix
+
+import (
+	"encoding/json"
+	"fmt"
+
+	"gopkg.in/h2non/gentleman.v2"
+	"gopkg.in/h2non/gentleman.v2/plugins/query"
+)
+
+// Sync syncs
+func Sync(authinfo Authinfo) (RespSync, error) {
+	cli := gentleman.New()
+	cli.URL(authinfo.HomeServer)
+
+	req := cli.Request()
+	req.Path("/_matrix/client/r0/sync")
+	req.Method("GET")
+
+	req.Use(query.Set("access_token", authinfo.AccessToken))
+
+	res, err := req.Send()
+	if err != nil {
+		fmt.Println("ERR1")
+		return RespSync{}, err
+	}
+	if !res.Ok {
+		fmt.Println("ERR2")
+		fmt.Println(res)
+		return RespSync{}, err
+	}
+
+	var syncReponse RespSync
+	if err := json.Unmarshal(res.Bytes(), &syncReponse); err != nil {
+		return RespSync{}, err
+	}
+
+	return syncReponse, nil
+}
+
+// SyncPartial syncs the state using sync token obtained in a previous request
+// as a timestamp
+func SyncPartial(authinfo Authinfo, nextBatch string, eventsChannel chan PackagedEvent) (RespSync, error) {
+	cli := gentleman.New()
+	cli.URL(authinfo.HomeServer)
+
+	req := cli.Request()
+	req.Path("/_matrix/client/r0/sync")
+	req.Method("GET")
+
+	req.Use(query.Set("access_token", authinfo.AccessToken))
+	req.Use(query.Set("since", nextBatch))
+	req.Use(query.Set("timeout", "1"))
+
+	res, err := req.Send()
+	if err != nil {
+		fmt.Println("ERR1")
+		return RespSync{}, err
+	}
+	if !res.Ok {
+		fmt.Println("ERR2")
+		fmt.Println(res)
+		return RespSync{}, err
+	}
+
+	// unmarshal the response
+	var syncReponse RespSync
+	if err := json.Unmarshal(res.Bytes(), &syncReponse); err != nil {
+		return RespSync{}, err
+	}
+
+	// accept all room invites
+	for room := range syncReponse.Rooms.Invite {
+		err := join(authinfo, room)
+		if err != nil {
+			return RespSync{}, fmt.Errorf("could not join room: %s", err)
+		}
+	}
+
+	// iterate over all new events, insert all new events not from the bot itself into the eventsChannel
+	for roomname, room := range syncReponse.Rooms.Join {
+		for _, event := range room.Timeline.Events {
+
+			packagedEvent := PackagedEvent{
+				RoomName: roomname,
+				Event:    event,
+			}
+
+			// if the event recieved is not from ourself, insert the event into the eventsChannel
+			if event.Sender != authinfo.UserID {
+				eventsChannel <- packagedEvent
+			}
+		}
+	}
+	return syncReponse, nil
+}