diff --git a/build-v2.sh b/build-v2.sh new file mode 100755 index 0000000..df88960 --- /dev/null +++ b/build-v2.sh @@ -0,0 +1,9 @@ +#!/bin/sh +if [[ -z "$LIBRARY_PATH" && -d /opt/homebrew ]]; then + echo "Using /opt/homebrew for LIBRARY_PATH and CPATH" + export LIBRARY_PATH=/opt/homebrew/lib + export CPATH=/opt/homebrew/include +fi +export MAUTRIX_VERSION=$(cat go.mod | grep 'maunium.net/go/mautrix ' | awk '{ print $2 }') +export 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 '+%b %_d %Y, %H:%M:%S'`' -X 'maunium.net/go/mautrix.GoModVersion=$MAUTRIX_VERSION'" +go build -ldflags "$GO_LDFLAGS" -o mautrix-meta ./cmd/mautrix-meta "$@" diff --git a/cmd/mautrix-meta-v2/main.go b/cmd/mautrix-meta-v2/main.go new file mode 100644 index 0000000..ceb0823 --- /dev/null +++ b/cmd/mautrix-meta-v2/main.go @@ -0,0 +1,29 @@ +package main + +import ( + _ "go.mau.fi/util/dbutil/litestream" + "maunium.net/go/mautrix/bridgev2/matrix/mxmain" + + "go.mau.fi/mautrix-meta/pkg/connector" +) + +// Information to find out exactly which commit the bridge was built from. +// These are filled at build time with the -X linker flag. +var ( + Tag = "unknown" + Commit = "unknown" + BuildTime = "unknown" +) + +func main() { + m := mxmain.BridgeMain{ + Name: "mautrix-meta", + URL: "https://github.com/mautrix/meta", + Description: "A Matrix-Meta puppeting bridge.", + Version: "0.16.0", + + Connector: connector.NewConnector(), + } + m.InitVersion(Tag, Commit, BuildTime) + m.Run() +} diff --git a/go.mod b/go.mod index 22f06dc..fd9c0f1 100644 --- a/go.mod +++ b/go.mod @@ -29,6 +29,7 @@ require ( github.com/gorilla/mux v1.8.0 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/rs/xid v1.5.0 // indirect + github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/tidwall/sjson v1.2.5 // indirect diff --git a/go.sum b/go.sum index 1093313..5dc4db0 100644 --- a/go.sum +++ b/go.sum @@ -34,6 +34,8 @@ github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= +github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= diff --git a/pkg/connector/config.go b/pkg/connector/config.go new file mode 100644 index 0000000..88ca212 --- /dev/null +++ b/pkg/connector/config.go @@ -0,0 +1,22 @@ +package connector + +import ( + _ "embed" + + up "go.mau.fi/util/configupgrade" +) + +//go:embed example-config.yaml +var ExampleConfig string + +type MetaConfig struct { + Mode string `yaml:"mode"` +} + +func upgradeConfig(helper up.Helper) { + helper.Copy(up.Str, "mode") +} + +func (s *MetaConnector) GetConfig() (string, any, up.Upgrader) { + return ExampleConfig, &s.Config, up.SimpleUpgrader(upgradeConfig) +} diff --git a/pkg/connector/connector.go b/pkg/connector/connector.go new file mode 100644 index 0000000..19171b4 --- /dev/null +++ b/pkg/connector/connector.go @@ -0,0 +1,57 @@ +package connector + +import ( + "context" + + "maunium.net/go/mautrix/bridgev2" +) + +type MetaConnector struct { + Bridge *bridgev2.Bridge + Config *MetaConfig +} + +func NewConnector() *MetaConnector { + return &MetaConnector{} +} + +var _ bridgev2.NetworkConnector = (*MetaConnector)(nil) +var _ bridgev2.MaxFileSizeingNetwork = (*MetaConnector)(nil) + +func (m *MetaConnector) SetMaxFileSize(maxSize int64) { + println("SetMaxFileSize unimplemented") +} + +var metaGeneralCaps = &bridgev2.NetworkGeneralCapabilities{ + DisappearingMessages: false, + AggressiveUpdateInfo: false, +} + +func (m *MetaConnector) GetCapabilities() *bridgev2.NetworkGeneralCapabilities { + return metaGeneralCaps +} + +func (s *MetaConnector) GetName() bridgev2.BridgeName { + // Would be nice if we could use MetaConfig.Mode here, but it's not available yet? + return bridgev2.BridgeName{ + DisplayName: "Meta", + NetworkURL: "https://meta.com", + NetworkIcon: "mxc://maunium.net/JxjlbZUlCPULEeHZSwleUXQv", // Instagram icon + NetworkID: "meta", + BeeperBridgeType: "meta", + DefaultPort: 29319, + } +} + +func (m *MetaConnector) Init(*bridgev2.Bridge) { + println("Connector Init unimplemented") +} + +func (m *MetaConnector) Start(context.Context) error { + println("Connector Start unimplemented") + return nil +} + +func (m *MetaConnector) LoadUserLogin(ctx context.Context, login *bridgev2.UserLogin) error { + panic("unimplemented") +} diff --git a/pkg/connector/example-config.yaml b/pkg/connector/example-config.yaml new file mode 100644 index 0000000..7d36f9b --- /dev/null +++ b/pkg/connector/example-config.yaml @@ -0,0 +1,3 @@ +# Which service is this bridge for? Either "facebook" or "instagram". +# Remember to change the appservice id, bot profile info and bridge username_template too. +mode: instagram diff --git a/pkg/connector/login.go b/pkg/connector/login.go new file mode 100644 index 0000000..c402de3 --- /dev/null +++ b/pkg/connector/login.go @@ -0,0 +1,47 @@ +package connector + +import ( + "context" + "fmt" + + "maunium.net/go/mautrix/bridgev2" +) + +func (m *MetaConnector) CreateLogin(ctx context.Context, user *bridgev2.User, flowID string) (bridgev2.LoginProcess, error) { + if flowID != "cookies" { + return nil, fmt.Errorf("unknown flow ID %s", flowID) + } + + return &CookieLogin{}, nil +} + +func (m *MetaConnector) GetLoginFlows() []bridgev2.LoginFlow { + return []bridgev2.LoginFlow{{ + Name: "Cookies", + Description: "Login using cookies from a web browser", + ID: "cookies", + }} +} + +type CookieLogin struct{} + +var _ bridgev2.LoginProcessCookies = (*CookieLogin)(nil) + +func (p *CookieLogin) Start(ctx context.Context) (*bridgev2.LoginStep, error) { + return &bridgev2.LoginStep{ + Type: bridgev2.LoginStepTypeCookies, + StepID: "fi.mau.meta.cookies", + Instructions: "Please enter cookies from your browser", + CookiesParams: &bridgev2.LoginCookiesParams{}, + }, nil +} + +func (c *CookieLogin) Cancel() {} + +func (p *CookieLogin) SubmitCookies(ctx context.Context, cookies map[string]string) (*bridgev2.LoginStep, error) { + return &bridgev2.LoginStep{ + Type: bridgev2.LoginStepTypeComplete, + StepID: "fi.mau.meta.complete", + Instructions: "Login successful", + }, nil +}