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,65 @@
|
|
|
1
|
+
const http = require('../util/http.js').func
|
|
2
|
+
const RobloxAPIError = require('../util/apiError.js')
|
|
3
|
+
|
|
4
|
+
exports.required = ['universeId', 'userId', 'assetId', 'parameters']
|
|
5
|
+
exports.optional = ['jar']
|
|
6
|
+
|
|
7
|
+
// Docs
|
|
8
|
+
/**
|
|
9
|
+
* ☁️ Send a universe notification to a user.
|
|
10
|
+
* @category Game
|
|
11
|
+
* @alias sendUserNotification
|
|
12
|
+
* @param {number} universeId - The id of the universe.
|
|
13
|
+
* @param {number} userId - The id of the target player.
|
|
14
|
+
* @param {string} assetId - The asset id of the notification.
|
|
15
|
+
* @param {UserNotificationPayloadParameters} parameters - The notification parameters.
|
|
16
|
+
* @returns {Promise<boolean>}
|
|
17
|
+
* @example const noblox = require("noblox.js")
|
|
18
|
+
* // Set API key
|
|
19
|
+
* const parameters = {
|
|
20
|
+
* myMessage: { stringValue: "Hello world!" }
|
|
21
|
+
* }
|
|
22
|
+
* const assetId = "774d62e5-3414-b84a-89dd-77d96f1a3d33"
|
|
23
|
+
* noblox.sendUserNotification(4434277335, 1210019099, assetId, parameters)
|
|
24
|
+
**/
|
|
25
|
+
|
|
26
|
+
function sendUserNotification (universeId, userId, assetId, parameters, jar) {
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
const httpOpt = {
|
|
29
|
+
url: `//apis.roblox.com/cloud/v2/users/${userId}/notifications`,
|
|
30
|
+
options: {
|
|
31
|
+
json: true,
|
|
32
|
+
resolveWithFullResponse: true,
|
|
33
|
+
jar,
|
|
34
|
+
method: 'POST',
|
|
35
|
+
body: {
|
|
36
|
+
source: {
|
|
37
|
+
universe: `universes/${universeId}`
|
|
38
|
+
},
|
|
39
|
+
payload: {
|
|
40
|
+
type: 'MOMENT',
|
|
41
|
+
messageId: assetId,
|
|
42
|
+
parameters
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
headers: {
|
|
46
|
+
'Content-Type': 'application/json'
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return http(httpOpt)
|
|
52
|
+
.then(function (res) {
|
|
53
|
+
if (res.statusCode === 200) {
|
|
54
|
+
resolve(true)
|
|
55
|
+
} else {
|
|
56
|
+
reject(new RobloxAPIError(res))
|
|
57
|
+
}
|
|
58
|
+
})
|
|
59
|
+
.catch(reject)
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
exports.func = function (args) {
|
|
64
|
+
return sendUserNotification(args.universeId, args.userId, args.assetId, args.parameters, args.jar)
|
|
65
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const http = require('../util/http.js').func
|
|
2
|
+
const getGeneralToken = require('../util/getGeneralToken.js').func
|
|
3
|
+
const RobloxAPIError = require('../util/apiError.js')
|
|
4
|
+
|
|
5
|
+
exports.required = ['universeId', 'productId', 'priceInRobux']
|
|
6
|
+
exports.optional = ['name', 'description', 'jar']
|
|
7
|
+
|
|
8
|
+
// Docs
|
|
9
|
+
/**
|
|
10
|
+
* 🔐 Update a developer product.
|
|
11
|
+
* @category Game
|
|
12
|
+
* @alias updateDeveloperProduct
|
|
13
|
+
* @param {number} universeId - The id of the universe.
|
|
14
|
+
* @param {number} productId - The id of the product.
|
|
15
|
+
* @param {number} priceInRobux - The new price of the product.
|
|
16
|
+
* @param {string=} name - The new name of the product.
|
|
17
|
+
* @param {string=} description - The new description of the product.
|
|
18
|
+
* @returns {Promise<void>}
|
|
19
|
+
* @example const noblox = require("noblox.js")
|
|
20
|
+
* // Login using your cookie
|
|
21
|
+
* noblox.updateDeveloperProduct(1, 2, 10, "An Updated Developer Product", "My new updated product.")
|
|
22
|
+
**/
|
|
23
|
+
|
|
24
|
+
function updateDeveloperProduct (universeId, productId, priceInRobux, name, description, jar, token) {
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
return http({
|
|
27
|
+
url: `//apis.roblox.com/developer-products/v1/universes/${universeId}/developerproducts/${productId}/update`,
|
|
28
|
+
options: {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
jar,
|
|
31
|
+
headers: {
|
|
32
|
+
'X-CSRF-TOKEN': token
|
|
33
|
+
},
|
|
34
|
+
json: {
|
|
35
|
+
Name: name,
|
|
36
|
+
Description: description,
|
|
37
|
+
PriceInRobux: priceInRobux
|
|
38
|
+
},
|
|
39
|
+
resolveWithFullResponse: true
|
|
40
|
+
}
|
|
41
|
+
}).then((res) => {
|
|
42
|
+
if (res.statusCode === 200) {
|
|
43
|
+
resolve(res.body)
|
|
44
|
+
} else {
|
|
45
|
+
reject(new RobloxAPIError(res))
|
|
46
|
+
}
|
|
47
|
+
}).catch(reject)
|
|
48
|
+
})
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
exports.func = function ({ universeId, productId, priceInRobux, name, description, jar }) {
|
|
52
|
+
return getGeneralToken({ jar })
|
|
53
|
+
.then((token) => {
|
|
54
|
+
return updateDeveloperProduct(universeId, productId, priceInRobux, name, description, jar, token)
|
|
55
|
+
})
|
|
56
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Includes
|
|
2
|
+
const http = require('../util/http.js')
|
|
3
|
+
const getGeneralToken = require('../util/getGeneralToken.js')
|
|
4
|
+
const RobloxAPIError = require('../util/apiError.js')
|
|
5
|
+
|
|
6
|
+
// Args
|
|
7
|
+
exports.required = ['groupId', 'userId']
|
|
8
|
+
exports.optional = ['jar']
|
|
9
|
+
|
|
10
|
+
// Docs
|
|
11
|
+
/**
|
|
12
|
+
* 🔐 Bans a user from the specified group.
|
|
13
|
+
* @alias banFromGroup
|
|
14
|
+
* @param {number} groupId - The ID of the group
|
|
15
|
+
* @param {number} userId - The ID of the target user
|
|
16
|
+
* @returns {Promise<GroupBan>}
|
|
17
|
+
* @example const noblox = require("noblox.js")
|
|
18
|
+
* // Log in
|
|
19
|
+
* await noblox.banFromGroup(1, 2)
|
|
20
|
+
**/
|
|
21
|
+
|
|
22
|
+
// Define
|
|
23
|
+
exports.func = async function (args) {
|
|
24
|
+
const { groupId, jar, userId } = args
|
|
25
|
+
const token = await getGeneralToken({ jar })
|
|
26
|
+
|
|
27
|
+
const response = await http({
|
|
28
|
+
url: `//groups.roblox.com/v1/groups/${groupId}/bans/${userId}`,
|
|
29
|
+
options: {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
jar,
|
|
32
|
+
headers: {
|
|
33
|
+
'x-csrf-token': token
|
|
34
|
+
},
|
|
35
|
+
resolveWithFullResponse: true
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
if (response.statusCode !== 200) {
|
|
40
|
+
throw new RobloxAPIError(response)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const body = JSON.parse(response.body)
|
|
44
|
+
body.created = new Date(body.created)
|
|
45
|
+
|
|
46
|
+
return body
|
|
47
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Includes
|
|
2
|
+
const setRank = require('./setRank.js').func
|
|
3
|
+
const getRoles = require('./getRoles.js').func
|
|
4
|
+
const getRankNameInGroup = require('./getRankNameInGroup.js').func
|
|
5
|
+
|
|
6
|
+
// Args
|
|
7
|
+
exports.required = ['group', 'target', 'change']
|
|
8
|
+
exports.optional = ['jar']
|
|
9
|
+
|
|
10
|
+
// Docs
|
|
11
|
+
/**
|
|
12
|
+
* 🔐 Change a user's rank.
|
|
13
|
+
* @category Group
|
|
14
|
+
* @alias changeRank
|
|
15
|
+
* @param {number} groupId - The id of the group.
|
|
16
|
+
* @param {number} target - The userId of the target.
|
|
17
|
+
* @param {number} change - The change in rank (1 = one rank higher, -1 = one rank lower)
|
|
18
|
+
* @returns {Promise<ChangeRankResult>}
|
|
19
|
+
* @example const noblox = require("noblox.js")
|
|
20
|
+
* // Login using your cookie
|
|
21
|
+
* noblox.changeRank(1, 2, -1)
|
|
22
|
+
**/
|
|
23
|
+
|
|
24
|
+
// Define
|
|
25
|
+
exports.func = function (args) {
|
|
26
|
+
const group = args.group
|
|
27
|
+
const target = args.target
|
|
28
|
+
const amount = args.change
|
|
29
|
+
const jar = args.jar
|
|
30
|
+
return getRankNameInGroup({ group, userId: target })
|
|
31
|
+
.then(function (rank) {
|
|
32
|
+
if (rank === 'Guest') {
|
|
33
|
+
throw new Error('Target user is not in group')
|
|
34
|
+
}
|
|
35
|
+
return getRoles({ group })
|
|
36
|
+
.then(function (roles) {
|
|
37
|
+
for (let i = 0; i < roles.length; i++) {
|
|
38
|
+
const role = roles[i]
|
|
39
|
+
const thisRank = role.name
|
|
40
|
+
|
|
41
|
+
if (thisRank === rank) {
|
|
42
|
+
const change = i + amount
|
|
43
|
+
const found = roles[change]
|
|
44
|
+
|
|
45
|
+
if (!found) {
|
|
46
|
+
throw new Error('Rank change is out of range')
|
|
47
|
+
} else if (found.name === 'Guest' || found.rank === 0) {
|
|
48
|
+
throw new Error('Group members cannot be demoted to guest.')
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return setRank({ group, target, rank: found.id, jar })
|
|
52
|
+
.then(function () {
|
|
53
|
+
return { newRole: found, oldRole: role }
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Includes
|
|
2
|
+
const http = require('../util/http.js').func
|
|
3
|
+
const getGeneralToken = require('../util/getGeneralToken.js').func
|
|
4
|
+
const RobloxAPIError = require('../util/apiError.js')
|
|
5
|
+
|
|
6
|
+
// Args
|
|
7
|
+
exports.required = ['group', ['postId', 'post']]
|
|
8
|
+
exports.optional = ['jar']
|
|
9
|
+
|
|
10
|
+
// Docs
|
|
11
|
+
/**
|
|
12
|
+
* 🔐 Delete a wall post.
|
|
13
|
+
* @category Group
|
|
14
|
+
* @alias deleteWallPost
|
|
15
|
+
* @param {number} group - The id of the group.
|
|
16
|
+
* @param {number} postId - The id of the post to delete.
|
|
17
|
+
* @returns {Promise<void>}
|
|
18
|
+
* @example const noblox = require("noblox.js")
|
|
19
|
+
* // Login using your cookie
|
|
20
|
+
* noblox.deleteWallPost(1, 2)
|
|
21
|
+
**/
|
|
22
|
+
|
|
23
|
+
// Define
|
|
24
|
+
function deleteWallPost (jar, token, group, postId) {
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
const httpOpt = {
|
|
27
|
+
url: `//groups.roblox.com/v1/groups/${group}/wall/posts/${postId}`,
|
|
28
|
+
options: {
|
|
29
|
+
method: 'DELETE',
|
|
30
|
+
jar,
|
|
31
|
+
headers: {
|
|
32
|
+
'X-CSRF-TOKEN': token
|
|
33
|
+
},
|
|
34
|
+
resolveWithFullResponse: true
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return http(httpOpt)
|
|
38
|
+
.then(function (res) {
|
|
39
|
+
if (res.statusCode === 200) {
|
|
40
|
+
resolve()
|
|
41
|
+
} else {
|
|
42
|
+
reject(new RobloxAPIError(res))
|
|
43
|
+
}
|
|
44
|
+
}).catch(error => reject(error))
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
exports.func = function (args) {
|
|
49
|
+
const group = args.group
|
|
50
|
+
const jar = args.jar
|
|
51
|
+
return getGeneralToken({ jar })
|
|
52
|
+
.then(function (xcsrf) {
|
|
53
|
+
if (args.post) {
|
|
54
|
+
return deleteWallPost(jar, xcsrf, group, args.post.id)
|
|
55
|
+
} else {
|
|
56
|
+
return deleteWallPost(jar, xcsrf, group, args.postId)
|
|
57
|
+
}
|
|
58
|
+
})
|
|
59
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// Includes
|
|
2
|
+
const http = require('../util/http.js').func
|
|
3
|
+
const getGeneralToken = require('../util/getGeneralToken.js').func
|
|
4
|
+
const RobloxAPIError = require('../util/apiError.js')
|
|
5
|
+
|
|
6
|
+
// Args
|
|
7
|
+
exports.required = ['group', 'userId']
|
|
8
|
+
exports.optional = ['jar']
|
|
9
|
+
|
|
10
|
+
// Docs
|
|
11
|
+
/**
|
|
12
|
+
* 🔐 Removes all wall posts sent by the provided user.
|
|
13
|
+
* @category Group
|
|
14
|
+
* @alias deleteWallPostsByUser
|
|
15
|
+
* @param {number} group - The id of the group.
|
|
16
|
+
* @param {number} userId - The userId of the user having their posts removed.
|
|
17
|
+
* @returns {Promise<void>}
|
|
18
|
+
* @example const noblox = require("noblox.js")
|
|
19
|
+
* // Login using your cookie
|
|
20
|
+
* noblox.deleteWallPostsByUser(1, 2)
|
|
21
|
+
**/
|
|
22
|
+
|
|
23
|
+
function deleteWallPostsByUser (group, userId, jar, xcsrf) {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const httpOpt = {
|
|
26
|
+
url: `https://groups.roblox.com/v1/groups/${group}/wall/users/${userId}/posts`,
|
|
27
|
+
options: {
|
|
28
|
+
method: 'DELETE',
|
|
29
|
+
resolveWithFullResponse: true,
|
|
30
|
+
jar,
|
|
31
|
+
headers: {
|
|
32
|
+
'X-CSRF-TOKEN': xcsrf
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return http(httpOpt)
|
|
38
|
+
.then(function (res) {
|
|
39
|
+
if (res.statusCode !== 200) {
|
|
40
|
+
reject(new RobloxAPIError(res))
|
|
41
|
+
} else {
|
|
42
|
+
resolve()
|
|
43
|
+
}
|
|
44
|
+
}).catch(error => reject(error))
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Define
|
|
49
|
+
exports.func = function (args) {
|
|
50
|
+
const jar = args.jar
|
|
51
|
+
return getGeneralToken({ jar })
|
|
52
|
+
.then(function (xcsrf) {
|
|
53
|
+
return deleteWallPostsByUser(args.group, args.userId, args.jar, xcsrf)
|
|
54
|
+
})
|
|
55
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Includes
|
|
2
|
+
const changeRank = require('./changeRank.js').func
|
|
3
|
+
|
|
4
|
+
// Args
|
|
5
|
+
exports.required = ['group', 'target']
|
|
6
|
+
exports.optional = ['jar']
|
|
7
|
+
|
|
8
|
+
// Docs
|
|
9
|
+
/**
|
|
10
|
+
* 🔐 Demote a user.
|
|
11
|
+
* @category Group
|
|
12
|
+
* @alias demote
|
|
13
|
+
* @param {number} group - The id of the group.
|
|
14
|
+
* @param {number} target - The userId of the user being demoted.
|
|
15
|
+
* @returns {Promise<ChangeRankResult>}
|
|
16
|
+
* @example const noblox = require("noblox.js")
|
|
17
|
+
* // Login using your cookie
|
|
18
|
+
* noblox.demote(1, 2)
|
|
19
|
+
**/
|
|
20
|
+
|
|
21
|
+
// Define
|
|
22
|
+
exports.func = function (args) {
|
|
23
|
+
args.change = -1
|
|
24
|
+
return changeRank(args)
|
|
25
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// Includes
|
|
2
|
+
const http = require('../util/http.js').func
|
|
3
|
+
const getGeneralToken = require('../util/getGeneralToken.js').func
|
|
4
|
+
const RobloxAPIError = require('../util/apiError.js')
|
|
5
|
+
|
|
6
|
+
// Args
|
|
7
|
+
exports.required = ['group', 'target']
|
|
8
|
+
exports.optional = ['jar']
|
|
9
|
+
|
|
10
|
+
// Docs
|
|
11
|
+
/**
|
|
12
|
+
* 🔐 Exile a user from a group.
|
|
13
|
+
* @category Group
|
|
14
|
+
* @alias exile
|
|
15
|
+
* @param {number} group - The id of the group.
|
|
16
|
+
* @param {number} target - The userId of the user being exiled.
|
|
17
|
+
* @returns {Promise<void>}
|
|
18
|
+
* @example const noblox = require("noblox.js")
|
|
19
|
+
* // Login using your cookie
|
|
20
|
+
* noblox.exile(1, 2)
|
|
21
|
+
**/
|
|
22
|
+
|
|
23
|
+
function exileUser (group, target, jar, xcsrf) {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const httpOpt = {
|
|
26
|
+
url: `https://groups.roblox.com/v1/groups/${group}/users/${target}`,
|
|
27
|
+
options: {
|
|
28
|
+
method: 'DELETE',
|
|
29
|
+
resolveWithFullResponse: true,
|
|
30
|
+
jar,
|
|
31
|
+
headers: {
|
|
32
|
+
'X-CSRF-TOKEN': xcsrf
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return http(httpOpt)
|
|
38
|
+
.then(function (res) {
|
|
39
|
+
if (res.statusCode !== 200) {
|
|
40
|
+
reject(new RobloxAPIError(res))
|
|
41
|
+
} else {
|
|
42
|
+
resolve()
|
|
43
|
+
}
|
|
44
|
+
}).catch(error => reject(error))
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Define
|
|
49
|
+
exports.func = function (args) {
|
|
50
|
+
const jar = args.jar
|
|
51
|
+
return getGeneralToken({ jar })
|
|
52
|
+
.then(function (xcsrf) {
|
|
53
|
+
return exileUser(args.group, args.target, args.jar, xcsrf)
|
|
54
|
+
})
|
|
55
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Includes
|
|
2
|
+
const http = require('../util/http.js').func
|
|
3
|
+
const RobloxAPIError = require('../util/apiError.js')
|
|
4
|
+
|
|
5
|
+
exports.required = ['group']
|
|
6
|
+
exports.optional = ['actionType', 'userId', 'sortOrder', 'limit', 'cursor', 'jar']
|
|
7
|
+
|
|
8
|
+
// Docs
|
|
9
|
+
/**
|
|
10
|
+
* 🔐 Get the audit log for the group.
|
|
11
|
+
* @category Group
|
|
12
|
+
* @alias getAuditLog
|
|
13
|
+
* @param {number} group - The id of the group.
|
|
14
|
+
* @param {("DeletePost" | "RemoveMember" | "AcceptJoinRequest" | "DeclineJoinRequest" | "PostStatus" | "ChangeRank" | "BuyAd" | "SendAllyRequest" | "CreateEnemy" | "AcceptAllyRequest" | "DeclineAllyRequest" | "DeleteAlly" | "DeleteEnemy" | "AddGroupPlace" | "RemoveGroupPlace" | "CreateItems" | "ConfigureItems" | "SpendGroupFunds" | "ChangeOwner" | "Delete" | "AdjustCurrencyAmounts" | "Abandon" | "Claim" | "Rename" | "ChangeDescription" | "InviteToClan" | "KickFromClan" | "CancelClanInvite" | "BuyClan" | "CreateGroupAsset" | "UpdateGroupAsset" | "ConfigureGroupAsset" | "RevertGroupAsset" | "CreateGroupDeveloperProduct" | "ConfigureGroupGame" | "Lock" | "Unlock" | "CreateGamePass" | "CreateBadge" | "ConfigureBadge" | "SavePlace" | "PublishPlace")=} actionType - The action type to filter for.
|
|
15
|
+
* @param {number=} userId - The user's id to filter for.
|
|
16
|
+
* @param {SortOrder=} sortOrder - The order to sort the logs by.
|
|
17
|
+
* @param {Limit=} limit - The maximum logs per a page.
|
|
18
|
+
* @param {string=} cursor - The cursor for the page.
|
|
19
|
+
* @returns {Promise<AuditPage>}
|
|
20
|
+
* @example const noblox = require("noblox.js")
|
|
21
|
+
* // Login using your cookie
|
|
22
|
+
* const rankLogs = await noblox.getAuditLog(1, "ChangeRank", 2, "Asc")
|
|
23
|
+
**/
|
|
24
|
+
|
|
25
|
+
function getAuditLog (group, actionType, userId, sortOrder, limit, cursor, jar) {
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
const httpOpt = {
|
|
28
|
+
url: `https://groups.roblox.com/v1/groups/${group}/audit-log?actionType=${actionType}&cursor=${cursor}&limit=${limit}&sortOrder=${sortOrder}&userId=${userId}`,
|
|
29
|
+
options: {
|
|
30
|
+
method: 'GET',
|
|
31
|
+
resolveWithFullResponse: true,
|
|
32
|
+
jar
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return http(httpOpt)
|
|
37
|
+
.then(function (res) {
|
|
38
|
+
const responseData = JSON.parse(res.body)
|
|
39
|
+
if (res.statusCode !== 200) {
|
|
40
|
+
reject(new RobloxAPIError(res))
|
|
41
|
+
} else {
|
|
42
|
+
responseData.data = responseData.data.map((entry) => {
|
|
43
|
+
// We need to set milliseconds to 0 because Roblox does this fascinating thing
|
|
44
|
+
// Where they vary the ms value on each request, for an existing action.
|
|
45
|
+
entry.created = new Date(entry.created)
|
|
46
|
+
entry.created.setMilliseconds(0)
|
|
47
|
+
return entry
|
|
48
|
+
})
|
|
49
|
+
resolve(responseData)
|
|
50
|
+
}
|
|
51
|
+
}).catch(error => reject(error))
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Define
|
|
56
|
+
exports.func = function (args) {
|
|
57
|
+
const jar = args.jar
|
|
58
|
+
const actionType = args.actionType || ''
|
|
59
|
+
const userId = args.userId || ''
|
|
60
|
+
const sortOrder = args.sortOrder || 'Asc'
|
|
61
|
+
const limit = args.limit || (100).toString()
|
|
62
|
+
const cursor = args.cursor || ''
|
|
63
|
+
return getAuditLog(args.group, actionType, userId, sortOrder, limit, cursor, jar)
|
|
64
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Includes
|
|
2
|
+
const http = require('../util/http.js').func
|
|
3
|
+
const RobloxAPIError = require('../util/apiError.js')
|
|
4
|
+
|
|
5
|
+
// Args
|
|
6
|
+
exports.required = ['groupId']
|
|
7
|
+
exports.optional = []
|
|
8
|
+
|
|
9
|
+
// Docs
|
|
10
|
+
/**
|
|
11
|
+
* ✅ Get a group's info.
|
|
12
|
+
* @category Group
|
|
13
|
+
* @alias getGroup
|
|
14
|
+
* @param {number} groupId - The id of the group.
|
|
15
|
+
* @returns {Promise<Group>}
|
|
16
|
+
* @example const noblox = require("noblox.js")
|
|
17
|
+
* const groupInfo = await noblox.getGroup(1)
|
|
18
|
+
**/
|
|
19
|
+
|
|
20
|
+
// Define
|
|
21
|
+
function getGroup (groupId) {
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
const httpOpt = {
|
|
24
|
+
url: `//groups.roblox.com/v1/groups/${groupId}`,
|
|
25
|
+
options: {
|
|
26
|
+
method: 'GET',
|
|
27
|
+
resolveWithFullResponse: true
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return http(httpOpt)
|
|
31
|
+
.then(function (res) {
|
|
32
|
+
if (res.statusCode === 200) {
|
|
33
|
+
const body = JSON.parse(res.body)
|
|
34
|
+
|
|
35
|
+
if (body.shout) {
|
|
36
|
+
body.shout.created = new Date(body.shout.created)
|
|
37
|
+
body.shout.updated = new Date(body.shout.updated)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
resolve(body)
|
|
41
|
+
} else {
|
|
42
|
+
reject(new RobloxAPIError(res))
|
|
43
|
+
}
|
|
44
|
+
}).catch(error => reject(error))
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
exports.func = function (args) {
|
|
49
|
+
return getGroup(args.groupId)
|
|
50
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Includes
|
|
2
|
+
const getPageResults = require('../util/getPageResults.js').func
|
|
3
|
+
|
|
4
|
+
// Args
|
|
5
|
+
exports.required = ['groupId']
|
|
6
|
+
exports.optional = ['limit', 'sortOrder', 'pageCursor', 'jar']
|
|
7
|
+
|
|
8
|
+
// Docs
|
|
9
|
+
/**
|
|
10
|
+
* 🔐 Gets bans of a group
|
|
11
|
+
* @category Group
|
|
12
|
+
* @alias getGroupBans
|
|
13
|
+
* @param {number} groupId - The ID of the group
|
|
14
|
+
* @param {number=} limit - The number of bans to fetch maximum per page
|
|
15
|
+
* @param {SortOrder=} sortOrder - The order to sort the bans
|
|
16
|
+
* @param {string=} pageCursor - The next or previous page's cursor
|
|
17
|
+
* @returns {Promise<GroupBan[]>}
|
|
18
|
+
* @example const noblox = require("noblox.js")
|
|
19
|
+
* await noblox.getGroupBans({ groupId: 1, limit: 100, sortOrder: "Desc" })
|
|
20
|
+
**/
|
|
21
|
+
|
|
22
|
+
// Define
|
|
23
|
+
exports.func = async function (args) {
|
|
24
|
+
let { groupId, jar, limit, pageCursor, sortOrder } = args
|
|
25
|
+
limit ||= 100
|
|
26
|
+
sortOrder ||= 'Desc'
|
|
27
|
+
|
|
28
|
+
return await getPageResults({
|
|
29
|
+
url: `//groups.roblox.com/v1/groups/${groupId}/bans`,
|
|
30
|
+
query: {
|
|
31
|
+
sortOrder
|
|
32
|
+
},
|
|
33
|
+
pageCursor,
|
|
34
|
+
limit,
|
|
35
|
+
jar
|
|
36
|
+
})
|
|
37
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Includes
|
|
2
|
+
const http = require('../util/http.js').func
|
|
3
|
+
|
|
4
|
+
const RobloxAPIError = require('../util/apiError.js')
|
|
5
|
+
// Args
|
|
6
|
+
exports.required = ['groupId']
|
|
7
|
+
exports.optional = ['jar']
|
|
8
|
+
|
|
9
|
+
// Docs
|
|
10
|
+
/**
|
|
11
|
+
* 🔐 Get the social link data associated with a group.
|
|
12
|
+
* @category Group
|
|
13
|
+
* @alias getGroupSocialLinks
|
|
14
|
+
* @param {number} groupId - The id of the group.
|
|
15
|
+
* @returns {Promise<SocialLinkResponse[]>}
|
|
16
|
+
* @example const noblox = require("noblox.js")
|
|
17
|
+
* const groupSocialLinks = await noblox.getGroupSocialLinks(9997719)
|
|
18
|
+
**/
|
|
19
|
+
|
|
20
|
+
// Define
|
|
21
|
+
function getGroupSocialLinks (groupId, jar) {
|
|
22
|
+
return http({
|
|
23
|
+
url: `//groups.roblox.com/v1/groups/${groupId}/social-links`,
|
|
24
|
+
options: {
|
|
25
|
+
jar,
|
|
26
|
+
resolveWithFullResponse: true
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
.then((res) => {
|
|
30
|
+
const { data } = JSON.parse(res.body)
|
|
31
|
+
if (res.statusCode === 200 && data) {
|
|
32
|
+
return data
|
|
33
|
+
} else {
|
|
34
|
+
throw new RobloxAPIError(res)
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
exports.func = function ({ groupId, jar }) {
|
|
40
|
+
return getGroupSocialLinks(groupId, jar)
|
|
41
|
+
}
|