Skip to content

Commit 21edd8e

Browse files
committed
events for name update, delete conv, new members
1 parent 0c57f04 commit 21edd8e

File tree

6 files changed

+143
-5
lines changed

6 files changed

+143
-5
lines changed

pkg/connector/client.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ package connector
1919
import (
2020
"context"
2121
"fmt"
22+
"strings"
23+
2224
"github.com/rs/zerolog"
2325
"go.mau.fi/mautrix-twitter/pkg/twittermeow"
2426
"go.mau.fi/mautrix-twitter/pkg/twittermeow/cookies"
@@ -173,7 +175,9 @@ func (tc *TwitterClient) convertToMatrix(ctx context.Context, portal *bridgev2.P
173175
RemoveEntityLinkFromText(textPart, indices)
174176
}
175177

176-
parts = append(parts, textPart)
178+
if len(textPart.Content.Body) > 0 {
179+
parts = append(parts, textPart)
180+
}
177181

178182
cm := &bridgev2.ConvertedMessage{
179183
ReplyTo: MessageOptionalPartID,
@@ -192,4 +196,15 @@ func (tc *TwitterClient) MakePortalKey(conv types.Conversation) networkid.Portal
192196
ID: networkid.PortalID(conv.ConversationID),
193197
Receiver: receiver,
194198
}
199+
}
200+
201+
func (tc *TwitterClient) MakePortalKeyFromID(conversationId string) networkid.PortalKey {
202+
var receiver networkid.UserLoginID
203+
if strings.Contains(conversationId, "-") {
204+
receiver = tc.userLogin.ID
205+
}
206+
return networkid.PortalKey{
207+
ID: networkid.PortalID(conversationId),
208+
Receiver: receiver,
209+
}
195210
}

pkg/connector/handletwit.go

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"go.mau.fi/mautrix-twitter/pkg/twittermeow/event"
77
"maunium.net/go/mautrix/bridgev2"
88
"maunium.net/go/mautrix/bridgev2/networkid"
9+
"maunium.net/go/mautrix/bridgev2/simplevent"
910
)
1011

1112
func (tc *TwitterClient) HandleTwitterEvent(rawEvt any) {
@@ -66,8 +67,61 @@ func (tc *TwitterClient) HandleTwitterEvent(rawEvt any) {
6667
tc.connector.br.QueueRemoteEvent(tc.userLogin, messageDeleteRemoteEvent)
6768
}
6869
case event.XEventConversationNameUpdate:
69-
tc.client.Logger.Info().Str("new_name", evtData.Name).Any("conversation_id", evtData.Conversation.ConversationID).Any("executor", evtData.Executor).Msg("XEventConversationNameUpdate")
70+
portalUpdateRemoteEvent := &simplevent.ChatInfoChange{
71+
EventMeta: simplevent.EventMeta{
72+
Type: bridgev2.RemoteEventChatInfoChange,
73+
Sender: bridgev2.EventSender{
74+
IsFromMe: evtData.Executor.IDStr == string(tc.userLogin.ID),
75+
SenderLogin: networkid.UserLoginID(evtData.Executor.IDStr),
76+
Sender: networkid.UserID(evtData.Executor.IDStr),
77+
},
78+
LogContext: func(c zerolog.Context) zerolog.Context {
79+
return c.
80+
Str("conversation_id", evtData.Conversation.ConversationID).
81+
Str("new_name", evtData.Name).
82+
Str("changed_by_user_id", evtData.Executor.IDStr)
83+
},
84+
PortalKey: tc.MakePortalKey(evtData.Conversation),
85+
Timestamp: evtData.UpdatedAt,
86+
},
87+
ChatInfoChange: &bridgev2.ChatInfoChange{
88+
ChatInfo: &bridgev2.ChatInfo{
89+
Name: &evtData.Name,
90+
},
91+
},
92+
}
93+
tc.connector.br.QueueRemoteEvent(tc.userLogin, portalUpdateRemoteEvent)
94+
case event.XEventParticipantsJoined:
95+
portalMembersAddedRemoteEvent := &simplevent.ChatInfoChange{
96+
EventMeta: simplevent.EventMeta{
97+
Type: bridgev2.RemoteEventChatInfoChange,
98+
LogContext: func(c zerolog.Context) zerolog.Context {
99+
return c.
100+
Str("conversation_id", evtData.Conversation.ConversationID).
101+
Int("total_new_members", len(evtData.NewParticipants))
102+
},
103+
PortalKey: tc.MakePortalKey(evtData.Conversation),
104+
Timestamp: evtData.EventTime,
105+
},
106+
ChatInfoChange: &bridgev2.ChatInfoChange{
107+
MemberChanges: tc.UsersToMemberList(evtData.NewParticipants),
108+
},
109+
}
110+
tc.connector.br.QueueRemoteEvent(tc.userLogin, portalMembersAddedRemoteEvent)
70111
case event.XEventConversationDelete:
112+
portalDeleteRemoteEvent := &simplevent.ChatDelete{
113+
EventMeta: simplevent.EventMeta{
114+
Type: bridgev2.RemoteEventChatDelete,
115+
PortalKey: tc.MakePortalKeyFromID(evtData.ConversationID),
116+
LogContext: func(c zerolog.Context) zerolog.Context {
117+
return c.
118+
Str("conversation_id", evtData.ConversationID)
119+
},
120+
Timestamp: evtData.DeletedAt,
121+
},
122+
OnlyForMe: true,
123+
}
124+
tc.connector.br.QueueRemoteEvent(tc.userLogin, portalDeleteRemoteEvent)
71125
tc.client.Logger.Info().Any("data", evtData).Msg("Deleted conversation")
72126
default:
73127
tc.client.Logger.Warn().Any("event_data", evtData).Msg("Received unhandled event case from twitter library")

pkg/connector/mapping.go

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,10 @@ func (tc *TwitterClient) MessageToBackfillMessage(ctx context.Context, message t
7474
parts = append(parts, convertedAttachmentPart)
7575
}
7676

77-
parts = append(parts, textPart)
77+
if len(textPart.Content.Body) > 0 {
78+
parts = append(parts, textPart)
79+
}
80+
7881
return &bridgev2.BackfillMessage{
7982
ConvertedMessage: &bridgev2.ConvertedMessage{
8083
ReplyTo: replyTo,
@@ -90,10 +93,9 @@ func (tc *TwitterClient) MessageToBackfillMessage(ctx context.Context, message t
9093
}, nil
9194
}
9295

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

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

146+
func (tc *TwitterClient) UsersToMemberList(users []types.User) *bridgev2.ChatMemberList {
147+
selfUserId := tc.client.GetCurrentUserID()
148+
chatMembers := make([]bridgev2.ChatMember, len(users)-1)
149+
for _, user := range users {
150+
chatMembers = append(chatMembers, tc.UserToChatMember(user, user.IDStr == selfUserId))
151+
}
152+
153+
return &bridgev2.ChatMemberList{
154+
IsFull: true,
155+
TotalMemberCount: len(users),
156+
Members: chatMembers,
157+
}
158+
}
159+
144160
func (tc *TwitterClient) ParticipantsToMemberList(participants []types.Participant) *bridgev2.ChatMemberList {
145161
selfUserId := tc.client.GetCurrentUserID()
146162
chatMembers := make([]bridgev2.ChatMember, len(participants)-1)
@@ -155,6 +171,19 @@ func (tc *TwitterClient) ParticipantsToMemberList(participants []types.Participa
155171
}
156172
}
157173

174+
func (tc *TwitterClient) UserToChatMember(user types.User, isFromMe bool) bridgev2.ChatMember {
175+
return bridgev2.ChatMember{
176+
EventSender: bridgev2.EventSender{
177+
IsFromMe: isFromMe,
178+
Sender: networkid.UserID(user.IDStr),
179+
},
180+
UserInfo: &bridgev2.UserInfo{
181+
Name: &user.Name,
182+
Avatar: MakeAvatar(user.ProfileImageURL),
183+
},
184+
}
185+
}
186+
158187
func (tc *TwitterClient) ParticipantToChatMember(participant types.Participant, isFromMe bool) bridgev2.ChatMember {
159188
return bridgev2.ChatMember{
160189
EventSender: bridgev2.EventSender{

pkg/twittermeow/data/response/events.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,26 @@ func (data *XInboxData) ToEventEntries() ([]interface{}, error) {
129129
AffectsSort: convNameUpdateEventData.AffectsSort,
130130
UpdatedAt: updatedAt,
131131
}
132+
case event.XParticipantsJoinedEvent:
133+
var participantsJoinedEventData types.ParticipantsJoinedData
134+
err = json.Unmarshal(jsonEvData, &participantsJoinedEventData)
135+
if err != nil {
136+
return nil, err
137+
}
138+
139+
eventTime, err := methods.UnixStringMilliToTime(participantsJoinedEventData.Time)
140+
if err != nil {
141+
return nil, err
142+
}
143+
144+
updatedEntry = event.XEventParticipantsJoined{
145+
EventID: participantsJoinedEventData.ID,
146+
EventTime: eventTime,
147+
AffectsSort: participantsJoinedEventData.AffectsSort,
148+
Conversation: data.GetConversationByID(participantsJoinedEventData.ConversationID),
149+
Sender: data.GetUserByID(participantsJoinedEventData.SenderID),
150+
NewParticipants: data.GetParticipantUsers(participantsJoinedEventData.Participants),
151+
}
132152
case event.XMessageDeleteEvent:
133153
var messageDeletedEventData types.MessageDeleted
134154
err = json.Unmarshal(jsonEvData, &messageDeletedEventData)

pkg/twittermeow/data/types/messaging.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,16 @@ type ConversationNameUpdateData struct {
8686
AffectsSort bool `json:"affects_sort,omitempty"`
8787
}
8888

89+
90+
type ParticipantsJoinedData struct {
91+
ID string `json:"id,omitempty"`
92+
Time string `json:"time,omitempty"`
93+
AffectsSort bool `json:"affects_sort,omitempty"`
94+
ConversationID string `json:"conversation_id,omitempty"`
95+
SenderID string `json:"sender_id,omitempty"`
96+
Participants []Participant `json:"participants,omitempty"`
97+
}
98+
8999
type ConversationType string
90100

91101
const (

pkg/twittermeow/event/event.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const (
1717
XConversationNameUpdate XEventType = "conversation_name_update"
1818
XConversationCreateEvent XEventType = "conversation_create"
1919
XConversationDeleteEvent XEventType = "remove_conversation"
20+
XParticipantsJoinedEvent XEventType = "participants_join"
2021
XDisableNotificationsEvent XEventType = "disable_notifications"
2122
)
2223

@@ -58,6 +59,15 @@ type XEventConversationDelete struct {
5859
LastEventID string
5960
}
6061

62+
type XEventParticipantsJoined struct {
63+
EventID string
64+
EventTime time.Time
65+
AffectsSort bool
66+
Conversation types.Conversation
67+
Sender types.User
68+
NewParticipants []types.User
69+
}
70+
6171
type XEventConversationMetadataUpdate struct {
6272
Conversation types.Conversation
6373
EventID string

0 commit comments

Comments
 (0)