diff --git a/pkg/services/matrix/matrix_api.go b/pkg/services/matrix/matrix_api.go index abf29213..625b0cf8 100644 --- a/pkg/services/matrix/matrix_api.go +++ b/pkg/services/matrix/matrix_api.go @@ -7,7 +7,7 @@ type identifierType string const ( apiLogin = "/_matrix/client/r0/login" apiRoomJoin = "/_matrix/client/r0/join/%s" - apiSendMessage = "/_matrix/client/r0/rooms/%s/send/m.room.message" + apiSendMessage = "/_matrix/client/r0/rooms/%s/send/m.room.message/%v" apiJoinedRooms = "/_matrix/client/r0/joined_rooms" contentType = "application/json" diff --git a/pkg/services/matrix/matrix_client.go b/pkg/services/matrix/matrix_client.go index 6d9de36c..68025968 100644 --- a/pkg/services/matrix/matrix_client.go +++ b/pkg/services/matrix/matrix_client.go @@ -8,6 +8,7 @@ import ( "net/http" "net/url" "strings" + "sync/atomic" "github.com/containrrr/shoutrrr/pkg/types" "github.com/containrrr/shoutrrr/pkg/util" @@ -17,6 +18,7 @@ type client struct { apiURL url.URL accessToken string logger types.StdLogger + counter uint64 } func newClient(host string, disableTLS bool, logger types.StdLogger) (c *client) { @@ -41,6 +43,10 @@ func newClient(host string, disableTLS bool, logger types.StdLogger) (c *client) return c } +func (c *client) txId() uint64 { + return atomic.AddUint64(&c.counter, 1) +} + func (c *client) useToken(token string) { c.accessToken = token c.updateAccessToken() @@ -148,7 +154,7 @@ func (c *client) joinRoom(room string) (roomID string, err error) { func (c *client) sendMessageToRoom(message string, roomID string) error { resEvent := apiResEvent{} - return c.apiPost(fmt.Sprintf(apiSendMessage, roomID), apiReqSend{ + return c.apiPost(fmt.Sprintf(apiSendMessage, roomID, c.txId()), apiReqSend{ MsgType: msgTypeText, Body: message, }, &resEvent) diff --git a/pkg/services/matrix/matrix_test.go b/pkg/services/matrix/matrix_test.go index abf73009..cf3f2763 100644 --- a/pkg/services/matrix/matrix_test.go +++ b/pkg/services/matrix/matrix_test.go @@ -167,13 +167,13 @@ func setupMockResponders() { mockServer+apiJoinedRooms, httpmock.NewStringResponder(200, `{ "joined_rooms": [ "!room:mockserver" ] }`)) - httpmock.RegisterResponder("POST", mockServer+fmt.Sprintf(apiSendMessage, "%21room:mockserver"), + httpmock.RegisterResponder("POST", `=~`+mockServer+fmt.Sprintf(apiSendMessage, "%21room:mockserver", `[0-9]+`), httpmock.NewJsonResponderOrPanic(200, apiResEvent{EventID: "7"})) - httpmock.RegisterResponder("POST", mockServer+fmt.Sprintf(apiSendMessage, "1"), + httpmock.RegisterResponder("POST", `=~`+mockServer+fmt.Sprintf(apiSendMessage, "1", `[0-9]+`), httpmock.NewJsonResponderOrPanic(200, apiResEvent{EventID: "8"})) - httpmock.RegisterResponder("POST", mockServer+fmt.Sprintf(apiSendMessage, "2"), + httpmock.RegisterResponder("POST", `=~`+mockServer+fmt.Sprintf(apiSendMessage, "2", `[0-9]+`), httpmock.NewJsonResponderOrPanic(200, apiResEvent{EventID: "9"})) httpmock.RegisterResponder("POST", mockServer+fmt.Sprintf(apiRoomJoin, "%23room1"),