discord-pocketbot-go/commands.go

166 lines
4.2 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)
}
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
} else {
resp = "random"
}
s.ChannelMessageSend(m.ChannelID, resp)
}