check_wx_logic.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package Wx
  2. import (
  3. "context"
  4. "errors"
  5. "github.com/suyuan32/simple-admin-common/msg/errormsg"
  6. "github.com/zeromicro/go-zero/core/errorx"
  7. "wechat-api/ent"
  8. agentModel "wechat-api/ent/agent"
  9. "wechat-api/ent/wx"
  10. "wechat-api/hook"
  11. "wechat-api/internal/utils/dberrorhandler"
  12. "wechat-api/internal/svc"
  13. "wechat-api/internal/types"
  14. "github.com/zeromicro/go-zero/core/logx"
  15. )
  16. type CheckWxLogic struct {
  17. logx.Logger
  18. ctx context.Context
  19. svcCtx *svc.ServiceContext
  20. }
  21. func NewCheckWxLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CheckWxLogic {
  22. return &CheckWxLogic{
  23. Logger: logx.WithContext(ctx),
  24. ctx: ctx,
  25. svcCtx: svcCtx}
  26. }
  27. func (l *CheckWxLogic) CheckWx(req *types.WxInfo) (resp *types.BaseMsgResp, err error) {
  28. //isAdmin := l.ctx.Value("isAdmin").(bool)
  29. //if !isAdmin {
  30. // l.Error("没有权限,请联系管理员", nil)
  31. // return nil, nil
  32. //}
  33. // 获取服务器信息
  34. server, err := l.svcCtx.DB.Server.Get(l.ctx, *req.ServerId)
  35. if err != nil {
  36. l.Error("获取服务器信息失败", err)
  37. return nil, err
  38. }
  39. hook := hook.NewHook(server.PrivateIP, server.AdminPort, *req.Port)
  40. // 判断端口是否被占用
  41. portOccupied, err := hook.GetPortOccupiedInfo(*req.Port)
  42. if err != nil {
  43. l.Error("获取端口占用信息失败", err)
  44. return nil, err
  45. }
  46. if portOccupied.Occupied != "1" {
  47. l.Error("端口未使用,请重新扫码登陆", err)
  48. return nil, err
  49. }
  50. // 判断所选模式是否可用
  51. if req.AgentId != nil {
  52. agent, err := l.svcCtx.DB.Agent.Query().Where(agentModel.Status(1), agentModel.ID(*req.AgentId)).First(l.ctx)
  53. if err != nil && ent.IsNotFound(err) || agent == nil {
  54. return nil, errors.New("所选模式不存在或者已被禁用,请选择其他模式")
  55. }
  56. }
  57. loginStatus, err := hook.IsLoginStatus()
  58. if err != nil {
  59. return nil, err
  60. }
  61. if loginStatus.Onlinestatus == "3" {
  62. selfInfo, err := hook.GetSelfLoginInfo()
  63. if err != nil {
  64. return nil, err
  65. }
  66. wxInfo, err := l.svcCtx.DB.Wx.Query().Where(wx.ServerIDEQ(server.ID)).Where(wx.PortEQ(*req.Port)).Limit(1).Only(l.ctx)
  67. if err != nil && !ent.IsNotFound(err) {
  68. l.Error("查询微信信息失败", err)
  69. return nil, err
  70. }
  71. if req.Callback != nil && *req.Callback != "" {
  72. _ = hook.ConfigureMsgRecive("1", *req.Callback)
  73. }
  74. var dbErr error
  75. if ent.IsNotFound(err) {
  76. l.Error("账号不存在,请联系管理员", err)
  77. return nil, err
  78. } else {
  79. _, dbErr = l.svcCtx.DB.Wx.UpdateOneID(wxInfo.ID).
  80. SetNotNilProcessID(&selfInfo.ProcessID).
  81. SetNotNilCallback(req.Callback).
  82. SetNotNilWxid(&selfInfo.Wxid).
  83. SetNotNilAccount(&selfInfo.Account).
  84. SetNotNilNickname(&selfInfo.Nickname).
  85. SetNotNilTel(&selfInfo.Tel).
  86. SetNotNilHeadBig(&selfInfo.HeadBig).
  87. SetStatus(1).
  88. Save(l.ctx)
  89. data := map[string]interface{}{
  90. "nickname": selfInfo.Nickname,
  91. "server_id": wxInfo.ServerID,
  92. "port": wxInfo.Port,
  93. "api_base": wxInfo.APIBase,
  94. "api_key": wxInfo.APIKey,
  95. "agent_id": wxInfo.AgentID,
  96. "allow_list": wxInfo.AllowList,
  97. "group_allow_list": wxInfo.GroupAllowList,
  98. "block_list": wxInfo.BlockList,
  99. "group_block_list": wxInfo.GroupBlockList,
  100. }
  101. l.svcCtx.Rds.HSet(l.ctx, "wx_info", selfInfo.Wxid, data)
  102. l.svcCtx.Rds.HDel(l.ctx, "crontask_wx_server_info", selfInfo.Wxid)
  103. }
  104. if dbErr != nil {
  105. return nil, dberrorhandler.DefaultEntError(l.Logger, dbErr, req)
  106. }
  107. } else {
  108. l.Error("微信未登录", "loginStatus", loginStatus)
  109. return nil, errorx.NewDefaultError("微信未登陆,当前登陆状态:" + loginStatus.Onlinestatus + "," + loginStatus.Msg)
  110. }
  111. return &types.BaseMsgResp{Msg: errormsg.Success}, nil
  112. }