package discord import ( "fmt" "log" "os" "os/signal" "ticket-pimp/discord/handler" "ticket-pimp/internal/domain" "ticket-pimp/internal/services" tickets "ticket-pimp/internal/storage/db/tickets" "github.com/bwmarrin/discordgo" ) func initBotWith(token string) (*discordgo.Session, error) { discord, err := discordgo.New("Bot " + token) if err != nil { return nil, err } return discord, nil } type DiscordOptions struct { TicketsRepo *tickets.Queries GitService *services.Git CloudService *services.Cloud Coda *services.Coda AppConfig *domain.Config } func Run(conf domain.Config, opts DiscordOptions) error { token := conf.Discord.Token session, err := initBotWith(token) if err != nil { return err } router := handler.InitRouter(opts.GitService) commandHandlers := map[string]func(s *discordgo.Session, i *discordgo.InteractionCreate){} for _, handler := range router.Routes { commandHandlers[handler.Command.Name] = handler.Handler } session.AddHandler(func(s *discordgo.Session, i *discordgo.InteractionCreate) { if h, ok := commandHandlers[i.ApplicationCommandData().Name]; ok { h(s, i) } }) // for _, h := range router.Routes { // session.AddHandler(h.Handler) // [ ] Как-то я неправильно хэндлеры добавляю, на проджект отрабатывает /repo // } if err := session.Open(); err != nil { return fmt.Errorf("cannot open the session: %v", err) } log.Println("Adding commands...") var cmds []*discordgo.ApplicationCommand for _, h := range router.Routes { cmd, err := session.ApplicationCommandCreate(session.State.User.ID, "", &h.Command) if err != nil { log.Panicf("Cannot create '%v' command: %v", h.Command.Name, err) } cmds = append(cmds, cmd) } log.Println("Following commands added:") log.Println(cmds) defer session.Close() stop := make(chan os.Signal, 1) signal.Notify(stop, os.Interrupt) <-stop log.Println("Graceful shutdown") log.Println("Removing commands...") for _, h := range cmds { err = session.ApplicationCommandDelete(session.State.User.ID, "", h.ID) if err != nil { log.Panicf("Cannot delete '%v' command: %v", h.Name, err) } } return nil }