Skip to content
Snippets Groups Projects
Unverified Commit 1a860980 authored by Sumner Evans's avatar Sumner Evans
Browse files

connector: support sending reactions

parent bd3f6384
No related branches found
No related tags found
No related merge requests found
Pipeline #16504 passed
......@@ -23,6 +23,7 @@ require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/gorilla/mux v1.8.1 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/kr/pretty v0.1.0 // indirect
github.com/lib/pq v1.10.9 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
......@@ -41,6 +42,7 @@ require (
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.29.0 // indirect
golang.org/x/text v0.21.0 // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
maunium.net/go/mauflag v1.0.0 // indirect
)
......@@ -18,6 +18,11 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
......@@ -75,8 +80,9 @@ golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
......
......@@ -148,8 +148,7 @@ func (*LinkedInClient) GetCapabilities(ctx context.Context, portal *bridgev2.Por
Reply: event.CapLevelDropped,
Edit: event.CapLevelFullySupported, // TODO note that edits are restricted to specific msgtypes
Delete: event.CapLevelDropped,
Reaction: event.CapLevelDropped,
ReactionCount: 1,
Reaction: event.CapLevelFullySupported,
ReadReceipts: true,
TypingNotifications: true,
}
......
......@@ -48,9 +48,9 @@ type LinkedInClient struct {
}
var (
_ bridgev2.NetworkAPI = (*LinkedInClient)(nil)
_ bridgev2.EditHandlingNetworkAPI = (*LinkedInClient)(nil)
// _ bridgev2.ReactionHandlingNetworkAPI = (*LinkedInClient)(nil)
_ bridgev2.NetworkAPI = (*LinkedInClient)(nil)
_ bridgev2.EditHandlingNetworkAPI = (*LinkedInClient)(nil)
_ bridgev2.ReactionHandlingNetworkAPI = (*LinkedInClient)(nil)
_ bridgev2.RedactionHandlingNetworkAPI = (*LinkedInClient)(nil)
// _ bridgev2.ReadReceiptHandlingNetworkAPI = (*LinkedInClient)(nil)
// _ bridgev2.TypingHandlingNetworkAPI = (*LinkedInClient)(nil)
......
......@@ -5,11 +5,15 @@ import (
"fmt"
"os"
"github.com/rs/zerolog"
"maunium.net/go/mautrix/bridgev2"
"maunium.net/go/mautrix/bridgev2/database"
"maunium.net/go/mautrix/bridgev2/networkid"
"maunium.net/go/mautrix/event"
"maunium.net/go/mautrix/id"
"go.mau.fi/util/variationselector"
"go.mau.fi/mautrix-linkedin/pkg/connector/matrixfmt"
"go.mau.fi/mautrix-linkedin/pkg/linkedingo"
"go.mau.fi/mautrix-linkedin/pkg/linkedingo/types"
......@@ -88,3 +92,27 @@ func (l *LinkedInClient) HandleMatrixEdit(ctx context.Context, msg *bridgev2.Mat
func (l *LinkedInClient) HandleMatrixMessageRemove(ctx context.Context, msg *bridgev2.MatrixMessageRemove) error {
return l.client.RecallMessage(ctx, types.NewURN(msg.TargetMessage.ID))
}
func (l *LinkedInClient) PreHandleMatrixReaction(ctx context.Context, msg *bridgev2.MatrixReaction) (bridgev2.MatrixReactionPreResponse, error) {
emojiID := networkid.EmojiID(msg.Content.RelatesTo.Key)
zerolog.Ctx(ctx).Debug().
Str("conversion_direction", "to_linkedin").
Str("handler", "pre_handle_matrix_reaction").
Str("key", msg.Content.RelatesTo.Key).
Str("emoji_id", string(emojiID)).
Msg("Pre-handled reaction")
return bridgev2.MatrixReactionPreResponse{
SenderID: l.userID,
EmojiID: emojiID,
Emoji: variationselector.FullyQualify(msg.Content.RelatesTo.Key),
}, nil
}
func (l *LinkedInClient) HandleMatrixReaction(ctx context.Context, msg *bridgev2.MatrixReaction) (reaction *database.Reaction, err error) {
return &database.Reaction{}, l.client.SendReaction(ctx, types.NewURN(msg.TargetMessage.ID), msg.PreHandleResp.Emoji)
}
func (l *LinkedInClient) HandleMatrixReactionRemove(ctx context.Context, msg *bridgev2.MatrixReactionRemove) error {
return l.client.RemoveReaction(ctx, types.NewURN(msg.TargetReaction.MessageID), msg.TargetReaction.Emoji)
}
package linkedingo
import (
"context"
"fmt"
"net/http"
"go.mau.fi/mautrix-linkedin/pkg/linkedingo/types"
)
func (c *Client) SendReaction(ctx context.Context, messageURN types.URN, emoji string) error {
return c.doReactAction(ctx, messageURN, emoji, "reactWithEmoji")
}
func (c *Client) RemoveReaction(ctx context.Context, messageURN types.URN, emoji string) error {
return c.doReactAction(ctx, messageURN, emoji, "unreactWithEmoji")
}
func (c *Client) doReactAction(ctx context.Context, messageURN types.URN, emoji, action string) error {
resp, err := c.newAuthedRequest(http.MethodPost, linkedInVoyagerMessagingDashMessengerMessagesURL).
WithParam("action", action).
WithContentType(contentTypePlaintextUTF8).
WithCSRF().
WithHeader("accept", contentTypeJSON).
WithJSONPayload(map[string]any{
"messageUrn": messageURN,
"emoji": emoji,
}).
WithXLIHeaders().
Do(ctx)
if err != nil {
return err
}
if resp.StatusCode != http.StatusNoContent {
return fmt.Errorf("failed to %s reaction %s to message %s (statusCode=%d)", action, emoji, messageURN, resp.StatusCode)
}
return nil
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment