2024-01-28 00:43:59 +08:00

100 lines
2.7 KiB
Go

package commands
import (
"github.com/go-zoox/chatgpt-for-chatbot-feishu/config"
"github.com/go-zoox/core-utils/fmt"
"github.com/go-zoox/feishu"
"github.com/go-zoox/feishu/contact/user"
feishuEvent "github.com/go-zoox/feishu/event"
mc "github.com/go-zoox/feishu/message/content"
)
func replyText(reply func(content string, msgType ...string) error, text string) error {
msgType, content, err := mc.
NewContent().
Post(&mc.ContentTypePost{
ZhCN: &mc.ContentTypePostBody{
Content: [][]mc.ContentTypePostBodyItem{
{
{
Tag: "text",
UnEscape: true,
Text: text,
},
},
},
},
}).
Build()
if err != nil {
return fmt.Errorf("failed to build content: %v", err)
}
if err := reply(string(content), msgType); err != nil {
return fmt.Errorf("failed to reply: %v", err)
}
return nil
}
func replyImage(reply func(content string, msgType ...string) error, imageKey string) error {
msgType, content, err := mc.
NewContent().
Image(&mc.ContentTypeImage{
ImageKey: imageKey,
}).
Build()
if err != nil {
return fmt.Errorf("failed to build content: %v", err)
}
if err := reply(string(content), msgType); err != nil {
return fmt.Errorf("failed to reply: %v", err)
}
return nil
}
func isAllowToDo(feishuClient feishu.Client, cfg *config.Config, request *feishuEvent.EventRequest, command string) (reason error) {
if cfg.AdminEmail != "" {
eventSender, err := feishuClient.Contact().User().Retrieve(&user.RetrieveRequest{
UserIDType: "open_id",
UserID: request.Sender().SenderID.OpenID,
})
if err != nil {
return fmt.Errorf("failed to retrieve user with openid(%s): %v", request.Sender().SenderID.OpenID, err)
}
if eventSender.User.EnterpriseEmail != cfg.AdminEmail && eventSender.User.Email != cfg.AdminEmail {
return fmt.Errorf("user(%s) is not allow to do action: %s", eventSender.User.Name, command)
}
return nil
}
return fmt.Errorf("admin email is not set, not allow to do action: %s", command)
}
func getUser(feishuClient feishu.Client, request *feishuEvent.EventRequest, cfg *config.Config) (*user.RetrieveResponse, error) {
sender := request.Sender()
if cfg.AdminEmail != "" {
eventSender, err := feishuClient.Contact().User().Retrieve(&user.RetrieveRequest{
UserIDType: "open_id",
UserID: sender.SenderID.OpenID,
})
if err != nil {
return nil, fmt.Errorf("failed to retrieve user with openid(%s): %v", sender.SenderID.OpenID, err)
}
return eventSender, nil
}
return &user.RetrieveResponse{
User: user.UserEntity{
Name: sender.SenderID.UserID,
OpenID: sender.SenderID.OpenID,
UnionID: sender.SenderID.UnionID,
UserID: sender.SenderID.UserID,
},
}, nil
}