forked from eryajf/chatgpt-dingtalk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
130 lines (116 loc) · 3.43 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"strings"
"github.com/eryajf/chatgpt-dingtalk/gtp"
"github.com/eryajf/chatgpt-dingtalk/public"
"github.com/eryajf/chatgpt-dingtalk/public/logger"
"github.com/eryajf/chatgpt-dingtalk/service"
)
var UserService service.UserServiceInterface
func init() {
UserService = service.NewUserService()
}
func main() {
Start()
}
func Start() {
// 定义一个处理器函数
handler := func(w http.ResponseWriter, r *http.Request) {
data, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
logger.Warning("read request body failed: %v\n", err.Error())
return
}
// TODO: 校验请求
// fmt.Println(r.Header)
if len(data) == 0 {
logger.Warning("回调参数为空,以至于无法正常解析,请检查原因")
return
} else {
var msgObj = new(public.ReceiveMsg)
err = json.Unmarshal(data, &msgObj)
if err != nil {
logger.Warning("unmarshal request body failed: %v\n", err)
}
logger.Info(fmt.Sprintf("dingtalk callback parameters: %#v", msgObj))
err = ProcessRequest(*msgObj)
if err != nil {
logger.Warning("process request failed: %v\n", err)
}
}
}
// 创建一个新的 HTTP 服务器
server := &http.Server{
Addr: ":8090",
Handler: http.HandlerFunc(handler),
}
// 启动服务器
logger.Info("Start Listen On ", server.Addr)
err := server.ListenAndServe()
if err != nil {
logger.Danger(err)
}
}
func ProcessRequest(rmsg public.ReceiveMsg) error {
atText := "@" + rmsg.SenderNick + "\n" + " "
if UserService.ClearUserSessionContext(rmsg.SenderID, rmsg.Text.Content) {
_, err := rmsg.ReplyText(atText + "上下文已经清空了,你可以问下一个问题啦。")
if err != nil {
logger.Warning("response user error: %v \n", err)
return err
}
} else {
requestText := getRequestText(rmsg)
// 获取问题的答案
reply, err := gtp.Completions(requestText)
if err != nil {
logger.Info("gtp request error: %v \n", err)
_, err = rmsg.ReplyText("机器人太累了,让她休息会儿,过一会儿再来请求。")
if err != nil {
logger.Warning("send message error: %v \n", err)
return err
}
logger.Info("request openai error: %v\n", err)
return err
}
if reply == "" {
logger.Warning("get gpt result falied: %v\n", err)
return nil
}
// 回复@我的用户
reply = strings.TrimSpace(reply)
reply = strings.Trim(reply, "\n")
UserService.SetUserSessionContext(rmsg.SenderID, requestText, reply)
replyText := atText + reply
_, err = rmsg.ReplyText(replyText)
if err != nil {
logger.Info("send message error: %v \n", err)
return err
}
}
return nil
}
// getRequestText 获取请求接口的文本,要做一些清洗
func getRequestText(rmsg public.ReceiveMsg) string {
// 1.去除空格以及换行
requestText := strings.TrimSpace(rmsg.Text.Content)
requestText = strings.Trim(rmsg.Text.Content, "\n")
// 2.替换掉当前用户名称
replaceText := "@" + rmsg.SenderNick
requestText = strings.TrimSpace(strings.ReplaceAll(rmsg.Text.Content, replaceText, ""))
if requestText == "" {
return ""
}
// 3.获取上下文,拼接在一起,如果字符长度超出4000,截取为4000。(GPT按字符长度算)
requestText = UserService.GetUserSessionContext(rmsg.SenderID) + requestText
if len(requestText) >= 4000 {
requestText = requestText[:4000]
}
// 4.返回请求文本
return requestText
}