2024-01-28 01:20:44 +08:00

137 lines
3.4 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{}, //清除消息处理
&RoleListAction{}, //角色列表处理
&HelpAction{}, //帮助处理
&RolePlayAction{}, //角色扮演处理
&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
}