diff --git a/cmd/lscli/go.mod b/cmd/lscli/go.mod index 8b59daf..25895ea 100644 --- a/cmd/lscli/go.mod +++ b/cmd/lscli/go.mod @@ -6,10 +6,10 @@ replace go.mau.fi/mautrix-meta => ../../ require ( github.com/rs/zerolog v1.33.0 - github.com/tidwall/gjson v1.17.1 + github.com/tidwall/gjson v1.17.2 github.com/zyedidia/clipboard v1.0.4 go.mau.fi/mautrix-meta v0.2.0 - go.mau.fi/util v0.5.1-0.20240702075351-577617730cb7 + go.mau.fi/util v0.6.1-0.20240719175439-20a6073e1dd4 ) require ( @@ -21,10 +21,10 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect - go.mau.fi/libsignal v0.1.0 // indirect - go.mau.fi/whatsmeow v0.0.0-20240625083845-6acab596dd8c // indirect - golang.org/x/crypto v0.24.0 // indirect - golang.org/x/net v0.26.0 // indirect - golang.org/x/sys v0.21.0 // indirect + go.mau.fi/libsignal v0.1.1 // indirect + go.mau.fi/whatsmeow v0.0.0-20240726213518-bb5852f056ca // indirect + golang.org/x/crypto v0.25.0 // indirect + golang.org/x/net v0.27.0 // indirect + golang.org/x/sys v0.22.0 // indirect google.golang.org/protobuf v1.34.2 // indirect ) diff --git a/cmd/lscli/go.sum b/cmd/lscli/go.sum index 24db3a7..f94ce1d 100644 --- a/cmd/lscli/go.sum +++ b/cmd/lscli/go.sum @@ -27,8 +27,8 @@ 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/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.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= -github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.17.2 h1:YlBFFaxZdSXKP8zhqh5CRbk0wL7oCAU3D+JJLU5pE7U= +github.com/tidwall/gjson v1.17.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= @@ -36,21 +36,21 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/zyedidia/clipboard v1.0.4 h1:r6GUQOyPtIaApRLeD56/U+2uJbXis6ANGbKWCljULEo= github.com/zyedidia/clipboard v1.0.4/go.mod h1:zykFnZUXX0ErxqvYLUFEq7QDJKId8rmh2FgD0/Y8cjA= -go.mau.fi/libsignal v0.1.0 h1:vAKI/nJ5tMhdzke4cTK1fb0idJzz1JuEIpmjprueC+c= -go.mau.fi/libsignal v0.1.0/go.mod h1:R8ovrTezxtUNzCQE5PH30StOQWWeBskBsWE55vMfY9I= -go.mau.fi/util v0.5.1-0.20240702075351-577617730cb7 h1:1avw60QZMpzzMMisf6Jqm+WSycZ59OHJA5IlSXHCCPE= -go.mau.fi/util v0.5.1-0.20240702075351-577617730cb7/go.mod h1:DsJzUrJAG53lCZnnYvq9/mOyLuPScWwYhvETiTrpdP4= -go.mau.fi/whatsmeow v0.0.0-20240625083845-6acab596dd8c h1:yiULssyKHJcFA1fae2NJkwU7QW4EHQs7QEWoIqfqilA= -go.mau.fi/whatsmeow v0.0.0-20240625083845-6acab596dd8c/go.mod h1:0+65CYaE6r4dWzr0dN8i+UZKy0gIfJ79VuSqIl0nKRM= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +go.mau.fi/libsignal v0.1.1 h1:m/0PGBh4QKP/I1MQ44ti4C0fMbLMuHb95cmDw01FIpI= +go.mau.fi/libsignal v0.1.1/go.mod h1:QLs89F/OA3ThdSL2Wz2p+o+fi8uuQUz0e1BRa6ExdBw= +go.mau.fi/util v0.6.1-0.20240719175439-20a6073e1dd4 h1:CYKYs5jwJ0bFJqh6pRoWtC9NIJ0lz0/6i2SC4qEBFaU= +go.mau.fi/util v0.6.1-0.20240719175439-20a6073e1dd4/go.mod h1:ljYdq3sPfpICc3zMU+/mHV/sa4z0nKxc67hSBwnrk8U= +go.mau.fi/whatsmeow v0.0.0-20240726213518-bb5852f056ca h1:L0Pc6fi5RevuEASIP6Nd65/HZwCK8wTwm62FEly6UeY= +go.mau.fi/whatsmeow v0.0.0-20240726213518-bb5852f056ca/go.mod h1:BhHKalSq0qNtSCuGIUIvoJyU5KbT4a7k8DQ5yw1Ssk4= +golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= diff --git a/go.mod b/go.mod index 574ebf3..971cda6 100644 --- a/go.mod +++ b/go.mod @@ -10,17 +10,17 @@ require ( github.com/mattn/go-colorable v0.1.13 github.com/mattn/go-sqlite3 v1.14.22 github.com/rs/zerolog v1.33.0 - github.com/tidwall/gjson v1.17.1 - go.mau.fi/libsignal v0.1.0 - go.mau.fi/util v0.5.1-0.20240702075351-577617730cb7 - go.mau.fi/whatsmeow v0.0.0-20240625083845-6acab596dd8c - golang.org/x/crypto v0.24.0 - golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 + github.com/tidwall/gjson v1.17.2 + go.mau.fi/libsignal v0.1.1 + go.mau.fi/util v0.6.1-0.20240719175439-20a6073e1dd4 + go.mau.fi/whatsmeow v0.0.0-20240726213518-bb5852f056ca + golang.org/x/crypto v0.25.0 + golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 golang.org/x/image v0.18.0 - golang.org/x/net v0.26.0 + golang.org/x/net v0.27.0 google.golang.org/protobuf v1.34.2 maunium.net/go/mauflag v1.0.0 - maunium.net/go/mautrix v0.19.0-beta.1.0.20240702082021-74c0110ee0e4 + maunium.net/go/mautrix v0.19.1-0.20240729144154-7a3b919723e9 ) require ( @@ -34,8 +34,8 @@ require ( github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect github.com/yuin/goldmark v1.7.4 // indirect - go.mau.fi/zeroconfig v0.1.2 // indirect - golang.org/x/sys v0.21.0 // indirect + go.mau.fi/zeroconfig v0.1.3 // indirect + golang.org/x/sys v0.22.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 34f4221..a47b9f1 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDq 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= -github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= -github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.17.2 h1:YlBFFaxZdSXKP8zhqh5CRbk0wL7oCAU3D+JJLU5pE7U= +github.com/tidwall/gjson v1.17.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= @@ -51,27 +51,27 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= -go.mau.fi/libsignal v0.1.0 h1:vAKI/nJ5tMhdzke4cTK1fb0idJzz1JuEIpmjprueC+c= -go.mau.fi/libsignal v0.1.0/go.mod h1:R8ovrTezxtUNzCQE5PH30StOQWWeBskBsWE55vMfY9I= -go.mau.fi/util v0.5.1-0.20240702075351-577617730cb7 h1:1avw60QZMpzzMMisf6Jqm+WSycZ59OHJA5IlSXHCCPE= -go.mau.fi/util v0.5.1-0.20240702075351-577617730cb7/go.mod h1:DsJzUrJAG53lCZnnYvq9/mOyLuPScWwYhvETiTrpdP4= -go.mau.fi/whatsmeow v0.0.0-20240625083845-6acab596dd8c h1:yiULssyKHJcFA1fae2NJkwU7QW4EHQs7QEWoIqfqilA= -go.mau.fi/whatsmeow v0.0.0-20240625083845-6acab596dd8c/go.mod h1:0+65CYaE6r4dWzr0dN8i+UZKy0gIfJ79VuSqIl0nKRM= -go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto= -go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= -golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= -golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= +go.mau.fi/libsignal v0.1.1 h1:m/0PGBh4QKP/I1MQ44ti4C0fMbLMuHb95cmDw01FIpI= +go.mau.fi/libsignal v0.1.1/go.mod h1:QLs89F/OA3ThdSL2Wz2p+o+fi8uuQUz0e1BRa6ExdBw= +go.mau.fi/util v0.6.1-0.20240719175439-20a6073e1dd4 h1:CYKYs5jwJ0bFJqh6pRoWtC9NIJ0lz0/6i2SC4qEBFaU= +go.mau.fi/util v0.6.1-0.20240719175439-20a6073e1dd4/go.mod h1:ljYdq3sPfpICc3zMU+/mHV/sa4z0nKxc67hSBwnrk8U= +go.mau.fi/whatsmeow v0.0.0-20240726213518-bb5852f056ca h1:L0Pc6fi5RevuEASIP6Nd65/HZwCK8wTwm62FEly6UeY= +go.mau.fi/whatsmeow v0.0.0-20240726213518-bb5852f056ca/go.mod h1:BhHKalSq0qNtSCuGIUIvoJyU5KbT4a7k8DQ5yw1Ssk4= +go.mau.fi/zeroconfig v0.1.3 h1:As9wYDKmktjmNZW5i1vn8zvJlmGKHeVxHVIBMXsm4kM= +go.mau.fi/zeroconfig v0.1.3/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70= +golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= @@ -83,5 +83,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.19.0-beta.1.0.20240702082021-74c0110ee0e4 h1:b8e9GWo8Ct+T/5fXKdUyjiOZNuAaqatzJgy187jfq9Q= -maunium.net/go/mautrix v0.19.0-beta.1.0.20240702082021-74c0110ee0e4/go.mod h1:bNQrvIftiwJ+7OjSh+Gza5xcncq1ooHk6oyDWq4B4sg= +maunium.net/go/mautrix v0.19.1-0.20240729144154-7a3b919723e9 h1:OjSt0ttdvVVNmY/rkdAOPgQyKtQpDRQ91umyT+c9u6s= +maunium.net/go/mautrix v0.19.1-0.20240729144154-7a3b919723e9/go.mod h1:xP3DCXdPBUe1sPiugLbd5mRh/mJQWfGWyED1S8s9V7c= diff --git a/pkg/connector/client.go b/pkg/connector/client.go index ef80690..a9c1173 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -24,6 +24,7 @@ import ( "maunium.net/go/mautrix/bridgev2" "maunium.net/go/mautrix/bridgev2/database" "maunium.net/go/mautrix/bridgev2/networkid" + "maunium.net/go/mautrix/bridgev2/simplevent" "maunium.net/go/mautrix/event" metaTypes "go.mau.fi/mautrix-meta/messagix/types" @@ -46,22 +47,6 @@ type MetaClient struct { messageConverter *msgconv.MessageConverter } -func cookiesFromMetadata(metadata map[string]interface{}) *cookies.Cookies { - platform := types.Platform(metadata["platform"].(float64)) - - m := make(map[string]string) - for k, v := range metadata["cookies"].(map[string]interface{}) { - m[k] = v.(string) - } - - c := &cookies.Cookies{ - Platform: platform, - } - c.UpdateValues(m) - - return c -} - // Why are these separate? func platformToMode(platform types.Platform) config.BridgeMode { switch platform { @@ -76,14 +61,13 @@ func platformToMode(platform types.Platform) config.BridgeMode { func NewMetaClient(ctx context.Context, main *MetaConnector, login *bridgev2.UserLogin) (*MetaClient, error) { log := zerolog.Ctx(ctx).With().Str("component", "meta_client").Logger() - log.Debug().Any("metadata", login.Metadata.Extra).Msg("Creating new Meta client") - var c *cookies.Cookies - if _, ok := login.Metadata.Extra["cookies"].(map[string]interface{}); ok { - c = cookiesFromMetadata(login.Metadata.Extra) - } else { - c = login.Metadata.Extra["cookies"].(*cookies.Cookies) - } + loginMetadata := login.Metadata.(*MetaLoginMetadata) + + log.Debug().Any("metadata", loginMetadata).Msg("Creating new Meta client") + + c := loginMetadata.Cookies + c.Platform = types.Platform(loginMetadata.Platform) return &MetaClient{ Main: main, @@ -98,7 +82,7 @@ func NewMetaClient(ctx context.Context, main *MetaConnector, login *bridgev2.Use } func (m *MetaClient) Update(ctx context.Context) error { - m.login.Metadata.Extra["cookies"] = m.cookies + m.login.Metadata.(*MetaLoginMetadata).Cookies = m.cookies err := m.login.Save(ctx) if err != nil { return fmt.Errorf("failed to save updated cookies: %w", err) @@ -171,81 +155,191 @@ func (m *MetaClient) handleTable(ctx context.Context, tbl *table.LSTable) { } for _, thread := range tbl.LSDeleteThenInsertThread { log.Warn().Int64("thread_id", thread.ThreadKey).Msg("LSDeleteThenInsertThread") - portal, err := m.Main.Bridge.GetPortalByID(ctx, networkid.PortalKey{ - ID: networkid.PortalID(strconv.Itoa(int(thread.ThreadKey))), - }) - if err != nil { - log.Err(err).Int64("thread_id", thread.ThreadKey).Msg("Failed to get portal") - continue + + members := &bridgev2.ChatMemberList{ + Members: []bridgev2.ChatMember{ + { + EventSender: bridgev2.EventSender{ + IsFromMe: true, + Sender: networkid.UserID(m.login.ID), + SenderLogin: m.login.ID, + }, + Membership: event.MembershipJoin, + }, + }, } - if portal.MXID == "" { - log.Warn().Int64("thread_id", thread.ThreadKey).Msg("Cannot update thread metadata, portal not created yet") - continue + roomType := database.RoomTypeDefault + if thread.ThreadType == table.ONE_TO_ONE { + roomType = database.RoomTypeDM + members.Members = append(members.Members, bridgev2.ChatMember{ + EventSender: m.senderFromID(thread.ThreadKey), // For One-to-One threads, the other participant is the thread key + Membership: event.MembershipJoin, + }) + } else if thread.ThreadType == table.GROUP_THREAD { + roomType = database.RoomTypeGroupDM } - portal.UpdateInfo(ctx, &bridgev2.ChatInfo{ - Name: &thread.ThreadName, - Topic: &thread.ThreadDescription, - IsSpace: &[]bool{false}[0], - IsDirectChat: &[]bool{true}[0], - }, m.login, nil, time.Time{}) + m.Main.Bridge.QueueRemoteEvent(m.login, &simplevent.ChatResync{ + EventMeta: simplevent.EventMeta{ + Type: bridgev2.RemoteEventChatResync, + LogContext: func(c zerolog.Context) zerolog.Context { + return c.Int64("thread_id", thread.ThreadKey) + }, + PortalKey: networkid.PortalKey{ + ID: ids.MakePortalID(thread.ThreadKey), + }, + CreatePortal: true, + }, + + ChatInfo: &bridgev2.ChatInfo{ + Name: &thread.ThreadName, + Topic: &thread.ThreadDescription, + Members: members, + Type: &roomType, + }, + }) } for _, participant := range tbl.LSAddParticipantIdToGroupThread { log.Warn().Int64("thread_id", participant.ThreadKey).Int64("contact_id", participant.ContactId).Msg("LSAddParticipantIdToGroupThread") - portal, err := m.Main.Bridge.GetPortalByID(ctx, networkid.PortalKey{ - ID: networkid.PortalID(strconv.Itoa(int(participant.ThreadKey))), - }) - if err != nil { - log.Err(err).Int64("thread_id", participant.ThreadKey).Msg("Failed to get portal") - continue - } - portal.SyncParticipants(ctx, &bridgev2.ChatMemberList{ - Members: []bridgev2.ChatMember{ - { - EventSender: m.senderFromID(participant.ContactId), - Nickname: participant.Nickname, - Membership: event.MembershipJoin, + m.Main.Bridge.QueueRemoteEvent(m.login, &simplevent.ChatInfoChange{ + EventMeta: simplevent.EventMeta{ + Type: bridgev2.RemoteEventChatInfoChange, + LogContext: func(c zerolog.Context) zerolog.Context { + return c.Int64("thread_id", participant.ThreadKey).Int64("contact_id", participant.ContactId) + + }, + PortalKey: networkid.PortalKey{ + ID: ids.MakePortalID(participant.ThreadKey), }, }, - }, m.login, nil, time.Time{}) + ChatInfoChange: &bridgev2.ChatInfoChange{ + MemberChanges: &bridgev2.ChatMemberList{ + Members: []bridgev2.ChatMember{ + { + EventSender: m.senderFromID(participant.ContactId), + Nickname: participant.Nickname, + Membership: event.MembershipJoin, + }, + }, + }, + }, + }) } for _, participant := range tbl.LSRemoveParticipantFromThread { log.Warn().Int64("thread_id", participant.ThreadKey).Int64("contact_id", participant.ParticipantId).Msg("LSRemoveParticipantFromThread") - portal, err := m.Main.Bridge.GetPortalByID(ctx, networkid.PortalKey{ - ID: networkid.PortalID(strconv.Itoa(int(participant.ThreadKey))), - }) - if err != nil { - log.Err(err).Int64("thread_id", participant.ThreadKey).Msg("Failed to get portal") - continue - } - portal.SyncParticipants(ctx, &bridgev2.ChatMemberList{ - Members: []bridgev2.ChatMember{ - { - EventSender: m.senderFromID(participant.ParticipantId), - Membership: event.MembershipLeave, + m.Main.Bridge.QueueRemoteEvent(m.login, &simplevent.ChatInfoChange{ + EventMeta: simplevent.EventMeta{ + Type: bridgev2.RemoteEventChatInfoChange, + LogContext: func(c zerolog.Context) zerolog.Context { + return c.Int64("thread_id", participant.ThreadKey).Int64("contact_id", participant.ParticipantId) + + }, + PortalKey: networkid.PortalKey{ + ID: ids.MakePortalID(participant.ThreadKey), }, }, - }, m.login, nil, time.Time{}) + ChatInfoChange: &bridgev2.ChatInfoChange{ + MemberChanges: &bridgev2.ChatMemberList{ + Members: []bridgev2.ChatMember{ + { + EventSender: m.senderFromID(participant.ParticipantId), + Membership: event.MembershipLeave, + }, + }, + }, + }, + }) } for _, thread := range tbl.LSVerifyThreadExists { log.Warn().Int64("thread_id", thread.ThreadKey).Msg("LSVerifyThreadExists") + + members := &bridgev2.ChatMemberList{ + Members: []bridgev2.ChatMember{ + { + EventSender: bridgev2.EventSender{ + IsFromMe: true, + Sender: networkid.UserID(m.login.ID), + SenderLogin: m.login.ID, + }, + Membership: event.MembershipJoin, + }, + }, + } + + roomType := database.RoomTypeDefault + if thread.ThreadType == table.ONE_TO_ONE { + roomType = database.RoomTypeDM + members.Members = append(members.Members, bridgev2.ChatMember{ + EventSender: m.senderFromID(thread.ThreadKey), // For One-to-One threads, the other participant is the thread key + Membership: event.MembershipJoin, + }) + } else if thread.ThreadType == table.GROUP_THREAD { + roomType = database.RoomTypeGroupDM + } + + m.Main.Bridge.QueueRemoteEvent(m.login, &simplevent.ChatResync{ + EventMeta: simplevent.EventMeta{ + Type: bridgev2.RemoteEventChatResync, + LogContext: func(c zerolog.Context) zerolog.Context { + return c.Int64("thread_id", thread.ThreadKey) + }, + PortalKey: networkid.PortalKey{ + ID: ids.MakePortalID(thread.ThreadKey), + }, + CreatePortal: true, + }, + + GetChatInfoFunc: func(ctx context.Context, portal *bridgev2.Portal) (*bridgev2.ChatInfo, error) { + // If the room isn't created yet, we're probably missing some info... this will create a stub room and ask Meta to send us the rest + if portal.MXID == "" { + resp, err := m.client.ExecuteTasks( + &socket.CreateThreadTask{ + ThreadFBID: thread.ThreadKey, + ForceUpsert: 0, + UseOpenMessengerTransport: 0, + SyncGroup: 1, + MetadataOnly: 0, + PreviewOnly: 0, + }, + ) + if err != nil { + log.Err(err).Msg("Failed to request more thread info") + } + log.Debug().Any("response", resp).Msg("Requested more thread info") + } + return &bridgev2.ChatInfo{ + Type: &roomType, + Members: members, + }, nil + }, + }) } for _, mute := range tbl.LSUpdateThreadMuteSetting { log.Warn().Int64("thread_id", mute.ThreadKey).Msg("LSUpdateThreadMuteSetting") } for _, thread := range tbl.LSSyncUpdateThreadName { log.Warn().Int64("thread_id", thread.ThreadKey).Msg("LSUpdateThreadName") - portal, err := m.Main.Bridge.GetPortalByID(ctx, networkid.PortalKey{ - ID: networkid.PortalID(strconv.Itoa(int(thread.ThreadKey))), + + m.Main.Bridge.QueueRemoteEvent(m.login, &simplevent.ChatInfoChange{ + EventMeta: simplevent.EventMeta{ + Type: bridgev2.RemoteEventChatInfoChange, + LogContext: func(c zerolog.Context) zerolog.Context { + return c.Int64("thread_id", thread.ThreadKey) + + }, + PortalKey: networkid.PortalKey{ + ID: ids.MakePortalID(thread.ThreadKey), + }, + }, + ChatInfoChange: &bridgev2.ChatInfoChange{ + ChatInfo: &bridgev2.ChatInfo{ + Name: &thread.ThreadName, + }, + }, }) - if err != nil { - log.Err(err).Int64("thread_id", thread.ThreadKey).Msg("Failed to get portal") - continue - } - portal.UpdateName(ctx, thread.ThreadName, nil, time.Time{}) } upsert, insert := tbl.WrapMessages() @@ -366,54 +460,13 @@ func (m *MetaClient) GetCapabilities(ctx context.Context, portal *bridgev2.Porta return &bridgev2.NetworkRoomCapabilities{} } -// GetChatInfo implements bridgev2.NetworkAPI. func (m *MetaClient) GetChatInfo(ctx context.Context, portal *bridgev2.Portal) (*bridgev2.ChatInfo, error) { - // We have to request an entirely new initial table here, because unfortunately we can't get just the metadata we need. - _, initialTable, err := m.client.LoadMessagesPage() - if err != nil { - return nil, fmt.Errorf("failed to load messages page: %w", err) - } - - var thread_name string - var thread_description string - var members *bridgev2.ChatMemberList = &bridgev2.ChatMemberList{} - - threadKey, err := strconv.Atoi(string(portal.ID)) - if err != nil { - return nil, fmt.Errorf("failed to parse thread ID: %w", err) - } - - for _, thread := range initialTable.LSDeleteThenInsertThread { - if thread.ThreadKey == int64(threadKey) { - thread_name = thread.ThreadName - thread_description = thread.ThreadDescription - break - } - } - - for _, participant := range initialTable.LSAddParticipantIdToGroupThread { - if participant.ThreadKey == int64(threadKey) { - members.Members = append(members.Members, bridgev2.ChatMember{ - EventSender: m.senderFromID(participant.ContactId), - Nickname: participant.Nickname, - Membership: event.MembershipJoin, - }) - } - } - - return &bridgev2.ChatInfo{ - Name: &thread_name, - Topic: &thread_description, - IsSpace: &[]bool{false}[0], - IsDirectChat: &[]bool{true}[0], - Members: members, - }, nil + panic("GetChatInfo should never be called") } -// GetUserInfo implements bridgev2.NetworkAPI. func (m *MetaClient) GetUserInfo(ctx context.Context, ghost *bridgev2.Ghost) (*bridgev2.UserInfo, error) { // This should never be called because ghost info is pre-populated when parsing the table - panic("unimplemented") + panic("GetUserInfo should never be called") } type msgconvContextKey int @@ -553,7 +606,8 @@ func (m *MetaClient) HandleMatrixMessage(ctx context.Context, msg *bridgev2.Matr // IsLoggedIn implements bridgev2.NetworkAPI. func (m *MetaClient) IsLoggedIn() bool { - panic("unimplemented") + //panic("unimplemented") + return true } // IsThisUser implements bridgev2.NetworkAPI. @@ -566,12 +620,72 @@ func (m *MetaClient) LogoutRemote(ctx context.Context) { panic("unimplemented") } -func (m *MetaClient) ResolveIdentifier(ctx context.Context, number string, createChat bool) (*bridgev2.ResolveIdentifierResponse, error) { +func (m *MetaClient) ResolveIdentifier(ctx context.Context, identifier string, createChat bool) (*bridgev2.ResolveIdentifierResponse, error) { + log := zerolog.Ctx(ctx) + log.Debug().Str("identifier", identifier).Bool("create_chat", createChat).Msg("Resolving identifier") + + // Make sure we can parse identifier as an int + id, err := ids.ParseIDFromString(identifier) + if err != nil { + return nil, fmt.Errorf("failed to parse identifier: %w", err) + } + + var chat *bridgev2.CreateChatResponse + if createChat { + // Create the chat on the Meta side, not sure if this is necessary for DMs? + resp, err := m.client.ExecuteTasks( + &socket.CreateThreadTask{ + ThreadFBID: id, + ForceUpsert: 0, + UseOpenMessengerTransport: 0, + SyncGroup: 1, + MetadataOnly: 0, + PreviewOnly: 0, + }, + ) + + log.Debug().Any("response_data", resp).Err(err).Msg("Create chat response") + + portalKey := networkid.PortalKey{ID: ids.MakePortalID(id)} + + roomtype := database.RoomTypeDM + + chat = &bridgev2.CreateChatResponse{ + PortalKey: portalKey, + PortalInfo: &bridgev2.ChatInfo{ + Type: &roomtype, + Members: &bridgev2.ChatMemberList{ + Members: []bridgev2.ChatMember{ + { + EventSender: bridgev2.EventSender{ + IsFromMe: true, + Sender: networkid.UserID(m.login.ID), + SenderLogin: m.login.ID, + }, + Membership: event.MembershipJoin, + }, + { + EventSender: m.senderFromID(id), + Membership: event.MembershipJoin, + }, + }, + }, + }, + } + } + return &bridgev2.ResolveIdentifierResponse{ + UserID: ids.MakeUserID(id), + UserInfo: &bridgev2.UserInfo{}, + Chat: chat, + }, nil +} + +func (m *MetaClient) SearchUsers(ctx context.Context, search string) ([]*bridgev2.ResolveIdentifierResponse, error) { log := zerolog.Ctx(ctx) - log.Debug().Str("number", number).Bool("create_chat", createChat).Msg("Resolving identifier") + log.Debug().Str("search", search).Msg("Searching users") task := &socket.SearchUserTask{ - Query: number, + Query: search, SupportedTypes: []table.SearchType{ table.SearchTypeContact, table.SearchTypeGroup, table.SearchTypePage, table.SearchTypeNonContact, table.SearchTypeIGContactFollowing, table.SearchTypeIGContactNonFollowing, @@ -601,54 +715,25 @@ func (m *MetaClient) ResolveIdentifier(ctx context.Context, number string, creat return nil, fmt.Errorf("failed to search for user: %w", err) } + users := make([]*bridgev2.ResolveIdentifierResponse, 0) + for _, result := range resp.LSInsertSearchResult { if result.ThreadType == table.ONE_TO_ONE && result.CanViewerMessage && result.GetFBID() != 0 { - var chat *bridgev2.CreateChatResponse - if createChat { - // Create the chat on the Meta side, not sure if this is necessary for DMs? - resp, err := m.client.ExecuteTasks( - &socket.CreateThreadTask{ - ThreadFBID: result.GetFBID(), - ForceUpsert: 0, - UseOpenMessengerTransport: 0, - SyncGroup: 1, - MetadataOnly: 0, - PreviewOnly: 0, - }, - ) - - log.Debug().Any("response_data", resp).Err(err).Msg("Create chat response") - - portalKey := networkid.PortalKey{ID: ids.MakePortalID(result.GetFBID())} - - portal, err := m.Main.Bridge.GetPortalByID(ctx, portalKey) - if err != nil { - log.Err(err).Any("portal_key", portalKey).Msg("Failed to get portal") - } - - chatInfo, err := m.GetChatInfo(ctx, portal) - if err != nil { - log.Err(err).Any("portal_key", portalKey).Msg("Failed to get chat info") - } - - chat = &bridgev2.CreateChatResponse{ - Portal: portal, - PortalID: portalKey, - PortalInfo: chatInfo, - } - } - return &bridgev2.ResolveIdentifierResponse{ + users = append(users, &bridgev2.ResolveIdentifierResponse{ UserID: ids.MakeUserID(result.GetFBID()), - Chat: chat, - }, nil + UserInfo: &bridgev2.UserInfo{ + Name: &result.DisplayName, + }, + }) } } - return nil, nil + return users, nil } var ( - _ bridgev2.NetworkAPI = (*MetaClient)(nil) + _ bridgev2.NetworkAPI = (*MetaClient)(nil) + _ bridgev2.UserSearchingNetworkAPI = (*MetaClient)(nil) // _ bridgev2.EditHandlingNetworkAPI = (*MetaClient)(nil) // _ bridgev2.ReactionHandlingNetworkAPI = (*MetaClient)(nil) // _ bridgev2.RedactionHandlingNetworkAPI = (*MetaClient)(nil) diff --git a/pkg/connector/connector.go b/pkg/connector/connector.go index 4a39ebd..6d007be 100644 --- a/pkg/connector/connector.go +++ b/pkg/connector/connector.go @@ -4,6 +4,10 @@ import ( "context" "maunium.net/go/mautrix/bridgev2" + "maunium.net/go/mautrix/bridgev2/database" + + "go.mau.fi/mautrix-meta/messagix/cookies" + "go.mau.fi/mautrix-meta/messagix/types" ) type MetaConnector struct { @@ -29,6 +33,23 @@ var metaGeneralCaps = &bridgev2.NetworkGeneralCapabilities{ AggressiveUpdateInfo: false, } +func (m *MetaConnector) GetDBMetaTypes() database.MetaTypes { + return database.MetaTypes{ + Portal: nil, + Ghost: nil, + Message: nil, + Reaction: nil, + UserLogin: func() any { + return &MetaLoginMetadata{} + }, + } +} + +type MetaLoginMetadata struct { + Platform types.Platform `json:"platform"` + Cookies *cookies.Cookies `json:"cookies"` +} + func (m *MetaConnector) GetCapabilities() *bridgev2.NetworkGeneralCapabilities { return metaGeneralCaps } diff --git a/pkg/connector/ids/ids.go b/pkg/connector/ids/ids.go index 82a4202..18124f2 100644 --- a/pkg/connector/ids/ids.go +++ b/pkg/connector/ids/ids.go @@ -10,6 +10,14 @@ func MakeUserID(user int64) networkid.UserID { return networkid.UserID(strconv.Itoa(int(user))) } +func ParseIDFromString(id string) (int64, error) { + i, err := strconv.Atoi(id) + if err != nil { + return 0, err + } + return int64(i), nil +} + func MakeUserLoginID(user int64) networkid.UserLoginID { return networkid.UserLoginID(MakeUserID(user)) } diff --git a/pkg/connector/login.go b/pkg/connector/login.go index f6e1856..fdeb611 100644 --- a/pkg/connector/login.go +++ b/pkg/connector/login.go @@ -9,7 +9,7 @@ import ( "maunium.net/go/mautrix/bridgev2/database" "maunium.net/go/mautrix/bridgev2/networkid" - "go.mau.fi/util/exslices" + //"go.mau.fi/util/exslices" "go.mau.fi/mautrix-meta/messagix" "go.mau.fi/mautrix-meta/messagix/cookies" @@ -64,6 +64,23 @@ type MetaCookieLogin struct { var _ bridgev2.LoginProcessCookies = (*MetaCookieLogin)(nil) +func cookieListToFields(cookies []cookies.MetaCookieName, domain string) []bridgev2.LoginCookieField { + fields := make([]bridgev2.LoginCookieField, len(cookies)) + for i, cookie := range cookies { + fields[i] = bridgev2.LoginCookieField{ + ID: string(cookie), + Sources: []bridgev2.LoginCookieFieldSource{ + { + Type: bridgev2.LoginCookieTypeCookie, + Name: string(cookie), + CookieDomain: domain, + }, + }, + } + } + return fields +} + func (m *MetaCookieLogin) Start(ctx context.Context) (*bridgev2.LoginStep, error) { if m.Flow == FlowIDFacebookCookies { return &bridgev2.LoginStep{ @@ -71,10 +88,9 @@ func (m *MetaCookieLogin) Start(ctx context.Context) (*bridgev2.LoginStep, error StepID: "fi.mau.meta.cookies", Instructions: "Please enter cookies from your browser", CookiesParams: &bridgev2.LoginCookiesParams{ - URL: "https://www.facebook.com/", - UserAgent: messagix.UserAgent, - CookieDomain: "www.facebook.com", - CookieKeys: exslices.CastToString[string](cookies.FBRequiredCookies), + URL: "https://www.facebook.com/", + UserAgent: messagix.UserAgent, + Fields: cookieListToFields(cookies.FBRequiredCookies, "www.facebook.com"), }, }, nil } else if m.Flow == FlowIDInstagramCookies { @@ -83,10 +99,9 @@ func (m *MetaCookieLogin) Start(ctx context.Context) (*bridgev2.LoginStep, error StepID: "fi.mau.meta.cookies", Instructions: "Please enter cookies from your browser", CookiesParams: &bridgev2.LoginCookiesParams{ - URL: "https://www.instagram.com/", - UserAgent: messagix.UserAgent, - CookieDomain: "www.instagram.com", - CookieKeys: exslices.CastToString[string](cookies.IGRequiredCookies), + URL: "https://www.instagram.com/", + UserAgent: messagix.UserAgent, + Fields: cookieListToFields(cookies.IGRequiredCookies, "www.instagram.com"), }, }, nil } else { @@ -139,21 +154,16 @@ func (m *MetaCookieLogin) SubmitCookies(ctx context.Context, strCookies map[stri if ul == nil { ul, err = m.User.NewLogin(ctx, &database.UserLogin{ ID: login_id, - Metadata: database.UserLoginMetadata{ - StandardUserLoginMetadata: database.StandardUserLoginMetadata{ - RemoteName: user.GetName(), - }, - Extra: map[string]interface{}{ - "platform": c.Platform, - "cookies": c, - }, + Metadata: &MetaLoginMetadata{ + Platform: c.Platform, + Cookies: c, }, }, nil) if err != nil { return nil, fmt.Errorf("failed to save new login: %w", err) } } else { - ul.Metadata.RemoteName = user.GetName() + ul.RemoteName = user.GetName() err := ul.Save(ctx) if err != nil { return nil, fmt.Errorf("failed to update existing login: %w", err) diff --git a/pkg/connector/msgconv/from-meta.go b/pkg/connector/msgconv/from-meta.go index d0ada0a..adf32f2 100644 --- a/pkg/connector/msgconv/from-meta.go +++ b/pkg/connector/msgconv/from-meta.go @@ -141,13 +141,6 @@ func (mc *MessageConverter) getMatrixReply(ctx context.Context, portal *bridgev2 mxid := uinfo.MXID - if message.Metadata.SenderMXID != uinfo.MXID { - log.Warn(). - Any("message_sender", message.SenderID). - Msg("SenderID of reply target message does not match reply user, overriding") - mxid = message.Metadata.SenderMXID - } - return &matrixReplyInfo{message.MXID, mxid}, nil }