noblox-asset.js 7.4.0

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 (272) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  3. package/.github/workflows/doc-publish.yml +33 -0
  4. package/.github/workflows/npmpublish.yml +72 -0
  5. package/.github/workflows/run-tests.yml +49 -0
  6. package/CODE_OF_CONDUCT.md +76 -0
  7. package/LICENSE +21 -0
  8. package/README.md +182 -0
  9. package/eslint.config.mjs +34 -0
  10. package/examples/cleanPlayers.js +130 -0
  11. package/examples/cleanWall.js +110 -0
  12. package/examples/revertRanks.js +100 -0
  13. package/examples/savePlayers.js +119 -0
  14. package/examples/saveWall.js +96 -0
  15. package/img/moderatedThumbnails/moderatedThumbnail_100x100.png +0 -0
  16. package/img/moderatedThumbnails/moderatedThumbnail_110x110.png +0 -0
  17. package/img/moderatedThumbnails/moderatedThumbnail_140x140.png +0 -0
  18. package/img/moderatedThumbnails/moderatedThumbnail_150x150.png +0 -0
  19. package/img/moderatedThumbnails/moderatedThumbnail_150x200.png +0 -0
  20. package/img/moderatedThumbnails/moderatedThumbnail_180x180.png +0 -0
  21. package/img/moderatedThumbnails/moderatedThumbnail_250x250.png +0 -0
  22. package/img/moderatedThumbnails/moderatedThumbnail_30x30.png +0 -0
  23. package/img/moderatedThumbnails/moderatedThumbnail_352x352.png +0 -0
  24. package/img/moderatedThumbnails/moderatedThumbnail_420x420.png +0 -0
  25. package/img/moderatedThumbnails/moderatedThumbnail_48x48.png +0 -0
  26. package/img/moderatedThumbnails/moderatedThumbnail_50x50.png +0 -0
  27. package/img/moderatedThumbnails/moderatedThumbnail_60x60.png +0 -0
  28. package/img/moderatedThumbnails/moderatedThumbnail_720x720.png +0 -0
  29. package/img/moderatedThumbnails/moderatedThumbnail_75x75.png +0 -0
  30. package/img/noblox-js-small.png +0 -0
  31. package/img/noblox-js.png +0 -0
  32. package/img/thumbnailSizes.png +0 -0
  33. package/jsDocsConfig.json +55 -0
  34. package/lib/accountinformation/getUserSocialLinks.js +40 -0
  35. package/lib/accountsettings/block.js +53 -0
  36. package/lib/accountsettings/unblock.js +53 -0
  37. package/lib/asset/deleteFromInventory.js +56 -0
  38. package/lib/asset/getGamePassProductInfo.js +50 -0
  39. package/lib/asset/getProductInfo.js +46 -0
  40. package/lib/asset/uploadAnimation.js +103 -0
  41. package/lib/asset/uploadItem.js +83 -0
  42. package/lib/asset/uploadModel.js +90 -0
  43. package/lib/avatar/avatarRules.js +39 -0
  44. package/lib/avatar/currentlyWearing.js +33 -0
  45. package/lib/avatar/getAvatar.js +36 -0
  46. package/lib/avatar/getCurrentAvatar.js +38 -0
  47. package/lib/avatar/getRecentItems.js +36 -0
  48. package/lib/avatar/outfitDetails.js +33 -0
  49. package/lib/avatar/outfits.js +38 -0
  50. package/lib/avatar/redrawAvatar.js +47 -0
  51. package/lib/avatar/removeAssetId.js +51 -0
  52. package/lib/avatar/setAvatarBodyColors.js +61 -0
  53. package/lib/avatar/setAvatarScales.js +61 -0
  54. package/lib/avatar/setPlayerAvatarType.js +51 -0
  55. package/lib/avatar/setWearingAssets.js +51 -0
  56. package/lib/avatar/wearAssetId.js +51 -0
  57. package/lib/badges/getAwardedTimestamps.js +49 -0
  58. package/lib/badges/getBadgeInfo.js +44 -0
  59. package/lib/badges/getGameBadges.js +63 -0
  60. package/lib/badges/getPlayerBadges.js +28 -0
  61. package/lib/badges/updateBadgeInfo.js +75 -0
  62. package/lib/cache/add.js +14 -0
  63. package/lib/cache/addIf.js +26 -0
  64. package/lib/cache/clear.js +8 -0
  65. package/lib/cache/get.js +28 -0
  66. package/lib/cache/index.js +17 -0
  67. package/lib/cache/new.js +12 -0
  68. package/lib/cache/wrap.js +25 -0
  69. package/lib/chat/addUsersToConversation.js +58 -0
  70. package/lib/chat/chatSettings.js +34 -0
  71. package/lib/chat/getChatMessages.js +41 -0
  72. package/lib/chat/getConversations.js +44 -0
  73. package/lib/chat/getRolloutSettings.js +36 -0
  74. package/lib/chat/getUnreadConversationCount.js +34 -0
  75. package/lib/chat/getUnreadMessages.js +39 -0
  76. package/lib/chat/getUserConversations.js +38 -0
  77. package/lib/chat/markChatAsRead.js +53 -0
  78. package/lib/chat/markChatAsSeen.js +51 -0
  79. package/lib/chat/multiGetLatestMessages.js +38 -0
  80. package/lib/chat/onNewConversation.js +50 -0
  81. package/lib/chat/onNewMessage.js +53 -0
  82. package/lib/chat/onNewMessageBySelf.js +50 -0
  83. package/lib/chat/onUserOnline.js +50 -0
  84. package/lib/chat/onUserTyping.js +54 -0
  85. package/lib/chat/removeFromGroupConversation.js +59 -0
  86. package/lib/chat/renameGroupConversation.js +58 -0
  87. package/lib/chat/sendChatMessage.js +58 -0
  88. package/lib/chat/setChatUserTyping.js +58 -0
  89. package/lib/chat/start121Conversation.js +51 -0
  90. package/lib/chat/startCloudEditConversation.js +51 -0
  91. package/lib/chat/startGroupConversation.js +59 -0
  92. package/lib/client/onNotification.js +86 -0
  93. package/lib/client/setAPIKey.js +18 -0
  94. package/lib/client/setCookie.js +38 -0
  95. package/lib/datastores/deleteDatastoreEntry.js +56 -0
  96. package/lib/datastores/getDatastoreEntry.js +88 -0
  97. package/lib/datastores/getDatastoreEntryVersions.js +73 -0
  98. package/lib/datastores/getDatastoreKeys.js +63 -0
  99. package/lib/datastores/getDatastores.js +62 -0
  100. package/lib/datastores/incrementDatastoreEntry.js +83 -0
  101. package/lib/datastores/setDatastoreEntry.js +80 -0
  102. package/lib/develop/canManage.js +42 -0
  103. package/lib/develop/configureItem.js +210 -0
  104. package/lib/develop/updateUniverse.js +52 -0
  105. package/lib/develop/updateUniverseAccess.js +54 -0
  106. package/lib/economy/getGroupFunds.js +42 -0
  107. package/lib/economy/getGroupPayoutEligibility.js +55 -0
  108. package/lib/economy/getGroupRevenueSummary.js +42 -0
  109. package/lib/economy/getGroupTransactions.js +32 -0
  110. package/lib/economy/getResaleData.js +48 -0
  111. package/lib/economy/getResellers.js +35 -0
  112. package/lib/economy/getUserFunds.js +43 -0
  113. package/lib/economy/getUserTransactions.js +34 -0
  114. package/lib/economy/onGroupTransaction.js +74 -0
  115. package/lib/friends/acceptFriendRequest.js +54 -0
  116. package/lib/friends/declineAllFriendRequests.js +52 -0
  117. package/lib/friends/declineFriendRequest.js +54 -0
  118. package/lib/friends/getFollowerCount.js +35 -0
  119. package/lib/friends/getFollowers.js +56 -0
  120. package/lib/friends/getFollowingCount.js +35 -0
  121. package/lib/friends/getFollowings.js +56 -0
  122. package/lib/friends/getFriendCount.js +35 -0
  123. package/lib/friends/getFriendRequests.js +51 -0
  124. package/lib/friends/getFriends.js +48 -0
  125. package/lib/friends/onFriendRequest.js +58 -0
  126. package/lib/friends/removeFriend.js +53 -0
  127. package/lib/friends/sendFriendRequest.js +54 -0
  128. package/lib/friends/unfollow.js +53 -0
  129. package/lib/games/addDeveloperProduct.js +53 -0
  130. package/lib/games/configureGamePass.js +126 -0
  131. package/lib/games/getDeveloperProducts.js +44 -0
  132. package/lib/games/getGameInstances.js +31 -0
  133. package/lib/games/getGamePasses.js +39 -0
  134. package/lib/games/getGameRevenue.js +48 -0
  135. package/lib/games/getGameSocialLinks.js +42 -0
  136. package/lib/games/getGroupGames.js +30 -0
  137. package/lib/games/getPlaceInfo.js +47 -0
  138. package/lib/games/getUniverseInfo.js +50 -0
  139. package/lib/games/publishToTopic.js +52 -0
  140. package/lib/games/sendUserNotification.js +65 -0
  141. package/lib/games/updateDeveloperProduct.js +56 -0
  142. package/lib/groups/banFromGroup.js +47 -0
  143. package/lib/groups/changeRank.js +59 -0
  144. package/lib/groups/deleteWallPost.js +59 -0
  145. package/lib/groups/deleteWallPostsByUser.js +55 -0
  146. package/lib/groups/demote.js +25 -0
  147. package/lib/groups/exile.js +55 -0
  148. package/lib/groups/getAuditLog.js +64 -0
  149. package/lib/groups/getGroup.js +50 -0
  150. package/lib/groups/getGroupBans.js +37 -0
  151. package/lib/groups/getGroupSocialLinks.js +41 -0
  152. package/lib/groups/getGroups.js +82 -0
  153. package/lib/groups/getJoinRequest.js +47 -0
  154. package/lib/groups/getJoinRequests.js +53 -0
  155. package/lib/groups/getPlayers.js +103 -0
  156. package/lib/groups/getRankInGroup.js +45 -0
  157. package/lib/groups/getRankNameInGroup.js +44 -0
  158. package/lib/groups/getRole.js +64 -0
  159. package/lib/groups/getRolePermissions.js +48 -0
  160. package/lib/groups/getRoles.js +53 -0
  161. package/lib/groups/getShout.js +47 -0
  162. package/lib/groups/getWall.js +56 -0
  163. package/lib/groups/groupPayout.js +103 -0
  164. package/lib/groups/handleJoinRequest.js +57 -0
  165. package/lib/groups/handleJoinRequests.js +61 -0
  166. package/lib/groups/leaveGroup.js +56 -0
  167. package/lib/groups/onAuditLog.js +62 -0
  168. package/lib/groups/onJoinRequest.js +63 -0
  169. package/lib/groups/onJoinRequestHandle.js +105 -0
  170. package/lib/groups/onShout.js +57 -0
  171. package/lib/groups/onWallPost.js +58 -0
  172. package/lib/groups/promote.js +25 -0
  173. package/lib/groups/searchGroups.js +32 -0
  174. package/lib/groups/setGroupDescription.js +58 -0
  175. package/lib/groups/setGroupName.js +59 -0
  176. package/lib/groups/setRank.js +74 -0
  177. package/lib/groups/setRoleInfo.js +84 -0
  178. package/lib/groups/shout.js +58 -0
  179. package/lib/groups/unbanFromGroup.js +41 -0
  180. package/lib/index.js +212 -0
  181. package/lib/internal/levelOneCopy.js +16 -0
  182. package/lib/internal/queue.js +61 -0
  183. package/lib/internal/timeout.js +30 -0
  184. package/lib/internal/wrap.js +78 -0
  185. package/lib/inventory/getCollectibles.js +31 -0
  186. package/lib/inventory/getInventory.js +32 -0
  187. package/lib/inventory/getInventoryById.js +31 -0
  188. package/lib/inventory/getOwnership.js +47 -0
  189. package/lib/inventory/getUAIDs.js +47 -0
  190. package/lib/itemconfiguration/getGroupAssets.js +32 -0
  191. package/lib/options.js +26 -0
  192. package/lib/party/onPartyDeleted.js +53 -0
  193. package/lib/party/onPartyInvite.js +53 -0
  194. package/lib/party/onPartyJoinedGame.js +53 -0
  195. package/lib/party/onPartyLeftGame.js +53 -0
  196. package/lib/party/onPartySelfJoined.js +53 -0
  197. package/lib/party/onPartySelfLeft.js +53 -0
  198. package/lib/party/onPartyUserJoined.js +53 -0
  199. package/lib/party/onPartyUserLeft.js +53 -0
  200. package/lib/premiumfeatures/getPremium.js +46 -0
  201. package/lib/presence/getPresences.js +60 -0
  202. package/lib/privatemessages/getMessages.js +55 -0
  203. package/lib/privatemessages/message.js +75 -0
  204. package/lib/privatemessages/onMessage.js +89 -0
  205. package/lib/thumbnails/getLogo.js +56 -0
  206. package/lib/thumbnails/getPlayerThumbnail.js +120 -0
  207. package/lib/thumbnails/getThumbnails.js +92 -0
  208. package/lib/trades/acceptTrade.js +52 -0
  209. package/lib/trades/canTradeWith.js +43 -0
  210. package/lib/trades/counterTrade.js +78 -0
  211. package/lib/trades/declineTrade.js +52 -0
  212. package/lib/trades/getTradeInfo.js +47 -0
  213. package/lib/trades/getTrades.js +37 -0
  214. package/lib/trades/sendTrade.js +76 -0
  215. package/lib/users/getBlurb.js +37 -0
  216. package/lib/users/getIdFromUsername.js +56 -0
  217. package/lib/users/getPlayerInfo.js +128 -0
  218. package/lib/users/getUserInfo.js +35 -0
  219. package/lib/users/getUsernameFromId.js +45 -0
  220. package/lib/users/getUsernameHistory.js +42 -0
  221. package/lib/users/onBlurbChange.js +46 -0
  222. package/lib/users/searchUsers.js +41 -0
  223. package/lib/util/apiError.js +50 -0
  224. package/lib/util/clearSession.js +32 -0
  225. package/lib/util/generalRequest.js +61 -0
  226. package/lib/util/getAction.js +45 -0
  227. package/lib/util/getAuthenticatedUser.js +41 -0
  228. package/lib/util/getCurrentUser.js +58 -0
  229. package/lib/util/getGeneralToken.js +52 -0
  230. package/lib/util/getHash.js +29 -0
  231. package/lib/util/getInputs.js +37 -0
  232. package/lib/util/getPageResults.js +86 -0
  233. package/lib/util/getSenderUserId.js +30 -0
  234. package/lib/util/getSession.js +38 -0
  235. package/lib/util/getVerification.js +60 -0
  236. package/lib/util/getVerificationInputs.js +31 -0
  237. package/lib/util/http.js +138 -0
  238. package/lib/util/jar.js +25 -0
  239. package/lib/util/refreshCookie.js +52 -0
  240. package/lib/util/relog.js +81 -0
  241. package/lib/util/setOptions.js +54 -0
  242. package/lib/util/shortPoll.js +102 -0
  243. package/package.json +76 -0
  244. package/postinstall.mjs +1 -0
  245. package/settings.json +115 -0
  246. package/test/accountinformation.test.js +27 -0
  247. package/test/accountsettings.test.js +27 -0
  248. package/test/asset.test.js +81 -0
  249. package/test/assets/Great-White-Shark-Fin.rbxm +0 -0
  250. package/test/assets/KeyframeSequence.rbxm +0 -0
  251. package/test/avatar.test.js +164 -0
  252. package/test/badges.test.js +96 -0
  253. package/test/chat.test.js +104 -0
  254. package/test/datastore.test.js +105 -0
  255. package/test/develop.test.js +53 -0
  256. package/test/economy.test.js +143 -0
  257. package/test/friends.test.js +146 -0
  258. package/test/games.test.js +229 -0
  259. package/test/groups.test.js +405 -0
  260. package/test/inventory.test.js +98 -0
  261. package/test/itemconfiguration.test.js +24 -0
  262. package/test/premiumfeatures.test.js +17 -0
  263. package/test/presence.test.js +25 -0
  264. package/test/privatemessages.test.js +33 -0
  265. package/test/thumbnails.test.js +53 -0
  266. package/test/users.test.js +110 -0
  267. package/tutorials/Authentication.md +75 -0
  268. package/tutorials/Event Emitters.md +26 -0
  269. package/tutorials/Promises.md +86 -0
  270. package/tutorials/VPS Authentication.md +72 -0
  271. package/typings/index.d.ts +2639 -0
  272. package/typings/jsDocs.ts +1987 -0
@@ -0,0 +1,1987 @@
1
+ // types/Types
2
+ import * as events from "events";
3
+ import * as stream from "stream";
4
+
5
+ /**
6
+ * @typedef
7
+ */
8
+ type CookieJar = {
9
+ session?: string;
10
+ }
11
+
12
+ /**
13
+ * @typedef
14
+ * NobloxOptions for setOptions, based from settings.json
15
+ */
16
+ type NobloxOptions = {
17
+ /** Prints console warnings for functions that are being polyfilled by newer methods due to upstream Roblox API changes */
18
+ show_deprecation_warnings: boolean;
19
+
20
+ /**
21
+ * Whether to send the noblox.js library user agent. Defaults to true.
22
+ * When enabled, noblox will set the user-agent on requests to 'noblox@{version}' where {version} is your library version.
23
+ * This allows Roblox to track endpoint and library usage. If you are privacy or aggregation conscious, set this to false.
24
+ */
25
+ use_noblox_ua: boolean;
26
+
27
+ /** Minimizes data usage and speed up requests by only saving session cookies, disable if you need other cookies to be saved as well. (Default: true) */
28
+ session_only: boolean;
29
+
30
+ /** This is usually used for functions that have to receive a lot of pages at once. Only this amount will be queued up as to preserve memory, make this as high as possible for fastest responses (although it will be somewhat limited by maxSockets). (Default: 50) */
31
+ max_threads: number;
32
+
33
+ /** Timeout for http requests. This is necessary for functions that make a very large number of requests, where it is possible some simply won't connect. (Default: 10000) */
34
+ timeout: number;
35
+
36
+ event: {
37
+ /** Maximum number of consecutive retries after an event times out or fails in some other way. (Default: 5) */
38
+ maxRetries: number;
39
+ /** Maximum time (in milliseconds) a request can take. If your server has extremely high latency you may have to raise this. (Default: 10000) */
40
+ timeout: number;
41
+ /** The poll time in milliseconds by default. A lower number will detect changes much quicker but will stress the network, a higher one does the opposite. (Default: 10000) */
42
+ defaultDelay: number;
43
+ /** The poll time in milliseconds to check for new audit log entries. A lower number will detect changes much quicker but will stress the network, a higher one does the opposite. (Default: 10000) */
44
+ onAuditLog: number;
45
+ /** The poll time in milliseconds to check for new wall posts. A lower number will detect changes much quicker but will stress the network, a higher one does the opposite. (Default: 10000) */
46
+ onWallPost: number;
47
+ /** The poll time in milliseconds to check for new join requests. A lower number will detect changes much quicker but will stress the network, a higher one does the opposite. (Default: 10000) */
48
+ onJoinRequestHandle: number;
49
+ /** The poll time in milliseconds to check for new join requests. A lower number will detect changes much quicker but will stress the network, a higher one does the opposite. (Default: 10000) */
50
+ onJoinRequest: number;
51
+ /** The poll time in milliseconds to check for a new shout message. A lower number will detect changes much quicker but will stress the network, a higher one does the opposite. (Default: 10000) */
52
+ onShout: number;
53
+ /** The poll time in milliseconds to check for a new blurb message. A lower number will detect changes much quicker but will stress the network, a higher one does the opposite. (Default: 10000) */
54
+ onBlurbChange: number;
55
+ /** The poll time in milliseconds to check for new transaction log entries. A lower number will detect changes much quicker but will stress the network, a higher one does the opposite. This endpoint has a low rate limit. (Default: 30000) */
56
+ onGroupTransaction: number;
57
+ }
58
+
59
+ thumbnail: {
60
+ /** Maximum number of retries to retrieve a pending thumbnail, rare, but occurs with uncached users (Roblox's cache) (Default: 2) */
61
+ maxRetries: number;
62
+ /** The time to wait between consecutive retries of retrieving pending thumbnails. (Default: 500) */
63
+ retryDelay: number;
64
+
65
+ failedUrl: {
66
+ /** The image URL to provide when an asset thumbnail is still pending; defaults to Roblox moderation icon via noblox.js's GitHub repo at https://noblox.js.org/moderatedThumbnails/moderatedThumbnail_{size}.png */
67
+ pending: string;
68
+ /** The image URL to provide when an asset thumbnail has been moderated by Roblox; defaults to Roblox moderation icon via noblox.js's GitHub repo at https://noblox.js.org/moderatedThumbnails/moderatedThumbnail_{size}.png */
69
+ blocked: string;
70
+ }
71
+ }
72
+
73
+ queue: {
74
+ Message: {
75
+ /** Although messages do have a floodcheck, it is not instituted immediately so this is disabled by default. If you are sending a lot of messages set a delay around 10-15 seconds (10000-15000). (Default: 0) */
76
+ delay: number
77
+ }
78
+ }
79
+
80
+ cache: {
81
+ /** XCSRF tokens expire 30 minutes after being created. Until they expire, however, no new tokens can be made. Sometimes an XCSRF token has already been created for the user so the server doesn't know when to collect a new one. During transitions some requests may use invalid tokens. For now, new XCSRF tokens are automatically retrieved when cached ones get rejected. */
82
+ XCSRF: {
83
+ /** Default: 1800 */
84
+ expire: number | boolean;
85
+ /** Default: false */
86
+ refresh: number | boolean;
87
+ },
88
+
89
+ /** Verification tokens seem to last extremely long times. */
90
+ Verify: {
91
+ /** Default: 7200 */
92
+ expire: number | boolean;
93
+ /** Default: 3600 */
94
+ refresh: number | boolean;
95
+ },
96
+
97
+ /** This should be fine unless your group changes its ranks often. */
98
+ Roles: {
99
+ /** Default: 600 */
100
+ expire: number | boolean;
101
+ /** Default: true */
102
+ refresh: number | boolean;
103
+ },
104
+
105
+ /** Disable this completely if you don't plan on ever changing your exile bot's rank. */
106
+ RolesetId: {
107
+ /** Default: 86400 */
108
+ expire: number | boolean;
109
+ /** Default: false */
110
+ refresh: number | boolean;
111
+ },
112
+
113
+ /** Disabled by default for security (price checks). If you are only working with ROBLOX assets, however, you can set this to something high (since ROBLOX product info rarely changes). */
114
+ Product: {
115
+ /** Default: false */
116
+ expire: number | boolean;
117
+ /** Default: false */
118
+ refresh: number | boolean;
119
+ },
120
+
121
+ /** Caches a user's username based on their ID. It is not on by default because it is an uncontrollable change but the option is there to cache it if you would like. */
122
+ NameFromID: {
123
+ /** Default: false */
124
+ expire: number | boolean;
125
+ /** Default: false */
126
+ refresh: number | boolean;
127
+ },
128
+
129
+ /** Permanent cache for a user's ID based on their name. There is no reason this would ever change (changing names would re-match it and old names cannot be reused by other accounts). Only disable if you want this to match current names only. */
130
+ IDFromName: {
131
+ /** Default: true */
132
+ expire: number | boolean;
133
+ /** Default: false */
134
+ refresh: number | boolean;
135
+ },
136
+
137
+ /** Permanent cache for the sender's user ID. This should literally never change. */
138
+ SenderId: {
139
+ /** Default: true */
140
+ expire: number | boolean;
141
+ /** Default: false */
142
+ refresh: number | boolean;
143
+ },
144
+
145
+ /** Caches rank by user ID. Changes cannot be anticipated so this is not enabled by default. */
146
+ Rank: {
147
+ /** Default: false */
148
+ expire: number | boolean;
149
+ /** Default: false */
150
+ refresh: number | boolean;
151
+ }
152
+ }
153
+ }
154
+
155
+ /// Asset
156
+
157
+ /**
158
+ * @typedef
159
+ */
160
+ type UploadItemAssetType = 11 | 12 | 13;
161
+
162
+ /**
163
+ * @typedef
164
+ */
165
+ type ProductInfoCreator = {
166
+ Id: number;
167
+ Name: string;
168
+ HasVerifiedBadge: boolean;
169
+ }
170
+
171
+ /**
172
+ * @typedef
173
+ */
174
+ type ProductInfo = {
175
+ TargetId: number;
176
+ ProductType?: string;
177
+ AssetId: number;
178
+ ProductId: number;
179
+ Name: string
180
+ Description: string;
181
+ AssetTypeId: number;
182
+ Creator: ProductInfoCreator;
183
+ IconImageAssetId: number;
184
+ Created: Date;
185
+ Updated: Date;
186
+ PriceInRobux?: number;
187
+ PriceInTickets?: number;
188
+ Sales: number;
189
+ IsNew: boolean;
190
+ IsForSale: boolean;
191
+ IsPublicDomain: boolean;
192
+ IsLimited: boolean;
193
+ IsLimitedUnique: boolean;
194
+ Remaining?: number;
195
+ MinimumMembershipLevel: number;
196
+ ContentRatingTypeId: number;
197
+ SaleAvailabilityLocations?: string[];
198
+ SaleLocation?: string;
199
+ CollectibleItemId?: number;
200
+ }
201
+
202
+ /**
203
+ * @typedef
204
+ */
205
+ type GamePassProductInfo = Omit<ProductInfo, "ContentRatingTypeId" | "SaleAvailabilityLocations" | "SaleLocation" | "CollectibleItemId">;
206
+
207
+ /**
208
+ * @typedef
209
+ */
210
+ type PriceRange = {
211
+ high: number;
212
+ low: number;
213
+ }
214
+
215
+ /**
216
+ * @typedef
217
+ */
218
+ type ChartDataPointResponse = {
219
+ value?: number;
220
+ date?: Date;
221
+ }
222
+
223
+ /**
224
+ * @typedef
225
+ */
226
+ type ResaleDataResponse = {
227
+ assetStock?: number;
228
+ sales?: number;
229
+ numberRemaining?: number;
230
+ recentAveragePrice?: number;
231
+ originalPrice?: number;
232
+ priceDataPoints?: ChartDataPointResponse[];
233
+ volumeDataPoints?: ChartDataPointResponse[];
234
+ }
235
+
236
+ /**
237
+ * @typedef
238
+ */
239
+ type ResellerAgent = {
240
+ id: number;
241
+ type: "User" | "Group";
242
+ name: string;
243
+ }
244
+
245
+ /**
246
+ * @typedef
247
+ */
248
+ type ResellerData = {
249
+ userAssetId: number;
250
+ seller: ResellerAgent;
251
+ price: number;
252
+ serialNumber?: number;
253
+ }
254
+
255
+ /**
256
+ * @typedef
257
+ */
258
+ type ThumbnailRequest = {
259
+ requestId?: string;
260
+ targetId?: number;
261
+ token?: string;
262
+ alias?: string;
263
+ type: 'Avatar' | 'AvatarHeadShot' | 'GameIcon' | 'BadgeIcon' | 'GameThumbnail' | 'GamePass' | 'Asset' | 'BundleThumbnail' | 'Outfit' | 'GroupIcon' | 'DeveloperProduct' | 'AutoGeneratedAsset' | 'AvatarBust' | 'PlaceIcon' | 'AutoGeneratedGameIcon' | 'ForceAutoGeneratedGameIcon';
264
+ size: string;
265
+ format?: 'png' | 'jpeg';
266
+ isCircular?: boolean;
267
+ }
268
+
269
+ /**
270
+ * @typedef
271
+ */
272
+ type ThumbnailData = {
273
+ requestId?: string;
274
+ errorCode: number;
275
+ errorMessage: string;
276
+ targetId: number;
277
+ state: "Completed" | "Pending" | "Blocked";
278
+ imageUrl?: string;
279
+ }
280
+
281
+ /**
282
+ * @typedef
283
+ */
284
+ type UploadItemResponse = {
285
+ id: number;
286
+ }
287
+
288
+ /**
289
+ * @typedef
290
+ */
291
+ type UploadModelResponse = {
292
+ AssetId: number;
293
+ AssetVersionId : number;
294
+ }
295
+
296
+ /**
297
+ * @typedef
298
+ */
299
+ type UploadModelItemOptions = {
300
+ name: string;
301
+ description?: string;
302
+ copyLocked?: boolean;
303
+ allowComments?: boolean;
304
+ groupId?: number;
305
+ }
306
+
307
+ /**
308
+ * @typedef
309
+ */
310
+ type ConfigureItemResponse = {
311
+ name: string;
312
+ assetId: number;
313
+ description?: string;
314
+ price?: number;
315
+ isCopyingAllowed?: boolean;
316
+ }
317
+
318
+ /// Avatar
319
+
320
+ /**
321
+ * @typedef
322
+ */
323
+ type AssetTypeRulesModel = {
324
+ min: number;
325
+ max: number;
326
+ increment: number;
327
+ }
328
+
329
+ /**
330
+ * @typedef
331
+ */
332
+ type AvatarRulesScales = {
333
+ [scalename: string]: AssetTypeRulesModel;
334
+ }
335
+
336
+ /**
337
+ * @typedef
338
+ */
339
+ type WearableAssetType = {
340
+ maxNumber: number;
341
+ id: number;
342
+ name: string;
343
+ }
344
+
345
+ /**
346
+ * @typedef
347
+ */
348
+ type BodyColorModel = {
349
+ brickColorId: number;
350
+ hexColor: string;
351
+ name: string;
352
+ }
353
+
354
+ /**
355
+ * @typedef
356
+ */
357
+ type DefaultClothingAssetLists = {
358
+ defaultShirtAssetIds: Array<number>;
359
+ defaultPantAssetIds: Array<number>;
360
+ }
361
+
362
+ /**
363
+ * @typedef
364
+ */
365
+ type AvatarRules = {
366
+ playerAvatarTypes: Array<string>;
367
+ scales: AvatarRulesScales;
368
+ wearableAssetTypes: Array<WearableAssetType>;
369
+ bodyColorsPalette: Array<BodyColorModel>;
370
+ basicBodyColorsPalette: Array<BodyColorModel>;
371
+ minimumDeltaEBodyColorDifference: number;
372
+ proportionsAndBodyTypeEnabledForUser: boolean;
373
+ defaultClothingAssetLists: DefaultClothingAssetLists;
374
+ bundlesEnabledForUser: boolean;
375
+ emotesEnabledForUser: boolean;
376
+ }
377
+
378
+ /**
379
+ * @typedef
380
+ */
381
+ type AssetIdList = {
382
+ assetIds: Array<number>;
383
+ }
384
+
385
+ /**
386
+ * @typedef
387
+ */
388
+ type AvatarScale = {
389
+ height: number;
390
+ width: number;
391
+ head: number;
392
+ depth: number;
393
+ proportion: number;
394
+ bodyType: number;
395
+ }
396
+
397
+ /**
398
+ * @typedef
399
+ */
400
+ type AvatarBodyColors = {
401
+ headColorId: number;
402
+ torsoColorId: number;
403
+ rightArmColorId: number;
404
+ leftArmColorId: number;
405
+ rightLegColorId: number;
406
+ leftLegColorId: number;
407
+ }
408
+
409
+ /**
410
+ * @typedef
411
+ */
412
+ type AvatarAssetType = {
413
+ id: number;
414
+ name: string;
415
+ }
416
+
417
+ /**
418
+ * @typedef
419
+ */
420
+ type AvatarAsset = {
421
+ id: number;
422
+ name: string;
423
+ assetType: AvatarAssetType;
424
+ }
425
+
426
+ /**
427
+ * @typedef
428
+ */
429
+ type PlayerAvatarType = "R6" | "R15";
430
+
431
+ /**
432
+ * @typedef
433
+ */
434
+ type AvatarInfo = {
435
+ scales: AvatarScale;
436
+ playerAvatarType: PlayerAvatarType;
437
+ bodyColors: AvatarBodyColors;
438
+ assets: Array<AvatarAsset>;
439
+ defaultShirtApplied: boolean;
440
+ defaultPantsApplied: boolean;
441
+ }
442
+
443
+ /**
444
+ * @typedef
445
+ */
446
+ type RecentItemListType = "All" | "Clothing" | "BodyParts" | "AvatarAnimations" | "Accessories" | "Outfits" | "Gear";
447
+
448
+ /**
449
+ * @typedef
450
+ */
451
+ type RecentItemType = "Asset" | "Outfit";
452
+
453
+ /**
454
+ * @typedef
455
+ */
456
+ type AssetRecentItem = {
457
+ id: number;
458
+ name: string;
459
+ type: RecentItemType;
460
+ assetType: AvatarAssetType;
461
+ isEditable?: boolean;
462
+ }
463
+
464
+ /**
465
+ * @typedef
466
+ */
467
+ type AssetRecentItemsResult = {
468
+ data: Array<AssetRecentItem>;
469
+ total: number;
470
+ }
471
+
472
+ /**
473
+ * @typedef
474
+ */
475
+ type AvatarOutfitDetails = {
476
+ id: number;
477
+ name: string;
478
+ assets: Array<AvatarAsset>;
479
+ bodyColors: Array<AvatarBodyColors>;
480
+ scale: AvatarScale;
481
+ playerAvatarType: PlayerAvatarType;
482
+ isEditable: boolean;
483
+ }
484
+
485
+ /**
486
+ * @typedef
487
+ */
488
+ type AvatarOutfit = {
489
+ id: number;
490
+ name: string;
491
+ isEditable: boolean;
492
+ }
493
+
494
+ /**
495
+ * @typedef
496
+ */
497
+ type GetOutfitsResult = {
498
+ data: Array<AvatarOutfit>;
499
+ total: number;
500
+ }
501
+
502
+ /// Chat
503
+
504
+ /**
505
+ * @typedef
506
+ */
507
+ type RejectedParticipant = {
508
+ rejectedReason: string;
509
+ type: string;
510
+ targetId: number;
511
+ name: string;
512
+ displayName: string;
513
+ }
514
+
515
+ /**
516
+ * @typedef
517
+ */
518
+ type ConversationAddResponse = {
519
+ conversationId: number;
520
+ rejectedParticipants: Array<RejectedParticipant>;
521
+ resultType: string;
522
+ statusMessage: string;
523
+ }
524
+
525
+ /**
526
+ * @typedef
527
+ */
528
+ type ConversationRemoveResponse = {
529
+ conversationId: number;
530
+ resultType: string;
531
+ statusMessage: string;
532
+ }
533
+
534
+ /**
535
+ * @typedef
536
+ */
537
+ type ConversationRenameResponse = {
538
+ conversationTitle: string;
539
+ resultType: string;
540
+ title: ChatConversationTitle;
541
+ statusMessage: string;
542
+ }
543
+
544
+ /**
545
+ * @typedef
546
+ */
547
+ type SendChatResponse = {
548
+ content: string;
549
+ filteredForReceivers: boolean;
550
+ messageId: string;
551
+ sent: string;
552
+ messageType: string;
553
+ resultType: string;
554
+ statusMessage: string;
555
+ }
556
+
557
+ /**
558
+ * @typedef
559
+ */
560
+ type UpdateTypingResponse = {
561
+ statusMessage: string;
562
+ }
563
+
564
+ /**
565
+ * @typedef
566
+ */
567
+ type StartGroupConversationResponse = {
568
+ conversation: ChatConversation;
569
+ rejectedParticipants: Array<RejectedParticipant>;
570
+ resultType: string;
571
+ statusMessage: string;
572
+ }
573
+
574
+ /**
575
+ * @typedef
576
+ */
577
+ type ChatSettings = {
578
+ /**
579
+ * Is chat enabled for the user.
580
+ */
581
+ chatEnabled: boolean;
582
+ /**
583
+ * Was the Last ChatMessage Sent within the last x days or the account was created in the last x days? Note: user is active by default unless he does not chat for more than x days after account creation
584
+ */
585
+ isActiveChatUser: boolean;
586
+ }
587
+
588
+ /**
589
+ * @typedef
590
+ */
591
+ type ChatMessage = {
592
+ id: string;
593
+ senderType: "User" | "System";
594
+ sent: string;
595
+ read: boolean;
596
+ messageType: "PlainText" | "Link" | "EventBased";
597
+ decorators: Array<string>;
598
+ senderTargetId: number;
599
+ content: string;
600
+ link: ChatMessageLink;
601
+ eventBased: ChatMessageEventBased;
602
+ }
603
+
604
+ /**
605
+ * @typedef
606
+ */
607
+ type ChatMessageLink = {
608
+ type: "Game";
609
+ game: ChatMessageGameLink;
610
+ }
611
+
612
+ /**
613
+ * @typedef
614
+ */
615
+ type ChatMessageGameLink = {
616
+ universeId: number;
617
+ }
618
+
619
+ /**
620
+ * @typedef
621
+ */
622
+ type ChatMessageEventBased = {
623
+ type: "SetConversationUniverse";
624
+ setConversationUniverse: ChatMessageSetConversationUniverseEventBased;
625
+ }
626
+
627
+ /**
628
+ * @typedef
629
+ */
630
+ type ChatMessageSetConversationUniverseEventBased = {
631
+ actorUserId: number;
632
+ universeId: number;
633
+ }
634
+
635
+ /**
636
+ * @typedef
637
+ */
638
+ type ChatConversation = {
639
+ id: number;
640
+ title: string;
641
+ initiator: ChatParticipant;
642
+ hasUnreadMessages: boolean;
643
+ participants: Array<ChatParticipant>;
644
+ conversationType: "OneToOneConversation" | "MultiUserConversation" | "CloudEditConversation";
645
+ conversationTitle: ChatConversationTitle;
646
+ lastUpdated: Date;
647
+ conversationUniverse: ChatConversationUniverse;
648
+ }
649
+
650
+ /**
651
+ * @typedef
652
+ */
653
+ type ChatParticipant = {
654
+ type: "User" | "System";
655
+ targetId: number;
656
+ name: string;
657
+ displayName: string;
658
+ }
659
+
660
+ /**
661
+ * @typedef
662
+ */
663
+ type ChatConversationTitle = {
664
+ titleForViewer: string;
665
+ isDefaultTitle: boolean;
666
+ }
667
+
668
+ /**
669
+ * @typedef
670
+ */
671
+ type ChatConversationUniverse = {
672
+ universeId: number;
673
+ rootPlaceId: number;
674
+ }
675
+
676
+ /**
677
+ * @typedef
678
+ */
679
+ type ChatFeatureNames = "LuaChat" | "ConversationUniverse" | "PlayTogether" | "Party" | "GameLink" | "OldPlayTogether";
680
+
681
+ /**
682
+ * @typedef
683
+ */
684
+ type GetRolloutSettingsResult = {
685
+ rolloutFeatures: Array<ChatRolloutFeature>;
686
+ }
687
+
688
+ /**
689
+ * @typedef
690
+ */
691
+ type ChatRolloutFeature = {
692
+ featureName: ChatFeatureNames;
693
+ isRolloutEnabled: boolean;
694
+ }
695
+
696
+ /**
697
+ * @typedef
698
+ */
699
+ type GetUnreadConversationCountResult = {
700
+ count: number;
701
+ }
702
+
703
+ /**
704
+ * @typedef
705
+ */
706
+ type ChatConversationWithMessages = {
707
+ conversationId: number;
708
+ chatMessages: Array<ChatMessage>;
709
+ }
710
+
711
+ /**
712
+ * @typedef
713
+ */
714
+ type OnUserTypingChatEvent = {
715
+ UserId: number;
716
+ ConversationId: number;
717
+ IsTyping: boolean;
718
+ }
719
+
720
+ /// Game
721
+ /**
722
+ * @typedef
723
+ */
724
+ type UserNotificationPayloadParameter = { stringValue: string } | { int64Value: number };
725
+
726
+ /**
727
+ * @typedef
728
+ */
729
+ type UserNotificationPayloadParameters = {
730
+ [key: string]: UserNotificationPayloadParameter
731
+ }
732
+
733
+ /**
734
+ * @typedef
735
+ */
736
+ type GameInstance = {
737
+ id: string;
738
+ maxPlayers: number;
739
+ playing: number;
740
+ playerTokens: Array<string>;
741
+ fps: number;
742
+ ping: number;
743
+ }
744
+
745
+ /**
746
+ * @typedef
747
+ */
748
+ type GamePassResponse = {
749
+ gamePassId: number,
750
+ name?: string,
751
+ description?: string,
752
+ price?: number,
753
+ isForSale?: boolean,
754
+ iconChanged?: boolean
755
+ }
756
+
757
+ /**
758
+ * @typedef
759
+ */
760
+ type UniverseCreator = {
761
+ id: number;
762
+ name: string;
763
+ type: string;
764
+ isRNVAccount: boolean;
765
+ }
766
+
767
+ /**
768
+ * @typedef
769
+ */
770
+ type UniverseInformation = {
771
+ id: number;
772
+ rootPlaceId: number;
773
+ name: string;
774
+ description: string;
775
+ creator: UniverseCreator;
776
+ price: number;
777
+ allowedGearGenres: Array<string>;
778
+ allowedGearCategories: Array<string>;
779
+ isGenreEnforced: boolean;
780
+ copyingAllowed: boolean;
781
+ playing: number;
782
+ visits: number;
783
+ maxPlayers: number;
784
+ created: Date;
785
+ updated: Date;
786
+ studioAccessToApisAllowed: boolean;
787
+ createVipServersAllowed: boolean;
788
+ universeAvatarType: "MorphToR6" | "PlayerChoice" | "MorphToR15";
789
+ genre: "All" | "Tutorial" | "Scary" | "TownAndCity" | "War" | "Funny" | "Fantasy" | "Adventure" | "SciFi" | "Pirate" | "FPS" | "RPG" | "Sports" | "Ninja" | "WildWest";
790
+ isAllGenre: boolean;
791
+ isFavoritedByUser: boolean;
792
+ favoritedCount: number;
793
+ }
794
+
795
+ /**
796
+ * @typedef
797
+ */
798
+ type PlaceInformation = {
799
+ placeId: number;
800
+ name: string;
801
+ sourceName: string;
802
+ sourceDescription: string;
803
+ url: string;
804
+ builder: string;
805
+ builderId: number;
806
+ hasVerifiedBadge: boolean;
807
+ isPlayable: boolean;
808
+ reasonProhibited: string;
809
+ universeId: number;
810
+ universeRootPlaceId: number;
811
+ price: number;
812
+ imageToken: string;
813
+ }
814
+
815
+ /**
816
+ * @typedef
817
+ */
818
+ type DeveloperProduct = {
819
+ ProductId: number,
820
+ DeveloperProductId: number,
821
+ Name: string,
822
+ Description: string,
823
+ IconImageAssetId: number,
824
+ displayName: string,
825
+ displayDescription: string,
826
+ displayIcon: number,
827
+ PriceInRobux: number
828
+ }
829
+
830
+ /**
831
+ * @typedef
832
+ */
833
+ type SocialLinkResponse = {
834
+ id: number;
835
+ type: 'Facebook' | 'Twitter' | 'YouTube' | 'Twitch' | 'GooglePlus' | 'Discord' | 'RobloxGroup' | 'Amazon';
836
+ url: string;
837
+ title: string;
838
+ }
839
+
840
+ /**
841
+ * @typedef
842
+ */
843
+ type DeveloperProductsResult = {
844
+ DeveloperProducts: Array<DeveloperProduct>,
845
+ FinalPage: boolean,
846
+ PageSize: number
847
+ }
848
+
849
+ /**
850
+ * @typedef
851
+ */
852
+ type DeveloperProductAddResult = {
853
+ universeId: number,
854
+ name: string,
855
+ priceInRobux: number,
856
+ description?: string,
857
+ productId: string
858
+ }
859
+
860
+ /**
861
+ * @typedef
862
+ */
863
+ type CheckDeveloperProductNameResult = {
864
+ Success: boolean;
865
+ /**
866
+ * When success is true: "Name available"
867
+ * When success is false, you can get: "Product name already exists"
868
+ */
869
+ Message: string;
870
+ }
871
+
872
+ /**
873
+ * @typedef
874
+ */
875
+ type GamePassData = {
876
+ id: number;
877
+ name: string;
878
+ displayName: string;
879
+ productId?: number;
880
+ price?: number;
881
+ }
882
+
883
+ /**
884
+ * @typedef
885
+ */
886
+ type UniversePermissions = {
887
+ IsThirdPartyTeleportAllowed?: boolean;
888
+ IsThirdPartyAssetAllowed?: boolean;
889
+ IsThirdPartyPurchaseAllowed?: boolean;
890
+ }
891
+
892
+ /**
893
+ * @typedef
894
+ */
895
+ type UniverseAsset = {
896
+ assetID: number,
897
+ assetTypeID: number,
898
+ isPlayerChoice: boolean
899
+ }
900
+
901
+ /**
902
+ * @typedef
903
+ */
904
+ type PlayableDevices = "Computer" | "Phone" | "Tablet" | "Console"
905
+
906
+ /**
907
+ * @typedef
908
+ */
909
+ type Regions = "Unknown" | "China"
910
+
911
+ /**
912
+ * @typedef
913
+ */
914
+ type UniverseSettings = {
915
+ allowPrivateServers?: boolean;
916
+ privateServerPrice?: number;
917
+
918
+ name?: string;
919
+ description?: string;
920
+
921
+ universeAvatarType?: "MorphToR6" | "MorphToR15" | "PlayerChoice";
922
+ universeAnimationType?: "Standard" | "PlayerChoice";
923
+ universeCollisionType?: "InnerBox" | "OuterBox";
924
+ universeJointPositioningType?: "Standard" | "ArtistIntent";
925
+
926
+ isArchived?: boolean;
927
+ isFriendsOnly?: boolean;
928
+
929
+ genre?: "All" | "Tutorial" | "Scary" | "TownAndCity" | "War" | "Funny" | "Fantasy" | "Adventure" | "SciFi" | "Pirate" | "FPS" | "RPG" | "Sports" | "Ninja" | "WildWest";
930
+
931
+ /**
932
+ * Computer, Phone, Tablet, Console
933
+ */
934
+ playableDevices?: Array<PlayableDevices>;
935
+ universeAvatarAssetOverrides?: Array<UniverseAsset>;
936
+
937
+ isForSale?: boolean;
938
+ price?: number;
939
+
940
+ universeAvatarMinScales?: AvatarScale;
941
+ universeAvatarMaxScales?: AvatarScale;
942
+
943
+ studioAccessToApisAllowed?: boolean;
944
+ permissions?: UniversePermissions;
945
+
946
+ /**
947
+ * Unknown, China
948
+ */
949
+ optInRegions?: Array<Regions>;
950
+ }
951
+
952
+ /**
953
+ * @typedef
954
+ */
955
+ type UpdateUniverseResponse = {
956
+ allowPrivateServers?: boolean;
957
+ privateServerPrice?: number;
958
+
959
+ id: number;
960
+ name?: string;
961
+ description?: string;
962
+
963
+ universeAvatarType?: "MorphToR6" | "MorphToR15" | "PlayerChoice";
964
+ universeAnimationType?: "Standard" | "PlayerChoice";
965
+ universeCollisionType?: "InnerBox" | "OuterBox";
966
+ universeJointPositioningType?: "Standard" | "ArtistIntent";
967
+
968
+ isArchived?: boolean;
969
+ isFriendsOnly?: boolean;
970
+
971
+ genre?: "All" | "Tutorial" | "Scary" | "TownAndCity" | "War" | "Funny" | "Fantasy" | "Adventure" | "SciFi" | "Pirate" | "FPS" | "RPG" | "Sports" | "Ninja" | "WildWest";
972
+
973
+ /**
974
+ * Computer, Phone, Tablet, Console
975
+ */
976
+ playableDevices?: Array<PlayableDevices>;
977
+ universeAvatarAssetOverrides?: Array<UniverseAsset>;
978
+
979
+ isForSale?: boolean;
980
+ price?: number;
981
+
982
+ universeAvatarMinScales?: AvatarScale;
983
+ universeAvatarMaxScales?: AvatarScale;
984
+
985
+ studioAccessToApisAllowed?: boolean;
986
+ permissions?: UniversePermissions;
987
+
988
+ /**
989
+ * Unknown, China
990
+ */
991
+ optInRegions?: Array<Regions>;
992
+ }
993
+
994
+ /**
995
+ * @typedef
996
+ */
997
+ type GameRevenueData = {
998
+ Total: object;
999
+ }
1000
+
1001
+ /**
1002
+ * @typedef
1003
+ */
1004
+ type GameRevenueResponse = {
1005
+ placeId: number;
1006
+ dataType: number;
1007
+ dataGranularity: number;
1008
+ startTime: Date;
1009
+ endTime: Date;
1010
+ data: GameRevenueData;
1011
+ }
1012
+
1013
+ /// Group
1014
+
1015
+ /**
1016
+ * @typedef
1017
+ */
1018
+ type GroupIconSize = "150x150" | "420x420"
1019
+ type GroupIconFormat = "Png"
1020
+
1021
+ /**
1022
+ * @typedef
1023
+ */
1024
+ type Role = {
1025
+ name: string;
1026
+ memberCount?: number;
1027
+ rank: number;
1028
+ id: number;
1029
+ }
1030
+
1031
+ /**
1032
+ * @typedef
1033
+ */
1034
+ type RoleWithDescription = {
1035
+ name: string;
1036
+ memberCount?: number;
1037
+ rank: number;
1038
+ id: number;
1039
+ description: string;
1040
+ }
1041
+
1042
+ /**
1043
+ * @typedef
1044
+ */
1045
+ type GroupPostsPermissions = {
1046
+ viewWall: boolean;
1047
+ postToWall: boolean;
1048
+ deleteFromWall: boolean;
1049
+ viewStatus: boolean;
1050
+ postToStatus: boolean;
1051
+ }
1052
+
1053
+ /**
1054
+ * @typedef
1055
+ */
1056
+ type GroupMembershipPermissions = {
1057
+ changeRank: boolean;
1058
+ inviteMembers: boolean;
1059
+ removeMembers: boolean;
1060
+ }
1061
+
1062
+ /**
1063
+ * @typedef
1064
+ */
1065
+ type GroupManagementPermissions = {
1066
+ manageRelationships: boolean;
1067
+ manageClan: boolean;
1068
+ viewAuditLogs: boolean;
1069
+ }
1070
+
1071
+ /**
1072
+ * @typedef
1073
+ */
1074
+ type GroupEconomyPermissions = {
1075
+ spendGroupFunds: boolean;
1076
+ advertiseGroup: boolean;
1077
+ createItems: boolean;
1078
+ manageItems: boolean;
1079
+ addGroupPlaces: boolean;
1080
+ manageGroupGames: boolean;
1081
+ viewGroupPayouts: boolean;
1082
+ }
1083
+
1084
+ /**
1085
+ * @typedef
1086
+ */
1087
+ type RolePermissionsBody = {
1088
+ groupPostsPermissions: GroupPostsPermissions;
1089
+ groupMembershipPermissions: GroupMembershipPermissions;
1090
+ groupManagementPermissions: GroupManagementPermissions;
1091
+ groupEconomyPermissions: GroupEconomyPermissions;
1092
+ }
1093
+
1094
+ /**
1095
+ * @typedef
1096
+ */
1097
+ type RolePermissions = {
1098
+ groupId: number;
1099
+ role: RoleWithDescription;
1100
+ permissions: RolePermissionsBody
1101
+ }
1102
+
1103
+ /**
1104
+ * @typedef
1105
+ */
1106
+ type ChangeRankResult = {
1107
+ newRole: Role;
1108
+ oldRole: Role;
1109
+ }
1110
+
1111
+ /**
1112
+ * @typedef
1113
+ */
1114
+ type Group = {
1115
+ id: number;
1116
+ name: string;
1117
+ description: string;
1118
+ owner: GroupUser;
1119
+ shout?: GroupShout;
1120
+ memberCount: number;
1121
+ isBuildersClubOnly: boolean;
1122
+ publicEntryAllowed: boolean;
1123
+ isLocked: boolean;
1124
+ }
1125
+
1126
+ /**
1127
+ * @typedef
1128
+ */
1129
+ type GroupSearchItem = {
1130
+ id: number;
1131
+ name: string;
1132
+ description: string;
1133
+ memberCount: number;
1134
+ publicEntryAllowed: boolean;
1135
+ created: Date;
1136
+ updated: Date;
1137
+ }
1138
+
1139
+ /**
1140
+ * @typedef
1141
+ */
1142
+ type GroupGameInfo = {
1143
+ id: number;
1144
+ name: string;
1145
+ description: string;
1146
+ creator: { id: number; type: string; };
1147
+ rootPlace: { id: number; type: string; };
1148
+ created: Date;
1149
+ updated: Date;
1150
+ placeVisits: number;
1151
+ }
1152
+
1153
+ /**
1154
+ * @typedef
1155
+ */
1156
+ type GroupAssetInfo = {
1157
+ assetId: number;
1158
+ name: string;
1159
+ }
1160
+
1161
+ /**
1162
+ * @typedef
1163
+ */
1164
+ type IGroupPartial = {
1165
+ Name: string;
1166
+ Id: number;
1167
+ EmblemUrl: string;
1168
+ MemberCount: number;
1169
+ Rank: number;
1170
+ Role: string;
1171
+ RoleId: number;
1172
+ IsPrimary: boolean;
1173
+ }
1174
+
1175
+ /**
1176
+ * @typedef
1177
+ */
1178
+ type GroupView = {
1179
+ __VIEWSTATE: string;
1180
+ __VIEWSTATEGENERATOR: string;
1181
+ __EVENTVALIDATION: string;
1182
+ __RequestVerificationToken: string;
1183
+ }
1184
+
1185
+ /**
1186
+ * @typedef
1187
+ */
1188
+ type GroupUser = {
1189
+ userId: number;
1190
+ username: string;
1191
+ displayName: string;
1192
+ hasVerifiedBadge?: boolean;
1193
+ }
1194
+
1195
+ /**
1196
+ * @typedef
1197
+ */
1198
+ type GroupShout = {
1199
+ body: string;
1200
+ poster: GroupUser;
1201
+ created: Date;
1202
+ updated: Date;
1203
+ }
1204
+
1205
+ /**
1206
+ * @typedef
1207
+ */
1208
+ type PayoutAllowedList = {
1209
+ usersGroupPayoutEligibility: {
1210
+ [k: string]: string;
1211
+ }
1212
+ }
1213
+
1214
+ /**
1215
+ * @typedef
1216
+ */
1217
+ type GroupDescriptionResult = {
1218
+ newDescription: string
1219
+ }
1220
+
1221
+ /**
1222
+ * @typedef
1223
+ */
1224
+ type GroupNameResult = {
1225
+ newName: string
1226
+ }
1227
+
1228
+ /**
1229
+ * @typedef
1230
+ */
1231
+ type AuditItemActor = {
1232
+ user: GroupUser;
1233
+ role: Role;
1234
+ }
1235
+
1236
+ /**
1237
+ * @typedef
1238
+ */
1239
+ type AuditItem = {
1240
+ actor: AuditItemActor;
1241
+ actionType: string;
1242
+ description: object;
1243
+ created: Date;
1244
+ }
1245
+
1246
+ /**
1247
+ * @typedef
1248
+ */
1249
+ type AuditPage = {
1250
+ data: Array<AuditItem>;
1251
+ nextPageCursor?: string;
1252
+ previousPageCursor?: string;
1253
+ }
1254
+
1255
+ /**
1256
+ * @typedef
1257
+ */
1258
+ type TransactionAgent = {
1259
+ id: number;
1260
+ type: string;
1261
+ name: string;
1262
+ }
1263
+
1264
+ /**
1265
+ * @typedef
1266
+ */
1267
+ type TransactionDetails = {
1268
+ id: number;
1269
+ name: string;
1270
+ type: string;
1271
+ }
1272
+
1273
+ /**
1274
+ * @typedef
1275
+ */
1276
+ type TransactionCurrency = {
1277
+ amount: number;
1278
+ type: string;
1279
+ }
1280
+
1281
+ /**
1282
+ * @typedef
1283
+ */
1284
+ type TransactionItem = {
1285
+ id: number;
1286
+ transactionType?: string;
1287
+ created: Date;
1288
+ isPending: boolean;
1289
+ agent: TransactionAgent;
1290
+ details?: TransactionDetails;
1291
+ currency: TransactionCurrency;
1292
+ }
1293
+
1294
+ /**
1295
+ * @typedef
1296
+ */
1297
+ type GroupJoinRequester = {
1298
+ userId: number;
1299
+ username: string;
1300
+ displayName: string;
1301
+ }
1302
+
1303
+ /**
1304
+ * @typedef
1305
+ */
1306
+ type GroupJoinRequest = {
1307
+ requester: GroupJoinRequester;
1308
+ created: Date;
1309
+ }
1310
+
1311
+ /**
1312
+ * @typedef
1313
+ */
1314
+ type GroupJoinRequestsPage = {
1315
+ previousPageCursor?: string;
1316
+ nextPageCursor?: string;
1317
+ data: Array<GroupJoinRequest>;
1318
+ }
1319
+
1320
+ /**
1321
+ * @typedef
1322
+ */
1323
+ type RevenueSummaryResponse = {
1324
+ recurringRobuxStipend?: number;
1325
+ itemSaleRobux?: number;
1326
+ purchasedRobux?: number;
1327
+ tradeSystemRobux?: number;
1328
+ pendingRobux?: number;
1329
+ groupPayoutRobux?: number;
1330
+ individualToGroupRobux?: number;
1331
+ premiumPayouts?: number;
1332
+ groupPremiumPayouts?: number;
1333
+ adjustmentRobux?: number;
1334
+ }
1335
+
1336
+ /**
1337
+ * @typedef
1338
+ */
1339
+ type WallPost = {
1340
+ id: number;
1341
+ poster: GroupUser;
1342
+ body: string;
1343
+ created: Date;
1344
+ updated: Date;
1345
+ }
1346
+
1347
+ /**
1348
+ * @typedef
1349
+ */
1350
+ type WallPostPage = {
1351
+ previousPageCursor?: string;
1352
+ nextPageCursor?: string;
1353
+ data: Array<WallPost>;
1354
+ }
1355
+
1356
+ /**
1357
+ * @typedef
1358
+ */
1359
+ type GroupBan = {
1360
+ user: UserEntry;
1361
+ actingUser: {
1362
+ user: UserEntry;
1363
+ }
1364
+ created: Date;
1365
+ }
1366
+
1367
+ /// Party
1368
+
1369
+ /**
1370
+ * @typedef
1371
+ */
1372
+ type PartyData = {
1373
+ PartyId: number;
1374
+ PartyType: string;
1375
+ }
1376
+
1377
+ /// User
1378
+
1379
+ /**
1380
+ * 0 = Inbox
1381
+ * 1 = Sent Messages
1382
+ * 3 = Archived Messages
1383
+ */
1384
+ type PrivateMessageTab = 0 | 1 | 3;
1385
+
1386
+ /**
1387
+ * 0 = Offline
1388
+ * 1 = Online
1389
+ * 2 = InGame
1390
+ * 3 = Studio
1391
+ */
1392
+ type UserPresenceType = 0 | 1 | 2 | 3
1393
+
1394
+ /**
1395
+ * @typedef
1396
+ */
1397
+ type LoggedInUserData = {
1398
+ UserID: number,
1399
+ UserName: string,
1400
+ RobuxBalance: number,
1401
+ ThumbnailUrl: string,
1402
+ IsAnyBuildersClubMember: false,
1403
+ IsPremium: boolean
1404
+ }
1405
+
1406
+ /**
1407
+ * @typedef
1408
+ */
1409
+ type AuthenticatedUserData = {
1410
+ id: number;
1411
+ name: string;
1412
+ displayName: string;
1413
+ }
1414
+
1415
+ /**
1416
+ * @typedef
1417
+ */
1418
+ type UserLoginApiData = {
1419
+ userId: number;
1420
+ }
1421
+
1422
+ /**
1423
+ * @typedef
1424
+ */
1425
+ type AvatarEntry = {
1426
+ url: string;
1427
+ final: boolean;
1428
+ }
1429
+
1430
+ /**
1431
+ * @typedef
1432
+ */
1433
+ type UserStatus = {
1434
+ online: boolean;
1435
+ lastSeen: Date;
1436
+ }
1437
+
1438
+ /**
1439
+ * @typedef
1440
+ */
1441
+ type FriendRequestEntry = {
1442
+ description: string;
1443
+ created: Date;
1444
+ isBanned: boolean;
1445
+ id: number;
1446
+ name: string;
1447
+ displayName: string;
1448
+ }
1449
+
1450
+ /**
1451
+ * @typedef
1452
+ */
1453
+ type FriendRequestsPage = {
1454
+ previousPageCursor?: string;
1455
+ nextPageCursor?: string;
1456
+ data: Array<FriendRequestEntry>;
1457
+ }
1458
+
1459
+ /**
1460
+ * @typedef
1461
+ */
1462
+ type FriendEntry = {
1463
+ created: Date;
1464
+ id: number;
1465
+ isBanned: boolean;
1466
+ isDeleted: boolean;
1467
+ isOnline?: boolean;
1468
+ name: string;
1469
+ description?: string;
1470
+ displayName: string;
1471
+ externalAppDisplayName?: string;
1472
+ friendFrequentRank: number;
1473
+ friendFrequentScore: number;
1474
+ presenceType?: UserPresenceType;
1475
+ }
1476
+
1477
+ /**
1478
+ * @typedef
1479
+ */
1480
+ type Friends = {
1481
+ friends: Array<FriendEntry>;
1482
+ }
1483
+
1484
+ /**
1485
+ * @typedef
1486
+ */
1487
+ type FollowEntry = {
1488
+ isDeleted: false;
1489
+ id: number;
1490
+ name: string;
1491
+ description: string;
1492
+ created: Date;
1493
+ displayName: string;
1494
+ }
1495
+
1496
+ /**
1497
+ * @typedef
1498
+ */
1499
+ type FollowingsPage = {
1500
+ previousPageCursor?: string;
1501
+ nextPageCursor?: string;
1502
+ data: Array<FollowEntry>;
1503
+ }
1504
+
1505
+ /**
1506
+ * @typedef
1507
+ */
1508
+ type FollowersPage = {
1509
+ previousPageCursor?: string;
1510
+ nextPageCursor?: string;
1511
+ data: Array<FollowEntry>;
1512
+ }
1513
+
1514
+ /**
1515
+ * @typedef
1516
+ */
1517
+ type PrivateMessagesPage = {
1518
+ collection: Array<PrivateMessage>;
1519
+ totalPages: number;
1520
+ totalCollectionSize: number;
1521
+ pageNumber: number;
1522
+ }
1523
+
1524
+ /**
1525
+ * @typedef
1526
+ */
1527
+ type UserEntry = {
1528
+ hasVerifiedBadge: boolean;
1529
+ userId: number;
1530
+ name: string;
1531
+ displayName: string;
1532
+ }
1533
+
1534
+ /**
1535
+ * @typedef
1536
+ */
1537
+ type UsernameHistoryEntry = {
1538
+ name: string;
1539
+ }
1540
+
1541
+ /**
1542
+ * @typedef
1543
+ */
1544
+ type PrivateMessageParent = {
1545
+ page: number;
1546
+ }
1547
+
1548
+ /**
1549
+ * @typedef
1550
+ */
1551
+ type PrivateMessage = {
1552
+ id: number;
1553
+ sender: UserEntry;
1554
+ recipient: UserEntry;
1555
+ subject: string;
1556
+ body: string;
1557
+ created: Date;
1558
+ updated: Date;
1559
+ isRead: boolean;
1560
+ isSystemMessage: boolean;
1561
+ isReportAbuseDisplayed: boolean;
1562
+ parent: PrivateMessageParent;
1563
+ }
1564
+
1565
+ /**
1566
+ * @typedef
1567
+ */
1568
+ type NotificationMessage = {
1569
+ type: string;
1570
+ [key: string]: any;
1571
+ }
1572
+
1573
+ /**
1574
+ * @typedef
1575
+ */
1576
+ type FriendRequest = number;
1577
+
1578
+ /**
1579
+ * @typedef
1580
+ */
1581
+ type UserPresence = {
1582
+ userPresenceType?: UserPresenceType;
1583
+ lastLocation?: string;
1584
+ placeId?: number;
1585
+ rootPlaceId?: number;
1586
+ gameId?: string;
1587
+ universeId?: number;
1588
+ userId?: number;
1589
+ lastOnline?: string;
1590
+ }
1591
+
1592
+ /**
1593
+ * @typedef
1594
+ */
1595
+ type PlayerInfo = {
1596
+ username: string;
1597
+ displayName: string;
1598
+ blurb: string;
1599
+ joinDate: Date;
1600
+ age?: number;
1601
+ friendCount?: number;
1602
+ followerCount?: number;
1603
+ followingCount?: number;
1604
+ isBanned: boolean;
1605
+ }
1606
+
1607
+ /**
1608
+ * @typedef
1609
+ */
1610
+ type UserInfo = {
1611
+ description: string;
1612
+ created: Date;
1613
+ isBanned: boolean;
1614
+ hasVerifiedBadge: boolean;
1615
+ id: number;
1616
+ name: string;
1617
+ displayName: string;
1618
+ }
1619
+
1620
+ /**
1621
+ * @typedef
1622
+ */
1623
+ type Presences = {
1624
+ userPresences: Array<UserPresence>;
1625
+ }
1626
+
1627
+ /**
1628
+ * @typedef
1629
+ */
1630
+ type PlayerThumbnailData = {
1631
+ targetId: number;
1632
+ state: string;
1633
+ imageUrl: string;
1634
+ }
1635
+
1636
+ /**
1637
+ * @typedef
1638
+ */
1639
+ type PromotionChannelsResponse = {
1640
+ facebook?: string;
1641
+ twitter?: string;
1642
+ youtube?: string;
1643
+ twitch?: string;
1644
+ guilded?: string;
1645
+ }
1646
+
1647
+ type UserSearchResult = {
1648
+ previousUsernames: string[];
1649
+ hasVerifiedBadge: boolean;
1650
+ id: number;
1651
+ name: string;
1652
+ displayName: string;
1653
+ }
1654
+
1655
+ /// Badges
1656
+
1657
+ /**
1658
+ * @typedef
1659
+ */
1660
+ type BadgeAwarder = {
1661
+ id: number;
1662
+ type: string;
1663
+ }
1664
+
1665
+ /**
1666
+ * @typedef
1667
+ */
1668
+ type UserBadgeStats = {
1669
+ badgeId: number;
1670
+ awardedDate: Date;
1671
+ }
1672
+
1673
+ /**
1674
+ * @typedef
1675
+ */
1676
+ type BadgeStatistics = {
1677
+ pastDayAwardedCount: number;
1678
+ awardedCount: number;
1679
+ winRatePercentage: number;
1680
+ }
1681
+
1682
+ /**
1683
+ * @typedef
1684
+ */
1685
+ type BadgeUniverse = {
1686
+ id: number;
1687
+ name: string;
1688
+ rootPlaceId: number;
1689
+ }
1690
+
1691
+ /**
1692
+ * @typedef
1693
+ */
1694
+ type PlayerBadges = {
1695
+ id: number;
1696
+ name: string;
1697
+ description?: string;
1698
+ displayName: string;
1699
+ displayDescription?: string;
1700
+ enabled: boolean;
1701
+ iconImageId: number;
1702
+ displayIconImageId: number;
1703
+ awarder: BadgeAwarder;
1704
+ statistics: BadgeStatistics;
1705
+ created: Date;
1706
+ updated: Date;
1707
+ }
1708
+
1709
+ /**
1710
+ * @typedef
1711
+ */
1712
+ type BadgeInfo = {
1713
+ id: number;
1714
+ name: string;
1715
+ description?: string;
1716
+ displayName: string;
1717
+ displayDescription?: string;
1718
+ enabled: boolean;
1719
+ iconImageId: number;
1720
+ displayIconImageId: number;
1721
+ created: Date;
1722
+ updated: Date;
1723
+ statistics: BadgeStatistics
1724
+ awardingUniverse: BadgeUniverse
1725
+ }
1726
+
1727
+ //Inventory
1728
+
1729
+ /**
1730
+ * @typedef
1731
+ */
1732
+ type AssetOwner = {
1733
+ userId: number;
1734
+ username: string;
1735
+ buildersClubMembershipType: number;
1736
+ }
1737
+
1738
+ /**
1739
+ * @typedef
1740
+ */
1741
+ type CollectibleEntry = {
1742
+ userAssetId: number;
1743
+ serialNumber?: number;
1744
+ assetId: number;
1745
+ name: string;
1746
+ recentAveragePrice: number;
1747
+ originalPrice?: number;
1748
+ assetStock?: number;
1749
+ buildersClubMembershipType: number;
1750
+ }
1751
+
1752
+ /**
1753
+ * @typedef
1754
+ */
1755
+ type Collectibles = {
1756
+ collectibles: Array<CollectibleEntry>;
1757
+ }
1758
+
1759
+ /**
1760
+ * @typedef
1761
+ */
1762
+ type InventoryEntry = {
1763
+ assetId: number;
1764
+ name: string;
1765
+ assetType: string;
1766
+ created: Date;
1767
+ updated?: Date;
1768
+ assetName?: string;
1769
+ userAssetId?: number;
1770
+ owner?: AssetOwner;
1771
+ }
1772
+
1773
+ /**
1774
+ * @typedef
1775
+ */
1776
+ type Inventory = {
1777
+ items: Array<InventoryEntry>;
1778
+ }
1779
+
1780
+ ///Trading
1781
+
1782
+ /**
1783
+ * @typedef
1784
+ */
1785
+ type UAIDResponse = {
1786
+ uaids: Array<number>,
1787
+ failedIds: Array<number>
1788
+ }
1789
+
1790
+ /**
1791
+ * @typedef
1792
+ */
1793
+ type CanTradeResponse = {
1794
+ canTrade: boolean,
1795
+ status: string
1796
+ }
1797
+
1798
+ /**
1799
+ * @typedef
1800
+ */
1801
+ type TradeUser = {
1802
+ userId: number;
1803
+ username: string;
1804
+ displayName: string;
1805
+ }
1806
+
1807
+ /**
1808
+ * @typedef
1809
+ */
1810
+ type TradeAsset = {
1811
+ id: number,
1812
+ user: TradeUser,
1813
+ created: Date,
1814
+ expiration?: Date,
1815
+ isActive: boolean,
1816
+ status: string
1817
+ }
1818
+
1819
+ /**
1820
+ * @typedef
1821
+ */
1822
+ type DetailedTradeAsset = {
1823
+ id: number,
1824
+ serialNumber: number,
1825
+ assetId: number,
1826
+ name: string,
1827
+ recentAveragePrice: number,
1828
+ originalPrice: number,
1829
+ assetStock: number,
1830
+ membershipType: string
1831
+ }
1832
+
1833
+ /**
1834
+ * @typedef
1835
+ */
1836
+ type DetailedTradeOffer = {
1837
+ user: TradeUser,
1838
+ userAssets: Array<DetailedTradeAsset>,
1839
+ robux: number
1840
+ }
1841
+
1842
+ /**
1843
+ * @typedef
1844
+ */
1845
+ type TradeOffer = {
1846
+ userAssetIds: Array<number>,
1847
+ robux: number
1848
+ }
1849
+
1850
+ /**
1851
+ * @typedef
1852
+ */
1853
+ type TradeInfo = {
1854
+ offers: Array<DetailedTradeOffer>,
1855
+ id: number,
1856
+ user: TradeUser,
1857
+ created: Date,
1858
+ expiration?: Date,
1859
+ isActive: boolean,
1860
+ status: string
1861
+ }
1862
+
1863
+ /**
1864
+ * @typedef
1865
+ */
1866
+ type SendTradeResponse = {
1867
+ id: number
1868
+ }
1869
+
1870
+ /// Utility
1871
+
1872
+ /**
1873
+ * @typedef
1874
+ */
1875
+ type SelectorFunction = (selector: string) => {val(): any};
1876
+ type SortOrder = 'Asc' | 'Desc';
1877
+ type Limit = 10 | 25 | 50 | 100;
1878
+
1879
+ /**
1880
+ * @typedef
1881
+ */
1882
+ type Inputs = {
1883
+ /**
1884
+ * With a provided name, this returns the input's value.
1885
+ */
1886
+ [name: string]: string;
1887
+ }
1888
+
1889
+ /**
1890
+ * @typedef
1891
+ */
1892
+ type GetVerificationResponse = {
1893
+ body?: string;
1894
+ inputs: Inputs;
1895
+ header: string;
1896
+ }
1897
+
1898
+ /**
1899
+ * @typedef
1900
+ */
1901
+ type HttpOptions = {
1902
+ verification?: string;
1903
+ jar?: CookieJar;
1904
+ }
1905
+
1906
+ /**
1907
+ * @typedef
1908
+ */
1909
+ type GetLatestResponse = {
1910
+ latest: number;
1911
+ data: object;
1912
+ repeat?: boolean;
1913
+ }
1914
+
1915
+ /// Datastores
1916
+
1917
+ /**
1918
+ * @typedef
1919
+ */
1920
+ type Datastore = {
1921
+ name: string;
1922
+ createdTime: Date;
1923
+ }
1924
+
1925
+ /**
1926
+ * @typedef
1927
+ */
1928
+ type DatastoresResult = {
1929
+ datastores: Datastore[];
1930
+ nextPageCursor?: string;
1931
+ }
1932
+
1933
+ /**
1934
+ * @typedef
1935
+ */
1936
+ type EntryKey = {
1937
+ scope: string;
1938
+ key: string;
1939
+ }
1940
+
1941
+ /**
1942
+ * @typedef
1943
+ */
1944
+ type DatastoreKeysResult = {
1945
+ keys: EntryKey[];
1946
+ nextPageCursor?: string;
1947
+ }
1948
+
1949
+ /**
1950
+ * @typedef
1951
+ */
1952
+ type DatastoreEntry = {
1953
+ data: any;
1954
+ metadata: {
1955
+ /** (ISO datetime, UTC): the time at which the entry was created */
1956
+ robloxEntryCreatedTime: Date;
1957
+ /** (ISO datetime, UTC): the time at which the entry was updated */
1958
+ lastModified: Date;
1959
+ /** version of the entry being read */
1960
+ robloxEntryVersion: string;
1961
+ robloxEntryAttributes?: string;
1962
+ robloxEntryUserIDs?: string;
1963
+ /** the base-64 encoded MD5 checksum of the content */
1964
+ contentMD5: string;
1965
+ /** the content length in bytes */
1966
+ contentLength: number;
1967
+ }
1968
+ }
1969
+
1970
+ /**
1971
+ * @typedef
1972
+ */
1973
+ type EntryVersion = {
1974
+ version: string;
1975
+ deleted: boolean;
1976
+ contentLength: number;
1977
+ createdTime: Date;
1978
+ objectCreatedTime: Date;
1979
+ }
1980
+
1981
+ /**
1982
+ * @typedef
1983
+ */
1984
+ type EntryVersionsResult = {
1985
+ versions: EntryVersion[];
1986
+ nextPageCursor: string;
1987
+ }