mirror of
https://github.com/woodchen-ink/Oapi-Feishu.git
synced 2025-07-18 05:42:08 +08:00
135 lines
3.3 KiB
Go
135 lines
3.3 KiB
Go
package handlers
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"start-feishubot/initialization"
|
|
"start-feishubot/services"
|
|
"start-feishubot/services/chatgpt"
|
|
"start-feishubot/services/openai"
|
|
"strings"
|
|
|
|
larkcard "github.com/larksuite/oapi-sdk-go/v3/card"
|
|
|
|
larkim "github.com/larksuite/oapi-sdk-go/v3/service/im/v1"
|
|
)
|
|
|
|
// 责任链
|
|
func chain(data *ActionInfo, actions ...Action) bool {
|
|
for _, v := range actions {
|
|
if !v.Execute(data) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
type MessageHandler struct {
|
|
sessionCache services.SessionServiceCacheInterface
|
|
msgCache services.MsgCacheInterface
|
|
gpt *openai.ChatGPT
|
|
config initialization.Config
|
|
}
|
|
|
|
func (m MessageHandler) cardHandler(ctx context.Context,
|
|
cardAction *larkcard.CardAction) (interface{}, error) {
|
|
messageHandler := NewCardHandler(m)
|
|
return messageHandler(ctx, cardAction)
|
|
}
|
|
|
|
func judgeMsgType(event *larkim.P2MessageReceiveV1) (string, error) {
|
|
msgType := event.Event.Message.MessageType
|
|
|
|
switch *msgType {
|
|
case "text", "image", "audio":
|
|
return *msgType, nil
|
|
default:
|
|
return "", fmt.Errorf("unknown message type: %v", *msgType)
|
|
}
|
|
|
|
}
|
|
|
|
func (m MessageHandler) msgReceivedHandler(ctx context.Context, event *larkim.P2MessageReceiveV1) error {
|
|
handlerType := judgeChatType(event)
|
|
if handlerType == "otherChat" {
|
|
fmt.Println("unknown chat type")
|
|
return nil
|
|
}
|
|
//fmt.Println(larkcore.Prettify(event.Event.Message))
|
|
|
|
msgType, err := judgeMsgType(event)
|
|
if err != nil {
|
|
fmt.Printf("error getting message type: %v\n", err)
|
|
return nil
|
|
}
|
|
|
|
content := event.Event.Message.Content
|
|
msgId := event.Event.Message.MessageId
|
|
rootId := event.Event.Message.RootId
|
|
chatId := event.Event.Message.ChatId
|
|
mention := event.Event.Message.Mentions
|
|
|
|
sessionId := rootId
|
|
if sessionId == nil || *sessionId == "" {
|
|
sessionId = msgId
|
|
}
|
|
msgInfo := MsgInfo{
|
|
handlerType: handlerType,
|
|
msgType: msgType,
|
|
msgId: msgId,
|
|
userId: *event.Event.Sender.SenderId.UserId,
|
|
chatId: chatId,
|
|
qParsed: strings.Trim(parseContent(*content), " "),
|
|
fileKey: parseFileKey(*content),
|
|
imageKey: parseImageKey(*content),
|
|
sessionId: sessionId,
|
|
mention: mention,
|
|
}
|
|
data := &ActionInfo{
|
|
ctx: &ctx,
|
|
handler: &m,
|
|
info: &msgInfo,
|
|
}
|
|
actions := []Action{
|
|
&ProcessedUniqueAction{}, //避免重复处理
|
|
&ProcessMentionAction{}, //判断机器人是否应该被调用
|
|
&EmptyAction{}, //空消息处理
|
|
&ClearAction{}, //清除消息处理
|
|
&HelpAction{}, //帮助处理
|
|
&MessageAction{
|
|
chatgpt: chatgpt.NewGpt3(&m.config),
|
|
}, //消息处理
|
|
}
|
|
|
|
chain(data, actions...)
|
|
return nil
|
|
}
|
|
|
|
var _ MessageHandlerInterface = (*MessageHandler)(nil)
|
|
|
|
func NewMessageHandler(gpt *openai.ChatGPT,
|
|
config initialization.Config) MessageHandlerInterface {
|
|
return &MessageHandler{
|
|
sessionCache: services.GetSessionCache(),
|
|
msgCache: services.GetMsgCache(),
|
|
gpt: gpt,
|
|
config: config,
|
|
}
|
|
}
|
|
|
|
func (m MessageHandler) judgeIfMentionMe(mention []*larkim.
|
|
MentionEvent) bool {
|
|
if len(mention) != 1 {
|
|
return false
|
|
}
|
|
return *mention[0].Name == m.config.FeishuBotName
|
|
}
|
|
|
|
func AzureModeCheck(a *ActionInfo) bool {
|
|
if a.handler.config.AzureOn {
|
|
//sendMsg(*a.ctx, "Azure Openai 接口下,暂不支持此功能", a.info.chatId)
|
|
return false
|
|
}
|
|
return true
|
|
}
|