noblox.ts 4.10.5

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of noblox.ts might be problematic. Click here for more details.

Files changed (259) hide show
  1. package/.eslintrc.js +21 -0
  2. package/.github/FUNDING.yml +3 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  5. package/.github/workflows/doc-publish.yml +33 -0
  6. package/.github/workflows/npmpublish.yml +70 -0
  7. package/.travis.yml +13 -0
  8. package/CODE_OF_CONDUCT.md +76 -0
  9. package/LICENSE +21 -0
  10. package/README.md +168 -0
  11. package/examples/cleanPlayers.js +130 -0
  12. package/examples/cleanWall.js +110 -0
  13. package/examples/revertRanks.js +100 -0
  14. package/examples/savePlayers.js +119 -0
  15. package/examples/saveWall.js +96 -0
  16. package/img/moderatedThumbnails/moderatedThumbnail_100x100.png +0 -0
  17. package/img/moderatedThumbnails/moderatedThumbnail_110x110.png +0 -0
  18. package/img/moderatedThumbnails/moderatedThumbnail_140x140.png +0 -0
  19. package/img/moderatedThumbnails/moderatedThumbnail_150x150.png +0 -0
  20. package/img/moderatedThumbnails/moderatedThumbnail_150x200.png +0 -0
  21. package/img/moderatedThumbnails/moderatedThumbnail_180x180.png +0 -0
  22. package/img/moderatedThumbnails/moderatedThumbnail_250x250.png +0 -0
  23. package/img/moderatedThumbnails/moderatedThumbnail_30x30.png +0 -0
  24. package/img/moderatedThumbnails/moderatedThumbnail_352x352.png +0 -0
  25. package/img/moderatedThumbnails/moderatedThumbnail_420x420.png +0 -0
  26. package/img/moderatedThumbnails/moderatedThumbnail_48x48.png +0 -0
  27. package/img/moderatedThumbnails/moderatedThumbnail_50x50.png +0 -0
  28. package/img/moderatedThumbnails/moderatedThumbnail_60x60.png +0 -0
  29. package/img/moderatedThumbnails/moderatedThumbnail_720x720.png +0 -0
  30. package/img/moderatedThumbnails/moderatedThumbnail_75x75.png +0 -0
  31. package/img/noblox-js-small.png +0 -0
  32. package/img/noblox-js.png +0 -0
  33. package/img/thumbnailSizes.png +0 -0
  34. package/jsDocsConfig.json +55 -0
  35. package/lib/accountinformation/getUserSocialLinks.js +42 -0
  36. package/lib/accountsettings/block.js +58 -0
  37. package/lib/accountsettings/unblock.js +58 -0
  38. package/lib/asset/deleteFromInventory.js +69 -0
  39. package/lib/asset/getGamePassProductInfo.js +51 -0
  40. package/lib/asset/getProductInfo.js +56 -0
  41. package/lib/asset/uploadAnimation.js +103 -0
  42. package/lib/asset/uploadItem.js +83 -0
  43. package/lib/asset/uploadModel.js +90 -0
  44. package/lib/avatar/avatarRules.js +38 -0
  45. package/lib/avatar/currentlyWearing.js +32 -0
  46. package/lib/avatar/getAvatar.js +35 -0
  47. package/lib/avatar/getCurrentAvatar.js +37 -0
  48. package/lib/avatar/getRecentItems.js +37 -0
  49. package/lib/avatar/outfitDetails.js +32 -0
  50. package/lib/avatar/outfits.js +37 -0
  51. package/lib/avatar/redrawAvatar.js +48 -0
  52. package/lib/avatar/removeAssetId.js +55 -0
  53. package/lib/avatar/setAvatarBodyColors.js +60 -0
  54. package/lib/avatar/setAvatarScales.js +60 -0
  55. package/lib/avatar/setPlayerAvatarType.js +50 -0
  56. package/lib/avatar/setWearingAssets.js +50 -0
  57. package/lib/avatar/wearAssetId.js +55 -0
  58. package/lib/badges/getAwardedTimestamps.js +52 -0
  59. package/lib/badges/getBadgeInfo.js +43 -0
  60. package/lib/badges/getGameBadges.js +62 -0
  61. package/lib/badges/getPlayerBadges.js +28 -0
  62. package/lib/badges/updateBadgeInfo.js +80 -0
  63. package/lib/cache/add.js +14 -0
  64. package/lib/cache/addIf.js +26 -0
  65. package/lib/cache/clear.js +8 -0
  66. package/lib/cache/get.js +28 -0
  67. package/lib/cache/index.js +17 -0
  68. package/lib/cache/new.js +12 -0
  69. package/lib/cache/wrap.js +25 -0
  70. package/lib/chat/addUsersToConversation.js +61 -0
  71. package/lib/chat/chatSettings.js +33 -0
  72. package/lib/chat/getChatMessages.js +40 -0
  73. package/lib/chat/getConversations.js +43 -0
  74. package/lib/chat/getRolloutSettings.js +35 -0
  75. package/lib/chat/getUnreadConversationCount.js +33 -0
  76. package/lib/chat/getUnreadMessages.js +38 -0
  77. package/lib/chat/getUserConversations.js +37 -0
  78. package/lib/chat/markChatAsRead.js +52 -0
  79. package/lib/chat/markChatAsSeen.js +50 -0
  80. package/lib/chat/multiGetLatestMessages.js +37 -0
  81. package/lib/chat/onNewConversation.js +50 -0
  82. package/lib/chat/onNewMessage.js +53 -0
  83. package/lib/chat/onNewMessageBySelf.js +50 -0
  84. package/lib/chat/onUserOnline.js +50 -0
  85. package/lib/chat/onUserTyping.js +54 -0
  86. package/lib/chat/removeFromGroupConversation.js +62 -0
  87. package/lib/chat/renameGroupConversation.js +57 -0
  88. package/lib/chat/sendChatMessage.js +57 -0
  89. package/lib/chat/setChatUserTyping.js +61 -0
  90. package/lib/chat/start121Conversation.js +50 -0
  91. package/lib/chat/startCloudEditConversation.js +50 -0
  92. package/lib/chat/startGroupConversation.js +62 -0
  93. package/lib/client/onNotification.js +70 -0
  94. package/lib/client/setAPIKey.js +18 -0
  95. package/lib/client/setCookie.js +38 -0
  96. package/lib/datastores/deleteDatastoreEntry.js +66 -0
  97. package/lib/datastores/getDatastoreEntry.js +98 -0
  98. package/lib/datastores/getDatastoreEntryVersions.js +83 -0
  99. package/lib/datastores/getDatastoreKeys.js +73 -0
  100. package/lib/datastores/getDatastores.js +72 -0
  101. package/lib/datastores/incrementDatastoreEntry.js +93 -0
  102. package/lib/datastores/setDatastoreEntry.js +90 -0
  103. package/lib/develop/canManage.js +44 -0
  104. package/lib/develop/configureItem.js +142 -0
  105. package/lib/develop/updateUniverse.js +53 -0
  106. package/lib/develop/updateUniverseAccess.js +55 -0
  107. package/lib/economy/buy.js +99 -0
  108. package/lib/economy/getGroupFunds.js +43 -0
  109. package/lib/economy/getGroupRevenueSummary.js +48 -0
  110. package/lib/economy/getGroupTransactions.js +32 -0
  111. package/lib/economy/getResaleData.js +54 -0
  112. package/lib/economy/getResellers.js +35 -0
  113. package/lib/economy/getUserTransactions.js +34 -0
  114. package/lib/economy/onGroupTransaction.js +74 -0
  115. package/lib/friends/acceptFriendRequest.js +59 -0
  116. package/lib/friends/declineAllFriendRequests.js +57 -0
  117. package/lib/friends/declineFriendRequest.js +59 -0
  118. package/lib/friends/getFollowers.js +61 -0
  119. package/lib/friends/getFollowings.js +61 -0
  120. package/lib/friends/getFriendRequests.js +56 -0
  121. package/lib/friends/getFriends.js +53 -0
  122. package/lib/friends/onFriendRequest.js +58 -0
  123. package/lib/friends/removeFriend.js +58 -0
  124. package/lib/friends/sendFriendRequest.js +59 -0
  125. package/lib/friends/unfollow.js +58 -0
  126. package/lib/games/addDeveloperProduct.js +65 -0
  127. package/lib/games/checkDeveloperProductName.js +39 -0
  128. package/lib/games/configureGamePass.js +146 -0
  129. package/lib/games/getDeveloperProducts.js +51 -0
  130. package/lib/games/getGameInstances.js +31 -0
  131. package/lib/games/getGamePasses.js +39 -0
  132. package/lib/games/getGameRevenue.js +49 -0
  133. package/lib/games/getGameSocialLinks.js +45 -0
  134. package/lib/games/getGroupGames.js +30 -0
  135. package/lib/games/getPlaceInfo.js +48 -0
  136. package/lib/games/getUniverseInfo.js +51 -0
  137. package/lib/games/updateDeveloperProduct.js +69 -0
  138. package/lib/groups/changeRank.js +59 -0
  139. package/lib/groups/deleteWallPost.js +64 -0
  140. package/lib/groups/deleteWallPostsByUser.js +59 -0
  141. package/lib/groups/demote.js +25 -0
  142. package/lib/groups/exile.js +59 -0
  143. package/lib/groups/getAuditLog.js +67 -0
  144. package/lib/groups/getGroup.js +57 -0
  145. package/lib/groups/getGroupSocialLinks.js +44 -0
  146. package/lib/groups/getGroups.js +88 -0
  147. package/lib/groups/getJoinRequest.js +52 -0
  148. package/lib/groups/getJoinRequests.js +58 -0
  149. package/lib/groups/getPlayers.js +108 -0
  150. package/lib/groups/getRankInGroup.js +52 -0
  151. package/lib/groups/getRankNameInGroup.js +52 -0
  152. package/lib/groups/getRole.js +64 -0
  153. package/lib/groups/getRolePermissions.js +51 -0
  154. package/lib/groups/getRoles.js +56 -0
  155. package/lib/groups/getShout.js +49 -0
  156. package/lib/groups/getWall.js +59 -0
  157. package/lib/groups/groupPayout.js +103 -0
  158. package/lib/groups/handleJoinRequest.js +60 -0
  159. package/lib/groups/leaveGroup.js +60 -0
  160. package/lib/groups/onAuditLog.js +62 -0
  161. package/lib/groups/onJoinRequest.js +63 -0
  162. package/lib/groups/onJoinRequestHandle.js +105 -0
  163. package/lib/groups/onShout.js +57 -0
  164. package/lib/groups/onWallPost.js +58 -0
  165. package/lib/groups/promote.js +25 -0
  166. package/lib/groups/searchGroups.js +32 -0
  167. package/lib/groups/setGroupDescription.js +65 -0
  168. package/lib/groups/setGroupName.js +66 -0
  169. package/lib/groups/setRank.js +79 -0
  170. package/lib/groups/shout.js +65 -0
  171. package/lib/index.js +30 -0
  172. package/lib/internal/levelOneCopy.js +16 -0
  173. package/lib/internal/queue.js +61 -0
  174. package/lib/internal/timeout.js +30 -0
  175. package/lib/internal/wrap.js +78 -0
  176. package/lib/inventory/getCollectibles.js +31 -0
  177. package/lib/inventory/getInventory.js +32 -0
  178. package/lib/inventory/getInventoryById.js +31 -0
  179. package/lib/inventory/getOwnership.js +54 -0
  180. package/lib/inventory/getUAIDs.js +47 -0
  181. package/lib/itemconfiguration/getGroupAssets.js +32 -0
  182. package/lib/options.js +26 -0
  183. package/lib/party/onPartyDeleted.js +53 -0
  184. package/lib/party/onPartyInvite.js +53 -0
  185. package/lib/party/onPartyJoinedGame.js +53 -0
  186. package/lib/party/onPartyLeftGame.js +53 -0
  187. package/lib/party/onPartySelfJoined.js +53 -0
  188. package/lib/party/onPartySelfLeft.js +53 -0
  189. package/lib/party/onPartyUserJoined.js +53 -0
  190. package/lib/party/onPartyUserLeft.js +53 -0
  191. package/lib/premiumfeatures/getPremium.js +51 -0
  192. package/lib/presence/getPresences.js +63 -0
  193. package/lib/privatemessages/getMessages.js +60 -0
  194. package/lib/privatemessages/message.js +80 -0
  195. package/lib/privatemessages/onMessage.js +88 -0
  196. package/lib/thumbnails/getLogo.js +60 -0
  197. package/lib/thumbnails/getPlayerThumbnail.js +121 -0
  198. package/lib/thumbnails/getThumbnails.js +93 -0
  199. package/lib/trades/acceptTrade.js +58 -0
  200. package/lib/trades/canTradeWith.js +48 -0
  201. package/lib/trades/counterTrade.js +84 -0
  202. package/lib/trades/declineTrade.js +58 -0
  203. package/lib/trades/getTradeInfo.js +52 -0
  204. package/lib/trades/getTrades.js +37 -0
  205. package/lib/trades/sendTrade.js +82 -0
  206. package/lib/users/getBlurb.js +36 -0
  207. package/lib/users/getIdFromUsername.js +53 -0
  208. package/lib/users/getPlayerInfo.js +100 -0
  209. package/lib/users/getUsernameFromId.js +44 -0
  210. package/lib/users/onBlurbChange.js +46 -0
  211. package/lib/util/clearSession.js +32 -0
  212. package/lib/util/generalRequest.js +61 -0
  213. package/lib/util/getAction.js +45 -0
  214. package/lib/util/getCurrentUser.js +44 -0
  215. package/lib/util/getGeneralToken.js +52 -0
  216. package/lib/util/getHash.js +29 -0
  217. package/lib/util/getInputs.js +37 -0
  218. package/lib/util/getPageResults.js +89 -0
  219. package/lib/util/getSenderUserId.js +30 -0
  220. package/lib/util/getSession.js +38 -0
  221. package/lib/util/getVerification.js +60 -0
  222. package/lib/util/getVerificationInputs.js +31 -0
  223. package/lib/util/http.js +110 -0
  224. package/lib/util/jar.js +24 -0
  225. package/lib/util/refreshCookie.js +52 -0
  226. package/lib/util/relog.js +81 -0
  227. package/lib/util/setOptions.js +54 -0
  228. package/lib/util/shortPoll.js +102 -0
  229. package/lib/util/threaded.js +80 -0
  230. package/package.json +94 -0
  231. package/postinstall.js +1 -0
  232. package/settings.json +107 -0
  233. package/test/accountinformation.test.js +27 -0
  234. package/test/accountsettings.test.js +27 -0
  235. package/test/asset.test.js +81 -0
  236. package/test/assets/Great-White-Shark-Fin.rbxm +0 -0
  237. package/test/assets/KeyframeSequence.rbxm +0 -0
  238. package/test/avatar.test.js +164 -0
  239. package/test/badges.test.js +96 -0
  240. package/test/chat.test.js +104 -0
  241. package/test/datastore.test.js +105 -0
  242. package/test/develop.test.js +53 -0
  243. package/test/economy.test.js +137 -0
  244. package/test/friends.test.js +128 -0
  245. package/test/games.test.js +212 -0
  246. package/test/groups.test.js +311 -0
  247. package/test/inventory.test.js +98 -0
  248. package/test/itemconfiguration.test.js +24 -0
  249. package/test/premiumfeatures.test.js +17 -0
  250. package/test/presence.test.js +25 -0
  251. package/test/privatemessages.test.js +33 -0
  252. package/test/thumbnails.test.js +53 -0
  253. package/test/users.test.js +68 -0
  254. package/tutorials/Authentication.md +75 -0
  255. package/tutorials/Event Emitters.md +26 -0
  256. package/tutorials/Promises.md +86 -0
  257. package/tutorials/VPS Authentication.md +72 -0
  258. package/typings/index.d.ts +2525 -0
  259. package/typings/jsDocs.ts +1927 -0
@@ -0,0 +1,142 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const getGeneralToken = require('../util/getGeneralToken.js').func
4
+
5
+ // Args
6
+ exports.required = ['id', 'name', 'description']
7
+ exports.optional = ['enableComments', 'sellForRobux', 'genreSelection', 'jar']
8
+
9
+ // Docs
10
+ /**
11
+ * 🔐 Configure an asset.
12
+ * @category Develop
13
+ * @alias configureItem
14
+ * @param {number} assetId - The id of the asset.
15
+ * @param {string} name - The new name of the asset.
16
+ * @param {string} description - The new description of the asset.
17
+ * @param {boolean=} enableComments - Enable comments on your asset.
18
+ * @param {number|boolean=} [sellForRobux=false] - The amount of robux to sell for; use a number for sellable assets, boolean for copyable assets
19
+ * @param {string=} [genreSelection="All"] - The genre of your asset.
20
+ * @returns {Promise<ConfigureItemResponse>}
21
+ * @example const noblox = require("noblox.js")
22
+ * // Login using your cookie
23
+ * noblox.configureItem(1117747196, "Item", "A cool item.", false, 100)
24
+ **/
25
+
26
+ // Define
27
+ function configure (jar, token, id, name, description, enableComments, sellForRobux, genreSelection, sellingPrice) {
28
+ return http({
29
+ url: '//develop.roblox.com/v1/assets/' + id,
30
+ options: {
31
+ method: 'PATCH',
32
+ jar: jar,
33
+ headers: {
34
+ 'X-CSRF-TOKEN': token
35
+ },
36
+ json: {
37
+ name: name,
38
+ description: description,
39
+ enableComments: enableComments,
40
+ genres: genreSelection || ['All'],
41
+ isCopyingAllowed: typeof (sellForRobux) === 'boolean' ? sellForRobux : null
42
+ }
43
+ }
44
+ }).then(function (json) {
45
+ if (!json.errors) {
46
+ const response = {
47
+ name,
48
+ description,
49
+ assetId: id
50
+ }
51
+ if (typeof sellForRobux === 'boolean') {
52
+ response.isCopyingAllowed = sellForRobux
53
+ } else {
54
+ response.price = sellingPrice || 0
55
+ }
56
+ return response
57
+ } else {
58
+ if (json.errors[0].code === 13) { // "Only a marketplace asset can be updated with IsCopyingAllowed."
59
+ throw new Error('Attempting to make a sellable asset copyable; it must be sold for robux. (Use a number for sellForRobux.)')
60
+ }
61
+ throw new Error(json.errors[0].message)
62
+ }
63
+ })
64
+ }
65
+
66
+ function configureRobux (args) {
67
+ return http({
68
+ url: '//itemconfiguration.roblox.com/v1/assets/' + args.id + '/release',
69
+ options: {
70
+ method: 'POST',
71
+ jar: args.jar,
72
+ headers: {
73
+ 'X-CSRF-TOKEN': args.token
74
+ },
75
+ json: {
76
+ saleStatus: args.sellForRobux ? 'OnSale' : 'OffSale',
77
+ priceConfiguration: {
78
+ priceInRobux: args.sellForRobux || 0
79
+ }
80
+ }
81
+ }
82
+ })
83
+ .then(function (json) {
84
+ if (!json.errors) {
85
+ return configure(args.jar, args.token, args.id, args.name, args.description, args.enableComments, args.sellForRobux, args.genreSelection, args.sellForRobux)
86
+ } else {
87
+ // Code 6: "Asset is released"; caused when changing the price of an on-sale asset from non-zero to non-zero
88
+ if (json.errors[0].code === 6) {
89
+ return http({
90
+ url: '//itemconfiguration.roblox.com/v1/assets/' + args.id + '/update-price',
91
+ options: {
92
+ method: 'POST',
93
+ jar: args.jar,
94
+ headers: {
95
+ 'X-CSRF-TOKEN': args.token
96
+ },
97
+ json: {
98
+ priceConfiguration: {
99
+ priceInRobux: args.sellForRobux
100
+ }
101
+ }
102
+ }
103
+ }).then((err) => {
104
+ if (!err.errors) {
105
+ return configure(args.jar, args.token, args.id, args.name, args.description, args.enableComments, args.sellForRobux, args.genreSelection, args.sellForRobux)
106
+ } else {
107
+ throw new Error(json.errors[0].message)
108
+ }
109
+ })
110
+ } else if (json.errors[0].code === 3) { // "Cannot release the associated asset type" - caused by copyable asset using sellForRobux: 2 or greater
111
+ // Throw an error as the developer may have intended to sell the asset for robux instead of making it free.
112
+ throw new Error('Attempting to sell a copyable asset for robux; it can only be made free. (Use true for sellForRobux.)')
113
+ } else if (json.errors[0].code === 20) { // "Cannot set the associated asset type to remove-from-release" - caused by copyable asset using sellForRobux: 0
114
+ // Continue and ignore the error as the intended outcome makes the asset private; set sellForRobux from 0 to false
115
+ return configure(args.jar, args.token, args.id, args.name, args.description, args.enableComments, args.sellForRobux, args.genreSelection, !!args.sellForRobux)
116
+ }
117
+ throw new Error(`An unknown error occurred: [${json.errors[0].code}] ${json.errors[0].message}`)
118
+ }
119
+ })
120
+ }
121
+
122
+ function runWithToken (args) {
123
+ const jar = args.jar
124
+ return getGeneralToken({
125
+ jar: jar
126
+ })
127
+ .then(function (token) {
128
+ if (typeof (args.sellForRobux) === 'number') {
129
+ if (args.sellForRobux < 2 && args.sellForRobux !== 0) {
130
+ throw new Error('Assets cannot be sold for less than 2R.')
131
+ }
132
+ args.token = token
133
+ return configureRobux(args)
134
+ } else {
135
+ return configure(args.jar, token, args.id, args.name, args.description, args.enableComments, args.sellForRobux, args.genreSelection)
136
+ }
137
+ })
138
+ }
139
+
140
+ exports.func = function (args) {
141
+ return runWithToken(args)
142
+ }
@@ -0,0 +1,53 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const getGeneralToken = require('../util/getGeneralToken.js').func
4
+
5
+ // Args
6
+ exports.required = ['universeId', 'settings']
7
+ exports.optional = ['jar']
8
+
9
+ // Docs
10
+ /**
11
+ * 🔐 Modifies a universe's settings
12
+ * @category Develop
13
+ * @alias updateUniverse
14
+ * @param {number} universeId - The universeId of the experience
15
+ * @param {UniverseSettings} settings - The settings to update
16
+ * @returns {Promise<UpdateUniverseResponse>}
17
+ * @example const noblox = require("noblox.js")
18
+ * // Login using your cookie
19
+ * noblox.updateUniverse(2421261122, { name: "The best game ever!" })
20
+ **/
21
+
22
+ // Define
23
+ function updateUniverse (universeId, settings, jar, token) {
24
+ return new Promise((resolve, reject) => {
25
+ return http({
26
+ url: `//develop.roblox.com/v1/universes/${universeId}/configuration`,
27
+ options: {
28
+ method: 'PATCH',
29
+ jar,
30
+ headers: {
31
+ 'X-CSRF-TOKEN': token
32
+ },
33
+ json: settings,
34
+ resolveWithFullResponse: true
35
+ }
36
+ }).then(({ statusCode, body }) => {
37
+ if (statusCode === 200) {
38
+ resolve(body)
39
+ } else if (body && body.errors) {
40
+ reject(new Error(`[${statusCode}] ${body.errors[0].message} | universeId: ${universeId}, settings: ${JSON.stringify(settings)} ${body.errors.field ? ` | ${body.errors.field} is incorrect` : ''}`))
41
+ } else {
42
+ reject(new Error(`An unknown error occurred with updateUniverse() | [${statusCode}] universeId: ${universeId}, settings: ${JSON.stringify(settings)}`))
43
+ }
44
+ }).catch(reject)
45
+ })
46
+ }
47
+
48
+ exports.func = function ({ universeId, settings, jar }) {
49
+ return getGeneralToken({ jar })
50
+ .then((token) => {
51
+ return updateUniverse(universeId, settings, jar, token)
52
+ })
53
+ }
@@ -0,0 +1,55 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const getGeneralToken = require('../util/getGeneralToken.js').func
4
+
5
+ // Args
6
+ exports.required = ['universeId', 'isPublic']
7
+ exports.optional = ['jar']
8
+
9
+ // Docs
10
+ /**
11
+ * 🔐 Modifies a universe's public access setting
12
+ * @category Develop
13
+ * @alias updateUniverseAccess
14
+ * @param {number} universeId - The universeId of the experience
15
+ * @param {boolean=} isPublic - The visibility and access of the universe; shuts down all running instances if set to false
16
+ * @returns {Promise<void>}
17
+ * @example const noblox = require("noblox.js")
18
+ * // Login using your cookie
19
+ * noblox.updateUniverseAccess(2421261122, true)
20
+ **/
21
+
22
+ // Define
23
+ function updateUniverseAccess (universeId, isPublic, jar, token) {
24
+ return new Promise((resolve, reject) => {
25
+ return http({
26
+ url: `//develop.roblox.com/v1/universes/${universeId}/${isPublic ? 'activate' : 'deactivate'}`,
27
+ options: {
28
+ method: 'POST',
29
+ jar,
30
+ headers: {
31
+ 'X-CSRF-TOKEN': token
32
+ },
33
+ json: {
34
+ universeId
35
+ },
36
+ resolveWithFullResponse: true
37
+ }
38
+ }).then(({ statusCode, body }) => {
39
+ if (statusCode === 200) {
40
+ resolve()
41
+ } else if (body && body.errors) {
42
+ reject(new Error(`[${statusCode}] ${body.errors[0].message} | universeId: ${universeId}, isPublic: ${isPublic} ${body.errors.field ? ` | ${body.errors.field} is incorrect` : ''}`))
43
+ } else {
44
+ reject(new Error(`An unknown error occurred with updateUniverseAccess() | [${statusCode}] universeId: ${universeId}, isPublic: ${isPublic}`))
45
+ }
46
+ }).catch(error => reject(error))
47
+ })
48
+ }
49
+
50
+ exports.func = function ({ universeId, isPublic, jar }) {
51
+ return getGeneralToken({ jar })
52
+ .then((token) => {
53
+ return updateUniverseAccess(universeId, isPublic, jar, token)
54
+ })
55
+ }
@@ -0,0 +1,99 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const getProductInfo = require('../asset/getProductInfo.js').func
4
+ const getGeneralToken = require('../util/getGeneralToken.js').func
5
+
6
+ // Args
7
+ exports.required = [['asset', 'product']]
8
+ exports.optional = ['price', 'jar']
9
+
10
+ // Docs
11
+ /**
12
+ * 🔐 Buy an asset from the marketplace.
13
+ * @category Assets
14
+ * @param {number} asset - The ID of the product.
15
+ * @param {number=} price - The price of the product.
16
+ * @returns {Promise<BuyAssetResponse>}
17
+ * @example const noblox = require("noblox.js")
18
+ * // Login using your cookie
19
+ * noblox.buy(1117747196)
20
+ **/
21
+
22
+ // Define
23
+ function buy (jar, token, product, price) {
24
+ const robux = product.PriceInRobux || 0
25
+ const productId = product.ProductId
26
+ if (price) {
27
+ if (typeof price === 'number') {
28
+ if (robux !== price) {
29
+ throw new Error('Price requirement not met. Requested price: ' + price + ' Actual price: ' + robux)
30
+ }
31
+ } else if (typeof price === 'object') {
32
+ const high = price.high
33
+ const low = price.low
34
+ if (high) {
35
+ if (robux > high) {
36
+ throw new Error('Price requirement not met. Requested price: <=' + high + ' Actual price: ' + robux)
37
+ }
38
+ }
39
+ if (low) {
40
+ if (robux < low) {
41
+ throw new Error('Price requirement not met. Requested price: >=' + low + ' Actual price: ' + robux)
42
+ }
43
+ }
44
+ }
45
+ }
46
+ const httpOpt = {
47
+ url: '//economy.roblox.com/v1/purchases/products/' + productId,
48
+ options: {
49
+ method: 'POST',
50
+ jar: jar,
51
+ headers: {
52
+ 'X-CSRF-TOKEN': token
53
+ },
54
+ json: {
55
+ expectedCurrency: 1,
56
+ expectedPrice: robux,
57
+ expectedSellerId: product.Creator.Id
58
+ }
59
+ }
60
+ }
61
+ return http(httpOpt)
62
+ .then(function (json) {
63
+ let err = json.errorMsg
64
+ if (json.reason === 'InsufficientFunds') {
65
+ err = 'You need ' + json.shortfallPrice + ' more robux to purchase this item.'
66
+ } else if (json.errorMsg) {
67
+ err = json.errorMsg
68
+ }
69
+ if (!err) {
70
+ return { productId, price: robux }
71
+ } else {
72
+ throw new Error(err)
73
+ }
74
+ })
75
+ }
76
+
77
+ function runWithToken (args) {
78
+ const jar = args.jar
79
+ return getGeneralToken({
80
+ jar: jar
81
+ })
82
+ .then(function (token) {
83
+ return buy(jar, token, args.product, args.price)
84
+ })
85
+ }
86
+
87
+ exports.func = function (args) {
88
+ if (!args.product) {
89
+ return getProductInfo({
90
+ asset: args.asset
91
+ })
92
+ .then(function (product) {
93
+ args.product = product
94
+ return runWithToken(args)
95
+ })
96
+ } else {
97
+ return runWithToken(args)
98
+ }
99
+ }
@@ -0,0 +1,43 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+
4
+ // Args
5
+ exports.required = ['group']
6
+ exports.optional = ['jar']
7
+
8
+ // Docs
9
+ /**
10
+ * 🔓 Gets the amount of robux in a group.
11
+ * @category Group
12
+ * @alias getGroupFunds
13
+ * @param {number} group - The id of the group
14
+ * @returns {Promise<number>}
15
+ * @example const noblox = require("noblox.js")
16
+ * // Login using your cookie (optional if group funds are public)
17
+ * let robux = await noblox.getGroupFunds(9997719)
18
+ **/
19
+
20
+ // Define
21
+ function getGroupFunds (group, jar) {
22
+ return http({
23
+ url: `//economy.roblox.com/v1/groups/${group}/currency`,
24
+ options: {
25
+ jar: jar,
26
+ resolveWithFullResponse: true
27
+ }
28
+ })
29
+ .then(({ statusCode, body }) => {
30
+ const { robux, errors } = JSON.parse(body)
31
+ if (statusCode === 200) {
32
+ return robux
33
+ } else if (statusCode === 400 || statusCode === 403) {
34
+ throw new Error(`${errors[0].message} | groupId: ${group}`)
35
+ } else {
36
+ throw new Error(`An unknown error occurred with getGroupFunds() | [${statusCode}] groupId: ${group}`)
37
+ }
38
+ })
39
+ }
40
+
41
+ exports.func = function ({ group, jar }) {
42
+ return getGroupFunds(group, jar)
43
+ }
@@ -0,0 +1,48 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+
4
+ // Args
5
+ exports.required = ['groupId']
6
+ exports.optional = ['timeFrame', 'jar']
7
+
8
+ // Docs
9
+ /**
10
+ * 🔐 Gets recent Robux revenue summary for a group; shows pending Robux. | Requires "Spend group funds" permissions.
11
+ * @category Group
12
+ * @alias getGroupRevenueSummary
13
+ * @param {number} groupId - The group id to get Robux summary for.
14
+ * @param {("Day" | "Week" | "Month" | "Year")=} [timeFrame="Month"] - The time frame to get for.
15
+ * @returns {Promise<RevenueSummaryResponse>}
16
+ * @example const noblox = require("noblox.js")
17
+ * // Login using your cookie
18
+ * let revenueSummary = await noblox.getGroupRevenueSummary(9997719, "Year")
19
+ **/
20
+
21
+ // Define
22
+ function getGroupRevenueSummary (group, timeFrame, jar) {
23
+ return http({
24
+ url: `//economy.roblox.com/v1/groups/${group}/revenue/summary/${timeFrame}`,
25
+ options: {
26
+ jar: jar,
27
+ resolveWithFullResponse: true
28
+ }
29
+ })
30
+ .then(({ statusCode, body }) => {
31
+ const { errors } = JSON.parse(body)
32
+ if (statusCode === 200) {
33
+ return JSON.parse(body)
34
+ } else if (statusCode === 400) {
35
+ throw new Error(`${errors[0].message} | group: ${group}, timeFrame: ${timeFrame}`)
36
+ } else if (statusCode === 401) {
37
+ throw new Error(`${errors[0].message} (Are you logged in?) | group: ${group}, timeFrame: ${timeFrame}`)
38
+ } else if (statusCode === 403) {
39
+ throw new Error('Insufficient permissions: "Spend group funds" role permissions required')
40
+ } else {
41
+ throw new Error(`An unknown error occurred with getGroupRevenueSummary() | [${statusCode}] group: ${group}, timeFrame: ${timeFrame}`)
42
+ }
43
+ })
44
+ }
45
+
46
+ exports.func = function ({ groupId, timeFrame = 'Month', jar }) {
47
+ return getGroupRevenueSummary(groupId, timeFrame, jar)
48
+ }
@@ -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,54 @@
1
+ // Includes
2
+ const http = require('../util/http').func
3
+
4
+ // Args
5
+ exports.required = ['assetId']
6
+ exports.optional = ['jar']
7
+
8
+ // Docs
9
+ /**
10
+ * ✅ Get the recent sale history (price and volume per day for 180 days) of a limited asset.
11
+ * @category Assets
12
+ * @alias getResaleData
13
+ * @param {number} assetId - The id of the asset.
14
+ * @returns {Promise<ResaleDataResponse>}
15
+ * @example const noblox = require("noblox.js")
16
+ * const resaleData = await noblox.getResaleData(20573078)
17
+ **/
18
+
19
+ // Define
20
+ const getResaleData = async (assetId) => {
21
+ return http({
22
+ url: `//economy.roblox.com/v1/assets/${assetId}/resale-data`,
23
+ options: {
24
+ resolveWithFullResponse: true
25
+ }
26
+ }).then(({ body, statusCode }) => {
27
+ const { errors } = JSON.parse(body)
28
+ if (statusCode === 200) {
29
+ try {
30
+ const resaleData = JSON.parse(body)
31
+ for (const priceDataPoint of resaleData.priceDataPoints) {
32
+ priceDataPoint.date = new Date(priceDataPoint.date)
33
+ }
34
+ for (const volumeDataPoint of resaleData.volumeDataPoints) {
35
+ volumeDataPoint.date = new Date(volumeDataPoint.date)
36
+ }
37
+ return resaleData
38
+ } catch (err) {
39
+ throw new Error(`An unknown error occurred with getResaleData() | [${statusCode}] assetId: ${assetId}`)
40
+ }
41
+ } else if (statusCode === 400) {
42
+ throw new Error(`${errors[0].message} | assetId: ${assetId}`)
43
+ } else {
44
+ throw new Error(`An unknown error occurred with getResaleData() | [${statusCode}] assetId: ${assetId}`)
45
+ }
46
+ })
47
+ }
48
+
49
+ exports.func = function ({ assetId }) {
50
+ if (isNaN(assetId)) {
51
+ throw new Error('The provided assetId is not a number.')
52
+ }
53
+ return getResaleData(assetId)
54
+ }
@@ -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,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: 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
+ }
@@ -0,0 +1,74 @@
1
+ // Includes
2
+ const shortPoll = require('../util/shortPoll.js').func
3
+ const getGroupTransactions = require('./getGroupTransactions.js').func
4
+
5
+ // Args
6
+ exports.required = ['groupId', 'transactionType']
7
+ exports.optional = ['jar']
8
+
9
+ // Docs
10
+ /**
11
+ * 🔐 An event for when a group transaction is made, for example a purchase. This event has a rate of one request per 60
12
+ * sec, which is more than the typical 10 seconds. This is due to the unusually low rate limit on the transactions
13
+ * endpoint.
14
+ *
15
+ * Note: The `created` field returned by this event will always have 0 milliseconds. This is due to a quirk on Roblox's side:
16
+ * These millisecond values fluctuate, meaning the event can misfire. Removing them avoids this problem.
17
+ * @category Group
18
+ * @alias onGroupTransaction
19
+ * @param {number} groupId - The id of the group.
20
+ * @param {("Sale" | "Purchase" | "AffiliateSale" | "DevEx" | "GroupPayout" | "AdImpressionPayout")} transactionType - The transaction type.
21
+ * @returns An EventEmitter that emits when a transaction is made.
22
+ * @example const noblox = require("noblox.js")
23
+ * // Login using your cookie
24
+ * const transactionEvent = noblox.onGroupTransaction(1)
25
+ * transactionEvent.on("data", function(data) {
26
+ * console.log("New Transaction!", data)
27
+ * })
28
+ * transactionEvent.on("error", function(err) {
29
+ * console.error("Something went wrong: ", err)
30
+ * // Handle error as needed
31
+ * })
32
+ **/
33
+
34
+ // Define
35
+ exports.func = function (args) {
36
+ let empty = true
37
+ return shortPoll({
38
+ getLatest: function (latest) {
39
+ return getGroupTransactions({ group: args.groupId, jar: args.jar, transactionType: args.transactionType })
40
+ .then(function (transactions) {
41
+ const given = []
42
+ // This method works much in the same way as onAuditLog. We remove some of the precision from transaction dates
43
+ // Because Roblox has a habit of being imprecise and varying the milliseconds of a given transaction/log item
44
+ // across different requests - and this causes duplicate fires.
45
+ if (transactions) {
46
+ for (const key in transactions) {
47
+ if (Object.prototype.hasOwnProperty.call(transactions, key)) {
48
+ const date = transactions[key].created
49
+ date.setMilliseconds(0)
50
+
51
+ if (date > latest) {
52
+ latest = date
53
+ given.push(transactions[key])
54
+ }
55
+ empty = false
56
+ } else if (!empty) {
57
+ const date = new Date()
58
+ date.setMilliseconds(0)
59
+
60
+ given.push({ date: date })
61
+ latest = date
62
+ empty = true
63
+ }
64
+ }
65
+ return {
66
+ latest: latest,
67
+ data: given
68
+ }
69
+ }
70
+ })
71
+ },
72
+ delay: 'onGroupTransaction'
73
+ })
74
+ }