2019-08-06 00:49:23 +00:00
package main
import (
2020-04-26 06:56:15 +00:00
"context"
2019-08-07 02:51:53 +00:00
"encoding/json"
2019-08-06 00:49:23 +00:00
"github.com/bwmarrin/discordgo"
"github.com/bwmarrin/disgord/x/mux"
2019-08-06 23:59:18 +00:00
"github.com/nishanths/go-xkcd"
2019-08-06 00:49:23 +00:00
"io/ioutil"
2019-08-07 01:45:09 +00:00
"log"
2019-08-07 02:51:53 +00:00
"math/rand"
2019-08-06 00:49:23 +00:00
"net/http"
2019-08-07 01:45:09 +00:00
"os"
2019-08-06 23:59:18 +00:00
"regexp"
"strconv"
2020-04-26 08:45:16 +00:00
"strings"
2019-08-06 00:49:23 +00:00
)
2019-08-07 01:44:49 +00:00
//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
}
2019-08-06 00:49:23 +00:00
//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 )
}
2019-08-06 01:05:30 +00:00
//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 )
}
2019-08-06 01:10:18 +00:00
//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 )
}
2019-08-06 23:59:18 +00:00
2019-08-07 02:51:53 +00:00
//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 )
}
}
2019-08-06 23:59:18 +00:00
//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"
}
2020-05-01 04:08:14 +00:00
matchedNum , _ := regexp . MatchString ( ` ^[0-9]+$ ` , arg )
2019-08-06 23:59:18 +00:00
if arg == "latest" {
2020-04-26 06:56:15 +00:00
comic , err = xkclient . Latest ( context . Background ( ) )
2019-08-06 23:59:18 +00:00
} else if matchedNum {
comicNum , _ := strconv . Atoi ( arg )
2020-04-26 06:56:15 +00:00
comic , err = xkclient . Get ( context . Background ( ) , comicNum )
2019-08-06 23:59:18 +00:00
} else {
2020-04-26 06:56:15 +00:00
latestcomic , _ := xkclient . Latest ( context . Background ( ) )
randcomic := rand . Intn ( latestcomic . Number )
comic , err = xkclient . Get ( context . Background ( ) , randcomic )
2019-08-06 23:59:18 +00:00
}
if err != nil {
resp = err . Error ( )
}
resp = comic . ImageURL
s . ChannelMessageSend ( m . ChannelID , resp )
}
2019-08-07 01:45:09 +00:00
//Restart the bot
func restartBot ( s * discordgo . Session , m * discordgo . Message , ctx * mux . Context ) {
2020-04-26 06:57:21 +00:00
if ! checkRole ( s , m , ctx , bot_admin_role ) {
2019-08-07 01:45:09 +00:00
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 )
}
2020-04-26 07:19:29 +00:00
//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 )
}
2020-04-26 08:45:16 +00:00
2020-10-10 19:34:17 +00:00
//Set now playing status
2020-04-26 08:45:16 +00:00
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
2020-10-10 19:34:17 +00:00
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
}
2020-04-26 08:45:16 +00:00
} else {
2020-05-21 01:45:30 +00:00
resp = "Please tell me what to play!"
2020-04-26 08:45:16 +00:00
}
s . ChannelMessageSend ( m . ChannelID , resp )
}
2020-05-01 05:46:47 +00:00
//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 )
}
2020-05-01 05:48:09 +00:00
2020-05-21 01:40:22 +00:00
//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 )
}
2020-05-01 05:48:09 +00:00
//Test command that says UwU
func sayUwU ( s * discordgo . Session , m * discordgo . Message , ctx * mux . Context ) {
s . ChannelMessageSend ( m . ChannelID , "UwU *nuzzles*" )
}