cchat-mock/internal/channel/messagecompleter.go

86 lines
1.9 KiB
Go

package channel
import (
"strings"
"github.com/diamondburned/cchat"
"github.com/diamondburned/cchat-mock/internal/message"
)
type MessageCompleter struct {
msgr *Messenger
}
func (msgc MessageCompleter) Complete(words []string, i int64) []cchat.CompletionEntry {
switch {
case strings.HasPrefix("complete", words[i]):
return makeCompletion(
"complete",
"complete me",
"complete you",
"complete everyone",
)
case lookbackCheck(words, i, "complete", "me"):
return makeCompletion("me")
case lookbackCheck(words, i, "complete", "you"):
return makeCompletion("you")
case lookbackCheck(words, i, "complete", "everyone"):
return makeCompletion("everyone")
case lookbackCheck(words, i, "best", "femboys:"):
return makeCompletion(
"trap: Astolfo",
"trap: Hackadoll No. 3",
"trap: Totsuka",
"trap: Felix Argyle",
)
default:
var found = map[string]struct{}{}
msgc.msgr.messageMutex.Lock()
defer msgc.msgr.messageMutex.Unlock()
var entries []cchat.CompletionEntry
// Look for members.
for _, id := range msgc.msgr.messageids {
if msg := msgc.msgr.messages[id]; strings.HasPrefix(msg.AuthorName(), words[i]) {
if _, ok := found[msg.AuthorName()]; ok {
continue
}
found[msg.AuthorName()] = struct{}{}
entries = append(entries, cchat.CompletionEntry{
Raw: msg.AuthorName(),
Text: msg.Author().Name(),
IconURL: msg.Author().Avatar(),
})
}
}
return entries
}
return nil
}
func makeCompletion(word ...string) []cchat.CompletionEntry {
var entries = make([]cchat.CompletionEntry, len(word))
for i, w := range word {
entries[i].Raw = w
entries[i].Text.Content = w
entries[i].IconURL = message.AvatarURL
}
return entries
}
// completion will only override `this'.
func lookbackCheck(words []string, i int64, prev, this string) bool {
return strings.HasPrefix(this, words[i]) && i > 0 && words[i-1] == prev
}