process_request.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package process
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. "github.com/eryajf/chatgpt-dingtalk/public"
  7. "github.com/eryajf/chatgpt-dingtalk/public/logger"
  8. "github.com/solywsh/chatgpt"
  9. )
  10. // ProcessRequest 分析处理请求逻辑
  11. func ProcessRequest(rmsg public.ReceiveMsg) error {
  12. if CheckRequest(rmsg) {
  13. content := strings.TrimSpace(rmsg.Text.Content)
  14. switch content {
  15. case "单聊":
  16. public.UserService.SetUserMode(rmsg.SenderStaffId, content)
  17. _, err := rmsg.ReplyText(fmt.Sprintf("=====现在进入与👉%s👈单聊的模式 =====", rmsg.SenderNick), rmsg.SenderStaffId)
  18. if err != nil {
  19. logger.Warning(fmt.Errorf("send message error: %v", err))
  20. }
  21. case "串聊":
  22. public.UserService.SetUserMode(rmsg.SenderStaffId, content)
  23. _, err := rmsg.ReplyText(fmt.Sprintf("=====现在进入与👉%s👈串聊的模式 =====", rmsg.SenderNick), rmsg.SenderStaffId)
  24. if err != nil {
  25. logger.Warning(fmt.Errorf("send message error: %v", err))
  26. }
  27. case "重置":
  28. public.UserService.ClearUserMode(rmsg.SenderStaffId)
  29. public.UserService.ClearUserSessionContext(rmsg.SenderStaffId)
  30. _, err := rmsg.ReplyText(fmt.Sprintf("=====已重置与👉%s👈的对话模式,可以开始新的对话=====", rmsg.SenderNick), rmsg.SenderStaffId)
  31. if err != nil {
  32. logger.Warning(fmt.Errorf("send message error: %v", err))
  33. }
  34. case "模板":
  35. _, err := rmsg.ReplyText(fmt.Sprintf("%s 您好,当前程序内置集成了这些prompt:\n====================================\n| #周报 | #前端 | #架构师 | #产品经理 | #网络安全 | #正则 | #招聘 | #知乎 | #翻译 | #小红书 | #解梦 | \n====================================\n你可以选择某个prompt开头,然后进行对话。\n以周报为例,可发送 #周报 我本周用Go写了一个钉钉集成ChatGPT的聊天应用", rmsg.SenderNick), rmsg.SenderStaffId)
  36. if err != nil {
  37. logger.Warning(fmt.Errorf("send message error: %v", err))
  38. }
  39. case "余额":
  40. cacheMsg := public.UserService.GetUserMode("system_balance")
  41. if cacheMsg == "" {
  42. rst, err := public.GetBalance()
  43. if err != nil {
  44. logger.Warning(fmt.Errorf("get balance error: %v", err))
  45. return err
  46. }
  47. t1 := time.Unix(int64(rst.Grants.Data[0].EffectiveAt), 0)
  48. t2 := time.Unix(int64(rst.Grants.Data[0].ExpiresAt), 0)
  49. cacheMsg = fmt.Sprintf("💵 已用: 💲%v\n💵 剩余: 💲%v\n⏳ 有效时间: 从 %v 到 %v\n", fmt.Sprintf("%.2f", rst.TotalUsed), fmt.Sprintf("%.2f", rst.TotalAvailable), t1.Format("2006-01-02 15:04:05"), t2.Format("2006-01-02 15:04:05"))
  50. }
  51. _, err := rmsg.ReplyText(cacheMsg, rmsg.SenderStaffId)
  52. if err != nil {
  53. logger.Warning(fmt.Errorf("send message error: %v", err))
  54. }
  55. default:
  56. if public.FirstCheck(rmsg) {
  57. return Do("串聊", rmsg)
  58. } else {
  59. return Do("单聊", rmsg)
  60. }
  61. }
  62. }
  63. return nil
  64. }
  65. // 执行处理请求
  66. func Do(mode string, rmsg public.ReceiveMsg) error {
  67. // 先把模式注入
  68. public.UserService.SetUserMode(rmsg.SenderStaffId, mode)
  69. switch mode {
  70. case "单聊":
  71. reply, err := chatgpt.SingleQa(rmsg.Text.Content, rmsg.SenderStaffId)
  72. if err != nil {
  73. logger.Info(fmt.Errorf("gpt request error: %v", err))
  74. if strings.Contains(fmt.Sprintf("%v", err), "maximum text length exceeded") {
  75. public.UserService.ClearUserSessionContext(rmsg.SenderStaffId)
  76. _, err = rmsg.ReplyText(fmt.Sprintf("请求openai失败了,错误信息:%v,看起来是超过最大对话限制了,已自动重置您的对话", err), rmsg.SenderStaffId)
  77. if err != nil {
  78. logger.Warning(fmt.Errorf("send message error: %v", err))
  79. return err
  80. }
  81. } else {
  82. _, err = rmsg.ReplyText(fmt.Sprintf("请求openai失败了,错误信息:%v", err), rmsg.SenderStaffId)
  83. if err != nil {
  84. logger.Warning(fmt.Errorf("send message error: %v", err))
  85. return err
  86. }
  87. }
  88. }
  89. if reply == "" {
  90. logger.Warning(fmt.Errorf("get gpt result falied: %v", err))
  91. return nil
  92. } else {
  93. reply = strings.TrimSpace(reply)
  94. reply = strings.Trim(reply, "\n")
  95. // 回复@我的用户
  96. // fmt.Println("单聊结果是:", reply)
  97. _, err = rmsg.ReplyText(reply, rmsg.SenderStaffId)
  98. if err != nil {
  99. logger.Warning(fmt.Errorf("send message error: %v", err))
  100. return err
  101. }
  102. }
  103. case "串聊":
  104. cli, reply, err := chatgpt.ContextQa(rmsg.Text.Content, rmsg.SenderStaffId)
  105. if err != nil {
  106. logger.Info(fmt.Sprintf("gpt request error: %v", err))
  107. if strings.Contains(fmt.Sprintf("%v", err), "maximum text length exceeded") {
  108. public.UserService.ClearUserSessionContext(rmsg.SenderStaffId)
  109. _, err = rmsg.ReplyText(fmt.Sprintf("请求openai失败了,错误信息:%v,看起来是超过最大对话限制了,已自动重置您的对话", err), rmsg.SenderStaffId)
  110. if err != nil {
  111. logger.Warning(fmt.Errorf("send message error: %v", err))
  112. return err
  113. }
  114. } else {
  115. _, err = rmsg.ReplyText(fmt.Sprintf("请求openai失败了,错误信息:%v", err), rmsg.SenderStaffId)
  116. if err != nil {
  117. logger.Warning(fmt.Errorf("send message error: %v", err))
  118. return err
  119. }
  120. }
  121. }
  122. if reply == "" {
  123. logger.Warning(fmt.Errorf("get gpt result falied: %v", err))
  124. return nil
  125. } else {
  126. reply = strings.TrimSpace(reply)
  127. reply = strings.Trim(reply, "\n")
  128. // 回复@我的用户
  129. _, err = rmsg.ReplyText(reply, rmsg.SenderStaffId)
  130. if err != nil {
  131. logger.Warning(fmt.Errorf("send message error: %v", err))
  132. return err
  133. }
  134. _ = cli.ChatContext.SaveConversation(rmsg.SenderStaffId)
  135. }
  136. default:
  137. }
  138. return nil
  139. }
  140. // ProcessRequest 分析处理请求逻辑
  141. func CheckRequest(rmsg public.ReceiveMsg) bool {
  142. if public.Config.MaxRequest == 0 {
  143. return true
  144. }
  145. count := public.UserService.GetUseRequestCount(rmsg.SenderStaffId)
  146. // 判断访问次数是否超过限制
  147. if count >= public.Config.MaxRequest {
  148. logger.Info(fmt.Sprintf("亲爱的: %s,您今日请求次数已达上限,请明天再来,交互发问资源有限,请务必斟酌您的问题,给您带来不便,敬请谅解!", rmsg.SenderNick))
  149. _, err := rmsg.ReplyText(fmt.Sprintf("一个好的问题,胜过十个好的答案!\n亲爱的: %s,您今日请求次数已达上限,请明天再来,交互发问资源有限,请务必斟酌您的问题,给您带来不便,敬请谅解!", rmsg.SenderNick), rmsg.SenderStaffId)
  150. if err != nil {
  151. logger.Warning(fmt.Errorf("send message error: %v", err))
  152. }
  153. return false
  154. }
  155. // 访问次数未超过限制,将计数加1
  156. public.UserService.SetUseRequestCount(rmsg.SenderStaffId, count+1)
  157. return true
  158. }