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.
- package/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
- package/.github/workflows/doc-publish.yml +33 -0
- package/.github/workflows/npmpublish.yml +72 -0
- package/.github/workflows/run-tests.yml +49 -0
- package/CODE_OF_CONDUCT.md +76 -0
- package/LICENSE +21 -0
- package/README.md +182 -0
- package/eslint.config.mjs +34 -0
- package/examples/cleanPlayers.js +130 -0
- package/examples/cleanWall.js +110 -0
- package/examples/revertRanks.js +100 -0
- package/examples/savePlayers.js +119 -0
- package/examples/saveWall.js +96 -0
- package/img/moderatedThumbnails/moderatedThumbnail_100x100.png +0 -0
- package/img/moderatedThumbnails/moderatedThumbnail_110x110.png +0 -0
- package/img/moderatedThumbnails/moderatedThumbnail_140x140.png +0 -0
- package/img/moderatedThumbnails/moderatedThumbnail_150x150.png +0 -0
- package/img/moderatedThumbnails/moderatedThumbnail_150x200.png +0 -0
- package/img/moderatedThumbnails/moderatedThumbnail_180x180.png +0 -0
- package/img/moderatedThumbnails/moderatedThumbnail_250x250.png +0 -0
- package/img/moderatedThumbnails/moderatedThumbnail_30x30.png +0 -0
- package/img/moderatedThumbnails/moderatedThumbnail_352x352.png +0 -0
- package/img/moderatedThumbnails/moderatedThumbnail_420x420.png +0 -0
- package/img/moderatedThumbnails/moderatedThumbnail_48x48.png +0 -0
- package/img/moderatedThumbnails/moderatedThumbnail_50x50.png +0 -0
- package/img/moderatedThumbnails/moderatedThumbnail_60x60.png +0 -0
- package/img/moderatedThumbnails/moderatedThumbnail_720x720.png +0 -0
- package/img/moderatedThumbnails/moderatedThumbnail_75x75.png +0 -0
- package/img/noblox-js-small.png +0 -0
- package/img/noblox-js.png +0 -0
- package/img/thumbnailSizes.png +0 -0
- package/jsDocsConfig.json +55 -0
- package/lib/accountinformation/getUserSocialLinks.js +40 -0
- package/lib/accountsettings/block.js +53 -0
- package/lib/accountsettings/unblock.js +53 -0
- package/lib/asset/deleteFromInventory.js +56 -0
- package/lib/asset/getGamePassProductInfo.js +50 -0
- package/lib/asset/getProductInfo.js +46 -0
- package/lib/asset/uploadAnimation.js +103 -0
- package/lib/asset/uploadItem.js +83 -0
- package/lib/asset/uploadModel.js +90 -0
- package/lib/avatar/avatarRules.js +39 -0
- package/lib/avatar/currentlyWearing.js +33 -0
- package/lib/avatar/getAvatar.js +36 -0
- package/lib/avatar/getCurrentAvatar.js +38 -0
- package/lib/avatar/getRecentItems.js +36 -0
- package/lib/avatar/outfitDetails.js +33 -0
- package/lib/avatar/outfits.js +38 -0
- package/lib/avatar/redrawAvatar.js +47 -0
- package/lib/avatar/removeAssetId.js +51 -0
- package/lib/avatar/setAvatarBodyColors.js +61 -0
- package/lib/avatar/setAvatarScales.js +61 -0
- package/lib/avatar/setPlayerAvatarType.js +51 -0
- package/lib/avatar/setWearingAssets.js +51 -0
- package/lib/avatar/wearAssetId.js +51 -0
- package/lib/badges/getAwardedTimestamps.js +49 -0
- package/lib/badges/getBadgeInfo.js +44 -0
- package/lib/badges/getGameBadges.js +63 -0
- package/lib/badges/getPlayerBadges.js +28 -0
- package/lib/badges/updateBadgeInfo.js +75 -0
- package/lib/cache/add.js +14 -0
- package/lib/cache/addIf.js +26 -0
- package/lib/cache/clear.js +8 -0
- package/lib/cache/get.js +28 -0
- package/lib/cache/index.js +17 -0
- package/lib/cache/new.js +12 -0
- package/lib/cache/wrap.js +25 -0
- package/lib/chat/addUsersToConversation.js +58 -0
- package/lib/chat/chatSettings.js +34 -0
- package/lib/chat/getChatMessages.js +41 -0
- package/lib/chat/getConversations.js +44 -0
- package/lib/chat/getRolloutSettings.js +36 -0
- package/lib/chat/getUnreadConversationCount.js +34 -0
- package/lib/chat/getUnreadMessages.js +39 -0
- package/lib/chat/getUserConversations.js +38 -0
- package/lib/chat/markChatAsRead.js +53 -0
- package/lib/chat/markChatAsSeen.js +51 -0
- package/lib/chat/multiGetLatestMessages.js +38 -0
- package/lib/chat/onNewConversation.js +50 -0
- package/lib/chat/onNewMessage.js +53 -0
- package/lib/chat/onNewMessageBySelf.js +50 -0
- package/lib/chat/onUserOnline.js +50 -0
- package/lib/chat/onUserTyping.js +54 -0
- package/lib/chat/removeFromGroupConversation.js +59 -0
- package/lib/chat/renameGroupConversation.js +58 -0
- package/lib/chat/sendChatMessage.js +58 -0
- package/lib/chat/setChatUserTyping.js +58 -0
- package/lib/chat/start121Conversation.js +51 -0
- package/lib/chat/startCloudEditConversation.js +51 -0
- package/lib/chat/startGroupConversation.js +59 -0
- package/lib/client/onNotification.js +86 -0
- package/lib/client/setAPIKey.js +18 -0
- package/lib/client/setCookie.js +38 -0
- package/lib/datastores/deleteDatastoreEntry.js +56 -0
- package/lib/datastores/getDatastoreEntry.js +88 -0
- package/lib/datastores/getDatastoreEntryVersions.js +73 -0
- package/lib/datastores/getDatastoreKeys.js +63 -0
- package/lib/datastores/getDatastores.js +62 -0
- package/lib/datastores/incrementDatastoreEntry.js +83 -0
- package/lib/datastores/setDatastoreEntry.js +80 -0
- package/lib/develop/canManage.js +42 -0
- package/lib/develop/configureItem.js +210 -0
- package/lib/develop/updateUniverse.js +52 -0
- package/lib/develop/updateUniverseAccess.js +54 -0
- package/lib/economy/getGroupFunds.js +42 -0
- package/lib/economy/getGroupPayoutEligibility.js +55 -0
- package/lib/economy/getGroupRevenueSummary.js +42 -0
- package/lib/economy/getGroupTransactions.js +32 -0
- package/lib/economy/getResaleData.js +48 -0
- package/lib/economy/getResellers.js +35 -0
- package/lib/economy/getUserFunds.js +43 -0
- package/lib/economy/getUserTransactions.js +34 -0
- package/lib/economy/onGroupTransaction.js +74 -0
- package/lib/friends/acceptFriendRequest.js +54 -0
- package/lib/friends/declineAllFriendRequests.js +52 -0
- package/lib/friends/declineFriendRequest.js +54 -0
- package/lib/friends/getFollowerCount.js +35 -0
- package/lib/friends/getFollowers.js +56 -0
- package/lib/friends/getFollowingCount.js +35 -0
- package/lib/friends/getFollowings.js +56 -0
- package/lib/friends/getFriendCount.js +35 -0
- package/lib/friends/getFriendRequests.js +51 -0
- package/lib/friends/getFriends.js +48 -0
- package/lib/friends/onFriendRequest.js +58 -0
- package/lib/friends/removeFriend.js +53 -0
- package/lib/friends/sendFriendRequest.js +54 -0
- package/lib/friends/unfollow.js +53 -0
- package/lib/games/addDeveloperProduct.js +53 -0
- package/lib/games/configureGamePass.js +126 -0
- package/lib/games/getDeveloperProducts.js +44 -0
- package/lib/games/getGameInstances.js +31 -0
- package/lib/games/getGamePasses.js +39 -0
- package/lib/games/getGameRevenue.js +48 -0
- package/lib/games/getGameSocialLinks.js +42 -0
- package/lib/games/getGroupGames.js +30 -0
- package/lib/games/getPlaceInfo.js +47 -0
- package/lib/games/getUniverseInfo.js +50 -0
- package/lib/games/publishToTopic.js +52 -0
- package/lib/games/sendUserNotification.js +65 -0
- package/lib/games/updateDeveloperProduct.js +56 -0
- package/lib/groups/banFromGroup.js +47 -0
- package/lib/groups/changeRank.js +59 -0
- package/lib/groups/deleteWallPost.js +59 -0
- package/lib/groups/deleteWallPostsByUser.js +55 -0
- package/lib/groups/demote.js +25 -0
- package/lib/groups/exile.js +55 -0
- package/lib/groups/getAuditLog.js +64 -0
- package/lib/groups/getGroup.js +50 -0
- package/lib/groups/getGroupBans.js +37 -0
- package/lib/groups/getGroupSocialLinks.js +41 -0
- package/lib/groups/getGroups.js +82 -0
- package/lib/groups/getJoinRequest.js +47 -0
- package/lib/groups/getJoinRequests.js +53 -0
- package/lib/groups/getPlayers.js +103 -0
- package/lib/groups/getRankInGroup.js +45 -0
- package/lib/groups/getRankNameInGroup.js +44 -0
- package/lib/groups/getRole.js +64 -0
- package/lib/groups/getRolePermissions.js +48 -0
- package/lib/groups/getRoles.js +53 -0
- package/lib/groups/getShout.js +47 -0
- package/lib/groups/getWall.js +56 -0
- package/lib/groups/groupPayout.js +103 -0
- package/lib/groups/handleJoinRequest.js +57 -0
- package/lib/groups/handleJoinRequests.js +61 -0
- package/lib/groups/leaveGroup.js +56 -0
- package/lib/groups/onAuditLog.js +62 -0
- package/lib/groups/onJoinRequest.js +63 -0
- package/lib/groups/onJoinRequestHandle.js +105 -0
- package/lib/groups/onShout.js +57 -0
- package/lib/groups/onWallPost.js +58 -0
- package/lib/groups/promote.js +25 -0
- package/lib/groups/searchGroups.js +32 -0
- package/lib/groups/setGroupDescription.js +58 -0
- package/lib/groups/setGroupName.js +59 -0
- package/lib/groups/setRank.js +74 -0
- package/lib/groups/setRoleInfo.js +84 -0
- package/lib/groups/shout.js +58 -0
- package/lib/groups/unbanFromGroup.js +41 -0
- package/lib/index.js +212 -0
- package/lib/internal/levelOneCopy.js +16 -0
- package/lib/internal/queue.js +61 -0
- package/lib/internal/timeout.js +30 -0
- package/lib/internal/wrap.js +78 -0
- package/lib/inventory/getCollectibles.js +31 -0
- package/lib/inventory/getInventory.js +32 -0
- package/lib/inventory/getInventoryById.js +31 -0
- package/lib/inventory/getOwnership.js +47 -0
- package/lib/inventory/getUAIDs.js +47 -0
- package/lib/itemconfiguration/getGroupAssets.js +32 -0
- package/lib/options.js +26 -0
- package/lib/party/onPartyDeleted.js +53 -0
- package/lib/party/onPartyInvite.js +53 -0
- package/lib/party/onPartyJoinedGame.js +53 -0
- package/lib/party/onPartyLeftGame.js +53 -0
- package/lib/party/onPartySelfJoined.js +53 -0
- package/lib/party/onPartySelfLeft.js +53 -0
- package/lib/party/onPartyUserJoined.js +53 -0
- package/lib/party/onPartyUserLeft.js +53 -0
- package/lib/premiumfeatures/getPremium.js +46 -0
- package/lib/presence/getPresences.js +60 -0
- package/lib/privatemessages/getMessages.js +55 -0
- package/lib/privatemessages/message.js +75 -0
- package/lib/privatemessages/onMessage.js +89 -0
- package/lib/thumbnails/getLogo.js +56 -0
- package/lib/thumbnails/getPlayerThumbnail.js +120 -0
- package/lib/thumbnails/getThumbnails.js +92 -0
- package/lib/trades/acceptTrade.js +52 -0
- package/lib/trades/canTradeWith.js +43 -0
- package/lib/trades/counterTrade.js +78 -0
- package/lib/trades/declineTrade.js +52 -0
- package/lib/trades/getTradeInfo.js +47 -0
- package/lib/trades/getTrades.js +37 -0
- package/lib/trades/sendTrade.js +76 -0
- package/lib/users/getBlurb.js +37 -0
- package/lib/users/getIdFromUsername.js +56 -0
- package/lib/users/getPlayerInfo.js +128 -0
- package/lib/users/getUserInfo.js +35 -0
- package/lib/users/getUsernameFromId.js +45 -0
- package/lib/users/getUsernameHistory.js +42 -0
- package/lib/users/onBlurbChange.js +46 -0
- package/lib/users/searchUsers.js +41 -0
- package/lib/util/apiError.js +50 -0
- package/lib/util/clearSession.js +32 -0
- package/lib/util/generalRequest.js +61 -0
- package/lib/util/getAction.js +45 -0
- package/lib/util/getAuthenticatedUser.js +41 -0
- package/lib/util/getCurrentUser.js +58 -0
- package/lib/util/getGeneralToken.js +52 -0
- package/lib/util/getHash.js +29 -0
- package/lib/util/getInputs.js +37 -0
- package/lib/util/getPageResults.js +86 -0
- package/lib/util/getSenderUserId.js +30 -0
- package/lib/util/getSession.js +38 -0
- package/lib/util/getVerification.js +60 -0
- package/lib/util/getVerificationInputs.js +31 -0
- package/lib/util/http.js +138 -0
- package/lib/util/jar.js +25 -0
- package/lib/util/refreshCookie.js +52 -0
- package/lib/util/relog.js +81 -0
- package/lib/util/setOptions.js +54 -0
- package/lib/util/shortPoll.js +102 -0
- package/package.json +76 -0
- package/postinstall.mjs +1 -0
- package/settings.json +115 -0
- package/test/accountinformation.test.js +27 -0
- package/test/accountsettings.test.js +27 -0
- package/test/asset.test.js +81 -0
- package/test/assets/Great-White-Shark-Fin.rbxm +0 -0
- package/test/assets/KeyframeSequence.rbxm +0 -0
- package/test/avatar.test.js +164 -0
- package/test/badges.test.js +96 -0
- package/test/chat.test.js +104 -0
- package/test/datastore.test.js +105 -0
- package/test/develop.test.js +53 -0
- package/test/economy.test.js +143 -0
- package/test/friends.test.js +146 -0
- package/test/games.test.js +229 -0
- package/test/groups.test.js +405 -0
- package/test/inventory.test.js +98 -0
- package/test/itemconfiguration.test.js +24 -0
- package/test/premiumfeatures.test.js +17 -0
- package/test/presence.test.js +25 -0
- package/test/privatemessages.test.js +33 -0
- package/test/thumbnails.test.js +53 -0
- package/test/users.test.js +110 -0
- package/tutorials/Authentication.md +75 -0
- package/tutorials/Event Emitters.md +26 -0
- package/tutorials/Promises.md +86 -0
- package/tutorials/VPS Authentication.md +72 -0
- package/typings/index.d.ts +2639 -0
- 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
|
+
}
|