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,82 @@
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 = []
8
+
9
+ // Docs
10
+ /**
11
+ * ✅ Get the groups of a user.
12
+ * @category User
13
+ * @alias getGroups
14
+ * @param {number} userId - The id of the user.
15
+ * @returns {Promise<IGroupPartial[]>}
16
+ * @example const noblox = require("noblox.js")
17
+ * let groups = await noblox.getGroups(123456)
18
+ **/
19
+
20
+ // Define
21
+ function getGroups (userId) {
22
+ return new Promise((resolve, reject) => {
23
+ const requests = [
24
+ constructRequest(`//groups.roblox.com/v2/users/${userId}/groups/roles`),
25
+ constructRequest(`//groups.roblox.com/v1/users/${userId}/groups/primary/role`)
26
+ ].map(promise => promise.then(
27
+ val => ({ status: 'fulfilled', value: val }),
28
+ rej => ({ status: 'rejected', reason: rej })
29
+ ))
30
+
31
+ const result = []
32
+
33
+ Promise.all(requests).then(async (promiseResponses) => {
34
+ let responses = promiseResponses.map(response => response.value)
35
+ const failedResponse = (responses[0].statusCode !== 200 || !responses[0].body) // we only check the first request because the second one errors if a primary is not set
36
+
37
+ if (failedResponse) {
38
+ reject(new RobloxAPIError(responses[0]))
39
+ }
40
+
41
+ responses = responses.map(r => r.body)
42
+
43
+ const groupRoleData = responses[0].data
44
+ if (groupRoleData) {
45
+ const primaryGroupId = responses[1] && responses[1].group && responses[1].group.id
46
+
47
+ const groupThumbails = await constructRequest(`https://thumbnails.roblox.com/v1/groups/icons?groupIds=${groupRoleData.map(data => data.group.id).join(',')}&size=150x150&format=Png&isCircular=false`)
48
+
49
+ groupRoleData.forEach(data => {
50
+ const insertion = {
51
+ Id: data.group.id,
52
+ Name: data.group.name,
53
+ MemberCount: data.group.memberCount,
54
+ IsPrimary: data.group.id === primaryGroupId,
55
+ Rank: data.role.rank,
56
+ Role: data.role.name,
57
+ RoleId: data.role.id,
58
+ EmblemUrl: groupThumbails.body.data.find(thumbnail => thumbnail.targetId === data.group.id).imageUrl
59
+ }
60
+ result.push(insertion)
61
+ })
62
+ }
63
+
64
+ resolve(result)
65
+ })
66
+ })
67
+ }
68
+
69
+ function constructRequest (url) {
70
+ return http({
71
+ url,
72
+ options: {
73
+ resolveWithFullResponse: true,
74
+ followRedirect: false,
75
+ json: true
76
+ }
77
+ })
78
+ }
79
+
80
+ exports.func = function (args) {
81
+ return getGroups(args.userId)
82
+ }
@@ -0,0 +1,47 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const RobloxAPIError = require('../util/apiError.js')
4
+
5
+ // Args
6
+ exports.required = ['group', 'userId']
7
+ exports.optional = ['jar']
8
+
9
+ // Docs
10
+ /**
11
+ * 🔐 Gets a specific join request, given a user ID.
12
+ * @category Group
13
+ * @alias getJoinRequest
14
+ * @param {number} group - The id of the group.
15
+ * @param {number} userId - The user ID whose join request is wanted.
16
+ * @returns {(Promise<GroupJoinRequest>|Promise<null>)} A join request if one exists, or null.
17
+ * @example const noblox = require("noblox.js")
18
+ * // Login using your cookie
19
+ * const request = await noblox.getJoinRequest(4591072, 5903228)
20
+ **/
21
+
22
+ // Define
23
+ function getJoinRequest (jar, group, userId) {
24
+ return new Promise((resolve, reject) => {
25
+ const httpOpt = {
26
+ url: `//groups.roblox.com/v1/groups/${group}/join-requests/users/${userId}`,
27
+ options: {
28
+ method: 'GET',
29
+ jar,
30
+ resolveWithFullResponse: true
31
+ }
32
+ }
33
+ return http(httpOpt)
34
+ .then(function (res) {
35
+ if (res.statusCode === 200) {
36
+ resolve(JSON.parse(res.body) || null)
37
+ } else {
38
+ reject(new RobloxAPIError(res))
39
+ }
40
+ }).catch(error => reject(error))
41
+ })
42
+ }
43
+
44
+ exports.func = function (args) {
45
+ const jar = args.jar
46
+ return getJoinRequest(jar, args.group, args.userId)
47
+ }
@@ -0,0 +1,53 @@
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 = ['sortOrder', 'limit', 'cursor', 'jar']
8
+
9
+ // Docs
10
+ /**
11
+ * 🔐 Get the join requests for a group.
12
+ * @category Group
13
+ * @alias getJoinRequests
14
+ * @param {number} group - The id of the group.
15
+ * @param {SortOrder=} sortOrder - The order to sort the requests by.
16
+ * @param {Limit=} limit - The maximum results per a page.
17
+ * @param {string=} cursor - The cursor for the next page.
18
+ * @returns {Promise<GroupJoinRequestsPage>}
19
+ * @example const noblox = require("noblox.js")
20
+ * // Login using your cookie
21
+ * const requests = await noblox.getJoinRequests(1, "Asc")
22
+ **/
23
+
24
+ // Define
25
+ function getJoinRequests (jar, group, sortOrder, limit, cursor) {
26
+ return new Promise((resolve, reject) => {
27
+ const httpOpt = {
28
+ url: `//groups.roblox.com/v1/groups/${group}/join-requests?limit=${limit}&sortOrder=${sortOrder}&cursor=${cursor}`,
29
+ options: {
30
+ method: 'GET',
31
+ jar,
32
+ resolveWithFullResponse: true
33
+ }
34
+ }
35
+ return http(httpOpt)
36
+ .then(function (res) {
37
+ if (res.statusCode === 200) {
38
+ resolve(JSON.parse(res.body))
39
+ } else {
40
+ reject(new RobloxAPIError(res))
41
+ }
42
+ })
43
+ .catch(error => reject(error))
44
+ })
45
+ }
46
+
47
+ exports.func = function (args) {
48
+ const jar = args.jar
49
+ const sortOrder = args.sortOrder || 'Asc'
50
+ const limit = args.limit || (10).toString()
51
+ const cursor = args.cursor || ''
52
+ return getJoinRequests(jar, args.group, sortOrder, limit, cursor)
53
+ }
@@ -0,0 +1,103 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const RobloxAPIError = require('../util/apiError.js')
4
+
5
+ // Args
6
+ exports.required = ['group', ['rolesetId']]
7
+ exports.optional = ['sortOrder', 'limit', 'cursor', 'jar']
8
+
9
+ // Docs
10
+ /**
11
+ * ✅ Get the players in a group for a specific role.
12
+ * @category Group
13
+ * @alias getPlayers
14
+ * @param {number} group - The id of the group.
15
+ * @param {number | Array<number>} rolesetId - The roleset's id.
16
+ * @param {SortOrder=} sortOrder - The order to get the players in.
17
+ * @param {Limit=} limit - The maximum result per a page.
18
+ * @param {string=} cursor - The cursor for the next page.
19
+ * @returns {Promise<GroupUser[]>}
20
+ * @example const noblox = require("noblox.js")
21
+ * const players = await noblox.getPlayers(1, 1117747196)
22
+ **/
23
+
24
+ // Define
25
+ function getPlayersInRoleOnPage (jar, group, rolesetId, sortOrder, limit, cursor) {
26
+ return new Promise((resolve, reject) => {
27
+ const httpOpt = {
28
+ url: `//groups.roblox.com/v1/groups/${group}/roles/${rolesetId}/users?cursor=${cursor}&limit=${limit}&sortOrder=${sortOrder}`,
29
+ options: {
30
+ method: 'GET',
31
+ jar,
32
+ resolveWithFullResponse: true
33
+ }
34
+ }
35
+ return http(httpOpt)
36
+ .then(function (res) {
37
+ if (res.statusCode === 200) {
38
+ resolve(JSON.parse(res.body))
39
+ } else {
40
+ reject(new RobloxAPIError(res))
41
+ }
42
+ }).catch(error => reject(error))
43
+ })
44
+ }
45
+
46
+ function getPlayersInRole (jar, group, rolesetId, sortOrder, limit, cursor, currentPlayers) {
47
+ return new Promise((resolve, reject) => {
48
+ if (!currentPlayers) currentPlayers = []
49
+
50
+ getPlayersInRoleOnPage(jar, group, rolesetId, sortOrder, 100, cursor, currentPlayers)
51
+ .then(function (pageData) {
52
+ const nextPageCursor = pageData.nextPageCursor
53
+ const dataArray = pageData.data
54
+
55
+ if (!dataArray) return reject(new Error('Error while retrieving players!'))
56
+
57
+ currentPlayers = currentPlayers.concat(dataArray)
58
+
59
+ if (limit > 0 && currentPlayers.length >= limit) {
60
+ return resolve(currentPlayers.slice(0, limit))
61
+ } else if (nextPageCursor === null) {
62
+ return resolve(currentPlayers)
63
+ }
64
+
65
+ getPlayersInRole(jar, group, rolesetId, sortOrder, limit, nextPageCursor, currentPlayers)
66
+ .then(function (newCurrentPlayers) {
67
+ return resolve(newCurrentPlayers)
68
+ })
69
+ }).catch(error => reject(error))
70
+ })
71
+ }
72
+
73
+ async function getPlayersInRoles (jar, group, rolesetIds, sortOrder, limit, cursor) {
74
+ let currentPlayers = []
75
+
76
+ for (let i = 0; i < rolesetIds.length; i++) {
77
+ const rolesetId = rolesetIds[i]
78
+ const roleLimit = limit <= 0 ? limit : limit - currentPlayers.length
79
+
80
+ await getPlayersInRole(jar, group, rolesetId, sortOrder, roleLimit, cursor)
81
+ .then((newData) => {
82
+ currentPlayers = currentPlayers.concat(newData)
83
+ })
84
+ .catch((error) => {
85
+ throw new Error(error)
86
+ })
87
+
88
+ if (limit > 0 && currentPlayers.length >= limit) {
89
+ return currentPlayers
90
+ }
91
+ }
92
+
93
+ return currentPlayers
94
+ }
95
+
96
+ exports.func = function (args) {
97
+ const jar = args.jar
98
+ const rolesetIds = Array.isArray(args.rolesetId) ? args.rolesetId : [args.rolesetId]
99
+ const sortOrder = args.sortOrder || 'Desc'
100
+ const limit = args.limit || -1
101
+ const cursor = args.cursor || ''
102
+ return getPlayersInRoles(jar, args.group, rolesetIds, sortOrder, limit, cursor)
103
+ }
@@ -0,0 +1,45 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const cache = require('../cache')
4
+ const RobloxAPIError = require('../util/apiError.js')
5
+
6
+ // Args
7
+ exports.required = ['group', 'userId']
8
+
9
+ // Docs
10
+ /**
11
+ * ✅ Get the user's rank in the group.
12
+ * @category Group
13
+ * @alias getRankInGroup
14
+ * @param {number} group - The id of the group.
15
+ * @param {number} userId - The id of the user.
16
+ * @returns {Promise<number>}
17
+ * @example const noblox = require("noblox.js")
18
+ * const rankId = await noblox.getRankInGroup(1, 1)
19
+ **/
20
+
21
+ // Define
22
+ function getRankInGroup (groupId, userId) {
23
+ if (typeof groupId === 'string') {
24
+ if (!isNaN(groupId)) {
25
+ // It's a number in a string
26
+ groupId = parseInt(groupId, 10)
27
+ } else {
28
+ throw new Error('Group id should be a number')
29
+ }
30
+ }
31
+ return http({ url: `//groups.roblox.com/v2/users/${userId}/groups/roles`, options: { json: true, resolveWithFullResponse: true } }).then((res) => {
32
+ if (res.statusCode !== 200) throw new RobloxAPIError(res)
33
+
34
+ const groupObject = res.body.data.find((info) => groupId === info.group.id)
35
+
36
+ return groupObject ? parseInt(groupObject.role.rank) : 0
37
+ })
38
+ }
39
+
40
+ exports.func = function (args) {
41
+ const id = args.userId
42
+ return cache.wrap('Rank', id, function () {
43
+ return getRankInGroup(args.group, id)
44
+ })
45
+ }
@@ -0,0 +1,44 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const cache = require('../cache')
4
+ const RobloxAPIError = require('../util/apiError.js')
5
+
6
+ // Args
7
+ exports.required = ['group', 'userId']
8
+
9
+ // Docs
10
+ /**
11
+ * ✅ Get a user's rank name in a group.
12
+ * @category Group
13
+ * @alias getRankNameInGroup
14
+ * @param {number} group - The id of the group.
15
+ * @param {number} userId - The id of the user.
16
+ * @returns {Promise<string>}
17
+ * @example const noblox = require("noblox.js")
18
+ * const rankName = await noblox.getRankNameInGroup(1, 1)
19
+ **/
20
+
21
+ // Define
22
+ function getRankNameInGroup (group, userId) {
23
+ if (typeof group === 'string') {
24
+ if (!isNaN(group)) {
25
+ // It's a number in a string
26
+ group = parseInt(group, 10)
27
+ } else {
28
+ throw new Error('Group id should be a number')
29
+ }
30
+ }
31
+ return http({ url: `//groups.roblox.com/v2/users/${userId}/groups/roles`, options: { json: true, resolveWithFullResponse: true } }).then((res) => {
32
+ if (res.statusCode !== 200) throw new RobloxAPIError(res)
33
+ const groupObject = res.body.data.find((info) => group === info.group.id)
34
+
35
+ return groupObject ? groupObject.role.name : 'Guest'
36
+ })
37
+ }
38
+
39
+ exports.func = function (args) {
40
+ const id = args.userId
41
+ return cache.wrap('Rank', id + 'Name', function () {
42
+ return getRankNameInGroup(args.group, id)
43
+ })
44
+ }
@@ -0,0 +1,64 @@
1
+ // Dependencies
2
+ const entities = require('entities')
3
+
4
+ // Includes
5
+ const getRoles = require('./getRoles.js').func
6
+
7
+ // Args
8
+ exports.required = ['group', 'roleQuery']
9
+ exports.optional = []
10
+
11
+ // Docs
12
+ /**
13
+ * ✅ Get a role in a group.
14
+ * @category Group
15
+ * @alias getRole
16
+ * @param {number | Array<number>} group - The ID of the group or an array of roles to query.
17
+ * @param {number | string} roleQuery - The rank of a role, the name of the role, or roleset ID.
18
+ * @returns {Promise<Role>}
19
+ * @example const noblox = require("noblox.js")
20
+ * const customerRole = await noblox.getRole(1, "Customer")
21
+ **/
22
+
23
+ // Define
24
+ function getRole (roles, roleQuery) {
25
+ return new Promise((resolve, reject) => {
26
+ const result = []
27
+
28
+ for (let i = 0; i < roles.length; i++) {
29
+ const role = roles[i]
30
+ let find
31
+ if (typeof roleQuery === 'number' && roleQuery <= 255) {
32
+ find = role.rank
33
+ } else if (typeof roleQuery === 'string') {
34
+ find = entities.decodeHTML(role.name)
35
+ } else if (typeof roleQuery === 'number' || roleQuery > 255) {
36
+ find = role.id
37
+ }
38
+
39
+ if (roleQuery === find) {
40
+ result.push(role)
41
+ }
42
+ }
43
+
44
+ if (result.length === 1) {
45
+ resolve(result[0])
46
+ } else if (result.length > 1) {
47
+ reject(new Error(`There are two or more roles with the rank ${roleQuery}. You must specify the role name.`))
48
+ } else {
49
+ reject(new Error('Role not found with provided query.'))
50
+ }
51
+ })
52
+ }
53
+
54
+ exports.func = function (args) {
55
+ if (typeof args.group === 'number' || typeof args.group === 'string') {
56
+ return getRoles({ group: parseInt(args.group, 10) }).then(function (roles) {
57
+ return getRole(roles, args.roleQuery)
58
+ })
59
+ } else if (typeof args.group === 'object') {
60
+ return getRole(args.group, args.roleQuery)
61
+ } else {
62
+ throw new Error('Please provide a valid group or an array of roles to query.')
63
+ }
64
+ }
@@ -0,0 +1,48 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const RobloxAPIError = require('../util/apiError.js')
4
+
5
+ exports.required = ['group', 'rolesetId']
6
+ exports.optional = ['jar']
7
+
8
+ // Docs
9
+ /**
10
+ * 🔐 Get the permissions for a role.
11
+ * @category Group
12
+ * @alias getRolePermissions
13
+ * @param {number} group - The id of the group.
14
+ * @param {number} rolesetId - The rolesetId of the role.
15
+ * @returns {Promise<RolePermissions>}
16
+ * @example const noblox = require("noblox.js")
17
+ * // Login using your cookie
18
+ * const rolePermissions = await noblox.getRolePermissions(1, 1117747196)
19
+ **/
20
+
21
+ function getRolePermissions (group, rolesetId, jar) {
22
+ return new Promise((resolve, reject) => {
23
+ const httpOpt = {
24
+ url: `https://groups.roblox.com/v1/groups/${group}/roles/${rolesetId}/permissions`,
25
+ options: {
26
+ method: 'GET',
27
+ resolveWithFullResponse: true,
28
+ jar
29
+ }
30
+ }
31
+
32
+ return http(httpOpt)
33
+ .then(function (res) {
34
+ const responseData = JSON.parse(res.body)
35
+ if (res.statusCode !== 200) {
36
+ reject(new RobloxAPIError(res))
37
+ } else {
38
+ resolve(responseData)
39
+ }
40
+ }).catch(error => reject(error))
41
+ })
42
+ }
43
+
44
+ // Define
45
+ exports.func = function (args) {
46
+ const jar = args.jar
47
+ return getRolePermissions(args.group, args.rolesetId, jar)
48
+ }
@@ -0,0 +1,53 @@
1
+ // Includes
2
+ const http = require('../util/http.js').func
3
+ const cache = require('../cache')
4
+ const RobloxAPIError = require('../util/apiError.js')
5
+
6
+ // Args
7
+ exports.required = ['group']
8
+
9
+ // Docs
10
+ /**
11
+ * ✅ Get the roles in a group.
12
+ * @category Group
13
+ * @alias getRoles
14
+ * @param {number} group - The id of the group.
15
+ * @returns {Promise<Role[]>}
16
+ * @example const noblox = require("noblox.js")
17
+ * const roles = await noblox.getRoles(1)
18
+ **/
19
+
20
+ // Define
21
+ function getRoles (group) {
22
+ return new Promise((resolve, reject) => {
23
+ const httpOpt = {
24
+ url: `https://groups.roblox.com/v1/groups/${group}/roles`,
25
+ options: {
26
+ method: 'GET',
27
+ resolveWithFullResponse: true
28
+ }
29
+ }
30
+ return http(httpOpt)
31
+ .then(function (res) {
32
+ const responseData = JSON.parse(res.body)
33
+ if (res.statusCode !== 200) {
34
+ reject(new RobloxAPIError(res))
35
+ } else {
36
+ let roles = responseData.roles
37
+ roles = roles.sort((a, b) => a.rank - b.rank)
38
+ for (let i = 0; i < roles.length; i++) {
39
+ const role = roles[i]
40
+ role.ID = role.id
41
+ }
42
+ resolve(roles)
43
+ }
44
+ }).catch(error => reject(error))
45
+ })
46
+ }
47
+
48
+ exports.func = function (args) {
49
+ const group = args.group
50
+ return cache.wrap('Roles', group, function () {
51
+ return getRoles(group)
52
+ })
53
+ }
@@ -0,0 +1,47 @@
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 = []
8
+
9
+ // Docs
10
+ /**
11
+ * 🔓 Get the group's shout.
12
+ * @category Group
13
+ * @alias getShout
14
+ * @param {number} group - The id of the group.
15
+ * @returns {Promise<GroupShout>}
16
+ * @example const noblox = require("noblox.js")
17
+ * const groupShout = await noblox.getShout(1)
18
+ **/
19
+
20
+ // Define
21
+ function getShout (group, jar) {
22
+ return new Promise((resolve, reject) => {
23
+ const httpOpt = {
24
+ url: `https://groups.roblox.com/v1/groups/${group}`,
25
+ options: {
26
+ method: 'GET',
27
+ resolveWithFullResponse: true,
28
+ jar
29
+ }
30
+ }
31
+
32
+ return http(httpOpt)
33
+ .then(function (res) {
34
+ const responseData = JSON.parse(res.body)
35
+ if (res.statusCode !== 400) {
36
+ reject(new RobloxAPIError(res))
37
+ } else {
38
+ resolve(responseData.shout)
39
+ }
40
+ })
41
+ .catch(error => reject(error))
42
+ })
43
+ }
44
+
45
+ exports.func = function (args) {
46
+ return getShout(args.group, args.jar)
47
+ }
@@ -0,0 +1,56 @@
1
+ const http = require('../util/http.js').func
2
+ const RobloxAPIError = require('../util/apiError.js')
3
+
4
+ exports.required = ['group']
5
+ exports.optional = ['sortOrder', 'limit', 'cursor', 'jar']
6
+
7
+ // Docs
8
+ /**
9
+ * 🔓 Get the posts on the group wall.
10
+ * @category Group
11
+ * @alias getWall
12
+ * @param {number} group - The id of the group.
13
+ * @param {SortOrder=} sortOrder - The order to get the players in.
14
+ * @param {Limit=} limit - The maximum result per a page.
15
+ * @param {string=} cursor - The cursor for the next page.
16
+ * @returns {Promise<WallPostPage>}
17
+ * @example const noblox = require("noblox.js")
18
+ * // Login using your cookie
19
+ * const wallPosts = await noblox.getWall(1)
20
+ **/
21
+
22
+ function getPosts (group, sortOrder, limit, cursor, jar) {
23
+ return new Promise((resolve, reject) => {
24
+ const httpOpt = {
25
+ url: `https://groups.roblox.com/v2/groups/${group}/wall/posts?limit=${limit}&sortOrder=${sortOrder}&cursor=${cursor}`,
26
+ options: {
27
+ method: 'GET',
28
+ resolveWithFullResponse: true,
29
+ jar
30
+ }
31
+ }
32
+
33
+ return http(httpOpt)
34
+ .then(function (res) {
35
+ const responseData = JSON.parse(res.body)
36
+ if (res.statusCode !== 200) {
37
+ reject(new RobloxAPIError(res))
38
+ } else {
39
+ responseData.data = responseData.data.map((entry) => {
40
+ entry.created = new Date(entry.created)
41
+ entry.updated = new Date(entry.updated)
42
+ return entry
43
+ })
44
+ resolve(responseData)
45
+ }
46
+ }).catch(error => reject(error))
47
+ })
48
+ }
49
+
50
+ // Define
51
+ exports.func = function (args) {
52
+ const sortOrder = args.sortOrder || 'Asc'
53
+ const limit = args.limit || 100
54
+ const cursor = args.cursor || ''
55
+ return getPosts(args.group, sortOrder, limit, cursor, args.jar)
56
+ }