web_gmmsg.go 49 KB

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