db.go 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package process
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. "github.com/eryajf/chatgpt-dingtalk/pkg/db"
  7. "github.com/eryajf/chatgpt-dingtalk/pkg/dingbot"
  8. "github.com/eryajf/chatgpt-dingtalk/pkg/logger"
  9. "github.com/eryajf/chatgpt-dingtalk/public"
  10. )
  11. // 与数据库交互的请求处理在此
  12. // SelectHistory 查询会话历史
  13. func SelectHistory(rmsg *dingbot.ReceiveMsg) error {
  14. name := strings.TrimSpace(strings.Split(rmsg.Text.Content, ":")[1])
  15. if !public.JudgeAdminUsers(rmsg.SenderStaffId) {
  16. _, err := rmsg.ReplyToDingtalk(string(dingbot.MARKDOWN), "**🤷 抱歉,您没有查询对话记录的权限,只有程序管理员可以查询!**")
  17. if err != nil {
  18. logger.Error(fmt.Errorf("send message error: %v", err))
  19. return err
  20. }
  21. return nil
  22. }
  23. // 获取数据列表
  24. var chat db.Chat
  25. if !chat.Exist(map[string]interface{}{"username": name}) {
  26. _, err := rmsg.ReplyToDingtalk(string(dingbot.TEXT), "用户名错误,这个用户不存在,请核实之后再进行查询")
  27. if err != nil {
  28. logger.Error(fmt.Errorf("send message error: %v", err))
  29. return err
  30. }
  31. return fmt.Errorf("用户名错误,这个用户不存在,请核实之后重新查询")
  32. }
  33. chats, err := chat.List(db.ChatListReq{
  34. Username: name,
  35. })
  36. if err != nil {
  37. return err
  38. }
  39. var rst string
  40. for _, chatTmp := range chats {
  41. ctime := chatTmp.CreatedAt.Format("2006-01-02 15:04:05")
  42. if chatTmp.ChatType == 1 {
  43. rst += fmt.Sprintf("## 🙋 %s 问\n\n**时间:** %v\n\n**问题为:** %s\n\n", chatTmp.Username, ctime, chatTmp.Content)
  44. } else {
  45. rst += fmt.Sprintf("## 🤖 机器人 答\n\n**时间:** %v\n\n**回答如下:** \n\n%s\n\n", ctime, chatTmp.Content)
  46. }
  47. // TODO: 答案应该严格放在问题之后,目前只根据ID排序进行的陈列,当一个用户同时提出多个问题时,最终展示的可能会有点问题
  48. }
  49. fileName := time.Now().Format("20060102-150405") + ".md"
  50. // 写入文件
  51. if err = public.WriteToFile("./data/chatHistory/"+fileName, []byte(rst)); err != nil {
  52. return err
  53. }
  54. // 回复@我的用户
  55. reply := fmt.Sprintf("- 在线查看: [点我](%s)\n- 下载文件: [点我](%s)\n- 在线预览请安装插件:[Markdown Preview Plus](https://chrome.google.com/webstore/detail/markdown-preview-plus/febilkbfcbhebfnokafefeacimjdckgl)", public.Config.ServiceURL+"/history/"+fileName, public.Config.ServiceURL+"/download/"+fileName)
  56. logger.Info(fmt.Sprintf("🤖 %s 得到的答案: %#v", rmsg.SenderNick, reply))
  57. _, err = rmsg.ReplyToDingtalk(string(dingbot.MARKDOWN), reply)
  58. if err != nil {
  59. logger.Error(fmt.Errorf("send message error: %v", err))
  60. return err
  61. }
  62. return nil
  63. }