Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion pkg/bot/Commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,12 @@ type Commands struct {
}

//MessageCommand Commands triggers by message
type MessageCommand func(b *Bot, s *discordgo.Session, m *discordgo.MessageCreate)
//type MessageCommand func(b *Bot, s *discordgo.Session, m *discordgo.MessageCreate)
type MessageCommand interface {
Check(b *Bot, s *discordgo.Session, m *discordgo.MessageCreate) bool
Action(b *Bot, s *discordgo.Session, m *discordgo.MessageCreate) error
Help() string
}

//ReactionAddCommand Commands triggers by new reaction
type ReactionAddCommand func(b *Bot, s *discordgo.Session, m *discordgo.MessageReactionAdd)
Expand Down
3 changes: 2 additions & 1 deletion pkg/bot/bot.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package bot

import (
"github.com/bwmarrin/discordgo"
"os"

"github.com/bwmarrin/discordgo"

"github.com/QuoteBot/quotebot/pkg/pagination"

"github.com/QuoteBot/quotebot/pkg/datastorage"
Expand Down
97 changes: 76 additions & 21 deletions pkg/bot/command/messageReceivedCommands.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package command

import (
"errors"
"log"
"strings"
"syscall"
Expand All @@ -13,47 +14,67 @@ import (

func messageCommands() map[string]bot.MessageCommand {
return map[string]bot.MessageCommand{
"shutdown": shutdown,
"ping": ping,
"quotebook": quotebook,
"shutdown": &shutdown{},
"ping": &ping{},
"quotebook": &quotebook{},
"help": &help{},
}
}

func shutdown(b *bot.Bot, s *discordgo.Session, m *discordgo.MessageCreate) {
//Shutdown section
type shutdown struct{}

func (sh *shutdown) Action(b *bot.Bot, s *discordgo.Session, m *discordgo.MessageCreate) error {
b.Sc <- syscall.SIGINT
return nil
}

func (sh *shutdown) Check(b *bot.Bot, s *discordgo.Session, m *discordgo.MessageCreate) bool {
for _, id := range b.Conf.OwnersID {
if m.Author.ID == id {
b.Sc <- syscall.SIGINT
return
return true
}
}
message := strings.Builder{}
message.WriteString(m.Author.Mention())
message.WriteString(" you can't do that")
_, err := s.ChannelMessageSend(m.ChannelID, message.String())
if err != nil {
log.Println("error while sending embed", err)
return
}
return false
}

func (sh *shutdown) Help() string {
return "shutdown : if you are a owner of this bot, you can shutdown it"
}

func ping(_ *bot.Bot, s *discordgo.Session, m *discordgo.MessageCreate) {
//Ping section

type ping struct{}

func (ping *ping) Action(_ *bot.Bot, s *discordgo.Session, m *discordgo.MessageCreate) error {
_, err := s.ChannelMessageSend(m.ChannelID, "Pong!")
if err != nil {
log.Println("error while sending embed", err)
return
return err
}
return nil
}

func (ping *ping) Check(_ *bot.Bot, _ *discordgo.Session, _ *discordgo.MessageCreate) bool {
return true
}

func (ping *ping) Help() string {
return "ping : ping the bot, it should respond with pong"
}

func quotebook(b *bot.Bot, s *discordgo.Session, m *discordgo.MessageCreate) {
//quotebook section
type quotebook struct{}

func (qu *quotebook) Action(b *bot.Bot, s *discordgo.Session, m *discordgo.MessageCreate) error {
if len(m.Mentions) < 1 {
//Todo notify user how to use it
return
return errors.New("not enougth arguments")
}
mentionedUser := m.Mentions[0]
quotes, err := b.QuoteStore.GetQuotesFromUser(mentionedUser.ID, m.GuildID)
if err != nil {
log.Println("error while retrieving user quotes", err)
return
return err
}

//transform quotes in state
Expand All @@ -64,12 +85,46 @@ func quotebook(b *bot.Bot, s *discordgo.Session, m *discordgo.MessageCreate) {
message, err := s.ChannelMessageSendEmbed(m.ChannelID, utils.EmbeddedQuotePageFactory(page, s))
if err != nil {
log.Println("error while sending embed", err)
return
return err
}

//register the state into the page manager
b.PageManager.Add(message.ID, state)

//then when it's aviable react to the message
utils.ReactToPage(page, s, m.ChannelID, message.ID, emojiToReact())
return nil
}

func (qu *quotebook) Check(_ *bot.Bot, _ *discordgo.Session, _ *discordgo.MessageCreate) bool {
return true
}

func (qu *quotebook) Help() string {
return "quotebook @user : open the quotebook of the notified user"
}

//help section
type help struct{}

func (h *help) Action(b *bot.Bot, s *discordgo.Session, m *discordgo.MessageCreate) error {
message := strings.Builder{}
for _, v := range messageCommands() {
message.WriteString(v.Help())
message.WriteRune('\n')
message.WriteRune('\n')
}

if _, err := s.ChannelMessageSend(m.ChannelID, message.String()); err != nil {
return err
}
return nil
}

func (h *help) Check(_ *bot.Bot, _ *discordgo.Session, _ *discordgo.MessageCreate) bool {
return true
}

func (h *help) Help() string {
return "help [command]: show help and informations"
}
24 changes: 21 additions & 3 deletions pkg/bot/messageReceivedHandler.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package bot

import (
"log"
"strings"

"github.com/bwmarrin/discordgo"
Expand All @@ -20,9 +21,26 @@ func (b *Bot) MessageReceived(s *discordgo.Session, m *discordgo.MessageCreate)
comm := m.Content[len(prefix):]
comm = strings.ToLower(strings.Split(comm, " ")[0])

for c, f := range b.Commands.MessageCommands {
if c == comm {
f(b, s, m)
if command, ok := b.Commands.MessageCommands[comm]; ok {
//check rights
if command.Check(b, s, m) {
if err := command.Action(b, s, m); err != nil {
println(err.Error())
if _, err := s.ChannelMessageSend(m.ChannelID, command.Help()); err != nil {
println(err.Error())
}
return
}
return
}

//if user do not have the good rights, send a message
message := strings.Builder{}
message.WriteString(m.Author.Mention())
message.WriteString(" you can't do that")
_, err := s.ChannelMessageSend(m.ChannelID, message.String())
if err != nil {
log.Println("error while sending message", err)
return
}
}
Expand Down