player.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. package gm_services
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "gadmin/config"
  7. "gadmin/internal/admin/consts"
  8. "gadmin/internal/admin/forms"
  9. "gadmin/internal/admin/gm_rpc/rpc_share"
  10. "gadmin/internal/gorm/model"
  11. "gadmin/internal/gorm/query"
  12. "gadmin/utility"
  13. "gadmin/utility/character"
  14. "gadmin/utility/player"
  15. "gadmin/utility/serializer"
  16. "leafstalk/covenant/msg"
  17. "os"
  18. "strconv"
  19. "time"
  20. "github.com/gin-gonic/gin"
  21. "github.com/sirupsen/logrus"
  22. )
  23. func DeleteUserAccount(ctx *gin.Context, playerID int64) (err error) {
  24. /*if playerID == 0 {
  25. return errNoUser
  26. }
  27. attr, err := player.GetAttrByUserId(playerID)
  28. if err != nil {
  29. return
  30. }
  31. DB, err := player.GetDBByPlayerAttr(attr)
  32. if err != nil {
  33. return
  34. }
  35. msgs := msg.GmDelPlayer{
  36. MsgId: character.GenerateMsgId(),
  37. PlayerID: playerID,
  38. OperatorId: token.GetUID(ctx),
  39. }
  40. //err = gate.SendToWorld(0, &msgs)
  41. //if err == nil {
  42. //}
  43. rpc_share.MsgMap[msgs.MsgId] = fmt.Sprintf("%s,GM操作删除玩家[%d]", utility.FormatSecond(time.Now()), playerID)
  44. var resp *msg.ResponseGmDelPlayer
  45. res, err := config.GmNats.GmRequest(DB, "GmDelPlayer", msgs)
  46. if err != nil {
  47. return
  48. }
  49. if err = json.Unmarshal(res, &resp); err != nil {
  50. return
  51. }
  52. rpc_share.LogChan <- rpc_share.LogMsg{
  53. MsgID: msgs.MsgId,
  54. Data: resp,
  55. }
  56. */
  57. return
  58. }
  59. func DeleteAccount(ctx *gin.Context, accId int64) (err error) {
  60. if accId == 0 {
  61. return errNoUser
  62. }
  63. account, err := player.GetAccountByAccId(accId)
  64. if err != nil {
  65. return
  66. }
  67. msgs := msg.GmDelAccountId{
  68. MsgId: character.GenerateMsgId(),
  69. AccId: account.AccID,
  70. }
  71. res, err := config.GmNats.GmLoginServRequest("GmDelAccountId", msgs)
  72. if err != nil {
  73. return
  74. }
  75. var resp *msg.ResponseGmDelAccountId
  76. if err = json.Unmarshal(res, &resp); err != nil {
  77. return
  78. }
  79. //删除成功 记录日志
  80. logrus.Warnf("DeleteAccount account:%+v\n", account)
  81. rpc_share.MsgMap[msgs.MsgId] = fmt.Sprintf("%s,GM操作删除玩家账号[%d]", utility.FormatSecond(time.Now()), account.AccID)
  82. rpc_share.LogChan <- rpc_share.LogMsg{
  83. MsgID: msgs.MsgId,
  84. Data: resp,
  85. }
  86. return
  87. }
  88. func OpenAccount(accId int64) (err error) {
  89. if os.Getenv("GIN_MODE") == "release" {
  90. err = errors.New("正式服环境不允许该操作,请将联系服务端将账号数据拷贝至测试服!")
  91. return err
  92. }
  93. getUserAccount := func() (*model.UserAccount, string) {
  94. var models *model.UserAccount
  95. config.LDB.Model("user_account_1").Where("accId = ?", accId).Scan(&models)
  96. if models != nil {
  97. return models, "user_account_1"
  98. }
  99. config.LDB.Model("user_account_2").Where("accId = ?", accId).Scan(&models)
  100. if models != nil {
  101. return models, "user_account_2"
  102. }
  103. return nil, ""
  104. }
  105. row, tab := getUserAccount()
  106. if row == nil {
  107. err = errors.New("账号不存在!")
  108. return err
  109. }
  110. if row.Account != "" {
  111. err = errors.New("该玩家已存在账号!")
  112. return err
  113. }
  114. tx := config.LDB.Model(tab).Where("accId = ?", accId).Updates(model.UserAccount{
  115. Openid: fmt.Sprintf("account@u%v", accId),
  116. Account: fmt.Sprintf("u%v", accId),
  117. Password: "202cb962ac59075b964b07152d234b70", // 123
  118. Platopenid: fmt.Sprintf("u%v", accId),
  119. })
  120. if tx.Error != nil {
  121. logrus.WithField("OpenAccount ", accId).Errorln(err.Error())
  122. return
  123. }
  124. //info, err := dao.Where(dao.ID.Eq(playerID)).Updates(model.UserAccount{
  125. // Openid: fmt.Sprintf("account@u%v", playerID),
  126. // Account: fmt.Sprintf("u%v", playerID),
  127. // Password: "202cb962ac59075b964b07152d234b70", // 123
  128. // Platopenid: fmt.Sprintf("u%v", playerID),
  129. //})
  130. //
  131. //if err != nil {
  132. // logrus.WithField("OpenAccount", playerID).Errorln(err.Error())
  133. // return
  134. //} else {
  135. // data, _ := json.Marshal(row)
  136. // logrus.WithField("OpenAccount", playerID).Infoln(info.RowsAffected, string(data))
  137. //}
  138. //if info.RowsAffected == 0 {
  139. // err = errors.New("未找到该用户")
  140. //}
  141. return
  142. }
  143. // 获取玩家游戏数据异常列表
  144. func AlarmGameDataList(ctx *gin.Context, req forms.AlarmGameDataListReq) serializer.Response {
  145. var result forms.AlarmGameDataListResp
  146. alarmModel := query.Use(config.DB).GameDataAlarm
  147. alarmQuery := alarmModel.WithContext(ctx)
  148. if req.UserID != 0 {
  149. alarmQuery = alarmQuery.Where(alarmModel.PlayerID.Eq(req.UserID))
  150. }
  151. if len(req.CreatedAt) == 2 {
  152. alarmQuery = alarmQuery.Where(alarmModel.CreatedAt.Between(time.Unix(req.CreatedAt[0], 0), time.Unix(req.CreatedAt[1], 0)))
  153. }
  154. //count
  155. count, err := alarmQuery.Count()
  156. if err != nil {
  157. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  158. }
  159. if count == 0 {
  160. return serializer.Suc(result)
  161. }
  162. _, limit, offset := forms.CalculatePage(req.Page, req.PerPage)
  163. list, err := alarmQuery.
  164. Order(alarmModel.CreatedAt.Desc()).
  165. Limit(int(limit)).
  166. Offset(int(offset)).
  167. Find()
  168. if err != nil {
  169. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  170. }
  171. //封禁状态
  172. uIdMap := make(map[int][]int64)
  173. for _, item := range list {
  174. uIdMap[req.ServerID] = append(uIdMap[req.ServerID], item.PlayerID)
  175. }
  176. uInfoMap := make(map[int64]*model.PlayerAttr)
  177. accIds := make([]int64, 0)
  178. for svrId, uIds := range uIdMap {
  179. playerAttrModel := query.Use(config.GDBGroup[svrId]).PlayerAttr
  180. userList, err := playerAttrModel.WithContext(ctx).Select(playerAttrModel.ID, playerAttrModel.ServerID, playerAttrModel.Playerid, playerAttrModel.AccID).Where(playerAttrModel.Playerid.In(uIds...)).Find()
  181. if err != nil {
  182. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  183. }
  184. for _, item := range userList {
  185. uInfoMap[item.AccID] = item
  186. accIds = append(accIds, item.AccID)
  187. }
  188. }
  189. //根据accId获取表名字
  190. tableMap := make(map[string][]int64)
  191. for _, accId := range accIds {
  192. tableName := model.GetAccountTable(accId, "user_account")
  193. tableMap[tableName] = append(tableMap[tableName], accId)
  194. }
  195. //取account
  196. accMap := make(map[int64]int)
  197. for tableName, accIds := range tableMap {
  198. accounts := make([]*model.UserAccount, 0)
  199. err = config.LDB.Table(tableName).Select([]string{"id", "accId", "ban"}).Where("accId in ?", accIds).Find(&accounts).Error
  200. if err != nil {
  201. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  202. }
  203. //处理account
  204. for _, item := range accounts {
  205. accMap[item.AccID] = int(item.Ban)
  206. }
  207. }
  208. //处理封禁信息
  209. uBanMap := make(map[int64]int)
  210. for accId, isBan := range accMap {
  211. uBanMap[uInfoMap[accId].Playerid] = isBan
  212. }
  213. res := make([]*forms.AlarmGameDataInfo, 0)
  214. for _, item := range list {
  215. res = append(res, &forms.AlarmGameDataInfo{
  216. ID: item.ID,
  217. PlayerID: item.PlayerID,
  218. Attrs: item.Attrs,
  219. ServerID: int32(req.ServerID),
  220. Msg: item.Msg,
  221. Time: item.Time,
  222. Module: item.Module,
  223. CreatedAt: item.CreatedAt,
  224. Ban: uBanMap[item.PlayerID],
  225. })
  226. }
  227. result.List = res
  228. result.Page = req.Page
  229. result.PerPage = req.PerPage
  230. result.PageCount = (count + req.PerPage - 1) / req.PerPage
  231. return serializer.Suc(result)
  232. }
  233. func AlarmAttrList(ctx *gin.Context, req forms.AlarmAttrReq) serializer.Response {
  234. var result forms.AlarmAttrResp
  235. /*alarmModel := query.Use(config.DB).GameCharacterDataAnomaly
  236. alarmQuery := alarmModel.WithContext(ctx)
  237. if len(req.Time) == 2 {
  238. alarmQuery = alarmQuery.Where(alarmModel.CreatedAt.Between(time.Unix(req.Time[0], 0), time.Unix(req.Time[1], 0)))
  239. }
  240. if req.ChapterID >= 0 {
  241. alarmQuery = alarmQuery.Where(alarmModel.ChapterID.Eq(int32(req.ChapterID)))
  242. }
  243. if req.RoomID >= 0 {
  244. alarmQuery = alarmQuery.Where(alarmModel.RoomID.Eq(int32(req.RoomID)))
  245. }
  246. if req.Level >= 0 {
  247. alarmQuery = alarmQuery.Where(alarmModel.Level.Eq(int32(req.Level)))
  248. }
  249. serverId := model2.ExtractLineId(req.UserID)
  250. alarmQuery = alarmQuery.Where(alarmModel.UserID.Eq(req.UserID)).Where(alarmModel.ServerID.Eq(int32(serverId)))
  251. //count
  252. count, err := alarmQuery.Count()
  253. if err != nil {
  254. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  255. }
  256. if count == 0 {
  257. return serializer.Suc(result)
  258. }
  259. _, limit, offset := forms.CalculatePage(req.Page, req.PerPage)
  260. list, err := alarmQuery.
  261. Order(alarmModel.CreatedAt.Desc()).
  262. Limit(int(limit)).
  263. Offset(int(offset)).
  264. Find()
  265. if err != nil {
  266. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  267. }
  268. result.List = list
  269. result.Page = req.Page
  270. result.PerPage = req.PerPage
  271. result.PageCount = (count + req.PerPage - 1) / req.PerPage*/
  272. return serializer.Suc(result)
  273. }
  274. func AlarmCheatingList(ctx *gin.Context, req forms.AlarmCheatingReq) serializer.Response {
  275. var result forms.AlarmGameDataListResp
  276. cheatingModel := query.Use(config.DB).GameAlarmCombatLog
  277. cheatingQuery := cheatingModel.WithContext(ctx)
  278. if req.ServerId != 0 {
  279. cheatingQuery = cheatingQuery.Where(cheatingModel.ServerID.Eq(int32(req.ServerId)))
  280. }
  281. if req.PlayerId != 0 {
  282. cheatingQuery = cheatingQuery.Where(cheatingModel.PlayerID.Eq(req.PlayerId))
  283. }
  284. if req.YearMonth != 0 {
  285. cheatingQuery = cheatingQuery.Where(cheatingModel.YearMonth.Eq(strconv.FormatInt(req.YearMonth, 10)))
  286. }
  287. if len(req.OriginTime) != 0 {
  288. cheatingQuery = cheatingQuery.Where(cheatingModel.OriginTime.Between(strconv.FormatInt(req.OriginTime[0], 10), strconv.FormatInt(req.OriginTime[1], 10)))
  289. }
  290. if req.Ratio != 0 {
  291. cheatingQuery = cheatingQuery.Where(cheatingModel.Ratio.Gte(req.Ratio))
  292. }
  293. //count
  294. count, err := cheatingQuery.Count()
  295. if err != nil {
  296. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  297. }
  298. if count == 0 {
  299. return serializer.Suc(result)
  300. }
  301. _, limit, offset := forms.CalculatePage(req.Page, req.PerPage)
  302. list, err := cheatingQuery.
  303. Order(cheatingModel.OriginTime.Desc()).
  304. Limit(int(limit)).
  305. Offset(int(offset)).
  306. Find()
  307. if err != nil {
  308. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  309. }
  310. //获取player_id,server_id
  311. find, err := cheatingModel.Select(cheatingModel.PlayerID, cheatingModel.ServerID).Group(cheatingModel.PlayerID).Find()
  312. if err != nil {
  313. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  314. }
  315. //封禁状态
  316. uIdMap := make(map[int][]int64)
  317. for _, item := range find {
  318. uIdMap[int(item.ServerID)] = append(uIdMap[int(req.ServerId)], item.PlayerID)
  319. }
  320. uInfoMap := make(map[int64]*model.PlayerAttr)
  321. accIds := make([]int64, 0)
  322. for svrId, uIds := range uIdMap {
  323. playerAttrModel := query.Use(config.GDBGroup[svrId]).PlayerAttr
  324. userList, err := playerAttrModel.WithContext(ctx).Select(playerAttrModel.ID, playerAttrModel.ServerID, playerAttrModel.Playerid, playerAttrModel.AccID).Where(playerAttrModel.Playerid.In(uIds...)).Find()
  325. if err != nil {
  326. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  327. }
  328. for _, item := range userList {
  329. uInfoMap[item.AccID] = item
  330. accIds = append(accIds, item.AccID)
  331. }
  332. }
  333. //根据accId获取表名字
  334. tableMap := make(map[string][]int64)
  335. for _, accId := range accIds {
  336. tableName := model.GetAccountTable(accId, "user_account")
  337. tableMap[tableName] = append(tableMap[tableName], accId)
  338. }
  339. //取account
  340. accMap := make(map[int64]int)
  341. for tableName, accIds := range tableMap {
  342. accounts := make([]*model.UserAccount, 0)
  343. err = config.LDB.Table(tableName).Select([]string{"id", "accId", "ban"}).Where("accId in ?", accIds).Find(&accounts).Error
  344. if err != nil {
  345. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  346. }
  347. //处理account
  348. for _, item := range accounts {
  349. accMap[item.AccID] = int(item.Ban)
  350. }
  351. }
  352. //处理封禁信息
  353. uBanMap := make(map[int64]int)
  354. for accId, isBan := range accMap {
  355. uBanMap[uInfoMap[accId].Playerid] = isBan
  356. }
  357. res := make([]*forms.AlarmCheatingInfo, 0)
  358. for _, item := range list {
  359. res = append(res, &forms.AlarmCheatingInfo{
  360. ID: item.ID,
  361. OriginId: item.OriginID,
  362. OriginTime: item.OriginTime,
  363. YearMonth: item.YearMonth,
  364. PlayerId: item.PlayerID,
  365. ServerId: int(item.ServerID),
  366. Dps: item.Dps,
  367. Rate: item.Rate,
  368. Valuation: item.Valuation,
  369. Damage: item.Damage,
  370. Ratio: item.Ratio,
  371. RoleInfo: item.RoleInfo,
  372. AlarmData: item.AlarmData,
  373. Ban: uBanMap[item.PlayerID],
  374. })
  375. }
  376. result.List = res
  377. result.Page = req.Page
  378. result.PerPage = req.PerPage
  379. result.PageCount = (count + req.PerPage - 1) / req.PerPage
  380. return serializer.Suc(result)
  381. }