Files
trbot/utils/signals/signals.go
Hubert Chen f4e904ef4d refactor yaml database logger
plugin_sticker:
    add sticker collect to channel feature
    allow detected `addsticker` link and show download sticker set button
database:
    remove `IsInitialized` and `InitializedErr` in `DatabaseBackend` struct
    add `context.Context` params in `DatabaseBackend.Initializer`
yaml_db:
    using `yaml.LoadYAML()` and `yaml.SaveYAML()` to save database file
    using `zerolog` logger replace `log`
    fix database file protection logic
    remove `addToYamlDB()` func
    update `Database.UpdateTimestamp` when change some flag
handlers:
    fix `CustomSymbolCommand` trigger: use `strings.HasPrefix()` to replace `utils.CommandMaybeWithSuffixUsername()`, custom symbol command will not include robot username suffix
consts:
    rename `YAMLDataBasePath` to `YAMLDataBaseDir`
mess:
    remove `PrintLogAndSave()` func
2025-07-04 00:54:31 +08:00

68 lines
1.6 KiB
Go

package signals
import (
"context"
"os"
"time"
"trbot/database"
"trbot/database/yaml_db"
"trbot/utils/plugin_utils"
"github.com/rs/zerolog"
)
type SignalChannel struct {
Database_save chan bool
PluginDB_save chan bool
PluginDB_reload chan bool
}
var SIGNALS = SignalChannel{
Database_save: make(chan bool),
PluginDB_save: make(chan bool),
PluginDB_reload: make(chan bool),
}
func SignalsHandler(ctx context.Context) {
logger := zerolog.Ctx(ctx)
every10Min := time.NewTicker(10 * time.Minute)
defer every10Min.Stop()
var saveDatabaseRetryCount int = 0
var saveDatabaseRetryMax int = 10
for {
select {
case <-every10Min.C: // 每次 Ticker 触发时执行任务
yaml_db.AutoSaveDatabaseHandler(ctx)
case <-ctx.Done():
if saveDatabaseRetryCount == 0 { logger.Warn().Msg("Cancle signal received") }
err := database.SaveDatabase(ctx)
if err != nil {
saveDatabaseRetryCount++
logger.Error().
Err(err).
Int("retryCount", saveDatabaseRetryCount).
Int("maxRetry", saveDatabaseRetryMax).
Msg("Failed to save database, retrying...")
time.Sleep(2 * time.Second)
if saveDatabaseRetryCount >= saveDatabaseRetryMax {
logger.Fatal().
Err(err).
Msg("Failed to save database too many times, exiting")
}
continue
}
logger.Info().Msg("Database saved")
time.Sleep(1 * time.Second)
logger.Warn().Msg("manually stopped")
os.Exit(0)
case <-SIGNALS.Database_save:
database.SaveDatabase(ctx)
case <-SIGNALS.PluginDB_reload:
plugin_utils.ReloadPluginsDatabase(ctx)
case <-SIGNALS.PluginDB_save:
plugin_utils.SavePluginsDatabase(ctx)
}
}
}