214 lines
5.8 KiB
Go
214 lines
5.8 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)
|
|
}
|
|
|
|
//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)
|
|
}
|
|
|
|
//Test command that says UwU
|
|
func sayUwU(s *discordgo.Session, m *discordgo.Message, ctx *mux.Context) {
|
|
s.ChannelMessageSend(m.ChannelID, "UwU *nuzzles*")
|
|
}
|