From 8116089b86a43e05966f733fd9f3860f39482ceb Mon Sep 17 00:00:00 2001 From: Donomii Date: Sat, 8 Jul 2017 15:53:58 +0000 Subject: [PATCH 1/4] Add working example --- example/example.go | 126 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 example/example.go diff --git a/example/example.go b/example/example.go new file mode 100644 index 0000000..bb7c897 --- /dev/null +++ b/example/example.go @@ -0,0 +1,126 @@ +package main + +//import "github.com/kr/pretty" +import ( + "os" + "time" + "log" + "github.com/matrix-org/gomatrix" + "fmt" +) + +// Login to a local homeserver and set the user ID and access token on success. +func Login(server, username, password string) *gomatrix.Client { + cli, _ := gomatrix.NewClient(server, "", "") + resp, err := cli.Login(&gomatrix.ReqLogin{ + Type: "m.login.password", + User: username, + Password: password, + }) + if err != nil { + panic(err) + } + cli.SetCredentials(resp.UserID, resp.AccessToken) + return cli +} + +func ProcessResponse(resSync *gomatrix.RespSync) { + for _,v := range resSync.Rooms.Join { + //fmt.Printf("%v: %# v\n\n\n", k, pretty.Formatter(v.Timeline.Events)) + for _, e := range v.Timeline.Events { + if e.Type == "m.room.message" { + fmt.Printf("%v: %v\n", e.Sender, e.Content["body"]) + } + } + + } +} + + +func ExtractRooms(resSync *gomatrix.RespSync) map[string]string{ + rooms := map[string]string{} + for roomID,v := range resSync.Rooms.Join { + //fmt.Printf("%v: %# v\n\n\n", k, pretty.Formatter(v.Timeline.Events)) + for _, e := range v.Timeline.Events { + if e.Type == "m.room.name" { + rooms[fmt.Sprint(e.Content["name"])] = roomID + } + } + + } + return rooms +} + +func main () { + log.Print("Logging in...") + username := os.Args[2] + inviteUser := os.Args[4] + roomname := "TestRoomFor" + username + roomalias := roomname + cli := Login(os.Args[1], username, os.Args[3]) + log.Println("Done!") + cli.SetDisplayName(os.Args[2]) + log.Print("Creating room...") + resp, err := cli.CreateRoom(&gomatrix.ReqCreateRoom{ + RoomAliasName: roomalias, + Name : roomname, + Preset: "public_chat", +}) + id := "!JHMwXpSMhcSnyAGDWB:matrix.org" + if err != nil { + log.Println(err) + log.Println("Failed!") + id = "#" + roomalias + ":matrix.org" + } else { + log.Println("Done!") + fmt.Println("Room:", resp.RoomID) + id = resp.RoomID + log.Print("Joining room...") + if _, err := cli.JoinRoom(id, "", nil); err != nil { + panic(err) + } + log.Println("Done!") + fmt.Println("Room:", id) + } + + log.Print("Syncing...") + filter := `{"room":{"timeline":{"limit":50}}}` + resSync, err := cli.SyncRequest(5, "", filter, false, "") + if err != nil { + panic(err) + } + ProcessResponse(resSync) + + nextbatch := resSync.NextBatch + + //get room id + rooms := ExtractRooms(resSync) + log.Println(rooms) + id = rooms[roomname] + + + log.Print("Sending message...") + if _, err := cli.SendText(id, "Hello") ; err != nil { + panic(err) + } + log.Println("Done!") + + log.Print("Inviting user...") + if _, err := cli.InviteUser(id, &gomatrix.ReqInviteUser{UserID: inviteUser}) ; err != nil { + log.Println(err) + } + log.Println("Done!") + + + + for { + resSync, err := cli.SyncRequest(5, nextbatch, filter, false, "") + ProcessResponse(resSync) + if err != nil { + panic(err) + } + nextbatch = resSync.NextBatch + time.Sleep(2 * time.Second) + } + log.Println("Done!") +} From 3854cfa63362f97a18cbcf8c7ba3d0316608c511 Mon Sep 17 00:00:00 2001 From: Donomii Date: Sat, 8 Jul 2017 15:59:56 +0000 Subject: [PATCH 2/4] Send real request data instead of empty request Call was incorrectly passing a freshly initialised, empty request rather than the request data that the caller provided --- client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client.go b/client.go index 8ff3247..b07ee20 100644 --- a/client.go +++ b/client.go @@ -515,7 +515,7 @@ func (cli *Client) ForgetRoom(roomID string) (resp *RespForgetRoom, err error) { // InviteUser invites a user to a room. See http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-invite func (cli *Client) InviteUser(roomID string, req *ReqInviteUser) (resp *RespInviteUser, err error) { u := cli.BuildURL("rooms", roomID, "invite") - _, err = cli.MakeRequest("POST", u, struct{}{}, &resp) + _, err = cli.MakeRequest("POST", u, req, &resp) return } From c4175bbcba6993bb3d905b4a89bb916ede8b19e0 Mon Sep 17 00:00:00 2001 From: Donomii Date: Sat, 8 Jul 2017 16:01:21 +0000 Subject: [PATCH 3/4] "origin_server_ts" requires 64 bits Compile was failing on 32 bit linux --- events.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/events.go b/events.go index bc7b651..7427740 100644 --- a/events.go +++ b/events.go @@ -10,7 +10,7 @@ type Event struct { StateKey *string `json:"state_key,omitempty"` // The state key for the event. Only present on State Events. Sender string `json:"sender"` // The user ID of the sender of the event Type string `json:"type"` // The event type - Timestamp int `json:"origin_server_ts"` // The unix timestamp when this message was sent by the origin server + Timestamp int64 `json:"origin_server_ts"` // The unix timestamp when this message was sent by the origin server ID string `json:"event_id"` // The unique ID of this event RoomID string `json:"room_id"` // The room the event was sent to. May be nil (e.g. for presence) Content map[string]interface{} `json:"content"` // The JSON content of the event. From 9d22d0bb4121d06f3c1770e9fcd463ff94f81416 Mon Sep 17 00:00:00 2001 From: Donomii Date: Sat, 8 Jul 2017 16:02:16 +0000 Subject: [PATCH 4/4] Switch to own repository --- example/example.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/example.go b/example/example.go index bb7c897..dcc4e04 100644 --- a/example/example.go +++ b/example/example.go @@ -5,7 +5,7 @@ import ( "os" "time" "log" - "github.com/matrix-org/gomatrix" + "github.com/donomii/gomatrix" "fmt" )