From 6c242710d7b1e4ba7c7d9b76437529d1d00c7c67 Mon Sep 17 00:00:00 2001 From: hanemile Date: Fri, 10 Jul 2020 16:37:52 +0200 Subject: the functions handling almost everything I need --- sync.go | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 sync.go (limited to 'sync.go') 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 +} -- cgit 1.4.1