main.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package main
  2. import (
  3. "fmt"
  4. "path/filepath"
  5. "strings"
  6. "github.com/eryajf/chatgpt-dingtalk/pkg/process"
  7. "github.com/eryajf/chatgpt-dingtalk/public"
  8. "github.com/eryajf/chatgpt-dingtalk/public/logger"
  9. "github.com/xgfone/ship/v5"
  10. )
  11. func init() {
  12. public.InitSvc()
  13. }
  14. func main() {
  15. Start()
  16. }
  17. var Welcome string = `Commands:
  18. =================================
  19. 🙋 单聊 👉 单独聊天
  20. 📣 串聊 👉 带上下文聊天
  21. 🔃 重置 👉 重置带上下文聊天
  22. 💵 余额 👉 查询剩余额度
  23. 🚀 帮助 👉 显示帮助信息
  24. 🌈 模板 👉 内置的prompt
  25. 🎨 图片 👉 根据prompt生成图片
  26. =================================
  27. 🚜 例:@我发送 空 或 帮助 将返回此帮助信息
  28. 💪 Power By https://github.com/eryajf/chatgpt-dingtalk
  29. `
  30. func Start() {
  31. app := ship.Default()
  32. app.Route("/").POST(func(c *ship.Context) error {
  33. var msgObj public.ReceiveMsg
  34. err := c.Bind(&msgObj)
  35. if err != nil {
  36. return ship.ErrBadRequest.New(fmt.Errorf("bind to receivemsg failed : %v", err))
  37. }
  38. if msgObj.Text.Content == "" || msgObj.ChatbotUserID == "" {
  39. logger.Warning("从钉钉回调过来的内容为空,根据过往的经验,或许重新创建一下机器人,能解决这个问题")
  40. return ship.ErrBadRequest.New(fmt.Errorf("从钉钉回调过来的内容为空,根据过往的经验,或许重新创建一下机器人,能解决这个问题"))
  41. }
  42. // 打印钉钉回调过来的请求明细
  43. logger.Info(fmt.Sprintf("dingtalk callback parameters: %#v", msgObj))
  44. // TODO: 校验请求
  45. if len(msgObj.Text.Content) == 1 || strings.TrimSpace(msgObj.Text.Content) == "帮助" {
  46. // 欢迎信息
  47. _, err := msgObj.ReplyToDingtalk(string(public.TEXT), Welcome, msgObj.SenderStaffId)
  48. if err != nil {
  49. logger.Warning(fmt.Errorf("send message error: %v", err))
  50. return ship.ErrBadRequest.New(fmt.Errorf("send message error: %v", err))
  51. }
  52. } else {
  53. // 除去帮助之外的逻辑分流在这里处理
  54. switch {
  55. case strings.HasPrefix(strings.TrimSpace(msgObj.Text.Content), "#图片"):
  56. return process.ImageGenerate(&msgObj)
  57. default:
  58. msgObj.Text.Content = process.GeneratePrompt(strings.TrimSpace(msgObj.Text.Content))
  59. return process.ProcessRequest(&msgObj)
  60. }
  61. }
  62. return nil
  63. })
  64. // 解析生成后的图片
  65. app.Route("/images/:filename").GET(func(c *ship.Context) error {
  66. filename := c.Param("filename")
  67. root := "./images/"
  68. return c.File(filepath.Join(root, filename))
  69. })
  70. // 启动服务器
  71. ship.StartServer(":8090", app)
  72. }