122 lines
2.9 KiB
Go
122 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
"strings"
|
|
"time"
|
|
"math/rand"
|
|
|
|
"github.com/bwmarrin/discordgo"
|
|
)
|
|
|
|
var (
|
|
auth Auth
|
|
|
|
// cache settings
|
|
cache_location string = "cache/"
|
|
cache_time = 3 * time.Hour // 3 hours
|
|
)
|
|
|
|
func init() {
|
|
// set the randomized seed
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
// build the authentication struct
|
|
build_auth()
|
|
|
|
// attempt to make our cached
|
|
if _, err := os.Stat(cache_location); os.IsNotExist(err) {
|
|
os.Mkdir(cache_location, 0777)
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
// create Discord session
|
|
dg, err := discordgo.New("Bot " + auth.discord)
|
|
if err != nil {
|
|
fmt.Println("Error creating Discord session, ", err)
|
|
return
|
|
}
|
|
|
|
// register the message_create func as a callback for MessageCreate events
|
|
dg.AddHandler(message_create)
|
|
|
|
// open a websocket connection to Discord and begin listening
|
|
err = dg.Open()
|
|
if err != nil {
|
|
fmt.Println("Error opening connection, ", err)
|
|
return
|
|
}
|
|
|
|
// wait here until term signal
|
|
fmt.Println("Bot is now running. Press Ctrl+C to exit.")
|
|
sc := make(chan os.Signal, 1)
|
|
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill)
|
|
<-sc
|
|
|
|
// cleanly close
|
|
dg.Close()
|
|
|
|
}
|
|
|
|
func message_create (s *discordgo.Session, m *discordgo.MessageCreate) {
|
|
// ignore messages from the bot
|
|
if m.Author.ID == s.State.User.ID {
|
|
return
|
|
}
|
|
|
|
// make sure we match our bot's message token
|
|
if len(m.Content) > 2 {
|
|
// get the input token
|
|
input_token := m.Content[0:2]
|
|
|
|
// check if we match our token
|
|
found := false
|
|
|
|
// try to find our token
|
|
if strings.ToLower(string(input_token)) == "b." || strings.ToLower(string(input_token)) == "//" {
|
|
found = true
|
|
}
|
|
|
|
// return if this message isn't for us
|
|
if found == false {
|
|
return
|
|
}
|
|
|
|
} else { // message too short, don't do anything
|
|
return
|
|
}
|
|
|
|
// get our message's content without our bot's token
|
|
content := strings.ToLower(m.Content[2:])
|
|
|
|
// split our message's content into parts based on space
|
|
message := strings.Fields(content)
|
|
|
|
// determine our actions
|
|
if message[0] == "coinflip" || message[0] == "coin" { // flip a coin
|
|
s.ChannelMessageSend(m.ChannelID, coinflip(m.Author.ID, content))
|
|
} else if message[0] == "roll" { // roll a number
|
|
s.ChannelMessageSend(m.ChannelID, roll(m.Author.ID))
|
|
} else if message[0] == "source" { // print source code
|
|
s.ChannelMessageSend(m.ChannelID, source())
|
|
} else if message[0] == "retarded" { // retarded youtube video
|
|
s.ChannelMessageSend(m.ChannelID, "https://youtu.be/kav7tifmyTg")
|
|
} else if message[0] == "moon" { // wsb moon stock ticker copypasta
|
|
s.ChannelMessageSend(m.ChannelID, moon(content)) // print moon text
|
|
} else if len(message[0]) > 0 { // as long as there is a message, try to find a picture
|
|
// get url
|
|
url := <-get_image(message[0])
|
|
|
|
// make sure we have a url returned
|
|
if len(url) > 0 {
|
|
s.ChannelMessageSend(m.ChannelID, url)
|
|
} else {
|
|
s.ChannelMessageSend(m.ChannelID, "I couldn't find that, sauce?")
|
|
}
|
|
}
|
|
}
|