63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package emojipicker
|
|
|
|
import (
|
|
"github.com/ayn2op/arikawa/v3/discord"
|
|
"github.com/ayn2op/discordo/internal/config"
|
|
"github.com/ayn2op/discordo/internal/emoji"
|
|
uipicker "github.com/ayn2op/discordo/internal/ui/picker"
|
|
"github.com/ayn2op/ningen/v3"
|
|
"github.com/ayn2op/tview"
|
|
"github.com/ayn2op/tview/picker"
|
|
)
|
|
|
|
type Model struct {
|
|
uipicker.Model
|
|
cfg *config.Config
|
|
}
|
|
|
|
func NewModel(cfg *config.Config) Model {
|
|
return Model{Model: uipicker.NewModel(cfg, "Add Reaction"), cfg: cfg}
|
|
}
|
|
|
|
var _ tview.Model[Model] = Model{}
|
|
|
|
// View shows the picker in a box titled Add Reaction.
|
|
func (m Model) View() tview.Widget {
|
|
return m.Model.View(func(item picker.Item) tview.Msg {
|
|
apiEmoji, ok := item.Reference.(discord.APIEmoji)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
return SelectedMsg{Emoji: apiEmoji}
|
|
}, CancelMsg{})
|
|
}
|
|
|
|
func (m Model) Update(msg tview.Msg) (Model, tview.Cmd) {
|
|
var cmd tview.Cmd
|
|
m.Model, cmd = m.Model.Update(msg)
|
|
return m, cmd
|
|
}
|
|
|
|
// RefreshEmojis repopulates the picker with custom guild emojis and Unicode emojis.
|
|
func (m *Model) RefreshEmojis(state *ningen.State, guildID discord.GuildID) {
|
|
var customEmojis []discord.Emoji
|
|
if state != nil && state.EmojiState != nil {
|
|
guilds, err := state.EmojiState.ForGuild(guildID)
|
|
if err == nil {
|
|
for _, g := range guilds {
|
|
customEmojis = append(customEmojis, g.Emojis...)
|
|
}
|
|
}
|
|
}
|
|
|
|
results := emoji.Search("", customEmojis, 2500)
|
|
items := make(picker.Items, 0, len(results))
|
|
for _, item := range results {
|
|
items = append(items, picker.Item{
|
|
Text: item.Display,
|
|
FilterText: item.Name,
|
|
Reference: item.APIEmoji(),
|
|
})
|
|
}
|
|
m.SetItems(items)
|
|
}
|