Skip to content

Commit fe44270

Browse files
committed
fix(matrix): add missing txid to send message call
1 parent 3428e5e commit fe44270

File tree

4 files changed

+39
-41
lines changed

4 files changed

+39
-41
lines changed

pkg/services/matrix/matrix.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ package matrix
22

33
import (
44
"fmt"
5+
"net/url"
6+
57
"github.com/containrrr/shoutrrr/pkg/format"
68
"github.com/containrrr/shoutrrr/pkg/services/standard"
79
t "github.com/containrrr/shoutrrr/pkg/types"
8-
"net/url"
910
)
1011

1112
// Scheme is the identifying part of this service's configuration URL
@@ -49,7 +50,7 @@ func (s *Service) Send(message string, params *t.Params) error {
4950

5051
if len(errors) > 0 {
5152
for _, err := range errors {
52-
s.Logf("error sending message: %w", err)
53+
s.Logf("error sending message: %v", err)
5354
}
5455
return fmt.Errorf("%v error(s) sending message, with initial error: %v", len(errors), errors[0])
5556
}

pkg/services/matrix/matrix_api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ type identifierType string
77
const (
88
apiLogin = "/_matrix/client/r0/login"
99
apiRoomJoin = "/_matrix/client/r0/join/%s"
10-
apiSendMessage = "/_matrix/client/r0/rooms/%s/send/m.room.message"
10+
apiSendMessage = "/_matrix/client/r0/rooms/%s/send/m.room.message/%v"
1111
apiJoinedRooms = "/_matrix/client/r0/joined_rooms"
1212

1313
contentType = "application/json"

pkg/services/matrix/matrix_client.go

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ import (
44
"bytes"
55
"encoding/json"
66
"fmt"
7+
"io"
78
"io/ioutil"
89
"net/http"
910
"net/url"
1011
"strings"
12+
"sync/atomic"
1113

1214
"github.com/containrrr/shoutrrr/pkg/types"
1315
"github.com/containrrr/shoutrrr/pkg/util"
@@ -17,6 +19,7 @@ type client struct {
1719
apiURL url.URL
1820
accessToken string
1921
logger types.StdLogger
22+
counter uint64
2023
}
2124

2225
func newClient(host string, disableTLS bool, logger types.StdLogger) (c *client) {
@@ -41,6 +44,10 @@ func newClient(host string, disableTLS bool, logger types.StdLogger) (c *client)
4144
return c
4245
}
4346

47+
func (c *client) txId() uint64 {
48+
return atomic.AddUint64(&c.counter, 1)
49+
}
50+
4451
func (c *client) useToken(token string) {
4552
c.accessToken = token
4653
c.updateAccessToken()
@@ -127,6 +134,10 @@ func (c *client) sendToJoinedRooms(message string) (errors []error) {
127134
return append(errors, fmt.Errorf("failed to get joined rooms: %w", err))
128135
}
129136

137+
if len(joinedRooms) == 0 {
138+
return append(errors, fmt.Errorf("no rooms has been joined"))
139+
}
140+
130141
// Send to all rooms that are joined
131142
for _, roomID := range joinedRooms {
132143
c.logf("Sending message to '%v'...\n", roomID)
@@ -148,63 +159,49 @@ func (c *client) joinRoom(room string) (roomID string, err error) {
148159

149160
func (c *client) sendMessageToRoom(message string, roomID string) error {
150161
resEvent := apiResEvent{}
151-
return c.apiPost(fmt.Sprintf(apiSendMessage, roomID), apiReqSend{
162+
return c.apiPut(fmt.Sprintf(apiSendMessage, roomID, c.txId()), apiReqSend{
152163
MsgType: msgTypeText,
153164
Body: message,
154165
}, &resEvent)
155166
}
156167

157168
func (c *client) apiGet(path string, response interface{}) error {
158-
c.apiURL.Path = path
159-
160-
var err error
161-
var res *http.Response
162-
res, err = http.Get(c.apiURL.String())
163-
if err != nil {
164-
return err
165-
}
166-
167-
var body []byte
168-
defer res.Body.Close()
169-
body, err = ioutil.ReadAll(res.Body)
170-
171-
if res.StatusCode >= 400 {
172-
resError := &apiResError{}
173-
if err == nil {
174-
if err = json.Unmarshal(body, resError); err == nil {
175-
return resError
176-
}
177-
}
178-
179-
return fmt.Errorf("got HTTP %v", res.Status)
180-
}
169+
return c.apiReq(path, "GET", nil, response)
170+
}
181171

182-
if err != nil {
183-
return err
184-
}
172+
func (c *client) apiPost(path string, request interface{}, response interface{}) error {
173+
return c.apiReq(path, "POST", request, response)
174+
}
185175

186-
return json.Unmarshal(body, response)
176+
func (c *client) apiPut(path string, request interface{}, response interface{}) error {
177+
return c.apiReq(path, "PUT", request, response)
187178
}
188179

189-
func (c *client) apiPost(path string, request interface{}, response interface{}) error {
180+
func (c *client) apiReq(path string, method string, request interface{}, response interface{}) error {
190181
c.apiURL.Path = path
191182

192-
var err error
193-
var body []byte
183+
var payload io.Reader = nil
184+
if request != nil {
185+
body, err := json.Marshal(request)
186+
if err != nil {
187+
return err
188+
}
189+
payload = bytes.NewReader(body)
190+
}
194191

195-
body, err = json.Marshal(request)
192+
req, err := http.NewRequest(method, c.apiURL.String(), payload)
196193
if err != nil {
197194
return err
198195
}
196+
req.Header.Set("Content-Type", contentType)
199197

200-
var res *http.Response
201-
res, err = http.Post(c.apiURL.String(), contentType, bytes.NewReader(body))
198+
res, err := http.DefaultClient.Do(req)
202199
if err != nil {
203200
return err
204201
}
205202

206203
defer res.Body.Close()
207-
body, err = ioutil.ReadAll(res.Body)
204+
body, err := ioutil.ReadAll(res.Body)
208205

209206
if res.StatusCode >= 400 {
210207
resError := &apiResError{}

pkg/services/matrix/matrix_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,13 @@ func setupMockResponders() {
167167
mockServer+apiJoinedRooms,
168168
httpmock.NewStringResponder(200, `{ "joined_rooms": [ "!room:mockserver" ] }`))
169169

170-
httpmock.RegisterResponder("POST", mockServer+fmt.Sprintf(apiSendMessage, "%21room:mockserver"),
170+
httpmock.RegisterResponder("PUT", `=~`+mockServer+fmt.Sprintf(apiSendMessage, "%21room:mockserver", `[0-9]+`),
171171
httpmock.NewJsonResponderOrPanic(200, apiResEvent{EventID: "7"}))
172172

173-
httpmock.RegisterResponder("POST", mockServer+fmt.Sprintf(apiSendMessage, "1"),
173+
httpmock.RegisterResponder("PUT", `=~`+mockServer+fmt.Sprintf(apiSendMessage, "1", `[0-9]+`),
174174
httpmock.NewJsonResponderOrPanic(200, apiResEvent{EventID: "8"}))
175175

176-
httpmock.RegisterResponder("POST", mockServer+fmt.Sprintf(apiSendMessage, "2"),
176+
httpmock.RegisterResponder("PUT", `=~`+mockServer+fmt.Sprintf(apiSendMessage, "2", `[0-9]+`),
177177
httpmock.NewJsonResponderOrPanic(200, apiResEvent{EventID: "9"}))
178178

179179
httpmock.RegisterResponder("POST", mockServer+fmt.Sprintf(apiRoomJoin, "%23room1"),

0 commit comments

Comments
 (0)