mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2025-12-18 20:50:12 +08:00
102 lines
2.2 KiB
Go
102 lines
2.2 KiB
Go
// Package emojimix 合成emoji
|
|
package emojimix
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
ctrl "github.com/FloatTech/zbpctrl"
|
|
"github.com/FloatTech/zbputils/control"
|
|
"github.com/FloatTech/zbputils/ctxext"
|
|
"github.com/sirupsen/logrus"
|
|
zero "github.com/wdvxdr1123/ZeroBot"
|
|
"github.com/wdvxdr1123/ZeroBot/message"
|
|
)
|
|
|
|
const bed = "https://www.gstatic.com/android/keyboard/emojikitchen/%d/u%x/u%x_u%x.png"
|
|
|
|
func init() {
|
|
control.AutoRegister(&ctrl.Options[*zero.Ctx]{
|
|
DisableOnDefault: false,
|
|
Brief: "合成emoji",
|
|
Help: "- [emoji][emoji]",
|
|
}).OnMessage(match).SetBlock(true).Limit(ctxext.LimitByUser).
|
|
Handle(func(ctx *zero.Ctx) {
|
|
r := ctx.State["emojimix"].([]rune)
|
|
logrus.Debugln("[emojimix] match:", r)
|
|
r1, r2 := r[0], r[1]
|
|
u1 := fmt.Sprintf(bed, emojis[r1], r1, r1, r2)
|
|
u2 := fmt.Sprintf(bed, emojis[r2], r2, r2, r1)
|
|
logrus.Debugln("[emojimix] u1:", u1)
|
|
logrus.Debugln("[emojimix] u2:", u2)
|
|
resp1, err := http.Head(u1)
|
|
if err == nil {
|
|
resp1.Body.Close()
|
|
if resp1.StatusCode == http.StatusOK {
|
|
ctx.SendChain(message.Image(u1))
|
|
return
|
|
}
|
|
}
|
|
resp2, err := http.Head(u2)
|
|
if err == nil {
|
|
resp2.Body.Close()
|
|
if resp2.StatusCode == http.StatusOK {
|
|
ctx.SendChain(message.Image(u2))
|
|
return
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
func match(ctx *zero.Ctx) bool {
|
|
logrus.Debugln("[emojimix] msg:", ctx.Event.Message)
|
|
if len(ctx.Event.Message) == 2 {
|
|
r1 := face2emoji(ctx.Event.Message[0])
|
|
if _, ok := emojis[r1]; !ok {
|
|
return false
|
|
}
|
|
r2 := face2emoji(ctx.Event.Message[1])
|
|
if _, ok := emojis[r2]; !ok {
|
|
return false
|
|
}
|
|
ctx.State["emojimix"] = []rune{r1, r2}
|
|
return true
|
|
}
|
|
|
|
r := []rune(ctx.Event.RawMessage)
|
|
logrus.Debugln("[emojimix] raw msg:", ctx.Event.RawMessage)
|
|
if len(r) == 2 {
|
|
if _, ok := emojis[r[0]]; !ok {
|
|
return false
|
|
}
|
|
if _, ok := emojis[r[1]]; !ok {
|
|
return false
|
|
}
|
|
ctx.State["emojimix"] = r
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func face2emoji(face message.Segment) rune {
|
|
if face.Type == "text" {
|
|
r := []rune(face.Data["text"])
|
|
if len(r) != 1 {
|
|
return 0
|
|
}
|
|
return r[0]
|
|
}
|
|
if face.Type != "face" {
|
|
return 0
|
|
}
|
|
id, err := strconv.Atoi(face.Data["id"])
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
if r, ok := message.Emoji[id]; ok {
|
|
return r
|
|
}
|
|
return 0
|
|
}
|