status/core/matrix.go
2024-05-24 03:08:34 +00:00

86 lines
2.1 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
HomeServer 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)
homeserver := config.HomeServer
if homeserver == "" {
homeserver = user_id.Homeserver()
}
client, err := m.NewClient(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"`
}