ai update
Some checks failed
Deploy Matrix Bot / deploy (push) Waiting to run
Docker Build / build (push) Failing after 5m58s

This commit is contained in:
shinya 2026-03-06 10:54:03 +01:00
parent 7c397a0d3a
commit 1171de80a3
3 changed files with 62 additions and 5 deletions

View File

@ -12,19 +12,27 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Gitea registry
if: ${{ secrets.GITEA_REGISTRY_USERNAME != '' && secrets.GITEA_REGISTRY_PASSWORD != '' }}
uses: docker/login-action@v3
with:
registry: git.kogami.xyz
username: ${{ secrets.GITEA_REGISTRY_USERNAME }}
password: ${{ secrets.GITEA_REGISTRY_PASSWORD }}
- name: Build image
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/arm64
push: false
load: true
tags: matrix-bot:latest
cache-from: type=registry,ref=git.kogami.xyz/foglar/matrix-bot:buildcache
cache-to: type=registry,ref=git.kogami.xyz/foglar/matrix-bot:buildcache,mode=max
- name: Run container
env:
@ -37,6 +45,7 @@ jobs:
MATRIX_USERNAME: ${{ secrets.MATRIX_USERNAME }}
MATRIX_PASSWORD: ${{ secrets.MATRIX_PASSWORD }}
MATRIX_ROOM_ID: ${{ secrets.MATRIX_ROOM_ID }}
MATRIX_CRYPTO_RESET_ON_MISMATCH: "true"
run: |
docker run --rm \
-e MATRIX_HOMESERVER \
@ -48,6 +57,7 @@ jobs:
-e MATRIX_USERNAME \
-e MATRIX_PASSWORD \
-e MATRIX_ROOM_ID \
-e MATRIX_CRYPTO_RESET_ON_MISMATCH \
-e MATRIX_WORDLIST=/data/sowpods.csv \
-e MATRIX_CRYPTO_DB=/data/crypto.db \
-v matrix-bot-data:/data \

View File

@ -6,10 +6,10 @@ WORKDIR /app
RUN apk add --no-cache ca-certificates olm-dev build-base
COPY go.mod ./
RUN go mod download
RUN --mount=type=cache,target=/go/pkg/mod go mod download
COPY . .
RUN CGO_ENABLED=1 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH:-arm64} go build -o matrix-bot ./
RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build CGO_ENABLED=1 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH:-arm64} go build -o matrix-bot ./
FROM alpine:3.19
WORKDIR /app

47
main.go
View File

@ -3,10 +3,12 @@ package main
import (
"context"
"encoding/json"
"errors"
"log"
"matrix-bot/bot"
"os"
"path/filepath"
"strings"
"sync"
"maunium.net/go/mautrix"
@ -27,6 +29,7 @@ var pickleKeyString string
var recoveryKey string
var cryptoDBPath string
var credentialsPath string
var cryptoResetOnMismatch bool
type storedCredentials struct {
UserID string `json:"user_id"`
@ -147,6 +150,30 @@ func loadConfig() {
recoveryKey = envOrFatal("MATRIX_RECOVERY_KEY")
cryptoDBPath = envOrDefault("MATRIX_CRYPTO_DB", "crypto.db")
credentialsPath = envOrDefault("MATRIX_CREDENTIALS_PATH", "/data/credentials.json")
cryptoResetOnMismatch = strings.EqualFold(envOrDefault("MATRIX_CRYPTO_RESET_ON_MISMATCH", ""), "true") ||
envOrDefault("MATRIX_CRYPTO_RESET_ON_MISMATCH", "") == "1"
}
func isOlmAccountMismatch(err error) bool {
if err == nil {
return false
}
return strings.Contains(err.Error(), "olm account is not marked as shared")
}
func resetCryptoState() error {
var resetErr error
if cryptoDBPath != "" {
if err := os.Remove(cryptoDBPath); err != nil && !errors.Is(err, os.ErrNotExist) {
resetErr = err
}
}
if credentialsPath != "" {
if err := os.Remove(credentialsPath); err != nil && !errors.Is(err, os.ErrNotExist) {
resetErr = err
}
}
return resetErr
}
func main() {
@ -219,6 +246,16 @@ func main() {
cryptoHelper, err := setupCryptoHelper(client)
if err != nil {
if isOlmAccountMismatch(err) {
log.Println("Detected olm account mismatch with server keys")
if cryptoResetOnMismatch {
if resetErr := resetCryptoState(); resetErr != nil {
log.Fatal(resetErr)
}
log.Fatal("Reset crypto state due to mismatch. Restart the container to re-login.")
}
log.Fatal("Crypto mismatch. Remove crypto DB and credentials, then restart.")
}
log.Fatal(err)
}
client.Crypto = cryptoHelper
@ -274,6 +311,16 @@ func main() {
log.Println("Sync complete")
if err := verifyWithRecoveryKey(cryptoHelper.Machine()); err != nil {
if isOlmAccountMismatch(err) {
log.Println("Detected olm account mismatch with server keys")
if cryptoResetOnMismatch {
if resetErr := resetCryptoState(); resetErr != nil {
log.Fatal(resetErr)
}
log.Fatal("Reset crypto state due to mismatch. Restart the container to re-login.")
}
log.Fatal("Crypto mismatch. Remove crypto DB and credentials, then restart.")
}
log.Fatal(err)
}