79 lines
1.7 KiB
Go
79 lines
1.7 KiB
Go
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)
|
|
|
|
for _, h := range router.Routes {
|
|
session.AddHandler(h.Handler)
|
|
}
|
|
|
|
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
|
|
}
|