Skip to content

Commit

Permalink
events for name update, delete conv, new members
Browse files Browse the repository at this point in the history
  • Loading branch information
0xzer committed Aug 12, 2024
1 parent 0c57f04 commit 21edd8e
Show file tree
Hide file tree
Showing 6 changed files with 143 additions and 5 deletions.
17 changes: 16 additions & 1 deletion pkg/connector/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ package connector
import (
"context"
"fmt"
"strings"

"github.com/rs/zerolog"
"go.mau.fi/mautrix-twitter/pkg/twittermeow"

Check failure on line 25 in pkg/connector/client.go

View workflow job for this annotation

GitHub Actions / Lint (latest)

maunium.net/go/mautrix@v0.19.1-0.20240720173515-24ead553b23b: replacement directory ./pkg/mautrix does not exist
"go.mau.fi/mautrix-twitter/pkg/twittermeow/cookies"
Expand Down Expand Up @@ -173,7 +175,9 @@ func (tc *TwitterClient) convertToMatrix(ctx context.Context, portal *bridgev2.P
RemoveEntityLinkFromText(textPart, indices)
}

parts = append(parts, textPart)
if len(textPart.Content.Body) > 0 {
parts = append(parts, textPart)
}

cm := &bridgev2.ConvertedMessage{
ReplyTo: MessageOptionalPartID,
Expand All @@ -192,4 +196,15 @@ func (tc *TwitterClient) MakePortalKey(conv types.Conversation) networkid.Portal
ID: networkid.PortalID(conv.ConversationID),
Receiver: receiver,
}
}

func (tc *TwitterClient) MakePortalKeyFromID(conversationId string) networkid.PortalKey {
var receiver networkid.UserLoginID
if strings.Contains(conversationId, "-") {
receiver = tc.userLogin.ID
}
return networkid.PortalKey{
ID: networkid.PortalID(conversationId),
Receiver: receiver,
}
}
56 changes: 55 additions & 1 deletion pkg/connector/handletwit.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"go.mau.fi/mautrix-twitter/pkg/twittermeow/event"
"maunium.net/go/mautrix/bridgev2"
"maunium.net/go/mautrix/bridgev2/networkid"
"maunium.net/go/mautrix/bridgev2/simplevent"
)

func (tc *TwitterClient) HandleTwitterEvent(rawEvt any) {
Expand Down Expand Up @@ -66,8 +67,61 @@ func (tc *TwitterClient) HandleTwitterEvent(rawEvt any) {
tc.connector.br.QueueRemoteEvent(tc.userLogin, messageDeleteRemoteEvent)
}
case event.XEventConversationNameUpdate:
tc.client.Logger.Info().Str("new_name", evtData.Name).Any("conversation_id", evtData.Conversation.ConversationID).Any("executor", evtData.Executor).Msg("XEventConversationNameUpdate")
portalUpdateRemoteEvent := &simplevent.ChatInfoChange{
EventMeta: simplevent.EventMeta{
Type: bridgev2.RemoteEventChatInfoChange,
Sender: bridgev2.EventSender{
IsFromMe: evtData.Executor.IDStr == string(tc.userLogin.ID),
SenderLogin: networkid.UserLoginID(evtData.Executor.IDStr),
Sender: networkid.UserID(evtData.Executor.IDStr),
},
LogContext: func(c zerolog.Context) zerolog.Context {
return c.
Str("conversation_id", evtData.Conversation.ConversationID).
Str("new_name", evtData.Name).
Str("changed_by_user_id", evtData.Executor.IDStr)
},
PortalKey: tc.MakePortalKey(evtData.Conversation),
Timestamp: evtData.UpdatedAt,
},
ChatInfoChange: &bridgev2.ChatInfoChange{
ChatInfo: &bridgev2.ChatInfo{
Name: &evtData.Name,
},
},
}
tc.connector.br.QueueRemoteEvent(tc.userLogin, portalUpdateRemoteEvent)
case event.XEventParticipantsJoined:
portalMembersAddedRemoteEvent := &simplevent.ChatInfoChange{
EventMeta: simplevent.EventMeta{
Type: bridgev2.RemoteEventChatInfoChange,
LogContext: func(c zerolog.Context) zerolog.Context {
return c.
Str("conversation_id", evtData.Conversation.ConversationID).
Int("total_new_members", len(evtData.NewParticipants))
},
PortalKey: tc.MakePortalKey(evtData.Conversation),
Timestamp: evtData.EventTime,
},
ChatInfoChange: &bridgev2.ChatInfoChange{
MemberChanges: tc.UsersToMemberList(evtData.NewParticipants),
},
}
tc.connector.br.QueueRemoteEvent(tc.userLogin, portalMembersAddedRemoteEvent)
case event.XEventConversationDelete:
portalDeleteRemoteEvent := &simplevent.ChatDelete{
EventMeta: simplevent.EventMeta{
Type: bridgev2.RemoteEventChatDelete,
PortalKey: tc.MakePortalKeyFromID(evtData.ConversationID),
LogContext: func(c zerolog.Context) zerolog.Context {
return c.
Str("conversation_id", evtData.ConversationID)
},
Timestamp: evtData.DeletedAt,
},
OnlyForMe: true,
}
tc.connector.br.QueueRemoteEvent(tc.userLogin, portalDeleteRemoteEvent)
tc.client.Logger.Info().Any("data", evtData).Msg("Deleted conversation")
default:
tc.client.Logger.Warn().Any("event_data", evtData).Msg("Received unhandled event case from twitter library")
Expand Down
35 changes: 32 additions & 3 deletions pkg/connector/mapping.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,10 @@ func (tc *TwitterClient) MessageToBackfillMessage(ctx context.Context, message t
parts = append(parts, convertedAttachmentPart)
}

parts = append(parts, textPart)
if len(textPart.Content.Body) > 0 {
parts = append(parts, textPart)
}

return &bridgev2.BackfillMessage{
ConvertedMessage: &bridgev2.ConvertedMessage{
ReplyTo: replyTo,
Expand All @@ -90,10 +93,9 @@ func (tc *TwitterClient) MessageToBackfillMessage(ctx context.Context, message t
}, nil
}

// bugged, displays an empty message
func RemoveEntityLinkFromText(msgPart *bridgev2.ConvertedMessagePart, indices []int) {
start, end := indices[0], indices[1]
msgPart.Content.Body = msgPart.Content.Body[:start] + msgPart.Content.Body[end:]
msgPart.Content.Body = msgPart.Content.Body[:start-1] + msgPart.Content.Body[end:]
}

func (tc *TwitterClient) MessageReactionsToBackfillReactions(reactions []types.MessageReaction, selfUserId string) ([]*bridgev2.BackfillReaction, error) {
Expand Down Expand Up @@ -141,6 +143,20 @@ func (tc *TwitterClient) ConversationTypeToRoomType(convType types.ConversationT
return &roomType
}

func (tc *TwitterClient) UsersToMemberList(users []types.User) *bridgev2.ChatMemberList {
selfUserId := tc.client.GetCurrentUserID()
chatMembers := make([]bridgev2.ChatMember, len(users)-1)
for _, user := range users {
chatMembers = append(chatMembers, tc.UserToChatMember(user, user.IDStr == selfUserId))
}

return &bridgev2.ChatMemberList{
IsFull: true,
TotalMemberCount: len(users),
Members: chatMembers,
}
}

func (tc *TwitterClient) ParticipantsToMemberList(participants []types.Participant) *bridgev2.ChatMemberList {
selfUserId := tc.client.GetCurrentUserID()
chatMembers := make([]bridgev2.ChatMember, len(participants)-1)
Expand All @@ -155,6 +171,19 @@ func (tc *TwitterClient) ParticipantsToMemberList(participants []types.Participa
}
}

func (tc *TwitterClient) UserToChatMember(user types.User, isFromMe bool) bridgev2.ChatMember {
return bridgev2.ChatMember{
EventSender: bridgev2.EventSender{
IsFromMe: isFromMe,
Sender: networkid.UserID(user.IDStr),
},
UserInfo: &bridgev2.UserInfo{
Name: &user.Name,
Avatar: MakeAvatar(user.ProfileImageURL),
},
}
}

func (tc *TwitterClient) ParticipantToChatMember(participant types.Participant, isFromMe bool) bridgev2.ChatMember {
return bridgev2.ChatMember{
EventSender: bridgev2.EventSender{
Expand Down
20 changes: 20 additions & 0 deletions pkg/twittermeow/data/response/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,26 @@ func (data *XInboxData) ToEventEntries() ([]interface{}, error) {
AffectsSort: convNameUpdateEventData.AffectsSort,
UpdatedAt: updatedAt,
}
case event.XParticipantsJoinedEvent:
var participantsJoinedEventData types.ParticipantsJoinedData
err = json.Unmarshal(jsonEvData, &participantsJoinedEventData)
if err != nil {
return nil, err
}

eventTime, err := methods.UnixStringMilliToTime(participantsJoinedEventData.Time)
if err != nil {
return nil, err
}

updatedEntry = event.XEventParticipantsJoined{
EventID: participantsJoinedEventData.ID,
EventTime: eventTime,
AffectsSort: participantsJoinedEventData.AffectsSort,
Conversation: data.GetConversationByID(participantsJoinedEventData.ConversationID),
Sender: data.GetUserByID(participantsJoinedEventData.SenderID),
NewParticipants: data.GetParticipantUsers(participantsJoinedEventData.Participants),
}
case event.XMessageDeleteEvent:
var messageDeletedEventData types.MessageDeleted
err = json.Unmarshal(jsonEvData, &messageDeletedEventData)
Expand Down
10 changes: 10 additions & 0 deletions pkg/twittermeow/data/types/messaging.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,16 @@ type ConversationNameUpdateData struct {
AffectsSort bool `json:"affects_sort,omitempty"`
}


type ParticipantsJoinedData struct {
ID string `json:"id,omitempty"`
Time string `json:"time,omitempty"`
AffectsSort bool `json:"affects_sort,omitempty"`
ConversationID string `json:"conversation_id,omitempty"`
SenderID string `json:"sender_id,omitempty"`
Participants []Participant `json:"participants,omitempty"`
}

type ConversationType string

const (
Expand Down
10 changes: 10 additions & 0 deletions pkg/twittermeow/event/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ const (
XConversationNameUpdate XEventType = "conversation_name_update"
XConversationCreateEvent XEventType = "conversation_create"
XConversationDeleteEvent XEventType = "remove_conversation"
XParticipantsJoinedEvent XEventType = "participants_join"
XDisableNotificationsEvent XEventType = "disable_notifications"
)

Expand Down Expand Up @@ -58,6 +59,15 @@ type XEventConversationDelete struct {
LastEventID string
}

type XEventParticipantsJoined struct {
EventID string
EventTime time.Time
AffectsSort bool
Conversation types.Conversation
Sender types.User
NewParticipants []types.User
}

type XEventConversationMetadataUpdate struct {
Conversation types.Conversation
EventID string
Expand Down

0 comments on commit 21edd8e

Please sign in to comment.