AppService.handleEvents: send BRIDGE checkpoint automatically

This commit is contained in:
Sumner Evans 2021-11-17 09:54:20 -07:00
commit 74ed9c35d2
No known key found for this signature in database
GPG key ID: 8904527AB50022FD
3 changed files with 66 additions and 0 deletions

View file

@ -109,6 +109,8 @@ type AppService struct {
botClient *mautrix.Client
botIntent *IntentAPI
MessageSendCheckpointEndpoint string
DefaultHTTPRetries int
Live bool

View file

@ -18,6 +18,7 @@ import (
"github.com/gorilla/mux"
"maunium.net/go/mautrix"
"maunium.net/go/mautrix/bridge"
"maunium.net/go/mautrix/event"
"maunium.net/go/mautrix/id"
)
@ -197,6 +198,9 @@ func (as *AppService) handleEvents(evts []*event.Event, defaultTypeClass event.T
} else if err != nil {
as.Log.Debugfln("Failed to parse content of %s (type %s): %v", evt.ID, evt.Type.Type, err)
}
go as.sendMessageSendCheckpoint(evt)
if evt.Type.IsState() {
// TODO remove this check after https://github.com/matrix-org/synapse/pull/11265
historical, ok := evt.Content.Raw["org.matrix.msc2716.historical"].(bool)
@ -208,6 +212,25 @@ func (as *AppService) handleEvents(evts []*event.Event, defaultTypeClass event.T
}
}
func (as *AppService) sendMessageSendCheckpoint(evt *event.Event) error {
endpoint := as.MessageSendCheckpointEndpoint
if endpoint == "" {
return nil
}
if _, ok := bridge.GetCheckpointTypes()[evt.Type]; !ok {
return nil
}
as.Log.Debugfln("Sending message send checkpoint for %s to API server", evt.ID)
checkpoint := bridge.NewMessageSendCheckpoint(evt.ID, evt.RoomID, bridge.StepBridge, bridge.StatusSuccesss, evt.Type)
if evt.Type == event.EventMessage {
checkpoint.MessageType = evt.Content.AsMessage().MsgType
}
return checkpoint.Send(endpoint, as.Registration.AppToken)
}
// GetRoom handles a /rooms GET call from the homeserver.
func (as *AppService) GetRoom(w http.ResponseWriter, r *http.Request) {
if !as.CheckServerToken(w, r) {

View file

@ -58,6 +58,47 @@ type MessageSendCheckpoint struct {
Info string `json:"info"`
}
func NewMessageSendCheckpoint(eventID id.EventID, roomID id.RoomID, step MessageSendCheckpointStep, status MessageSendCheckpointStatus, eventType event.Type) *MessageSendCheckpoint {
return &MessageSendCheckpoint{
EventID: eventID,
RoomID: roomID,
Step: step,
Timestamp: time.Now(),
Status: status,
EventType: eventType,
ReportedBy: ReportedByBridge,
}
}
func NewErrorMessageSendCheckpoint(eventID id.EventID, roomID id.RoomID, step MessageSendCheckpointStep, eventType event.Type, err error) *MessageSendCheckpoint {
return &MessageSendCheckpoint{
EventID: eventID,
RoomID: roomID,
Step: step,
Timestamp: time.Now(),
Status: StatusPermFailure,
EventType: eventType,
ReportedBy: ReportedByBridge,
}
}
func GetCheckpointTypes() map[event.Type]interface{} {
return map[event.Type]interface{}{
event.EventRedaction: struct{}{},
event.EventMessage: struct{}{},
event.EventEncrypted: struct{}{},
event.EventSticker: struct{}{},
event.EventReaction: struct{}{},
event.CallInvite: struct{}{},
event.CallCandidates: struct{}{},
event.CallSelectAnswer: struct{}{},
event.CallAnswer: struct{}{},
event.CallHangup: struct{}{},
event.CallReject: struct{}{},
event.CallNegotiate: struct{}{},
}
}
func (cp *MessageSendCheckpoint) Send(endpoint string, asToken string) error {
return SendCheckpoints(endpoint, asToken, []*MessageSendCheckpoint{cp})
}