public.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package public
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/eryajf/chatgpt-dingtalk/config"
  6. "github.com/eryajf/chatgpt-dingtalk/pkg/cache"
  7. "github.com/eryajf/chatgpt-dingtalk/pkg/db"
  8. "github.com/eryajf/chatgpt-dingtalk/pkg/dingbot"
  9. "github.com/eryajf/chatgpt-dingtalk/pkg/logger"
  10. )
  11. var UserService cache.UserServiceInterface
  12. var Config *config.Configuration
  13. var Prompt *[]config.Prompt
  14. func InitSvc() {
  15. // 加载配置
  16. Config = config.LoadConfig()
  17. // 加载prompt
  18. Prompt = config.LoadPrompt()
  19. // 初始化缓存
  20. UserService = cache.NewUserService()
  21. // 初始化数据库
  22. db.InitDB()
  23. // 暂时不在初始化时获取余额
  24. // if Config.Model == openai.GPT3Dot5Turbo0301 || Config.Model == openai.GPT3Dot5Turbo {
  25. // _, _ = GetBalance()
  26. // }
  27. }
  28. func FirstCheck(rmsg *dingbot.ReceiveMsg) bool {
  29. lc := UserService.GetUserMode(rmsg.GetSenderIdentifier())
  30. if lc == "" {
  31. if Config.DefaultMode == "串聊" {
  32. return true
  33. } else {
  34. return false
  35. }
  36. }
  37. if lc != "" && strings.Contains(lc, "串聊") {
  38. return true
  39. }
  40. return false
  41. }
  42. // ProcessRequest 分析处理请求逻辑
  43. // 主要提供单日请求限额的功能
  44. func CheckRequest(rmsg *dingbot.ReceiveMsg) bool {
  45. if Config.MaxRequest == 0 {
  46. return true
  47. }
  48. count := UserService.GetUseRequestCount(rmsg.GetSenderIdentifier())
  49. // 判断访问次数是否超过限制
  50. if count >= Config.MaxRequest {
  51. logger.Info(fmt.Sprintf("亲爱的: %s,您今日请求次数已达上限,请明天再来,交互发问资源有限,请务必斟酌您的问题,给您带来不便,敬请谅解!", rmsg.SenderNick))
  52. _, err := rmsg.ReplyToDingtalk(string(dingbot.TEXT), fmt.Sprintf("一个好的问题,胜过十个好的答案!\n亲爱的: %s,您今日请求次数已达上限,请明天再来,交互发问资源有限,请务必斟酌您的问题,给您带来不便,敬请谅解!", rmsg.SenderNick))
  53. if err != nil {
  54. logger.Warning(fmt.Errorf("send message error: %v", err))
  55. }
  56. return false
  57. }
  58. // 访问次数未超过限制,将计数加1
  59. UserService.SetUseRequestCount(rmsg.GetSenderIdentifier(), count+1)
  60. return true
  61. }
  62. var Welcome string = `# 发送信息
  63. 若您想给机器人发送信息,有如下两种方式:
  64. 1. 在本机器人所在群里@机器人;
  65. 2. 点击机器人的头像后,再点击"发消息"。
  66. 机器人收到您的信息后,默认会交给chatgpt进行处理。除非,您发送的内容是如下**系统指令**之一。
  67. -----
  68. # 系统指令
  69. 系统指令是一些特殊的词语,当您向机器人发送这些词语时,会触发对应的功能:
  70. **单聊**:每条消息都是单独的对话,不包含上下文
  71. **串聊**:对话会携带上下文,除非您主动重置对话或对话长度超过限制
  72. **重置**:重置上下文
  73. **余额**:查询机器人所用OpenAI账号的余额
  74. **模板**:查询机器人内置的快捷模板
  75. **图片**:查看如何根据提示词生成图片
  76. **帮助**:重新获取帮助信息
  77. -----
  78. # 友情提示
  79. 使用"串聊模式"会显著加快机器人所用账号的余额消耗速度。
  80. 因此,若无保留上下文的需求,建议使用"单聊模式"。
  81. 即使有保留上下文的需求,也应适时使用"重置"指令来重置上下文。
  82. -----
  83. # 项目地址
  84. 本项目已在GitHub开源,[查看源代码](https://github.com/eryajf/chatgpt-dingtalk)。
  85. `