cchat-discord/internal/segments/emoji/emoji.go

101 lines
1.7 KiB
Go

package emoji
import (
"net/url"
"github.com/diamondburned/arikawa/v2/discord"
"github.com/diamondburned/cchat-discord/internal/segments/renderer"
"github.com/diamondburned/cchat/text"
"github.com/diamondburned/cchat/utils/empty"
"github.com/diamondburned/ningen/v2/md"
"github.com/yuin/goldmark/ast"
)
func init() {
renderer.Register(md.KindEmoji, emoji)
}
func emoji(r *renderer.Text, node ast.Node, enter bool) ast.WalkStatus {
n := node.(*md.Emoji)
if enter {
r.Append(Segment{
Start: r.Buffer.Len(),
Emoji: EmojiFromNode(n),
})
}
return ast.WalkContinue
}
const (
InlineSize = 22
LargeSize = 48
)
type Emoji struct {
Name string
EmojiURL string
Large bool
}
var _ text.Imager = (*Emoji)(nil)
func injectSizeURL(fullURL string) string {
u, err := url.Parse(fullURL)
if err != nil {
return fullURL
}
v := u.Query()
v.Set("size", "64")
u.RawQuery = v.Encode()
return u.String()
}
func EmojiFromNode(n *md.Emoji) Emoji {
return Emoji{
Name: n.Name,
Large: n.Large,
EmojiURL: injectSizeURL(n.EmojiURL()),
}
}
func EmojiFromDiscord(e discord.Emoji, large bool) Emoji {
return Emoji{
Name: e.Name,
EmojiURL: injectSizeURL(e.EmojiURL()),
Large: large,
}
}
func (e Emoji) Image() string {
return e.EmojiURL
}
func (e Emoji) ImageSize() (w, h int) {
if e.Large {
return LargeSize, LargeSize
}
return InlineSize, InlineSize
}
func (e Emoji) ImageText() string {
return ":" + e.Name + ":"
}
type Segment struct {
empty.TextSegment
Start int
Emoji Emoji
}
var _ text.Segment = (*Segment)(nil)
func (e Segment) Bounds() (start, end int) {
return e.Start, e.Start
}
func (e Segment) AsImager() text.Imager { return e.Emoji }