81 lines
2 KiB
Go
81 lines
2 KiB
Go
package core
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"git.exozy.me/exozyme/status/scanner"
|
|
m "maunium.net/go/mautrix"
|
|
"maunium.net/go/mautrix/event"
|
|
. "maunium.net/go/mautrix/id"
|
|
)
|
|
|
|
type MatrixConfig struct {
|
|
UserId string
|
|
// The AccessToken can be got by logging in with any Matrix client.
|
|
// In element.io, find it under Settings -> About & Help -> Advanced.
|
|
AccessToken string
|
|
RoomId string
|
|
}
|
|
|
|
type MatrixClient struct {
|
|
inner m.Client
|
|
config MatrixConfig
|
|
// Resolved/opaque Room Id
|
|
room_id RoomID
|
|
}
|
|
|
|
func NewMatrixClient(config MatrixConfig) (*MatrixClient, error) {
|
|
if config.AccessToken == "" {
|
|
return nil, fmt.Errorf("no access token")
|
|
}
|
|
|
|
user_id := UserID(config.UserId)
|
|
client, err := m.NewClient(user_id.Homeserver(), user_id, config.AccessToken)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var opaque_room_id RoomID
|
|
if strings.HasPrefix(config.RoomId, "!") {
|
|
opaque_room_id = RoomID(config.RoomId)
|
|
} else {
|
|
resp, err := client.ResolveAlias(RoomAlias(config.RoomId))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
opaque_room_id = resp.RoomID
|
|
}
|
|
|
|
return &MatrixClient{
|
|
inner: *client,
|
|
config: config,
|
|
room_id: opaque_room_id,
|
|
}, nil
|
|
}
|
|
|
|
func (client *MatrixClient) SendNotice(message string) (*m.RespSendEvent, error) {
|
|
return client.inner.SendNotice(client.room_id, message)
|
|
}
|
|
|
|
func (client *MatrixClient) SendNoticeHTML(plain string, html string, status *[]scanner.ServiceStatus) (*m.RespSendEvent, error) {
|
|
return client.inner.SendMessageEvent(client.room_id, event.EventMessage,
|
|
&StatusMessageEventContent{
|
|
event.MessageEventContent{
|
|
MsgType: event.MsgNotice,
|
|
Body: plain,
|
|
Format: "org.matrix.custom.html",
|
|
FormattedBody: html,
|
|
},
|
|
status,
|
|
})
|
|
}
|
|
|
|
func (client *MatrixClient) RedactEvent(eventId EventID, reason string) (*m.RespSendEvent, error) {
|
|
return client.inner.RedactEvent(client.room_id, eventId, m.ReqRedact{Reason: reason})
|
|
}
|
|
|
|
type StatusMessageEventContent struct {
|
|
event.MessageEventContent
|
|
StatusEvent *[]scanner.ServiceStatus `json:"me.exozy.status,omitempty"`
|
|
}
|