diff --git a/pkg/connector/handlegchat.go b/pkg/connector/handlegchat.go index 7438746..3541f97 100644 --- a/pkg/connector/handlegchat.go +++ b/pkg/connector/handlegchat.go @@ -53,6 +53,13 @@ func (c *GChatClient) onStreamEvent(ctx context.Context, raw any) { Data: msg, ConvertEditFunc: c.ConvertEdit, }) + case proto.Event_MESSAGE_DELETED: + msg := evt.Body.GetMessageDeleted() + eventMeta := c.makeEventMeta(evt, bridgev2.RemoteEventMessageRemove, "", msg.Timestamp) + c.userLogin.Bridge.QueueRemoteEvent(c.userLogin, &simplevent.Message[*proto.Message]{ + EventMeta: eventMeta, + TargetMessage: networkid.MessageID(msg.MessageId.MessageId), + }) } c.setPortalRevision(ctx, evt) diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index fa97137..96c1df3 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -13,8 +13,9 @@ import ( ) var ( - _ bridgev2.EditHandlingNetworkAPI = (*GChatClient)(nil) - _ bridgev2.ReactionHandlingNetworkAPI = (*GChatClient)(nil) + _ bridgev2.EditHandlingNetworkAPI = (*GChatClient)(nil) + _ bridgev2.ReactionHandlingNetworkAPI = (*GChatClient)(nil) + _ bridgev2.RedactionHandlingNetworkAPI = (*GChatClient)(nil) ) func portalToGroupId(portal *bridgev2.Portal) (*proto.GroupId, error) { @@ -72,17 +73,7 @@ func (c *GChatClient) HandleMatrixMessage(ctx context.Context, msg *bridgev2.Mat topicId = string(msg.ThreadRoot.ID) } messageInfo.ReplyTo = &proto.SendReplyTarget{ - Id: &proto.MessageId{ - ParentId: &proto.MessageParentId{ - Parent: &proto.MessageParentId_TopicId{ - TopicId: &proto.TopicId{ - GroupId: groupId, - TopicId: topicId, - }, - }, - }, - MessageId: replyToId, - }, + Id: c.makeMessageId(msg.Portal, topicId, replyToId), CreateTime: msg.ReplyTo.Timestamp.UnixMicro(), } } @@ -146,11 +137,6 @@ func (c *GChatClient) HandleMatrixMessage(ctx context.Context, msg *bridgev2.Mat } func (c *GChatClient) HandleMatrixEdit(ctx context.Context, msg *bridgev2.MatrixEdit) error { - groupId, err := portalToGroupId(msg.Portal) - if err != nil { - return err - } - text, entities := c.msgConv.ToGChat(ctx, msg.Content) msgId := string(msg.EditTarget.ID) threadId := string(msg.EditTarget.ThreadRoot) @@ -158,18 +144,8 @@ func (c *GChatClient) HandleMatrixEdit(ctx context.Context, msg *bridgev2.Matrix if threadId != "" { topicId = threadId } - res, err := c.client.EditMessage(ctx, &proto.EditMessageRequest{ - MessageId: &proto.MessageId{ - ParentId: &proto.MessageParentId{ - Parent: &proto.MessageParentId_TopicId{ - TopicId: &proto.TopicId{ - GroupId: groupId, - TopicId: topicId, - }, - }, - }, - MessageId: msgId, - }, + _, err := c.client.EditMessage(ctx, &proto.EditMessageRequest{ + MessageId: c.makeMessageId(msg.Portal, topicId, msgId), TextBody: text, Annotations: entities, MessageInfo: &proto.MessageInfo{ @@ -179,7 +155,22 @@ func (c *GChatClient) HandleMatrixEdit(ctx context.Context, msg *bridgev2.Matrix if err != nil { return err } - _ = res + return nil +} + +func (c *GChatClient) HandleMatrixMessageRemove(ctx context.Context, msg *bridgev2.MatrixMessageRemove) error { + msgId := string(msg.TargetMessage.ID) + threadId := string(msg.TargetMessage.ThreadRoot) + topicId := msgId + if threadId != "" { + topicId = threadId + } + _, err := c.client.DeleteMessage(ctx, &proto.DeleteMessageRequest{ + MessageId: c.makeMessageId(msg.Portal, topicId, msgId), + }) + if err != nil { + return err + } return nil } @@ -213,26 +204,11 @@ func (c *GChatClient) HandleMatrixReactionRemove(ctx context.Context, msg *bridg } func (c *GChatClient) doHandleMatrixReaction(ctx context.Context, portal *bridgev2.Portal, topicId, messageId, emoji string, typ proto.UpdateReactionRequest_ReactionUpdateType) error { - groupId, err := portalToGroupId(portal) - if err != nil { - return err - } - if topicId == "" { topicId = messageId } - _, err = c.client.UpdateReaction(ctx, &proto.UpdateReactionRequest{ - MessageId: &proto.MessageId{ - ParentId: &proto.MessageParentId{ - Parent: &proto.MessageParentId_TopicId{ - TopicId: &proto.TopicId{ - GroupId: groupId, - TopicId: topicId, - }, - }, - }, - MessageId: messageId, - }, + _, err := c.client.UpdateReaction(ctx, &proto.UpdateReactionRequest{ + MessageId: c.makeMessageId(portal, topicId, messageId), Emoji: &proto.Emoji{ Content: &proto.Emoji_Unicode{ Unicode: emoji, diff --git a/pkg/connector/ids.go b/pkg/connector/ids.go index ec24fc8..6ea18b7 100644 --- a/pkg/connector/ids.go +++ b/pkg/connector/ids.go @@ -1,6 +1,8 @@ package connector import ( + "google.golang.org/protobuf/encoding/prototext" + "maunium.net/go/mautrix/bridgev2" "maunium.net/go/mautrix/bridgev2/networkid" "go.mau.fi/mautrix-googlechat/pkg/gchatmeow/proto" @@ -12,3 +14,19 @@ func (c *GChatClient) makePortalKey(evt *proto.Event) networkid.PortalKey { Receiver: c.userLogin.ID, } } + +func (c *GChatClient) makeMessageId(portal *bridgev2.Portal, topicId, msgId string) *proto.MessageId { + groupId := &proto.GroupId{} + prototext.Unmarshal([]byte(portal.ID), groupId) + return &proto.MessageId{ + ParentId: &proto.MessageParentId{ + Parent: &proto.MessageParentId_TopicId{ + TopicId: &proto.TopicId{ + GroupId: groupId, + TopicId: topicId, + }, + }, + }, + MessageId: msgId, + } +} diff --git a/pkg/gchatmeow/api.go b/pkg/gchatmeow/api.go index aa73f86..1eade8b 100644 --- a/pkg/gchatmeow/api.go +++ b/pkg/gchatmeow/api.go @@ -150,6 +150,12 @@ func (c *Client) EditMessage(ctx context.Context, request *proto.EditMessageRequ return response, c.gcRequest(ctx, "edit_message", request, response) } +func (c *Client) DeleteMessage(ctx context.Context, request *proto.DeleteMessageRequest) (*proto.DeleteMessageResponse, error) { + request.RequestHeader = c.gcRequestHeader + response := &proto.DeleteMessageResponse{} + return response, c.gcRequest(ctx, "delete_message", request, response) +} + func (c *Client) GetGroup(ctx context.Context, request *proto.GetGroupRequest) (*proto.GetGroupResponse, error) { request.RequestHeader = c.gcRequestHeader response := &proto.GetGroupResponse{} diff --git a/pkg/gchatmeow/session.go b/pkg/gchatmeow/session.go index 308a819..fd308f5 100644 --- a/pkg/gchatmeow/session.go +++ b/pkg/gchatmeow/session.go @@ -13,8 +13,7 @@ import ( ) const ( - connectTimeout = 30 * time.Second - requestTimeout = 30 * time.Second + timeout = 90 * time.Second maxRetries = 3 originURL = "https://chat.google.com" latestChromeVer = "114" @@ -94,7 +93,7 @@ func NewSession(cookies *Cookies, proxyURL string, userAgent string) (*Session, TLSClientConfig: nil, // equivalent to ssl=False in Python DisableCompression: true, }, - Timeout: connectTimeout, + Timeout: timeout, } return &Session{