discord-pocketbot-go/commands.go

244 lines
7.0 KiB
Go

package main
import (
"context"
"encoding/json"
"github.com/bwmarrin/discordgo"
"github.com/bwmarrin/disgord/x/mux"
"github.com/nishanths/go-xkcd"
"io/ioutil"
"log"
"math/rand"
"net/http"
"os"
"regexp"
"strconv"
"strings"
)
//Check member roles
func checkRole(s *discordgo.Session, m *discordgo.Message, ctx *mux.Context, roleid string) bool {
if ctx.IsPrivate {
return false
}
channel, _ := s.Channel(m.ChannelID)
guild := channel.GuildID
member, _ := s.GuildMember(guild, m.Author.ID)
for _, role := range member.Roles {
if role == roleid {
return true
}
}
return false
}
//Generate a heckin swear word
func getSwear(s *discordgo.Session, m *discordgo.Message, ctx *mux.Context) {
resp := ""
swear, err := http.Get("https://swear.jawa.moe/")
if err != nil {
resp = "Error fetching swear: " + err.Error()
}
defer swear.Body.Close()
if swear.StatusCode == http.StatusOK {
body, err := ioutil.ReadAll(swear.Body)
if err != nil {
resp = "Error fetching swear: " + err.Error()
}
resp = string(body)
}
s.ChannelMessageSend(m.ChannelID, resp)
}
//Post the Maki Monday pic!
func makiMonday(s *discordgo.Session, m *discordgo.Message, ctx *mux.Context) {
resp := "https://maki.jawa.moe/monday.png"
s.ChannelMessageSend(m.ChannelID, resp)
}
//Post link to mixes B)
func postMixes(s *discordgo.Session, m *discordgo.Message, ctx *mux.Context) {
resp := "https://maki.jawa.moe/mixes/"
s.ChannelMessageSend(m.ChannelID, resp)
}
//Post a link to a random mix
func getRandomMix(s *discordgo.Session, m *discordgo.Message, ctx *mux.Context) {
//Define mix details
type Mix struct {
Name string `json:"name"`
Type string `json:"type"`
Mtime string `json:"mtime"`
Size int `json:"size"`
}
mixresp, err := http.Get("https://maki.jawa.moe/mixesjson/")
if err != nil {
resp := "Error fetching mixes: " + err.Error()
s.ChannelMessageSend(m.ChannelID, resp)
return
}
defer mixresp.Body.Close()
if mixresp.StatusCode == http.StatusOK {
var mixes []*Mix
err = json.NewDecoder(mixresp.Body).Decode(&mixes)
rmix := mixes[rand.Intn(len(mixes))]
resp := "https://maki.jawa.moe/mixes/" + rmix.Name
s.ChannelMessageSend(m.ChannelID, resp)
}
}
//Post XKCD comic!
func getXKCD(s *discordgo.Session, m *discordgo.Message, ctx *mux.Context) {
resp := ""
xkclient := xkcd.NewClient()
var err error
var comic xkcd.Comic
var arg string
if len(ctx.Fields) > 1 {
arg = ctx.Fields[1]
} else {
arg = "random"
}
matchedNum, _ := regexp.MatchString(`^[0-9]+$`, arg)
if arg == "latest" {
comic, err = xkclient.Latest(context.Background())
} else if matchedNum {
comicNum, _ := strconv.Atoi(arg)
comic, err = xkclient.Get(context.Background(), comicNum)
} else {
latestcomic, _ := xkclient.Latest(context.Background())
randcomic := rand.Intn(latestcomic.Number)
comic, err = xkclient.Get(context.Background(), randcomic)
}
if err != nil {
resp = err.Error()
}
resp = comic.ImageURL
s.ChannelMessageSend(m.ChannelID, resp)
}
//Restart the bot
func restartBot(s *discordgo.Session, m *discordgo.Message, ctx *mux.Context) {
if !checkRole(s, m, ctx, bot_admin_role) {
resp := "OwO you aren't my daddy..."
s.ChannelMessageSend(m.ChannelID, resp)
return
}
resp := "Goodnight ;-;"
s.ChannelMessageSend(m.ChannelID, resp)
Session.Close()
log.Println("brb dying at the request of ", m.Author.String())
os.Exit(0)
}
//Morgana yells at you to sleep...
func goToSleep(s *discordgo.Session, m *discordgo.Message, ctx *mux.Context) {
embed := &discordgo.MessageEmbed{
Description: "Aren't you tired?\nLet's call it a day\nand get some sleep.",
Thumbnail: &discordgo.MessageEmbedThumbnail{
URL: "https://cdn.discordapp.com/emojis/396429379686629378.png",
},
Title: "Morgana",
}
s.ChannelMessageSendEmbed(m.ChannelID, embed)
}
//Set now playing status
func setNowPlaying(s *discordgo.Session, m *discordgo.Message, ctx *mux.Context) {
if !checkRole(s, m, ctx, bot_admin_role) {
resp := "OwO you aren't my daddy..."
s.ChannelMessageSend(m.ChannelID, resp)
return
}
var resp string
if len(ctx.Fields) > 1 {
arg := strings.Join(ctx.Fields[1:], " ")
s.UpdateStatus(0, arg)
resp = "Now playing: " + arg
f, err := os.Create("userdata/nowplaying.txt")
if err != nil {
log.Println(err)
return
}
_, err = f.WriteString(arg)
if err != nil {
log.Println(err)
f.Close()
return
}
log.Println("Updated Now Playing to", arg, "at the request of", m.Author.String())
err = f.Close()
if err != nil {
log.Println(err)
return
}
} else {
resp = "Please tell me what to play!"
}
s.ChannelMessageSend(m.ChannelID, resp)
}
//Roll any number of dice of the same kind
func diceRoller(dienum, diesides int) (total int, diceroles []string) {
for 0 < dienum {
dienum--
rollresult := rand.Intn(diesides) + 1
total += rollresult
diceroles = append(diceroles, "D"+strconv.Itoa(diesides)+": **"+strconv.Itoa(rollresult)+"**")
}
return
}
//Dice rolling command
func rollDice(s *discordgo.Session, m *discordgo.Message, ctx *mux.Context) {
var resp string
var diceroles []string
var dicetotal int
var matchDicePattern = regexp.MustCompile(`^[0-9]*[Dd][1-9][0-9]*$`)
var args = ctx.Fields[1:]
for i := range args {
if matchDicePattern.MatchString(args[i]) {
dLocation := strings.Index(strings.ToLower(args[i]), "d")
dienum, _ := strconv.Atoi(args[i][:dLocation])
diesides, _ := strconv.Atoi(args[i][dLocation+1:])
if dienum == 0 {
dienum = 1
}
resultsTotal, resultsRolls := diceRoller(dienum, diesides)
if dienum > 25 {
diceroles = append(diceroles, strconv.Itoa(dienum)+"*D"+strconv.Itoa(diesides)+": **"+strconv.Itoa(resultsTotal)+"**")
} else {
diceroles = append(diceroles, resultsRolls...)
}
dicetotal += resultsTotal
}
}
results := strings.Join(diceroles, ", ")
resp = m.Author.Username + " rolled " + results + ", for a total of **" + strconv.Itoa(dicetotal) + "**!"
if dicetotal == 0 {
resp = "Oops, looks like no dice were rolled! Try something like `!roll d20`, `!roll 2d6`, or `!roll 3d6 d20` instead."
}
s.ChannelMessageSend(m.ChannelID, resp)
}
//Ask the Magic Conch shell to predict the future!
func askConch(s *discordgo.Session, m *discordgo.Message, ctx *mux.Context) {
var resp string
if len(ctx.Fields) > 1 {
conchResponses := []string{"It is certain", "It is decidedly so", "Without a doubt", "Yes definitely", "You may rely on it", "As I see it, yes", "Most likely", "Outlook good", "Yes", "Signs point to yes", "Reply hazy try again", "Ask again later", "Better not tell you now", "Cannot predict now", "Concentrate and ask again", "Don't count on it", "My reply is no", "My sources say no", "Outlook not so good", "Very doubtful"}
resp = conchResponses[rand.Intn(len(conchResponses))]
} else {
resp = "The Magic Conch™ may be able to see into the future, but it can't read your mind! Please include a question."
}
s.ChannelMessageSend(m.ChannelID, resp)
}
//Test command that says UwU
func sayUwU(s *discordgo.Session, m *discordgo.Message, ctx *mux.Context) {
s.ChannelMessageSend(m.ChannelID, "UwU *nuzzles <@"+m.Author.ID+">*")
}