2021-05-29 12:17:01 +00:00
|
|
|
|
package commands
|
2020-04-11 14:16:09 +00:00
|
|
|
|
|
|
|
|
|
import (
|
2020-05-25 21:58:38 +00:00
|
|
|
|
"encoding/json"
|
2020-04-11 14:16:09 +00:00
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
2020-05-25 21:58:38 +00:00
|
|
|
|
"io/ioutil"
|
2022-08-16 12:32:53 +00:00
|
|
|
|
"net/url"
|
2020-05-25 21:58:38 +00:00
|
|
|
|
"os"
|
|
|
|
|
"reflect"
|
2021-05-28 18:46:05 +00:00
|
|
|
|
"sort"
|
2020-04-11 14:16:09 +00:00
|
|
|
|
"strconv"
|
|
|
|
|
"strings"
|
|
|
|
|
"time"
|
2021-05-28 18:46:05 +00:00
|
|
|
|
|
|
|
|
|
"github.com/bwmarrin/discordgo"
|
|
|
|
|
"github.com/foxtrot/scuzzy/models"
|
2020-04-11 14:16:09 +00:00
|
|
|
|
)
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleSetConfig(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
2020-05-25 21:58:38 +00:00
|
|
|
|
configArgs := strings.Split(m.Content, " ")
|
|
|
|
|
|
|
|
|
|
if len(configArgs) != 3 {
|
2021-05-29 12:17:01 +00:00
|
|
|
|
return errors.New("Invalid arguments supplied. Usage: " + c.Config.CommandKey + "setconfig <key> <value>")
|
2020-05-25 21:58:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
configKey := configArgs[1]
|
|
|
|
|
configVal := configArgs[2]
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
rt := reflect.TypeOf(c.Config)
|
2020-05-25 21:58:38 +00:00
|
|
|
|
for i := 0; i < rt.NumField(); i++ {
|
|
|
|
|
x := rt.Field(i)
|
|
|
|
|
tagVal := strings.Split(x.Tag.Get("json"), ",")[0]
|
|
|
|
|
tagName := x.Name
|
|
|
|
|
|
|
|
|
|
if tagVal == configKey {
|
2021-05-29 12:17:01 +00:00
|
|
|
|
prop := reflect.ValueOf(&c.Config).Elem().FieldByName(tagName)
|
2020-05-25 21:58:38 +00:00
|
|
|
|
|
|
|
|
|
switch prop.Interface().(type) {
|
|
|
|
|
case string:
|
|
|
|
|
prop.SetString(configVal)
|
|
|
|
|
break
|
|
|
|
|
case int:
|
|
|
|
|
intVal, err := strconv.ParseInt(configVal, 10, 64)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
prop.SetInt(intVal)
|
|
|
|
|
break
|
|
|
|
|
case float64:
|
|
|
|
|
floatVal, err := strconv.ParseFloat(configVal, 64)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
prop.SetFloat(floatVal)
|
|
|
|
|
break
|
|
|
|
|
case bool:
|
|
|
|
|
boolVal, err := strconv.ParseBool(configVal)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
prop.SetBool(boolVal)
|
|
|
|
|
break
|
|
|
|
|
default:
|
|
|
|
|
return errors.New("Unsupported key value type")
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
msgE := c.CreateDefinedEmbed("Set Configuration", "Successfully set property '"+configKey+"'!", "success", m.Author)
|
2020-05-25 21:58:38 +00:00
|
|
|
|
_, err := s.ChannelMessageSendEmbed(m.ChannelID, msgE)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return errors.New("Unknown key specified")
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleGetConfig(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
2020-05-25 21:58:38 +00:00
|
|
|
|
//TODO: Handle printing of slices (check the Type, loop accordingly)
|
|
|
|
|
|
|
|
|
|
configArgs := strings.Split(m.Content, " ")
|
|
|
|
|
configKey := "all"
|
|
|
|
|
if len(configArgs) == 2 {
|
|
|
|
|
configKey = configArgs[1]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
msg := ""
|
|
|
|
|
|
2021-10-15 15:31:13 +00:00
|
|
|
|
rt := reflect.TypeOf(*c.Config)
|
2020-05-25 21:58:38 +00:00
|
|
|
|
for i := 0; i < rt.NumField(); i++ {
|
|
|
|
|
x := rt.Field(i)
|
|
|
|
|
tagVal := strings.Split(x.Tag.Get("json"), ",")[0]
|
|
|
|
|
tagName := x.Name
|
2021-10-15 15:31:13 +00:00
|
|
|
|
prop := reflect.ValueOf(c.Config).Elem().FieldByName(tagName)
|
2020-05-25 21:58:38 +00:00
|
|
|
|
|
|
|
|
|
if configKey == "all" {
|
|
|
|
|
switch prop.Interface().(type) {
|
|
|
|
|
case string:
|
|
|
|
|
if len(prop.String()) > 256 {
|
|
|
|
|
// Truncate large values.
|
|
|
|
|
msg += "`" + tagName + "` - " + "Truncated...\n"
|
|
|
|
|
} else {
|
|
|
|
|
msg += "`" + tagName + "` - `" + prop.String() + "`\n"
|
|
|
|
|
}
|
|
|
|
|
break
|
|
|
|
|
default:
|
|
|
|
|
// Ignore non strings for now...
|
|
|
|
|
msg += "`" + tagName + "` - Skipped Value\n"
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if tagVal == configKey {
|
|
|
|
|
switch prop.Interface().(type) {
|
|
|
|
|
case string:
|
|
|
|
|
msg += "`" + tagName + "` - `" + prop.String() + "`\n"
|
|
|
|
|
default:
|
|
|
|
|
// Ignore non strings for now...
|
|
|
|
|
msg += "`" + tagName + "` - Skipped Value\n"
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
eMsg := c.CreateDefinedEmbed("Get Configuration", msg, "success", m.Author)
|
2020-05-25 21:58:38 +00:00
|
|
|
|
_, err := s.ChannelMessageSendEmbed(m.ChannelID, eMsg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if msg == "" {
|
|
|
|
|
return errors.New("Unknown key specified")
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
eMsg := c.CreateDefinedEmbed("Get Configuration", msg, "success", m.Author)
|
2020-05-25 21:58:38 +00:00
|
|
|
|
_, err := s.ChannelMessageSendEmbed(m.ChannelID, eMsg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleReloadConfig(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
|
|
|
|
fBuf, err := ioutil.ReadFile(c.Config.ConfigPath)
|
2020-05-25 21:58:38 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-22 05:35:15 +00:00
|
|
|
|
conf := &models.Configuration{}
|
|
|
|
|
|
|
|
|
|
err = json.Unmarshal(fBuf, &conf)
|
2020-05-25 21:58:38 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
c.Config = conf
|
|
|
|
|
c.Permissions.Config = conf
|
2020-06-22 05:35:15 +00:00
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
eMsg := c.CreateDefinedEmbed("Reload Configuration", "Successfully reloaded configuration from disk", "success", m.Author)
|
2020-05-25 21:58:38 +00:00
|
|
|
|
_, err = s.ChannelMessageSendEmbed(m.ChannelID, eMsg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleSaveConfig(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
|
|
|
|
j, err := json.Marshal(c.Config)
|
2020-05-25 21:58:38 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
err = ioutil.WriteFile(c.Config.ConfigPath, j, os.ModePerm)
|
2020-05-25 21:58:38 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
eMsg := c.CreateDefinedEmbed("Save Configuration", "Saved runtime configuration successfully", "success", m.Author)
|
2020-05-25 21:58:38 +00:00
|
|
|
|
_, err = s.ChannelMessageSendEmbed(m.ChannelID, eMsg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleCat(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
2020-04-26 20:05:39 +00:00
|
|
|
|
_, err := s.ChannelMessageSend(m.ChannelID, "https://giphy.com/gifs/cat-cute-no-rCxogJBzaeZuU")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = s.ChannelMessageDelete(m.ChannelID, m.ID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
2020-04-11 14:16:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handlePing(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
2020-04-11 14:16:09 +00:00
|
|
|
|
var r *discordgo.Message
|
|
|
|
|
var err error
|
|
|
|
|
|
2021-06-01 00:47:27 +00:00
|
|
|
|
msg := c.CreateDefinedEmbed("Ping", "Pong", "success", m.Author)
|
|
|
|
|
r, err = s.ChannelMessageSendEmbed(m.ChannelID, msg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
2020-04-11 14:16:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
time.Sleep(5 * time.Second)
|
|
|
|
|
|
|
|
|
|
err = s.ChannelMessageDelete(m.ChannelID, r.ID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
err = s.ChannelMessageDelete(m.ChannelID, m.ID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleInfo(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
2020-04-11 14:16:09 +00:00
|
|
|
|
desc := "**Source**: https://github.com/foxtrot/scuzzy\n"
|
|
|
|
|
desc += "**Language**: Go\n"
|
2021-05-29 12:17:01 +00:00
|
|
|
|
desc += "**Commands**: See `" + c.Config.CommandKey + "help`\n\n\n"
|
2020-04-11 14:16:09 +00:00
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
gm, err := s.GuildMember(c.Config.GuildID, s.State.User.ID)
|
2020-04-11 14:16:09 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
d := models.CustomEmbed{
|
|
|
|
|
Title: "Scuzzy Information",
|
|
|
|
|
Desc: desc,
|
|
|
|
|
ImageURL: "",
|
|
|
|
|
ImageH: 100,
|
|
|
|
|
ImageW: 100,
|
|
|
|
|
Color: 0xFFA500,
|
|
|
|
|
URL: "",
|
|
|
|
|
Type: "",
|
|
|
|
|
Timestamp: "",
|
|
|
|
|
FooterText: "Made with ❤ by Foxtrot",
|
2021-01-08 22:30:18 +00:00
|
|
|
|
FooterImageURL: "https://cdn.discordapp.com/avatars/514163441548656641/a_ac5e022e77e62e7793711ebde8cdf4a1.gif",
|
2020-04-11 14:16:09 +00:00
|
|
|
|
ThumbnailURL: gm.User.AvatarURL(""),
|
|
|
|
|
ThumbnailH: 150,
|
|
|
|
|
ThumbnailW: 150,
|
|
|
|
|
ProviderURL: "",
|
|
|
|
|
ProviderText: "",
|
|
|
|
|
AuthorText: "",
|
|
|
|
|
AuthorURL: "",
|
|
|
|
|
AuthorImageURL: "",
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
msg := c.CreateCustomEmbed(&d)
|
2020-04-11 14:16:09 +00:00
|
|
|
|
|
|
|
|
|
_, err = s.ChannelMessageSendEmbed(m.ChannelID, msg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleHelp(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
|
|
|
|
keys := make([]int, 0, len(c.ScuzzyCommands))
|
|
|
|
|
for _, cmd := range c.ScuzzyCommands {
|
2021-05-28 18:46:05 +00:00
|
|
|
|
keys = append(keys, cmd.Index)
|
|
|
|
|
}
|
|
|
|
|
sort.Ints(keys)
|
|
|
|
|
|
|
|
|
|
for _, k := range keys {
|
2021-05-29 12:17:01 +00:00
|
|
|
|
fmt.Println(k, c.ScuzzyCommandsByIndex[k])
|
2021-05-28 18:46:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-04-11 14:16:09 +00:00
|
|
|
|
desc := "**Available Commands**\n"
|
2021-05-28 18:46:05 +00:00
|
|
|
|
for _, k := range keys {
|
2021-05-29 12:17:01 +00:00
|
|
|
|
command := c.ScuzzyCommandsByIndex[k]
|
2021-05-28 18:46:05 +00:00
|
|
|
|
|
2021-05-28 17:14:06 +00:00
|
|
|
|
if !command.AdminOnly && command.Description != "" {
|
|
|
|
|
desc += "`" + command.Name + "` - " + command.Description + "\n"
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-04-11 14:16:09 +00:00
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
if c.Permissions.CheckAdminRole(m.Member) {
|
2020-04-11 14:16:09 +00:00
|
|
|
|
desc += "\n"
|
|
|
|
|
desc += "**Admin Commands**\n"
|
2021-05-28 18:46:05 +00:00
|
|
|
|
for _, k := range keys {
|
2021-05-29 12:17:01 +00:00
|
|
|
|
command := c.ScuzzyCommandsByIndex[k]
|
2021-05-28 18:46:05 +00:00
|
|
|
|
|
2021-05-28 17:14:06 +00:00
|
|
|
|
if command.AdminOnly {
|
|
|
|
|
desc += "`" + command.Name + "` - " + command.Description + "\n"
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-04-11 14:16:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
desc += "\n\nAll commands are prefixed with `" + c.Config.CommandKey + "`\n"
|
2020-04-11 14:16:09 +00:00
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
msg := c.CreateDefinedEmbed("Help", desc, "", m.Author)
|
2020-04-11 14:16:09 +00:00
|
|
|
|
|
|
|
|
|
_, err := s.ChannelMessageSendEmbed(m.ChannelID, msg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
err = s.ChannelMessageDelete(m.ChannelID, m.ID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleRules(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
|
|
|
|
msg := c.Config.RulesText
|
|
|
|
|
embedTitle := "Rules (" + c.Config.GuildName + ")"
|
|
|
|
|
embed := c.CreateDefinedEmbed(embedTitle, msg, "success", m.Author)
|
2020-05-09 11:56:58 +00:00
|
|
|
|
|
|
|
|
|
_, err := s.ChannelMessageSendEmbed(m.ChannelID, embed)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleMarkdownInfo(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
2020-05-08 05:29:08 +00:00
|
|
|
|
cleanup := true
|
|
|
|
|
args := strings.Split(m.Content, " ")
|
|
|
|
|
|
|
|
|
|
if len(args) == 2 {
|
2021-05-29 12:17:01 +00:00
|
|
|
|
if args[1] == "stay" && c.Permissions.CheckAdminRole(m.Member) {
|
2020-05-08 05:29:08 +00:00
|
|
|
|
cleanup = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-11 14:16:09 +00:00
|
|
|
|
desc := "*Italic* text goes between `*single asterisks*`\n"
|
|
|
|
|
desc += "**Bold** text goes between `**double asterisks**`\n"
|
|
|
|
|
desc += "***Bold and Italic*** text goes between `***triple asterisks***`\n"
|
|
|
|
|
desc += "__Underlined__ text goes between `__double underscore__`\n"
|
|
|
|
|
desc += "~~Strikethrough~~ text goes between `~~double tilde~~`\n"
|
|
|
|
|
desc += "||Spoilers|| go between `|| double pipe ||`\n\n"
|
|
|
|
|
desc += "You can combine the above styles.\n\n"
|
|
|
|
|
desc += "Inline Code Blocks start and end with a single `````\n"
|
|
|
|
|
desc += "Multi line Code Blocks start and end with ```````\n"
|
|
|
|
|
desc += "Multi line Code Blocks can also specify a language with `````language`` at the start\n\n"
|
|
|
|
|
desc += "Single line quotes start with `>`\n"
|
|
|
|
|
desc += "Multi line quotes start with `>>>`\n"
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
msg := c.CreateDefinedEmbed("Discord Markdown", desc, "", m.Author)
|
2020-04-11 14:16:09 +00:00
|
|
|
|
r, err := s.ChannelMessageSendEmbed(m.ChannelID, msg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-08 05:29:08 +00:00
|
|
|
|
if cleanup {
|
|
|
|
|
time.Sleep(15 * time.Second)
|
2020-04-11 14:16:09 +00:00
|
|
|
|
|
2020-05-08 05:29:08 +00:00
|
|
|
|
err = s.ChannelMessageDelete(m.ChannelID, r.ID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
err = s.ChannelMessageDelete(m.ChannelID, m.ID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2020-04-11 14:16:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleCtoF(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
2020-04-11 14:16:09 +00:00
|
|
|
|
inS := strings.Split(m.Content, " ")
|
|
|
|
|
|
|
|
|
|
if len(inS) < 2 {
|
|
|
|
|
return errors.New("You did not specify a temperature")
|
|
|
|
|
}
|
|
|
|
|
in := inS[1]
|
|
|
|
|
|
|
|
|
|
inF, err := strconv.ParseFloat(in, 2)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return errors.New("You did not specify a valid number")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cels := (inF * 9.0 / 5.0) + 32.0
|
|
|
|
|
celsF := float64(cels)
|
|
|
|
|
|
|
|
|
|
msg := fmt.Sprintf("`%.1f°c` is `%.1f°f`", inF, celsF)
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
e := c.CreateDefinedEmbed("Celsius to Farenheit", msg, "", m.Author)
|
2020-04-11 14:16:09 +00:00
|
|
|
|
_, err = s.ChannelMessageSendEmbed(m.ChannelID, e)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleFtoC(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
2020-04-11 14:16:09 +00:00
|
|
|
|
inS := strings.Split(m.Content, " ")
|
|
|
|
|
|
|
|
|
|
if len(inS) < 2 {
|
|
|
|
|
return errors.New("You did not specify a temperature")
|
|
|
|
|
}
|
|
|
|
|
in := inS[1]
|
|
|
|
|
|
|
|
|
|
inF, err := strconv.ParseFloat(in, 2)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return errors.New("You did not specify a valid number")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
faren := (inF - 32) * 5 / 9
|
|
|
|
|
farenF := float64(faren)
|
|
|
|
|
|
|
|
|
|
msg := fmt.Sprintf("`%.1f°f` is `%.1f°c`", inF, farenF)
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
e := c.CreateDefinedEmbed("Farenheit to Celsius", msg, "", m.Author)
|
2020-04-11 14:16:09 +00:00
|
|
|
|
_, err = s.ChannelMessageSendEmbed(m.ChannelID, e)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2020-04-22 20:48:12 +00:00
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleMetersToFeet(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
2020-04-22 20:48:12 +00:00
|
|
|
|
inS := strings.Split(m.Content, " ")
|
|
|
|
|
|
|
|
|
|
if len(inS) < 2 {
|
|
|
|
|
return errors.New("You did not specify a distance")
|
|
|
|
|
}
|
|
|
|
|
in := inS[1]
|
|
|
|
|
|
|
|
|
|
inF, err := strconv.ParseFloat(in, 2)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return errors.New("You did not specify a valid number")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
meters := inF * 3.28
|
|
|
|
|
metersF := float64(meters)
|
|
|
|
|
|
|
|
|
|
msg := fmt.Sprintf("`%.1fm` is `%.1fft`", inF, metersF)
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
e := c.CreateDefinedEmbed("Meters to Feet", msg, "", m.Author)
|
2020-04-22 20:48:12 +00:00
|
|
|
|
_, err = s.ChannelMessageSendEmbed(m.ChannelID, e)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleFeetToMeters(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
2020-04-22 20:48:12 +00:00
|
|
|
|
inS := strings.Split(m.Content, " ")
|
|
|
|
|
|
|
|
|
|
if len(inS) < 2 {
|
|
|
|
|
return errors.New("You did not specify a distance")
|
|
|
|
|
}
|
|
|
|
|
in := inS[1]
|
|
|
|
|
|
|
|
|
|
inF, err := strconv.ParseFloat(in, 2)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return errors.New("You did not specify a valid number")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
feet := inF / 3.28
|
|
|
|
|
feetF := float64(feet)
|
|
|
|
|
|
|
|
|
|
msg := fmt.Sprintf("`%.1fft` is `%.1fm`", inF, feetF)
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
e := c.CreateDefinedEmbed("Feet to Meters", msg, "", m.Author)
|
2020-04-22 20:48:12 +00:00
|
|
|
|
_, err = s.ChannelMessageSendEmbed(m.ChannelID, e)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2020-04-22 20:55:28 +00:00
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleCentimeterToInch(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
2020-04-22 20:55:28 +00:00
|
|
|
|
inS := strings.Split(m.Content, " ")
|
|
|
|
|
|
|
|
|
|
if len(inS) < 2 {
|
|
|
|
|
return errors.New("You did not specify a distance")
|
|
|
|
|
}
|
|
|
|
|
in := inS[1]
|
|
|
|
|
|
|
|
|
|
inF, err := strconv.ParseFloat(in, 2)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return errors.New("You did not specify a valid number")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inch := inF / 2.54
|
|
|
|
|
inchF := float64(inch)
|
|
|
|
|
|
|
|
|
|
msg := fmt.Sprintf("`%.1fcm` is `%.1fin`", inF, inchF)
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
e := c.CreateDefinedEmbed("Centimeter To Inch", msg, "", m.Author)
|
2020-04-22 20:55:28 +00:00
|
|
|
|
_, err = s.ChannelMessageSendEmbed(m.ChannelID, e)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleInchToCentimeter(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
2020-04-22 20:55:28 +00:00
|
|
|
|
inS := strings.Split(m.Content, " ")
|
|
|
|
|
|
|
|
|
|
if len(inS) < 2 {
|
|
|
|
|
return errors.New("You did not specify a distance")
|
|
|
|
|
}
|
|
|
|
|
in := inS[1]
|
|
|
|
|
|
|
|
|
|
inF, err := strconv.ParseFloat(in, 2)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return errors.New("You did not specify a valid number")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cm := inF * 2.54
|
|
|
|
|
cmF := float64(cm)
|
|
|
|
|
|
|
|
|
|
msg := fmt.Sprintf("`%.1fin` is `%.1fcm`", inF, cmF)
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
e := c.CreateDefinedEmbed("Inch to Centimeter", msg, "", m.Author)
|
2020-04-22 20:55:28 +00:00
|
|
|
|
_, err = s.ChannelMessageSendEmbed(m.ChannelID, e)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2020-04-24 16:18:17 +00:00
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleUserInfo(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
2020-04-24 16:18:17 +00:00
|
|
|
|
var (
|
2020-05-04 20:57:19 +00:00
|
|
|
|
mHandle *discordgo.Member
|
|
|
|
|
requester *discordgo.Member
|
|
|
|
|
err error
|
2020-04-24 16:18:17 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
userSplit := strings.Split(m.Content, " ")
|
|
|
|
|
|
|
|
|
|
if len(userSplit) < 2 {
|
2021-05-29 12:17:01 +00:00
|
|
|
|
mHandle, err = s.GuildMember(c.Config.GuildID, m.Author.ID)
|
2020-05-04 20:57:19 +00:00
|
|
|
|
requester = mHandle
|
2020-04-24 16:18:17 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2020-07-19 01:19:17 +00:00
|
|
|
|
idStr := strings.ReplaceAll(userSplit[1], "<@!", "")
|
|
|
|
|
idStr = strings.ReplaceAll(idStr, "<@", "")
|
|
|
|
|
idStr = strings.ReplaceAll(idStr, ">", "")
|
2021-05-29 12:17:01 +00:00
|
|
|
|
mHandle, err = s.GuildMember(c.Config.GuildID, idStr)
|
2020-04-24 16:18:17 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2021-05-29 12:17:01 +00:00
|
|
|
|
requester, err = s.GuildMember(c.Config.GuildID, m.Author.ID)
|
2020-05-04 20:57:19 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2020-04-24 16:18:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rUserID := mHandle.User.ID
|
|
|
|
|
rUserNick := mHandle.Nick
|
|
|
|
|
rUsername := mHandle.User.Username
|
|
|
|
|
rUserDiscrim := mHandle.User.Discriminator
|
|
|
|
|
rUserAvatar := mHandle.User.AvatarURL("4096")
|
|
|
|
|
rJoinTime := mHandle.JoinedAt
|
|
|
|
|
rRoles := mHandle.Roles
|
|
|
|
|
|
|
|
|
|
if len(rUserNick) == 0 {
|
|
|
|
|
rUserNick = "No Nickname"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rJoinTimeP, err := rJoinTime.Parse()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rRolesTidy := ""
|
|
|
|
|
if len(rRoles) == 0 {
|
|
|
|
|
rRolesTidy = "No Roles"
|
|
|
|
|
} else {
|
|
|
|
|
for _, role := range rRoles {
|
|
|
|
|
rRolesTidy += "<@&" + role + "> "
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-04 20:57:19 +00:00
|
|
|
|
msg := "**User ID**: `" + rUserID + "`\n"
|
|
|
|
|
msg += "**User Name**: `" + rUsername + "`\n"
|
|
|
|
|
msg += "**User Nick**: `" + rUserNick + "`\n"
|
|
|
|
|
msg += "**User Discrim**: `#" + rUserDiscrim + "`\n"
|
|
|
|
|
msg += "**User Join**: `" + rJoinTimeP.String() + "`\n"
|
|
|
|
|
msg += "**User Roles**: " + rRolesTidy + "\n"
|
2020-04-24 16:18:17 +00:00
|
|
|
|
|
|
|
|
|
embedData := models.CustomEmbed{
|
|
|
|
|
URL: "",
|
|
|
|
|
Title: "User Info (" + rUsername + ")",
|
|
|
|
|
Desc: msg,
|
|
|
|
|
Type: "",
|
2020-05-04 20:57:19 +00:00
|
|
|
|
Timestamp: time.Now().Format(time.RFC3339),
|
2020-04-24 16:18:17 +00:00
|
|
|
|
Color: 0xFFA500,
|
2021-01-08 22:30:18 +00:00
|
|
|
|
FooterText: "Requested by " + requester.User.Username + "#" + requester.User.Discriminator,
|
|
|
|
|
FooterImageURL: "",
|
2020-04-24 16:18:17 +00:00
|
|
|
|
ImageURL: "",
|
|
|
|
|
ImageH: 0,
|
|
|
|
|
ImageW: 0,
|
|
|
|
|
ThumbnailURL: rUserAvatar,
|
|
|
|
|
ThumbnailH: 512,
|
|
|
|
|
ThumbnailW: 512,
|
|
|
|
|
ProviderURL: "",
|
|
|
|
|
ProviderText: "",
|
|
|
|
|
AuthorText: "",
|
|
|
|
|
AuthorURL: "",
|
|
|
|
|
AuthorImageURL: "",
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
embed := c.CreateCustomEmbed(&embedData)
|
2020-04-24 16:18:17 +00:00
|
|
|
|
_, err = s.ChannelMessageSendEmbed(m.ChannelID, embed)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2020-05-04 20:50:17 +00:00
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
func (c *Commands) handleServerInfo(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
|
|
|
|
g, err := s.Guild(c.Config.GuildID)
|
2020-12-29 07:57:33 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
sID := c.Config.GuildID
|
|
|
|
|
sName := c.Config.GuildName
|
2020-12-29 07:57:33 +00:00
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
chans, _ := s.GuildChannels(c.Config.GuildID)
|
2020-12-29 07:57:33 +00:00
|
|
|
|
sChannels := strconv.Itoa(len(chans))
|
|
|
|
|
sEmojis := strconv.Itoa(len(g.Emojis))
|
|
|
|
|
sRoles := strconv.Itoa(len(g.Roles))
|
|
|
|
|
sRegion := g.Region
|
2020-12-29 21:41:18 +00:00
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
iID, _ := strconv.Atoi(c.Config.GuildID)
|
2020-12-29 21:41:18 +00:00
|
|
|
|
createdMSecs := ((iID / 4194304) + 1420070400000) / 1000
|
|
|
|
|
sCreatedAt := time.Unix(int64(createdMSecs), 0).Format(time.RFC1123)
|
|
|
|
|
|
2020-12-29 07:57:33 +00:00
|
|
|
|
sIconURL := g.IconURL()
|
2020-05-04 20:50:17 +00:00
|
|
|
|
|
|
|
|
|
user := m.Author
|
|
|
|
|
|
|
|
|
|
desc := "**Server ID**: `" + sID + "`\n"
|
|
|
|
|
desc += "**Server Name**: `" + sName + "`\n"
|
|
|
|
|
desc += "**Server Channels**: `" + sChannels + "`\n"
|
|
|
|
|
desc += "**Server Emojis**: `" + sEmojis + "`\n"
|
|
|
|
|
desc += "**Server Roles**: `" + sRoles + "`\n"
|
|
|
|
|
desc += "**Server Region**: `" + sRegion + "`\n"
|
2020-12-29 21:41:18 +00:00
|
|
|
|
desc += "**Server Creation**: `" + sCreatedAt + "`\n"
|
2020-05-04 20:50:17 +00:00
|
|
|
|
|
|
|
|
|
embedData := models.CustomEmbed{
|
|
|
|
|
URL: "",
|
|
|
|
|
Title: "Server Info (" + sName + ")",
|
|
|
|
|
Desc: desc,
|
|
|
|
|
Type: "",
|
|
|
|
|
Timestamp: time.Now().Format(time.RFC3339),
|
|
|
|
|
Color: 0xFFA500,
|
2021-01-08 22:30:18 +00:00
|
|
|
|
FooterText: "Requested by " + user.Username + "#" + user.Discriminator,
|
|
|
|
|
FooterImageURL: "",
|
2020-05-04 20:50:17 +00:00
|
|
|
|
ImageURL: "",
|
|
|
|
|
ImageH: 0,
|
|
|
|
|
ImageW: 0,
|
|
|
|
|
ThumbnailURL: sIconURL,
|
|
|
|
|
ThumbnailH: 256,
|
|
|
|
|
ThumbnailW: 256,
|
|
|
|
|
ProviderURL: "",
|
|
|
|
|
ProviderText: "",
|
|
|
|
|
AuthorText: "",
|
|
|
|
|
AuthorURL: "",
|
|
|
|
|
AuthorImageURL: "",
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-29 12:17:01 +00:00
|
|
|
|
msg := c.CreateCustomEmbed(&embedData)
|
2020-05-04 20:50:17 +00:00
|
|
|
|
|
2020-12-29 07:57:33 +00:00
|
|
|
|
_, err = s.ChannelMessageSendEmbed(m.ChannelID, msg)
|
2020-05-04 20:50:17 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2022-08-16 12:32:53 +00:00
|
|
|
|
func (c *Commands) handleGoogle4U(s *discordgo.Session, m *discordgo.MessageCreate) error {
|
|
|
|
|
args := strings.Split(m.Content, " ")
|
|
|
|
|
|
|
|
|
|
if len(args) < 2 {
|
|
|
|
|
return errors.New("You did not specify anything to google")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
input := m.Content[strings.Index(m.Content, " "):len(m.Content)]
|
|
|
|
|
|
|
|
|
|
desc := "https://letmegooglethat.com/?q=" + url.QueryEscape(input)
|
|
|
|
|
|
|
|
|
|
msg := c.CreateDefinedEmbed("Google", desc, "", m.Author)
|
|
|
|
|
_, err := s.ChannelMessageSendEmbed(m.ChannelID, msg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
err = s.ChannelMessageDelete(m.ChannelID, m.ID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|