// Help returns a list of help strings that are printed when the user requests them. func (p *triviaPlugin) Help(bot *bruxism.Bot, service bruxism.Service, message bruxism.Message, detailed bool) []string { if service.IsPrivate(message) || !(service.IsModerator(message) || service.IsBotOwner(message)) { return nil } return []string{ bruxism.CommandHelp(service, "trivia", "<start|stop> [theme]", "Starts or stops trivia with an optional theme.")[0], bruxism.CommandHelp(service, "trivia", "<score>", "Returns your current trivia score.")[0], } }
// Help returns a list of help strings that are printed when the user requests them. func (p *playingPlugin) helpFunc(bot *bruxism.Bot, service bruxism.Service, message bruxism.Message, detailed bool) []string { if detailed { return nil } if !service.IsBotOwner(message) { return nil } return bruxism.CommandHelp(service, "playing", "<game>, <url>", fmt.Sprintf("Set which game %s is playing.", service.UserName())) }
// Message handler. func (p *YouTubeJoinPlugin) Message(bot *bruxism.Bot, service bruxism.Service, message bruxism.Message) { if (service.IsBotOwner(message) || service.IsChannelOwner(message)) && bruxism.MatchesCommand(service, "leave", message) { video, ok := p.youtube.VideoIDForChatID(message.Channel()) if ok { channel, ok := p.youtube.ChannelIDForVideoID(video) if ok { p.Unmonitor(channel) } } } }
// Message handler. func (p *playingPlugin) messageFunc(bot *bruxism.Bot, service bruxism.Service, message bruxism.Message) { if !service.IsMe(message) { if bruxism.MatchesCommand(service, "playing", message) { if !service.IsBotOwner(message) { return } query, _ := bruxism.ParseCommand(service, message) split := strings.Split(query, ",") p.Game = strings.Trim(split[0], " ") if len(split) > 1 { p.URL = strings.Trim(split[1], " ") service.(*bruxism.Discord).Session.UpdateStreamingStatus(0, p.Game, p.URL) } else { service.(*bruxism.Discord).Session.UpdateStatus(0, p.Game) } } } }
// 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`") } }
// 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) } } } }