Skip to content

Commit bbe7cac

Browse files
committed
current progress state
1 parent 5f9a275 commit bbe7cac

31 files changed

+1329
-125
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ logs/
55
!example-config.yaml
66
!.pre-commit-config.yaml
77
/start
8+
/pkg/mautrix

ROADMAP.md

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,35 @@
11
# Features & roadmap
22

33
* Matrix → Twitter
4-
* [ ] Message content
5-
* [ ] Text
4+
* [+] Message content
5+
* [+] Text
66
* [ ] Formatting
7-
* [ ] Media
8-
* [ ] Images
9-
* [ ] Videos
10-
* [ ] Gifs
11-
* [ ] Message reactions
7+
* [+] Media
8+
* [+] Images
9+
* [+] Videos
10+
* [+] Gifs
11+
* [+] Message reactions
1212
* [ ] Typing notifications
1313
* [ ] Read receipts
1414
* Twitter → Matrix
15-
* [ ] Message content
16-
* [ ] Text
15+
* [+] Message content
16+
* [+] Text
1717
* [ ] Formatting
18-
* [ ] Media
19-
* [ ] Images
20-
* [ ] Videos
21-
* [ ] Gifs
22-
* [ ] Message reactions
23-
* [ ] Message history
24-
* [ ] When creating portal
18+
* [+] Media
19+
* [+] Images
20+
* [+] Videos
21+
* [+] Gifs
22+
* [+] Message reactions
23+
* [+] Message history
24+
* [+] When creating portal
2525
* [ ] Missed messages
26-
* [ ] Avatars
26+
* [+] Avatars
2727
* [ ] † Typing notifications
2828
* [ ] † Read receipts
2929
* Misc
30-
* [ ] Automatic portal creation
31-
* [ ] At startup
32-
* [ ] When receiving invite or message
30+
* [+] Automatic portal creation
31+
* [+] At startup
32+
* [+] When receiving invite or message
3333
* [ ] Provisioning API for logging in
3434
* [ ] Private chat creation by inviting Matrix puppet of Twitter user to new room
3535
* [ ] Option to use own Matrix account for messages sent from other Twitter clients

build.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
#!/bin/sh
22
MAUTRIX_VERSION=$(cat go.mod | grep 'maunium.net/go/mautrix ' | awk '{ print $2 }' | head -n1)
33
GO_LDFLAGS="-s -w -X main.Tag=$(git describe --exact-match --tags 2>/dev/null) -X main.Commit=$(git rev-parse HEAD) -X 'main.BuildTime=`date -Iseconds`' -X 'maunium.net/go/mautrix.GoModVersion=$MAUTRIX_VERSION'"
4-
go build -ldflags="$GO_LDFLAGS" ./cmd/mautrix-twitter "$@"
4+
go build -ldflags="$GO_LDFLAGS" ./cmd/mautrix-twitter "$@"

cmd/mautrix-twitter/main.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// mautrix-twitter - A Matrix-Slack puppeting bridge.
1+
// mautrix-twitter - A Matrix-Twitter puppeting bridge.
22
// Copyright (C) 2024 Tulir Asokan
33
//
44
// This program is free software: you can redistribute it and/or modify
@@ -16,5 +16,27 @@
1616

1717
package main
1818

19+
import (
20+
"go.mau.fi/mautrix-twitter/pkg/connector"
21+
"maunium.net/go/mautrix/bridgev2/matrix/mxmain"
22+
)
23+
24+
// Information to find out exactly which commit the bridge was built from.
25+
// These are filled at build time with the -X linker flag.
26+
var (
27+
Tag = "unknown"
28+
Commit = "unknown"
29+
BuildTime = "unknown"
30+
)
31+
1932
func main() {
33+
m := mxmain.BridgeMain{
34+
Name: "mautrix-twitter",
35+
URL: "https://github.com/mautrix/twitter",
36+
Description: "A Matrix-Twitter puppeting bridge.",
37+
Version: "0.16.0",
38+
Connector: connector.NewConnector(),
39+
}
40+
m.InitVersion(Tag, Commit, BuildTime)
41+
m.Run()
2042
}

go.mod

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,33 @@ require (
77
github.com/google/uuid v1.6.0
88
github.com/mattn/go-colorable v0.1.13
99
github.com/rs/zerolog v1.33.0
10-
go.mau.fi/util v0.6.0
10+
go.mau.fi/util v0.6.1-0.20240802175451-b430ebbffc98
1111
golang.org/x/net v0.27.0
12-
maunium.net/go/mautrix v0.19.1-0.20240719130542-cc5f225bc61c
12+
maunium.net/go/mautrix v0.19.1-0.20240720173515-24ead553b23b
1313
)
1414

15+
replace maunium.net/go/mautrix v0.19.1-0.20240720173515-24ead553b23b => ./pkg/mautrix
16+
1517
require (
1618
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
1719
github.com/gorilla/mux v1.8.0 // indirect
1820
github.com/gorilla/websocket v1.5.0 // indirect
21+
github.com/lib/pq v1.10.9 // indirect
1922
github.com/mattn/go-isatty v0.0.19 // indirect
20-
github.com/tidwall/gjson v1.17.1 // indirect
23+
github.com/mattn/go-sqlite3 v1.14.22 // indirect
24+
github.com/rs/xid v1.5.0 // indirect
25+
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect
26+
github.com/tidwall/gjson v1.17.3 // indirect
2127
github.com/tidwall/match v1.1.1 // indirect
2228
github.com/tidwall/pretty v1.2.0 // indirect
2329
github.com/tidwall/sjson v1.2.5 // indirect
2430
github.com/yuin/goldmark v1.7.4 // indirect
2531
go.mau.fi/zeroconfig v0.1.3 // indirect
2632
golang.org/x/crypto v0.25.0 // indirect
27-
golang.org/x/exp v0.0.0-20240707233637-46b078467d37 // indirect
33+
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
2834
golang.org/x/sys v0.22.0 // indirect
35+
golang.org/x/text v0.16.0 // indirect
2936
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
3037
gopkg.in/yaml.v3 v3.0.1 // indirect
38+
maunium.net/go/mauflag v1.0.0 // indirect
3139
)

go.sum

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,29 @@ github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
1616
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
1717
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
1818
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
19+
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
20+
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
1921
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
2022
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
2123
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
2224
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
2325
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
26+
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
27+
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
2428
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
2529
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
2630
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
31+
github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
2732
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
2833
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
2934
github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
35+
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
36+
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
3037
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
3138
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
3239
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
33-
github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U=
34-
github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
40+
github.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=
41+
github.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
3542
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
3643
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
3744
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
@@ -40,27 +47,29 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
4047
github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
4148
github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg=
4249
github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
43-
go.mau.fi/util v0.6.0 h1:W6SyB3Bm/GjenQ5iq8Z8WWdN85Gy2xS6L0wmnR7SVjg=
44-
go.mau.fi/util v0.6.0/go.mod h1:ljYdq3sPfpICc3zMU+/mHV/sa4z0nKxc67hSBwnrk8U=
50+
go.mau.fi/util v0.6.1-0.20240802175451-b430ebbffc98 h1:gJ0peWecBm6TtlxKFVIc1KbooXSCHtPfsfb2Eha5A0A=
51+
go.mau.fi/util v0.6.1-0.20240802175451-b430ebbffc98/go.mod h1:S1juuPWGau2GctPY3FR/4ec/MDLhAG2QPhdnUwpzWIo=
4552
go.mau.fi/zeroconfig v0.1.3 h1:As9wYDKmktjmNZW5i1vn8zvJlmGKHeVxHVIBMXsm4kM=
4653
go.mau.fi/zeroconfig v0.1.3/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70=
4754
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
4855
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
49-
golang.org/x/exp v0.0.0-20240707233637-46b078467d37 h1:uLDX+AfeFCct3a2C7uIWBKMJIR3CJMhcgfrUAqjRK6w=
50-
golang.org/x/exp v0.0.0-20240707233637-46b078467d37/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
56+
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
57+
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
5158
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
5259
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
5360
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
5461
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
5562
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
5663
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
5764
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
65+
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
66+
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
5867
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
5968
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
6069
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
6170
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
6271
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
6372
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
6473
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
65-
maunium.net/go/mautrix v0.19.1-0.20240719130542-cc5f225bc61c h1:wjQNGvMn85CRf8bqwqXsg55hvEuxIO8WH0SvOhzv/1E=
66-
maunium.net/go/mautrix v0.19.1-0.20240719130542-cc5f225bc61c/go.mod h1:UE+mSQ4sDUuJMbjN0aB9EjQSGgXd48AzMvZ6+QJV1k8=
74+
maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M=
75+
maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA=

pkg/connector/backfill.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package connector
2+
3+
import (
4+
"context"
5+
"log"
6+
"os"
7+
8+
"go.mau.fi/mautrix-twitter/pkg/twittermeow/data/payload"
9+
"go.mau.fi/mautrix-twitter/pkg/twittermeow/data/types"
10+
"maunium.net/go/mautrix/bridgev2"
11+
"maunium.net/go/mautrix/bridgev2/networkid"
12+
)
13+
14+
var _ bridgev2.BackfillingNetworkAPI = (*TwitterClient)(nil)
15+
16+
func (tc *TwitterClient) FetchMessages(ctx context.Context, params bridgev2.FetchMessagesParams) (*bridgev2.FetchMessagesResponse, error) {
17+
conversationId := string(params.Portal.PortalKey.ID)
18+
cursor := params.Cursor
19+
//count := params.Count
20+
21+
reqQuery := payload.DmRequestQuery{}.Default()
22+
reqQuery.Count = 25
23+
messageResp, err := tc.client.FetchConversationContext(conversationId, reqQuery, payload.CONTEXT_FETCH_DM_CONVERSATION_HISTORY)
24+
if err != nil {
25+
return nil, err
26+
}
27+
28+
if cursor != "" {
29+
log.Println("found cursor:", params)
30+
os.Exit(1)
31+
}
32+
33+
messages, err := messageResp.ConversationTimeline.GetMessageEntriesByConversationID(conversationId, true)
34+
if err != nil {
35+
return nil, err
36+
}
37+
38+
backfilledMessages, err := tc.MessagesToBackfillMessages(ctx, messages, messageResp.ConversationTimeline.GetConversationByID(conversationId))
39+
if err != nil {
40+
return nil, err
41+
}
42+
43+
fetchMessagesResp := &bridgev2.FetchMessagesResponse{
44+
Messages: backfilledMessages,
45+
Cursor: networkid.PaginationCursor(messageResp.ConversationTimeline.MinEntryID),
46+
HasMore: messageResp.ConversationTimeline.Status == types.HAS_MORE,
47+
Forward: params.Forward,
48+
}
49+
50+
return fetchMessagesResp, nil
51+
}

0 commit comments

Comments
 (0)