Files
streambot_twitch/cmd/cli/main.go
bryce e6e6de0381 Update Readme.md and work on the CLI
Readme.md update - added cli usage section
CLI work continues (not finished)
2025-07-15 11:35:58 +12:00

101 lines
2.4 KiB
Go

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 <value>"); return }
sub := strings.ToLower(args[1])
switch sub {
case "get":
}
}
}