errors.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. // Package msg
  2. // 一个错误编号表示唯一一个错误发生地点
  3. // 错误编号格式:顺序号*1000000 + 程序编号*1000 + 模块编号
  4. // 模块内函数发生错误,编号:1-100
  5. // 特定错误,编号:101-200
  6. // 其他地方发生错误,占用地址列表
  7. // 1、
  8. package errorcoder
  9. // ErrorCode 结构体表示错误编码
  10. type ErrorCoder struct {
  11. ProgramID int64
  12. ModuleID int64
  13. }
  14. // 程序
  15. const (
  16. ServerTypeLogin = 1
  17. ServerTypeGate = 2
  18. ServerTypeWorld = 3
  19. ServerTypeGameFrameSync = 4
  20. ServerTypeMax = 999
  21. ServerTypeAll = 0 // 所有服务器通用
  22. )
  23. // gate模块
  24. const (
  25. GateModleGame = 1
  26. GateModleGate = 2
  27. GateModlePush = 3
  28. )
  29. // world模块
  30. const (
  31. WorldModleDb = 1
  32. WorldModleGame = 2
  33. WorldModleGate = 3
  34. WorldModleSystemData = 4
  35. WorldModleChat = 5
  36. AllModleMax = 999
  37. AllModleAll = 0 // 所有模块通用
  38. )
  39. // GameFrameSync模块
  40. const (
  41. GameFrameSyncModleDb = 1
  42. GameFrameSyncModleGame = 2
  43. GameFrameSyncModleGate = 3
  44. GameFrameSyncModleSystemData = 4
  45. GameFrameSyncSync = 5
  46. )
  47. // 对象类型 1000种
  48. const (
  49. ErrObjectParam = 1
  50. ErrObjectPlayer = 2
  51. ErrObjectConfig = 3
  52. ErrObjectCondition = 4
  53. ErrObjectTarget = 5
  54. ErrObjectItem = 6
  55. ErrObjectResult = 7
  56. // ErrObjectHero = 9
  57. // ErrObjectTreasures = 10
  58. // ErrObjectChapter = 11
  59. // ErrObjectReward = 12
  60. // ErrObjectStam = 13
  61. // ErrObjectChat = 14
  62. // ErrObjectLegend = 15
  63. // ErrObjectFriend = 16
  64. // ErrObjectPatrol = 17
  65. // ErrObjectTask = 18
  66. // ErrObjectShop = 19
  67. // ErrObjectAc = 20
  68. // ErrObjectGameSync = 50 // 游戏同步
  69. ErrObjectSystem = 90
  70. ErrObjectDb = 91
  71. ErrObjectRedis = 92
  72. ErrObjectFunc = 93 // 函数
  73. ErrObjectMax = 999
  74. )
  75. // 每个对象100种状态
  76. // 定义10个常用状态
  77. const (
  78. ErrStatusInvalid = 91 // 无效
  79. ErrStatusNotFound = 92 // 未发现
  80. ErrStatusNotEnough = 93 // 不够
  81. ErrStatusError = 94 // 错误
  82. ErrStatusOverstep = 95 // 超出
  83. )
  84. const (
  85. ErrStatusLoadProcess = 91 // LoadProcess出错
  86. )
  87. const (
  88. MultipleObject = 100
  89. // 全局参数 一般不要用,防止出现问题定位不到在所在程序及位置
  90. // 999 999 001 0000 - 999 999 999 9999
  91. ErrPlayerNoToken = 999_999_000_0000 + errPlayerNoToken*100
  92. ErrPlayerBanLogin = 999_999_000_0000 + errPlayerBanLogin*100
  93. ErrPlayerOtherLogin = 999_999_000_0000 + errPlayerOtherLogin*100
  94. // ErrPlayerNoToken = 999_999_000_0000 + errPlayerNoToken*100
  95. ErrSystemUpgrade = 999_999_000_0000 + ErrObjectSystem*10000 + 1*100
  96. ErrSystemFull = 999_999_000_0000 + ErrObjectSystem*10000 + 2*100
  97. ErrSystemFoundCheat = 999_999_000_0000 + ErrObjectSystem*10000 + 3*100
  98. // 请求参数 100
  99. ErrParamInvalid = ErrObjectParam*MultipleObject + ErrStatusInvalid
  100. // 玩家 200
  101. errPlayerBanLogin = ErrObjectPlayer*MultipleObject + 1
  102. errPlayerOtherLogin = ErrObjectPlayer*MultipleObject + 2
  103. ErrPlayerNotFound = ErrObjectPlayer*MultipleObject + ErrStatusNotFound
  104. errPlayerNoToken = ErrObjectPlayer*MultipleObject + 3
  105. // 道具 300
  106. ErrItemNotFound = ErrObjectItem*MultipleObject + ErrStatusNotFound
  107. ErrItemNotEnough = ErrObjectItem*MultipleObject + ErrStatusNotEnough
  108. // 目标
  109. ErrTargetNotFound = ErrObjectTarget*MultipleObject + ErrStatusNotFound
  110. // 配置
  111. ErrConfigNotFound = ErrObjectConfig*MultipleObject + ErrStatusNotFound
  112. ErrConfigError = ErrObjectConfig*MultipleObject + ErrStatusError
  113. // 条件
  114. ErrConditionNotEnough = ErrObjectCondition*MultipleObject + ErrStatusNotEnough
  115. // 结果
  116. ErrResultError = ErrObjectResult*MultipleObject + ErrStatusError
  117. // 英雄 400
  118. // ErrHeroNotFound = ErrObjectHero*MultipleObject + ErrStatusNotFound
  119. // // 宝物 500
  120. // ErrTreasuresNotFound = ErrObjectTreasures*MultipleObject + ErrStatusNotFound
  121. // 数据库 600
  122. ErrDBExec = ErrObjectDb*MultipleObject + 1
  123. ErrDBLoadNil = ErrObjectDb*MultipleObject + 2
  124. // redis 700
  125. ErrRedisExec = ErrObjectRedis*MultipleObject + 1
  126. // 章节
  127. // ErrChapterNotFound = ErrObjectChapter*Multiple100 + ErrStatusNotFound
  128. // ErrChapterLimit = ErrObjectChapter*Multiple100 + ErrStatusError
  129. // //奖励
  130. // ErrRewardNotFound = ErrObjectReward*Multiple100 + ErrStatusNotFound
  131. // ErrRewardIsReceived = ErrObjectReward*Multiple100 + 1 // 已领取
  132. // //体力
  133. // ErrStamOverstep = ErrObjectStam*Multiple100 + ErrStatusOverstep
  134. //聊天
  135. // ErrEmojiError = ErrObjectChat*Multiple100 + 1
  136. // ErrEmojiUnlock = ErrObjectChat*Multiple100 + 2
  137. // ErrChatError = ErrObjectChat*Multiple100 + 3
  138. // ErrChatBlockedChannel = ErrObjectChat*Multiple100 + 4
  139. // ErrChatBlockedUser = ErrObjectChat*Multiple100 + 5
  140. // ErrChatContent = ErrObjectChat*Multiple100 + 6
  141. // ErrChatSendCDTs = ErrObjectChat*Multiple100 + 7
  142. // ErrPrivatePlayerNotExist = ErrObjectChat*Multiple100 + 8
  143. // // 铭文
  144. // ErrLegendUnique = ErrObjectLegend*Multiple100 + 1
  145. // ErrLegendSlotUnlock = ErrObjectLegend*Multiple100 + 2
  146. // ErrLegendSlotNoMatch = ErrObjectLegend*Multiple100 + 3
  147. // ErrLevelNotEnough = ErrObjectLegend*Multiple100 + 4
  148. // // 好友
  149. // ErrFriendGiveError = ErrObjectFriend*Multiple100 + 1
  150. // ErrFriendGiveHad = ErrObjectFriend*Multiple100 + 2
  151. // ErrFriendRecCountFull = ErrObjectFriend*Multiple100 + 3
  152. // ErrFriendNotRecCount = ErrObjectFriend*Multiple100 + 4
  153. // // 巡逻
  154. // ErrPatrolLock = ErrObjectPatrol*Multiple100 + 1
  155. // ErrPatrolReceiveReward = ErrObjectPatrol*Multiple100 + 2
  156. // ErrPatrolNoAdNum = ErrObjectPatrol*Multiple100 + 3
  157. // ErrPatrolNoFastNum = ErrObjectPatrol*Multiple100 + 4
  158. // ErrPatrolGtDanNum = ErrObjectPatrol*Multiple100 + 5
  159. // ErrPatrolGtUserPoint = ErrObjectPatrol*Multiple100 + 6
  160. // // 任务
  161. // ErrTaskUnfinished = ErrObjectTask*Multiple100 + 1
  162. // ErrTaskUnClaimable = ErrObjectTask*Multiple100 + 2
  163. // ErrTaskIsClaimed = ErrObjectTask*Multiple100 + 3
  164. // ErrTaskClaimErr = ErrObjectTask*Multiple100 + 4
  165. // // 商店
  166. // ErrShopFreeRefreshNotEnough = ErrObjectShop*Multiple100 + 1
  167. // ErrShopGoldRefreshNotEnough = ErrObjectShop*Multiple100 + 2
  168. // ErrShopAdRefreshNotEnough = ErrObjectShop*Multiple100 + 3
  169. // ErrShopGoodsNotUnlock = ErrObjectShop*Multiple100 + 4
  170. // ErrShopGoodsBuyNotEnough = ErrObjectShop*Multiple100 + 5
  171. // ErrShopGoodsOwned = ErrObjectShop*Multiple100 + 6
  172. // // 精彩活动
  173. // ErrAcAlreadyBuy = ErrObjectAc*Multiple100 + 1
  174. // ErrAcCardNotBuy = ErrObjectAc*Multiple100 + 2
  175. // ErrAcCardNotActive = ErrObjectAc*Multiple100 + 3
  176. // ErrAcAlreadyGet = ErrObjectAc*Multiple100 + 4
  177. // ErrAcCardAlreadyBuy = ErrObjectAc*Multiple100 + 5
  178. // ErrAcActiveAdMaxCount = ErrObjectAc*Multiple100 + 6
  179. // ErrAcOverLimit = ErrObjectAc*Multiple100 + 7
  180. // ErrAcLocked = ErrObjectAc*Multiple100 + 8
  181. // ErrFirstChargeNotBuy = ErrObjectAc*Multiple100 + 9
  182. // ErrAcNoReward = ErrObjectAc*Multiple100 + 10
  183. // ErrAcNotOpen = ErrObjectAc*Multiple100 + 11
  184. // ErrAcNotComplete = ErrObjectAc*Multiple100 + 12
  185. // ErrGameSyncLoginOther = ErrObjectGameSync*Multiple100 + 1
  186. // ErrGameSyncParam = ErrObjectGameSync*Multiple100 + 2
  187. // ErrRoomDisband = ErrObjectGameSync*Multiple100 + 3
  188. // ErrRoomFrameErr = ErrObjectGameSync*Multiple100 + 4
  189. // ErrPlayerSettleErr = ErrObjectGameSync*Multiple100 + 5
  190. // ErrRoomCacheFrameErr = ErrObjectGameSync*Multiple100 + 6
  191. // ErrRoomNotFoundPlayerErr = ErrObjectGameSync*Multiple100 + 6
  192. // 配置
  193. // ErrConfigMaxOnline = ErrObjectConfig*Multiple100 + 1
  194. ErrMaxTypeMaxStatus = ErrObjectMax*100 + 99 // 99900+99 = 999_99
  195. ErrMaxVal = 999*1000_000_0000 + 999*1000_0000 + 999*10000 + 99*100 + 99
  196. )
  197. // 每种状态在同一个函数种可以使用100次,需要序号递增
  198. // initErrorCodes 是一个包级初始化函数,用于设置程序编号和模块编号
  199. // login 1:
  200. // world 2: db:1; game:2; gate:3; systemdata:4
  201. // gate 3:
  202. var (
  203. appErrorCoder *ErrorCoder
  204. )
  205. func InitModuleErrorCoder(programID, moduleID int64) *ErrorCoder {
  206. errorCodes := new(ErrorCoder)
  207. errorCodes.ProgramID = programID
  208. errorCodes.ModuleID = moduleID
  209. return errorCodes
  210. }
  211. func (ec *ErrorCoder) CalcErrorCode1(seq int64) int64 {
  212. return ec.ProgramID*1000_000_0000 + ec.ModuleID*1000_0000 + seq
  213. }
  214. // CalcErrorCode3 生成错误编号,只需要提供顺序号
  215. func (ec *ErrorCoder) CalcErrorCode3(errObj int64, errStatus int64, seq int64) int64 {
  216. return ec.ProgramID*1000_000_0000 + ec.ModuleID*1000_0000 + errObj*10000 + errStatus*100 + seq
  217. }
  218. func (ec *ErrorCoder) CalcErrorCode4(moduleId int64, errObj int64, errStatus int64, seq int64) int64 {
  219. return ec.ProgramID*1000_000_0000 + moduleId*1000_0000 + errObj*10000 + errStatus*100 + seq
  220. }
  221. func InitAppErrorCoder(programID int64) *ErrorCoder {
  222. errorCoder := new(ErrorCoder)
  223. errorCoder.ProgramID = programID
  224. errorCoder.ModuleID = AllModleAll
  225. appErrorCoder = errorCoder
  226. return errorCoder
  227. }
  228. // return appErrorCoder.ProgramID*1000_000_00_00 + appErrorCoder.ModuleID*1000_0000 + errObj*10000 + errStatus*100 + seq
  229. func CalcErrorCode(seq int64) int64 {
  230. return appErrorCoder.CalcErrorCode1(seq)
  231. }
  232. func GetErrCoderMethodWithFunc(funcAsState ...int64) func(int64) int {
  233. funcFlag1 := int64(0)
  234. if len(funcAsState) > 0 {
  235. funcFlag1 = funcAsState[0]
  236. }
  237. return func(seq int64) int {
  238. errCode := appErrorCoder.CalcErrorCode4(appErrorCoder.ModuleID, ErrObjectFunc, funcFlag1, seq)
  239. return int(errCode)
  240. }
  241. }
  242. func CalcInterfaceErrorCode(funcFlag int64, seq int64) int64 {
  243. return appErrorCoder.CalcErrorCode4(AllModleAll, ErrObjectFunc, funcFlag, seq)
  244. }
  245. func GetCalcInterfaceErrMethod(funcFlag ...int64) func(int64) int64 {
  246. funcFlag1 := int64(0)
  247. if len(funcFlag) > 0 {
  248. funcFlag1 = funcFlag[0]
  249. }
  250. return func(seq int64) int64 {
  251. return appErrorCoder.CalcErrorCode4(AllModleAll, ErrObjectFunc, funcFlag1, seq)
  252. }
  253. }
  254. func CalcUniqueErrorCode2(obj int64, state int64) int64 {
  255. return ServerTypeAll*1000_000_0000 + AllModleAll*1000_0000 + obj*10000 + state*100 //
  256. }
  257. func CalcUniqueErrorCode3(obj int64, state int64, seq int64) int64 {
  258. return ServerTypeAll*1000_000_0000 + AllModleAll*1000_0000 + obj*10000 + state*100 + seq //
  259. }
  260. func PrintErrorCode() {
  261. // errorEncoder1 := InitModuleErrorCoder(ServerTypeGate, GateModleGame)
  262. // errorEncoder1.PrintError(ErrParamInvalid, "参数错误")
  263. // errorEncoder1.PrintError(ErrPlayerBanLogin, "禁止登录")
  264. // errorEncoder1.PrintError(ErrPlayerOtherLogin, "异地登录")
  265. // errorEncoder1.PrintError(ErrPlayerNotFound, "玩家未登录")
  266. // errorEncoder1.PrintError(ErrPlayerNoToken, "玩家凭证不存在")
  267. // errorEncoder2 := InitModuleErrorCoder(ServerTypeWorld, WorldModleGame)
  268. // errorEncoder2.PrintError(ErrItemNotEnough, "道具不足")
  269. // errorEncoder2.PrintError(ErrItemNotFound, "道具不存在")
  270. // errorEncoder2.PrintError(ErrHeroNotFound, "英雄不存在")
  271. // errorEncoder2.PrintError(ErrTreasuresNotFound, "宝物不存在")
  272. // errorEncoder2.PrintError(ErrDBExec, "数据库错误")
  273. // errorEncoder2.PrintError(ErrDBLoadNil, "数据库加载错误")
  274. // errorEncoder2.PrintError(ErrRedisExec, "缓存错误")
  275. // errorEncoder2.PrintError(ErrTargetNotFound, "目标未发现")
  276. // errorEncoder2.PrintError(ErrConfigNotFound, "配置未发现")
  277. // errorEncoder2.PrintError(ErrConditionNotEnough, "条件不满足")
  278. // errorEncoder1.PrintError(ErrPlayerNoToken, "玩家凭证不存在")
  279. // errorEncoder1.PrintError(ErrPlayerBanLogin, "禁止登录")
  280. // errorEncoder1.PrintError(ErrPlayerOtherLogin, "异地登录")
  281. // errorEncoder1.PrintError(ErrSystemUpgrade, "系统维护")
  282. // errorEncoder1.PrintError(ErrSystemFull, "服务器满")
  283. // errorEncoder1.PrintError(ErrSystemFoundCheat, "数据异常")
  284. // 20010019100:参数错误
  285. // 20010020100:禁止登录
  286. // 20010020200:异地登录
  287. // 20010029200:玩家未登录
  288. // 20010020300:玩家凭证不存在
  289. // 20010020400:达到最大在线数
  290. // 30020030100:道具不足
  291. // 30020039200:道具不存在
  292. // 30020049200:英雄不存在
  293. // 30020059200:宝物不存在
  294. // 30020060100:数据库错误
  295. // 30020060200:数据库加载错误
  296. // 30020070100:缓存错误
  297. }