mirror of
https://github.com/idanoo/GoMatrixCloner
synced 2025-07-01 05:32:18 +00:00
Init commit
This commit is contained in:
commit
71cb1f997e
9 changed files with 467 additions and 0 deletions
50
Dockerfile
Normal file
50
Dockerfile
Normal file
|
@ -0,0 +1,50 @@
|
|||
FROM golang:1.22.0
|
||||
|
||||
ARG DEBIAN_FRONTEND="noninteractive"
|
||||
|
||||
EXPOSE 7860/tcp
|
||||
EXPOSE 3000/tcp
|
||||
|
||||
# linuxserver.io ftw <3
|
||||
RUN apt-get update && apt-get install -y \
|
||||
apt-utils \
|
||||
locales && \
|
||||
echo "**** install packages ****" && \
|
||||
apt-get install -y \
|
||||
curl \
|
||||
gnupg \
|
||||
jq \
|
||||
tzdata \
|
||||
libolm-dev && \
|
||||
echo "**** generate locale ****" && \
|
||||
locale-gen en_US.UTF-8 && \
|
||||
echo "**** create abc user and make our folders ****" && \
|
||||
useradd -u 911 -U -d /config -s /bin/false abc && \
|
||||
usermod -G users abc && \
|
||||
mkdir -p \
|
||||
/app \
|
||||
/config && \
|
||||
echo "**** cleanup ****" && \
|
||||
apt-get autoremove && \
|
||||
apt-get clean && \
|
||||
rm -rf \
|
||||
/tmp/* \
|
||||
/var/lib/apt/lists/* \
|
||||
/var/tmp/* \
|
||||
/var/log/*
|
||||
|
||||
# Copy data across
|
||||
COPY src /src
|
||||
|
||||
# Copy run script
|
||||
COPY run.sh /app/run.sh
|
||||
RUN chmod +x /app/run.sh
|
||||
|
||||
# Build App
|
||||
WORKDIR /src
|
||||
RUN go build -o /app/main cmd/gomatrixcloner/main.go
|
||||
RUN rm -fr /src
|
||||
|
||||
# Lesgo
|
||||
WORKDIR /app
|
||||
CMD /app/run.sh
|
15
README.md
Normal file
15
README.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
# gomatrixcloner
|
||||
|
||||
- Invite bot to both channels. Success
|
||||
|
||||
```shell
|
||||
mkdir data
|
||||
docker run -it \
|
||||
-v data:/data \
|
||||
-e "MATRIX_HOST=https://matrix.example" \
|
||||
-e "MATRIX_USERNAME=username" \
|
||||
-e "MATRIX_PASSWORD=password" \
|
||||
-e "MATRIX_SOURCE_ROOM=!example:example.com" \
|
||||
-e "MATRIX_DESTINATION_ROOM=!example2:example.com" \
|
||||
idanoo/gomatrixcloner:latest
|
||||
```
|
4
build.sh
Executable file
4
build.sh
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Usage ./build.sh
|
||||
docker buildx build --platform linux/amd64,linux/arm64 -t "idanoo/gomatrixcloner:latest" --push .
|
50
deploy.yml
Normal file
50
deploy.yml
Normal file
|
@ -0,0 +1,50 @@
|
|||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: gomatrixcloner
|
||||
namespace: bots
|
||||
labels:
|
||||
k8s-app: gomatrixcloner
|
||||
spec:
|
||||
strategy:
|
||||
type: Recreate
|
||||
replicas: 1
|
||||
revisionHistoryLimit: 0
|
||||
selector:
|
||||
matchLabels:
|
||||
k8s-app: gomatrixcloner
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
k8s-app: gomatrixcloner
|
||||
spec:
|
||||
containers:
|
||||
- name: gomatrixcloner
|
||||
image: idanoo/gomatrixcloner:latest
|
||||
imagePullPolicy: Always
|
||||
volumeMounts:
|
||||
- name: gomatrixcloner-config
|
||||
mountPath: "/data"
|
||||
env:
|
||||
- name: PUID
|
||||
value: "1026"
|
||||
- name: PGID
|
||||
value: "65536"
|
||||
- name: TZ
|
||||
value: ""
|
||||
- name: MATRIX_HOST
|
||||
value: ""
|
||||
- name: MATRIX_USERNAME
|
||||
value: ""
|
||||
- name: MATRIX_PASSWORD
|
||||
value: ""
|
||||
- name: MATRIX_SOURCE_ROOM
|
||||
value: "!example:example.com"
|
||||
- name: MATRIX_DESTINATION_ROOM
|
||||
value: "!example:example.com"
|
||||
volumes:
|
||||
- name: gomatrixcloner-config
|
||||
nfs:
|
||||
server: xxxx
|
||||
path: /xxxx
|
23
run.sh
Normal file
23
run.sh
Normal file
|
@ -0,0 +1,23 @@
|
|||
#!/bin/bash
|
||||
|
||||
PUID=${PUID:-911}
|
||||
PGID=${PGID:-911}
|
||||
|
||||
groupmod -o -g "$PGID" abc
|
||||
usermod -o -u "$PUID" abc
|
||||
|
||||
echo '
|
||||
-------------------------------------
|
||||
GID/UID
|
||||
-------------------------------------'
|
||||
echo "
|
||||
User uid: $(id -u abc)
|
||||
User gid: $(id -g abc)
|
||||
-------------------------------------
|
||||
"
|
||||
|
||||
chown abc:abc /app
|
||||
chown abc:abc /config
|
||||
|
||||
echo "Booting app"
|
||||
cd /app && ./main
|
16
src/cmd/gomatrixcloner/main.go
Normal file
16
src/cmd/gomatrixcloner/main.go
Normal file
|
@ -0,0 +1,16 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
f "gomatrixcloner/internal/gomatrixcloner"
|
||||
"os"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Set Matrix Credentials
|
||||
f.MatrixHost = os.Getenv("MATRIX_HOST")
|
||||
f.MatrixUsername = os.Getenv("MATRIX_USERNAME")
|
||||
f.MatrixPassword = os.Getenv("MATRIX_PASSWORD")
|
||||
|
||||
// Start application
|
||||
f.Run()
|
||||
}
|
30
src/go.mod
Normal file
30
src/go.mod
Normal file
|
@ -0,0 +1,30 @@
|
|||
module gomatrixcloner
|
||||
|
||||
go 1.22
|
||||
|
||||
require (
|
||||
github.com/golang-migrate/migrate v3.5.4+incompatible
|
||||
github.com/mb-14/gomarkov v0.0.0-20231120193207-9cbdc8df67a8
|
||||
github.com/rs/zerolog v1.32.0
|
||||
maunium.net/go/mautrix v0.18.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/chzyer/readline v1.5.1 // indirect
|
||||
github.com/gorilla/websocket v1.5.0 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/mattn/go-mastodon v0.0.6 // indirect
|
||||
github.com/mattn/go-sqlite3 v1.14.22 // indirect
|
||||
github.com/tidwall/gjson v1.17.1 // indirect
|
||||
github.com/tidwall/match v1.1.1 // indirect
|
||||
github.com/tidwall/pretty v1.2.1 // indirect
|
||||
github.com/tidwall/sjson v1.2.5 // indirect
|
||||
github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect
|
||||
go.mau.fi/util v0.4.1 // indirect
|
||||
golang.org/x/crypto v0.21.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect
|
||||
golang.org/x/net v0.22.0 // indirect
|
||||
golang.org/x/sys v0.18.0 // indirect
|
||||
maunium.net/go/maulogger/v2 v2.4.1 // indirect
|
||||
)
|
85
src/go.sum
Normal file
85
src/go.sum
Normal file
|
@ -0,0 +1,85 @@
|
|||
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
|
||||
github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
|
||||
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
|
||||
github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ=
|
||||
github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI=
|
||||
github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
|
||||
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
|
||||
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
github.com/golang-migrate/migrate v3.5.4+incompatible h1:R7OzwvCJTCgwapPCiX6DyBiu2czIUMDCB118gFTKTUA=
|
||||
github.com/golang-migrate/migrate v3.5.4+incompatible/go.mod h1:IsVUlFN5puWOmXrqjgGUfIRIbU7mr8oNBE2tyERd9Wk=
|
||||
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
|
||||
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
|
||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-mastodon v0.0.6 h1:lqU1sOeeIapaDsDUL6udDZIzMb2Wqapo347VZlaOzf0=
|
||||
github.com/mattn/go-mastodon v0.0.6/go.mod h1:cg7RFk2pcUfHZw/IvKe1FUzmlq5KnLFqs7eV2PHplV8=
|
||||
github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM=
|
||||
github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
||||
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
|
||||
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||
github.com/mb-14/gomarkov v0.0.0-20231120193207-9cbdc8df67a8 h1:4Z2WmWiMrfaZZYbuw5vx1yv1jfgtf5fuRgSUSxhTy5A=
|
||||
github.com/mb-14/gomarkov v0.0.0-20231120193207-9cbdc8df67a8/go.mod h1:6nnTLIXjtAZzRGji0HC3vH+rGM2rKdAkIKgizGlRF6g=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||
github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A=
|
||||
github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
|
||||
github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0=
|
||||
github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||
github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=
|
||||
github.com/tidwall/gjson v1.17.0/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/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=
|
||||
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
|
||||
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
||||
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/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y=
|
||||
github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFyPdL66DjUD96XmzVL3ZntbzcflLnznH0fr99w5VqE=
|
||||
go.mau.fi/util v0.1.0 h1:BwIFWIOEeO7lsiI2eWKFkWTfc5yQmoe+0FYyOFVyaoE=
|
||||
go.mau.fi/util v0.1.0/go.mod h1:AxuJUMCxpzgJ5eV9JbPWKRH8aAJJidxetNdUj7qcb84=
|
||||
go.mau.fi/util v0.4.1 h1:3EC9KxIXo5+h869zDGf5OOZklRd/FjeVnimTwtm3owg=
|
||||
go.mau.fi/util v0.4.1/go.mod h1:GjkTEBsehYZbSh2LlE6cWEn+6ZIZTGrTMM/5DMNlmFY=
|
||||
golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck=
|
||||
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
|
||||
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
|
||||
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
|
||||
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
|
||||
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw=
|
||||
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ=
|
||||
golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
|
||||
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
||||
golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
|
||||
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
|
||||
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
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 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
|
||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
|
||||
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
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/maulogger/v2 v2.4.1 h1:N7zSdd0mZkB2m2JtFUsiGTQQAdP0YeFWT7YMc80yAL8=
|
||||
maunium.net/go/maulogger/v2 v2.4.1/go.mod h1:omPuYwYBILeVQobz8uO3XC8DIRuEb5rXYlQSuqrbCho=
|
||||
maunium.net/go/mautrix v0.16.1 h1:Wb3CvOCe8A/NLsFeZYxKrgXKiqeZUQEBD1zqm7n/kWk=
|
||||
maunium.net/go/mautrix v0.16.1/go.mod h1:2Jf15tulVtr6LxoiRL4smRXwpkGWUNfBFhwh/aXDBuk=
|
||||
maunium.net/go/mautrix v0.18.0 h1:sNsApeSWB8x0hLjGcdmi5JqO6Tvp2PVkiSStz+Yas6k=
|
||||
maunium.net/go/mautrix v0.18.0/go.mod h1:STwJZ+6CAeiEQs7fYCkd5aC12XR5DXANE6Swy/PBKGo=
|
194
src/internal/gomatrixcloner/matrix.go
Normal file
194
src/internal/gomatrixcloner/matrix.go
Normal file
|
@ -0,0 +1,194 @@
|
|||
package gomatrixcloner
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/chzyer/readline"
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
"github.com/rs/zerolog"
|
||||
"go.mau.fi/util/exzerolog"
|
||||
"maunium.net/go/mautrix"
|
||||
"maunium.net/go/mautrix/crypto/cryptohelper"
|
||||
"maunium.net/go/mautrix/event"
|
||||
"maunium.net/go/mautrix/id"
|
||||
)
|
||||
|
||||
var (
|
||||
// Matrix creds
|
||||
MatrixHost string
|
||||
MatrixUsername string
|
||||
MatrixPassword string
|
||||
MautrixDB = "/data/mautrix.db"
|
||||
)
|
||||
|
||||
type MtrxClient struct {
|
||||
c *mautrix.Client
|
||||
startTime int64
|
||||
fromRoom id.RoomID
|
||||
toRoom id.RoomID
|
||||
|
||||
quitMeDaddy chan struct{}
|
||||
}
|
||||
|
||||
// Run - starts bot!
|
||||
func Run() {
|
||||
mtrx := MtrxClient{}
|
||||
mtrx.startTime = time.Now().UnixMilli()
|
||||
|
||||
mtrx.fromRoom = id.RoomID(os.Getenv("MATRIX_SOURCE_ROOM"))
|
||||
mtrx.toRoom = id.RoomID(os.Getenv("MATRIX_DESTINATION_ROOM"))
|
||||
|
||||
// boot matrix
|
||||
client, err := mautrix.NewClient(MatrixHost, "", "")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
mtrx.c = client
|
||||
|
||||
rl, err := readline.New("[no room]> ")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer rl.Close()
|
||||
|
||||
log := zerolog.New(zerolog.NewConsoleWriter(func(w *zerolog.ConsoleWriter) {
|
||||
w.Out = rl.Stdout()
|
||||
w.TimeFormat = time.Stamp
|
||||
})).With().Timestamp().Logger()
|
||||
log = log.Level(zerolog.InfoLevel)
|
||||
|
||||
exzerolog.SetupDefaults(&log)
|
||||
mtrx.c.Log = log
|
||||
|
||||
var lastRoomID id.RoomID
|
||||
syncer := mtrx.c.Syncer.(*mautrix.DefaultSyncer)
|
||||
syncer.OnEventType(event.EventMessage, func(ctx context.Context, evt *event.Event) {
|
||||
lastRoomID = evt.RoomID
|
||||
rl.SetPrompt(fmt.Sprintf("%s> ", lastRoomID))
|
||||
log.Info().
|
||||
Str("sender", evt.Sender.String()).
|
||||
Str("type", evt.Type.String()).
|
||||
Str("body", evt.Content.AsMessage().Body)
|
||||
|
||||
// Thread for s p e e d
|
||||
go mtrx.handleMessageEvent(ctx, evt)
|
||||
})
|
||||
|
||||
syncer.OnEventType(event.StateMember, func(ctx context.Context, evt *event.Event) {
|
||||
if evt.GetStateKey() == mtrx.c.UserID.String() && evt.Content.AsMember().Membership == event.MembershipInvite {
|
||||
_, err := mtrx.c.JoinRoomByID(ctx, evt.RoomID)
|
||||
if err == nil {
|
||||
lastRoomID = evt.RoomID
|
||||
rl.SetPrompt(fmt.Sprintf("%s> ", lastRoomID))
|
||||
log.Info().
|
||||
Str("room_id", evt.RoomID.String()).
|
||||
Str("inviter", evt.Sender.String()).
|
||||
Msg("Joined room after invite")
|
||||
} else {
|
||||
log.Error().Err(err).
|
||||
Str("room_id", evt.RoomID.String()).
|
||||
Str("inviter", evt.Sender.String()).
|
||||
Msg("Failed to join room after invite")
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
cryptoHelper, err := cryptohelper.NewCryptoHelper(mtrx.c, []byte("meow"), MautrixDB)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
cryptoHelper.LoginAs = &mautrix.ReqLogin{
|
||||
Type: mautrix.AuthTypePassword,
|
||||
Identifier: mautrix.UserIdentifier{Type: mautrix.IdentifierTypeUser, User: MatrixUsername},
|
||||
Password: MatrixPassword,
|
||||
}
|
||||
err = cryptoHelper.Init(context.TODO())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
// Set the client crypto helper in order to automatically encrypt outgoing messages
|
||||
mtrx.c.Crypto = cryptoHelper
|
||||
|
||||
log.Info().Msg("Now running")
|
||||
syncCtx, cancelSync := context.WithCancel(context.Background())
|
||||
var syncStopWait sync.WaitGroup
|
||||
syncStopWait.Add(1)
|
||||
|
||||
go func() {
|
||||
err = mtrx.c.SyncWithContext(syncCtx)
|
||||
defer syncStopWait.Done()
|
||||
if err != nil && !errors.Is(err, context.Canceled) {
|
||||
panic(err)
|
||||
}
|
||||
}()
|
||||
|
||||
for {
|
||||
line, err := rl.Readline()
|
||||
if err != nil { // io.EOF
|
||||
break
|
||||
}
|
||||
if lastRoomID == "" {
|
||||
log.Error().Msg("Wait for an incoming message before sending messages")
|
||||
continue
|
||||
}
|
||||
resp, err := mtrx.c.SendText(context.TODO(), lastRoomID, line)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to send event")
|
||||
} else {
|
||||
log.Info().Str("event_id", resp.EventID.String()).Msg("Event sent")
|
||||
}
|
||||
}
|
||||
|
||||
// Keep it running!!
|
||||
mtrx.quitMeDaddy = make(chan struct{})
|
||||
for {
|
||||
select {
|
||||
case <-mtrx.quitMeDaddy:
|
||||
log.Info().Msg("Received quit command!!!")
|
||||
cancelSync()
|
||||
syncStopWait.Wait()
|
||||
err = cryptoHelper.Close()
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Error closing database")
|
||||
}
|
||||
os.Exit(0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (mtrx *MtrxClient) handleMessageEvent(ctx context.Context, evt *event.Event) {
|
||||
if evt.RoomID != mtrx.fromRoom {
|
||||
return
|
||||
}
|
||||
|
||||
// If parsing own messages.. stop that too
|
||||
if evt.Sender.String() == mtrx.c.UserID.String() {
|
||||
return
|
||||
}
|
||||
|
||||
// If syncing older messages.. stop that now
|
||||
if evt.Timestamp < mtrx.startTime {
|
||||
return
|
||||
}
|
||||
|
||||
mtrx.sendMessage(ctx, mtrx.toRoom, fmt.Sprintf(
|
||||
"%s: %s",
|
||||
evt.Sender.Localpart(),
|
||||
evt.Content.AsMessage().Body,
|
||||
))
|
||||
}
|
||||
|
||||
func (mtrx *MtrxClient) sendMessage(ctx context.Context, roomID id.RoomID, text string) {
|
||||
resp, err := mtrx.c.SendText(ctx, roomID, text)
|
||||
if err != nil {
|
||||
mtrx.c.Log.Error().Err(err).Msg("Failed to send event")
|
||||
} else {
|
||||
mtrx.c.Log.Info().Str("event_id", resp.EventID.String()).Msg("Event sent")
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue