From 7196535e29a20a116144a2673ca15142ccdf0576 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 28 Jun 2024 19:34:18 +0300 Subject: [PATCH] v2: add call start/end notices --- pkg/connector/chatinfo.go | 2 +- pkg/connector/handlematrix.go | 4 ++-- pkg/connector/handlesignal.go | 40 +++++++++++++++++++++++++++++++++++ pkg/connector/id.go | 2 +- pkg/connector/msgconvproxy.go | 2 +- 5 files changed, 45 insertions(+), 5 deletions(-) diff --git a/pkg/connector/chatinfo.go b/pkg/connector/chatinfo.go index 79b253d9..30dc5461 100644 --- a/pkg/connector/chatinfo.go +++ b/pkg/connector/chatinfo.go @@ -49,7 +49,7 @@ func (s *SignalClient) GetUserInfo(ctx context.Context, ghost *bridgev2.Ghost) ( } func (s *SignalClient) GetChatInfo(ctx context.Context, portal *bridgev2.Portal) (*bridgev2.PortalInfo, error) { - userID, groupID, err := s.parsePortalID(portal.ID) + userID, groupID, err := parsePortalID(portal.ID) if err != nil { return nil, err } diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 052428f5..a3203ccc 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -36,7 +36,7 @@ import ( ) func (s *SignalClient) sendMessage(ctx context.Context, portalID networkid.PortalID, content *signalpb.Content) error { - userID, groupID, err := s.parsePortalID(portalID) + userID, groupID, err := parsePortalID(portalID) if err != nil { return err } @@ -277,7 +277,7 @@ func (s *SignalClient) HandleMatrixReadReceipt(ctx context.Context, receipt *bri } func (s *SignalClient) HandleMatrixTyping(ctx context.Context, typing *bridgev2.MatrixTyping) error { - userID, _, err := s.parsePortalID(typing.Portal.ID) + userID, _, err := parsePortalID(typing.Portal.ID) if err != nil { return err } diff --git a/pkg/connector/handlesignal.go b/pkg/connector/handlesignal.go index 768b69c6..f4e4cb01 100644 --- a/pkg/connector/handlesignal.go +++ b/pkg/connector/handlesignal.go @@ -27,6 +27,7 @@ import ( "maunium.net/go/mautrix/bridgev2" "maunium.net/go/mautrix/bridgev2/database" "maunium.net/go/mautrix/bridgev2/networkid" + "maunium.net/go/mautrix/event" "go.mau.fi/mautrix-signal/pkg/signalmeow/events" signalpb "go.mau.fi/mautrix-signal/pkg/signalmeow/protobuf" @@ -42,6 +43,7 @@ func (s *SignalClient) handleSignalEvent(rawEvt events.SignalEvent) { case *events.ReadSelf: s.handleSignalReadSelf(evt) case *events.Call: + s.Main.Bridge.QueueRemoteEvent(s.UserLogin, s.wrapCallEvent(evt)) case *events.ContactList: s.handleSignalContactList(evt) case *events.ACIFound: @@ -49,6 +51,44 @@ func (s *SignalClient) handleSignalEvent(rawEvt events.SignalEvent) { } } +func (s *SignalClient) wrapCallEvent(evt *events.Call) bridgev2.RemoteMessage { + return &bridgev2.SimpleRemoteEvent[*events.Call]{ + Type: bridgev2.RemoteEventMessage, + LogContext: func(c zerolog.Context) zerolog.Context { + c = c.Stringer("sender_id", evt.Info.Sender) + c = c.Uint64("message_ts", evt.Timestamp) + return c + }, + PortalKey: s.makePortalKey(evt.Info.ChatID), + Data: evt, + CreatePortal: true, + ID: makeMessageID(evt.Info.Sender, evt.Timestamp), + Sender: s.makeEventSender(evt.Info.Sender), + Timestamp: time.UnixMilli(int64(evt.Timestamp)), + ConvertMessageFunc: convertCallEvent, + } +} + +func convertCallEvent(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data *events.Call) (*bridgev2.ConvertedMessage, error) { + content := &event.MessageEventContent{ + MsgType: event.MsgNotice, + } + if data.IsRinging { + content.Body = "Incoming call" + if userID, _, _ := parsePortalID(portal.ID); !userID.IsEmpty() { + content.MsgType = event.MsgText + } + } else { + content.Body = "Call ended" + } + return &bridgev2.ConvertedMessage{ + Parts: []*bridgev2.ConvertedMessagePart{{ + Type: event.EventMessage, + Content: content, + }}, + }, nil +} + type Bv2ChatEvent struct { *events.ChatEvent s *SignalClient diff --git a/pkg/connector/id.go b/pkg/connector/id.go index 147b21fb..6aa4f82d 100644 --- a/pkg/connector/id.go +++ b/pkg/connector/id.go @@ -44,7 +44,7 @@ func parseUserIDAsServiceID(userID networkid.UserID) (libsignalgo.ServiceID, err return libsignalgo.ServiceIDFromString(string(userID)) } -func (s *SignalClient) parsePortalID(portalID networkid.PortalID) (userID libsignalgo.ServiceID, groupID types.GroupIdentifier, err error) { +func parsePortalID(portalID networkid.PortalID) (userID libsignalgo.ServiceID, groupID types.GroupIdentifier, err error) { if len(portalID) == 44 { groupID = types.GroupIdentifier(portalID) } else { diff --git a/pkg/connector/msgconvproxy.go b/pkg/connector/msgconvproxy.go index 8ffeb6fb..c8d97a40 100644 --- a/pkg/connector/msgconvproxy.go +++ b/pkg/connector/msgconvproxy.go @@ -85,7 +85,7 @@ func (mpm *msgconvPortalMethods) GetClient(ctx context.Context) *signalmeow.Clie func (mpm *msgconvPortalMethods) GetData(ctx context.Context) *legacydb.Portal { mcCtx := ctx.Value(msgconvContextKey).(*msgconvContext) portal := mcCtx.Portal - userID, groupID, _ := mcCtx.Client.parsePortalID(portal.ID) + userID, groupID, _ := parsePortalID(portal.ID) chatID := string(groupID) if chatID == "" { chatID = userID.String()