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

This commit is contained in:
二丫讲梵
2023-03-27 10:43:40 +08:00
committed by GitHub
parent 9f69b837f3
commit 53e27ee145
12 changed files with 106 additions and 84 deletions

View File

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

View File

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

12
go.mod
View File

@@ -3,6 +3,7 @@ module github.com/eryajf/chatgpt-dingtalk
go 1.18 go 1.18
require ( require (
github.com/charmbracelet/log v0.2.1
github.com/go-resty/resty/v2 v2.7.0 github.com/go-resty/resty/v2 v2.7.0
github.com/patrickmn/go-cache v2.1.0+incompatible github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/solywsh/chatgpt v0.0.14 github.com/solywsh/chatgpt v0.0.14
@@ -12,9 +13,18 @@ require (
require ( require (
github.com/avast/retry-go v2.7.0+incompatible // indirect 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/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/net v0.0.0-20211029224645-99673261e6eb // indirect
golang.org/x/sys v0.6.0 // indirect
) )
replace github.com/solywsh/chatgpt => ./pkg/chatgpt replace github.com/solywsh/chatgpt => ./pkg/chatgpt

35
go.sum
View File

@@ -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 h1:XaGnzl7gESAideSjr+I8Hki/JBi+Yb9baHlMRPeSC84=
github.com/avast/retry-go v2.7.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= 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 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 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY=
github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= 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 h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= 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 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 h1:o6n6dj0h9u+5mE1m+D8eT0zYhh7229o8ymDd2zDwAXU=
github.com/sashabaranov/go-openai v1.5.3/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg= 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 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 h1:e5qhMT6DSQOE6A/xDBL/Ftf28BGptNw6Etq+w+pme6E=
github.com/xgfone/ship/v5 v5.3.1/go.mod h1:mGI+65lLL3kaOseMkWUYgy+OFl27WV2LY1NSsecu/9g= 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 h1:pirldcYWx7rx7kE5r+9WsOXPXK0+WH5+uZ7uPmJ44uM=
golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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/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/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 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/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 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 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 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

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

View File

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

View File

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

33
pkg/logger/logger.go Normal file
View File

@@ -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)
}

View File

@@ -5,32 +5,33 @@ import (
"strings" "strings"
"time" "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"
"github.com/eryajf/chatgpt-dingtalk/public/logger"
"github.com/solywsh/chatgpt" "github.com/solywsh/chatgpt"
) )
// ProcessRequest 分析处理请求逻辑 // ProcessRequest 分析处理请求逻辑
func ProcessRequest(rmsg *public.ReceiveMsg) error { func ProcessRequest(rmsg *dingbot.ReceiveMsg) error {
if public.CheckRequest(rmsg) { if public.CheckRequest(rmsg) {
content := strings.TrimSpace(rmsg.Text.Content) content := strings.TrimSpace(rmsg.Text.Content)
switch content { switch content {
case "单聊": case "单聊":
public.UserService.SetUserMode(rmsg.SenderStaffId, content) 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 { if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err)) logger.Warning(fmt.Errorf("send message error: %v", err))
} }
case "串聊": case "串聊":
public.UserService.SetUserMode(rmsg.SenderStaffId, content) 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 { if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err)) logger.Warning(fmt.Errorf("send message error: %v", err))
} }
case "重置": case "重置":
public.UserService.ClearUserMode(rmsg.SenderStaffId) public.UserService.ClearUserMode(rmsg.SenderStaffId)
public.UserService.ClearUserSessionContext(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 { if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err)) logger.Warning(fmt.Errorf("send message error: %v", err))
} }
@@ -39,12 +40,12 @@ func ProcessRequest(rmsg *public.ReceiveMsg) error {
for _, v := range *public.Prompt { for _, v := range *public.Prompt {
title = title + v.Title + " | " 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 { if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err)) logger.Warning(fmt.Errorf("send message error: %v", err))
} }
case "图片": 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 { if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err)) 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")) 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 { if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err)) 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) public.UserService.SetUserMode(rmsg.SenderStaffId, mode)
switch mode { switch mode {
@@ -87,13 +88,13 @@ func Do(mode string, rmsg *public.ReceiveMsg) error {
logger.Info(fmt.Errorf("gpt request error: %v", err)) logger.Info(fmt.Errorf("gpt request error: %v", err))
if strings.Contains(fmt.Sprintf("%v", err), "maximum text length exceeded") { if strings.Contains(fmt.Sprintf("%v", err), "maximum text length exceeded") {
public.UserService.ClearUserSessionContext(rmsg.SenderStaffId) 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 { if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err)) logger.Warning(fmt.Errorf("send message error: %v", err))
return err return err
} }
} else { } 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 { if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err)) logger.Warning(fmt.Errorf("send message error: %v", err))
return err return err
@@ -107,7 +108,7 @@ func Do(mode string, rmsg *public.ReceiveMsg) error {
reply = strings.TrimSpace(reply) reply = strings.TrimSpace(reply)
reply = strings.Trim(reply, "\n") reply = strings.Trim(reply, "\n")
// 回复@我的用户 // 回复@我的用户
_, err = rmsg.ReplyToDingtalk(string(public.TEXT), reply) _, err = rmsg.ReplyToDingtalk(string(dingbot.TEXT), reply)
if err != nil { if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err)) logger.Warning(fmt.Errorf("send message error: %v", err))
return err return err
@@ -119,13 +120,13 @@ func Do(mode string, rmsg *public.ReceiveMsg) error {
logger.Info(fmt.Sprintf("gpt request error: %v", err)) logger.Info(fmt.Sprintf("gpt request error: %v", err))
if strings.Contains(fmt.Sprintf("%v", err), "maximum text length exceeded") { if strings.Contains(fmt.Sprintf("%v", err), "maximum text length exceeded") {
public.UserService.ClearUserSessionContext(rmsg.SenderStaffId) 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 { if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err)) logger.Warning(fmt.Errorf("send message error: %v", err))
return err return err
} }
} else { } 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 { if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err)) logger.Warning(fmt.Errorf("send message error: %v", err))
return err return err
@@ -139,7 +140,7 @@ func Do(mode string, rmsg *public.ReceiveMsg) error {
reply = strings.TrimSpace(reply) reply = strings.TrimSpace(reply)
reply = strings.Trim(reply, "\n") reply = strings.Trim(reply, "\n")
// 回复@我的用户 // 回复@我的用户
_, err = rmsg.ReplyToDingtalk(string(public.TEXT), reply) _, err = rmsg.ReplyToDingtalk(string(dingbot.TEXT), reply)
if err != nil { if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err)) logger.Warning(fmt.Errorf("send message error: %v", err))
return err return err
@@ -152,11 +153,11 @@ func Do(mode string, rmsg *public.ReceiveMsg) error {
return nil return nil
} }
func ImageGenerate(rmsg *public.ReceiveMsg) error { func ImageGenerate(rmsg *dingbot.ReceiveMsg) error {
reply, err := chatgpt.ImageQa(rmsg.Text.Content, rmsg.SenderStaffId) reply, err := chatgpt.ImageQa(rmsg.Text.Content, rmsg.SenderStaffId)
if err != nil { if err != nil {
logger.Info(fmt.Errorf("gpt request error: %v", err)) 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 { if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err)) logger.Warning(fmt.Errorf("send message error: %v", err))
return err return err
@@ -169,7 +170,7 @@ func ImageGenerate(rmsg *public.ReceiveMsg) error {
reply = strings.TrimSpace(reply) reply = strings.TrimSpace(reply)
reply = strings.Trim(reply, "\n") 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 { if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err)) logger.Warning(fmt.Errorf("send message error: %v", err))
return err return err

View File

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

View File

@@ -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...)
}

View File

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