package main import ( "context" "flag" "fmt" "homestead/homestead_to_go/relay" "homestead/homestead_to_go/relay/commands" "log/slog" "os" "os/signal" "syscall" "time" "github.com/disgoorg/disgo/bot" "github.com/disgoorg/disgo/handler" ) func main() { path := flag.String("config", "config.toml", "path to config") flag.Parse() cfg, err := relay.LoadConfig(*path) if err != nil { slog.Error("Failed to read config", slog.Any("err", err)) os.Exit(-1) } fmt.Printf("%v\n", cfg) setupLogger(cfg.Log) slog.Info(fmt.Sprintf("Starting %s...", cfg.Bot.Name)) b := relay.New(*cfg) h := handler.New() h.Command("/ping", commands.PingHandler) h.Command("/sync", commands.SyncHandler) if err = b.SetupBot(h, bot.NewListenerFunc(b.OnReady)); err != nil { slog.Error("Failed to setup bot", slog.Any("err", err)) os.Exit(-1) } defer func() { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() b.Client.Close(ctx) }() if err = handler.SyncCommands(b.Client, commands.Commands, cfg.Bot.DevGuilds); err != nil { slog.Error("Failed to sync commands", slog.Any("err", err)) } ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err = b.Client.OpenGateway(ctx); err != nil { slog.Error("Failed to open gateway", slog.Any("err", err)) os.Exit(-1) } slog.Info("Bot is running. Press CTRL-C to exit.") s := make(chan os.Signal, 1) signal.Notify(s, syscall.SIGINT, syscall.SIGTERM) <-s slog.Info("Shutting down bot...") } func setupLogger(cfg relay.LogConfig) { opts := &slog.HandlerOptions{ AddSource: cfg.AddSource, Level: cfg.Level, } var sHandler slog.Handler switch cfg.Format { case "json": sHandler = slog.NewJSONHandler(os.Stdout, opts) case "text": sHandler = slog.NewTextHandler(os.Stdout, opts) default: slog.Error("Unknown log format", slog.String("format", cfg.Format)) os.Exit(-1) } slog.SetDefault(slog.New(sHandler)) } // $ git config user.name // $ git config user.email // $ go mod tidy; go mod download