package main import ( "errors" "fmt" "io" "math/rand" "net/http" "strconv" "strings" "time" "github.com/bwmarrin/discordgo" ) func (app *application) getPepeLink() (string, error) { url := "http://" + app.pepeServer + "/pepe" resp, err := http.Get(url) if err != nil { return "", err } body, err := io.ReadAll(resp.Body) if err != nil { return "", err } return string(body), nil } func (app *application) sendPepe(s *discordgo.Session, m *discordgo.MessageCreate) { ch, err := s.Channel(m.ChannelID) if err != nil { app.errorLog.Print(err) return } if !strings.Contains(ch.Topic, "pepebot allowed") { app.errorLog.Print("Can't send pepe within this channel") return } url, err := app.getPepeLink() if err != nil { app.errorLog.Print(err) return } _, err = s.ChannelMessageSend(m.ChannelID, url) if err != nil { app.errorLog.Print(err) return } } func (app *application) sendCringe(s *discordgo.Session, m *discordgo.MessageCreate) { _, err := s.ChannelMessageSend(m.ChannelID, "https://cdn.nicecock.eu/cringe.webm") if err != nil { app.errorLog.Print(err) return } } func (app *application) sendNigelGif(s *discordgo.Session, m *discordgo.MessageCreate) { msg := "<@77516941199159296> kun je die gif verwijderen van die pickup truck die naar de camera rijdt want bij mij zorg ie voor dat discord opnieuw opstart. ik weet niet of iemand anders dit heeft maar als iemand weet hoe dit komt en een andere oplossing weet hoor ik het graag." _, err := s.ChannelMessageSend(m.ChannelID, msg) if err != nil { app.errorLog.Print(err) return } } func (app *application) sendMonday(s *discordgo.Session, m *discordgo.MessageCreate) { if time.Now().Weekday().String() != "Monday" { _, err := s.ChannelMessageSend(m.ChannelID, "This command only works on mondays") if err != nil { app.errorLog.Print(err) return } return } _, err := s.ChannelMessageSend(m.ChannelID, "https://www.youtube.com/watch?v=EkALyaMjoXw") if err != nil { app.errorLog.Print(err) return } } func (app *application) sendTuesday(s *discordgo.Session, m *discordgo.MessageCreate) { if time.Now().Weekday().String() != "Tuesday" { _, err := s.ChannelMessageSend(m.ChannelID, "This command only works on tuesdays") if err != nil { app.errorLog.Print(err) return } return } _, err := s.ChannelMessageSend(m.ChannelID, "https://cdn.nicecock.eu/TBT.webm") if err != nil { app.errorLog.Print(err) return } } func (app *application) sendWednesday(s *discordgo.Session, m *discordgo.MessageCreate) { _, month, day := time.Now().Date() if month.String() == "May" && day == 19 { _, err := s.ChannelMessageSend(m.ChannelID, "https://www.youtube.com/watch?v=z21HOwUk5oM") if err != nil { app.errorLog.Print(err) return } return } if time.Now().Weekday().String() != "Wednesday" { _, err := s.ChannelMessageSend(m.ChannelID, "This command only works on wednesdays") if err != nil { app.errorLog.Print(err) return } return } _, err := s.ChannelMessageSend(m.ChannelID, "https://www.youtube.com/watch?v=du-TY1GUFGk") if err != nil { app.errorLog.Print(err) return } } func (app *application) sendFriday(s *discordgo.Session, m *discordgo.MessageCreate) { if time.Now().Weekday().String() != "Friday" { _, err := s.ChannelMessageSend(m.ChannelID, "This command only works on fridays") if err != nil { app.errorLog.Print(err) return } return } _, err := s.ChannelMessageSend(m.ChannelID, "https://www.youtube.com/watch?v=kfVsfOSbJY0") if err != nil { app.errorLog.Print(err) return } } func (app *application) sendGithub(s *discordgo.Session, m *discordgo.MessageCreate) { _, err := s.ChannelMessageSend(m.ChannelID, "My code is hosted publicly over at https://dutchellie.nl/DutchEllie/pepebot") if err != nil { app.errorLog.Print(err) return } } func (app *application) sendPeski(s *discordgo.Session, m *discordgo.MessageCreate) { _, err := s.ChannelMessageSend(m.ChannelID, "https://www.youtube.com/watch?v=P0jHTCJYm44") if err != nil { app.errorLog.Print(err) return } } func (app *application) sendProper(s *discordgo.Session, m *discordgo.MessageCreate) { responseList := []string{"That's proper", "I use Gentoo", "So based", "That's best practice", "Emacs is the best", "LISP is so fucking based", "My website is here https://forestofunix.xyz\nIt's written in Lisp. It's so based!", "Python is LISP based"} source := rand.NewSource(time.Now().UnixNano()) rng := rand.New(source) index := rng.Intn(len(responseList)) _, err := s.ChannelMessageSend(m.ChannelID, fmt.Sprintf("\"%s\"\n-Sebastiaan", responseList[index])) if err != nil { app.errorLog.Print(err) return } } func (app *application) sendManyPepes(s *discordgo.Session, m *discordgo.MessageCreate, splitCommand []string) { ch, err := s.Channel(m.ChannelID) if err != nil { app.errorLog.Print(err) return } if !strings.Contains(ch.Topic, "pepebot allowed") { app.errorLog.Print("Can't send pepe within this channel") return } override := false /* [0] is !pepe, [1] is spam, [2] is amount, [3] is override*/ if len(splitCommand) <= 2 { app.errorLog.Printf("spam command had no numeral argument") s.ChannelMessageSend(m.ChannelID, "This command requires a numeral as a second argument, which is between 1 and 3") return } if len(splitCommand) > 3 { if splitCommand[3] == "override" { /* Check if admin */ r, err := app.checkIfAdmin(s, m) if err != nil { app.errorLog.Print(err) return } if r { //s.ChannelMessageSend(m.ChannelID, "You have to be admin to override, not overriding") override = true } } } val, err := strconv.Atoi(splitCommand[2]) if err != nil { app.errorLog.Printf("spam command had a non-numeral as argument") s.ChannelMessageSend(m.ChannelID, "This command requires a numeral as a second argument") return } if (val <= 0 || val > 3) && !override { s.ChannelMessageSend(m.ChannelID, "The amount has to be > 0 and < 4") return } else if val <= 0 && override { s.ChannelMessageSend(m.ChannelID, "I know you're admin and all, but you still have to provide a positive integer amount of pepes to send...") return } app.active = true var msg string = "" for i := 0; i < val; i++ { if app.stop { app.stop = false break } link, err := app.getPepeLink() if err != nil { app.errorLog.Print(err) return } if len(msg+link) > 512 { s.ChannelMessageSend(m.ChannelID, msg) msg = "" time.Sleep(time.Millisecond * 500) } msg += link msg += "\n" } s.ChannelMessageSend(m.ChannelID, msg) app.active = false } func (app *application) stopRequest(s *discordgo.Session, m *discordgo.MessageCreate) { if app.active { app.stop = true s.ChannelMessageSend(m.ChannelID, "Emergency stop called, hopefully I stop now") } else { app.stop = false s.ChannelMessageSend(m.ChannelID, "But I wasn't doing anything!") } } func (app *application) findTrigger(s *discordgo.Session, m *discordgo.MessageCreate) { /* Finding for every word in the allBadWords map of string slices Check if the message contains that word if it doesn't continue, if it does then get the word from the database, update the new time, format a message and send it */ for i := 0; i < len(app.allBadWords[m.GuildID]); i++ { if strings.Contains(strings.ToLower(m.Content), strings.ToLower(app.allBadWords[m.GuildID][i])) { /* Found the bad word */ word, err := app.badwords.GetWord(strings.ToLower(app.allBadWords[m.GuildID][i]), m.GuildID) if err != nil { app.errorLog.Print(err) s.ChannelMessageSend(m.ChannelID, err.Error()) } format := formatTimeCheck(word.LastSaid) _, err = app.badwords.UpdateLastSaid(word.Word, word.ServerID) if err != nil { app.errorLog.Print(err) return } user := m.Author.Mention() eyesEmoji := ":eyes:" message := fmt.Sprintf("%s mentioned the forbidden word '%s'. They broke a streak of %s...\nYou better watch out, I am always watching %s", user, word.Word, format, eyesEmoji) _, err = s.ChannelMessageSend(m.ChannelID, message) if err != nil { app.errorLog.Print(err) return } break } } } func formatTimeCheck(last time.Time) string { now := time.Now() sinceLast := now.Sub(last) var realSeconds uint64 = uint64(sinceLast.Seconds()) var seconds, minutes, hours, days uint64 realBackup := realSeconds days = realSeconds / (24 * 3600) realSeconds -= days * (24 * 3600) hours = realSeconds / 3600 realSeconds -= hours * 3600 minutes = realSeconds / 60 realSeconds -= minutes * 60 seconds = realSeconds if realBackup < 60 { if seconds == 1 { return fmt.Sprintf("%d second", seconds) } return fmt.Sprintf("%d seconds", seconds) } else if realBackup > 60 && realBackup < 3600 { if seconds == 1 && minutes == 1 { return fmt.Sprintf("%d minute and %d second", minutes, seconds) } else if minutes == 1 && seconds != 1 { return fmt.Sprintf("%d minute and %d seconds", minutes, seconds) } else if minutes != 1 && seconds == 1 { return fmt.Sprintf("%d minutes and %d second", minutes, seconds) } return fmt.Sprintf("%d minutes and %d seconds", minutes, seconds) } else if realBackup > 60 && realBackup < (24*3600) { if hours == 1 && minutes == 1 && seconds == 1 { return fmt.Sprintf("%d hour, %d minute and %d second", hours, minutes, seconds) } else if hours == 1 && minutes == 1 && seconds != 1 { return fmt.Sprintf("%d hour, %d minute and %d seconds", hours, minutes, seconds) } else if hours == 1 && minutes != 1 && seconds == 1 { return fmt.Sprintf("%d hour, %d minutes and %d second", hours, minutes, seconds) } else if hours == 1 && minutes != 1 && seconds != 1 { return fmt.Sprintf("%d hour, %d minutes and %d seconds", hours, minutes, seconds) } else if hours != 1 && minutes == 1 && seconds == 1 { return fmt.Sprintf("%d hours, %d minute and %d second", hours, minutes, seconds) } else if hours != 1 && minutes == 1 && seconds != 1 { return fmt.Sprintf("%d hours, %d minute and %d seconds", hours, minutes, seconds) } else if hours != 1 && minutes != 1 && seconds == 1 { return fmt.Sprintf("%d hours, %d minutes and %d second", hours, minutes, seconds) } else if hours != 1 && minutes != 1 && seconds != 1 { return fmt.Sprintf("%d hours, %d minutes and %d seconds", hours, minutes, seconds) } return fmt.Sprintf("%d hours, %d minutes and %d seconds", hours, minutes, seconds) } else if realBackup > (24 * 3600) { if days != 1 && hours != 1 && minutes != 1 && seconds != 1 { return fmt.Sprintf("%d days, %d hours, %d minutes and %d seconds", days, hours, minutes, seconds) } else if days != 1 && hours != 1 && minutes != 1 && seconds == 1 { return fmt.Sprintf("%d days, %d hours, %d minutes and %d second", days, hours, minutes, seconds) } else if days != 1 && hours != 1 && minutes == 1 && seconds != 1 { return fmt.Sprintf("%d days, %d hours, %d minute and %d seconds", days, hours, minutes, seconds) } else if days != 1 && hours != 1 && minutes == 1 && seconds == 1 { return fmt.Sprintf("%d days, %d hours, %d minute and %d second", days, hours, minutes, seconds) } else if days != 1 && hours == 1 && minutes != 1 && seconds != 1 { return fmt.Sprintf("%d days, %d hour, %d minutes and %d seconds", days, hours, minutes, seconds) } else if days != 1 && hours == 1 && minutes != 1 && seconds == 1 { return fmt.Sprintf("%d days, %d hour, %d minutes and %d second", days, hours, minutes, seconds) } else if days != 1 && hours == 1 && minutes == 1 && seconds != 1 { return fmt.Sprintf("%d days, %d hour, %d minute and %d seconds", days, hours, minutes, seconds) } else if days != 1 && hours == 1 && minutes == 1 && seconds == 1 { return fmt.Sprintf("%d days, %d hour, %d minute and %d second", days, hours, minutes, seconds) } else if days == 1 && hours != 1 && minutes != 1 && seconds != 1 { return fmt.Sprintf("%d day, %d hours, %d minutes and %d seconds", days, hours, minutes, seconds) } else if days == 1 && hours != 1 && minutes != 1 && seconds == 1 { return fmt.Sprintf("%d day, %d hours, %d minutes and %d second", days, hours, minutes, seconds) } else if days == 1 && hours != 1 && minutes == 1 && seconds != 1 { return fmt.Sprintf("%d day, %d hours, %d minute and %d seconds", days, hours, minutes, seconds) } else if days == 1 && hours != 1 && minutes == 1 && seconds == 1 { return fmt.Sprintf("%d day, %d hours, %d minute and %d second", days, hours, minutes, seconds) } else if days == 1 && hours == 1 && minutes != 1 && seconds != 1 { return fmt.Sprintf("%d day, %d hour, %d minutes and %d seconds", days, hours, minutes, seconds) } else if days == 1 && hours == 1 && minutes != 1 && seconds == 1 { return fmt.Sprintf("%d day, %d hour, %d minutes and %d second", days, hours, minutes, seconds) } else if days == 1 && hours == 1 && minutes == 1 && seconds != 1 { return fmt.Sprintf("%d day, %d hour, %d minute and %d seconds", days, hours, minutes, seconds) } else if days == 1 && hours == 1 && minutes == 1 && seconds == 1 { return fmt.Sprintf("%d day, %d hour, %d minute and %d second", days, hours, minutes, seconds) } return fmt.Sprintf("%d days, %d hours, %d minutes and %d seconds", days, hours, minutes, seconds) } return "error" } func (app *application) checkIfAdmin(s *discordgo.Session, m *discordgo.MessageCreate) (bool, error) { authorMemberInfo, err := s.GuildMember(m.GuildID, m.Author.ID) if err != nil { return false, err } roleIDs, err := app.adminroles.GetAdminRoleIDs() if err != nil { return false, err } for i := 0; i < len(authorMemberInfo.Roles); i++ { for j := 0; j < len(roleIDs); j++ { if authorMemberInfo.Roles[i] == roleIDs[j] { return true, nil } } } app.infoLog.Printf("The user %s tried to perform an admin command without an admin role, purge them", m.Author) _, err = s.ChannelMessageSend(m.ChannelID, "You aren't authorized to perform this function, this incident has been reported.") if err != nil { return false, err } return false, nil } func (app *application) contextLength(splitCommand []string) error { if !(len(splitCommand) > 2) { app.errorLog.Printf("The command's context was not enough.\n") return errors.New("not enough context") } return nil } func (app *application) successMessage(s *discordgo.Session, m *discordgo.MessageCreate) { _, err := s.ChannelMessageSend(m.ChannelID, "Success!") if err != nil { app.unknownError(err, s, true, m.ChannelID) return } }