0. tests for event replay Tests are now included for the event replay features. This includes many fixes on top of the last commit as well as some tweaks to config module values. 1. activity module An activity module is created to track the useractive events and provide a counter for them. It also encapsulates logic to discard old useractive events. 2. web module A web module is created. This module serves a static webpage showing runtime information. Currently it only shows a snapshot of the user activity data. It is my intention that it eventually also shows an audit log, known users and channels, uptime, and more. Future work will also be needed in order to use HTML templating so that it doesn't look so... basic. Live updates to the information may also be desired. Signed-off-by: Ava Affine <ava@sunnypup.io>
119 lines
3.1 KiB
Go
119 lines
3.1 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
type AppConfig struct {
|
|
LogFile string `yaml:"log_file"`
|
|
LogDir string `yaml:"log_dir"`
|
|
LogMaxSizeMB int `yaml:"log_max_size_mb"`
|
|
LogMaxBackups int `yaml:"log_max_backups"`
|
|
LogMaxAgeDays int `yaml:"log_max_age_days"`
|
|
LogCompression bool `yaml:"log_compression"`
|
|
LogAddSource bool `yaml:"log_add_source"`
|
|
|
|
/* how long (in seconds) a user needs to be in vc in order to generate a
|
|
* UserActive event
|
|
*/
|
|
VoiceActivityThresholdSeconds int `yaml:"voice_activity_threshold_seconds"`
|
|
|
|
/* how long (in milliseconds) a voice activity timer sleeps at a time between
|
|
* context cancellation checks.
|
|
* a higher value means the function sleeps longer which could be
|
|
* useful for some reason in the future
|
|
* a higher value also means that the timer could take longer to cancel.
|
|
* current recommended value is 1000ms.
|
|
*/
|
|
VoiceActivityTimerSleepIntervalMillis int `yaml:"voice_activity_timer_sleep_interval_millis"`
|
|
|
|
/* persistent state file store */
|
|
PersistentCacheStore string `yaml:"persistent_cache_store"`
|
|
|
|
/* number of internal state events to cache in memory */
|
|
InMemoryEventCacheSize int `yaml:"in_memory_event_cache_size"`
|
|
|
|
/* number of days a useractive event is valid for
|
|
* increasing this will have a bell curve effect on
|
|
* voting weights
|
|
*/
|
|
UserEventLifespanDays int `yaml:"user_event_lifespan_days"`
|
|
|
|
/* listen address for local http Server */
|
|
LocalWebEndpointListen string `yaml:"local_web_endpoint_listen"`
|
|
}
|
|
|
|
var config *AppConfig
|
|
var workingDir string
|
|
|
|
func init() {
|
|
setDefaults()
|
|
viper.Unmarshal(&config)
|
|
|
|
ex, err := os.Executable()
|
|
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to get path of executable (self): %v", err))
|
|
}
|
|
|
|
workingDir = filepath.Dir(ex)
|
|
}
|
|
|
|
func Get() *AppConfig {
|
|
return config
|
|
}
|
|
|
|
func GetWorkingDir() string {
|
|
return workingDir
|
|
}
|
|
|
|
func GetDefaultConfig() *AppConfig {
|
|
var config *AppConfig
|
|
setDefaults()
|
|
viper.Unmarshal(&config)
|
|
return config
|
|
}
|
|
|
|
func Init() error {
|
|
setDefaults()
|
|
|
|
// automatically populate config with any matching environment vars
|
|
viper.SetEnvPrefix("BB")
|
|
viper.AutomaticEnv()
|
|
|
|
viper.SetConfigName("config")
|
|
viper.SetConfigType("yaml")
|
|
viper.AddConfigPath(workingDir)
|
|
|
|
err := viper.ReadInConfig()
|
|
if err != nil {
|
|
return fmt.Errorf("error reading configs: %s", err)
|
|
}
|
|
|
|
err = viper.Unmarshal(&config)
|
|
if err != nil {
|
|
return fmt.Errorf("error unmarshaling configs: %s", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func setDefaults() {
|
|
viper.SetDefault("LogFile", "bingobot.log")
|
|
viper.SetDefault("LogDir", "log")
|
|
viper.SetDefault("LogMaxSizeMB", 500)
|
|
viper.SetDefault("LogMaxBackups", 3)
|
|
viper.SetDefault("LogMaxAgeDays", 365)
|
|
viper.SetDefault("LogCompression", false)
|
|
viper.SetDefault("LogAddSource", true)
|
|
viper.SetDefault("VoiceActivityThresholdSeconds", 600)
|
|
viper.SetDefault("VoiceActivityTimerSleepIntervalMillis", 1000)
|
|
viper.SetDefault("PersistentCacheStore", "/tmp/bingobot")
|
|
viper.SetDefault("InMemoryEventCacheSize", 512)
|
|
viper.SetDefault("UserEventLifespanDays", 10)
|
|
viper.SetDefault("LocalWebEndpointListen", ":8080")
|
|
}
|