cchat-discord/internal/discord/channel/message/send/complete/channel.go

90 lines
2.0 KiB
Go
Raw Normal View History

package complete
import (
2020-12-20 05:44:26 +00:00
"github.com/diamondburned/arikawa/v2/discord"
"github.com/diamondburned/cchat"
2020-12-19 05:46:12 +00:00
"github.com/diamondburned/cchat-discord/internal/discord/channel/shared"
"github.com/diamondburned/cchat-discord/internal/discord/state"
"github.com/diamondburned/cchat/text"
)
2020-12-19 05:46:12 +00:00
func (ch ChannelCompleter) CompleteChannels(word string) []cchat.CompletionEntry {
// Ignore if empty word.
if word == "" {
2020-12-19 05:46:12 +00:00
return nil
}
// Ignore if we're not in a guild.
if !ch.GuildID.IsValid() {
2020-12-19 05:46:12 +00:00
return nil
}
2020-12-20 05:44:26 +00:00
c, err := ch.State.Cabinet.Channels(ch.GuildID)
if err != nil {
2020-12-19 05:46:12 +00:00
return nil
}
2020-12-19 05:46:12 +00:00
return completeChannels(c, word, ch.State)
}
func DMChannels(s *state.Instance, word string) []cchat.CompletionEntry {
2020-12-20 05:44:26 +00:00
channels, err := s.Cabinet.PrivateChannels()
2020-12-19 05:46:12 +00:00
if err != nil {
return nil
}
// We only need the state to look for categories, which is never the case
// for private channels.
return completeChannels(channels, word, nil)
}
2020-12-19 05:46:12 +00:00
func rankChannel(word string, ch discord.Channel) int {
switch ch.Type {
case discord.GroupDM, discord.DirectMessage:
2020-12-20 05:44:26 +00:00
return rankFunc(word, ch.Name+" "+shared.ChannelName(ch))
2020-12-19 05:46:12 +00:00
default:
return rankFunc(word, ch.Name)
}
}
func completeChannels(
channels []discord.Channel, word string, s *state.Instance) []cchat.CompletionEntry {
var entries []cchat.CompletionEntry
var distances map[string]int
for _, channel := range channels {
rank := rankChannel(word, channel)
if rank == -1 {
continue
}
var category string
2020-12-19 05:46:12 +00:00
if s != nil && channel.CategoryID.IsValid() {
2020-12-20 05:44:26 +00:00
if cat, _ := s.Cabinet.Channel(channel.CategoryID); cat != nil {
2020-12-19 05:46:12 +00:00
category = cat.Name
}
}
2020-12-19 05:46:12 +00:00
// Defer allocation until we've found something.
ensureEntriesMade(&entries)
ensureDistancesMade(&distances)
raw := channel.Mention()
entries = append(entries, cchat.CompletionEntry{
2020-12-19 05:46:12 +00:00
Raw: raw,
Text: text.Plain("#" + channel.Name),
Secondary: text.Plain(category),
})
2020-12-19 05:46:12 +00:00
distances[raw] = rank
if len(entries) >= MaxCompletion {
2020-12-19 05:46:12 +00:00
break
}
}
2020-12-19 05:46:12 +00:00
sortDistances(entries, distances)
return entries
}