From 109562df6c2ddf10f753a8144c2ce32eccb8169e Mon Sep 17 00:00:00 2001 From: Michael McCarty Date: Fri, 13 Feb 2026 08:57:44 -0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20Implement=20dynamic=20status=20m?= =?UTF-8?q?essages=20from=20JSON=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 62 +++++++++++++-------------------------- src/ei/status_messages.go | 58 ++++++++++++++++++++++++++++++++++++ src/tasks/tasks.go | 9 ++++++ 3 files changed, 87 insertions(+), 42 deletions(-) create mode 100644 src/ei/status_messages.go diff --git a/main.go b/main.go index d120dd37..8237e0ec 100644 --- a/main.go +++ b/main.go @@ -5,7 +5,6 @@ import ( "flag" "fmt" "log" - "math/rand" _ "net/http/pprof" "os" "os/signal" @@ -21,6 +20,7 @@ import ( "github.com/mkmccarty/TokenTimeBoostBot/src/boost" "github.com/mkmccarty/TokenTimeBoostBot/src/bottools" "github.com/mkmccarty/TokenTimeBoostBot/src/config" + "github.com/mkmccarty/TokenTimeBoostBot/src/ei" "github.com/mkmccarty/TokenTimeBoostBot/src/events" "github.com/mkmccarty/TokenTimeBoostBot/src/farmerstate" "github.com/mkmccarty/TokenTimeBoostBot/src/menno" @@ -32,6 +32,7 @@ import ( ) const configFileName = "./.config.json" +const statusMessagesFileName = "./ttbb-data/status-messages.json" // Admin Slash Command Constants // const boostBotHomeGuild string = "766330702689992720" @@ -137,6 +138,9 @@ func init() { // For the daemon Log fmt.Printf("Starting Discord Bot: %s (%s) at %s\n", version.Release, Version, time.Now().Format(time.RFC3339)) + // Load status messages + ei.LoadStatusMessages(statusMessagesFileName) + // Read application parameters flag.Parse() @@ -1076,12 +1080,16 @@ func main() { } log.Println("event:", event) if event.Has(fsnotify.Write) { - if event.Name == configFileName { + switch event.Name { + case configFileName: log.Println("modified file:", event.Name) err := config.ReadConfig(event.Name) if err != nil { log.Println(err.Error()) } + case statusMessagesFileName: + log.Println("modified file:", event.Name) + ei.LoadStatusMessages(event.Name) } } case err, ok := <-watcher.Errors: @@ -1098,6 +1106,11 @@ func main() { log.Fatal(err) } + err = watcher.Add(statusMessagesFileName) + if err != nil { + log.Printf("Warning: Could not watch status messages file: %v", err) + } + stop := make(chan os.Signal, 1) signal.Notify(stop, os.Interrupt, syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP) log.Println("Press Ctrl+C to exit") @@ -1141,48 +1154,13 @@ func startHeartbeat(filepath string, interval time.Duration) { } counter++ if counter%2 == 1 { - // Funny phrases related to Egg, Inc. - funnyPhrases := []string{ - "Hatching chickens", - "Shipping eggs", - "Upgrading silos", - "Building habs", - "Swiping drones", - "Launching rockets", - "Counting my Golden Eggs", - "Prestiging", - "Counting chickens", - "Running chickens", - "Tapping silos", - "Researching", - "Browsing contracts", - "Boosting production", - "Consuming artifacts", - "Petting chickens", - "Adjusting Shells", - "Waiting on my next TE", - "Calculating optimal boosts", - "Watching my Egg, Inc. empire grow", - "Collecting daily rewards", - "Checking for new contracts", - "Optimizing my farm layout", - "Jiggling artifacts", - "Setting completion alarms", - "Cuddling my chickens", - "Waiting for faster missions", - "Crafting deflectors", - "Organizing contract signups", - "Planning my virtue shift", - "Complaining about token luck", - "Causing confusion & delay", - "Laying eggs", - "Blaming Tbone", - "Just another Tbone alt", + // Get a random status message + activityName, err := ei.GetRandomStatusMessage() + if err != nil { + log.Printf("Error getting status message: %v", err) + activityName = "Egg, Inc." } - // Randomly choose between showing contract count or a funny phrase - activityName := funnyPhrases[rand.Intn(len(funnyPhrases))] - err = s.UpdateStatusComplex(discordgo.UpdateStatusData{ AFK: false, Activities: []*discordgo.Activity{ diff --git a/src/ei/status_messages.go b/src/ei/status_messages.go new file mode 100644 index 00000000..f6645d4a --- /dev/null +++ b/src/ei/status_messages.go @@ -0,0 +1,58 @@ +package ei + +import ( + "encoding/json" + "fmt" + "log" + "math/rand" + "os" + "sync" +) + +// StatusMessagesFile is a struct to hold the status messages +type StatusMessagesFile struct { + StatusMessages []string `json:"status_messages"` +} + +// StatusMessages is a list of status messages +var StatusMessages []string +var statusMessagesMutex sync.RWMutex + +// LoadStatusMessages loads status messages from a JSON file +func LoadStatusMessages(filename string) { + file, err := os.Open(filename) + if err != nil { + log.Printf("Failed to open status messages file: %v", err) + return + } + defer func() { + if err := file.Close(); err != nil { + log.Printf("Failed to close: %v", err) + } + }() + + var messagesLoaded StatusMessagesFile + decoder := json.NewDecoder(file) + if err := decoder.Decode(&messagesLoaded); err != nil { + log.Printf("Failed to decode status messages: %v", err) + return + } + + statusMessagesMutex.Lock() + StatusMessages = messagesLoaded.StatusMessages + statusMessagesMutex.Unlock() + + log.Printf("Loaded %d status messages", len(messagesLoaded.StatusMessages)) +} + +// GetRandomStatusMessage returns a random status message +func GetRandomStatusMessage() (string, error) { + statusMessagesMutex.RLock() + defer statusMessagesMutex.RUnlock() + + if len(StatusMessages) == 0 { + return "", fmt.Errorf("StatusMessages is empty") + } + + return StatusMessages[rand.Intn(len(StatusMessages))], nil +} diff --git a/src/tasks/tasks.go b/src/tasks/tasks.go index d2d2e413..487cc1f9 100644 --- a/src/tasks/tasks.go +++ b/src/tasks/tasks.go @@ -43,6 +43,9 @@ const eggIncEiResearchesFile string = "ttbb-data/ei-researches.json" const eggIncTokenComplaintsURL string = "https://raw.githubusercontent.com/mkmccarty/TokenTimeBoostBot/refs/heads/main/data/token-complaints.json" const eggIncTokenComplaintsFile string = "ttbb-data/token-complaints.json" +const eggIncStatusMessagesURL string = "https://raw.githubusercontent.com/mkmccarty/TokenTimeBoostBot/refs/heads/main/data/status-messages.json" +const eggIncStatusMessagesFile string = "ttbb-data/status-messages.json" + var lastContractUpdate time.Time var lastEventUpdate time.Time @@ -313,6 +316,8 @@ func downloadEggIncData(url string, filename string) bool { ei.LoadResearchData(filename) case eggIncTokenComplaintsFile: ei.LoadTokenComplaints(filename) + case eggIncStatusMessagesFile: + ei.LoadStatusMessages(filename) } /*else if filename == eggIncEiAfxConfigFile { ei.LoadConfig(filename) @@ -357,6 +362,10 @@ func ExecuteCronJob(s *discordgo.Session) { ei.LoadTokenComplaints(eggIncTokenComplaintsFile) } + if !downloadEggIncData(eggIncStatusMessagesURL, eggIncStatusMessagesFile) { + ei.LoadStatusMessages(eggIncStatusMessagesFile) + } + events.GetPeriodicalsFromAPI(s) /*