Browse Source

feat: 调整log库以及其他包的组织目录 (#132)

二丫讲梵 2 years ago
parent
commit
53e27ee145
12 changed files with 106 additions and 84 deletions
  1. 1 0
      README.md
  2. 5 5
      config/config.go
  3. 11 1
      go.mod
  4. 24 11
      go.sum
  5. 5 3
      main.go
  6. 1 1
      pkg/chatgpt/export.go
  7. 1 1
      public/dingtalk.go
  8. 33 0
      pkg/logger/logger.go
  9. 19 18
      pkg/process/process_request.go
  10. 1 0
      public/gpt.go
  11. 0 40
      public/logger/logger.go
  12. 5 4
      public/public.go

+ 1 - 0
README.md

@@ -347,6 +347,7 @@ $ go run main.go
 - [xgfone/ship](https://github.com/xgfone/ship)
 - [avast/retry-go](https://github.com/avast/retry-go)
 - [sashabaranov/go-openapi](https://github.com/sashabaranov/go-openai)
+- [charmbracelet/log](https://github.com/charmbracelet/log)
 
 ## 赞赏
 

+ 5 - 5
config/config.go

@@ -8,7 +8,7 @@ import (
 	"sync"
 	"time"
 
-	"github.com/eryajf/chatgpt-dingtalk/public/logger"
+	"github.com/eryajf/chatgpt-dingtalk/pkg/logger"
 )
 
 // Configuration 项目配置
@@ -43,7 +43,7 @@ func LoadConfig() *Configuration {
 		config = &Configuration{}
 		f, err := os.Open("config.json")
 		if err != nil {
-			logger.Danger(fmt.Errorf("open config err: %+v", err))
+			logger.Fatal(fmt.Errorf("open config err: %+v", err))
 			return
 		}
 		defer f.Close()
@@ -72,7 +72,7 @@ func LoadConfig() *Configuration {
 		if sessionTimeout != "" {
 			duration, err := strconv.ParseInt(sessionTimeout, 10, 64)
 			if err != nil {
-				logger.Danger(fmt.Sprintf("config session timeout err: %v ,get is %v", err, sessionTimeout))
+				logger.Fatal(fmt.Sprintf("config session timeout err: %v ,get is %v", err, sessionTimeout))
 				return
 			}
 			config.SessionTimeout = time.Duration(duration) * time.Second
@@ -109,10 +109,10 @@ func LoadConfig() *Configuration {
 		config.Port = "8090"
 	}
 	if config.ApiKey == "" {
-		logger.Danger("config err: api key required")
+		logger.Fatal("config err: api key required")
 	}
 	if config.ServiceURL == "" {
-		logger.Danger("config err: service url required")
+		logger.Fatal("config err: service url required")
 	}
 	return config
 }

+ 11 - 1
go.mod

@@ -3,6 +3,7 @@ module github.com/eryajf/chatgpt-dingtalk
 go 1.18
 
 require (
+	github.com/charmbracelet/log v0.2.1
 	github.com/go-resty/resty/v2 v2.7.0
 	github.com/patrickmn/go-cache v2.1.0+incompatible
 	github.com/solywsh/chatgpt v0.0.14
@@ -12,9 +13,18 @@ require (
 
 require (
 	github.com/avast/retry-go v2.7.0+incompatible // indirect
+	github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
+	github.com/charmbracelet/lipgloss v0.7.1 // indirect
+	github.com/go-logfmt/logfmt v0.6.0 // indirect
+	github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
+	github.com/mattn/go-isatty v0.0.18 // indirect
+	github.com/mattn/go-runewidth v0.0.14 // indirect
+	github.com/muesli/reflow v0.3.0 // indirect
+	github.com/muesli/termenv v0.15.1 // indirect
+	github.com/rivo/uniseg v0.2.0 // indirect
 	github.com/sashabaranov/go-openai v1.5.3 // indirect
-	github.com/stretchr/testify v1.8.2 // indirect
 	golang.org/x/net v0.0.0-20211029224645-99673261e6eb // indirect
+	golang.org/x/sys v0.6.0 // indirect
 )
 
 replace github.com/solywsh/chatgpt => ./pkg/chatgpt

+ 24 - 11
go.sum

@@ -1,29 +1,44 @@
 github.com/avast/retry-go v2.7.0+incompatible h1:XaGnzl7gESAideSjr+I8Hki/JBi+Yb9baHlMRPeSC84=
 github.com/avast/retry-go v2.7.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
+github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
+github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E=
+github.com/charmbracelet/lipgloss v0.7.1/go.mod h1:yG0k3giv8Qj8edTCbbg6AlQ5e8KNWpFujkNawKNhE2c=
+github.com/charmbracelet/log v0.2.1 h1:1z7jpkk4yKyjwlmKmKMM5qnEDSpV32E7XtWhuv0mTZE=
+github.com/charmbracelet/log v0.2.1/go.mod h1:GwFfjewhcVDWLrpAbY5A0Hin9YOlEn40eWT4PNaxFT4=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
+github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY=
 github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I=
+github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
+github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
+github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98=
+github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
+github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU=
+github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
+github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
+github.com/muesli/termenv v0.15.1 h1:UzuTb/+hhlBugQz28rpzey4ZuKcZ03MeKsoG7IJZIxs=
+github.com/muesli/termenv v0.15.1/go.mod h1:HeAQPTzpfs016yGtA4g00CsdYnVLJvxsS4ANqrZs2sQ=
 github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
 github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
+github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 github.com/sashabaranov/go-openai v1.5.3 h1:o6n6dj0h9u+5mE1m+D8eT0zYhh7229o8ymDd2zDwAXU=
 github.com/sashabaranov/go-openai v1.5.3/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
-github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
-github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
-github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/xgfone/ship/v5 v5.3.1 h1:e5qhMT6DSQOE6A/xDBL/Ftf28BGptNw6Etq+w+pme6E=
 github.com/xgfone/ship/v5 v5.3.1/go.mod h1:mGI+65lLL3kaOseMkWUYgy+OFl27WV2LY1NSsecu/9g=
 golang.org/x/net v0.0.0-20211029224645-99673261e6eb h1:pirldcYWx7rx7kE5r+9WsOXPXK0+WH5+uZ7uPmJ44uM=
 golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -31,6 +46,4 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
-gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

+ 5 - 3
main.go

@@ -5,9 +5,10 @@ import (
 	"path/filepath"
 	"strings"
 
+	"github.com/eryajf/chatgpt-dingtalk/pkg/dingbot"
+	"github.com/eryajf/chatgpt-dingtalk/pkg/logger"
 	"github.com/eryajf/chatgpt-dingtalk/pkg/process"
 	"github.com/eryajf/chatgpt-dingtalk/public"
-	"github.com/eryajf/chatgpt-dingtalk/public/logger"
 	"github.com/xgfone/ship/v5"
 )
 
@@ -35,7 +36,7 @@ var Welcome string = `Commands:
 func Start() {
 	app := ship.Default()
 	app.Route("/").POST(func(c *ship.Context) error {
-		var msgObj public.ReceiveMsg
+		var msgObj dingbot.ReceiveMsg
 		err := c.Bind(&msgObj)
 		if err != nil {
 			return ship.ErrBadRequest.New(fmt.Errorf("bind to receivemsg failed : %v", err))
@@ -50,7 +51,7 @@ func Start() {
 		// TODO: 校验请求
 		if len(msgObj.Text.Content) == 1 || strings.TrimSpace(msgObj.Text.Content) == "帮助" {
 			// 欢迎信息
-			_, err := msgObj.ReplyToDingtalk(string(public.TEXT), Welcome)
+			_, err := msgObj.ReplyToDingtalk(string(dingbot.TEXT), Welcome)
 			if err != nil {
 				logger.Warning(fmt.Errorf("send message error: %v", err))
 				return ship.ErrBadRequest.New(fmt.Errorf("send message error: %v", err))
@@ -62,6 +63,7 @@ func Start() {
 				return process.ImageGenerate(&msgObj)
 			default:
 				msgObj.Text.Content = process.GeneratePrompt(strings.TrimSpace(msgObj.Text.Content))
+				logger.Info(fmt.Sprintf("after generate prompt: %#v", msgObj.Text.Content))
 				return process.ProcessRequest(&msgObj)
 			}
 		}

+ 1 - 1
pkg/chatgpt/export.go

@@ -4,8 +4,8 @@ import (
 	"time"
 
 	"github.com/avast/retry-go"
+	"github.com/eryajf/chatgpt-dingtalk/pkg/logger"
 	"github.com/eryajf/chatgpt-dingtalk/public"
-	"github.com/eryajf/chatgpt-dingtalk/public/logger"
 )
 
 // SingleQa 单聊

+ 1 - 1
public/dingtalk.go

@@ -1,4 +1,4 @@
-package public
+package dingbot
 
 import (
 	"bytes"

+ 33 - 0
pkg/logger/logger.go

@@ -0,0 +1,33 @@
+package logger
+
+import (
+	"os"
+	"sync"
+
+	"github.com/charmbracelet/log"
+)
+
+var Logger *log.Logger
+var once sync.Once
+
+func init() {
+	once.Do(func() {
+		Logger = log.New(os.Stderr)
+	})
+}
+
+func Info(args ...interface{}) {
+	Logger.Info(args)
+}
+
+func Warning(args ...interface{}) {
+	Logger.Warn(args)
+}
+
+func Error(args ...interface{}) {
+	Logger.Error(args)
+}
+
+func Fatal(args ...interface{}) {
+	Logger.Fatal(args)
+}

+ 19 - 18
pkg/process/process_request.go

@@ -5,32 +5,33 @@ import (
 	"strings"
 	"time"
 
+	"github.com/eryajf/chatgpt-dingtalk/pkg/dingbot"
+	"github.com/eryajf/chatgpt-dingtalk/pkg/logger"
 	"github.com/eryajf/chatgpt-dingtalk/public"
-	"github.com/eryajf/chatgpt-dingtalk/public/logger"
 	"github.com/solywsh/chatgpt"
 )
 
 // ProcessRequest 分析处理请求逻辑
-func ProcessRequest(rmsg *public.ReceiveMsg) error {
+func ProcessRequest(rmsg *dingbot.ReceiveMsg) error {
 	if public.CheckRequest(rmsg) {
 		content := strings.TrimSpace(rmsg.Text.Content)
 		switch content {
 		case "单聊":
 			public.UserService.SetUserMode(rmsg.SenderStaffId, content)
-			_, err := rmsg.ReplyToDingtalk(string(public.TEXT), fmt.Sprintf("=====现在进入与👉%s👈单聊的模式 =====", rmsg.SenderNick))
+			_, err := rmsg.ReplyToDingtalk(string(dingbot.TEXT), fmt.Sprintf("=====现在进入与👉%s👈单聊的模式 =====", rmsg.SenderNick))
 			if err != nil {
 				logger.Warning(fmt.Errorf("send message error: %v", err))
 			}
 		case "串聊":
 			public.UserService.SetUserMode(rmsg.SenderStaffId, content)
-			_, err := rmsg.ReplyToDingtalk(string(public.TEXT), fmt.Sprintf("=====现在进入与👉%s👈串聊的模式 =====", rmsg.SenderNick))
+			_, err := rmsg.ReplyToDingtalk(string(dingbot.TEXT), fmt.Sprintf("=====现在进入与👉%s👈串聊的模式 =====", rmsg.SenderNick))
 			if err != nil {
 				logger.Warning(fmt.Errorf("send message error: %v", err))
 			}
 		case "重置":
 			public.UserService.ClearUserMode(rmsg.SenderStaffId)
 			public.UserService.ClearUserSessionContext(rmsg.SenderStaffId)
-			_, err := rmsg.ReplyToDingtalk(string(public.TEXT), fmt.Sprintf("=====已重置与👉%s👈的对话模式,可以开始新的对话=====", rmsg.SenderNick))
+			_, err := rmsg.ReplyToDingtalk(string(dingbot.TEXT), fmt.Sprintf("=====已重置与👉%s👈的对话模式,可以开始新的对话=====", rmsg.SenderNick))
 			if err != nil {
 				logger.Warning(fmt.Errorf("send message error: %v", err))
 			}
@@ -39,12 +40,12 @@ func ProcessRequest(rmsg *public.ReceiveMsg) error {
 			for _, v := range *public.Prompt {
 				title = title + v.Title + " | "
 			}
-			_, err := rmsg.ReplyToDingtalk(string(public.TEXT), fmt.Sprintf("%s 您好,当前程序内置集成了这些prompt:\n====================================\n| %s \n====================================\n你可以选择某个prompt开头,然后进行对话。\n以周报为例,可发送 #周报 我本周用Go写了一个钉钉集成ChatGPT的聊天应用", rmsg.SenderNick, title))
+			_, err := rmsg.ReplyToDingtalk(string(dingbot.TEXT), fmt.Sprintf("%s 您好,当前程序内置集成了这些prompt:\n====================================\n| %s \n====================================\n你可以选择某个prompt开头,然后进行对话。\n以周报为例,可发送 #周报 我本周用Go写了一个钉钉集成ChatGPT的聊天应用", rmsg.SenderNick, title))
 			if err != nil {
 				logger.Warning(fmt.Errorf("send message error: %v", err))
 			}
 		case "图片":
-			_, err := rmsg.ReplyToDingtalk(string(public.MARKDOWN), "发送以 **#图片** 开头的内容,将会触发绘画能力,图片生成之后,将会保存在程序根目录下的 **images目录** \n 如果你绘图没有思路,可以在这两个网站寻找灵感。\n - [https://lexica.art/](https://lexica.art/)\n- [https://www.clickprompt.org/zh-CN/](https://www.clickprompt.org/zh-CN/)")
+			_, err := rmsg.ReplyToDingtalk(string(dingbot.MARKDOWN), "发送以 **#图片** 开头的内容,将会触发绘画能力,图片生成之后,将会保存在程序根目录下的 **images目录** \n 如果你绘图没有思路,可以在这两个网站寻找灵感。\n - [https://lexica.art/](https://lexica.art/)\n- [https://www.clickprompt.org/zh-CN/](https://www.clickprompt.org/zh-CN/)")
 			if err != nil {
 				logger.Warning(fmt.Errorf("send message error: %v", err))
 			}
@@ -61,7 +62,7 @@ func ProcessRequest(rmsg *public.ReceiveMsg) error {
 				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"))
 			}
 
-			_, err := rmsg.ReplyToDingtalk(string(public.TEXT), cacheMsg)
+			_, err := rmsg.ReplyToDingtalk(string(dingbot.TEXT), cacheMsg)
 			if err != nil {
 				logger.Warning(fmt.Errorf("send message error: %v", err))
 			}
@@ -77,7 +78,7 @@ func ProcessRequest(rmsg *public.ReceiveMsg) error {
 }
 
 // 执行处理请求
-func Do(mode string, rmsg *public.ReceiveMsg) error {
+func Do(mode string, rmsg *dingbot.ReceiveMsg) error {
 	// 先把模式注入
 	public.UserService.SetUserMode(rmsg.SenderStaffId, mode)
 	switch mode {
@@ -87,13 +88,13 @@ func Do(mode string, rmsg *public.ReceiveMsg) error {
 			logger.Info(fmt.Errorf("gpt request error: %v", err))
 			if strings.Contains(fmt.Sprintf("%v", err), "maximum text length exceeded") {
 				public.UserService.ClearUserSessionContext(rmsg.SenderStaffId)
-				_, err = rmsg.ReplyToDingtalk(string(public.TEXT), fmt.Sprintf("请求openai失败了,错误信息:%v,看起来是超过最大对话限制了,已自动重置您的对话", err))
+				_, err = rmsg.ReplyToDingtalk(string(dingbot.TEXT), fmt.Sprintf("请求openai失败了,错误信息:%v,看起来是超过最大对话限制了,已自动重置您的对话", err))
 				if err != nil {
 					logger.Warning(fmt.Errorf("send message error: %v", err))
 					return err
 				}
 			} else {
-				_, err = rmsg.ReplyToDingtalk(string(public.TEXT), fmt.Sprintf("请求openai失败了,错误信息:%v", err))
+				_, err = rmsg.ReplyToDingtalk(string(dingbot.TEXT), fmt.Sprintf("请求openai失败了,错误信息:%v", err))
 				if err != nil {
 					logger.Warning(fmt.Errorf("send message error: %v", err))
 					return err
@@ -107,7 +108,7 @@ func Do(mode string, rmsg *public.ReceiveMsg) error {
 			reply = strings.TrimSpace(reply)
 			reply = strings.Trim(reply, "\n")
 			// 回复@我的用户
-			_, err = rmsg.ReplyToDingtalk(string(public.TEXT), reply)
+			_, err = rmsg.ReplyToDingtalk(string(dingbot.TEXT), reply)
 			if err != nil {
 				logger.Warning(fmt.Errorf("send message error: %v", err))
 				return err
@@ -119,13 +120,13 @@ func Do(mode string, rmsg *public.ReceiveMsg) error {
 			logger.Info(fmt.Sprintf("gpt request error: %v", err))
 			if strings.Contains(fmt.Sprintf("%v", err), "maximum text length exceeded") {
 				public.UserService.ClearUserSessionContext(rmsg.SenderStaffId)
-				_, err = rmsg.ReplyToDingtalk(string(public.TEXT), fmt.Sprintf("请求openai失败了,错误信息:%v,看起来是超过最大对话限制了,已自动重置您的对话", err))
+				_, err = rmsg.ReplyToDingtalk(string(dingbot.TEXT), fmt.Sprintf("请求openai失败了,错误信息:%v,看起来是超过最大对话限制了,已自动重置您的对话", err))
 				if err != nil {
 					logger.Warning(fmt.Errorf("send message error: %v", err))
 					return err
 				}
 			} else {
-				_, err = rmsg.ReplyToDingtalk(string(public.TEXT), fmt.Sprintf("请求openai失败了,错误信息:%v", err))
+				_, err = rmsg.ReplyToDingtalk(string(dingbot.TEXT), fmt.Sprintf("请求openai失败了,错误信息:%v", err))
 				if err != nil {
 					logger.Warning(fmt.Errorf("send message error: %v", err))
 					return err
@@ -139,7 +140,7 @@ func Do(mode string, rmsg *public.ReceiveMsg) error {
 			reply = strings.TrimSpace(reply)
 			reply = strings.Trim(reply, "\n")
 			// 回复@我的用户
-			_, err = rmsg.ReplyToDingtalk(string(public.TEXT), reply)
+			_, err = rmsg.ReplyToDingtalk(string(dingbot.TEXT), reply)
 			if err != nil {
 				logger.Warning(fmt.Errorf("send message error: %v", err))
 				return err
@@ -152,11 +153,11 @@ func Do(mode string, rmsg *public.ReceiveMsg) error {
 	return nil
 }
 
-func ImageGenerate(rmsg *public.ReceiveMsg) error {
+func ImageGenerate(rmsg *dingbot.ReceiveMsg) error {
 	reply, err := chatgpt.ImageQa(rmsg.Text.Content, rmsg.SenderStaffId)
 	if err != nil {
 		logger.Info(fmt.Errorf("gpt request error: %v", err))
-		_, err = rmsg.ReplyToDingtalk(string(public.TEXT), fmt.Sprintf("请求openai失败了,错误信息:%v", err))
+		_, err = rmsg.ReplyToDingtalk(string(dingbot.TEXT), fmt.Sprintf("请求openai失败了,错误信息:%v", err))
 		if err != nil {
 			logger.Warning(fmt.Errorf("send message error: %v", err))
 			return err
@@ -169,7 +170,7 @@ func ImageGenerate(rmsg *public.ReceiveMsg) error {
 		reply = strings.TrimSpace(reply)
 		reply = strings.Trim(reply, "\n")
 		// 回复@我的用户
-		_, err = rmsg.ReplyToDingtalk(string(public.MARKDOWN), fmt.Sprintf(">点击图片可旋转或放大。\n![](%s)", reply))
+		_, err = rmsg.ReplyToDingtalk(string(dingbot.MARKDOWN), fmt.Sprintf(">点击图片可旋转或放大。\n![](%s)", reply))
 		if err != nil {
 			logger.Warning(fmt.Errorf("send message error: %v", err))
 			return err

+ 1 - 0
public/gpt.go

@@ -33,6 +33,7 @@ type Billing struct {
 	} `json:"grants"`
 }
 
+// GetBalance 获取账号余额
 func GetBalance() (Billing, error) {
 	var data Billing
 	var url string = "https://api.openai.com/dashboard/billing/credit_grants"

+ 0 - 40
public/logger/logger.go

@@ -1,40 +0,0 @@
-package logger
-
-import (
-	"log"
-	"os"
-	"sync"
-)
-
-var Logger *log.Logger
-var once sync.Once
-
-func init() {
-	once.Do(func() {
-		Logger = log.New(os.Stdout, "INFO", log.Ldate|log.Ltime|log.Lshortfile)
-	})
-}
-
-// Info 详情
-func Info(args ...interface{}) {
-	Logger.SetPrefix("[INFO]")
-	Logger.Println(args...)
-}
-
-// Danger 错误 为什么不命名为 error?避免和 error 类型重名
-func Danger(args ...interface{}) {
-	Logger.SetPrefix("[ERROR]")
-	Logger.Fatal(args...)
-}
-
-// Warning 警告
-func Warning(args ...interface{}) {
-	Logger.SetPrefix("[WARNING]")
-	Logger.Println(args...)
-}
-
-// DeBug debug
-func DeBug(args ...interface{}) {
-	Logger.SetPrefix("[DeBug]")
-	Logger.Println(args...)
-}

+ 5 - 4
public/public.go

@@ -6,7 +6,8 @@ import (
 
 	"github.com/eryajf/chatgpt-dingtalk/config"
 	"github.com/eryajf/chatgpt-dingtalk/pkg/cache"
-	"github.com/eryajf/chatgpt-dingtalk/public/logger"
+	"github.com/eryajf/chatgpt-dingtalk/pkg/dingbot"
+	"github.com/eryajf/chatgpt-dingtalk/pkg/logger"
 )
 
 var UserService cache.UserServiceInterface
@@ -20,7 +21,7 @@ func InitSvc() {
 	_, _ = GetBalance()
 }
 
-func FirstCheck(rmsg *ReceiveMsg) bool {
+func FirstCheck(rmsg *dingbot.ReceiveMsg) bool {
 	lc := UserService.GetUserMode(rmsg.SenderStaffId)
 	if lc == "" {
 		if Config.DefaultMode == "串聊" {
@@ -37,7 +38,7 @@ func FirstCheck(rmsg *ReceiveMsg) bool {
 
 // ProcessRequest 分析处理请求逻辑
 // 主要提供单日请求限额的功能
-func CheckRequest(rmsg *ReceiveMsg) bool {
+func CheckRequest(rmsg *dingbot.ReceiveMsg) bool {
 	if Config.MaxRequest == 0 {
 		return true
 	}
@@ -45,7 +46,7 @@ func CheckRequest(rmsg *ReceiveMsg) bool {
 	// 判断访问次数是否超过限制
 	if count >= Config.MaxRequest {
 		logger.Info(fmt.Sprintf("亲爱的: %s,您今日请求次数已达上限,请明天再来,交互发问资源有限,请务必斟酌您的问题,给您带来不便,敬请谅解!", rmsg.SenderNick))
-		_, err := rmsg.ReplyToDingtalk(string(TEXT), fmt.Sprintf("一个好的问题,胜过十个好的答案!\n亲爱的: %s,您今日请求次数已达上限,请明天再来,交互发问资源有限,请务必斟酌您的问题,给您带来不便,敬请谅解!", rmsg.SenderNick))
+		_, err := rmsg.ReplyToDingtalk(string(dingbot.TEXT), fmt.Sprintf("一个好的问题,胜过十个好的答案!\n亲爱的: %s,您今日请求次数已达上限,请明天再来,交互发问资源有限,请务必斟酌您的问题,给您带来不便,敬请谅解!", rmsg.SenderNick))
 		if err != nil {
 			logger.Warning(fmt.Errorf("send message error: %v", err))
 		}