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

linkedingo: start working on fetching messages

parent 939597cf
No related branches found
No related tags found
No related merge requests found
package connector
import (
"context"
"fmt"
"strconv"
"time"
"go.mau.fi/util/jsontime"
"maunium.net/go/mautrix/bridgev2"
"go.mau.fi/mautrix-linkedin/pkg/linkedingo/types"
"go.mau.fi/mautrix-linkedin/pkg/linkedingoold/routingold/queryold"
)
func (l *LinkedInClient) FetchMessages(ctx context.Context, fetchParams bridgev2.FetchMessagesParams) (*bridgev2.FetchMessagesResponse, error) {
variables := queryold.FetchMessagesVariables{
ConversationURN: types.NewURN(fetchParams.Portal.ID),
CountBefore: 20,
}
if fetchParams.Cursor == "" {
if fetchParams.AnchorMessage != nil {
variables.DeliveredAt = jsontime.UM(fetchParams.AnchorMessage.Timestamp)
}
} else {
deliveredAt, err := strconv.ParseInt(string(fetchParams.Cursor), 10, 64)
if err != nil {
return nil, err
}
variables.DeliveredAt = jsontime.UnixMilli{Time: time.UnixMilli(deliveredAt)}
}
fetchMessages, err := l.client.FetchMessages(ctx, variables)
if err != nil {
return nil, err
}
fmt.Printf("%+v\n", fetchMessages)
panic("here")
//
// messages := fetchMessages.Messages
// sort.Slice(messages, func(j, i int) bool {
// return messages[j].DeliveredAt < messages[i].DeliveredAt
// })
//
// backfilledMessages := make([]*bridgev2.BackfillMessage, len(messages))
// cursor := networkid.PaginationCursor("")
// if len(messages) > 0 {
// cursor = networkid.PaginationCursor(strconv.FormatInt(messages[0].DeliveredAt, 10))
//
// backfilledMessages, err = l.MessagesToBackfillMessages(ctx, messages, fetchParams.Portal)
// if err != nil {
// return nil, err
// }
// }
//
// return &bridgev2.FetchMessagesResponse{
// Messages: backfilledMessages,
// Cursor: cursor,
// HasMore: len(messages) >= 20,
// Forward: fetchParams.Forward,
// }, nil
//
}
......@@ -54,8 +54,7 @@ var (
_ bridgev2.RedactionHandlingNetworkAPI = (*LinkedInClient)(nil)
_ bridgev2.ReadReceiptHandlingNetworkAPI = (*LinkedInClient)(nil)
_ bridgev2.TypingHandlingNetworkAPI = (*LinkedInClient)(nil)
// _ bridgev2.BackfillingNetworkAPI = (*LinkedInClient)(nil)
// _ bridgev2.BackfillingNetworkAPIWithLimits = (*LinkedInClient)(nil)
_ bridgev2.BackfillingNetworkAPI = (*LinkedInClient)(nil)
// _ bridgev2.IdentifierResolvingNetworkAPI = (*LinkedInClient)(nil)
// _ bridgev2.ContactListingNetworkAPI = (*LinkedInClient)(nil)
// _ bridgev2.UserSearchingNetworkAPI = (*LinkedInClient)(nil)
......
package connectorold
import (
"context"
"sort"
"strconv"
"maunium.net/go/mautrix/bridgev2"
"maunium.net/go/mautrix/bridgev2/networkid"
"go.mau.fi/mautrix-linkedin/pkg/linkedingoold/routingold/queryold"
)
var _ bridgev2.BackfillingNetworkAPI = (*LinkedInClient)(nil)
func (lc *LinkedInClient) FetchMessages(ctx context.Context, params bridgev2.FetchMessagesParams) (*bridgev2.FetchMessagesResponse, error) {
conversationUrn := string(params.Portal.ID)
variables := queryold.FetchMessagesVariables{
ConversationUrn: conversationUrn,
CountBefore: 20,
}
if params.Cursor == "" {
if params.AnchorMessage != nil {
variables.DeliveredAt = params.AnchorMessage.Timestamp.UnixMilli()
}
} else {
var err error
variables.DeliveredAt, err = strconv.ParseInt(string(params.Cursor), 10, 64)
if err != nil {
return nil, err
}
}
fetchMessages, err := lc.client.FetchMessages(variables)
if err != nil {
return nil, err
}
messages := fetchMessages.Messages
sort.Slice(messages, func(j, i int) bool {
return messages[j].DeliveredAt < messages[i].DeliveredAt
})
backfilledMessages := make([]*bridgev2.BackfillMessage, len(messages))
cursor := networkid.PaginationCursor("")
if len(messages) > 0 {
cursor = networkid.PaginationCursor(strconv.FormatInt(messages[0].DeliveredAt, 10))
backfilledMessages, err = lc.MessagesToBackfillMessages(ctx, messages, params.Portal)
if err != nil {
return nil, err
}
}
return &bridgev2.FetchMessagesResponse{
Messages: backfilledMessages,
Cursor: cursor,
HasMore: len(messages) >= 20,
Forward: params.Forward,
}, nil
}
......@@ -17,6 +17,7 @@
package linkedingo
const (
linkedInVoyagerMessagingGraphQLURL = "https://www.linkedin.com/voyager/api/voyagerMessagingGraphQL/graphql"
linkedInLogoutURL = "https://www.linkedin.com/uas/logout"
linkedInMessagingBaseURL = "https://www.linkedin.com/messaging"
linkedInMessagingDashMessengerConversationsURL = "https://www.linkedin.com/voyager/api/voyagerMessagingDashMessengerConversations"
......@@ -55,3 +56,12 @@ const (
RealtimeEventTopicMessagingDataSync = "messagingDataSyncTopic"
RealtimeEventTopicPresenceStatus = "presenceStatusTopic"
)
const (
graphQLQueryIDMessengerConversations = "messengerConversations.95e0a4b80fbc6bc53550e670d34d05d9"
graphQLQueryIDMessengerConversationsWithCursor = "messengerConversations.18240d6a3ac199067a703996eeb4b163"
graphQLQueryIDMessengerConversationsWithSyncToken = "messengerConversations.be2479ed77df3dd407dd90efc8ac41de"
graphQLQueryIDMessengerMessagesBySyncToken = "messengerMessages.d1b494ac18c24c8be71ea07b5bd1f831"
graphQLQueryIDMessengerMessagesByAnchorTimestamp = "messengerMessages.b52340f92136e74c2aab21dac7cf7ff2"
graphQLQueryIDMessengerMessagesByConversation = "messengerMessages.86ca573adc64110d94d8bce89c5b2f3b"
)
......@@ -12,6 +12,8 @@ import (
"go.mau.fi/util/random"
"go.mau.fi/mautrix-linkedin/pkg/linkedingo/types"
"go.mau.fi/mautrix-linkedin/pkg/linkedingoold/routingold/queryold"
"go.mau.fi/mautrix-linkedin/pkg/linkedingoold/routingold/responseold"
)
type sendMessagePayload struct {
......@@ -144,3 +146,48 @@ func (c *Client) RecallMessage(ctx context.Context, messageURN types.URN) error
}
return nil
}
func (c *Client) FetchMessages(ctx context.Context, variables queryold.FetchMessagesVariables) (*responseold.MessengerMessagesResponse, error) {
withCursor := variables.PrevCursor != ""
withAnchorTimestamp := !variables.DeliveredAt.IsZero()
var queryID string
if withCursor {
queryID = graphQLQueryIDMessengerMessagesByConversation
} else if withAnchorTimestamp {
queryID = graphQLQueryIDMessengerMessagesByAnchorTimestamp
} else {
queryID = graphQLQueryIDMessengerMessagesBySyncToken
}
fmt.Printf("queryID = %s\n", queryID)
return nil, nil
// variablesQuery, err := variables.Encode()
// if err != nil {
// return nil, err
// }
//
// resp, err := c.newAuthedRequest(http.MethodGet, linkedInVoyagerMessagingGraphQLURL).
// WithGraphQLQuery(queryID, variables).
// WithCSRF().
// WithXLIHeaders().
// WithHeader("accept", contentTypeGraphQL).
// Do(ctx)
// if err != nil {
// return nil, err
// }
//
// var graphQLResponse responseold.GraphQlResponse
// if err = json.NewDecoder(resp.Body).Decode(&graphQLResponse); err != nil {
// return nil, err
// }
//
// graphQLResponseData := graphQLResponse.Data
// if withCursor {
// return graphQLResponseData.MessengerMessagesByConversation, nil
// } else if withAnchorTimestamp {
// return graphQLResponseData.MessengerMessagesByAnchorTimestamp, nil
// } else {
// return graphQLResponseData.MessengerMessagesBySyncToken, nil
// }
}
......@@ -9,6 +9,7 @@ import (
"net/http"
"net/http/httputil"
"net/url"
"strings"
"go.mau.fi/util/exerrors"
)
......@@ -68,6 +69,29 @@ func (a *authedRequest) WithRawQuery(raw string) *authedRequest {
return a
}
func (a *authedRequest) WithGraphQLQuery(queryID string, variables map[string]string) *authedRequest {
var queryStr strings.Builder
queryStr.WriteString("query=")
queryStr.WriteString(queryID)
queryStr.WriteString("&variables=(")
first := true
for k, v := range variables {
if v == "" {
continue
}
if !first {
queryStr.WriteString(",")
}
first = false
queryStr.WriteString(k)
queryStr.WriteByte(':')
queryStr.WriteString(url.QueryEscape(v))
}
queryStr.WriteString(")")
a.rawQuery = queryStr.String()
return a
}
func (a *authedRequest) WithCSRF() *authedRequest {
return a.WithHeader("csrf-token", a.client.getCSRFToken())
}
......
......@@ -65,7 +65,7 @@ func (c *Client) GetThreads(variables queryold.GetThreadsVariables) (*responseol
func (c *Client) FetchMessages(variables queryold.FetchMessagesVariables) (*responseold.MessengerMessagesResponse, error) {
withCursor := variables.PrevCursor != ""
withAnchorTimestamp := variables.DeliveredAt != 0
withAnchorTimestamp := !variables.DeliveredAt.IsZero()
var queryId typesold.GraphQLQueryIDs
if withCursor {
......
package queryold
import (
"go.mau.fi/util/jsontime"
"go.mau.fi/mautrix-linkedin/pkg/linkedingo/types"
"go.mau.fi/mautrix-linkedin/pkg/linkedingoold/methodsold"
)
......@@ -47,12 +50,12 @@ func (q GetThreadsVariables) Encode() ([]byte, error) {
}
type FetchMessagesVariables struct {
DeliveredAt int64 `graphql:"deliveredAt"`
ConversationUrn string `graphql:"conversationUrn"`
Count int64 `graphql:"count"`
PrevCursor string `graphql:"prevCursor"`
CountBefore int64 `graphql:"countBefore"`
CountAfter int64 `graphql:"countAfter"`
DeliveredAt jsontime.UnixMilli `graphql:"deliveredAt"`
ConversationURN types.URN `graphql:"conversationUrn"`
Count int64 `graphql:"count"`
PrevCursor string `graphql:"prevCursor"`
CountBefore int64 `graphql:"countBefore"`
CountAfter int64 `graphql:"countAfter"`
}
func (q FetchMessagesVariables) Encode() ([]byte, error) {
......
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