package core import ( "bytes" "fmt" "os/exec" "math/rand" "sort" "strings" "time" "github.com/bwmarrin/discordgo" ) func getAudioMessage(msg string) (filename string, file *bytes.Reader) { curr_time := time.Now().Unix() filename = fmt.Sprintf("/tmp/%d.mp3", curr_time) var cmd_args string = fmt.Sprintf("espeak-ng -s 120 -v mb-fr2 -p 30 '%s' --stdout", maxString(msg, 300)) cmd := exec.Command("sh", "-c", cmd_args) out, err := cmd.CombinedOutput() if err != nil { fmt.Println(fmt.Sprint(err)) } file = bytes.NewReader(out) return } func getHelpMessage() string { // build list of possible commands // TODO: currently, the help needs to get value initiated at startup time to be built. // I don't like that and wish to test what is rendered without connecting to the server var help []string for _, command := range CommandRegister { help = append(help, fmt.Sprintf( "%s : %s (Example : %s)\n", command.name, command.desc, command.example)) } sort.Strings(help) welcome := fmt.Sprintf( "Hello, I'm **%s**. Here are the things I can do :\n", ConfigRegister.Name) return welcome + strings.Join(help, "") } func getHatMessage() string { hat := []string{"๐Ÿงข", "๐Ÿ‘’", "โ›‘", "๐ŸŽฉ", "๐ŸŽ“"} rand.Seed(time.Now().UnixNano()) var amount int = rand.Intn(len(hat)) var bag []string for i := 0; i < amount; i++ { rand.Seed(time.Now().UnixNano()) bag = append(bag, hat[rand.Intn(len(hat))]) } return strings.Join(bag, " ") } func MessageHandler(s *discordgo.Session, m *discordgo.MessageCreate) { for alias, _ := range CommandRegister { if strings.HasPrefix(m.Content, alias) { if m.Author.ID == s.State.User.ID { return } var message string = strings.TrimPrefix(m.Content, alias) CommandRegister[alias].command(s, m, message) } } } func MessageHat(s *discordgo.Session, m *discordgo.MessageCreate, message string) { s.ChannelMessageSend(m.ChannelID, getHatMessage()) } func MessageTalkback(s *discordgo.Session, m *discordgo.MessageCreate) { if m.Author.ID == s.State.User.ID { return } for _, t := range ConfigRegister.Talkback { for _, p := range t.Domain.Patterns { rand.Seed(time.Now().UnixNano()) if strings.Contains(strings.ToLower(m.Content), strings.ToLower(p)) && rand.Intn(2) == 1 { rand.Seed(time.Now().UnixNano()) answer := t.Domain.Answers[rand.Intn(len(t.Domain.Answers))] s.ChannelMessageSend(m.ChannelID, answer) } } } } func MessageHelp(s *discordgo.Session, m *discordgo.MessageCreate, message string) { s.ChannelMessageSend(m.ChannelID, getHelpMessage()) } func MessagePing(s *discordgo.Session, m *discordgo.MessageCreate, message string) { if m.Content == "ping" { s.ChannelMessageSend(m.ChannelID, "Pong!") } if m.Content == "pong" { s.ChannelMessageSend(m.ChannelID, "Ping!") } } func MessageAudio(s *discordgo.Session, m *discordgo.MessageCreate, message string) { var cleanMessage string = prepareTTSMessage(message) filename, file := getAudioMessage(cleanMessage) s.ChannelFileSend(m.ChannelID, filename, file) }