mirror of
https://github.com/woodchen-ink/Oapi-Feishu.git
synced 2025-07-18 05:42:08 +08:00
108 lines
3.0 KiB
Go
108 lines
3.0 KiB
Go
package handlers
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
|
|
"start-feishubot/initialization"
|
|
"start-feishubot/services"
|
|
"start-feishubot/services/openai"
|
|
"start-feishubot/utils"
|
|
|
|
larkim "github.com/larksuite/oapi-sdk-go/v3/service/im/v1"
|
|
)
|
|
|
|
type PicAction struct { /*图片*/
|
|
}
|
|
|
|
func (*PicAction) Execute(a *ActionInfo) bool {
|
|
check := AzureModeCheck(a)
|
|
if !check {
|
|
return true
|
|
}
|
|
// 开启图片创作模式
|
|
if _, foundPic := utils.EitherTrimEqual(a.info.qParsed,
|
|
"/picture", "图片创作"); foundPic {
|
|
a.handler.sessionCache.Clear(*a.info.sessionId)
|
|
a.handler.sessionCache.SetMode(*a.info.sessionId,
|
|
services.ModePicCreate)
|
|
a.handler.sessionCache.SetPicResolution(*a.info.sessionId,
|
|
services.Resolution256)
|
|
sendPicCreateInstructionCard(*a.ctx, a.info.sessionId,
|
|
a.info.msgId)
|
|
return false
|
|
}
|
|
|
|
mode := a.handler.sessionCache.GetMode(*a.info.sessionId)
|
|
//fmt.Println("mode: ", mode)
|
|
|
|
// 收到一张图片,且不在图片创作模式下, 提醒是否切换到图片创作模式
|
|
if a.info.msgType == "image" && mode != services.ModePicCreate {
|
|
sendPicModeCheckCard(*a.ctx, a.info.sessionId, a.info.msgId)
|
|
return false
|
|
}
|
|
|
|
if a.info.msgType == "image" && mode == services.ModePicCreate {
|
|
//保存图片
|
|
imageKey := a.info.imageKey
|
|
//fmt.Printf("fileKey: %s \n", imageKey)
|
|
msgId := a.info.msgId
|
|
//fmt.Println("msgId: ", *msgId)
|
|
req := larkim.NewGetMessageResourceReqBuilder().MessageId(
|
|
*msgId).FileKey(imageKey).Type("image").Build()
|
|
resp, err := initialization.GetLarkClient().Im.MessageResource.Get(context.Background(), req)
|
|
//fmt.Println(resp, err)
|
|
if err != nil {
|
|
//fmt.Println(err)
|
|
replyMsg(*a.ctx, fmt.Sprintf("🤖️:图片下载失败,请稍后再试~\n 错误信息: %v", err),
|
|
a.info.msgId)
|
|
return false
|
|
}
|
|
|
|
f := fmt.Sprintf("%s.png", imageKey)
|
|
resp.WriteFile(f)
|
|
defer os.Remove(f)
|
|
resolution := a.handler.sessionCache.GetPicResolution(*a.
|
|
info.sessionId)
|
|
|
|
openai.ConvertJpegToPNG(f)
|
|
openai.ConvertToRGBA(f, f)
|
|
|
|
//图片校验
|
|
err = openai.VerifyPngs([]string{f})
|
|
if err != nil {
|
|
replyMsg(*a.ctx, fmt.Sprintf("🤖️:无法解析图片,请发送原图并尝试重新操作~"),
|
|
a.info.msgId)
|
|
return false
|
|
}
|
|
bs64, err := a.handler.gpt.GenerateOneImageVariation(f, resolution)
|
|
if err != nil {
|
|
replyMsg(*a.ctx, fmt.Sprintf(
|
|
"🤖️:图片生成失败,请稍后再试~\n错误信息: %v", err), a.info.msgId)
|
|
return false
|
|
}
|
|
replayImagePlainByBase64(*a.ctx, bs64, a.info.msgId)
|
|
return false
|
|
|
|
}
|
|
|
|
// 生成图片
|
|
if mode == services.ModePicCreate {
|
|
resolution := a.handler.sessionCache.GetPicResolution(*a.
|
|
info.sessionId)
|
|
bs64, err := a.handler.gpt.GenerateOneImage(a.info.qParsed,
|
|
resolution)
|
|
if err != nil {
|
|
replyMsg(*a.ctx, fmt.Sprintf(
|
|
"🤖️:图片生成失败,请稍后再试~\n错误信息: %v", err), a.info.msgId)
|
|
return false
|
|
}
|
|
replayImageCardByBase64(*a.ctx, bs64, a.info.msgId, a.info.sessionId,
|
|
a.info.qParsed)
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|