all repos — disgord @ 69bc8652d9d19d047e20630cc17f125e5c8a58ba

A simple Discord bot in Go.

main.go (view raw)

  1package main
  2
  3import (
  4	"os"
  5	"os/signal"
  6	"strings"
  7
  8	"github.com/BiRabittoh/disgord/myconfig"
  9	"github.com/bwmarrin/discordgo"
 10)
 11
 12func parseUserMessage(messageContent string) (command string, args []string, ok bool) {
 13	after, found := strings.CutPrefix(messageContent, config.Values.Prefix)
 14	if !found {
 15		return
 16	}
 17
 18	userInput := strings.Split(after, " ")
 19	command = strings.ToLower(userInput[0])
 20	return command, userInput[1:], len(command) > 0
 21}
 22
 23func handleCommand(s *discordgo.Session, m *discordgo.MessageCreate) (response string, ok bool, err error) {
 24	command, args, ok := parseUserMessage(m.Content)
 25	if !ok {
 26		return
 27	}
 28
 29	longCommand, short := shortCommands[command]
 30	if short {
 31		command = longCommand
 32	}
 33
 34	botCommand, found := handlersMap[command]
 35	if !found {
 36		response = "unknown command: " + command
 37		return
 38	}
 39
 40	response = botCommand.Handler(args, s, m)
 41	return
 42}
 43
 44func messageHandler(s *discordgo.Session, m *discordgo.MessageCreate) {
 45	logger.Debug("got a message: " + m.Content)
 46
 47	response, ok, err := handleCommand(s, m)
 48	if err != nil {
 49		logger.Errorf("could not handle command: %s", err)
 50		return
 51	}
 52	if !ok {
 53		return
 54	}
 55	if response == "" {
 56		logger.Debug("got empty response")
 57		return
 58	}
 59
 60	_, err = s.ChannelMessageSend(m.ChannelID, response)
 61	if err != nil {
 62		logger.Errorf("could not send message: %s", err)
 63	}
 64}
 65
 66func readyHandler(s *discordgo.Session, r *discordgo.Ready) {
 67	logger.Infof("Logged in as %s", r.User.String())
 68}
 69
 70func main() {
 71	var err error
 72	config, err = myconfig.New[Config]("config.json")
 73	if err != nil {
 74		logger.Errorf("could not load config: %s", err)
 75	}
 76
 77	session, err := discordgo.New("Bot " + config.Values.Token)
 78	if err != nil {
 79		logger.Fatalf("could not create bot session: %s", err)
 80	}
 81
 82	InitHandlers()
 83
 84	session.AddHandler(messageHandler)
 85	session.AddHandler(readyHandler)
 86
 87	err = session.Open()
 88	if err != nil {
 89		logger.Fatalf("could not open session: %s", err)
 90	}
 91
 92	sigch := make(chan os.Signal, 1)
 93	signal.Notify(sigch, os.Interrupt)
 94	<-sigch
 95
 96	logger.Info("Stopping gracefully...")
 97	err = session.Close()
 98	if err != nil {
 99		logger.Errorf("could not close session: %s", err)
100	}
101}