web_gmmsg.go 36 KB

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