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"` }