diff --git a/go.mod b/go.mod index 780f48a..80228fb 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,9 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/rs/zerolog v1.31.0 // indirect + github.com/samber/lo v1.39.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect + golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect ) require ( diff --git a/go.sum b/go.sum index cfadd33..9e5f577 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,8 @@ github.com/rogpeppe/clock v0.0.0-20190514195947-2896927a307a/go.mod h1:4r5QyqhjI github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/samber/lo v1.39.0 h1:4gTz1wUhNYLhFSKl6O+8peW0v2F4BCY034GRpU9WnuA= +github.com/samber/lo v1.39.0/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -40,6 +42,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b h1:7mWr3k41Qtv8XlltBkDkl8 golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM= +golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= diff --git a/main.go b/main.go index 296c3b9..7dc1f22 100644 --- a/main.go +++ b/main.go @@ -2,10 +2,13 @@ package main import ( "flag" + "fmt" "net/http" "net/http/cookiejar" "os" "os/signal" + "runtime" + "strings" "github.com/bwmarrin/discordgo" "github.com/joho/godotenv" @@ -49,6 +52,34 @@ func (l logOut) WriteLevel(level zerolog.Level, p []byte) (n int, err error) { func init() { log.Logger = zerolog.New(logOut{}).With().Timestamp().Logger() + discordgo.Logger = func(msgL, caller int, format string, a ...interface{}) { + pc, file, line, _ := runtime.Caller(caller) + + files := strings.Split(file, "/") + file = files[len(files)-1] + + name := runtime.FuncForPC(pc).Name() + fns := strings.Split(name, ".") + name = fns[len(fns)-1] + + msg := fmt.Sprintf(format, a...) + + var event *zerolog.Event + switch msgL { + case 0: + event = log.Debug() + case 1: + event = log.Info() + case 2: + event = log.Warn() + case 3: + event = log.Error() + default: + event = log.Info() + } + + event.Str("file", file).Int("line", line).Str("function", name).Msg(msg) + } } func main() { @@ -58,6 +89,7 @@ func main() { } baseURL = os.Getenv("BANNER_BASE_URL") + // var err error cookies, err = cookiejar.New(nil) if err != nil { @@ -65,34 +97,33 @@ func main() { } client = http.Client{Jar: cookies} - setup(&cookies) + setup() session, err = discordgo.New("Bot " + os.Getenv("BOT_TOKEN")) if err != nil { log.Err(err).Msg("Invalid bot parameters") } + // Open discord session session.AddHandler(func(s *discordgo.Session, r *discordgo.Ready) { - // log.WithFields(log.Fields{ - // "username": r.User.Username, - // "discriminator": r.User.Discriminator, - // "id": r.User.ID, - // "session": s.State.SessionID, - // }).Info("Bot is logged in") - // log. + log.Info().Str("username", r.User.Username).Str("discriminator", r.User.Discriminator).Str("id", r.User.ID).Str("session", s.State.SessionID).Msg("Bot is logged in") }) err = session.Open() if err != nil { log.Fatal().Msgf("Cannot open the session: %v", err) } + // Setup command handlers session.AddHandler(func(internalSession *discordgo.Session, interaction *discordgo.InteractionCreate) { if handler, ok := commandHandlers[interaction.ApplicationCommandData().Name]; ok { handler(internalSession, interaction) + } else { + log.Warn().Msgf("Unknown command '%v'", interaction.ApplicationCommandData().Name) } }) - log.Printf("Adding %d command%s...", len(commandDefinitions), Plural(len(commandDefinitions))) + // Register commands with discord + log.Info().Int("count", len(commandDefinitions)).Msg("Registering commands") registeredCommands := make([]*discordgo.ApplicationCommand, len(commandDefinitions)) for i, v := range commandDefinitions { cmd, err := session.ApplicationCommandCreate(session.State.User.ID, os.Getenv("BOT_TARGET_GUILD"), v) @@ -102,24 +133,26 @@ func main() { registeredCommands[i] = cmd } + // Cloes session, ensure defer session.Close() + defer client.CloseIdleConnections() stop := make(chan os.Signal, 1) signal.Notify(stop, os.Interrupt) - log.Info().Msgf("Press Ctrl+C to exit") + log.Info().Msg("Press Ctrl+C to exit") <-stop if *RemoveCommands { - log.Printf("Removing %d command%s...\n", len(registeredCommands), Plural(len(registeredCommands))) + // log.Info().Array("commandIds", registeredCommands).Msg("Removing commands") - for _, v := range registeredCommands { - err := session.ApplicationCommandDelete(session.State.User.ID, os.Getenv("BOT_TARGET_GUILD"), v.ID) + for _, cmd := range registeredCommands { + err := session.ApplicationCommandDelete(session.State.User.ID, os.Getenv("BOT_TARGET_GUILD"), cmd.ID) if err != nil { - log.Error().Msgf("Cannot delete '%v' command: %v", v.Name, err) + log.Err(err).Str("command", cmd.Name) } } } - log.Info().Msg("Gracefully shutting down.") + log.Info().Msg("Gracefully shutting down") } diff --git a/session.go b/session.go index 01e0503..063e6e0 100644 --- a/session.go +++ b/session.go @@ -1,13 +1,12 @@ package main import ( - "net/http" "net/url" log "github.com/rs/zerolog/log" ) -func setup(cookies *http.CookieJar) { +func setup() { // Makes the initial requests that sets up the session cookies for the rest of the application log.Info().Msg("Setting up session...") @@ -29,7 +28,7 @@ func setup(cookies *http.CookieJar) { log.Fatal().Msgf("Failed to parse baseURL: %s", baseURL) } - current_cookies := cookies.Cookies(baseURL_parsed) + current_cookies := client.Jar.Cookies(baseURL_parsed) required_cookies := map[string]bool{ "JSESSIONID": false, "SSB_COOKIE": false,