web_gmmsg.go 39 KB

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