// Message handler. func (p *livePlugin) Message(bot *bruxism.Bot, service bruxism.Service, message bruxism.Message) { defer bruxism.MessageRecover() if !service.IsMe(message) { messageChannel := message.Channel() if bruxism.MatchesCommand(service, "live", message) { ticks := "" if service.Name() == bruxism.DiscordServiceName { ticks = "`" } _, parts := bruxism.ParseCommand(service, message) if len(parts) == 0 { service.SendMessage(messageChannel, fmt.Sprintf("Incorrect command. eg: %s%slive [add|remove|list] <%s>%s", ticks, service.CommandPrefix(), "UCGmC0A8mEAPdlELQdP9xJbw", ticks)) } switch parts[0] { case "list": if !service.IsModerator(message) { service.SendMessage(messageChannel, "I'm sorry, you must be the channel owner to list live announcements.") return } list := []string{} p.Lock() for ytChannel := range p.ChannelToYouTubeChannels[messageChannel] { list = append(list, fmt.Sprintf("%s (%s)", p.ytLiveChannel.ChannelName(ytChannel), ytChannel)) } p.Unlock() if len(list) == 0 { service.SendMessage(messageChannel, "No Channels are being announced.") } else { service.SendMessage(messageChannel, fmt.Sprintf("Currently announcing: %s", strings.Join(list, ","))) } case "add": if !service.IsModerator(message) { service.SendMessage(messageChannel, "I'm sorry, you must be the channel owner to add live announcements.") return } if len(parts) != 2 || len(parts[1]) != 24 { service.SendMessage(messageChannel, fmt.Sprintf("Incorrect Channel ID. eg: %s%slive %s %s%s", ticks, service.CommandPrefix(), parts[0], "UCGmC0A8mEAPdlELQdP9xJbw", ticks)) return } err := p.monitor(messageChannel, parts[1]) if err != nil { service.SendMessage(messageChannel, fmt.Sprintf("Could not add Channel ID. %s", err)) return } service.SendMessage(messageChannel, fmt.Sprintf("Messages will be sent here when %s goes live.", p.ytLiveChannel.ChannelName(parts[1]))) case "remove": if !service.IsModerator(message) { service.SendMessage(messageChannel, "I'm sorry, you must be the channel owner to remove live announcements.") return } if len(parts) != 2 || len(parts[1]) != 24 { service.SendMessage(messageChannel, fmt.Sprintf("Incorrect Channel ID. eg: %s%slive %s %s%s", ticks, service.CommandPrefix(), parts[0], "UCGmC0A8mEAPdlELQdP9xJbw", ticks)) return } p.Lock() delete(p.ChannelToYouTubeChannels[messageChannel], parts[1]) delete(p.youTubeChannelToChannels[parts[1]], messageChannel) p.Unlock() service.SendMessage(messageChannel, fmt.Sprintf("Messages will no longer be sent here when %s goes live.", p.ytLiveChannel.ChannelName(parts[1]))) } } } }
// Message handler. func (p *triviaPlugin) Message(bot *bruxism.Bot, service bruxism.Service, message bruxism.Message) { defer bruxism.MessageRecover() if !service.IsMe(message) && !service.IsPrivate(message) { messageChannel := message.Channel() isCommand := bruxism.MatchesCommand(service, "trivia", message) if isCommand && (service.IsModerator(message) || service.IsBotOwner(message)) { p.Lock() tc := p.Channels[messageChannel] if tc == nil { tc = &triviaChannel{ Channel: messageChannel, Scores: map[string]*triviaScore{}, } p.Channels[messageChannel] = tc } p.Unlock() _, parts := bruxism.ParseCommand(service, message) if len(parts) == 0 { return } switch parts[0] { case "start": theme := "" if len(parts) >= 2 { theme = parts[1] } tc.Start(bot, service, theme) case "stop": tc.Stop(bot, service) } } else { if isCommand { _, parts := bruxism.ParseCommand(service, message) if len(parts) == 0 { return } if parts[0] == "score" { p.RLock() tc := p.Channels[messageChannel] if tc != nil { ts := tc.Scores[message.UserID()] if ts != nil { service.SendMessage(message.Channel(), fmt.Sprintf("%s's score is %d.", message.UserName(), ts.Score)) } else { service.SendMessage(message.Channel(), fmt.Sprintf("%s's score is 0.", message.UserName())) } } p.RUnlock() } return } p.RLock() tc := p.Channels[messageChannel] p.RUnlock() if tc != nil { tc.Message(bot, service, message) } } } }
// Message handler. func (p *MusicPlugin) Message(bot *bruxism.Bot, service bruxism.Service, message bruxism.Message) { defer bruxism.MessageRecover() if service.IsMe(message) { return } if !bruxism.MatchesCommand(service, "music", message) && !bruxism.MatchesCommand(service, "mu", message) { return } _, parts := bruxism.ParseCommand(service, message) if len(parts) == 0 { service.SendMessage(message.Channel(), strings.Join(p.Help(bot, service, message, true), "\n")) return } // Get the Channel (and GuildID) for this channel because it's needed in // a few locations below channel, err := p.discord.Channel(message.Channel()) if err != nil { log.Println("musicplugin: fetching channel err:", err.Error()) return } // grab pointer to this channels voice connection, if exists. vc, vcok := p.VoiceConnections[channel.GuildID] switch parts[0] { case "help": // display extended help information service.SendMessage(message.Channel(), strings.Join(p.Help(bot, service, message, true), "\n")) case "stats": // TODO: maybe provide plugin stats, total channels, total song queues, etc case "join": if !service.IsBotOwner(message) { service.SendMessage(message.Channel(), "Sorry, only bot owner can join, please ask him to run this command.") return } // join the voice channel of the caller or the provided channel ID channelID := "" if len(parts) > 1 { channelID = parts[1] } if channelID == "" { messageUserID := message.UserID() for _, g := range p.discord.Guilds() { for _, v := range g.VoiceStates { if v.UserID == messageUserID { channelID = v.ChannelID } } } if channelID == "" { service.SendMessage(message.Channel(), "I couldn't find you in any voice channels, please join one.") return } } _, err := p.join(channelID) if err != nil { service.SendMessage(message.Channel(), err.Error()) break } service.SendMessage(message.Channel(), "Now, let's play some music!") case "leave": // leave voice channel for this Guild if !service.IsBotOwner(message) { service.SendMessage(message.Channel(), "Sorry, only bot owner can leave, please ask him to run this command.") return } if !vcok { service.SendMessage(message.Channel(), "There is no voice connection for this Guild.") } vc.conn.Close() delete(p.VoiceConnections, channel.GuildID) service.SendMessage(message.Channel(), "Closed voice connection.") case "debug": // enable or disable debug if !vcok { service.SendMessage(message.Channel(), fmt.Sprintf("There is no voice connection for this Guild.")) } vc.Lock() vc.debug = !vc.debug service.SendMessage(message.Channel(), fmt.Sprintf("debug mode set to %v", vc.debug)) vc.Unlock() case "play": // Start queue player and optionally enqueue provided songs p.gostart(vc) for _, v := range parts[1:] { url, err := url.Parse(v) // doesn't check much.. if err != nil { continue } err = p.enqueue(vc, url.String(), service, message) if err != nil { // TODO: Might need improving. service.SendMessage(message.Channel(), err.Error()) } } case "stop": // stop the queue player if vc.close != nil { close(vc.close) vc.close = nil } if vc.control != nil { close(vc.control) vc.control = nil } case "skip": // skip current song if vc.control == nil { return } vc.control <- Skip case "pause": // pause the queue player if vc.control == nil { return } vc.control <- Pause case "resume": // resume the queue player if vc.control == nil { return } vc.control <- Resume case "info": // report player settings, queue info, and current song msg := fmt.Sprintf("`Bruxism MusicPlugin:`\n") msg += fmt.Sprintf("`Voice Channel:` %s\n", vc.ChannelID) msg += fmt.Sprintf("`Queue Size:` %d\n", len(vc.Queue)) if vc.playing == nil { service.SendMessage(message.Channel(), msg) break } msg += fmt.Sprintf("`Now Playing:`\n") msg += fmt.Sprintf("`ID:` %s\n", vc.playing.ID) msg += fmt.Sprintf("`Title:` %s\n", vc.playing.Title) msg += fmt.Sprintf("`Duration:` %ds\n", vc.playing.Duration) msg += fmt.Sprintf("`Remaining:` %ds\n", vc.playing.Remaining) msg += fmt.Sprintf("`Source URL:` <%s>\n", vc.playing.URL) msg += fmt.Sprintf("`Thumbnail:` %s\n", vc.playing.Thumbnail) service.SendMessage(message.Channel(), msg) case "list": // list top items in the queue if len(vc.Queue) == 0 { service.SendMessage(message.Channel(), "The music queue is empty.") return } var msg string i := 1 i2 := 0 for k, v := range vc.Queue { np := "" if vc.playing != nil && *vc.playing == v { np = "**(Now Playing)**" } d := time.Duration(v.Duration) * time.Second msg += fmt.Sprintf("`%.3d:%.15s` **%s** [%s] - *%s* %s\n", k, v.ID, v.Title, d.String(), v.AddedBy, np) if i >= 15 { service.SendMessage(message.Channel(), msg) msg = "" i = 0 i2++ if i2 >= 8 { // limit response to 8 messages (120 songs) return } } i++ } service.SendMessage(message.Channel(), msg) case "clear": // clear all items from the queue vc.Lock() vc.Queue = []song{} vc.Unlock() default: service.SendMessage(message.Channel(), "Unknown music command, try `help music`") } }
func (p *playedPlugin) Message(bot *bruxism.Bot, service bruxism.Service, message bruxism.Message) { defer bruxism.MessageRecover() if service.Name() == bruxism.DiscordServiceName && !service.IsMe(message) { if bruxism.MatchesCommand(service, "played", message) { query := strings.Join(strings.Split(message.RawMessage(), " ")[1:], " ") id := message.UserID() match := userIDRegex.FindStringSubmatch(query) if match != nil { id = match[1] } p.Lock() defer p.Unlock() u := p.Users[id] if u == nil { service.SendMessage(message.Channel(), "I haven't seen that user.") return } if len(u.Entries) == 0 { service.SendMessage(message.Channel(), "I haven't seen anything played by that user.") return } lc := humanize.Time(u.LastChanged) u.Update(u.Current, time.Now()) pes := make(byDuration, len(u.Entries)) i := 0 for _, pe := range u.Entries { pes[i] = pe i++ } sort.Sort(pes) messageText := fmt.Sprintf("*First seen %s, last update %s*\n", humanize.Time(u.FirstSeen), lc) for i = 0; i < len(pes) && i < 5; i++ { pe := pes[i] du := pe.Duration ds := "" hours := int(du / time.Hour) if hours > 0 { ds += fmt.Sprintf("%dh ", hours) du -= time.Duration(hours) * time.Hour } minutes := int(du / time.Minute) if minutes > 0 || len(ds) > 0 { ds += fmt.Sprintf("%dm ", minutes) du -= time.Duration(minutes) * time.Minute } seconds := int(du / time.Second) ds += fmt.Sprintf("%ds", seconds) messageText += fmt.Sprintf("**%s**: %s\n", pe.Name, ds) } service.SendMessage(message.Channel(), messageText) } } }