web_gmmsg.go 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606
  1. package msg
  2. import (
  3. "database/sql"
  4. "encoding/base64"
  5. "github.com/gin-gonic/gin"
  6. "github.com/xuri/excelize/v2"
  7. "math/rand"
  8. "net/http"
  9. "rocommon"
  10. "rocommon/service"
  11. "rocommon/socket/mysql"
  12. "rocommon/util"
  13. "roserver/baseserver/model"
  14. dbmodel "roserver/db/model"
  15. gmweb "roserver/gmweb/model"
  16. "roserver/serverproto"
  17. "strconv"
  18. "strings"
  19. "time"
  20. )
  21. type WebBriefInfo struct {
  22. Uid uint64
  23. NickName string
  24. BaseLevel int32
  25. CreateDate string
  26. LastLoginDate string
  27. BanDate string
  28. MapLevel int32
  29. FightPower uint32
  30. ActiveCode string
  31. OpenId string
  32. Serverid int //所属区服
  33. }
  34. type WebUserDetailInfo struct {
  35. WebBriefInfo
  36. Rmb uint32
  37. Zeny uint64
  38. ArenaScore uint32
  39. TowerLevel uint32
  40. HeroData []*serverproto.HeroData
  41. }
  42. type WebUserChatMsgInfo struct {
  43. Uid uint64
  44. TargetUid uint64
  45. MsgType int32
  46. Content string
  47. MsgData string
  48. }
  49. func verifyProcess(ctx *gin.Context) bool {
  50. return true
  51. tokenRaw := ctx.Request.FormValue("token")
  52. if tokenRaw == "" {
  53. tokenRaw = ctx.Request.Header.Get("Authorization")
  54. if tokenRaw == "" {
  55. ctx.JSON(http.StatusOK, "请重新登陆")
  56. return false
  57. }
  58. }
  59. _, err := gmweb.VerifyAction(tokenRaw)
  60. if err != nil {
  61. ctx.JSON(http.StatusOK, "请重新登陆")
  62. return false
  63. }
  64. return true
  65. }
  66. // 检索玩家数据
  67. // select * from role where nick_name like '%11%' and base_level>=1 and base_level<=3 and create_date>=str_to_date('2020-05-07', '%Y-%m-%d') and ban_date is NULL and map_level >=2 and fight_power >=1 and fight_power <=3
  68. // http://127.0.0.1:8086/gm/user_get?nickname=11&lmin=1&lmax=3&createdate=2020-05-07&banstatus=0&maplevel=2&fmin=1&fmax=3&pnum=1
  69. func WebGmProcessUserGet(c *gin.Context) {
  70. if !verifyProcess(c) {
  71. return
  72. }
  73. nickName := c.DefaultQuery("nickname", "") ///default ""
  74. activeCode := c.DefaultQuery("activecode", "")
  75. lminStr := c.DefaultQuery("lmin", "")
  76. lmaxStr := c.DefaultQuery("lmax", "")
  77. createdate := c.DefaultQuery("createdate", "")
  78. lastlogindate := c.DefaultQuery("lastlogindate", "")
  79. banstatusStr := c.DefaultQuery("banstatus", "")
  80. maplevelStr := c.DefaultQuery("maplevel", "")
  81. fminStr := c.DefaultQuery("fmin", "")
  82. fmaxStr := c.DefaultQuery("fmax", "")
  83. pagNumStr := c.DefaultQuery("pnum", "")
  84. //var paramList []interface{}
  85. procSqlStrPrefix := "select * from role where "
  86. procSqlStr := ""
  87. if nickName != "" {
  88. //procSqlStr += "nick_name like ? "
  89. //paramList = append(paramList, "'%"+nickName+"%'")
  90. procSqlStr += "nick_name like '%" + nickName + "%'"
  91. }
  92. if activeCode != "" {
  93. procSqlStr += " and active_code=" + activeCode
  94. }
  95. if lminStr != "" {
  96. baseLevel, _ := model.Str2Num(lminStr)
  97. if baseLevel > 0 {
  98. procSqlStr += " and base_level>=" + lminStr
  99. }
  100. }
  101. if lmaxStr != "" {
  102. baseLevel, _ := model.Str2Num(lmaxStr)
  103. if baseLevel > 0 {
  104. procSqlStr += " and base_level<=" + lmaxStr
  105. }
  106. }
  107. if createdate != "" {
  108. //2020-05-07T10:13:02+08:00
  109. //2018-01-12
  110. procSqlStr += " and create_date>=str_to_date('" + createdate + "', '%Y-%m-%d')"
  111. }
  112. if lastlogindate != "" {
  113. //2018-01-12
  114. procSqlStr += " and last_login_date>=str_to_date('" + lastlogindate + "', '%Y-%m-%d')"
  115. }
  116. if banstatusStr != "" {
  117. banstatus, _ := model.Str2Num(banstatusStr)
  118. if banstatus > 0 {
  119. procSqlStr += " and ban_date is not NULL"
  120. } else {
  121. procSqlStr += " and ban_date is NULL"
  122. }
  123. }
  124. if maplevelStr != "" {
  125. maplevel, _ := model.Str2Num(maplevelStr)
  126. if maplevel > 0 {
  127. procSqlStr += " and map_level >=" + maplevelStr
  128. }
  129. }
  130. if fminStr != "" {
  131. fmin, _ := model.Str2Num(fminStr)
  132. if fmin > 0 {
  133. procSqlStr += " and fight_power >=" + fminStr
  134. }
  135. }
  136. if fmaxStr != "" {
  137. fmax, _ := model.Str2Num(fmaxStr)
  138. if fmax > 0 {
  139. procSqlStr += " and fight_power <=" + fmaxStr
  140. }
  141. }
  142. if procSqlStr == "" {
  143. c.JSON(http.StatusOK, gin.H{
  144. "err": "param is empty",
  145. })
  146. return
  147. }
  148. procSqlStr = procSqlStrPrefix + procSqlStr
  149. pageNum, _ := model.Str2Num(pagNumStr)
  150. if pageNum <= 0 {
  151. pageNum = 1
  152. }
  153. pageNum -= 1
  154. procSqlStr += " limit " + strconv.Itoa(int(pageNum*20)) + ",20"
  155. var uidList []*WebBriefInfo
  156. service.GetMysql().Operate(func(rawClient interface{}) interface{} {
  157. wrapper := mysql.NewWrapper(rawClient.(*sql.DB))
  158. wrapper.Query(procSqlStr).Each(func(wrapper2 *mysql.Wrapper) bool {
  159. bfInfo := parseUserInfo(wrapper2)
  160. if bfInfo != nil {
  161. uidList = append(uidList, bfInfo)
  162. }
  163. return true
  164. })
  165. if wrapper.Err != nil {
  166. util.ErrorF("nickname=%v WebGmProcessUserGet err=%v", nickName, wrapper.Err)
  167. }
  168. return nil
  169. })
  170. c.JSON(http.StatusOK, uidList)
  171. }
  172. // 获取玩家详细信息
  173. // http://127.0.0.1:8086/gm/info_get?uid=1111
  174. func WebGmProcessUserInfoGet(c *gin.Context) {
  175. if !verifyProcess(c) {
  176. return
  177. }
  178. var errStr = ""
  179. uidStr := c.DefaultQuery("uid", "") ///default ""
  180. uid, _ := model.Str2NumU64(uidStr)
  181. if uidStr == "" || uid == 0 {
  182. errStr = "uid invalid!!!"
  183. util.InfoF(errStr)
  184. c.JSON(http.StatusOK, gin.H{
  185. "err": errStr,
  186. })
  187. return
  188. }
  189. //获取简介信息
  190. var bfInfo *WebBriefInfo = nil
  191. if service.GetMysql() != nil {
  192. service.GetMysql().Operate(func(rawClient interface{}) interface{} {
  193. wrapper := mysql.NewWrapper(rawClient.(*sql.DB))
  194. wrapper.Query("select * from role where uid=?", uid).Each(func(wrapper2 *mysql.Wrapper) bool {
  195. bfInfo = parseUserInfo(wrapper2)
  196. return true
  197. })
  198. if wrapper.Err != nil {
  199. util.ErrorF("uid=%v WebGmProcessUserGet err=%v", uid, wrapper.Err)
  200. }
  201. return nil
  202. })
  203. if bfInfo == nil {
  204. c.JSON(http.StatusOK, gin.H{
  205. "err": "玩家不存在!!!",
  206. })
  207. return
  208. }
  209. }
  210. //从redis中获取其他详细信息
  211. userInfo := webGMGetRoleInfo(uid)
  212. if userInfo == nil {
  213. c.JSON(http.StatusOK, bfInfo)
  214. } else {
  215. c.JSON(http.StatusOK, userInfo)
  216. //if bfInfo != nil {
  217. // detailInfo := &WebUserDetailInfo{WebBriefInfo: *bfInfo}
  218. // detailInfo.Rmb = userInfo.Base.Rmb
  219. // detailInfo.Zeny = userInfo.Base.Coin
  220. //
  221. // c.JSON(http.StatusOK, detailInfo)
  222. //} else {
  223. // c.JSON(http.StatusOK, userInfo)
  224. //}
  225. }
  226. }
  227. // 东南亚支付服务使用
  228. func WebGmProcessUserListGet(c *gin.Context) {
  229. if !verifyProcess(c) {
  230. return
  231. }
  232. var errStr = ""
  233. uidStr := c.DefaultQuery("userId", "") ///default ""
  234. //uid, _ := model.Str2NumU64(uidStr)
  235. if uidStr == "" {
  236. errStr = "uid invalid!!!"
  237. util.InfoF(errStr)
  238. c.JSON(http.StatusOK, gin.H{
  239. "err": errStr,
  240. })
  241. return
  242. }
  243. //获取简介信息
  244. bfInfoList := make([]*Uid, 0)
  245. if len(service.GetMysqlPay()) > 0 {
  246. for _, v := range service.GetMysqlPay() {
  247. var bfInfo *WebBriefInfo = nil
  248. v.Operate(func(rawClient interface{}) interface{} {
  249. wrapper := mysql.NewWrapper(rawClient.(*sql.DB))
  250. wrapper.Query("select * from role where open_id=?", uidStr).Each(func(wrapper2 *mysql.Wrapper) bool {
  251. bfInfo = parseUserInfo(wrapper2)
  252. return true
  253. })
  254. if wrapper.Err != nil {
  255. util.ErrorF("uid=%v WebGmProcessUserGet err=%v", uidStr, wrapper.Err)
  256. }
  257. return nil
  258. })
  259. bfInfoList = append(bfInfoList, &Uid{Uid: strconv.FormatUint(bfInfo.Uid, 10), Server: strconv.Itoa(bfInfo.Serverid / 2), CharacterName: bfInfo.NickName})
  260. }
  261. if len(bfInfoList) == 0 {
  262. c.JSON(http.StatusOK, gin.H{
  263. "err": "玩家不存在!!!",
  264. })
  265. return
  266. }
  267. }
  268. c.JSON(http.StatusOK, UserList{UserId: uidStr, Uids: bfInfoList})
  269. }
  270. // 东南亚支付服务使用
  271. func WebGmProcessUserListCheck(c *gin.Context) {
  272. if !verifyProcess(c) {
  273. return
  274. }
  275. var errStr = ""
  276. uidStr := c.DefaultQuery("uid", "") ///default ""
  277. uid, _ := model.Str2NumU64(uidStr)
  278. if uidStr == "" || uid == 0 {
  279. errStr = "uid invalid!!!"
  280. util.InfoF(errStr)
  281. c.JSON(http.StatusOK, gin.H{
  282. "err": errStr,
  283. })
  284. return
  285. }
  286. //获取简介信息
  287. var bfInfo *WebBriefInfo = nil
  288. if len(service.GetMysqlPay()) > 0 {
  289. for _, v := range service.GetMysqlPay() {
  290. v.Operate(func(rawClient interface{}) interface{} {
  291. wrapper := mysql.NewWrapper(rawClient.(*sql.DB))
  292. wrapper.Query("select * from role where uid=?", uid).Each(func(wrapper2 *mysql.Wrapper) bool {
  293. bfInfo = parseUserInfo(wrapper2)
  294. return true
  295. })
  296. if wrapper.Err != nil {
  297. util.ErrorF("uid=%v WebGmProcessUserGet err=%v", uid, wrapper.Err)
  298. }
  299. return nil
  300. })
  301. }
  302. if bfInfo == nil {
  303. c.JSON(http.StatusOK, gin.H{
  304. "err": "玩家不存在!!!",
  305. })
  306. return
  307. }
  308. }
  309. callBackKey := "http://165.154.215.99:80"
  310. if bfInfo.Serverid <= 10 {
  311. callBackKey = callBackKey + "0" + strconv.Itoa(bfInfo.Serverid-1) + "/pay/hwDn"
  312. } else if bfInfo.Serverid == 2 {
  313. callBackKey = callBackKey + "86" + "/pay/hwDn"
  314. } else {
  315. callBackKey = callBackKey + strconv.Itoa(bfInfo.Serverid-1) + "/pay/hwDn"
  316. }
  317. c.JSON(http.StatusOK, CheckUser{CharacterName: bfInfo.NickName, Server: strconv.Itoa(bfInfo.Serverid / 2), CallBackKey: callBackKey})
  318. }
  319. func WebGmProcessCreateOrder(c *gin.Context) {
  320. if !verifyProcess(c) {
  321. return
  322. }
  323. var errStr = ""
  324. uidStr := c.DefaultQuery("uid", "") ///default ""
  325. orderIdStr := c.DefaultQuery("order_id", "") ///default ""
  326. productIdStr := c.DefaultQuery("productId", "") ///default ""
  327. countStr := c.DefaultQuery("count", "") ///default ""
  328. uid, _ := model.Str2NumU64(uidStr)
  329. productId, _ := strconv.Atoi(productIdStr)
  330. count, _ := strconv.Atoi(countStr)
  331. if uidStr == "" || orderIdStr == "" || productIdStr == "" {
  332. errStr = "uid invalid!!!"
  333. util.ErrorF("param error:%v ,%v,%v", uidStr, orderIdStr, productIdStr)
  334. c.JSON(http.StatusOK, gin.H{
  335. "err": errStr,
  336. })
  337. return
  338. }
  339. ss := serverproto.SSPayOrderCreateReq{
  340. OrderId: orderIdStr,
  341. GoodsId: int32(productId),
  342. Count: int32(count),
  343. Uid: uidStr,
  344. }
  345. c.JSON(http.StatusOK, CheckUser{CharacterName: bfInfo.NickName, Server: strconv.Itoa(bfInfo.Serverid / 2), CallBackKey: callBackKey})
  346. }
  347. type UserList struct {
  348. UserId string `json:"userId"`
  349. Uids []*Uid `json:"uids"`
  350. }
  351. type Uid struct {
  352. Uid string `json:"uid"`
  353. Server string `json:"server"`
  354. CharacterName string `json:"characterName"`
  355. }
  356. type CheckUser struct {
  357. Server string `json:"server"`
  358. CharacterName string `json:"characterName"`
  359. CallBackKey string `json:"callBackKey"`
  360. }
  361. // 封号
  362. // http://127.0.0.1:8086/gm/ban?uid=1111&ban=1
  363. func WebGmProcessBanUser(c *gin.Context) {
  364. if !verifyProcess(c) {
  365. return
  366. }
  367. var errStr = ""
  368. uidStr := c.DefaultQuery("uid", "") ///default ""
  369. banStr := c.DefaultQuery("ban", "")
  370. banTypeStr := c.DefaultQuery("bantype", "1")
  371. banDurationTimeStr := c.DefaultQuery("bantime", "25920") //25920小时
  372. uid, _ := model.Str2NumU64(uidStr)
  373. if uidStr == "" || uid == 0 {
  374. errStr = "uid invalid!!!"
  375. util.InfoF(errStr)
  376. c.JSON(http.StatusOK, gin.H{
  377. "err": errStr,
  378. })
  379. return
  380. }
  381. ban, _ := model.Str2Num(banStr)
  382. banType, _ := model.Str2Num(banTypeStr)
  383. banDurationTime, _ := model.Str2Num(banDurationTimeStr)
  384. if service.GetMysql() != nil {
  385. var getUid uint64 = 0
  386. var banData interface{} = nil
  387. service.GetMysql().Operate(func(rawClient interface{}) interface{} {
  388. wrapper := mysql.NewWrapper(rawClient.(*sql.DB))
  389. if banType == 1 {
  390. wrapper.Query("select uid,ban_date from role where uid=?", uid).Each(func(wrapper2 *mysql.Wrapper) bool {
  391. //bfInfo = parseUserInfo(wrapper2)
  392. err := wrapper.Scan(&getUid, &banData)
  393. if err != nil {
  394. util.ErrorF("uid=%v WebGmProcessBanUser err=%v", uid, err)
  395. }
  396. return true
  397. })
  398. } else if banType == 2 {
  399. wrapper.Query("select uid,ban_chat_date from role where uid=?", uid).Each(func(wrapper2 *mysql.Wrapper) bool {
  400. //bfInfo = parseUserInfo(wrapper2)
  401. err := wrapper.Scan(&getUid, &banData)
  402. if err != nil {
  403. util.ErrorF("uid=%v WebGmProcessBanUser err=%v", uid, err)
  404. }
  405. return true
  406. })
  407. }
  408. if wrapper.Err != nil {
  409. util.ErrorF("uid=%v WebGmProcessBanUser err=%v", uid, wrapper.Err)
  410. }
  411. return nil
  412. })
  413. if getUid <= 0 {
  414. c.JSON(http.StatusOK, gin.H{
  415. "err": "user not find!!!",
  416. })
  417. return
  418. } else if banData == nil && ban <= 0 {
  419. c.JSON(http.StatusOK, gin.H{
  420. "err": "玩家没有处于封号状态,无法做解封操作",
  421. })
  422. return
  423. }
  424. }
  425. //} else if banData != nil && ban > 0 {
  426. // banTimeStamp := banData.(time.Time).Unix()
  427. // nowTime := util.GetTimeSeconds()
  428. // if banTimeStamp > nowTime {
  429. // c.JSON(http.StatusOK, gin.H{
  430. // "err": "玩家处于封号状态,无法封号操作",
  431. // "endtime": banData,
  432. // })
  433. // return
  434. // }
  435. //}
  436. //ban
  437. if ok, banEndTime := webGMRoleBan(uid, ban > 0, banType, banDurationTime); ok {
  438. c.JSON(http.StatusOK, gin.H{
  439. "err": "操作成功",
  440. "endtime": util.GetTimeByUint32(uint32(banEndTime)),
  441. })
  442. } else {
  443. c.JSON(http.StatusOK, gin.H{
  444. "err": "玩家不存在",
  445. })
  446. }
  447. }
  448. // 1私聊,2公聊
  449. // http://127.0.0.1:8086/gm/chat_msg?type=2&uid=111&msgdate=2020-05-05%2021:42:59
  450. func WebGmProcessChatMsg(c *gin.Context) {
  451. if !verifyProcess(c) {
  452. return
  453. }
  454. msgDataStr := c.DefaultQuery("msgdate", "")
  455. typeStr := c.DefaultQuery("type", "")
  456. uidStr := c.DefaultQuery("uid", "") ///default ""
  457. if msgDataStr == "" && uidStr == "" {
  458. c.JSON(http.StatusOK, gin.H{
  459. "err": "输入时间和玩家uid不能都为空",
  460. })
  461. return
  462. }
  463. procSqlStr := "select * from role_msg where "
  464. if typeStr != "" {
  465. msgType, _ := model.Str2Num(typeStr)
  466. if msgType > 0 {
  467. procSqlStr += " msg_type=" + typeStr
  468. } else {
  469. procSqlStr += " msg_type=1"
  470. }
  471. }
  472. if uidStr != "" {
  473. uid, _ := model.Str2NumU64(uidStr)
  474. if uid > 0 {
  475. procSqlStr += " and uid=" + uidStr
  476. }
  477. }
  478. procSqlStr += " and msg_date>=str_to_date('" + msgDataStr + "', '%Y-%m-%d %H:%i:%S')"
  479. var msgInfoList []*WebUserChatMsgInfo
  480. service.GetMysql().Operate(func(rawClient interface{}) interface{} {
  481. wrapper := mysql.NewWrapper(rawClient.(*sql.DB))
  482. wrapper.Query(procSqlStr).Each(func(wrapper2 *mysql.Wrapper) bool {
  483. msgInfo := parseChatMsgInfo(wrapper2)
  484. if msgInfo != nil {
  485. msgInfoList = append(msgInfoList, msgInfo)
  486. }
  487. return true
  488. })
  489. if wrapper.Err != nil {
  490. util.ErrorF("WebGmProcessChatMsg err=%v", wrapper.Err)
  491. }
  492. return nil
  493. })
  494. if len(msgInfoList) <= 0 {
  495. c.JSON(http.StatusOK, gin.H{
  496. "err": "消息为空",
  497. })
  498. } else {
  499. c.JSON(http.StatusOK, msgInfoList)
  500. }
  501. }
  502. // 邮件
  503. // http://127.0.0.1:8086/gm/mail?type=list 获取当前的定时邮件列表
  504. // http://127.0.0.1:8086/gm/mail?type=add&title=title&content=content&reward=101:1,102:3//添加邮件
  505. // http://127.0.0.1:8086/gm/mail?type=add&title=title&content=content&reward=101:1,102:3&senddate=2020-05-09%2000:00:00
  506. // http://127.0.0.1:8086/gm/mail?type=del&id=邮件id
  507. func WebGmProcessMail(c *gin.Context) {
  508. if !verifyProcess(c) {
  509. return
  510. }
  511. idStr := c.DefaultQuery("id", "")
  512. uidStr := c.DefaultQuery("uid", "")
  513. senddateStr := c.DefaultQuery("senddate", "")
  514. titleStr := c.DefaultQuery("title", "")
  515. contentStr := c.DefaultQuery("content", "")
  516. rewardStr := c.DefaultQuery("reward", "")
  517. // list表示获取邮件列表
  518. // attach添加替换邮件
  519. // del删除延迟发送邮件
  520. mailType := c.DefaultQuery("type", "")
  521. if mailType == "add" && titleStr == "" && contentStr == "" {
  522. c.JSON(http.StatusOK, gin.H{
  523. "err": "输入的标题和正文为空!!!",
  524. })
  525. return
  526. }
  527. id, _ := model.Str2Num(idStr)
  528. //uid
  529. var uidList []uint64
  530. uidStrList := strings.Split(uidStr, ",")
  531. for idx := 0; idx < len(uidStrList); idx++ {
  532. tmpUid, _ := model.Str2NumU64(uidStrList[idx])
  533. if tmpUid > 0 {
  534. uidList = append(uidList, tmpUid)
  535. }
  536. }
  537. if len(uidList) <= 0 && uidStr != "" {
  538. c.JSON(http.StatusOK, gin.H{
  539. "err": "输入的玩家id不正确!!!",
  540. })
  541. return
  542. }
  543. //reward
  544. var rewardList []*serverproto.KeyValueType
  545. rewardStrList := strings.Split(rewardStr, ",")
  546. for idx := 0; idx < len(rewardStrList); idx++ {
  547. key, val := model.Str2Res(rewardStrList[idx])
  548. if key > 0 && val > 0 {
  549. rewardList = append(rewardList, &serverproto.KeyValueType{Key: key, Value: val})
  550. }
  551. }
  552. //sendtime
  553. var sendTime uint64 = 0
  554. if senddateStr != "" {
  555. loc := util.GetLoc()
  556. sendDate, err := time.ParseInLocation(util.DATE_FORMAT, senddateStr, loc)
  557. if err != nil {
  558. c.JSON(http.StatusOK, gin.H{
  559. "err": "发送时间填写不对!!! 正确格式:2021-01-11 14:17:12",
  560. })
  561. return
  562. }
  563. util.InfoF("WebGmProcessMail sendtime=%v", sendDate.Local().String())
  564. sendTime = uint64(sendDate.Local().UnixNano() / 1e6)
  565. } else {
  566. //以发送时的时间为准
  567. sendTime = util.GetTimeMilliseconds()
  568. }
  569. if mailType == "del" {
  570. gmweb.GetMailUpdateMag().DelMailItem(id)
  571. c.JSON(http.StatusOK, "删除延迟发送邮件成功")
  572. } else if mailType == "list" {
  573. mailList := gmweb.GetMailUpdateMag().GetMailList()
  574. c.JSON(http.StatusOK, mailList)
  575. } else if mailType == "add" {
  576. gmweb.GetMailUpdateMag().AttachMail2Update(id, uidList, titleStr, contentStr, sendTime, rewardList)
  577. c.JSON(http.StatusOK, "发送邮件成功")
  578. }
  579. }
  580. func WebGmProcessMailPost(c *gin.Context) {
  581. if !verifyProcess(c) {
  582. return
  583. }
  584. idStr := c.PostForm("id")
  585. uidStrList := c.PostFormArray("uid")
  586. senddateStr := c.PostForm("senddate")
  587. titleStr := c.PostForm("title")
  588. contentStr := c.PostForm("content")
  589. rewardStr := c.PostForm("reward")
  590. // list表示获取邮件列表
  591. // attach添加替换邮件
  592. // del删除延迟发送邮件
  593. mailType := c.PostForm("type")
  594. if mailType == "add" && titleStr == "" && contentStr == "" {
  595. c.JSON(http.StatusOK, gin.H{
  596. "err": "输入的标题和正文为空!!!",
  597. })
  598. return
  599. }
  600. id, _ := model.Str2Num(idStr)
  601. //uid
  602. var uidList []uint64
  603. for idx := 0; idx < len(uidStrList); idx++ {
  604. tmpUid, _ := model.Str2NumU64(uidStrList[idx])
  605. if tmpUid > 0 {
  606. uidList = append(uidList, tmpUid)
  607. }
  608. }
  609. //reward
  610. var rewardList []*serverproto.KeyValueType
  611. rewardStrList := strings.Split(rewardStr, ",")
  612. for idx := 0; idx < len(rewardStrList); idx++ {
  613. key, val := model.Str2Res(rewardStrList[idx])
  614. if key > 0 && val > 0 {
  615. rewardList = append(rewardList, &serverproto.KeyValueType{Key: key, Value: val})
  616. }
  617. }
  618. //sendtime
  619. var sendTime uint64 = 0
  620. if senddateStr != "" {
  621. loc := util.GetLoc()
  622. sendDate, err := time.ParseInLocation(util.DATE_FORMAT, senddateStr, loc)
  623. if err != nil {
  624. c.JSON(http.StatusOK, gin.H{
  625. "err": "发送时间填写不对!!!",
  626. })
  627. return
  628. }
  629. util.InfoF("WebGmProcessMail sendtime=%v", sendDate.Local().String())
  630. sendTime = uint64(sendDate.Local().UnixNano() / 1e6)
  631. }
  632. if mailType == "del" {
  633. gmweb.GetMailUpdateMag().DelMailItem(id)
  634. c.JSON(http.StatusOK, "删除延迟发送邮件成功")
  635. } else if mailType == "list" {
  636. mailList := gmweb.GetMailUpdateMag().GetMailList()
  637. c.JSON(http.StatusOK, mailList)
  638. } else if mailType == "add" {
  639. gmweb.GetMailUpdateMag().AttachMail2Update(id, uidList, titleStr, contentStr, sendTime, rewardList)
  640. c.JSON(http.StatusOK, "发送邮件成功")
  641. }
  642. }
  643. // http://127.0.0.1:8086/gm/notice?&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTAyMjQ2NzAsImlhdCI6MTU5MDIyMTA3MH0.WihVh5AsvHm6MKHwoCELJgNzz9aA-ETPtchotLj_9Z0&col=<color=%23ff4b14>商城购买!!!!!!!!!!!!<%23color>&count=5&interval=5
  644. func WebGmProcessNotice(c *gin.Context) {
  645. if !verifyProcess(c) {
  646. return
  647. }
  648. colorStr := c.DefaultQuery("col", "")
  649. //speedStr := c.DefaultQuery("speed", "")
  650. countStr := c.DefaultQuery("count", "")
  651. intervalStr := c.DefaultQuery("interval", "")
  652. if colorStr == "" || countStr == "" {
  653. c.JSON(http.StatusOK, "color,count,interval不能为空")
  654. return
  655. }
  656. count, _ := model.Str2Num(countStr)
  657. interval, _ := model.Str2Num(intervalStr)
  658. if count <= 0 || interval <= 0 {
  659. c.JSON(http.StatusOK, "color,count,interval不能为空")
  660. return
  661. }
  662. noticeNtf := &serverproto.SSWebGMNoticeNtf{
  663. NoticeInfo: &serverproto.GMNoticeInfo{
  664. NoticeColor: colorStr,
  665. NoticeCount: uint32(count),
  666. NoticeInterval: uint32(interval),
  667. },
  668. }
  669. gmweb.SendSocial(noticeNtf)
  670. c.JSON(http.StatusOK, "公告发送成功")
  671. }
  672. func WebGMProcessServerMaintain(c *gin.Context) {
  673. stateStr := c.DefaultQuery("state", "1")
  674. //把在线玩家踢下线
  675. if stateStr == "1" {
  676. state, _ := model.Str2Num(stateStr)
  677. ntfMsg := &serverproto.SSWEBGMServerMaintainNtf{
  678. State: int32(state),
  679. }
  680. gmweb.SendSocial(ntfMsg)
  681. c.JSON(http.StatusOK, "维护成功(强制所有玩家下线)")
  682. } else {
  683. c.JSON(http.StatusOK, "state不为1")
  684. }
  685. }
  686. // http://127.0.0.1:8086/gm/guildbattle_state
  687. func WebGmGetGuildBattleState(c *gin.Context) {
  688. state, banType, ok := webGMGetGuildBattleState()
  689. if ok {
  690. c.JSON(http.StatusOK, gin.H{
  691. "err": "操作成功",
  692. "battle_state": state, //0:不在公会战内,1:公会战内
  693. "ban_type": banType, //0:公会战未禁止,1:公会战禁止
  694. })
  695. } else {
  696. c.JSON(http.StatusOK, gin.H{
  697. "err": "操作失败",
  698. "battle_state": -1, //-1:数据库查询异常,0:不在公会战内,1:公会战内
  699. "ban_type": -1, //-1:数据库查询异常,0:公会战未禁止,1:公会战禁止
  700. })
  701. }
  702. }
  703. func WebGMProcessServerRegister(c *gin.Context) {
  704. stateStr := c.DefaultQuery("state", "1")
  705. //关闭注册
  706. if stateStr == "1" {
  707. webGMServerRegister(stateStr)
  708. c.JSON(http.StatusOK, "关闭注册操作成功")
  709. } else {
  710. //开启注册
  711. webGMServerRegister(stateStr)
  712. c.JSON(http.StatusOK, "开启注册操作成功")
  713. }
  714. }
  715. func WebGMProcessServerConfigReload(c *gin.Context) {
  716. cfgStr := c.DefaultQuery("config", "") //例如AdvertisingScreen,ActivitiesCfg,ActiveCodeCfg
  717. cfgStrList := strings.Split(cfgStr, ",")
  718. if len(cfgStrList) <= 0 {
  719. c.JSON(http.StatusOK, "热加载配置文件不能为空!")
  720. return
  721. }
  722. for idx := 0; idx < len(cfgStrList); idx++ {
  723. if _, ok := serverproto.CFGNameList[cfgStrList[idx]]; !ok {
  724. errStr := "配置文件有误" + cfgStrList[idx]
  725. c.JSON(http.StatusOK, errStr)
  726. return
  727. }
  728. }
  729. webGMServerConfigReload(cfgStrList)
  730. c.JSON(http.StatusOK, "热加载配置文件成功!")
  731. }
  732. // 公会战GM//1:取消封停 2:封停
  733. // http://127.0.0.1:8086/gm/guildbattle
  734. func WebGmProcessGuildBattle(c *gin.Context) {
  735. /*
  736. if !verifyProcess(c) {
  737. return
  738. }
  739. */
  740. //ban
  741. if ok := webGMGuildBattleState(); ok {
  742. c.JSON(http.StatusOK, gin.H{
  743. "err": "操作成功",
  744. })
  745. }
  746. }
  747. func webGMGuildBattleState() bool {
  748. banNtf := &serverproto.SSWebGMGuildBattle{}
  749. gmweb.SendSocial(banNtf)
  750. return true
  751. }
  752. func webGMGetGuildBattleState() (int32, int32, bool) {
  753. keyStr := "guildbattle:base:"
  754. ret, err := service.GetRedis().Get(keyStr).Result()
  755. if err != nil {
  756. util.InfoF("loadGuildBattleBase get guildId key=%v err=%v\n", keyStr, err)
  757. return 0, 0, false
  758. }
  759. if ret == "" {
  760. util.InfoF("loadGuildBattleBase key(%v)->val empty", keyStr)
  761. return 0, 0, false
  762. }
  763. str, err := base64.StdEncoding.DecodeString(ret)
  764. if err != nil {
  765. util.InfoF("loadGuildBattleBase key(%v)->val DecodeString error", keyStr)
  766. return 0, 0, false
  767. }
  768. guildBase := &serverproto.GuildBattleBase{}
  769. err = rocommon.GetCodec().Unmarshal(str, guildBase)
  770. if err == nil {
  771. battleState := int32(0)
  772. //1:开始阶段, 10:展示阶段
  773. if 1 <= guildBase.GuildBattleState && guildBase.GuildBattleState <= 10 {
  774. battleState = 1
  775. }
  776. util.InfoF("loadGuildBattleBase success:%v", guildBase)
  777. return battleState, guildBase.BanType, true
  778. }
  779. return 0, 0, false
  780. }
  781. // ///////////
  782. func parseUserInfo(wrapper *mysql.Wrapper) *WebBriefInfo {
  783. var Uid uint64
  784. var NickName sql.NullString
  785. var BaseLevel sql.NullInt64
  786. var CreateDate sql.NullString
  787. var LastLoginDate sql.NullString
  788. var BanDate sql.NullString
  789. var MapLevel sql.NullInt64
  790. var FightPower sql.NullInt64
  791. var ActiveCode sql.NullString
  792. var OpenId sql.NullString
  793. err := wrapper.Scan(&Uid, &NickName, &BaseLevel, &CreateDate,
  794. &LastLoginDate, &BanDate, &MapLevel, &FightPower, &ActiveCode, &OpenId)
  795. if err == nil {
  796. bfInfo := &WebBriefInfo{
  797. Uid: Uid,
  798. }
  799. if NickName.Valid {
  800. bfInfo.NickName = NickName.String
  801. }
  802. if BaseLevel.Valid {
  803. bfInfo.BaseLevel = int32(BaseLevel.Int64)
  804. }
  805. if CreateDate.Valid {
  806. bfInfo.CreateDate = CreateDate.String
  807. }
  808. if LastLoginDate.Valid {
  809. bfInfo.LastLoginDate = LastLoginDate.String
  810. }
  811. if BanDate.Valid {
  812. bfInfo.BanDate = BanDate.String
  813. }
  814. if MapLevel.Valid {
  815. bfInfo.MapLevel = int32(MapLevel.Int64)
  816. }
  817. if FightPower.Valid {
  818. bfInfo.FightPower = uint32(FightPower.Int64)
  819. }
  820. if ActiveCode.Valid {
  821. bfInfo.ActiveCode = ActiveCode.String
  822. }
  823. if OpenId.Valid {
  824. bfInfo.OpenId = OpenId.String
  825. }
  826. return bfInfo
  827. } else {
  828. util.ErrorF("WebGmProcessUserGet err=%v", wrapper.Err)
  829. }
  830. return nil
  831. }
  832. func parseChatMsgInfo(wrapper *mysql.Wrapper) *WebUserChatMsgInfo {
  833. var Uid uint64
  834. var TargetUid sql.NullInt64
  835. var MsgType sql.NullInt64
  836. var Content sql.NullString
  837. var MsgData sql.NullString
  838. err := wrapper.Scan(&Uid, &TargetUid, &MsgType, &Content, &MsgData)
  839. if err == nil {
  840. msgInfo := &WebUserChatMsgInfo{
  841. Uid: Uid,
  842. }
  843. if TargetUid.Valid {
  844. msgInfo.TargetUid = uint64(TargetUid.Int64)
  845. }
  846. if MsgType.Valid {
  847. msgInfo.MsgType = int32(MsgType.Int64)
  848. }
  849. if Content.Valid {
  850. msgInfo.Content = Content.String
  851. }
  852. if MsgData.Valid {
  853. msgInfo.MsgData = MsgData.String
  854. }
  855. return msgInfo
  856. } else {
  857. util.ErrorF("WebGmProcessUserGet err=%v", wrapper.Err)
  858. }
  859. return nil
  860. }
  861. func webGMGetRoleInfo(uid uint64) *serverproto.WebRoleInfo {
  862. if uid <= 0 {
  863. return nil
  864. }
  865. value := strconv.FormatUint(uid, 10)
  866. uidInfo := &serverproto.WebRoleInfo{}
  867. uidInfo.Base = &serverproto.RoleBase{}
  868. err := model.GetMessageFromRedis(dbmodel.RoleBasePrefix, value, uidInfo.Base)
  869. if err != nil {
  870. return nil
  871. }
  872. uidInfo.RoleHero = &serverproto.RoleHero{}
  873. err = dbmodel.GetRoleHeroDataFromRedis(uid, uidInfo.RoleHero)
  874. if err != nil && err != service.NIL {
  875. util.InfoF("WebGMGetRoleInfo RoleHero err=%v uid=%v", err, uid)
  876. return nil
  877. }
  878. return uidInfo
  879. }
  880. func webGMRoleBan(uid uint64, ban bool, banType, banDurationTime int) (bool, uint64) {
  881. value := strconv.FormatUint(uid, 10)
  882. tmpRoleBase := &serverproto.RoleBase{}
  883. err := model.GetMessageFromRedis(dbmodel.RoleBasePrefix, value, tmpRoleBase)
  884. if err != nil {
  885. util.InfoF("webGMRoleBan can't find uid=%v player", uid)
  886. return false, 0
  887. }
  888. //默认2小时
  889. //var banTime uint64 = 2 * 60 * 60 //s
  890. var banTime = uint64(banDurationTime) * 60 * 60 //s
  891. if ban {
  892. //1封号,2禁言
  893. if banType == 1 {
  894. tmpRoleBase.BanTime = uint64(util.GetTimeSeconds()) + banTime
  895. } else if banType == 2 {
  896. tmpRoleBase.ChatBanTime = uint64(util.GetTimeSeconds()) + banTime
  897. }
  898. } else {
  899. if banType == 1 {
  900. tmpRoleBase.BanTime = 0
  901. } else if banType == 2 {
  902. tmpRoleBase.ChatBanTime = 0
  903. }
  904. //清除作弊次数
  905. tmpRoleRoleStatistic := &serverproto.RoleStatistic{}
  906. err = model.GetMessageFromRedis(dbmodel.RoleStatisticDataPrefix, value, tmpRoleRoleStatistic)
  907. if err == nil {
  908. tmpRoleRoleStatistic.CheatData = nil
  909. err = dbmodel.SetSystemDataToRedis(dbmodel.RoleStatisticDataPrefix, uid, tmpRoleRoleStatistic)
  910. if err != nil {
  911. util.InfoF("webGMRoleBan clear cheat data err=%v uid=%v", err, uid)
  912. }
  913. }
  914. }
  915. err = dbmodel.SetRoleToRedis(uid, tmpRoleBase)
  916. if err != nil {
  917. util.InfoF("webGMRoleBan save banTime err=%v uid=%v", err, uid)
  918. }
  919. //banType 1封号,2禁言
  920. if banType == 1 {
  921. dbmodel.DoUpdatePlayerBanInfo2MysqlORM(nil, uid, tmpRoleBase.BanTime, int32(banType))
  922. } else if banType == 2 {
  923. dbmodel.DoUpdatePlayerBanInfo2MysqlORM(nil, uid, tmpRoleBase.ChatBanTime, int32(banType))
  924. }
  925. //发送给social,在线的玩家直接踢下线
  926. banNtf := &serverproto.SSWebGMBanNtf{
  927. BanUid: uid,
  928. IsBan: ban,
  929. BanTime: banTime,
  930. BanType: int32(banType),
  931. }
  932. gmweb.SendSocial(banNtf)
  933. return true, tmpRoleBase.BanTime
  934. }
  935. // 服务器创建功能开启/关闭
  936. func webGMServerRegister(stateStr string) {
  937. service.GetRedis().HSet(model.ServerPrefix, "registerclose", stateStr)
  938. }
  939. func webGMServerConfigReload(cfgStrList []string) {
  940. ntfMsg := &serverproto.SSServerConfigReloadNtf{
  941. CfgList: cfgStrList,
  942. }
  943. gmweb.SendSocial(ntfMsg)
  944. }
  945. func WebGMLookMail(c *gin.Context) {
  946. uidStr := c.DefaultQuery("uid", "")
  947. tmpBeginTime := c.DefaultQuery("begin_time", "0")
  948. tmpEndTime := c.DefaultQuery("end_time", "0")
  949. beginT, _ := model.Str2NumU64(tmpBeginTime)
  950. endT, _ := model.Str2NumU64(tmpEndTime)
  951. if len(uidStr) <= 0 {
  952. c.JSON(http.StatusOK, "uid 错误")
  953. return
  954. }
  955. var ret []*serverproto.MailContent
  956. keyStr := dbmodel.RoleMailDataPrefix + uidStr
  957. valueStrList, err := service.GetRedis().HGetAll(keyStr).Result()
  958. if err != nil && err != service.NIL {
  959. util.InfoF("uid=%v GetRoleMailDataFromRedis err=%v", uidStr, err)
  960. return
  961. }
  962. for key, value := range valueStrList {
  963. if key == "maxId" || key == "gMaxId" {
  964. continue
  965. }
  966. //if key == "DelMail"{
  967. // tmp := &serverproto.DelMail{}
  968. // err := model.GetDecodeMessage(tmp, value)
  969. // if err != nil{continue}
  970. // for _, mail := range tmp.DelMail {
  971. // if mail.BeginTime < beginT{continue}
  972. // if endT > 0 && mail.BeginTime > endT{continue}
  973. // ret = append(ret, mail)
  974. // }
  975. //}
  976. mailData := &serverproto.MailContent{}
  977. if err := model.GetDecodeMessage(mailData, value); err != nil {
  978. util.InfoF("uid=%v GetRoleMailDataFromRedis key=%v err=%v", uidStr, key, err)
  979. continue
  980. } else {
  981. if mailData.BeginTime < beginT {
  982. continue
  983. }
  984. if endT > 0 && mailData.BeginTime > endT {
  985. continue
  986. }
  987. ret = append(ret, mailData)
  988. }
  989. }
  990. c.JSON(http.StatusOK, ret)
  991. }
  992. func WebGMSetHead(c *gin.Context) {
  993. uidStr := c.DefaultQuery("uid", "")
  994. headStr := c.DefaultQuery("headId", "0")
  995. stateStr := c.DefaultQuery("state", "0")
  996. headId, _ := model.Str2Num(headStr)
  997. state, _ := model.Str2Num(stateStr)
  998. uid, _ := model.Str2NumU64(uidStr)
  999. if headId <= 0 || state < 0 || uid <= 0 {
  1000. c.JSON(http.StatusOK, "parameter error")
  1001. return
  1002. }
  1003. msg := &serverproto.SSWebGMHeadChange{
  1004. HeadId: int32(headId),
  1005. Uid: uid,
  1006. State: int32(state),
  1007. }
  1008. gmweb.SendSocial(msg)
  1009. c.JSON(http.StatusOK, msg)
  1010. }
  1011. func WebGMGetHead(c *gin.Context) {
  1012. uidStr := c.DefaultQuery("uid", "")
  1013. if uidStr == "" {
  1014. c.JSON(http.StatusOK, "uid error:"+uidStr)
  1015. return
  1016. }
  1017. headData := &serverproto.RoleHead{}
  1018. err := model.GetMessageFromRedis(dbmodel.RoleHeadDataPrefix, uidStr, headData)
  1019. if err != nil && err != service.NIL {
  1020. c.JSON(http.StatusOK, "uid read redis head error"+uidStr)
  1021. return
  1022. }
  1023. retMsg := &serverproto.RoleHead{}
  1024. for _, data := range headData.Heads {
  1025. if data.State < int32(1) { // 未完成的称号不显示
  1026. continue
  1027. }
  1028. retMsg.Heads = append(retMsg.Heads, data)
  1029. }
  1030. c.JSON(http.StatusOK, retMsg)
  1031. }
  1032. // 删除背包内道具
  1033. func WebGMDelItem(c *gin.Context) {
  1034. uidStr := c.DefaultQuery("uid", "")
  1035. delItemStr := c.DefaultQuery("del", "")
  1036. if uidStr == "" {
  1037. c.JSON(http.StatusOK, "uid error:"+uidStr)
  1038. return
  1039. }
  1040. //uid
  1041. uid, _ := model.Str2NumU64(uidStr)
  1042. if uid <= 0 {
  1043. c.JSON(http.StatusOK, gin.H{
  1044. "err": "uid invalid",
  1045. })
  1046. util.InfoF("uid=%v uid invalid", uid)
  1047. return
  1048. }
  1049. //del item list
  1050. var delKV []*serverproto.KeyValueType
  1051. delItemStrList := strings.Split(delItemStr, ",")
  1052. for idx := 0; idx < len(delItemStrList); idx++ {
  1053. k, v := model.Str2Res(delItemStrList[idx])
  1054. if k <= 0 || v <= 0 {
  1055. continue
  1056. }
  1057. delKV = append(delKV, &serverproto.KeyValueType{Key: k, Value: v})
  1058. }
  1059. if len(delKV) <= 0 {
  1060. c.JSON(http.StatusOK, gin.H{
  1061. "err": "uid del item invalid",
  1062. })
  1063. util.InfoF("uid=%v item invalid", uid)
  1064. return
  1065. }
  1066. roleBag := &serverproto.RoleBag{}
  1067. err := dbmodel.GetSystemDataFromRedis(dbmodel.RoleBagDataPrefix, uid, roleBag)
  1068. if err != nil {
  1069. c.JSON(http.StatusOK, gin.H{
  1070. "err": "uid get bag error",
  1071. })
  1072. util.InfoF("uid=%v uid get bag error=%v", uid, err)
  1073. return
  1074. }
  1075. var tmpItemDataList []*serverproto.ItemData
  1076. for idx := 0; idx < len(delKV); idx++ {
  1077. delkv := delKV[idx]
  1078. for i := 0; i < len(roleBag.ItemList); i++ {
  1079. if roleBag.ItemList[i].ConfigId != delkv.Key {
  1080. tmpItemDataList = append(tmpItemDataList, roleBag.ItemList[i])
  1081. } else {
  1082. if roleBag.ItemList[i].Num >= uint32(delkv.Value) {
  1083. roleBag.ItemList[i].Num -= uint32(delkv.Value)
  1084. tmpItemDataList = append(tmpItemDataList, roleBag.ItemList[i])
  1085. }
  1086. }
  1087. }
  1088. }
  1089. roleBag.ItemList = tmpItemDataList
  1090. //1.直接数据库操作
  1091. dbmodel.SetSystemDataToRedis(dbmodel.RoleBagDataPrefix, uid, roleBag)
  1092. //2.在线发送给对应的game玩家
  1093. //发送给social,在线的玩家直接踢下线
  1094. banNtf := &serverproto.SSWebGMDelItemNtf{
  1095. Uid: uid,
  1096. DelItemList: delKV,
  1097. }
  1098. gmweb.SendSocial(banNtf)
  1099. c.JSON(http.StatusOK, gin.H{
  1100. "err": "del item ok",
  1101. })
  1102. }
  1103. var RedisCdk2 service.RedisConnector
  1104. func GetCdk(c *gin.Context) {
  1105. countStr := c.DefaultQuery("count", "")
  1106. awardStr := c.DefaultQuery("award", "")
  1107. if awardStr == "" {
  1108. c.JSON(http.StatusOK, "award error:"+awardStr)
  1109. return
  1110. }
  1111. count, e := strconv.Atoi(countStr)
  1112. if e != nil {
  1113. c.JSON(http.StatusOK, e)
  1114. return
  1115. }
  1116. var awardKV []*serverproto.KeyValueType
  1117. itemStrList := strings.Split(awardStr, ",")
  1118. for idx := 0; idx < len(itemStrList); idx++ {
  1119. k, v := model.Str2Res(itemStrList[idx])
  1120. if k <= 0 || v <= 0 {
  1121. continue
  1122. }
  1123. awardKV = append(awardKV, &serverproto.KeyValueType{Key: k, Value: v})
  1124. }
  1125. awardData := &serverproto.SCUseHeadFrameItemAck{}
  1126. awardData.ItemList = awardKV
  1127. err, a2 := model.GetEncodeMessage(awardData)
  1128. if err != nil {
  1129. c.JSON(http.StatusOK, err)
  1130. return
  1131. }
  1132. rand.Seed(time.Now().UnixNano())
  1133. f := excelize.NewFile()
  1134. sheetName := "Sheet1"
  1135. cdk := make(map[string]interface{}, 0)
  1136. for i := 0; i < count; i++ {
  1137. // 生成随机字符串
  1138. randomString := generateRandomString(length)
  1139. cdk[randomString] = a2
  1140. cellName, err := excelize.CoordinatesToCellName(1, i+1)
  1141. if err != nil {
  1142. c.JSON(http.StatusOK, err)
  1143. return
  1144. }
  1145. // 设置单元格的值
  1146. f.SetCellValue(sheetName, cellName, randomString)
  1147. }
  1148. util.InfoF("aaaa:%v", cdk)
  1149. _, err2 := RedisCdk2.RedisCli().HMSet(dbmodel.CdkNormal, cdk).Result()
  1150. if err2 != nil {
  1151. util.InfoF("aaaa3:%v", err2)
  1152. c.JSON(http.StatusOK, err2)
  1153. return
  1154. }
  1155. util.InfoF("aaaa2:%v", cdk)
  1156. // 保存文件
  1157. filePath := "cdkNormal.xlsx"
  1158. if err := f.SaveAs(filePath); err != nil {
  1159. c.JSON(http.StatusOK, err)
  1160. return
  1161. }
  1162. c.JSON(http.StatusOK, "cdk successful")
  1163. }
  1164. // 定义生成随机字符串的长度
  1165. const length = 15
  1166. func generateRandomString(length int) string {
  1167. // 定义可用的字符集(大写字母)
  1168. const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  1169. // 初始化一个字节切片来存储结果
  1170. result := make([]byte, length)
  1171. // 生成随机字符
  1172. for i := range result {
  1173. result[i] = charset[rand.Intn(len(charset))]
  1174. }
  1175. // 将字节切片转换为字符串并返回
  1176. return string(result)
  1177. }
  1178. // 删除背包内道具
  1179. func WebGMDelPoint(c *gin.Context) {
  1180. uidStr := c.DefaultQuery("uid", "")
  1181. delItemStr := c.DefaultQuery("del", "")
  1182. if uidStr == "" {
  1183. c.JSON(http.StatusOK, "uid error:"+uidStr)
  1184. return
  1185. }
  1186. //uid
  1187. uid, _ := model.Str2NumU64(uidStr)
  1188. if uid <= 0 {
  1189. c.JSON(http.StatusOK, gin.H{
  1190. "err": "uid invalid",
  1191. })
  1192. util.InfoF("uid=%v uid invalid", uid)
  1193. return
  1194. }
  1195. //del item list
  1196. var delKV []*serverproto.KeyValueType
  1197. delItemStrList := strings.Split(delItemStr, ",")
  1198. for idx := 0; idx < len(delItemStrList); idx++ {
  1199. k, v := model.Str2Res(delItemStrList[idx])
  1200. if k <= 0 || v <= 0 {
  1201. continue
  1202. }
  1203. delKV = append(delKV, &serverproto.KeyValueType{Key: k, Value: v})
  1204. }
  1205. if len(delKV) <= 0 {
  1206. c.JSON(http.StatusOK, gin.H{
  1207. "err": "uid del item invalid",
  1208. })
  1209. util.InfoF("uid=%v item invalid", uid)
  1210. return
  1211. }
  1212. //2.在线发送给对应的game玩家
  1213. //发送给social,在线的玩家直接踢下线
  1214. banNtf := &serverproto.SSWebGMDelItemNtf{
  1215. Uid: uid,
  1216. DelItemList: delKV,
  1217. IsPoint: true,
  1218. }
  1219. gmweb.SendSocial(banNtf)
  1220. c.JSON(http.StatusOK, gin.H{
  1221. "err": "del item ok",
  1222. })
  1223. }
  1224. // 删除背包内道具
  1225. func WebGMDelItemAll(c *gin.Context) {
  1226. uidStr := c.DefaultQuery("uid", "")
  1227. delItemStr := c.DefaultQuery("del", "")
  1228. if uidStr == "" {
  1229. c.JSON(http.StatusOK, "uid error:"+uidStr)
  1230. return
  1231. }
  1232. //uid
  1233. uid, _ := model.Str2NumU64(uidStr)
  1234. if uid <= 0 {
  1235. c.JSON(http.StatusOK, gin.H{
  1236. "err": "uid invalid",
  1237. })
  1238. util.InfoF("uid=%v uid invalid", uid)
  1239. return
  1240. }
  1241. //del item list
  1242. var delKV []*serverproto.KeyValueType
  1243. delItemStrList := strings.Split(delItemStr, ",")
  1244. for idx := 0; idx < len(delItemStrList); idx++ {
  1245. k, v := model.Str2Res(delItemStrList[idx])
  1246. if k <= 0 || v <= 0 {
  1247. continue
  1248. }
  1249. delKV = append(delKV, &serverproto.KeyValueType{Key: k, Value: v})
  1250. }
  1251. if len(delKV) <= 0 {
  1252. c.JSON(http.StatusOK, gin.H{
  1253. "err": "uid del item invalid",
  1254. })
  1255. util.InfoF("uid=%v item invalid", uid)
  1256. return
  1257. }
  1258. roleBag := &serverproto.RoleBag{}
  1259. err := dbmodel.GetSystemDataFromRedis(dbmodel.RoleBagDataPrefix, uid, roleBag)
  1260. if err != nil {
  1261. c.JSON(http.StatusOK, gin.H{
  1262. "err": "uid get bag error",
  1263. })
  1264. util.InfoF("uid=%v uid get bag error=%v", uid, err)
  1265. return
  1266. }
  1267. var count uint32
  1268. //var tmpItemDataList []*serverproto.ItemData
  1269. for idx := 0; idx < len(delKV); idx++ {
  1270. delkv := delKV[idx]
  1271. for i := 0; i < len(roleBag.ItemList); i++ {
  1272. if roleBag.ItemList[i].ConfigId != delkv.Key {
  1273. //tmpItemDataList = append(tmpItemDataList, roleBag.ItemList[i])
  1274. continue
  1275. } else {
  1276. count = count + roleBag.ItemList[i].Num
  1277. roleBag.ItemList[i].Num = 0
  1278. }
  1279. }
  1280. }
  1281. //roleBag.ItemList = tmpItemDataList
  1282. //1.直接数据库操作
  1283. dbmodel.SetSystemDataToRedis(dbmodel.RoleBagDataPrefix, uid, roleBag)
  1284. if count > 0 {
  1285. util.ErrorF("del 707 uid:%v count:%v", uid, count)
  1286. }
  1287. //2.在线发送给对应的game玩家
  1288. //发送给social,在线的玩家直接踢下线
  1289. //banNtf := &serverproto.SSWebGMDelItemNtf{
  1290. // Uid: uid,
  1291. // DelItemList: delKV,
  1292. //}
  1293. //gmweb.SendSocial(banNtf)
  1294. c.JSON(http.StatusOK, gin.H{
  1295. "err": "del item ok",
  1296. })
  1297. }
  1298. // 删除背包内道具
  1299. func WebGMDelEquip(c *gin.Context) {
  1300. uidStr := c.DefaultQuery("uid", "")
  1301. delItemStr := c.DefaultQuery("del", "")
  1302. if uidStr == "" {
  1303. c.JSON(http.StatusOK, "uid error:"+uidStr)
  1304. return
  1305. }
  1306. //uid
  1307. uid, _ := model.Str2NumU64(uidStr)
  1308. if uid <= 0 {
  1309. c.JSON(http.StatusOK, gin.H{
  1310. "err": "uid invalid",
  1311. })
  1312. util.InfoF("uid=%v uid invalid", uid)
  1313. return
  1314. }
  1315. //del item list
  1316. var delKV []*serverproto.KeyValueType
  1317. delItemStrList := strings.Split(delItemStr, ",")
  1318. for idx := 0; idx < len(delItemStrList); idx++ {
  1319. k, v := model.Str2Res(delItemStrList[idx])
  1320. if k <= 0 || v <= 0 {
  1321. continue
  1322. }
  1323. delKV = append(delKV, &serverproto.KeyValueType{Key: k, Value: v})
  1324. }
  1325. if len(delKV) <= 0 {
  1326. c.JSON(http.StatusOK, gin.H{
  1327. "err": "uid del item invalid",
  1328. })
  1329. util.InfoF("uid=%v item invalid", uid)
  1330. return
  1331. }
  1332. roleBag := &serverproto.RoleEquip{}
  1333. err := dbmodel.GetSystemDataFromRedis(dbmodel.RoleEquipDataPrefix, uid, roleBag)
  1334. if err != nil {
  1335. c.JSON(http.StatusOK, gin.H{
  1336. "err": err,
  1337. })
  1338. util.ErrorF("uid=%v uid get equip error=%v", uid, err)
  1339. return
  1340. }
  1341. roleBase := &serverproto.RoleBase{}
  1342. _ = dbmodel.GetRoleBaseFromRedis(uid, roleBase)
  1343. roleHero := &serverproto.RoleHero{}
  1344. err = dbmodel.GetRoleHeroDataFromRedis(uid, roleHero)
  1345. if err != nil {
  1346. c.JSON(http.StatusOK, gin.H{
  1347. "err": "uid get bag error",
  1348. })
  1349. util.InfoF("uid=%v uid get hero error=%v", uid, err)
  1350. return
  1351. }
  1352. //roleCard := &serverproto.RoleCard{}
  1353. //err = dbmodel.GetSystemDataFromRedis(dbmodel.RoleCardDataPrefix, uid, roleCard)
  1354. //if err != nil {
  1355. // c.JSON(http.StatusOK, gin.H{
  1356. // "err": "uid get bag error",
  1357. // })
  1358. // util.InfoF("uid=%v uid get hero error=%v", uid, err)
  1359. // return
  1360. //}
  1361. var count int32
  1362. //var tmpItemDataList []*serverproto.EquipData
  1363. for i := 0; i < len(roleBag.EquipList); i++ {
  1364. for idx := 0; idx < len(delKV); idx++ {
  1365. delkv := delKV[idx]
  1366. if roleBag.EquipList[i].ConfigId != delkv.Key {
  1367. continue
  1368. } else {
  1369. count = count + roleBag.EquipList[i].Num
  1370. roleBag.EquipList[i].Num = 0
  1371. }
  1372. }
  1373. }
  1374. var count2 int32
  1375. for idx := 0; idx < len(delKV); idx++ {
  1376. delkv := delKV[idx]
  1377. for i := 0; i < len(roleBase.RoleData.HeroData.Slot.SlotList); i++ {
  1378. if roleBase.RoleData.HeroData.Slot.SlotList[i].EquipId != delkv.Key {
  1379. continue
  1380. } else {
  1381. roleBase.RoleData.HeroData.Slot.SlotList[i].EquipId = 0
  1382. count2++
  1383. }
  1384. }
  1385. }
  1386. var count3 int32
  1387. ////cardlist := make([]int32, 0)
  1388. for idx := 0; idx < len(delKV); idx++ {
  1389. delkv := delKV[idx]
  1390. for i := 0; i < len(roleHero.HeroData); i++ {
  1391. for j := 0; j < len(roleHero.HeroData[i].Slot.SlotList); j++ {
  1392. if roleHero.HeroData[i].Slot.SlotList[j].EquipId != delkv.Key {
  1393. continue
  1394. } else {
  1395. roleHero.HeroData[i].Slot.SlotList[j].EquipId = 0
  1396. count3++
  1397. //util.ErrorF("get equip2 uid:%v count:%v", uid, count)
  1398. }
  1399. }
  1400. }
  1401. }
  1402. if count+count2+count3 > 0 {
  1403. util.ErrorF("del equip uid:%v count:%v ,%v,%v", uid, count, count2, count3)
  1404. }
  1405. //1.直接数据库操作
  1406. dbmodel.SetRoleHeroDataToRedis(uid, roleHero)
  1407. dbmodel.SetSystemDataToRedis(dbmodel.RoleEquipDataPrefix, uid, roleBag)
  1408. //dbmodel.SetRoleToRedis(uid, roleBase)
  1409. //2.在线发送给对应的game玩家
  1410. //发送给social,在线的玩家直接踢下线
  1411. //banNtf := &serverproto.SSWebGMDelItemNtf{
  1412. // Uid: uid,
  1413. // DelItemList: delKV,
  1414. //}
  1415. //gmweb.SendSocial(banNtf)
  1416. c.JSON(http.StatusOK, gin.H{
  1417. "err": "del item ok",
  1418. })
  1419. }
  1420. /*
  1421. //检索玩家数据
  1422. http://127.0.0.1:8086/gm/user_get?nickname=11&lmin=1&lmax=3&createdate=2020-05-07&banstatus=0&maplevel=2&fmin=1&fmax=3&pnum=1
  1423. nickname 昵称,不需要则不填写去掉nickname=11
  1424. lmin=1&lmax=3 等级,[min,max]区间内
  1425. createdate=2020-05-07 创建角色日期
  1426. lastlogindate=2020-05-07 最后登录日期
  1427. banstatus=0 当前玩家状态:0表示正常1表示封号
  1428. maplevel=10001 关卡进度,格式为mapid * 10000 + maplevel
  1429. fmin=1&fmax=2 队伍战力 [min,max]区间
  1430. pnum=1 表示当前是第几页
  1431. //获取玩家详细信息
  1432. //http://127.0.0.1:8086/gm/info_get?uid=6824453512924037889
  1433. 根据检索玩家数据,得到对应的玩家uid,再使用该url获取玩家的相信信息
  1434. uid=6824453512924037889 玩家uid
  1435. //封号
  1436. //http://127.0.0.1:8086/gm/ban?uid=6824453512924037889&ban=1
  1437. ban=1 1表示封号,0表示解封
  1438. //聊天管理
  1439. //1私聊,2公聊
  1440. //http://127.0.0.1:8086/gm/chat_msg?type=2&uid=6824453512924037889&msgdate=2020-05-05%2021:42:59
  1441. type=2 1私聊,2公聊
  1442. uid=6824453512924037889 玩家uid
  1443. msgdate=2020-05-05%2021:42:59 >=该时间后的所有聊天信息
  1444. //邮件管理
  1445. //http://127.0.0.1:8086/gm/mail?type=list 获取当前的定时邮件列表
  1446. //http://127.0.0.1:8086/gm/mail?type=add&title=title&content=content&reward=101:1,102:3 添加邮件
  1447. //http://127.0.0.1:8086/gm/mail?type=add&title=title&content=content&reward=101:1,102:3&senddate=2020-05-09%2000:00:00 添加邮件
  1448. //http://127.0.0.1:8086/gm/mail?type=del&id=1 删除延迟发送邮件(该邮件还未发送时才会删除成功)
  1449. type=list list获取邮件列表操作,add添加操作,del删除操作
  1450. title=标题 邮件标题
  1451. content=正文 邮件正文
  1452. reward=奖励 邮件奖励,格式: 101:1,102:3,106:222
  1453. */
  1454. //登录的账号和密码
  1455. //[wtgame,wtgame123]
  1456. //需要在请求时带上token
  1457. //发送公告
  1458. //http://127.0.0.1:8086/gm/notice?&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTAyMzEyNTAsImlhdCI6MTU5MDIyNzY1MH0.PIGt_fXQFai4NJz3sg2LICbQFRFWWwxuak8KkUGtsig&col=<color=%23ff4b14>商城购买12312321!!123123!!!!!!!!!!<%2Fcolor>&count=5&interval=5
  1459. //<color=%23ff4b14>商城购买12312321!!123123!!!!!!!!!!<%2Fcolor>
  1460. //记得修改<color=%23ff4b14>和<%2Fcolor>之间的内容