Skip to content

Commit

Permalink
read receipts / more twitter events
Browse files Browse the repository at this point in the history
  • Loading branch information
0xzer committed Aug 10, 2024
1 parent bbe7cac commit 0c57f04
Show file tree
Hide file tree
Showing 7 changed files with 123 additions and 37 deletions.
42 changes: 21 additions & 21 deletions ROADMAP.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,35 @@
# Features & roadmap

* Matrix → Twitter
* [+] Message content
* [+] Text
* [] Message content
* [] Text
* [ ] Formatting
* [+] Media
* [+] Images
* [+] Videos
* [+] Gifs
* [+] Message reactions
* [] Media
* [] Images
* [] Videos
* [] Gifs
* [] Message reactions
* [ ] Typing notifications
* [ ] Read receipts
* [] Read receipts
* Twitter → Matrix
* [+] Message content
* [+] Text
* [] Message content
* [] Text
* [ ] Formatting
* [+] Media
* [+] Images
* [+] Videos
* [+] Gifs
* [+] Message reactions
* [+] Message history
* [+] When creating portal
* [] Media
* [] Images
* [] Videos
* [] Gifs
* [] Message reactions
* [] Message history
* [] When creating portal
* [ ] Missed messages
* [+] Avatars
* [] Avatars
* [ ] † Typing notifications
* [ ] † Read receipts
* Misc
* [+] Automatic portal creation
* [+] At startup
* [+] When receiving invite or message
* [] Automatic portal creation
* [] At startup
* [] When receiving invite or message
* [ ] Provisioning API for logging in
* [ ] Private chat creation by inviting Matrix puppet of Twitter user to new room
* [ ] Option to use own Matrix account for messages sent from other Twitter clients
Expand Down
1 change: 1 addition & 0 deletions pkg/connector/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ type TwitterClient struct {
var (
_ bridgev2.NetworkAPI = (*TwitterClient)(nil)
_ bridgev2.ReactionHandlingNetworkAPI = (*TwitterClient)(nil)
_ bridgev2.ReadReceiptHandlingNetworkAPI = (*TwitterClient)(nil)
)

func NewTwitterClient(ctx context.Context, tc *TwitterConnector, login *bridgev2.UserLogin) (*TwitterClient, error) {
Expand Down
18 changes: 18 additions & 0 deletions pkg/connector/handlematrix.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,4 +116,22 @@ func (tc *TwitterClient) doHandleMatrixReaction(remove bool, conversationId, mes

tc.client.Logger.Debug().Any("reactionResponse", reactionResponse).Any("payload", reactionPayload).Msg("Reaction response")
return nil
}

func (tc *TwitterClient) HandleMatrixReadReceipt(ctx context.Context, msg *bridgev2.MatrixReadReceipt) error {
params := &payload.MarkConversationReadQuery{
ConversationID: string(msg.Portal.ID),
}

if msg.ExactMessage != nil {
params.LastReadEventID = string(msg.ExactMessage.ID)
} else {
lastMessage, err := tc.userLogin.Bridge.DB.Message.GetLastPartAtOrBeforeTime(ctx, msg.Portal.PortalKey, msg.ReadUpTo)
if err != nil {
return err
}
params.LastReadEventID = string(lastMessage.ID)
}

return tc.client.MarkConversationRead(params)
}
23 changes: 7 additions & 16 deletions pkg/connector/handletwit.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,22 +38,9 @@ func (tc *TwitterClient) HandleTwitterEvent(rawEvt any) {
reactionRemoteEvent := tc.wrapReaction(evtData)
tc.connector.br.QueueRemoteEvent(tc.userLogin, reactionRemoteEvent)
case event.XEventConversationRead:
/*
eventData := &simplevent.Receipt{
EventMeta: simplevent.EventMeta{
Type: bridgev2.RemoteEventReadReceipt,
LogContext: func(c zerolog.Context) zerolog.Context {
return c.
Str("conversation_id", evtData.Conversation.ConversationID).
Str("last_read_event_id", evtData.LastReadEventID).
Str("read_at", evtData.ReadAt.String())
},
PortalKey: tc.MakePortalKey(evtData.Conversation),
},
LastTarget: networkid.MessageID(evtData.LastReadEventID),
Targets: []networkid.MessageID{networkid.MessageID(evtData.LastReadEventID)},
}
*/
// conversation read events are only fired by yourself??
// if another user reads your message this is never fired
// they use user_updates and last_read_event_id to figure that out with the polling client
tc.client.Logger.Info().
Str("conversation_id", evtData.Conversation.ConversationID).
Str("last_read_event_id", evtData.LastReadEventID).
Expand All @@ -78,6 +65,10 @@ 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")
case event.XEventConversationDelete:
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
40 changes: 40 additions & 0 deletions pkg/twittermeow/data/response/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,26 @@ func (data *XInboxData) ToEventEntries() ([]interface{}, error) {
AffectsSort: messageEventData.AffectsSort,
Reactions: messageEventData.MessageReactions,
}
case event.XConversationNameUpdate:
var convNameUpdateEventData types.ConversationNameUpdateData
err = json.Unmarshal(jsonEvData, &convNameUpdateEventData)
if err != nil {
return nil, err
}

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

updatedEntry = event.XEventConversationNameUpdate{
Conversation: data.GetConversationByID(convNameUpdateEventData.ConversationID),
Name: convNameUpdateEventData.ConversationName,
Executor: data.GetUserByID(convNameUpdateEventData.ByUserID),
EventID: convNameUpdateEventData.ID,
AffectsSort: convNameUpdateEventData.AffectsSort,
UpdatedAt: updatedAt,
}
case event.XMessageDeleteEvent:
var messageDeletedEventData types.MessageDeleted
err = json.Unmarshal(jsonEvData, &messageDeletedEventData)
Expand Down Expand Up @@ -148,6 +168,25 @@ func (data *XInboxData) ToEventEntries() ([]interface{}, error) {
AffectsSort: convReadEventData.AffectsSort,
LastReadEventID: convReadEventData.LastReadEventID,
}
case event.XConversationDeleteEvent:
var convDeletedEventData types.ConversationDeletedData
err = json.Unmarshal(jsonEvData, &convDeletedEventData)
if err != nil {
return nil, err
}

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

updatedEntry = event.XEventConversationDelete{
ConversationID: convDeletedEventData.ConversationID,
EventID: convDeletedEventData.ID,
DeletedAt: deletedAt,
AffectsSort: convDeletedEventData.AffectsSort,
LastEventID: convDeletedEventData.LastEventID,
}
case event.XConversationCreateEvent:
var convCreatedEventData types.ConversationCreatedData
err = json.Unmarshal(jsonEvData, &convCreatedEventData)
Expand All @@ -167,6 +206,7 @@ func (data *XInboxData) ToEventEntries() ([]interface{}, error) {
AffectsSort: convCreatedEventData.AffectsSort,
RequestID: convCreatedEventData.RequestID,
}

case event.XConversationMetadataUpdateEvent:
var convMetadataUpdateEventData types.ConversationMetadataUpdate
err = json.Unmarshal(jsonEvData, &convMetadataUpdateEventData)
Expand Down
17 changes: 17 additions & 0 deletions pkg/twittermeow/data/types/messaging.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,23 @@ type ConversationCreatedData struct {
RequestID string `json:"request_id,omitempty"`
}

type ConversationDeletedData struct {
ID string `json:"id,omitempty"`
Time string `json:"time,omitempty"`
AffectsSort bool `json:"affects_sort,omitempty"`
ConversationID string `json:"conversation_id,omitempty"`
LastEventID string `json:"last_event_id,omitempty"`
}

type ConversationNameUpdateData struct {
ID string `json:"id,omitempty"`
Time string `json:"time,omitempty"`
ConversationID string `json:"conversation_id,omitempty"`
ConversationName string `json:"conversation_name,omitempty"`
ByUserID string `json:"by_user_id,omitempty"`
AffectsSort bool `json:"affects_sort,omitempty"`
}

type ConversationType string

const (
Expand Down
19 changes: 19 additions & 0 deletions pkg/twittermeow/event/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ const (
XReactionDeletedEvent XEventType = "reaction_delete"
XConversationReadEvent XEventType = "conversation_read"
XConversationMetadataUpdateEvent XEventType = "conversation_metadata_update"
XConversationNameUpdate XEventType = "conversation_name_update"
XConversationCreateEvent XEventType = "conversation_create"
XConversationDeleteEvent XEventType = "remove_conversation"
XDisableNotificationsEvent XEventType = "disable_notifications"
)

Expand Down Expand Up @@ -48,13 +50,30 @@ type XEventConversationCreated struct {
RequestID string
}

type XEventConversationDelete struct {
ConversationID string
EventID string
DeletedAt time.Time
AffectsSort bool
LastEventID string
}

type XEventConversationMetadataUpdate struct {
Conversation types.Conversation
EventID string
UpdatedAt time.Time
AffectsSort bool
}

type XEventConversationNameUpdate struct {
Conversation types.Conversation
EventID string
UpdatedAt time.Time
Name string
Executor types.User
AffectsSort bool
}

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

0 comments on commit 0c57f04

Please sign in to comment.