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 - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 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 - name: Build image
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
with: with:
context: . context: .
platforms: linux/arm64
push: false push: false
load: true load: true
tags: matrix-bot:latest 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 - name: Run container
env: env:
@ -37,6 +45,7 @@ jobs:
MATRIX_USERNAME: ${{ secrets.MATRIX_USERNAME }} MATRIX_USERNAME: ${{ secrets.MATRIX_USERNAME }}
MATRIX_PASSWORD: ${{ secrets.MATRIX_PASSWORD }} MATRIX_PASSWORD: ${{ secrets.MATRIX_PASSWORD }}
MATRIX_ROOM_ID: ${{ secrets.MATRIX_ROOM_ID }} MATRIX_ROOM_ID: ${{ secrets.MATRIX_ROOM_ID }}
MATRIX_CRYPTO_RESET_ON_MISMATCH: "true"
run: | run: |
docker run --rm \ docker run --rm \
-e MATRIX_HOMESERVER \ -e MATRIX_HOMESERVER \
@ -48,6 +57,7 @@ jobs:
-e MATRIX_USERNAME \ -e MATRIX_USERNAME \
-e MATRIX_PASSWORD \ -e MATRIX_PASSWORD \
-e MATRIX_ROOM_ID \ -e MATRIX_ROOM_ID \
-e MATRIX_CRYPTO_RESET_ON_MISMATCH \
-e MATRIX_WORDLIST=/data/sowpods.csv \ -e MATRIX_WORDLIST=/data/sowpods.csv \
-e MATRIX_CRYPTO_DB=/data/crypto.db \ -e MATRIX_CRYPTO_DB=/data/crypto.db \
-v matrix-bot-data:/data \ -v matrix-bot-data:/data \

View File

@ -6,10 +6,10 @@ WORKDIR /app
RUN apk add --no-cache ca-certificates olm-dev build-base RUN apk add --no-cache ca-certificates olm-dev build-base
COPY go.mod ./ COPY go.mod ./
RUN go mod download RUN --mount=type=cache,target=/go/pkg/mod go mod download
COPY . . 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 FROM alpine:3.19
WORKDIR /app WORKDIR /app

47
main.go
View File

@ -3,10 +3,12 @@ package main
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"errors"
"log" "log"
"matrix-bot/bot" "matrix-bot/bot"
"os" "os"
"path/filepath" "path/filepath"
"strings"
"sync" "sync"
"maunium.net/go/mautrix" "maunium.net/go/mautrix"
@ -27,6 +29,7 @@ var pickleKeyString string
var recoveryKey string var recoveryKey string
var cryptoDBPath string var cryptoDBPath string
var credentialsPath string var credentialsPath string
var cryptoResetOnMismatch bool
type storedCredentials struct { type storedCredentials struct {
UserID string `json:"user_id"` UserID string `json:"user_id"`
@ -147,6 +150,30 @@ func loadConfig() {
recoveryKey = envOrFatal("MATRIX_RECOVERY_KEY") recoveryKey = envOrFatal("MATRIX_RECOVERY_KEY")
cryptoDBPath = envOrDefault("MATRIX_CRYPTO_DB", "crypto.db") cryptoDBPath = envOrDefault("MATRIX_CRYPTO_DB", "crypto.db")
credentialsPath = envOrDefault("MATRIX_CREDENTIALS_PATH", "/data/credentials.json") 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() { func main() {
@ -219,6 +246,16 @@ func main() {
cryptoHelper, err := setupCryptoHelper(client) cryptoHelper, err := setupCryptoHelper(client)
if err != nil { 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) log.Fatal(err)
} }
client.Crypto = cryptoHelper client.Crypto = cryptoHelper
@ -274,6 +311,16 @@ func main() {
log.Println("Sync complete") log.Println("Sync complete")
if err := verifyWithRecoveryKey(cryptoHelper.Machine()); err != nil { 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) log.Fatal(err)
} }