mirror of
https://git.sr.ht/~ashkeel/strimertul
synced 2024-09-18 01:50:50 +00:00
refactor: slightly nicer logs
This commit is contained in:
parent
e8964f8d0c
commit
adc3cacc24
11 changed files with 74 additions and 73 deletions
30
app.go
30
app.go
|
@ -159,20 +159,20 @@ func (a *App) startup(ctx context.Context) {
|
||||||
|
|
||||||
func (a *App) stop(context.Context) {
|
func (a *App) stop(context.Context) {
|
||||||
if a.lock != nil {
|
if a.lock != nil {
|
||||||
warnOnError(a.lock.Unlock(), "could not remove lock file")
|
warnOnError(a.lock.Unlock(), "Could not remove lock file")
|
||||||
}
|
}
|
||||||
if a.loyaltyManager != nil {
|
if a.loyaltyManager != nil {
|
||||||
warnOnError(a.loyaltyManager.Close(), "could not cleanly close loyalty manager")
|
warnOnError(a.loyaltyManager.Close(), "Could not cleanly close loyalty manager")
|
||||||
}
|
}
|
||||||
if a.twitchManager != nil {
|
if a.twitchManager != nil {
|
||||||
warnOnError(a.twitchManager.Close(), "could not cleanly close twitch client")
|
warnOnError(a.twitchManager.Close(), "Could not cleanly close twitch client")
|
||||||
}
|
}
|
||||||
if a.httpServer != nil {
|
if a.httpServer != nil {
|
||||||
warnOnError(a.httpServer.Close(), "could not cleanly close HTTP server")
|
warnOnError(a.httpServer.Close(), "Could not cleanly close HTTP server")
|
||||||
}
|
}
|
||||||
warnOnError(a.db.Close(), "could not cleanly close database")
|
warnOnError(a.db.Close(), "Could not cleanly close database")
|
||||||
|
|
||||||
warnOnError(a.driver.Close(), "could not close driver")
|
warnOnError(a.driver.Close(), "Could not close driver")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) AuthenticateKVClient(id string) {
|
func (a *App) AuthenticateKVClient(id string) {
|
||||||
|
@ -180,7 +180,7 @@ func (a *App) AuthenticateKVClient(id string) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
warnOnError(a.driver.Hub().SetAuthenticated(idInt, true), "could not mark session as authenticated", zap.String("session-id", id))
|
warnOnError(a.driver.Hub().SetAuthenticated(idInt, true), "Could not mark session as authenticated", zap.String("session-id", id))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) IsServerReady() bool {
|
func (a *App) IsServerReady() bool {
|
||||||
|
@ -220,11 +220,11 @@ func (a *App) SendCrashReport(errorData string, info string) (string, error) {
|
||||||
|
|
||||||
// Add text fields
|
// Add text fields
|
||||||
if err := w.WriteField("error", errorData); err != nil {
|
if err := w.WriteField("error", errorData); err != nil {
|
||||||
logger.Error("could not encode field error for crash report", zap.Error(err))
|
logger.Error("Could not encode field error for crash report", zap.Error(err))
|
||||||
}
|
}
|
||||||
if len(info) > 0 {
|
if len(info) > 0 {
|
||||||
if err := w.WriteField("info", info); err != nil {
|
if err := w.WriteField("info", info); err != nil {
|
||||||
logger.Error("could not encode field info for crash report", zap.Error(err))
|
logger.Error("Could not encode field info for crash report", zap.Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -234,20 +234,20 @@ func (a *App) SendCrashReport(errorData string, info string) (string, error) {
|
||||||
addFile(w, "paniclog", panicFilename)
|
addFile(w, "paniclog", panicFilename)
|
||||||
|
|
||||||
if err := w.Close(); err != nil {
|
if err := w.Close(); err != nil {
|
||||||
logger.Error("could not prepare request for crash report", zap.Error(err))
|
logger.Error("Could not prepare request for crash report", zap.Error(err))
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := nethttp.Post(crashReportURL, w.FormDataContentType(), &b)
|
resp, err := nethttp.Post(crashReportURL, w.FormDataContentType(), &b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("could not send crash report", zap.Error(err))
|
logger.Error("Could not send crash report", zap.Error(err))
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check the response
|
// Check the response
|
||||||
if resp.StatusCode != nethttp.StatusOK {
|
if resp.StatusCode != nethttp.StatusOK {
|
||||||
byt, _ := io.ReadAll(resp.Body)
|
byt, _ := io.ReadAll(resp.Body)
|
||||||
logger.Error("crash report server returned error", zap.String("status", resp.Status), zap.String("response", string(byt)))
|
logger.Error("Crash report server returned error", zap.String("status", resp.Status), zap.String("response", string(byt)))
|
||||||
return "", fmt.Errorf("crash report server returned error: %s - %s", resp.Status, string(byt))
|
return "", fmt.Errorf("crash report server returned error: %s - %s", resp.Status, string(byt))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,17 +297,17 @@ func (a *App) showFatalError(err error, text string, fields ...zap.Field) {
|
||||||
func addFile(m *multipart.Writer, field string, filename string) {
|
func addFile(m *multipart.Writer, field string, filename string) {
|
||||||
logfile, err := m.CreateFormFile(field, filename)
|
logfile, err := m.CreateFormFile(field, filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("could not encode field log for crash report", zap.Error(err))
|
logger.Error("Could not encode field log for crash report", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
file, err := os.Open(filename)
|
file, err := os.Open(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("could not open file for including in crash report", zap.Error(err), zap.String("file", filename))
|
logger.Error("Could not open file for including in crash report", zap.Error(err), zap.String("file", filename))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err = io.Copy(logfile, file); err != nil {
|
if _, err = io.Copy(logfile, file); err != nil {
|
||||||
logger.Error("could not read from file for including in crash report", zap.Error(err), zap.String("file", filename))
|
logger.Error("Could not read from file for including in crash report", zap.Error(err), zap.String("file", filename))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
22
backup.go
22
backup.go
|
@ -15,15 +15,15 @@ import (
|
||||||
|
|
||||||
func BackupTask(driver database.DatabaseDriver, options database.BackupOptions) {
|
func BackupTask(driver database.DatabaseDriver, options database.BackupOptions) {
|
||||||
if options.BackupDir == "" {
|
if options.BackupDir == "" {
|
||||||
logger.Warn("backup directory not set, database backups are disabled")
|
logger.Warn("Backup directory not set, database backups are disabled")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err := os.MkdirAll(options.BackupDir, 0o755)
|
err := os.MkdirAll(options.BackupDir, 0o755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("could not create backup directory, moving to a temporary folder", zap.Error(err))
|
logger.Error("Could not create backup directory, moving to a temporary folder", zap.Error(err))
|
||||||
options.BackupDir = os.TempDir()
|
options.BackupDir = os.TempDir()
|
||||||
logger.Info("using temporary directory", zap.String("backup-dir", options.BackupDir))
|
logger.Info("Using temporary directory", zap.String("backup-dir", options.BackupDir))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,19 +33,19 @@ func BackupTask(driver database.DatabaseDriver, options database.BackupOptions)
|
||||||
// Run backup procedure
|
// Run backup procedure
|
||||||
file, err := os.Create(fmt.Sprintf("%s/%s.db", options.BackupDir, time.Now().Format("20060102-150405")))
|
file, err := os.Create(fmt.Sprintf("%s/%s.db", options.BackupDir, time.Now().Format("20060102-150405")))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("could not create backup file", zap.Error(err))
|
logger.Error("Could not create backup file", zap.Error(err))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
err = driver.Backup(file)
|
err = driver.Backup(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("could not backup database", zap.Error(err))
|
logger.Error("Could not backup database", zap.Error(err))
|
||||||
}
|
}
|
||||||
_ = file.Close()
|
_ = file.Close()
|
||||||
logger.Info("database backed up", zap.String("backup-file", file.Name()))
|
logger.Info("Database backup created", zap.String("backup-file", file.Name()))
|
||||||
// Remove old backups
|
// Remove old backups
|
||||||
files, err := os.ReadDir(options.BackupDir)
|
files, err := os.ReadDir(options.BackupDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("could not read backup directory", zap.Error(err))
|
logger.Error("Could not read backup directory", zap.Error(err))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// If maxBackups is set, remove older backups when we reach the limit
|
// If maxBackups is set, remove older backups when we reach the limit
|
||||||
|
@ -57,7 +57,7 @@ func BackupTask(driver database.DatabaseDriver, options database.BackupOptions)
|
||||||
for _, file := range toRemove {
|
for _, file := range toRemove {
|
||||||
err = os.Remove(fmt.Sprintf("%s/%s", options.BackupDir, file.Name()))
|
err = os.Remove(fmt.Sprintf("%s/%s", options.BackupDir, file.Name()))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("could not remove backup file", zap.Error(err))
|
logger.Error("Could not remove backup file", zap.Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ type BackupInfo struct {
|
||||||
func (a *App) GetBackups() (list []BackupInfo) {
|
func (a *App) GetBackups() (list []BackupInfo) {
|
||||||
files, err := os.ReadDir(a.backupOptions.BackupDir)
|
files, err := os.ReadDir(a.backupOptions.BackupDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("could not read backup directory", zap.Error(err))
|
logger.Error("Could not read backup directory", zap.Error(err))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,7 +84,7 @@ func (a *App) GetBackups() (list []BackupInfo) {
|
||||||
|
|
||||||
info, err := file.Info()
|
info, err := file.Info()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("could not get info for backup file", zap.Error(err))
|
logger.Error("Could not get info for backup file", zap.Error(err))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,6 +119,6 @@ func (a *App) RestoreBackup(backupName string) error {
|
||||||
return fmt.Errorf("could not restore database: %w", err)
|
return fmt.Errorf("could not restore database: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Info("restored database from backup")
|
logger.Info("Restored database from backup")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,7 @@ func cliImport(ctx *cli.Context) error {
|
||||||
return fatalError(err, "import failed")
|
return fatalError(err, "import failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Info("imported database from file")
|
logger.Info("Imported database from file")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ func cliRestore(ctx *cli.Context) error {
|
||||||
return fatalError(err, "restore failed")
|
return fatalError(err, "restore failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Info("restored database from backup")
|
logger.Info("Restored database from backup")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,6 +89,6 @@ func cliExport(ctx *cli.Context) error {
|
||||||
return fatalError(err, "export failed")
|
return fatalError(err, "export failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Info("exported database")
|
logger.Info("Exported database")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,14 +79,14 @@ func (p *PebbleDatabase) Restore(file io.Reader) error {
|
||||||
in := make(map[string]string)
|
in := make(map[string]string)
|
||||||
err := json.NewDecoder(file).Decode(&in)
|
err := json.NewDecoder(file).Decode(&in)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Could not decode backup: %w", err)
|
return fmt.Errorf("could not decode backup: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
b := p.db.NewBatch()
|
b := p.db.NewBatch()
|
||||||
for k, v := range in {
|
for k, v := range in {
|
||||||
err = b.Set([]byte(k), []byte(v), nil)
|
err = b.Set([]byte(k), []byte(v), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Could not set key %s: %w", k, err)
|
return fmt.Errorf("could not set key %s: %w", k, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ import (
|
||||||
var json = jsoniter.ConfigFastest
|
var json = jsoniter.ConfigFastest
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
ErrRedeemNotFound = errors.New("redeem not found")
|
||||||
ErrRedeemInCooldown = errors.New("redeem is on cooldown")
|
ErrRedeemInCooldown = errors.New("redeem is on cooldown")
|
||||||
ErrGoalNotFound = errors.New("goal not found")
|
ErrGoalNotFound = errors.New("goal not found")
|
||||||
ErrGoalAlreadyReached = errors.New("goal already reached")
|
ErrGoalAlreadyReached = errors.New("goal already reached")
|
||||||
|
@ -121,7 +122,7 @@ func NewManager(db *database.LocalDBClient, twitchManager *twitch.Manager, logge
|
||||||
// SubscribePrefix for changes
|
// SubscribePrefix for changes
|
||||||
err, loyalty.cancelSub = db.SubscribePrefix(loyalty.update, "loyalty/")
|
err, loyalty.cancelSub = db.SubscribePrefix(loyalty.update, "loyalty/")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("could not setup loyalty reload subscription", zap.Error(err))
|
logger.Error("Could not setup loyalty reload subscription", zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
loyalty.SetBanList(config.BanList)
|
loyalty.SetBanList(config.BanList)
|
||||||
|
@ -189,9 +190,9 @@ func (m *Manager) update(key, value string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
m.logger.Error("subscribe error: invalid JSON received on key", zap.Error(err), zap.String("key", key))
|
m.logger.Error("Subscribe error: invalid JSON received on key", zap.Error(err), zap.String("key", key))
|
||||||
} else {
|
} else {
|
||||||
m.logger.Debug("updated key", zap.String("key", key))
|
m.logger.Debug("Updated key", zap.String("key", key))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -293,7 +294,7 @@ func (m *Manager) RemoveRedeem(redeem Redeem) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return errors.New("redeem not found")
|
return ErrRedeemNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manager) SaveGoals() error {
|
func (m *Manager) SaveGoals() error {
|
||||||
|
|
|
@ -232,7 +232,7 @@ func (m *Manager) cmdRedeemReward(bot *twitch.Bot, message irc.PrivateMessage) {
|
||||||
bot.Client.Say(message.Channel, fmt.Sprintf("%s: That reward is in cooldown (available in %s)", message.User.DisplayName,
|
bot.Client.Say(message.Channel, fmt.Sprintf("%s: That reward is in cooldown (available in %s)", message.User.DisplayName,
|
||||||
time.Until(nextAvailable).Truncate(time.Second)))
|
time.Until(nextAvailable).Truncate(time.Second)))
|
||||||
default:
|
default:
|
||||||
m.logger.Error("error while performing redeem", zap.Error(err))
|
m.logger.Error("Error while performing redeem", zap.Error(err))
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -332,7 +332,7 @@ func (m *Manager) cmdContributeGoal(bot *twitch.Bot, message irc.PrivateMessage)
|
||||||
// Add points to goal
|
// Add points to goal
|
||||||
points, err := m.PerformContribution(selectedGoal, message.User.Name, points)
|
points, err := m.PerformContribution(selectedGoal, message.User.Name, points)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
m.logger.Error("error while contributing to goal", zap.Error(err))
|
m.logger.Error("Error while contributing to goal", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if points == 0 {
|
if points == 0 {
|
||||||
|
|
|
@ -97,12 +97,12 @@ func SetupAlerts(bot *Bot) *BotAlertsModule {
|
||||||
// Load config from database
|
// Load config from database
|
||||||
err := bot.api.db.GetJSON(BotAlertsKey, &mod.Config)
|
err := bot.api.db.GetJSON(BotAlertsKey, &mod.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Debug("config load error", zap.Error(err))
|
bot.logger.Debug("Config load error", zap.Error(err))
|
||||||
mod.Config = BotAlertsConfig{}
|
mod.Config = BotAlertsConfig{}
|
||||||
// Save empty config
|
// Save empty config
|
||||||
err = bot.api.db.PutJSON(BotAlertsKey, mod.Config)
|
err = bot.api.db.PutJSON(BotAlertsKey, mod.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Warn("could not save default config for bot alerts", zap.Error(err))
|
bot.logger.Warn("Could not save default config for bot alerts", zap.Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,14 +111,14 @@ func SetupAlerts(bot *Bot) *BotAlertsModule {
|
||||||
err, mod.cancelAlertSub = bot.api.db.SubscribeKey(BotAlertsKey, func(value string) {
|
err, mod.cancelAlertSub = bot.api.db.SubscribeKey(BotAlertsKey, func(value string) {
|
||||||
err := json.UnmarshalFromString(value, &mod.Config)
|
err := json.UnmarshalFromString(value, &mod.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Debug("error reloading timer config", zap.Error(err))
|
bot.logger.Debug("Error reloading timer config", zap.Error(err))
|
||||||
} else {
|
} else {
|
||||||
bot.logger.Info("reloaded alert config")
|
bot.logger.Info("Reloaded alert config")
|
||||||
}
|
}
|
||||||
mod.compileTemplates()
|
mod.compileTemplates()
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Error("could not set-up bot alert reload subscription", zap.Error(err))
|
bot.logger.Error("Could not set-up bot alert reload subscription", zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Subscriptions are handled with a slight delay as info come from different events and must be aggregated
|
// Subscriptions are handled with a slight delay as info come from different events and must be aggregated
|
||||||
|
@ -236,7 +236,7 @@ func SetupAlerts(bot *Bot) *BotAlertsModule {
|
||||||
var ev eventSubNotification
|
var ev eventSubNotification
|
||||||
err := json.UnmarshalFromString(value, &ev)
|
err := json.UnmarshalFromString(value, &ev)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Debug("error parsing webhook payload", zap.Error(err))
|
bot.logger.Debug("Error parsing webhook payload", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
switch ev.Subscription.Type {
|
switch ev.Subscription.Type {
|
||||||
|
@ -249,7 +249,7 @@ func SetupAlerts(bot *Bot) *BotAlertsModule {
|
||||||
var followEv helix.EventSubChannelFollowEvent
|
var followEv helix.EventSubChannelFollowEvent
|
||||||
err := json.Unmarshal(ev.Event, &followEv)
|
err := json.Unmarshal(ev.Event, &followEv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Debug("error parsing follow event", zap.Error(err))
|
bot.logger.Debug("Error parsing follow event", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Pick a random message
|
// Pick a random message
|
||||||
|
@ -270,7 +270,7 @@ func SetupAlerts(bot *Bot) *BotAlertsModule {
|
||||||
var raidEv helix.EventSubChannelRaidEvent
|
var raidEv helix.EventSubChannelRaidEvent
|
||||||
err := json.Unmarshal(ev.Event, &raidEv)
|
err := json.Unmarshal(ev.Event, &raidEv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Debug("error parsing raid event", zap.Error(err))
|
bot.logger.Debug("Error parsing raid event", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Pick a random message from base set
|
// Pick a random message from base set
|
||||||
|
@ -306,7 +306,7 @@ func SetupAlerts(bot *Bot) *BotAlertsModule {
|
||||||
var cheerEv helix.EventSubChannelCheerEvent
|
var cheerEv helix.EventSubChannelCheerEvent
|
||||||
err := json.Unmarshal(ev.Event, &cheerEv)
|
err := json.Unmarshal(ev.Event, &cheerEv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Debug("error parsing cheer event", zap.Error(err))
|
bot.logger.Debug("Error parsing cheer event", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Pick a random message from base set
|
// Pick a random message from base set
|
||||||
|
@ -342,7 +342,7 @@ func SetupAlerts(bot *Bot) *BotAlertsModule {
|
||||||
var subEv helix.EventSubChannelSubscribeEvent
|
var subEv helix.EventSubChannelSubscribeEvent
|
||||||
err := json.Unmarshal(ev.Event, &subEv)
|
err := json.Unmarshal(ev.Event, &subEv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Debug("error parsing sub event", zap.Error(err))
|
bot.logger.Debug("Error parsing new subscription event", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
addPendingSub(subEv)
|
addPendingSub(subEv)
|
||||||
|
@ -355,7 +355,7 @@ func SetupAlerts(bot *Bot) *BotAlertsModule {
|
||||||
var subEv helix.EventSubChannelSubscriptionMessageEvent
|
var subEv helix.EventSubChannelSubscriptionMessageEvent
|
||||||
err := json.Unmarshal(ev.Event, &subEv)
|
err := json.Unmarshal(ev.Event, &subEv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Debug("error parsing sub event", zap.Error(err))
|
bot.logger.Debug("Error parsing returning subscription event", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
addPendingSub(subEv)
|
addPendingSub(subEv)
|
||||||
|
@ -368,7 +368,7 @@ func SetupAlerts(bot *Bot) *BotAlertsModule {
|
||||||
var giftEv helix.EventSubChannelSubscriptionGiftEvent
|
var giftEv helix.EventSubChannelSubscriptionGiftEvent
|
||||||
err := json.Unmarshal(ev.Event, &giftEv)
|
err := json.Unmarshal(ev.Event, &giftEv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Debug("error parsing raid event", zap.Error(err))
|
bot.logger.Debug("Error parsing subscription gifted event", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Pick a random message from base set
|
// Pick a random message from base set
|
||||||
|
@ -411,10 +411,10 @@ func SetupAlerts(bot *Bot) *BotAlertsModule {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Error("could not setup twitch alert subscription", zap.Error(err))
|
bot.logger.Error("Could not setup twitch alert subscription", zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
bot.logger.Debug("loaded bot alerts")
|
bot.logger.Debug("Loaded bot alerts")
|
||||||
|
|
||||||
return mod
|
return mod
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@ func (m *BotAlertsModule) compileTemplates() {
|
||||||
func (m *BotAlertsModule) addTemplate(templateList templateCache, msg string) {
|
func (m *BotAlertsModule) addTemplate(templateList templateCache, msg string) {
|
||||||
tpl, err := template.New("").Funcs(m.bot.customFunctions).Funcs(sprig.TxtFuncMap()).Parse(msg)
|
tpl, err := template.New("").Funcs(m.bot.customFunctions).Funcs(sprig.TxtFuncMap()).Parse(msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
m.bot.logger.Error("error compiling template", zap.Error(err))
|
m.bot.logger.Error("Error compiling alert template", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
templateList[msg] = tpl
|
templateList[msg] = tpl
|
||||||
|
@ -488,7 +488,7 @@ func writeTemplate(bot *Bot, tpl *template.Template, data interface{}) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
err := tpl.Execute(&buf, data)
|
err := tpl.Execute(&buf, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Error("error executing template for alert", zap.Error(err))
|
bot.logger.Error("Error executing template for bot alert", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
bot.WriteMessage(buf.String())
|
bot.WriteMessage(buf.String())
|
||||||
|
|
|
@ -62,30 +62,30 @@ func SetupTimers(bot *Bot) *BotTimerModule {
|
||||||
// Load config from database
|
// Load config from database
|
||||||
err := bot.api.db.GetJSON(BotTimersKey, &mod.Config)
|
err := bot.api.db.GetJSON(BotTimersKey, &mod.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Debug("config load error", zap.Error(err))
|
bot.logger.Debug("Config load error", zap.Error(err))
|
||||||
mod.Config = BotTimersConfig{
|
mod.Config = BotTimersConfig{
|
||||||
Timers: make(map[string]BotTimer),
|
Timers: make(map[string]BotTimer),
|
||||||
}
|
}
|
||||||
// Save empty config
|
// Save empty config
|
||||||
err = bot.api.db.PutJSON(BotTimersKey, mod.Config)
|
err = bot.api.db.PutJSON(BotTimersKey, mod.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Warn("could not save default config for bot timers", zap.Error(err))
|
bot.logger.Warn("Could not save default config for bot timers", zap.Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err, mod.cancelTimerSub = bot.api.db.SubscribeKey(BotTimersKey, func(value string) {
|
err, mod.cancelTimerSub = bot.api.db.SubscribeKey(BotTimersKey, func(value string) {
|
||||||
err := json.UnmarshalFromString(value, &mod.Config)
|
err := json.UnmarshalFromString(value, &mod.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Debug("error reloading timer config", zap.Error(err))
|
bot.logger.Debug("Error reloading timer config", zap.Error(err))
|
||||||
} else {
|
} else {
|
||||||
bot.logger.Info("reloaded timer config")
|
bot.logger.Info("Reloaded timer config")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bot.logger.Error("could not set-up timer reload subscription", zap.Error(err))
|
bot.logger.Error("Could not set-up timer reload subscription", zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
bot.logger.Debug("loaded timers", zap.Int("timers", len(mod.Config.Timers)))
|
bot.logger.Debug("Loaded timers", zap.Int("timers", len(mod.Config.Timers)))
|
||||||
|
|
||||||
// Start goroutine for clearing message counters and running timers
|
// Start goroutine for clearing message counters and running timers
|
||||||
go mod.runTimers()
|
go mod.runTimers()
|
||||||
|
@ -103,7 +103,7 @@ func (m *BotTimerModule) runTimers() {
|
||||||
|
|
||||||
err := m.bot.api.db.PutJSON(ChatActivityKey, m.messages.Get())
|
err := m.bot.api.db.PutJSON(ChatActivityKey, m.messages.Get())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
m.bot.logger.Warn("error saving chat activity", zap.Error(err))
|
m.bot.logger.Warn("Error saving chat activity", zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate activity
|
// Calculate activity
|
||||||
|
|
|
@ -61,44 +61,44 @@ func NewManager(db *database.LocalDBClient, server *http.Server, logger *zap.Log
|
||||||
err, cancelConfigSub := db.SubscribeKey(ConfigKey, func(value string) {
|
err, cancelConfigSub := db.SubscribeKey(ConfigKey, func(value string) {
|
||||||
var newConfig Config
|
var newConfig Config
|
||||||
if err := json.UnmarshalFromString(value, &newConfig); err != nil {
|
if err := json.UnmarshalFromString(value, &newConfig); err != nil {
|
||||||
logger.Error("failed to unmarshal config", zap.Error(err))
|
logger.Error("Failed to decode Twitch integration config", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var updatedClient *Client
|
var updatedClient *Client
|
||||||
updatedClient, err = newClient(newConfig, db, server, logger)
|
updatedClient, err = newClient(newConfig, db, server, logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("could not create twitch client with new config, keeping old", zap.Error(err))
|
logger.Error("Could not create twitch client with new config, keeping old", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = manager.client.Close()
|
err = manager.client.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Warn("twitch client could not close cleanly", zap.Error(err))
|
logger.Warn("Twitch client could not close cleanly", zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
// New client works, replace old
|
// New client works, replace old
|
||||||
updatedClient.Merge(manager.client)
|
updatedClient.Merge(manager.client)
|
||||||
manager.client = updatedClient
|
manager.client = updatedClient
|
||||||
|
|
||||||
logger.Info("reloaded/updated Twitch client")
|
logger.Info("Reloaded/updated Twitch integration")
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("could not setup twitch config reload subscription", zap.Error(err))
|
logger.Error("Could not setup twitch config reload subscription", zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Listen for bot config changes
|
// Listen for bot config changes
|
||||||
err, cancelBotSub := db.SubscribeKey(BotConfigKey, func(value string) {
|
err, cancelBotSub := db.SubscribeKey(BotConfigKey, func(value string) {
|
||||||
var newBotConfig BotConfig
|
var newBotConfig BotConfig
|
||||||
if err := json.UnmarshalFromString(value, &newBotConfig); err != nil {
|
if err := json.UnmarshalFromString(value, &newBotConfig); err != nil {
|
||||||
logger.Error("failed to unmarshal Config", zap.Error(err))
|
logger.Error("Failed to decode bot config", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if manager.client.Bot != nil {
|
if manager.client.Bot != nil {
|
||||||
err = manager.client.Bot.Close()
|
err = manager.client.Bot.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
manager.client.logger.Warn("failed to disconnect old bot from Twitch IRC", zap.Error(err))
|
manager.client.logger.Warn("Failed to disconnect old bot from Twitch IRC", zap.Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,7 +113,7 @@ func NewManager(db *database.LocalDBClient, server *http.Server, logger *zap.Log
|
||||||
manager.client.logger.Info("reloaded/restarted Twitch bot")
|
manager.client.logger.Info("reloaded/restarted Twitch bot")
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
client.logger.Error("could not setup twitch bot config reload subscription", zap.Error(err))
|
client.logger.Error("Could not setup twitch bot config reload subscription", zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
manager.cancelSubs = func() {
|
manager.cancelSubs = func() {
|
||||||
|
@ -211,15 +211,15 @@ func newClient(config Config, db *database.LocalDBClient, server *http.Server, l
|
||||||
if userClient, err := client.GetUserClient(true); err == nil {
|
if userClient, err := client.GetUserClient(true); err == nil {
|
||||||
users, err := userClient.GetUsers(&helix.UsersParams{})
|
users, err := userClient.GetUsers(&helix.UsersParams{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
client.logger.Error("failed looking up user", zap.Error(err))
|
client.logger.Error("Failed looking up user", zap.Error(err))
|
||||||
} else if len(users.Data.Users) < 1 {
|
} else if len(users.Data.Users) < 1 {
|
||||||
client.logger.Error("no users found, please authenticate in Twitch configuration -> Events")
|
client.logger.Error("No users found, please authenticate in Twitch configuration -> Events")
|
||||||
} else {
|
} else {
|
||||||
client.User = users.Data.Users[0]
|
client.User = users.Data.Users[0]
|
||||||
go client.eventSubLoop(userClient)
|
go client.eventSubLoop(userClient)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
client.logger.Warn("twitch user not identified, this will break most features")
|
client.logger.Warn("Twitch user not identified, this will break most features")
|
||||||
}
|
}
|
||||||
|
|
||||||
go client.runStatusPoll()
|
go client.runStatusPoll()
|
||||||
|
|
|
@ -93,7 +93,7 @@ func (b *Bot) setupFunctions() {
|
||||||
counter += 1
|
counter += 1
|
||||||
err := b.api.db.PutKey(counterKey, strconv.Itoa(counter))
|
err := b.api.db.PutKey(counterKey, strconv.Itoa(counter))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.logger.Error("error saving key", zap.Error(err), zap.String("key", counterKey))
|
b.logger.Error("Error saving key", zap.Error(err), zap.String("key", counterKey))
|
||||||
}
|
}
|
||||||
return counter
|
return counter
|
||||||
},
|
},
|
||||||
|
|
|
@ -11,6 +11,6 @@ import (
|
||||||
func Close(res io.Closer, logger *zap.Logger) {
|
func Close(res io.Closer, logger *zap.Logger) {
|
||||||
err := res.Close()
|
err := res.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("could not close resource", zap.String("name", reflect.TypeOf(res).String()), zap.Error(err), zap.String("stack", string(debug.Stack())))
|
logger.Error("Could not close resource", zap.String("name", reflect.TypeOf(res).String()), zap.Error(err), zap.String("stack", string(debug.Stack())))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue