@xmobitea/gn-typescript-client 2.6.13-tsc → 2.6.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/AGENTS.md +37 -0
  2. package/README.MD +420 -1
  3. package/dist/gearn.js.client.js +71354 -0
  4. package/dist/gearn.js.client.min.js +2 -0
  5. package/dist/gearn.js.client.min.js.LICENSE.txt +14 -0
  6. package/dist/index.d.ts +30 -0
  7. package/dist/index.js +58386 -339
  8. package/dist/runtime/GNNetwork.d.ts +687 -3
  9. package/dist/runtime/GNNetworkAuthenticateApi.d.ts +327 -0
  10. package/dist/runtime/GNNetworkCharacterPlayerApi.d.ts +1026 -0
  11. package/dist/runtime/GNNetworkCloudScriptApi.d.ts +141 -0
  12. package/dist/runtime/GNNetworkContentApi.d.ts +243 -0
  13. package/dist/runtime/GNNetworkDashboardApi.d.ts +221 -0
  14. package/dist/runtime/GNNetworkGamePlayerApi.d.ts +1033 -0
  15. package/dist/runtime/GNNetworkGroupApi.d.ts +783 -0
  16. package/dist/runtime/GNNetworkInventoryApi.d.ts +673 -0
  17. package/dist/runtime/GNNetworkMasterPlayerApi.d.ts +1614 -6
  18. package/dist/runtime/GNNetworkMultiplayerApi.d.ts +234 -0
  19. package/dist/runtime/GNNetworkStoreInventoryApi.d.ts +309 -0
  20. package/dist/runtime/common/Action0.d.ts +30 -0
  21. package/dist/runtime/common/Action1.d.ts +32 -0
  22. package/dist/runtime/common/Action2.d.ts +21 -0
  23. package/dist/runtime/common/Action3.d.ts +16 -0
  24. package/dist/runtime/common/Action4.d.ts +17 -0
  25. package/dist/runtime/common/GNData.d.ts +368 -0
  26. package/dist/runtime/config/GNServerSettings.d.ts +442 -12
  27. package/dist/runtime/constant/Commands.d.ts +80 -0
  28. package/dist/runtime/constant/EventCode.d.ts +48 -0
  29. package/dist/runtime/constant/OperationCode.d.ts +74 -1
  30. package/dist/runtime/constant/ReturnCode.d.ts +72 -0
  31. package/dist/runtime/constant/enumType/ExecuteResponseStatus.d.ts +31 -0
  32. package/dist/runtime/constant/enumType/FriendStatus.d.ts +39 -0
  33. package/dist/runtime/constant/enumType/GoogleLoginType.d.ts +23 -0
  34. package/dist/runtime/constant/enumType/GroupStatus.d.ts +32 -0
  35. package/dist/runtime/constant/enumType/InvalidMemberType.d.ts +75 -0
  36. package/dist/runtime/constant/enumType/ItemType.d.ts +23 -0
  37. package/dist/runtime/constant/enumType/MatchStatus.d.ts +30 -0
  38. package/dist/runtime/constant/enumType/MatchmakingMemberStatus.d.ts +24 -0
  39. package/dist/runtime/constant/enumType/MatchmakingTicketStatus.d.ts +34 -0
  40. package/dist/runtime/constant/enumType/OwnerType.d.ts +40 -0
  41. package/dist/runtime/constant/enumType/PermissionDataItem.d.ts +22 -0
  42. package/dist/runtime/constant/enumType/PushPlatformType.d.ts +18 -0
  43. package/dist/runtime/constant/enumType/RequestRole.d.ts +32 -0
  44. package/dist/runtime/constant/enumType/RequestType.d.ts +70 -0
  45. package/dist/runtime/constant/enumType/StoreItemType.d.ts +21 -0
  46. package/dist/runtime/constant/enumType/StoreReceiveType.d.ts +30 -0
  47. package/dist/runtime/constant/errorCode/ErrorCode.d.ts +190 -8
  48. package/dist/runtime/constant/parameterCode/ParameterCode.d.ts +35 -5
  49. package/dist/runtime/entity/DataMember.d.ts +338 -0
  50. package/dist/runtime/entity/GNMetadata.d.ts +101 -0
  51. package/dist/runtime/entity/InvalidMember.d.ts +28 -0
  52. package/dist/runtime/entity/OperationEvent.d.ts +49 -0
  53. package/dist/runtime/entity/OperationRequest.d.ts +108 -0
  54. package/dist/runtime/entity/OperationResponse.d.ts +110 -0
  55. package/dist/runtime/entity/models/AuthenticateModels.d.ts +115 -0
  56. package/dist/runtime/entity/models/AuthenticateRequestModels.d.ts +131 -0
  57. package/dist/runtime/entity/models/AuthenticateResponseModels.d.ts +131 -0
  58. package/dist/runtime/entity/models/CharacterPlayerModels.d.ts +625 -1
  59. package/dist/runtime/entity/models/CharacterPlayerRequestModels.d.ts +972 -0
  60. package/dist/runtime/entity/models/CharacterPlayerResponseModels.d.ts +332 -0
  61. package/dist/runtime/entity/models/CloudScriptModels.d.ts +109 -0
  62. package/dist/runtime/entity/models/CloudScriptRequestModels.d.ts +107 -0
  63. package/dist/runtime/entity/models/CloudScriptResponseModels.d.ts +46 -0
  64. package/dist/runtime/entity/models/ContentModels.d.ts +124 -0
  65. package/dist/runtime/entity/models/ContentRequestModels.d.ts +152 -0
  66. package/dist/runtime/entity/models/ContentResponseModels.d.ts +58 -0
  67. package/dist/runtime/entity/models/DashboardModels.d.ts +371 -8
  68. package/dist/runtime/entity/models/DashboardRequestModels.d.ts +172 -0
  69. package/dist/runtime/entity/models/DashboardResponseModels.d.ts +170 -0
  70. package/dist/runtime/entity/models/GamePlayerModels.d.ts +644 -1
  71. package/dist/runtime/entity/models/GamePlayerRequestModels.d.ts +959 -0
  72. package/dist/runtime/entity/models/GamePlayerResponseModels.d.ts +333 -1
  73. package/dist/runtime/entity/models/GenericModels.d.ts +94 -0
  74. package/dist/runtime/entity/models/GroupModels.d.ts +484 -2
  75. package/dist/runtime/entity/models/GroupRequestModels.d.ts +737 -0
  76. package/dist/runtime/entity/models/GroupResponseModels.d.ts +254 -0
  77. package/dist/runtime/entity/models/InventoryModels.d.ts +415 -0
  78. package/dist/runtime/entity/models/InventoryRequestModels.d.ts +629 -0
  79. package/dist/runtime/entity/models/InventoryResponseModels.d.ts +218 -0
  80. package/dist/runtime/entity/models/MasterPlayerModels.d.ts +1065 -3
  81. package/dist/runtime/entity/models/MasterPlayerRequestModels.d.ts +1560 -6
  82. package/dist/runtime/entity/models/MasterPlayerResponseModels.d.ts +532 -1
  83. package/dist/runtime/entity/models/MultiplayerModels.d.ts +199 -0
  84. package/dist/runtime/entity/models/MultiplayerRequestModels.d.ts +196 -0
  85. package/dist/runtime/entity/models/MultiplayerResponseModels.d.ts +74 -0
  86. package/dist/runtime/entity/models/StoreInventoryModels.d.ts +262 -0
  87. package/dist/runtime/entity/models/StoreInventoryRequestModels.d.ts +268 -0
  88. package/dist/runtime/entity/models/StoreInventoryResponseModels.d.ts +98 -0
  89. package/dist/runtime/entity/request/CustomOperationRequest.d.ts +99 -0
  90. package/dist/runtime/entity/response/CustomOperationResponse.d.ts +118 -0
  91. package/dist/runtime/entity/response/GetAuthInfoResponse.d.ts +53 -0
  92. package/dist/runtime/entity/response/HealthCheckResponse.d.ts +56 -0
  93. package/dist/runtime/entity/response/UploadFileResponse.d.ts +19 -0
  94. package/dist/runtime/helper/CodeHelper.d.ts +122 -0
  95. package/dist/runtime/helper/ConverterService.d.ts +74 -0
  96. package/dist/runtime/helper/EnumUtility.d.ts +63 -0
  97. package/dist/runtime/helper/GNSupport.d.ts +64 -4
  98. package/dist/runtime/helper/GNUtils.d.ts +54 -0
  99. package/dist/runtime/helper/MessagePackConverterService.d.ts +48 -0
  100. package/dist/runtime/helper/OperationHelper.d.ts +51 -0
  101. package/dist/runtime/helper/StorageService.d.ts +48 -8
  102. package/dist/runtime/logger/GNDebug.d.ts +117 -0
  103. package/dist/runtime/networking/AuthenticateStatus.d.ts +64 -0
  104. package/dist/runtime/networking/IPeer.d.ts +83 -0
  105. package/dist/runtime/networking/NetworkingPeer.d.ts +256 -1
  106. package/dist/runtime/networking/OperationPending.d.ts +112 -0
  107. package/dist/runtime/networking/PeerBase.d.ts +231 -0
  108. package/dist/runtime/networking/handler/IServerEventHandler.d.ts +84 -0
  109. package/dist/runtime/networking/handler/OnCharacterPlayerFriendUpdateEventHandler.d.ts +69 -0
  110. package/dist/runtime/networking/handler/OnCharacterPlayerGroupUpdateEventHandler.d.ts +49 -0
  111. package/dist/runtime/networking/handler/OnGamePlayerFriendUpdateEventHandler.d.ts +50 -0
  112. package/dist/runtime/networking/handler/OnGamePlayerGroupUpdateEventHandler.d.ts +41 -0
  113. package/dist/runtime/networking/handler/OnGroupMemberUpdateEventHandler.d.ts +47 -0
  114. package/dist/runtime/networking/handler/OnGroupMessageUpdateEventHandler.d.ts +46 -0
  115. package/dist/runtime/networking/http/HttpPeer.d.ts +173 -0
  116. package/dist/runtime/networking/http/NetworkingHttpPeerBase.d.ts +87 -0
  117. package/dist/runtime/networking/http/NetworkingPeerAxiosRequest.d.ts +113 -0
  118. package/dist/runtime/networking/socket/NetworkingPeerSocketIOClient.d.ts +145 -0
  119. package/dist/runtime/networking/socket/NetworkingSocketPeerBase.d.ts +198 -0
  120. package/dist/runtime/networking/socket/SocketPeer.d.ts +155 -0
  121. package/dist/runtime/typescript/ServiceUpdate.d.ts +46 -0
  122. package/docs/AI_CHEATSHEET.md +211 -0
  123. package/docs/COOKBOOK.md +912 -0
  124. package/docs/RULES.md +307 -0
  125. package/docs/ai-manifest.json +725 -0
  126. package/docs/guides/AUTHENTICATE.md +246 -0
  127. package/docs/guides/CHARACTER_PLAYER.md +439 -0
  128. package/docs/guides/CLOUDSCRIPT.md +335 -0
  129. package/docs/guides/COCOS_CREATOR_INTEGRATION.md +150 -0
  130. package/docs/guides/CONTENT.md +291 -0
  131. package/docs/guides/DASHBOARD.md +262 -0
  132. package/docs/guides/GAME_PLAYER.md +473 -0
  133. package/docs/guides/GROUP.md +412 -0
  134. package/docs/guides/INVENTORY.md +375 -0
  135. package/docs/guides/MASTER_PLAYER.md +458 -0
  136. package/docs/guides/MULTIPLAYER.md +303 -0
  137. package/docs/guides/STORE_INVENTORY.md +313 -0
  138. package/docs/llms-full.txt +43 -0
  139. package/docs/reference/API_AUTHENTICATE.md +75 -0
  140. package/docs/reference/API_CHARACTER_PLAYER.md +226 -0
  141. package/docs/reference/API_CLOUDSCRIPT.md +82 -0
  142. package/docs/reference/API_CONTENT.md +88 -0
  143. package/docs/reference/API_DASHBOARD.md +82 -0
  144. package/docs/reference/API_GAME_PLAYER.md +223 -0
  145. package/docs/reference/API_GROUP.md +187 -0
  146. package/docs/reference/API_INDEX.md +57 -0
  147. package/docs/reference/API_INVENTORY.md +169 -0
  148. package/docs/reference/API_MASTER_PLAYER.md +323 -0
  149. package/docs/reference/API_MULTIPLAYER.md +97 -0
  150. package/docs/reference/API_STORE_INVENTORY.md +109 -0
  151. package/docs/reference/CONFIG.md +107 -0
  152. package/docs/reference/DTO_INDEX.md +2543 -0
  153. package/docs/reference/ENUMS.md +433 -0
  154. package/docs/reference/ERROR_HANDLING.md +159 -0
  155. package/docs/reference/EVENTS.md +188 -0
  156. package/docs/reference/PERMISSION_RULES.md +55 -0
  157. package/docs/reference/dto/AUTHENTICATE.md +619 -0
  158. package/docs/reference/dto/CHARACTER_PLAYER.md +3686 -0
  159. package/docs/reference/dto/CLOUDSCRIPT.md +400 -0
  160. package/docs/reference/dto/CONTENT.md +548 -0
  161. package/docs/reference/dto/DASHBOARD.md +1980 -0
  162. package/docs/reference/dto/GAME_PLAYER.md +3631 -0
  163. package/docs/reference/dto/GENERIC.md +151 -0
  164. package/docs/reference/dto/GROUP.md +2842 -0
  165. package/docs/reference/dto/INVENTORY.md +2385 -0
  166. package/docs/reference/dto/MASTER_PLAYER.md +6024 -0
  167. package/docs/reference/dto/MULTIPLAYER.md +850 -0
  168. package/docs/reference/dto/STORE_INVENTORY.md +1262 -0
  169. package/llms.txt +47 -0
  170. package/package.json +11 -2
  171. package/GNServerSettings.debug.json +0 -21
  172. package/dist/runtime/GNNetwork.js +0 -273
  173. package/dist/runtime/GNNetworkAuthenticateApi.js +0 -122
  174. package/dist/runtime/GNNetworkCharacterPlayerApi.js +0 -968
  175. package/dist/runtime/GNNetworkCloudScriptApi.js +0 -104
  176. package/dist/runtime/GNNetworkContentApi.js +0 -140
  177. package/dist/runtime/GNNetworkDashboardApi.js +0 -170
  178. package/dist/runtime/GNNetworkGamePlayerApi.js +0 -950
  179. package/dist/runtime/GNNetworkGroupApi.js +0 -734
  180. package/dist/runtime/GNNetworkInventoryApi.js +0 -626
  181. package/dist/runtime/GNNetworkMasterPlayerApi.js +0 -1550
  182. package/dist/runtime/GNNetworkMultiplayerApi.js +0 -194
  183. package/dist/runtime/GNNetworkStoreInventoryApi.js +0 -266
  184. package/dist/runtime/common/Action0.js +0 -1
  185. package/dist/runtime/common/Action1.js +0 -1
  186. package/dist/runtime/common/Action2.js +0 -1
  187. package/dist/runtime/common/Action3.js +0 -1
  188. package/dist/runtime/common/Action4.js +0 -1
  189. package/dist/runtime/common/GNData.js +0 -209
  190. package/dist/runtime/config/GNServerSettings.js +0 -156
  191. package/dist/runtime/constant/Commands.js +0 -20
  192. package/dist/runtime/constant/EventCode.js +0 -8
  193. package/dist/runtime/constant/OperationCode.js +0 -221
  194. package/dist/runtime/constant/ReturnCode.js +0 -14
  195. package/dist/runtime/constant/enumType/ExecuteResponseStatus.js +0 -8
  196. package/dist/runtime/constant/enumType/FriendStatus.js +0 -7
  197. package/dist/runtime/constant/enumType/GoogleLoginType.js +0 -5
  198. package/dist/runtime/constant/enumType/GroupStatus.js +0 -7
  199. package/dist/runtime/constant/enumType/InvalidMemberType.js +0 -18
  200. package/dist/runtime/constant/enumType/ItemType.js +0 -5
  201. package/dist/runtime/constant/enumType/MatchmakingMemberStatus.js +0 -6
  202. package/dist/runtime/constant/enumType/MatchmakingTicketStatus.js +0 -8
  203. package/dist/runtime/constant/enumType/OwnerType.js +0 -9
  204. package/dist/runtime/constant/enumType/PermissionDataItem.js +0 -5
  205. package/dist/runtime/constant/enumType/PushPlatformType.js +0 -5
  206. package/dist/runtime/constant/enumType/RequestRole.js +0 -6
  207. package/dist/runtime/constant/enumType/RequestType.js +0 -15
  208. package/dist/runtime/constant/enumType/StoreItemType.js +0 -5
  209. package/dist/runtime/constant/enumType/StoreReceiveType.js +0 -8
  210. package/dist/runtime/constant/errorCode/ErrorCode.js +0 -52
  211. package/dist/runtime/constant/parameterCode/ParameterCode.js +0 -617
  212. package/dist/runtime/entity/DataMember.js +0 -208
  213. package/dist/runtime/entity/GNMetadata.js +0 -11
  214. package/dist/runtime/entity/InvalidMember.js +0 -1
  215. package/dist/runtime/entity/OperationEvent.js +0 -24
  216. package/dist/runtime/entity/OperationRequest.js +0 -42
  217. package/dist/runtime/entity/OperationResponse.js +0 -73
  218. package/dist/runtime/entity/models/AuthenticateModels.js +0 -426
  219. package/dist/runtime/entity/models/AuthenticateRequestModels.js +0 -188
  220. package/dist/runtime/entity/models/AuthenticateResponseModels.js +0 -131
  221. package/dist/runtime/entity/models/CharacterPlayerModels.js +0 -1433
  222. package/dist/runtime/entity/models/CharacterPlayerRequestModels.js +0 -1386
  223. package/dist/runtime/entity/models/CharacterPlayerResponseModels.js +0 -376
  224. package/dist/runtime/entity/models/CloudScriptModels.js +0 -197
  225. package/dist/runtime/entity/models/CloudScriptRequestModels.js +0 -138
  226. package/dist/runtime/entity/models/CloudScriptResponseModels.js +0 -40
  227. package/dist/runtime/entity/models/ContentModels.js +0 -203
  228. package/dist/runtime/entity/models/ContentRequestModels.js +0 -190
  229. package/dist/runtime/entity/models/ContentResponseModels.js +0 -54
  230. package/dist/runtime/entity/models/DashboardModels.js +0 -3002
  231. package/dist/runtime/entity/models/DashboardRequestModels.js +0 -268
  232. package/dist/runtime/entity/models/DashboardResponseModels.js +0 -187
  233. package/dist/runtime/entity/models/GamePlayerModels.js +0 -1591
  234. package/dist/runtime/entity/models/GamePlayerRequestModels.js +0 -1360
  235. package/dist/runtime/entity/models/GamePlayerResponseModels.js +0 -369
  236. package/dist/runtime/entity/models/GenericModels.js +0 -177
  237. package/dist/runtime/entity/models/GroupModels.js +0 -1135
  238. package/dist/runtime/entity/models/GroupRequestModels.js +0 -1048
  239. package/dist/runtime/entity/models/GroupResponseModels.js +0 -285
  240. package/dist/runtime/entity/models/InventoryModels.js +0 -915
  241. package/dist/runtime/entity/models/InventoryRequestModels.js +0 -892
  242. package/dist/runtime/entity/models/InventoryResponseModels.js +0 -243
  243. package/dist/runtime/entity/models/MasterPlayerModels.js +0 -2573
  244. package/dist/runtime/entity/models/MasterPlayerRequestModels.js +0 -2228
  245. package/dist/runtime/entity/models/MasterPlayerResponseModels.js +0 -607
  246. package/dist/runtime/entity/models/MultiplayerModels.js +0 -404
  247. package/dist/runtime/entity/models/MultiplayerRequestModels.js +0 -268
  248. package/dist/runtime/entity/models/MultiplayerResponseModels.js +0 -75
  249. package/dist/runtime/entity/models/StoreInventoryModels.js +0 -797
  250. package/dist/runtime/entity/models/StoreInventoryRequestModels.js +0 -372
  251. package/dist/runtime/entity/models/StoreInventoryResponseModels.js +0 -103
  252. package/dist/runtime/entity/request/CustomOperationRequest.js +0 -24
  253. package/dist/runtime/entity/response/CustomOperationResponse.js +0 -29
  254. package/dist/runtime/entity/response/GetAuthInfoResponse.js +0 -2
  255. package/dist/runtime/entity/response/HealthCheckResponse.js +0 -2
  256. package/dist/runtime/entity/response/UploadFileResponse.js +0 -2
  257. package/dist/runtime/helper/CodeHelper.js +0 -63
  258. package/dist/runtime/helper/ConverterService.js +0 -275
  259. package/dist/runtime/helper/EnumUtility.js +0 -33
  260. package/dist/runtime/helper/GNSupport.js +0 -47
  261. package/dist/runtime/helper/GNUtils.js +0 -72
  262. package/dist/runtime/helper/MessagePackConverterService.js +0 -9
  263. package/dist/runtime/helper/OperationHelper.js +0 -24
  264. package/dist/runtime/helper/StorageService.js +0 -62
  265. package/dist/runtime/logger/GNDebug.js +0 -29
  266. package/dist/runtime/networking/AuthenticateStatus.js +0 -14
  267. package/dist/runtime/networking/IPeer.js +0 -1
  268. package/dist/runtime/networking/NetworkingPeer.js +0 -210
  269. package/dist/runtime/networking/OperationPending.js +0 -53
  270. package/dist/runtime/networking/PeerBase.js +0 -161
  271. package/dist/runtime/networking/handler/IServerEventHandler.js +0 -13
  272. package/dist/runtime/networking/handler/OnCharacterPlayerFriendUpdateEventHandler.js +0 -39
  273. package/dist/runtime/networking/handler/OnCharacterPlayerGroupUpdateEventHandler.js +0 -39
  274. package/dist/runtime/networking/handler/OnGamePlayerFriendUpdateEventHandler.js +0 -39
  275. package/dist/runtime/networking/handler/OnGamePlayerGroupUpdateEventHandler.js +0 -39
  276. package/dist/runtime/networking/handler/OnGroupMemberUpdateEventHandler.js +0 -35
  277. package/dist/runtime/networking/handler/OnGroupMessageUpdateEventHandler.js +0 -43
  278. package/dist/runtime/networking/http/HttpPeer.js +0 -123
  279. package/dist/runtime/networking/http/NetworkingHttpPeerBase.js +0 -9
  280. package/dist/runtime/networking/http/NetworkingPeerAxiosRequest.js +0 -179
  281. package/dist/runtime/networking/socket/NetworkingPeerSocketIOClient.js +0 -130
  282. package/dist/runtime/networking/socket/NetworkingSocketPeerBase.js +0 -165
  283. package/dist/runtime/networking/socket/SocketPeer.js +0 -115
  284. package/dist/runtime/typescript/ServiceUpdate.js +0 -22
  285. package/docs/COCOS_CREATOR_INTEGRATION.md +0 -116
  286. package/examples/cocos-creator/GearNExample.ts.txt +0 -176
  287. package/srcSwift/Package.swift +0 -32
  288. package/srcSwift/Sources/GearN/runtime/GNNetwork.swift +0 -530
  289. package/srcSwift/Sources/GearN/runtime/GNNetworkAuthenticateApi.swift +0 -178
  290. package/srcSwift/Sources/GearN/runtime/GNNetworkCharacterPlayerApi.swift +0 -1162
  291. package/srcSwift/Sources/GearN/runtime/GNNetworkCloudScriptApi.swift +0 -154
  292. package/srcSwift/Sources/GearN/runtime/GNNetworkContentApi.swift +0 -208
  293. package/srcSwift/Sources/GearN/runtime/GNNetworkDashboardApi.swift +0 -240
  294. package/srcSwift/Sources/GearN/runtime/GNNetworkGamePlayerApi.swift +0 -1369
  295. package/srcSwift/Sources/GearN/runtime/GNNetworkGroupApi.swift +0 -1100
  296. package/srcSwift/Sources/GearN/runtime/GNNetworkInventoryApi.swift +0 -937
  297. package/srcSwift/Sources/GearN/runtime/GNNetworkMasterPlayerApi.swift +0 -2323
  298. package/srcSwift/Sources/GearN/runtime/GNNetworkMultiplayerApi.swift +0 -298
  299. package/srcSwift/Sources/GearN/runtime/GNNetworkStoreInventoryApi.swift +0 -397
  300. package/srcSwift/Sources/GearN/runtime/common/Action0.swift +0 -3
  301. package/srcSwift/Sources/GearN/runtime/common/Action1.swift +0 -3
  302. package/srcSwift/Sources/GearN/runtime/common/Action2.swift +0 -3
  303. package/srcSwift/Sources/GearN/runtime/common/Action3.swift +0 -3
  304. package/srcSwift/Sources/GearN/runtime/common/Action4.swift +0 -3
  305. package/srcSwift/Sources/GearN/runtime/common/GNArray.swift +0 -204
  306. package/srcSwift/Sources/GearN/runtime/common/GNData.swift +0 -108
  307. package/srcSwift/Sources/GearN/runtime/common/GNHashtable.swift +0 -200
  308. package/srcSwift/Sources/GearN/runtime/config/GNServerSettings.swift +0 -95
  309. package/srcSwift/Sources/GearN/runtime/constant/Commands.swift +0 -28
  310. package/srcSwift/Sources/GearN/runtime/constant/EventCode.swift +0 -10
  311. package/srcSwift/Sources/GearN/runtime/constant/OperationCode.swift +0 -252
  312. package/srcSwift/Sources/GearN/runtime/constant/ReturnCode.swift +0 -19
  313. package/srcSwift/Sources/GearN/runtime/constant/enumType/ExecuteResponseStatus.swift +0 -9
  314. package/srcSwift/Sources/GearN/runtime/constant/enumType/FriendStatus.swift +0 -8
  315. package/srcSwift/Sources/GearN/runtime/constant/enumType/GoogleLoginType.swift +0 -6
  316. package/srcSwift/Sources/GearN/runtime/constant/enumType/GroupStatus.swift +0 -8
  317. package/srcSwift/Sources/GearN/runtime/constant/enumType/InvalidMemberType.swift +0 -19
  318. package/srcSwift/Sources/GearN/runtime/constant/enumType/ItemType.swift +0 -6
  319. package/srcSwift/Sources/GearN/runtime/constant/enumType/MatchmakingMemberStatus.swift +0 -7
  320. package/srcSwift/Sources/GearN/runtime/constant/enumType/MatchmakingTicketStatus.swift +0 -9
  321. package/srcSwift/Sources/GearN/runtime/constant/enumType/OwnerType.swift +0 -10
  322. package/srcSwift/Sources/GearN/runtime/constant/enumType/PermissionDataItem.swift +0 -6
  323. package/srcSwift/Sources/GearN/runtime/constant/enumType/PushPlatformType.swift +0 -6
  324. package/srcSwift/Sources/GearN/runtime/constant/enumType/RequestRole.swift +0 -7
  325. package/srcSwift/Sources/GearN/runtime/constant/enumType/RequestType.swift +0 -16
  326. package/srcSwift/Sources/GearN/runtime/constant/enumType/StoreItemType.swift +0 -6
  327. package/srcSwift/Sources/GearN/runtime/constant/enumType/StoreReceiveType.swift +0 -9
  328. package/srcSwift/Sources/GearN/runtime/constant/errorCode/ErrorCode.swift +0 -58
  329. package/srcSwift/Sources/GearN/runtime/constant/parameterCode/ParameterCode.swift +0 -672
  330. package/srcSwift/Sources/GearN/runtime/entity/DataMember.swift +0 -196
  331. package/srcSwift/Sources/GearN/runtime/entity/GNMetadata.swift +0 -9
  332. package/srcSwift/Sources/GearN/runtime/entity/InvalidMember.swift +0 -11
  333. package/srcSwift/Sources/GearN/runtime/entity/OperationEvent.swift +0 -38
  334. package/srcSwift/Sources/GearN/runtime/entity/OperationHelper.swift +0 -28
  335. package/srcSwift/Sources/GearN/runtime/entity/OperationRequest.swift +0 -62
  336. package/srcSwift/Sources/GearN/runtime/entity/OperationResponse.swift +0 -98
  337. package/srcSwift/Sources/GearN/runtime/entity/models/AuthenticateModels.swift +0 -351
  338. package/srcSwift/Sources/GearN/runtime/entity/models/AuthenticateRequestModels.swift +0 -81
  339. package/srcSwift/Sources/GearN/runtime/entity/models/AuthenticateResponseModels.swift +0 -108
  340. package/srcSwift/Sources/GearN/runtime/entity/models/CharacterPlayerModels.swift +0 -1045
  341. package/srcSwift/Sources/GearN/runtime/entity/models/CharacterPlayerRequestModels.swift +0 -821
  342. package/srcSwift/Sources/GearN/runtime/entity/models/CharacterPlayerResponseModels.swift +0 -588
  343. package/srcSwift/Sources/GearN/runtime/entity/models/CloudScriptModels.swift +0 -187
  344. package/srcSwift/Sources/GearN/runtime/entity/models/CloudScriptRequestModels.swift +0 -84
  345. package/srcSwift/Sources/GearN/runtime/entity/models/CloudScriptResponseModels.swift +0 -59
  346. package/srcSwift/Sources/GearN/runtime/entity/models/ContentModels.swift +0 -195
  347. package/srcSwift/Sources/GearN/runtime/entity/models/ContentRequestModels.swift +0 -116
  348. package/srcSwift/Sources/GearN/runtime/entity/models/ContentResponseModels.swift +0 -81
  349. package/srcSwift/Sources/GearN/runtime/entity/models/DashboardModels.swift +0 -426
  350. package/srcSwift/Sources/GearN/runtime/entity/models/DashboardRequestModels.swift +0 -160
  351. package/srcSwift/Sources/GearN/runtime/entity/models/DashboardResponseModels.swift +0 -82
  352. package/srcSwift/Sources/GearN/runtime/entity/models/GamePlayerModels.swift +0 -1334
  353. package/srcSwift/Sources/GearN/runtime/entity/models/GamePlayerRequestModels.swift +0 -643
  354. package/srcSwift/Sources/GearN/runtime/entity/models/GamePlayerResponseModels.swift +0 -213
  355. package/srcSwift/Sources/GearN/runtime/entity/models/GenericModels.swift +0 -171
  356. package/srcSwift/Sources/GearN/runtime/entity/models/GroupModels.swift +0 -850
  357. package/srcSwift/Sources/GearN/runtime/entity/models/GroupRequestModels.swift +0 -485
  358. package/srcSwift/Sources/GearN/runtime/entity/models/GroupResponseModels.swift +0 -165
  359. package/srcSwift/Sources/GearN/runtime/entity/models/InventoryModels.swift +0 -679
  360. package/srcSwift/Sources/GearN/runtime/entity/models/InventoryRequestModels.swift +0 -413
  361. package/srcSwift/Sources/GearN/runtime/entity/models/InventoryResponseModels.swift +0 -141
  362. package/srcSwift/Sources/GearN/runtime/entity/models/MasterPlayerModels.swift +0 -378
  363. package/srcSwift/Sources/GearN/runtime/entity/models/MasterPlayerRequestModels.swift +0 -147
  364. package/srcSwift/Sources/GearN/runtime/entity/models/MasterPlayerResponseModels.swift +0 -318
  365. package/srcSwift/Sources/GearN/runtime/entity/models/MultiplayerModels.swift +0 -319
  366. package/srcSwift/Sources/GearN/runtime/entity/models/MultiplayerRequestModels.swift +0 -125
  367. package/srcSwift/Sources/GearN/runtime/entity/models/MultiplayerResponseModels.swift +0 -45
  368. package/srcSwift/Sources/GearN/runtime/entity/models/StoreInventoryModels.swift +0 -633
  369. package/srcSwift/Sources/GearN/runtime/entity/models/StoreInventoryRequestModels.swift +0 -173
  370. package/srcSwift/Sources/GearN/runtime/entity/models/StoreInventoryResponseModels.swift +0 -61
  371. package/srcSwift/Sources/GearN/runtime/entity/request/CustomOperationRequest.swift +0 -42
  372. package/srcSwift/Sources/GearN/runtime/entity/response/CustomOperationResponse.swift +0 -49
  373. package/srcSwift/Sources/GearN/runtime/entity/response/GetAuthInfoResponse.swift +0 -43
  374. package/srcSwift/Sources/GearN/runtime/entity/response/HealthCheckResponse.swift +0 -86
  375. package/srcSwift/Sources/GearN/runtime/entity/response/UploadFileResponse.swift +0 -15
  376. package/srcSwift/Sources/GearN/runtime/helper/CodeHelper.swift +0 -107
  377. package/srcSwift/Sources/GearN/runtime/helper/ConverterService.swift +0 -98
  378. package/srcSwift/Sources/GearN/runtime/helper/EnumUtility.swift +0 -34
  379. package/srcSwift/Sources/GearN/runtime/helper/GNSupport.swift +0 -41
  380. package/srcSwift/Sources/GearN/runtime/helper/GNUtils.swift +0 -66
  381. package/srcSwift/Sources/GearN/runtime/helper/MessagePackConverterService.swift +0 -21
  382. package/srcSwift/Sources/GearN/runtime/helper/StorageService.swift +0 -29
  383. package/srcSwift/Sources/GearN/runtime/logger/GNDebug.swift +0 -33
  384. package/srcSwift/Sources/GearN/runtime/networking/AuthenticateStatus.swift +0 -24
  385. package/srcSwift/Sources/GearN/runtime/networking/IPeer.swift +0 -8
  386. package/srcSwift/Sources/GearN/runtime/networking/NetworkingPeer.swift +0 -368
  387. package/srcSwift/Sources/GearN/runtime/networking/OperationPending.swift +0 -81
  388. package/srcSwift/Sources/GearN/runtime/networking/PeerBase.swift +0 -228
  389. package/srcSwift/Sources/GearN/runtime/networking/handler/IServerEventHandler.swift +0 -20
  390. package/srcSwift/Sources/GearN/runtime/networking/http/HttpPeer.swift +0 -226
  391. package/srcSwift/Sources/GearN/runtime/networking/http/HttpTypes.swift +0 -24
  392. package/srcSwift/Sources/GearN/runtime/networking/http/NetworkingHttpPeerBase.swift +0 -13
  393. package/srcSwift/Sources/GearN/runtime/networking/http/NetworkingPeerUrlSession.swift +0 -125
  394. package/srcSwift/Sources/GearN/runtime/networking/request/NetRequest.swift +0 -19
  395. package/srcSwift/Sources/GearN/runtime/networking/response/NetResponse.swift +0 -13
  396. package/srcSwift/Sources/GearN/runtime/networking/socket/NetworkingPeerSocketIOClient.swift +0 -244
  397. package/srcSwift/Sources/GearN/runtime/networking/socket/NetworkingSocketPeerBase.swift +0 -59
  398. package/srcSwift/Sources/GearN/runtime/networking/socket/SocketPeer.swift +0 -136
  399. package/tsconfig-build.cocos.json +0 -31
  400. package/webpack.config.cocos.mjs +0 -78
@@ -0,0 +1,439 @@
1
+ # CharacterPlayerApi
2
+
3
+ Tài liệu này dành cho AI code assistant và AI agent nội bộ. Mục tiêu là chọn đúng namespace `client/server/admin`, phân biệt đúng HTTP operation với realtime event socket, và không sinh sai request ở các nhóm `characterId`, `owner/removeStatus`, friend/group lifecycle, leaderboard bạn bè và relation item nhẹ.
4
+
5
+ ## 1. Scope
6
+
7
+ - Áp dụng cho:
8
+ - `GNNetwork.characterPlayer`
9
+ - `GNNetwork.characterPlayer.server`
10
+ - `GNNetwork.characterPlayer.admin`
11
+ - Toàn bộ method hiện tại của `CharacterPlayerApi` đều gửi qua HTTP.
12
+ - `CharacterPlayerApi` có đủ 3 role thật:
13
+ - `GNNetwork.characterPlayer` -> `RequestRole.Client`
14
+ - `GNNetwork.characterPlayer.server` -> `RequestRole.Server`
15
+ - `GNNetwork.characterPlayer.admin` -> `RequestRole.Admin`
16
+ - Nếu không truyền `overrideSecretKey`, SDK sẽ tự lấy secret key theo role tương ứng.
17
+ - Chỉ dùng namespace `.server` khi bạn đã cấu hình `secretKey` với `permission rules` `server` hợp lệ trong `GNServerSettings`, hoặc chủ động truyền `overrideSecretKey`.
18
+ - Chỉ dùng namespace `.admin` khi bạn đã cấu hình `secretKey` với `permission rules` `admin` hợp lệ trong `GNServerSettings`, hoặc chủ động truyền `overrideSecretKey`.
19
+ - Rule chuẩn để chọn `client/server/admin` và hiểu `self/other-self` xem [RULES](../RULES.md#3-route--trust-boundary-của-caller). Không tự suy diễn route chỉ từ target ownership.
20
+ - Khác với `GamePlayerApi`, public contract hiện tại gần như luôn yêu cầu `characterId` rõ ràng cho các flow target một character cụ thể.
21
+ - `client`, `server`, `admin` hiện dùng cùng shape request; khác biệt chính là trust boundary và secret key mặc định.
22
+ - `CharacterPlayerApi` là nhóm metadata/lifecycle ở cấp character:
23
+ - đọc metadata và owner/remove status của character
24
+ - đọc relation nhẹ tới inventory, group, friend
25
+ - search character
26
+ - leaderboard toàn cục hoặc leaderboard trong mạng bạn bè
27
+ - create group từ góc nhìn character
28
+ - create item cho character
29
+ - add/remove friend
30
+ - join/leave group
31
+ - `CharacterPlayerApi` không có public method tạo character mới. Nếu cần tạo character, phải dùng `GamePlayerApi.createPlayerCharacterAsync`.
32
+ - Realtime update friend/group là luồng riêng qua socket event handler, không phải transport của các method `CharacterPlayerApi`.
33
+
34
+ ## 2. Hard Rules
35
+
36
+ - Luôn ưu tiên `async/await`. Mặc định dùng `*Async()`.
37
+ - Bắt buộc đã `GNNetwork.init(settings)` trước khi gọi.
38
+ - Không dùng socket transport cho các method của `CharacterPlayerApi`.
39
+ - Chọn namespace theo trust boundary:
40
+ - app/player -> `GNNetwork.characterPlayer`
41
+ - trusted backend/service -> `GNNetwork.characterPlayer.server`
42
+ - dashboard/ops/tooling -> `GNNetwork.characterPlayer.admin`
43
+ - Khi method target một character cụ thể, luôn phải truyền `characterId`. Không có cơ chế public auto-select current character.
44
+ - `getPlayerInformationAsync`, `getFriendStatisticsLeaderboardAroundPlayerAsync`, `getFriendStatisticsLeaderboardAsync`, `getPlayersWithDisplayNameAsync`, `getPlayersWithSegmentAsync`, `getPlayersWithTagAsync`, `getStatisticsLeaderboardAroundPlayerAsync`, `getStatisticsLeaderboardAsync`, `getCurrencyLeaderboardAsync`, `getCreateLeaderboardAsync` và `getLastLoginLeaderboardAsync` đều bắt buộc có `infoRequestParam`.
45
+ - `getPlayerStatisticsAsync` dùng `statisticsKeys`, còn `infoRequestParam` dùng `playerStatisticsKeys`. Không được dùng lẫn hai field này.
46
+ - `getPlayerInventoryAsync` dùng `itemCatalogIds`, `getPlayerGroupAsync` dùng `groupCatalogIds`, `getPlayerFriendAsync` dùng `friendCatalogIds`.
47
+ - `getOwnerAsync` trả `owner.type` và `owner.id`; `owner.type` nên map bằng `OwnerType`.
48
+ - `setOwnerAsync` chỉ nhận `newOwnerId`. Public contract hiện không có `newOwnerType`; AI không được tự bịa field này.
49
+ - `getRemoveStatusAsync` đọc remove status; `setRemoveStatusAsync` là soft-remove marker, không phải hard delete.
50
+ - `addPlayerFriendAsync` bắt buộc có `characterId`, `friendId`, `catalogId`.
51
+ - Trong `CharacterPlayerApi`, `friendId` là quan hệ ở cấp character, không phải cấp game-player.
52
+ - `createGroupAsync` nhận `groupMembers[]` là `userId`, không phải `characterId`.
53
+ - `createPlayerItemAsync` và `createGroupAsync` hiện không có contract public riêng để trả `itemId` hoặc `groupId` vừa tạo.
54
+ - `setAvatarAsync` trả `EmptyResponseData`. `SetAvatarRequestData.type` hiện là số thô, package không export enum avatar public tương ứng.
55
+ - `playerGroups[].status` nên map bằng `GroupStatus`, `playerFriends[].status` nên map bằng `FriendStatus`.
56
+ - `playerInventories`, `playerGroups`, `playerFriends` trong `CharacterPlayerApi` là relation item nhẹ; không được giả định chúng chứa full metadata chi tiết.
57
+ - `getCurrencyLogAsync` và `getStatisticsLogAsync` phân trang bằng `token`, không dùng `skip`.
58
+
59
+ ## 3. HTTP Và Socket
60
+
61
+ Rule cứng:
62
+
63
+ - Nếu cần đọc/ghi metadata hoặc lifecycle ở cấp character: dùng `GNNetwork.characterPlayer*` qua HTTP.
64
+ - Nếu cần realtime friend/group update: dùng socket event handler riêng.
65
+ - Không được giả định gọi `addPlayerFriendAsync`, `removePlayerFriendAsync`, `joinGroupAsync` hoặc `leaveGroupAsync` là đủ để UI tự nhận realtime nếu chưa auth socket.
66
+
67
+ Event handler public: xem [reference/EVENTS.md](../reference/EVENTS.md#oncharacterplayerfriendupdateeventhandler) và [reference/EVENTS.md](../reference/EVENTS.md#oncharacterplayergroupupdateeventhandler).
68
+
69
+ Realtime rule:
70
+
71
+ - Muốn nhận event realtime, tuân theo [rule socket chuẩn trong RULES](../RULES.md#7-auth--socket-flow).
72
+ - `OnCharacterPlayerFriendUpdateEventHandler.onUpdate`:
73
+ - payload có `characterId`
74
+ - có `playerFriends`
75
+ - `OnCharacterPlayerGroupUpdateEventHandler.onUpdate`:
76
+ - payload có `characterId`
77
+ - có `playerGroups`
78
+
79
+ ## 4. Chọn Namespace
80
+
81
+ | Namespace | Role thật | Dùng khi nào |
82
+ | --- | --- | --- |
83
+ | `GNNetwork.characterPlayer` | `Client` | player app thao tác trên character cụ thể mà client đang giữ `characterId` |
84
+ | `GNNetwork.characterPlayer.server` | `Server` | trusted backend, game server, worker xử lý lifecycle character |
85
+ | `GNNetwork.characterPlayer.admin` | `Admin` | GM tool, dashboard, migration, vận hành dữ liệu character |
86
+
87
+ Rule nhanh:
88
+
89
+ - Logic chạy trong app public: ưu tiên `GNNetwork.characterPlayer`.
90
+ - Logic chạy trong backend tin cậy: ưu tiên `GNNetwork.characterPlayer.server`.
91
+ - Logic quản trị hoặc vận hành dữ liệu: ưu tiên `GNNetwork.characterPlayer.admin`.
92
+ - Không chọn namespace theo cảm tính; request shape giống nhau nhưng trust boundary khác nhau.
93
+
94
+ ## 5. Chọn Method
95
+
96
+ ### Đọc 1 character hoặc 1 phần metadata
97
+
98
+ | Method | Dùng khi nào | Cần truyền gì | Nhận được gì | Ghi chú | ErrorCode
99
+ | --- | --- | --- | --- | --- | --- |
100
+ | `getAvatarAsync` | Cần đọc avatar | `characterId` | `CharacterPlayerResponseData` | `avatar.type` hiện là số thô | `Ok`, `CharacterPlayerNotFound` |
101
+ | `getCatalogIdAsync` | Cần đọc `catalogId` của character | `characterId` | `CharacterPlayerResponseData` | Kết quả ở `infoResponseParameters.catalogId` | `Ok`, `CharacterPlayerNotFound` |
102
+ | `getCountryCodeAsync` | Cần đọc quốc gia | `characterId` | `CharacterPlayerResponseData` | | `Ok`, `CharacterPlayerNotFound` |
103
+ | `getCustomDataAsync` | Cần đọc custom data | `characterId`, `customDataKeys?` | `CharacterPlayerResponseData` | Có thể filter theo key | `Ok`, `CharacterPlayerNotFound` |
104
+ | `getDisplayNameAsync` | Cần đọc display name | `characterId` | `CharacterPlayerResponseData` | | `Ok`, `CharacterPlayerNotFound` |
105
+ | `getIpAddressCreateAsync` | Cần đọc IP lúc tạo character | `characterId` | `CharacterPlayerResponseData` | Trường này thường nhạy cảm, ưu tiên backend/admin | `Ok`, `CharacterPlayerNotFound` |
106
+ | `getOwnerAsync` | Cần đọc owner hiện tại | `characterId` | `CharacterPlayerResponseData` | Map `owner.type` bằng `OwnerType` | `Ok`, `CharacterPlayerNotFound` |
107
+ | `getPlayerBanAsync` | Cần đọc trạng thái ban | `characterId` | `CharacterPlayerResponseData` | | `Ok`, `CharacterPlayerNotFound` |
108
+ | `getPlayerCurrencyAsync` | Cần đọc currency | `characterId`, `playerCurrencyKeys?` | `CharacterPlayerResponseData` | Không dùng `infoRequestParam` | `Ok`, `CharacterPlayerNotFound` |
109
+ | `getPlayerDataAsync` | Cần đọc player data | `characterId`, `playerDataKeys?` | `CharacterPlayerResponseData` | Không dùng `infoRequestParam` | `Ok`, `CharacterPlayerNotFound` |
110
+ | `getPlayerFriendAsync` | Cần đọc relation friend ở cấp character | `characterId`, `friendCatalogIds?` | `CharacterPlayerResponseData` | Mỗi phần tử chỉ có `friendId`, `catalogId`, `status`, `tsLastStatusUpdate` | `Ok`, `CharacterPlayerNotFound` |
111
+ | `getPlayerGroupAsync` | Cần đọc relation group của character | `characterId`, `groupCatalogIds?` | `CharacterPlayerResponseData` | Mỗi phần tử chỉ có `groupId`, `catalogId`, `status`, `tsLastStatusUpdate` | `Ok`, `CharacterPlayerNotFound` |
112
+ | `getPlayerInformationAsync` | Cần lấy snapshot tổng hợp của character | `characterId`, `infoRequestParam` | `CharacterPlayerResponseData` | Flow đọc tổng hợp quan trọng nhất | `Ok`, `CharacterPlayerNotFound` |
113
+ | `getPlayerInventoryAsync` | Cần đọc relation inventory của character | `characterId`, `itemCatalogIds?` | `CharacterPlayerResponseData` | Mỗi phần tử chỉ có `itemId`, `catalogId`, `classId` | `Ok`, `CharacterPlayerNotFound` |
114
+ | `getPlayerStatisticsAsync` | Cần đọc statistics theo key | `characterId`, `statisticsKeys?` | `CharacterPlayerResponseData` | Không dùng `playerStatisticsKeys` ở đây | `Ok`, `CharacterPlayerNotFound` |
115
+ | `getRemoveStatusAsync` | Cần đọc trạng thái remove | `characterId` | `CharacterPlayerResponseData` | Kết quả ở `infoResponseParameters.removeStatus` | `Ok`, `CharacterPlayerNotFound` |
116
+ | `getSegmentAsync` | Cần đọc segment | `characterId` | `CharacterPlayerResponseData` | | `Ok`, `CharacterPlayerNotFound` |
117
+ | `getTagAsync` | Cần đọc tag theo key | `characterId`, `tagKeys` | `CharacterPlayerResponseData` | | `Ok`, `CharacterPlayerNotFound` |
118
+ | `getTsCreateAsync` | Cần đọc thời điểm tạo character | `characterId` | `CharacterPlayerResponseData` | | `Ok`, `CharacterPlayerNotFound` |
119
+ | `getTsLastLoginAsync` | Cần đọc lần login gần nhất | `characterId` | `CharacterPlayerResponseData` | | `Ok`, `CharacterPlayerNotFound` |
120
+
121
+ ### Search, leaderboard và log
122
+
123
+ | Method | Dùng khi nào | Cần truyền gì | Nhận được gì | Ghi chú | ErrorCode
124
+ | --- | --- | --- | --- | --- | --- |
125
+ | `getPlayersWithDisplayNameAsync` | Tìm character theo tên hiển thị | `keyword`, `infoRequestParam`, `skip?`, `limit?` | `CharacterPlayersWithCharacterIdResponseData` | Kết quả trả `characterId` | `Ok` |
126
+ | `getPlayersWithSegmentAsync` | Tìm character theo segment | `value`, `infoRequestParam`, `skip?`, `limit?` | `CharacterPlayersWithCharacterIdResponseData` | | `Ok` |
127
+ | `getPlayersWithTagAsync` | Tìm character theo tag | `key`, `value`, `infoRequestParam`, `skip?`, `limit?` | `CharacterPlayersWithCharacterIdResponseData` | | `Ok`, `KeyNotFound` |
128
+ | `getFriendStatisticsLeaderboardAroundPlayerAsync` | Cần bảng xếp hạng quanh một character trong mạng bạn bè của character đó | `characterId`, `key`, `infoRequestParam`, `skip?`, `limit?`, `loadFromCache?` | `GetStatisticsLeaderboardResponseData` | Không phải global leaderboard | `Ok`, `CharacterPlayerNotFound`, `KeyNotFound` |
129
+ | `getFriendStatisticsLeaderboardAsync` | Cần bảng xếp hạng friend-only theo key | `characterId`, `key`, `infoRequestParam`, `skip?`, `limit?`, `loadFromCache?` | `GetStatisticsLeaderboardResponseData` | Scope là bạn bè của character target | `Ok`, `CharacterPlayerNotFound`, `KeyNotFound` |
130
+ | `getStatisticsLeaderboardAroundPlayerAsync` | Cần bảng xếp hạng toàn cục quanh một character | `characterId`, `key`, `infoRequestParam`, `skip?`, `limit?`, `loadFromCache?`, `catalogId?` | `GetStatisticsLeaderboardResponseData` | Có thể filter theo `catalogId` | `Ok`, `KeyNotFound` |
131
+ | `getStatisticsLeaderboardAsync` | Cần bảng xếp hạng statistics toàn cục theo key | `key`, `infoRequestParam`, `skip?`, `limit?`, `loadFromCache?`, `version?`, `catalogId?` | `GetStatisticsLeaderboardResponseData` | `version` chỉ có ở method này | `Ok`, `KeyNotFound`, `VersionInvalid` |
132
+ | `getCurrencyLeaderboardAsync` | Cần bảng xếp hạng currency theo key | `key`, `infoRequestParam`, `skip?`, `limit?`, `loadFromCache?`, `catalogId?` | `GetCurrencyLeaderboardResponseData` | Có thể filter theo `catalogId` | `Ok`, `KeyNotFound` |
133
+ | `getCreateLeaderboardAsync` | Cần bảng xếp hạng theo thời điểm tạo character | `infoRequestParam`, `skip?`, `limit?`, `loadFromCache?` | `GetCreateLeaderboardResponseData` | Không cần `key` | `Ok` |
134
+ | `getLastLoginLeaderboardAsync` | Cần bảng xếp hạng theo lần login gần nhất | `infoRequestParam`, `skip?`, `limit?`, `loadFromCache?` | `GetLastLoginLeaderboardResponseData` | Không cần `key` | `Ok` |
135
+ | `getStatisticsLogAsync` | Cần audit statistics log | `keys?`, `characterId?`, `limit?`, `token?` | `GetStatisticsLogResponseData` | Phân trang bằng `token` | `Ok` |
136
+ | `getCurrencyLogAsync` | Cần audit currency log | `keys?`, `characterId?`, `limit?`, `token?` | `GetCurrencyLogResponseData` | Phân trang bằng `token` | `Ok` |
137
+
138
+ ### Friend, group, item lifecycle và mutation
139
+
140
+ | Method | Dùng khi nào | Cần truyền gì | Nhận được gì | Ghi chú | ErrorCode
141
+ | --- | --- | --- | --- | --- | --- |
142
+ | `addPlayerFriendAsync` | Thêm một quan hệ friend ở cấp character | `characterId`, `friendId`, `catalogId` | `EmptyResponseData` | `friendId` là id ở cấp character | `Ok`, `CharacterPlayerNotFound`, `CatalogIdNotFound`, `PlayerBan` |
143
+ | `removePlayerFriendAsync` | Gỡ một quan hệ friend | `characterId`, `friendId` | `EmptyResponseData` | | `Ok`, `CharacterPlayerNotFound`, `PlayerBan` |
144
+ | `createGroupAsync` | Tạo group từ góc nhìn character | `characterId`, `catalogId`, `groupMembers?`, `displayName?` | `CharacterPlayerResponseData` | `groupMembers[]` dùng `userId`, không dùng `characterId` | `Ok`, `CharacterPlayerNotFound`, `CatalogIdNotFound`, `PlayerBan` |
145
+ | `joinGroupAsync` | Cho character join vào group đã tồn tại | `characterId`, `groupId` | `EmptyResponseData` | Flow lifecycle ở phía character | `Ok`, `CharacterPlayerNotFound`, `GroupNotFound`, `PlayerBan` |
146
+ | `leaveGroupAsync` | Cho character rời khỏi group | `characterId`, `groupId` | `EmptyResponseData` | | `Ok`, `CharacterPlayerNotFound`, `GroupNotFound`, `PlayerBan` |
147
+ | `createPlayerItemAsync` | Tạo item mới cho character | `characterId`, `catalogId`, `classId`, `displayName?`, `amount?` | `CharacterPlayerResponseData` | Không có contract riêng cho `itemId` mới tạo | `Ok`, `CharacterPlayerNotFound`, `CatalogIdNotFound`, `ClassIdNotFound`, `PlayerBan` |
148
+ | `removePlayerItemAsync` | Xóa item khỏi character theo `itemId` | `characterId`, `itemId` | `EmptyResponseData` | | `Ok`, `CharacterPlayerNotFound`, `ItemNotFound`, `PlayerBan` |
149
+ | `addSegmentAsync` | Gắn thêm segment | `characterId`, `value` | `EmptyResponseData` | | `Ok`, `CharacterPlayerNotFound`, `PlayerBan` |
150
+ | `removeSegmentAsync` | Gỡ segment | `characterId`, `value` | `EmptyResponseData` | | `Ok`, `CharacterPlayerNotFound`, `PlayerBan` |
151
+ | `setTagAsync` | Set hoặc upsert tag | `characterId`, `key`, `value` | `EmptyResponseData` | | `Ok`, `CharacterPlayerNotFound`, `KeyNotFound`, `PlayerBan` |
152
+ | `removeTagAsync` | Xóa tag theo key | `characterId`, `key` | `EmptyResponseData` | Không truyền `value` | `Ok`, `CharacterPlayerNotFound`, `PlayerBan` |
153
+ | `setAvatarAsync` | Set avatar | `characterId`, `type`, `value` | `EmptyResponseData` | `type` chưa có enum public | `Ok`, `CharacterPlayerNotFound`, `PlayerBan` |
154
+ | `setCountryCodeAsync` | Set country code | `characterId`, `countryCode` | `EmptyResponseData` | | `Ok`, `CharacterPlayerNotFound`, `PlayerBan` |
155
+ | `setCustomDataAsync` | Set custom data theo nhiều key | `characterId`, `customDatas[]` | `CharacterPlayerResponseData` | | `Ok`, `CharacterPlayerNotFound`, `KeyNotFound`, `PlayerBan` |
156
+ | `setDisplayNameAsync` | Set display name | `characterId`, `displayName`, `uniqueDisplayName?` | `EmptyResponseData` | Có option ép unique | `Ok`, `CharacterPlayerNotFound`, `DisplayNameUsed`, `PlayerBan` |
157
+ | `setOwnerAsync` | Chuyển owner của character | `characterId`, `newOwnerId` | `EmptyResponseData` | Public contract không có `newOwnerType` | `Ok`, `CharacterPlayerNotFound`, `OwnerNotFound`, `GamePlayerNotFound`, `PlayerBan` |
158
+ | `setPlayerBanAsync` | Ban character đến thời điểm cụ thể | `characterId`, `tsExpire`, `reason` | `EmptyResponseData` | | `Ok`, `CharacterPlayerNotFound`, `PlayerBan` |
159
+ | `changePlayerCurrencyAsync` | Cộng/trừ currency | `characterId`, `playerCurrencies[]`, `log?` | `CharacterPlayerResponseData` | Đây là delta change | `Ok`, `CharacterPlayerNotFound`, `NotEnoughCurrency`, `KeyNotFound`, `PlayerBan` |
160
+ | `setPlayerDataAsync` | Set player data theo nhiều key | `characterId`, `playerDatas[]` | `CharacterPlayerResponseData` | | `Ok`, `CharacterPlayerNotFound`, `KeyNotFound`, `PlayerBan` |
161
+ | `changePlayerStatisticsAsync` | Cộng/trừ statistics | `characterId`, `playerStatistics[]`, `log?` | `CharacterPlayerResponseData` | Đây là delta change | `Ok`, `CharacterPlayerNotFound`, `KeyNotFound`, `PlayerBan` |
162
+ | `setRemoveStatusAsync` | Đánh dấu character bị remove | `characterId`, `reason?` | `EmptyResponseData` | Soft remove, không phải hard delete | `Ok`, `CharacterPlayerNotFound`, `PlayerBan` |
163
+
164
+ ## 6. Enum Và Reference
165
+
166
+ - DTO fields: [reference/dto/CHARACTER_PLAYER.md](../reference/dto/CHARACTER_PLAYER.md). Method table: [reference/API_CHARACTER_PLAYER.md](../reference/API_CHARACTER_PLAYER.md).
167
+ - Events: [reference/EVENTS.md](../reference/EVENTS.md#oncharacterplayerfriendupdateeventhandler).
168
+ - Enums: [FriendStatus](../reference/ENUMS.md#friendstatus), [GroupStatus](../reference/ENUMS.md#groupstatus), [OwnerType](../reference/ENUMS.md#ownertype).
169
+ - Fallback `dist` chỉ khi reference docs chưa đủ: `dist/runtime/entity/models/CharacterPlayer*.d.ts`, `dist/runtime/entity/models/GenericModels.d.ts`.
170
+ - `GenericModels.FriendItem.status` nên map bằng `FriendStatus`.
171
+ - `GenericModels.GroupItem.status` nên map bằng `GroupStatus`.
172
+ - `infoResponseParameters.owner.type` nên map bằng `OwnerType`.
173
+ - `SetAvatarRequestData.type` và `avatar.type` hiện chưa có enum public tương ứng.
174
+
175
+ ## 7. InfoRequestParam Rules
176
+
177
+ `CharacterPlayerModels.InfoRequestParam` điều khiển payload trả về trong:
178
+
179
+ - `getPlayerInformationAsync`
180
+ - `getFriendStatisticsLeaderboardAroundPlayerAsync`
181
+ - `getFriendStatisticsLeaderboardAsync`
182
+ - `getPlayersWithDisplayNameAsync`
183
+ - `getPlayersWithSegmentAsync`
184
+ - `getPlayersWithTagAsync`
185
+ - `getStatisticsLeaderboardAroundPlayerAsync`
186
+ - `getStatisticsLeaderboardAsync`
187
+ - `getCurrencyLeaderboardAsync`
188
+ - `getCreateLeaderboardAsync`
189
+ - `getLastLoginLeaderboardAsync`
190
+
191
+ Rule cứng:
192
+
193
+ - Không truyền `null`.
194
+ - Không bật toàn bộ field một cách mù quáng.
195
+ - Chỉ bật field mà flow hiện tại thật sự cần.
196
+ - Nếu cần filter dữ liệu con, dùng đúng field filter:
197
+ - `playerDataKeys`
198
+ - `playerCurrencyKeys`
199
+ - `playerStatisticsKeys`
200
+ - `customDataKeys`
201
+ - `tagKeys`
202
+ - `itemCatalogIds`
203
+ - `groupCatalogIds`
204
+ - `friendCatalogIds`
205
+ - Nếu chỉ cần một mảng relation nhẹ hoặc một field nhỏ, ưu tiên getter chuyên biệt.
206
+
207
+ Các field thường dùng:
208
+
209
+ - `catalogId`
210
+ - `owner`
211
+ - `removeStatus`
212
+ - `segments`
213
+ - `customDatas`
214
+ - `displayName`
215
+ - `avatar`
216
+ - `tsCreate`
217
+ - `tags`
218
+ - `playerBan`
219
+ - `playerCurrencies`
220
+ - `playerStatistics`
221
+ - `playerDatas`
222
+ - `ipAddressCreate`
223
+ - `countryCode`
224
+ - `tsLastLogin`
225
+ - `playerInventories`
226
+ - `playerGroups`
227
+ - `playerFriends`
228
+
229
+ ## 8. Decision Rules
230
+
231
+ - Cần đọc snapshot tổng hợp của một character: dùng `getPlayerInformationAsync`.
232
+ - Cần đọc đúng một field nhỏ như `catalogId`, `owner`, `removeStatus`, `displayName`: ưu tiên getter chuyên biệt.
233
+ - Cần search character theo display name/segment/tag: dùng nhóm `getPlayersWith*Async`.
234
+ - Cần leaderboard trong mạng bạn bè của character: dùng `getFriendStatisticsLeaderboardAsync` hoặc `getFriendStatisticsLeaderboardAroundPlayerAsync`.
235
+ - Cần leaderboard toàn cục: dùng `getStatisticsLeaderboardAsync`, `getStatisticsLeaderboardAroundPlayerAsync`, `getCurrencyLeaderboardAsync`, `getCreateLeaderboardAsync`, `getLastLoginLeaderboardAsync`.
236
+ - Cần create character mới: không dùng `CharacterPlayerApi`; phải dùng `GamePlayerApi.createPlayerCharacterAsync`.
237
+ - Cần create/join/leave group từ góc nhìn character: dùng `createGroupAsync`, `joinGroupAsync`, `leaveGroupAsync`.
238
+ - Cần quản lý metadata chi tiết của group: dùng `GroupApi`.
239
+ - Cần quản lý metadata chi tiết của item: dùng `InventoryApi`.
240
+ - Cần chuyển owner của character: dùng `setOwnerAsync`, nhưng không được tự thêm `newOwnerType`.
241
+ - Cần soft-remove character: dùng `setRemoveStatusAsync`.
242
+ - Cần realtime friend/group UI: dùng event handler socket sau khi đã auth socket.
243
+
244
+ ## 9. Response Rules
245
+
246
+ Tất cả typed response của `CharacterPlayerApi` đều có:
247
+
248
+ - `returnCode`
249
+ - `debugMessage`
250
+ - `invalidMembers`
251
+ - `errorCode`
252
+ - `responseData`
253
+
254
+ Rule kiểm tra response:
255
+
256
+ ```ts
257
+ if (response.hasReturnCodeError()) {
258
+ throw new Error(response.debugMessage);
259
+ }
260
+
261
+ if (response.errorCode !== ErrorCode.Ok) {
262
+ throw new Error(`Business error: ${response.errorCode}`);
263
+ }
264
+ ```
265
+
266
+ Những response chính AI cần nhớ:
267
+
268
+ - Hầu hết getter đơn lẻ trả `CharacterPlayerResponseData` và dữ liệu nằm trong `responseData.infoResponseParameters`.
269
+ - `getPlayersWithDisplayNameAsync`, `getPlayersWithSegmentAsync`, `getPlayersWithTagAsync` trả `CharacterPlayersWithCharacterIdResponseData`, mỗi phần tử có `characterId` và `infoResponseParameters`.
270
+ - `getFriendStatisticsLeaderboard*Async` và `getStatisticsLeaderboard*Async` trả `GetStatisticsLeaderboardResponseData`.
271
+ - `getStatisticsLeaderboardAsync` còn có thêm `responseData.tsCreate`.
272
+ - `getCurrencyLeaderboardAsync`, `getCreateLeaderboardAsync`, `getLastLoginLeaderboardAsync` trả `results` theo leaderboard shape.
273
+ - `getStatisticsLogAsync` và `getCurrencyLogAsync` trả `responseData.results` và có thể có `responseData.token`.
274
+ - `addPlayerFriendAsync`, `addSegmentAsync`, `joinGroupAsync`, `leaveGroupAsync`, `removePlayerFriendAsync`, `removePlayerItemAsync`, `removeSegmentAsync`, `removeTagAsync`, `setAvatarAsync`, `setCountryCodeAsync`, `setDisplayNameAsync`, `setOwnerAsync`, `setPlayerBanAsync`, `setRemoveStatusAsync`, `setTagAsync` trả `EmptyResponseData`.
275
+ - `createGroupAsync`, `createPlayerItemAsync`, `setCustomDataAsync`, `changePlayerCurrencyAsync`, `setPlayerDataAsync`, `changePlayerStatisticsAsync` trả `CharacterPlayerResponseData`.
276
+
277
+ ## 10. Cảnh Báo Implementation Hiện Tại
278
+
279
+ - `CharacterPlayerModels.InfoRequestParam` hiện có field `characterCatalogIds`, nhưng public response của `CharacterPlayerApi` không có `playerCharacters`.
280
+ - Theo public contract hiện tại, AI không nên dùng field này trừ khi có spec backend riêng xác nhận ý nghĩa của nó.
281
+ - `createGroupAsync` và `createPlayerItemAsync` hiện không có response field public riêng cho id vừa tạo.
282
+ - Nếu flow sau đó cần `groupId` hoặc `itemId`, bạn phải re-query hoặc verify backend contract riêng.
283
+ - `setOwnerAsync` chỉ có `newOwnerId`; public SDK không cho chọn `newOwnerType`.
284
+ - Nếu flow phụ thuộc loại owner mới, bạn phải xác minh backend rule riêng thay vì tự suy diễn.
285
+ - `playerInventories`, `playerGroups`, `playerFriends` chỉ là relation item nhẹ, không phải full metadata entity.
286
+ - `CharacterPlayerApi` không có public method tạo character mới hoặc hard-delete character.
287
+ - `setRemoveStatusAsync` là soft-remove marker; nếu cần hard delete thật, bạn phải dùng contract khác ngoài public surface hiện tại.
288
+ - `avatar.type` vẫn là số thô, chưa có enum public tương ứng.
289
+
290
+ ## 11. Best Practices
291
+
292
+ - Luôn giữ `characterId` ở biến riêng, đừng trộn với `userId`, `friendId`, `groupId`, `itemId`.
293
+ - Với query lớn, giữ `infoRequestParam` tối giản để giảm payload.
294
+ - Với relation item từ `CharacterPlayerApi`, chỉ dùng nó như index nhẹ để lấy id và trạng thái; đừng coi đó là full entity snapshot.
295
+ - Với friend/group UI, đọc initial state bằng getter HTTP rồi nghe realtime update bằng socket event handler.
296
+ - Với `changePlayerCurrencyAsync` và `changePlayerStatisticsAsync`, luôn truyền `log` nếu flow cần audit.
297
+ - Với `setOwnerAsync`, nếu flow cần xác nhận owner sau mutation, hãy đọc lại bằng `getOwnerAsync`.
298
+ - Với create flow, chuẩn bị sẵn bước re-fetch nếu bạn cần id mới tạo hoặc metadata chi tiết.
299
+
300
+ ## 12. Ví Dụ Khuyến Nghị
301
+
302
+ ### Đọc thông tin character với `infoRequestParam` tối giản
303
+
304
+ ```ts
305
+ import {
306
+ CharacterPlayerModels,
307
+ ErrorCode,
308
+ GNNetwork,
309
+ } from "@xmobitea/gn-typescript-client";
310
+
311
+ const infoRequestParam = new CharacterPlayerModels.InfoRequestParam();
312
+ infoRequestParam.catalogId = true;
313
+ infoRequestParam.displayName = true;
314
+ infoRequestParam.owner = true;
315
+ infoRequestParam.playerInventories = true;
316
+ infoRequestParam.itemCatalogIds = ["weapon"];
317
+
318
+ const request = new CharacterPlayerModels.GetPlayerInformationRequestData();
319
+ request.characterId = "CHAR0000001";
320
+ request.infoRequestParam = infoRequestParam;
321
+
322
+ const response = await GNNetwork.characterPlayer.getPlayerInformationAsync(request);
323
+
324
+ if (response.hasReturnCodeError()) {
325
+ throw new Error(response.debugMessage);
326
+ }
327
+
328
+ if (response.errorCode !== ErrorCode.Ok) {
329
+ throw new Error(`Business error: ${response.errorCode}`);
330
+ }
331
+
332
+ const characterInfo = response.responseData.infoResponseParameters;
333
+ ```
334
+
335
+ ### Add friend rồi đồng bộ UI bằng realtime event
336
+
337
+ ```ts
338
+ import {
339
+ CharacterPlayerModels,
340
+ ErrorCode,
341
+ GNNetwork,
342
+ OnCharacterPlayerFriendUpdateEventHandler,
343
+ } from "@xmobitea/gn-typescript-client";
344
+
345
+ OnCharacterPlayerFriendUpdateEventHandler.onUpdate = (update) => {
346
+ if (update.characterId !== "CHAR0000001") {
347
+ return;
348
+ }
349
+
350
+ const friendItems = update.playerFriends;
351
+ console.log(friendItems);
352
+ };
353
+
354
+ GNNetwork.connectSocket(); // Follow README socket rule before expecting realtime updates.
355
+
356
+ const request = new CharacterPlayerModels.AddPlayerFriendRequestData();
357
+ request.characterId = "CHAR0000001";
358
+ request.friendId = "CHAR0000002";
359
+ request.catalogId = "default-friend";
360
+
361
+ const response = await GNNetwork.characterPlayer.addPlayerFriendAsync(request);
362
+
363
+ if (response.hasReturnCodeError()) {
364
+ throw new Error(response.debugMessage);
365
+ }
366
+
367
+ if (response.errorCode !== ErrorCode.Ok) {
368
+ throw new Error(`Business error: ${response.errorCode}`);
369
+ }
370
+ ```
371
+
372
+ ### Tạo item cho character rồi re-query relation item
373
+
374
+ ```ts
375
+ import {
376
+ CharacterPlayerModels,
377
+ ErrorCode,
378
+ GNNetwork,
379
+ } from "@xmobitea/gn-typescript-client";
380
+
381
+ const createRequest = new CharacterPlayerModels.CreatePlayerItemRequestData();
382
+ createRequest.characterId = "CHAR0000001";
383
+ createRequest.catalogId = "weapon";
384
+ createRequest.classId = "sword";
385
+ createRequest.displayName = "Starter Sword";
386
+ createRequest.amount = 1;
387
+
388
+ const createResponse = await GNNetwork.characterPlayer.createPlayerItemAsync(createRequest);
389
+
390
+ if (createResponse.hasReturnCodeError()) {
391
+ throw new Error(createResponse.debugMessage);
392
+ }
393
+
394
+ if (createResponse.errorCode !== ErrorCode.Ok) {
395
+ throw new Error(`Business error: ${createResponse.errorCode}`);
396
+ }
397
+
398
+ const getInventoryRequest = new CharacterPlayerModels.GetPlayerInventoryRequestData();
399
+ getInventoryRequest.characterId = "CHAR0000001";
400
+ getInventoryRequest.itemCatalogIds = ["weapon"];
401
+
402
+ const inventoryResponse = await GNNetwork.characterPlayer.getPlayerInventoryAsync(getInventoryRequest);
403
+
404
+ if (inventoryResponse.hasReturnCodeError()) {
405
+ throw new Error(inventoryResponse.debugMessage);
406
+ }
407
+
408
+ if (inventoryResponse.errorCode !== ErrorCode.Ok) {
409
+ throw new Error(`Business error: ${inventoryResponse.errorCode}`);
410
+ }
411
+
412
+ const inventoryRelations = inventoryResponse.responseData.infoResponseParameters.playerInventories;
413
+ ```
414
+
415
+ ## 13. Anti-Patterns
416
+
417
+ - Không bỏ `characterId` ở các method target một character cụ thể.
418
+ - Không dùng `CharacterPlayerApi` để tạo character mới.
419
+ - Không dùng `userId` thay cho `characterId` hoặc `friendId` trong các flow character-level.
420
+ - Không gửi `characterId` trong `groupMembers[]` của `createGroupAsync`; field này dùng `userId`.
421
+ - Không tự thêm `newOwnerType` vào `setOwnerAsync`.
422
+ - Không dùng `CharacterPlayerApi` relation item như thể đó là full entity snapshot.
423
+ - Không giả định `createGroupAsync` hoặc `createPlayerItemAsync` luôn trả id mới tạo trong response.
424
+ - Không dùng `skip` để phân trang log.
425
+ - Không giả định socket event tự chứa full metadata hoặc thông tin ngoài `characterId` và mảng relation.
426
+ - Không bỏ qua kiểm tra `hasReturnCodeError()` và `errorCode`.
427
+
428
+ ## 14. AI Checklist
429
+
430
+ - Đã `GNNetwork.init(settings)` chưa.
431
+ - Đã chọn đúng namespace `characterPlayer` / `characterPlayer.server` / `characterPlayer.admin` chưa.
432
+ - Có truyền `characterId` cho flow target một character cụ thể chưa.
433
+ - Nếu flow là create character, có đang dùng nhầm `CharacterPlayerApi` không.
434
+ - Nếu method yêu cầu `infoRequestParam`, đã truyền object này chưa.
435
+ - Nếu đang đọc relation nhẹ, có cần API chuyên biệt để lấy full metadata không.
436
+ - Nếu đang làm friend/group realtime, đã tuân theo [rule socket chuẩn trong RULES](../RULES.md#7-auth--socket-flow) chưa.
437
+ - Nếu đang dùng `setOwnerAsync`, có tránh tự thêm `newOwnerType` không.
438
+ - Nếu đang tạo item hoặc group và cần id mới, đã chuẩn bị bước re-query chưa.
439
+ - Có kiểm tra `hasReturnCodeError()` trước `errorCode` chưa.