diff --git a/plugins/tldr/tldr.go b/plugins/tldr/tldr.go index ed82150..e1919be 100644 --- a/plugins/tldr/tldr.go +++ b/plugins/tldr/tldr.go @@ -19,7 +19,7 @@ var ( type TLDRPlugin struct { Bot bot.Bot History []string - Users []string + Users []string Index int } @@ -27,7 +27,7 @@ func New(b bot.Bot) *TLDRPlugin { plugin := &TLDRPlugin{ Bot: b, History: []string{}, - Users: []string{}, + Users: []string{}, Index: 0, } b.Register(plugin, bot.Message, plugin.message) @@ -54,18 +54,28 @@ func (p *TLDRPlugin) message(kind bot.Kind, message msg.Message, args ...interfa return false } - bestScores := make([]float64, nTopics) - bestDocs := make([]string, nTopics) - bestUsers := make([]string, nTopics) + bestScores := make([][]float64, nTopics) + bestDocs := make([][]string, nTopics) + bestUsers := make([][]string, nTopics) + + supportingDocs := p.Bot.Config().GetInt("TLDR.Support", 3) + for i := 0; i < supportingDocs; i++ { + bestScores[i] = make([]float64, supportingDocs) + bestDocs[i] = make([]string, supportingDocs) + bestUsers[i] = make([]string, supportingDocs) + } dr, dc := docsOverTopics.Dims() - for doc := 0; doc < dc; doc++ { - for topic := 0; topic < dr; topic++ { + for topic := 0; topic < dr; topic++ { + minScore, minIndex := min(bestScores[topic]) + + for doc := 0; doc < dc; doc++ { score := docsOverTopics.At(topic, doc) - if score > bestScores[topic] { - bestScores[topic] = score - bestDocs[topic] = p.History[doc] - bestUsers[topic] = p.Users[doc] + if score > minScore { + bestScores[topic][minIndex] = score + bestDocs[topic][minIndex] = p.History[doc] + bestUsers[topic][minIndex] = p.Users[doc] + minScore, minIndex = min(bestScores[topic]) } } } @@ -91,7 +101,9 @@ func (p *TLDRPlugin) message(kind bot.Kind, message msg.Message, args ...interfa } } response += fmt.Sprintf("Topic #%d : %s\n", topic, bestTopic) - response += fmt.Sprintf("\t<%s>%s\n", bestUsers[topic], bestDocs[topic]) + for i := range bestDocs[topic] { + response += fmt.Sprintf("\t<%s>%s\n", bestUsers[topic][i], bestDocs[topic][i]) + } } p.Bot.Send(bot.Message, message.Channel, response) @@ -133,3 +145,15 @@ func (p *TLDRPlugin) help(kind bot.Kind, message msg.Message, args ...interface{ func shouldKeepMessage(message string) bool { return true } + +func min(slice []float64) (float64, int) { + minVal := 1. + minIndex := -1 + for index, val := range slice { + if val < minVal { + minVal = val + minIndex = index + } + } + return minVal, minIndex +}