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,210 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const getGeneralToken = require('../util/getGeneralToken.js').func
4
+ const RobloxAPIError = require('../util/apiError.js')
5
+
6
+ // Args
7
+ exports.required = ['id', 'name', 'description']
8
+ exports.optional = ['enableComments', 'sellForRobux', 'genreSelection', 'jar']
9
+
10
+ // Docs
11
+ /**
12
+ * 🔐 Configure an asset.
13
+ * @category Develop
14
+ * @alias configureItem
15
+ * @param {number} assetId - The id of the asset.
16
+ * @param {string} name - The new name of the asset.
17
+ * @param {string} description - The new description of the asset.
18
+ * @param {boolean=} enableComments - Enable comments on your asset.
19
+ * @param {number|boolean=} [sellForRobux=false] - The amount of robux to sell for; use a number for sellable assets, boolean for copyable assets
20
+ * @param {string=} [genreSelection="All"] - The genre of your asset.
21
+ * @returns {Promise<ConfigureItemResponse>}
22
+ * @example const noblox = require("noblox.js")
23
+ * // Login using your cookie
24
+ * noblox.configureItem(1117747196, "Item", "A cool item.", false, 100)
25
+ **/
26
+
27
+ // Define
28
+ function configure (jar, token, id, name, description, enableComments, sellForRobux, genreSelection, sellingPrice) {
29
+ return http({
30
+ url: '//develop.roblox.com/v1/assets/' + id,
31
+ options: {
32
+ method: 'PATCH',
33
+ jar,
34
+ headers: {
35
+ 'X-CSRF-TOKEN': token
36
+ },
37
+ json: {
38
+ name,
39
+ description,
40
+ enableComments,
41
+ genres: genreSelection || ['All'],
42
+ isCopyingAllowed: typeof (sellForRobux) === 'boolean' ? sellForRobux : null
43
+ },
44
+ resolveWithFullResponse: true
45
+ }
46
+ }).then(function (res) {
47
+ const json = JSON.parse(res.body)
48
+
49
+ if (!json.errors) {
50
+ const response = {
51
+ name,
52
+ description,
53
+ assetId: id
54
+ }
55
+ if (typeof sellForRobux === 'boolean') {
56
+ response.isCopyingAllowed = sellForRobux
57
+ } else {
58
+ response.price = sellingPrice || 0
59
+ }
60
+ return response
61
+ } else {
62
+ if (json.errors[0].code === 13) { // "Only a marketplace asset can be updated with IsCopyingAllowed."
63
+ throw new Error('Attempting to make a sellable asset copyable; it must be sold for robux. (Use a number for sellForRobux.)')
64
+ }
65
+ throw new RobloxAPIError(res)
66
+ }
67
+ })
68
+ }
69
+
70
+ function configureRobux (args) {
71
+ return http({
72
+ url: '//itemconfiguration.roblox.com/v1/assets/' + args.id + '/release',
73
+ options: {
74
+ method: 'POST',
75
+ jar: args.jar,
76
+ headers: {
77
+ 'X-CSRF-TOKEN': args.token
78
+ },
79
+ json: {
80
+ saleStatus: args.sellForRobux ? 'OnSale' : 'OffSale',
81
+ priceConfiguration: {
82
+ priceInRobux: args.sellForRobux || 0
83
+ }
84
+ },
85
+ resolveWithFullResponse: true
86
+ }
87
+ })
88
+ .then(function (res) {
89
+ const json = res.body
90
+
91
+ if (!json.errors) {
92
+ return configure(args.jar, args.token, args.id, args.name, args.description, args.enableComments, args.sellForRobux, args.genreSelection, args.sellForRobux)
93
+ } else {
94
+ // Code 6: "Asset is released"; caused when changing the price of an on-sale asset from non-zero to non-zero
95
+ if (json.errors[0].code === 6) {
96
+ return http({
97
+ url: '//itemconfiguration.roblox.com/v1/assets/' + args.id + '/update-price',
98
+ options: {
99
+ method: 'POST',
100
+ jar: args.jar,
101
+ headers: {
102
+ 'X-CSRF-TOKEN': args.token
103
+ },
104
+ json: {
105
+ priceConfiguration: {
106
+ priceInRobux: args.sellForRobux
107
+ }
108
+ },
109
+ resolveWithFullResponse: true
110
+ }
111
+ }).then((res) => {
112
+ const err = res.body
113
+ if (!err.errors) {
114
+ return configure(args.jar, args.token, args.id, args.name, args.description, args.enableComments, args.sellForRobux, args.genreSelection, args.sellForRobux)
115
+ } else {
116
+ throw new Error(json.errors[0].message)
117
+ }
118
+ })
119
+ } else if (json.errors[0].code === 3) { // "Cannot release the associated asset type" - caused by copyable asset using sellForRobux: 2 or greater
120
+ // Throw an error as the developer may have intended to sell the asset for robux instead of making it free.
121
+ throw new Error('Attempting to sell a copyable asset for robux; it can only be made free. (Use true for sellForRobux.)')
122
+ } else if (json.errors[0].code === 20) { // "Cannot set the associated asset type to remove-from-release" - caused by copyable asset using sellForRobux: 0
123
+ // Continue and ignore the error as the intended outcome makes the asset private; set sellForRobux from 0 to false
124
+ return configure(args.jar, args.token, args.id, args.name, args.description, args.enableComments, args.sellForRobux, args.genreSelection, !!args.sellForRobux)
125
+ } else if (json.errors[0].code === 37) { // "AssetIsLimited" - Use the newer endpoint to update price and sale status
126
+ return http({
127
+ url: '//catalog.roblox.com/v1/catalog/items/details',
128
+ options: {
129
+ method: 'POST',
130
+ jar: args.jar,
131
+ json: {
132
+ items: [
133
+ {
134
+ id: args.id,
135
+ itemType: 1
136
+ }
137
+ ]
138
+ },
139
+ resolveWithFullResponse: true
140
+ }
141
+ }).then((response) => {
142
+ if (!response.ok) throw new Error(response.body)
143
+
144
+ const { collectibleItemId, price } = JSON.parse(response.body)
145
+
146
+ if (!collectibleItemId) throw new Error(`The publishing fee for asset ${args.id} has not been paid, you must do this in order to change or set the price.`)
147
+
148
+ return http({
149
+ url: `//itemconfiguration.roblox.com/v1/collectibles/${collectibleItemId}`,
150
+ options: {
151
+ method: 'PATCH',
152
+ jar: args.jar,
153
+ headers: {
154
+ 'X-CSRF-Token': args.token
155
+ },
156
+ json: {
157
+ isFree: false,
158
+ priceInRobux: args.sellForRobux || price,
159
+ priceOffset: 0,
160
+ quantityLimitPerUser: 0,
161
+ resaleRestriction: 2,
162
+ saleLocationConfiguration: {
163
+ places: [],
164
+ saleLocationType: 1
165
+ },
166
+ saleStatus: args.sellForRobux > 0 ? 0 : 1
167
+ },
168
+ resolveWithFullResponse: true
169
+ }
170
+ }).then((response) => {
171
+ if (!response.ok) throw new RobloxAPIError(response)
172
+
173
+ return {
174
+ name: args.name,
175
+ assetId: args.id,
176
+ description: args.description,
177
+ price: args.sellForRobux,
178
+ isCopyingAllowed: null
179
+ }
180
+ })
181
+ })
182
+ } else if (json.errors[0].code === 40) { // "Use collecibles publishing endpoint." - Publishing fee has not been paid for this asset
183
+ throw new Error(`The publishing fee for asset ${args.id} has not been paid, you must pay the fee before setting or updating the price.`)
184
+ }
185
+ throw new RobloxAPIError(res)
186
+ }
187
+ })
188
+ }
189
+
190
+ function runWithToken (args) {
191
+ const jar = args.jar
192
+ return getGeneralToken({
193
+ jar
194
+ })
195
+ .then(function (token) {
196
+ if (typeof (args.sellForRobux) === 'number') {
197
+ if (args.sellForRobux < 2 && args.sellForRobux !== 0) {
198
+ throw new Error('Assets cannot be sold for less than 2R.')
199
+ }
200
+ args.token = token
201
+ return configureRobux(args)
202
+ } else {
203
+ return configure(args.jar, token, args.id, args.name, args.description, args.enableComments, args.sellForRobux, args.genreSelection)
204
+ }
205
+ })
206
+ }
207
+
208
+ exports.func = function (args) {
209
+ return runWithToken(args)
210
+ }
@@ -0,0 +1,52 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const getGeneralToken = require('../util/getGeneralToken.js').func
4
+ const RobloxAPIError = require('../util/apiError.js')
5
+
6
+ // Args
7
+ exports.required = ['universeId', 'settings']
8
+ exports.optional = ['jar']
9
+
10
+ // Docs
11
+ /**
12
+ * 🔐 Modifies a universe's settings
13
+ * @category Develop
14
+ * @alias updateUniverse
15
+ * @param {number} universeId - The universeId of the experience
16
+ * @param {UniverseSettings} settings - The settings to update
17
+ * @returns {Promise<UpdateUniverseResponse>}
18
+ * @example const noblox = require("noblox.js")
19
+ * // Login using your cookie
20
+ * noblox.updateUniverse(2421261122, { name: "The best game ever!" })
21
+ **/
22
+
23
+ // Define
24
+ function updateUniverse (universeId, settings, jar, token) {
25
+ return new Promise((resolve, reject) => {
26
+ return http({
27
+ url: `//develop.roblox.com/v1/universes/${universeId}/configuration`,
28
+ options: {
29
+ method: 'PATCH',
30
+ jar,
31
+ headers: {
32
+ 'X-CSRF-TOKEN': token
33
+ },
34
+ json: settings,
35
+ resolveWithFullResponse: true
36
+ }
37
+ }).then((res) => {
38
+ if (res.statusCode === 200) {
39
+ resolve(res.body)
40
+ } else {
41
+ reject(new RobloxAPIError(res))
42
+ }
43
+ }).catch(reject)
44
+ })
45
+ }
46
+
47
+ exports.func = function ({ universeId, settings, jar }) {
48
+ return getGeneralToken({ jar })
49
+ .then((token) => {
50
+ return updateUniverse(universeId, settings, jar, token)
51
+ })
52
+ }
@@ -0,0 +1,54 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const getGeneralToken = require('../util/getGeneralToken.js').func
4
+ const RobloxAPIError = require('../util/apiError.js')
5
+
6
+ // Args
7
+ exports.required = ['universeId', 'isPublic']
8
+ exports.optional = ['jar']
9
+
10
+ // Docs
11
+ /**
12
+ * 🔐 Modifies a universe's public access setting
13
+ * @category Develop
14
+ * @alias updateUniverseAccess
15
+ * @param {number} universeId - The universeId of the experience
16
+ * @param {boolean=} isPublic - The visibility and access of the universe; shuts down all running instances if set to false
17
+ * @returns {Promise<void>}
18
+ * @example const noblox = require("noblox.js")
19
+ * // Login using your cookie
20
+ * noblox.updateUniverseAccess(2421261122, true)
21
+ **/
22
+
23
+ // Define
24
+ function updateUniverseAccess (universeId, isPublic, jar, token) {
25
+ return new Promise((resolve, reject) => {
26
+ return http({
27
+ url: `//develop.roblox.com/v1/universes/${universeId}/${isPublic ? 'activate' : 'deactivate'}`,
28
+ options: {
29
+ method: 'POST',
30
+ jar,
31
+ headers: {
32
+ 'X-CSRF-TOKEN': token
33
+ },
34
+ json: {
35
+ universeId
36
+ },
37
+ resolveWithFullResponse: true
38
+ }
39
+ }).then((res) => {
40
+ if (res.statusCode === 200) {
41
+ resolve()
42
+ } else {
43
+ reject(new RobloxAPIError(res))
44
+ }
45
+ }).catch(error => reject(error))
46
+ })
47
+ }
48
+
49
+ exports.func = function ({ universeId, isPublic, jar }) {
50
+ return getGeneralToken({ jar })
51
+ .then((token) => {
52
+ return updateUniverseAccess(universeId, isPublic, jar, token)
53
+ })
54
+ }
@@ -0,0 +1,42 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const RobloxAPIError = require('../util/apiError.js')
4
+
5
+ // Args
6
+ exports.required = ['group']
7
+ exports.optional = ['jar']
8
+
9
+ // Docs
10
+ /**
11
+ * 🔓 Gets the amount of robux in a group.
12
+ * @category Group
13
+ * @alias getGroupFunds
14
+ * @param {number} group - The id of the group
15
+ * @returns {Promise<number>}
16
+ * @example const noblox = require("noblox.js")
17
+ * // Login using your cookie (optional if group funds are public)
18
+ * let robux = await noblox.getGroupFunds(9997719)
19
+ **/
20
+
21
+ // Define
22
+ function getGroupFunds (group, jar) {
23
+ return http({
24
+ url: `//economy.roblox.com/v1/groups/${group}/currency`,
25
+ options: {
26
+ jar,
27
+ resolveWithFullResponse: true
28
+ }
29
+ })
30
+ .then((res) => {
31
+ const { robux } = JSON.parse(res.body)
32
+ if (res.statusCode === 200) {
33
+ return robux
34
+ } else {
35
+ throw new RobloxAPIError(res)
36
+ }
37
+ })
38
+ }
39
+
40
+ exports.func = function ({ group, jar }) {
41
+ return getGroupFunds(group, jar)
42
+ }
@@ -0,0 +1,55 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const RobloxAPIError = require('../util/apiError.js')
4
+
5
+ // Args
6
+ exports.required = ['group', 'members']
7
+ exports.optional = ['jar']
8
+
9
+ // Docs
10
+ /**
11
+ * 🔐 Get if a user can be paid from group funds.
12
+ * @category Group
13
+ * @alias getGroupPayoutEligibility
14
+ * @param {number} group - The id of the group.
15
+ * @param {number[]} members - The members to check payout status for.
16
+ * @returns {Promise<PayoutAllowedList>}
17
+ * @example const noblox = require("noblox.js")
18
+ * // Log in with cookie
19
+ * const payoutStatus = await noblox.getGroupPayoutEligibility(1, [2])
20
+ **/
21
+
22
+ // Define
23
+ function getGroupPayoutEligibility (group, members, jar) {
24
+ const memberList = []
25
+
26
+ for (const member of members) {
27
+ memberList.push(`userIds=${member}`)
28
+ }
29
+
30
+ return new Promise((resolve, reject) => {
31
+ const httpOpt = {
32
+ url: `https://economy.roblox.com/v1/groups/${group}/users-payout-eligibility?${memberList.join('&')}`,
33
+ options: {
34
+ method: 'GET',
35
+ resolveWithFullResponse: true,
36
+ jar
37
+ }
38
+ }
39
+
40
+ return http(httpOpt)
41
+ .then(function (res) {
42
+ const responseData = JSON.parse(res.body)
43
+ if (res.statusCode !== 200) {
44
+ reject(new RobloxAPIError(res))
45
+ } else {
46
+ resolve(responseData)
47
+ }
48
+ })
49
+ .catch(error => reject(error))
50
+ })
51
+ }
52
+
53
+ exports.func = function (args) {
54
+ return getGroupPayoutEligibility(args.group, args.members, args.jar)
55
+ }
@@ -0,0 +1,42 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const RobloxAPIError = require('../util/apiError.js')
4
+
5
+ // Args
6
+ exports.required = ['groupId']
7
+ exports.optional = ['timeFrame', 'jar']
8
+
9
+ // Docs
10
+ /**
11
+ * 🔐 Gets recent Robux revenue summary for a group; shows pending Robux. | Requires "Spend group funds" permissions.
12
+ * @category Group
13
+ * @alias getGroupRevenueSummary
14
+ * @param {number} groupId - The group id to get Robux summary for.
15
+ * @param {("Day" | "Week" | "Month" | "Year")=} [timeFrame="Month"] - The time frame to get for.
16
+ * @returns {Promise<RevenueSummaryResponse>}
17
+ * @example const noblox = require("noblox.js")
18
+ * // Login using your cookie
19
+ * let revenueSummary = await noblox.getGroupRevenueSummary(9997719, "Year")
20
+ **/
21
+
22
+ // Define
23
+ function getGroupRevenueSummary (group, timeFrame, jar) {
24
+ return http({
25
+ url: `//economy.roblox.com/v1/groups/${group}/revenue/summary/${timeFrame}`,
26
+ options: {
27
+ jar,
28
+ resolveWithFullResponse: true
29
+ }
30
+ })
31
+ .then((res) => {
32
+ if (res.statusCode === 200) {
33
+ return JSON.parse(res.body)
34
+ } else {
35
+ throw new RobloxAPIError(res)
36
+ }
37
+ })
38
+ }
39
+
40
+ exports.func = function ({ groupId, timeFrame = 'Month', jar }) {
41
+ return getGroupRevenueSummary(groupId, timeFrame, jar)
42
+ }
@@ -0,0 +1,32 @@
1
+ const getPageResults = require('../util/getPageResults.js').func
2
+
3
+ exports.required = ['group']
4
+ exports.optional = ['transactionType', 'limit', 'sortOrder', 'jar']
5
+
6
+ // Docs
7
+ /**
8
+ * 🔐 Get a group's transactions.
9
+ * @category Group
10
+ * @alias getGroupTransactions
11
+ * @param {number} group - The id of the group.
12
+ * @param {("Sale" | "Purchase" | "AffiliateSale" | "DevEx" | "GroupPayout" | "AdImpressionPayout")} [transactionType=Sale] - The transaction type.
13
+ * @param {number} limit - The number of transactions being fetched in total.
14
+ * @param {SortOrder=} [sortOrder=Asc] - The cursor for the next page.
15
+ * @returns {Promise<TransactionItem[]>}
16
+ * @example const noblox = require("noblox.js")
17
+ * // Login using your cookie
18
+ * const transactions = await noblox.getGroupTransactions(1, "Sale")
19
+ **/
20
+
21
+ // Define
22
+ exports.func = function (args) {
23
+ return getPageResults({
24
+ jar: args.jar,
25
+ url: `//economy.roblox.com/v2/groups/${args.group}/transactions`,
26
+ query: {
27
+ transactionType: args.transactionType || 'Sale'
28
+ },
29
+ sortOrder: args.sortOrder || 'Asc',
30
+ limit: args.limit
31
+ })
32
+ }
@@ -0,0 +1,48 @@
1
+ // Includes
2
+ const http = require('../util/http').func
3
+ const RobloxAPIError = require('../util/apiError')
4
+
5
+ // Args
6
+ exports.required = ['assetId']
7
+ exports.optional = ['jar']
8
+
9
+ // Docs
10
+ /**
11
+ * ✅ Get the recent sale history (price and volume per day for 180 days) of a limited asset.
12
+ * @category Assets
13
+ * @alias getResaleData
14
+ * @param {number} assetId - The id of the asset.
15
+ * @returns {Promise<ResaleDataResponse>}
16
+ * @example const noblox = require("noblox.js")
17
+ * const resaleData = await noblox.getResaleData(20573078)
18
+ **/
19
+
20
+ // Define
21
+ const getResaleData = async (assetId) => {
22
+ return http({
23
+ url: `//economy.roblox.com/v1/assets/${assetId}/resale-data`,
24
+ options: {
25
+ resolveWithFullResponse: true
26
+ }
27
+ }).then((res) => {
28
+ if (res.statusCode === 200) {
29
+ const resaleData = JSON.parse(res.body)
30
+ for (const priceDataPoint of resaleData.priceDataPoints) {
31
+ priceDataPoint.date = new Date(priceDataPoint.date)
32
+ }
33
+ for (const volumeDataPoint of resaleData.volumeDataPoints) {
34
+ volumeDataPoint.date = new Date(volumeDataPoint.date)
35
+ }
36
+ return resaleData
37
+ } else {
38
+ throw new RobloxAPIError(res)
39
+ }
40
+ })
41
+ }
42
+
43
+ exports.func = function ({ assetId }) {
44
+ if (isNaN(assetId)) {
45
+ throw new Error('The provided assetId is not a number.')
46
+ }
47
+ return getResaleData(assetId)
48
+ }
@@ -0,0 +1,35 @@
1
+ // Includes
2
+ const getPageResults = require('../util/getPageResults.js').func
3
+
4
+ // Args
5
+ exports.required = ['assetId']
6
+ exports.optional = ['limit', 'jar']
7
+
8
+ // Docs
9
+ /**
10
+ * 🔐 Gets available resale copies of a limited asset.
11
+ * @category Assets
12
+ * @alias getResellers
13
+ * @param {number} assetId - The id of the asset.
14
+ * @param {Limit=} limit - The max number of resellers to return.
15
+ * @returns {Promise<ResellerData[]>}
16
+ * @example const noblox = require("noblox.js")
17
+ * // Login using your cookie
18
+ * const resellers = await noblox.getResellers(20573078)
19
+ **/
20
+
21
+ // Define
22
+ const getResellers = async (assetId, limit, jar) => {
23
+ return getPageResults({
24
+ url: `//economy.roblox.com/v1/assets/${assetId}/resellers`,
25
+ limit,
26
+ jar
27
+ })
28
+ }
29
+
30
+ exports.func = function ({ assetId, limit, jar }) {
31
+ if (isNaN(assetId)) {
32
+ throw new Error('The provided assetId ID is not a number.')
33
+ }
34
+ return getResellers(assetId, limit, jar)
35
+ }
@@ -0,0 +1,43 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const RobloxAPIError = require('../util/apiError.js')
4
+
5
+ // Args
6
+ exports.required = ['userId']
7
+ exports.optional = ['jar']
8
+
9
+ // Docs
10
+ /**
11
+ * 🔓 Gets the amount of robux for the authenticated user.
12
+ * @category User
13
+ * @param {number} userId - Must match the userId of the authenticated user
14
+ * @alias getUserFunds
15
+ * @returns {Promise<number>}
16
+ * @example const noblox = require("noblox.js")
17
+ * // Login using your cookie
18
+ * const currentUser = await noblox.setCookie(process.env.ROBLOXCOOKIE)
19
+ * const robux = await noblox.getUserFunds(currentUser.id)
20
+ */
21
+
22
+ // Define
23
+ function getUserFunds (userId, jar) {
24
+ return http({
25
+ url: `//economy.roblox.com/v1/users/${userId}/currency`,
26
+ options: {
27
+ jar,
28
+ resolveWithFullResponse: true
29
+ }
30
+ })
31
+ .then((res) => {
32
+ const { robux } = JSON.parse(res.body)
33
+ if (res.statusCode === 200) {
34
+ return robux
35
+ } else {
36
+ throw new RobloxAPIError(res)
37
+ }
38
+ })
39
+ }
40
+
41
+ exports.func = function ({ userId, jar }) {
42
+ return getUserFunds(userId, jar)
43
+ }
@@ -0,0 +1,34 @@
1
+ const getPageResults = require('../util/getPageResults.js').func
2
+ const getCurrentUser = require('../util/getCurrentUser.js').func
3
+
4
+ exports.required = []
5
+ exports.optional = ['transactionType', 'limit', 'sortOrder', 'jar']
6
+
7
+ // Docs
8
+ /**
9
+ * 🔐 Get a user's transactions.
10
+ * @category User
11
+ * @alias getUserTransactions
12
+ * @param {("Sale" | "Purchase" | "AffiliateSale" | "DevEx" | "GroupPayout" | "AdImpressionPayout")} [transactionType=Sale] - The type of transactions being fetched.
13
+ * @param {number} limit - The number of transactions being fetched in total.
14
+ * @param {SortOrder=} [sortOrder=Asc] - The cursor for the next page.
15
+ * @returns {Promise<TransactionItem[]>}
16
+ * @example const noblox = require("noblox.js")
17
+ * // Login using your cookie
18
+ * let transactions = await noblox.getUserTransactions("Sale", 10)
19
+ **/
20
+
21
+ exports.func = async function (args) {
22
+ const jar = args.jar
23
+ const currentUser = await getCurrentUser({ jar })
24
+ // return getTransactions(currentUser.UserID, transactionType, limit, cursor)
25
+ return getPageResults({
26
+ jar: args.jar,
27
+ url: `//economy.roblox.com/v2/users/${currentUser.UserID}/transactions`,
28
+ query: {
29
+ transactionType: args.transactionType || 'Sale'
30
+ },
31
+ sortOrder: args.sortOrder || 'Asc',
32
+ limit: args.limit
33
+ })
34
+ }