Refactor: cleanup

- Introduce tracing
- Introduce cobra / viper framework
- Introduce resty client
- Seperate files in api/ and bot/
- Trim unused functions
This commit is contained in:
2025-12-12 23:51:48 +08:00
parent 344176063b
commit cb11672817
15 changed files with 575 additions and 466 deletions

93
main.go
View File

@@ -2,47 +2,76 @@ package main
import (
"fmt"
"log"
"os"
"os/signal"
"strings"
"syscall"
"github.com/Penguin-71630/meme-bot-frontend-dc/bot"
"github.com/Penguin-71630/meme-bot-frontend-dc/config"
"github.com/joho/godotenv"
"github.com/Penguin-71630/meme-bot-frontend-dc/tracing"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"go.uber.org/zap"
)
func main() {
// Load environment variables
if err := godotenv.Load(); err != nil {
log.Println("No .env file found, using system environment variables")
}
var rootCmd = &cobra.Command{
Use: "dcbot",
PersistentPreRun: func(cmd *cobra.Command, args []string) {
viper.AutomaticEnv()
viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
viper.BindPFlags(cmd.PersistentFlags())
viper.BindPFlags(cmd.Flags())
},
Run: func(cmd *cobra.Command, args []string) {
ctx := cmd.Context()
// Load configuration
cfg, err := config.Load()
if err != nil {
log.Fatalf("Failed to load configuration: %v", err)
}
appname := "go2025-dcbot"
tracing.InitTracer(appname)
if viper.GetString("uptrace-dsn") != "" {
tracing.InitUptrace(appname)
defer tracing.DeferUptrace(ctx)
}
// Initialize bot
discordBot, err := bot.New(cfg)
if err != nil {
log.Fatalf("Failed to create bot: %v", err)
}
// Initialize bot
discordBot, err := bot.New()
if err != nil {
tracing.Logger.Ctx(ctx).
Panic("failed to create bot",
zap.Error(err))
panic(err)
}
// Start bot
if err := discordBot.Start(); err != nil {
log.Fatalf("Failed to start bot: %v", err)
}
// Start bot
if err := discordBot.Start(); err != nil {
tracing.Logger.Ctx(ctx).
Panic("failed to start bot",
zap.Error(err))
panic(err)
}
fmt.Println("Bot is now running. Press CTRL-C to exit.")
defer discordBot.Stop()
fmt.Println("Bot is now running. Press CTRL-C to exit.")
// Wait for interrupt signal
sc := make(chan os.Signal, 1)
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
<-sc
// Cleanup
discordBot.Stop()
fmt.Println("Bot stopped gracefully.")
// Wait for interrupt signal
sc := make(chan os.Signal, 1)
signal.Notify(sc,
syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
<-sc
},
}
func init() {
cobra.EnableTraverseRunHooks = true
rootCmd.Flags().
String("discord-bot-token", "", "discord bot token")
rootCmd.Flags().
String("api-endpoint", "http://localhost:8080", "api endpoint")
rootCmd.Flags().
Bool("zap-production", true, "Toggle production log format")
rootCmd.Flags().
String("uptrace-dsn", "", "Uptrace DSN (disabled by default)")
}
func main() {
rootCmd.Execute()
}