diff --git a/client/client_mgr.go b/client/client_mgr.go index 08cac960..573ccb9e 100644 --- a/client/client_mgr.go +++ b/client/client_mgr.go @@ -175,7 +175,7 @@ func (cm *Mgr) GetTransactionData(txID string) (*pactus.GetTransactionResponse, return nil, errors.New("unable to get transaction data") } -func (cm *Mgr) Close() { +func (cm *Mgr) Stop() { for addr, c := range cm.clients { if err := c.Close(); err != nil { log.Error("could not close connection to RPC node", "err", err, "RPCAddr", addr) diff --git a/cmd/commands/run.go b/cmd/commands/run.go index 87ba2bc4..11047973 100644 --- a/cmd/commands/run.go +++ b/cmd/commands/run.go @@ -7,6 +7,7 @@ import ( "github.com/kehiy/RoboPac/client" "github.com/kehiy/RoboPac/config" + "github.com/kehiy/RoboPac/discord" "github.com/kehiy/RoboPac/engine" "github.com/kehiy/RoboPac/log" "github.com/kehiy/RoboPac/store" @@ -21,7 +22,7 @@ func RunCommand(parentCmd *cobra.Command) { } parentCmd.AddCommand(run) - run.Run = func(cmd *cobra.Command, args []string) { + run.Run = func(_ *cobra.Command, _ []string) { // load configuration. config, err := config.Load() if err != nil { @@ -72,16 +73,24 @@ func RunCommand(parentCmd *cobra.Command) { // starting botEngine. botEngine, err := engine.NewBotEngine(eSl, cm, wallet, store) if err != nil { - log.Panic("could not start discord bot", "err", err) + log.Panic("could not start bot engine", "err", err) } botEngine.Start() + discordBot, err := discord.NewDiscordBot(botEngine, config.DiscordBotCfg.DiscordToken, + config.DiscordBotCfg.DiscordGuildID) + if err != nil { + log.Panic("could not start discord bot", "err", err) + } + discordBot.Start() + sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM, os.Interrupt) <-sigChan // gracefully shutdown the bot. + discordBot.Stop() + cm.Stop() botEngine.Stop() - cm.Close() } } diff --git a/discord/commands.go b/discord/commands.go new file mode 100644 index 00000000..e514a075 --- /dev/null +++ b/discord/commands.go @@ -0,0 +1,14 @@ +package discord + +import "github.com/bwmarrin/discordgo" + +var commands = []*discordgo.ApplicationCommand{ + { + Name: "help", + Description: "Help command for RoboPac", + }, +} + +var commandHandlers = map[string]func(s *discordgo.Session, i *discordgo.InteractionCreate){ + "help": helpCommandHandler, +} diff --git a/discord/discord.go b/discord/discord.go index 46bdd915..2f21e712 100644 --- a/discord/discord.go +++ b/discord/discord.go @@ -13,7 +13,7 @@ type DiscordBot struct { } func NewDiscordBot(botEngine engine.Engine, token, guildID string) (*DiscordBot, error) { - s, err := discordgo.New(token) + s, err := discordgo.New("Bot " + token) if err != nil { return nil, err } @@ -28,10 +28,25 @@ func NewDiscordBot(botEngine engine.Engine, token, guildID string) (*DiscordBot, func (db *DiscordBot) Start() { log.Info("starting Discord Bot...") + db.Session.AddHandler(func(s *discordgo.Session, i *discordgo.InteractionCreate) { + if h, ok := commandHandlers[i.ApplicationCommandData().Name]; ok { + h(s, i) + } + }) + err := db.Session.Open() if err != nil { log.Panic("can't open discord session", "err", err) } + + registeredCommands := make([]*discordgo.ApplicationCommand, len(commands)) + for i, v := range commands { + cmd, err := db.Session.ApplicationCommandCreate(db.Session.State.User.ID, db.GuildID, v) + if err != nil { + log.Panic("can not register discord command", "name", v.Name, "err", err) + } + registeredCommands[i] = cmd + } } func (db *DiscordBot) Stop() { diff --git a/discord/embeds.go b/discord/embeds.go new file mode 100644 index 00000000..bae27ea3 --- /dev/null +++ b/discord/embeds.go @@ -0,0 +1,16 @@ +package discord + +import "github.com/bwmarrin/discordgo" + +func helpEmbed(s *discordgo.Session) *discordgo.MessageEmbed { + return &discordgo.MessageEmbed{ + Title: "RoboPac Help", + URL: "https://pactus.org", + Author: &discordgo.MessageEmbedAuthor{ + URL: "https://pactus.org", + IconURL: s.State.User.AvatarURL(""), + Name: s.State.User.Username, + }, + Description: "RoboPac is a robot that provides support and information about the Pactus Blockchain.", + } +} diff --git a/discord/handlers.go b/discord/handlers.go new file mode 100644 index 00000000..3ce227e4 --- /dev/null +++ b/discord/handlers.go @@ -0,0 +1,7 @@ +package discord + +import "github.com/bwmarrin/discordgo" + +func helpCommandHandler(s *discordgo.Session, i *discordgo.InteractionCreate) { + s.ChannelMessageSendEmbedReply(i.ChannelID, helpEmbed(s), i.Message.Reference()) +}