Sfoglia il codice sorgente

feat: 优化与钉钉机器人交互相关的一些细节 (#60)

iblogc 2 anni fa
parent
commit
addb086c91
2 ha cambiato i file con 32 aggiunte e 25 eliminazioni
  1. 22 23
      main.go
  2. 10 2
      public/dingtalk.go

+ 22 - 23
main.go

@@ -26,7 +26,7 @@ func main() {
 var Welcome string = `Commands:
 =================================
 🙋 单聊 👉 单独聊天,缺省
-🗣 串聊 👉 带上下文聊天
+📣 串聊 👉 带上下文聊天
 🔃 重置 👉 重置带上下文聊天
 🚀 帮助 👉 显示帮助信息
 =================================
@@ -59,9 +59,9 @@ func Start() {
 			return
 		}
 		// TODO: 校验请求
-		if len(msgObj.Text.Content) == 1 || msgObj.Text.Content == " 帮助" {
+		if len(msgObj.Text.Content) == 1 || strings.TrimSpace(msgObj.Text.Content) == "帮助" {
 			// 欢迎信息
-			msgObj.ReplyText(Welcome)
+			msgObj.ReplyText(Welcome, msgObj.SenderStaffId)
 		} else {
 			logger.Info(fmt.Sprintf("dingtalk callback parameters: %#v", msgObj))
 			err = ProcessRequest(*msgObj)
@@ -86,7 +86,7 @@ func Start() {
 }
 
 func FirstCheck(rmsg public.ReceiveMsg) bool {
-	lc := UserService.GetUserMode(rmsg.SenderNick)
+	lc := UserService.GetUserMode(rmsg.SenderStaffId)
 	if lc != "" && strings.Contains(lc, "串聊") {
 		return true
 	}
@@ -94,27 +94,28 @@ func FirstCheck(rmsg public.ReceiveMsg) bool {
 }
 
 func ProcessRequest(rmsg public.ReceiveMsg) error {
-	switch rmsg.Text.Content {
-	case " 单聊":
-		UserService.SetUserMode(rmsg.SenderNick, rmsg.Text.Content)
-		rmsg.ReplyText(fmt.Sprintf("=====现在进入与👉%s👈单聊的模式 =====", rmsg.SenderNick))
-	case " 串聊":
-		UserService.SetUserMode(rmsg.SenderNick, rmsg.Text.Content)
-		rmsg.ReplyText(fmt.Sprintf("=====现在进入与👉%s👈串聊的模式 =====", rmsg.SenderNick))
-	case " 重置":
-		UserService.ClearUserMode(rmsg.SenderNick)
-		err := os.Remove("openaiCache/" + rmsg.SenderNick)
+	content := strings.TrimSpace(rmsg.Text.Content)
+	switch content {
+	case "单聊":
+		UserService.SetUserMode(rmsg.SenderStaffId, rmsg.Text.Content)
+		rmsg.ReplyText(fmt.Sprintf("=====现在进入与👉%s👈单聊的模式 =====", rmsg.SenderNick), rmsg.SenderStaffId)
+	case "串聊":
+		UserService.SetUserMode(rmsg.SenderStaffId, rmsg.Text.Content)
+		rmsg.ReplyText(fmt.Sprintf("=====现在进入与👉%s👈串聊的模式 =====", rmsg.SenderNick), rmsg.SenderStaffId)
+	case "重置":
+		UserService.ClearUserMode(rmsg.SenderStaffId)
+		err := os.Remove("openaiCache/" + rmsg.SenderStaffId)
 		if err != nil && !strings.Contains(fmt.Sprintf("%s", err), "no such file or directory") {
-			rmsg.ReplyText(fmt.Sprintf("=====清理与👉%s👈的对话缓存失败,错误信息: %v\n请检查=====", rmsg.SenderNick, err))
+			rmsg.ReplyText(fmt.Sprintf("=====清理与👉%s👈的对话缓存失败,错误信息: %v\n请检查=====", rmsg.SenderNick, err), rmsg.SenderStaffId)
 		} else {
-			rmsg.ReplyText(fmt.Sprintf("=====已重置与👉%s👈的对话模式,可以开始新的对话=====", rmsg.SenderNick))
+			rmsg.ReplyText(fmt.Sprintf("=====已重置与👉%s👈的对话模式,可以开始新的对话=====", rmsg.SenderNick), rmsg.SenderStaffId)
 		}
 	default:
 		if FirstCheck(rmsg) {
-			cli, reply, err := public.ContextQa(rmsg.Text.Content, rmsg.SenderNick)
+			cli, reply, err := public.ContextQa(rmsg.Text.Content, rmsg.SenderStaffId)
 			if err != nil {
 				logger.Info("gpt request error: %v \n", err)
-				_, err = rmsg.ReplyText(fmt.Sprintf("请求openai失败了,错误信息:%v", err))
+				_, err = rmsg.ReplyText(fmt.Sprintf("请求openai失败了,错误信息:%v", err), rmsg.SenderStaffId)
 				if err != nil {
 					logger.Warning("send message error: %v \n", err)
 					return err
@@ -127,8 +128,7 @@ func ProcessRequest(rmsg public.ReceiveMsg) error {
 				reply = strings.TrimSpace(reply)
 				reply = strings.Trim(reply, "\n")
 				// 回复@我的用户
-				replyText := "@" + rmsg.SenderNick + "\n" + reply
-				_, err = rmsg.ReplyText(replyText)
+				_, err = rmsg.ReplyText(reply, rmsg.SenderStaffId)
 				if err != nil {
 					logger.Warning("send message error: %v \n", err)
 					return err
@@ -140,7 +140,7 @@ func ProcessRequest(rmsg public.ReceiveMsg) error {
 			reply, err := public.SingleQa(rmsg.Text.Content, rmsg.SenderNick)
 			if err != nil {
 				logger.Info("gpt request error: %v \n", err)
-				_, err = rmsg.ReplyText(fmt.Sprintf("请求openai失败了,错误信息:%v", err))
+				_, err = rmsg.ReplyText(fmt.Sprintf("请求openai失败了,错误信息:%v", err), rmsg.SenderStaffId)
 				if err != nil {
 					logger.Warning("send message error: %v \n", err)
 					return err
@@ -153,8 +153,7 @@ func ProcessRequest(rmsg public.ReceiveMsg) error {
 				reply = strings.TrimSpace(reply)
 				reply = strings.Trim(reply, "\n")
 				// 回复@我的用户
-				replyText := "@" + rmsg.SenderNick + "\n" + reply
-				_, err = rmsg.ReplyText(replyText)
+				_, err = rmsg.ReplyText(reply, rmsg.SenderStaffId)
 				if err != nil {
 					logger.Warning("send message error: %v \n", err)
 					return err

+ 10 - 2
public/dingtalk.go

@@ -16,6 +16,7 @@ type ReceiveMsg struct {
 	MsgID                     string `json:"msgId"`
 	SenderNick                string `json:"senderNick"`
 	IsAdmin                   bool   `json:"isAdmin"`
+	SenderStaffId             string `json:"senderStaffId"`
 	SessionWebhookExpiredTime int64  `json:"sessionWebhookExpiredTime"`
 	CreateAt                  int64  `json:"createAt"`
 	ConversationType          string `json:"conversationType"`
@@ -28,10 +29,12 @@ type ReceiveMsg struct {
 	Msgtype                   string `json:"msgtype"`
 }
 
+
 // 发送的消息体
 type SendMsg struct {
 	Text    Text   `json:"text"`
 	Msgtype string `json:"msgtype"`
+	At 		At `json:"at"`
 }
 
 // 消息内容
@@ -39,10 +42,15 @@ type Text struct {
 	Content string `json:"content"`
 }
 
+// at 内容
+type At struct {
+	AtUserIds []string `json:"atUserIds"`
+}
+
 // 发消息给钉钉
-func (r ReceiveMsg) ReplyText(msg string) (statuscode int, err error) {
+func (r ReceiveMsg) ReplyText(msg string, staffId string) (statuscode int, err error) {
 	// 定义消息
-	msgtmp := &SendMsg{Text: Text{Content: msg}, Msgtype: "text"}
+	msgtmp := &SendMsg{Text: Text{Content: msg}, Msgtype: "text", At: At{AtUserIds: []string{staffId}}}
 	data, err := json.Marshal(msgtmp)
 	if err != nil {
 		return 0, err