package main import ( "bufio" "flag" "fmt" "log" "os" "strings" "time" twitchapi "streambot_twitch/internal/twitchapi" "streambot_twitch/internal/commands" "streambot_twitch/internal/config" ) func main() { // env setup clientID := os.Getenv("TWITCH_CLIENT_ID") clientSecret := os.Getenv("TWITCH_CLIENT_SECRET") streamerChan := os.Getenv("CHANNEL") userToken := os.Getenv("STREAMER_OAUTH") if clientID == "" || clientSecret == "" || streamerChan == "" { log.Fatal("Set TWITCH_CLIENT_ID, TWITCH_CLIENT_SECRET or cHANNEL") } // init config, commands, usage if err := config.Load(); err != nil {log.Fatal(err)} if err := commands.LoadDefaultCommands(); err != nil {log.Fatal(err)} if err := commands.LoadCustomCommands(); err != nil {lof.Fatal(err)} if err := commands.LoadUsage(); err != nil {log.Fatal(err)} // init api client apiClient, err := twitchapi.NewClient(clientID, clientSecret) if err != nil {log.Fatalf("API client: %v", err)} if userToken != "" { apiClient.SetUserAccessToken(userToken) } // CLI flags watch := flag.Bool("watch", false, "refresh stats periodically") interval := flag.Duration("interval", 5*time.Minute, "refresh interval for watch mode") flag.Parse() args := flag.Args() if len(args) == 0 || strings.ToLower(args[0]) == "shell" { repl(apiClient, streamerChan, *watch, *interval) return } dispatch(apiClient, streamerChan, args, *watch, *interval) } // repl interactive prompt func repl(apiClient *twitchapi.Client, streamerChan string, watch bool, interval time.Duration) { reader := bufio.NewReader(os.Stdin) for { fmt.Print("bot:> ") line, err := reader.ReadString('\n') if err != nil { fmt.Println("Error:", err) continue } line = strings.TrimSpace(line) if line == "" { continue } if line == "exit" || line == "quit" { fmt.Println("bye") return } parts := strings.Fields(line) dispatch(apiClient, streamerChan, parts, watch, interval) } } // dispatch handles one command invocation func dispatch(apiClient *twitchapi.Client, streamerChan string, args []string, watch bool, interval time.Duration) { cmd := strings.ToLower(args[0]) switch cmd { case "stats": if watch { printUsage() t := time.NewTicker(interval) for range t.C { printUsage() } } else { printUsage() } case "title": if len(args)<2 { fmt.Println("usage: title get|set "); return } sub := strings.ToLower(args[1]) switch sub { case "get": } } }