noblox.ts 4.10.5
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of noblox.ts might be problematic. Click here for more details.
- package/.eslintrc.js +21 -0
- package/.github/FUNDING.yml +3 -0
- 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 +70 -0
- package/.travis.yml +13 -0
- package/CODE_OF_CONDUCT.md +76 -0
- package/LICENSE +21 -0
- package/README.md +168 -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 +42 -0
- package/lib/accountsettings/block.js +58 -0
- package/lib/accountsettings/unblock.js +58 -0
- package/lib/asset/deleteFromInventory.js +69 -0
- package/lib/asset/getGamePassProductInfo.js +51 -0
- package/lib/asset/getProductInfo.js +56 -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 +38 -0
- package/lib/avatar/currentlyWearing.js +32 -0
- package/lib/avatar/getAvatar.js +35 -0
- package/lib/avatar/getCurrentAvatar.js +37 -0
- package/lib/avatar/getRecentItems.js +37 -0
- package/lib/avatar/outfitDetails.js +32 -0
- package/lib/avatar/outfits.js +37 -0
- package/lib/avatar/redrawAvatar.js +48 -0
- package/lib/avatar/removeAssetId.js +55 -0
- package/lib/avatar/setAvatarBodyColors.js +60 -0
- package/lib/avatar/setAvatarScales.js +60 -0
- package/lib/avatar/setPlayerAvatarType.js +50 -0
- package/lib/avatar/setWearingAssets.js +50 -0
- package/lib/avatar/wearAssetId.js +55 -0
- package/lib/badges/getAwardedTimestamps.js +52 -0
- package/lib/badges/getBadgeInfo.js +43 -0
- package/lib/badges/getGameBadges.js +62 -0
- package/lib/badges/getPlayerBadges.js +28 -0
- package/lib/badges/updateBadgeInfo.js +80 -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 +61 -0
- package/lib/chat/chatSettings.js +33 -0
- package/lib/chat/getChatMessages.js +40 -0
- package/lib/chat/getConversations.js +43 -0
- package/lib/chat/getRolloutSettings.js +35 -0
- package/lib/chat/getUnreadConversationCount.js +33 -0
- package/lib/chat/getUnreadMessages.js +38 -0
- package/lib/chat/getUserConversations.js +37 -0
- package/lib/chat/markChatAsRead.js +52 -0
- package/lib/chat/markChatAsSeen.js +50 -0
- package/lib/chat/multiGetLatestMessages.js +37 -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 +62 -0
- package/lib/chat/renameGroupConversation.js +57 -0
- package/lib/chat/sendChatMessage.js +57 -0
- package/lib/chat/setChatUserTyping.js +61 -0
- package/lib/chat/start121Conversation.js +50 -0
- package/lib/chat/startCloudEditConversation.js +50 -0
- package/lib/chat/startGroupConversation.js +62 -0
- package/lib/client/onNotification.js +70 -0
- package/lib/client/setAPIKey.js +18 -0
- package/lib/client/setCookie.js +38 -0
- package/lib/datastores/deleteDatastoreEntry.js +66 -0
- package/lib/datastores/getDatastoreEntry.js +98 -0
- package/lib/datastores/getDatastoreEntryVersions.js +83 -0
- package/lib/datastores/getDatastoreKeys.js +73 -0
- package/lib/datastores/getDatastores.js +72 -0
- package/lib/datastores/incrementDatastoreEntry.js +93 -0
- package/lib/datastores/setDatastoreEntry.js +90 -0
- package/lib/develop/canManage.js +44 -0
- package/lib/develop/configureItem.js +142 -0
- package/lib/develop/updateUniverse.js +53 -0
- package/lib/develop/updateUniverseAccess.js +55 -0
- package/lib/economy/buy.js +99 -0
- package/lib/economy/getGroupFunds.js +43 -0
- package/lib/economy/getGroupRevenueSummary.js +48 -0
- package/lib/economy/getGroupTransactions.js +32 -0
- package/lib/economy/getResaleData.js +54 -0
- package/lib/economy/getResellers.js +35 -0
- package/lib/economy/getUserTransactions.js +34 -0
- package/lib/economy/onGroupTransaction.js +74 -0
- package/lib/friends/acceptFriendRequest.js +59 -0
- package/lib/friends/declineAllFriendRequests.js +57 -0
- package/lib/friends/declineFriendRequest.js +59 -0
- package/lib/friends/getFollowers.js +61 -0
- package/lib/friends/getFollowings.js +61 -0
- package/lib/friends/getFriendRequests.js +56 -0
- package/lib/friends/getFriends.js +53 -0
- package/lib/friends/onFriendRequest.js +58 -0
- package/lib/friends/removeFriend.js +58 -0
- package/lib/friends/sendFriendRequest.js +59 -0
- package/lib/friends/unfollow.js +58 -0
- package/lib/games/addDeveloperProduct.js +65 -0
- package/lib/games/checkDeveloperProductName.js +39 -0
- package/lib/games/configureGamePass.js +146 -0
- package/lib/games/getDeveloperProducts.js +51 -0
- package/lib/games/getGameInstances.js +31 -0
- package/lib/games/getGamePasses.js +39 -0
- package/lib/games/getGameRevenue.js +49 -0
- package/lib/games/getGameSocialLinks.js +45 -0
- package/lib/games/getGroupGames.js +30 -0
- package/lib/games/getPlaceInfo.js +48 -0
- package/lib/games/getUniverseInfo.js +51 -0
- package/lib/games/updateDeveloperProduct.js +69 -0
- package/lib/groups/changeRank.js +59 -0
- package/lib/groups/deleteWallPost.js +64 -0
- package/lib/groups/deleteWallPostsByUser.js +59 -0
- package/lib/groups/demote.js +25 -0
- package/lib/groups/exile.js +59 -0
- package/lib/groups/getAuditLog.js +67 -0
- package/lib/groups/getGroup.js +57 -0
- package/lib/groups/getGroupSocialLinks.js +44 -0
- package/lib/groups/getGroups.js +88 -0
- package/lib/groups/getJoinRequest.js +52 -0
- package/lib/groups/getJoinRequests.js +58 -0
- package/lib/groups/getPlayers.js +108 -0
- package/lib/groups/getRankInGroup.js +52 -0
- package/lib/groups/getRankNameInGroup.js +52 -0
- package/lib/groups/getRole.js +64 -0
- package/lib/groups/getRolePermissions.js +51 -0
- package/lib/groups/getRoles.js +56 -0
- package/lib/groups/getShout.js +49 -0
- package/lib/groups/getWall.js +59 -0
- package/lib/groups/groupPayout.js +103 -0
- package/lib/groups/handleJoinRequest.js +60 -0
- package/lib/groups/leaveGroup.js +60 -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 +65 -0
- package/lib/groups/setGroupName.js +66 -0
- package/lib/groups/setRank.js +79 -0
- package/lib/groups/shout.js +65 -0
- package/lib/index.js +30 -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 +54 -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 +51 -0
- package/lib/presence/getPresences.js +63 -0
- package/lib/privatemessages/getMessages.js +60 -0
- package/lib/privatemessages/message.js +80 -0
- package/lib/privatemessages/onMessage.js +88 -0
- package/lib/thumbnails/getLogo.js +60 -0
- package/lib/thumbnails/getPlayerThumbnail.js +121 -0
- package/lib/thumbnails/getThumbnails.js +93 -0
- package/lib/trades/acceptTrade.js +58 -0
- package/lib/trades/canTradeWith.js +48 -0
- package/lib/trades/counterTrade.js +84 -0
- package/lib/trades/declineTrade.js +58 -0
- package/lib/trades/getTradeInfo.js +52 -0
- package/lib/trades/getTrades.js +37 -0
- package/lib/trades/sendTrade.js +82 -0
- package/lib/users/getBlurb.js +36 -0
- package/lib/users/getIdFromUsername.js +53 -0
- package/lib/users/getPlayerInfo.js +100 -0
- package/lib/users/getUsernameFromId.js +44 -0
- package/lib/users/onBlurbChange.js +46 -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/getCurrentUser.js +44 -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 +89 -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 +110 -0
- package/lib/util/jar.js +24 -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/lib/util/threaded.js +80 -0
- package/package.json +94 -0
- package/postinstall.js +1 -0
- package/settings.json +107 -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 +137 -0
- package/test/friends.test.js +128 -0
- package/test/games.test.js +212 -0
- package/test/groups.test.js +311 -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 +68 -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 +2525 -0
- package/typings/jsDocs.ts +1927 -0
@@ -0,0 +1,65 @@
|
|
1
|
+
// Includes
|
2
|
+
const http = require('../util/http.js').func
|
3
|
+
const getGeneralToken = require('../util/getGeneralToken.js').func
|
4
|
+
|
5
|
+
// Args
|
6
|
+
exports.required = ['group']
|
7
|
+
exports.optional = ['message', 'jar']
|
8
|
+
|
9
|
+
// Docs
|
10
|
+
/**
|
11
|
+
* 🔐 Change a group's shout.
|
12
|
+
* @category Group
|
13
|
+
* @alias shout
|
14
|
+
* @param {number} group - The id of the group.
|
15
|
+
* @param {string=} [message=""] - The message to shout
|
16
|
+
* @returns {Promise<GroupShout>}
|
17
|
+
* @example const noblox = require("noblox.js")
|
18
|
+
* // Login using your cookie
|
19
|
+
* noblox.shout(1, "Hello world!")
|
20
|
+
**/
|
21
|
+
|
22
|
+
function shoutOnGroup (group, message = '', jar, xcsrf) {
|
23
|
+
return new Promise((resolve, reject) => {
|
24
|
+
const httpOpt = {
|
25
|
+
url: `https://groups.roblox.com/v1/groups/${group}/status`,
|
26
|
+
options: {
|
27
|
+
method: 'PATCH',
|
28
|
+
resolveWithFullResponse: true,
|
29
|
+
json: {
|
30
|
+
message
|
31
|
+
},
|
32
|
+
jar: jar,
|
33
|
+
headers: {
|
34
|
+
'X-CSRF-TOKEN': xcsrf
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
return http(httpOpt)
|
40
|
+
.then(function (res) {
|
41
|
+
if (res.statusCode === 200) {
|
42
|
+
resolve(res.body)
|
43
|
+
} else {
|
44
|
+
const body = res.body || {}
|
45
|
+
if (body.errors && body.errors.length > 0) {
|
46
|
+
const errors = body.errors.map((e) => {
|
47
|
+
return e.message
|
48
|
+
})
|
49
|
+
reject(new Error(`${res.statusCode} ${errors.join(', ')}`))
|
50
|
+
} else {
|
51
|
+
reject(new Error(`${res.statusCode} ${res.body}`))
|
52
|
+
}
|
53
|
+
}
|
54
|
+
}).catch(error => reject(error))
|
55
|
+
})
|
56
|
+
}
|
57
|
+
|
58
|
+
// Define
|
59
|
+
exports.func = function (args) {
|
60
|
+
const jar = args.jar
|
61
|
+
return getGeneralToken({ jar: jar })
|
62
|
+
.then(function (xcsrf) {
|
63
|
+
return shoutOnGroup(args.group, args.message, args.jar, xcsrf)
|
64
|
+
})
|
65
|
+
}
|
package/lib/index.js
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
const path = require('path')
|
2
|
+
const fs = require('fs')
|
3
|
+
const include = ['cache']
|
4
|
+
|
5
|
+
const noblox = {}
|
6
|
+
|
7
|
+
function search (dir) {
|
8
|
+
require('fs').readdirSync(dir).forEach(function (file) {
|
9
|
+
const stat = fs.statSync(path.join(dir, file))
|
10
|
+
if (stat.isFile() || include.indexOf(file) !== -1) {
|
11
|
+
noblox[file.replace('.js', '')] = require(dir + '/' + file)
|
12
|
+
} else if (stat.isDirectory()) {
|
13
|
+
search(path.join(dir, file))
|
14
|
+
}
|
15
|
+
})
|
16
|
+
}
|
17
|
+
|
18
|
+
search(__dirname)
|
19
|
+
|
20
|
+
for (const name in noblox) {
|
21
|
+
const exporter = noblox[name]
|
22
|
+
if (Object.prototype.hasOwnProperty.call(exporter, 'func')) {
|
23
|
+
module.exports[name] = noblox.wrap.wrapExport(exporter.func, exporter.required || [], exporter.optional || [])
|
24
|
+
} else {
|
25
|
+
module.exports[name] = noblox[name]
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
exports.options = require('./options.js')
|
30
|
+
exports.settings = require('../settings.json')
|
@@ -0,0 +1,16 @@
|
|
1
|
+
// Define
|
2
|
+
function shallowCopy (obj) {
|
3
|
+
return Object.assign(obj instanceof Array ? [] : {}, obj)
|
4
|
+
}
|
5
|
+
|
6
|
+
module.exports = function (obj) {
|
7
|
+
const newObj = shallowCopy(obj)
|
8
|
+
for (const index in obj) {
|
9
|
+
let value = obj[index]
|
10
|
+
if (value instanceof Object) {
|
11
|
+
value = shallowCopy(value)
|
12
|
+
}
|
13
|
+
newObj[index] = value
|
14
|
+
}
|
15
|
+
return newObj
|
16
|
+
}
|
@@ -0,0 +1,61 @@
|
|
1
|
+
// Includes
|
2
|
+
const options = require('../options.js')
|
3
|
+
|
4
|
+
// Define
|
5
|
+
module.exports = function (type, index, func, handler) {
|
6
|
+
const group = options.queue[type]
|
7
|
+
if (!group[index]) {
|
8
|
+
group[index] = {
|
9
|
+
jobs: []
|
10
|
+
}
|
11
|
+
}
|
12
|
+
const home = group[index]
|
13
|
+
function run (time) {
|
14
|
+
return function (resolve, reject) {
|
15
|
+
setTimeout(function () {
|
16
|
+
func().then(resolve).catch(reject)
|
17
|
+
}, time)
|
18
|
+
}
|
19
|
+
}
|
20
|
+
const jobs = home.jobs
|
21
|
+
function deactivate (err) {
|
22
|
+
jobs.shift()
|
23
|
+
if (!handler(err)) {
|
24
|
+
home.last = Date.now()
|
25
|
+
}
|
26
|
+
}
|
27
|
+
function next () {
|
28
|
+
jobs.shift()
|
29
|
+
home.last = Date.now()
|
30
|
+
}
|
31
|
+
if (group.delay > 0) {
|
32
|
+
const delay = group.delay
|
33
|
+
const last = home.last
|
34
|
+
if (jobs.length === 0) {
|
35
|
+
let item
|
36
|
+
const diff = Date.now() - last
|
37
|
+
if (!last || diff > delay) {
|
38
|
+
item = func()
|
39
|
+
} else {
|
40
|
+
item = new Promise(run(delay - diff))
|
41
|
+
}
|
42
|
+
jobs.push(item)
|
43
|
+
item.then(next).catch(deactivate)
|
44
|
+
return item
|
45
|
+
} else {
|
46
|
+
const job = jobs[jobs.length - 1].then(function () {
|
47
|
+
const item = new Promise(run(delay))
|
48
|
+
item.then(next).catch(deactivate)
|
49
|
+
return item
|
50
|
+
}).catch(function (err) {
|
51
|
+
const item = handler && handler(err) ? func() : new Promise(run(delay))
|
52
|
+
item.then(next).catch(deactivate)
|
53
|
+
return item
|
54
|
+
})
|
55
|
+
jobs.push(job)
|
56
|
+
return job
|
57
|
+
}
|
58
|
+
} else {
|
59
|
+
return func()
|
60
|
+
}
|
61
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class TimeoutError extends Error {
|
2
|
+
}
|
3
|
+
|
4
|
+
/**
|
5
|
+
* A basic replacement for the Bluebird 'timeout' method. Returns a Promise which will resolve or reject with the result of the given
|
6
|
+
* promise once it resolves, or reject if the promise should fail to resolve within the supplied timeout. An optional reason
|
7
|
+
* can also be supplied.
|
8
|
+
* @param promise - The Promise to apply a timeout to.
|
9
|
+
* @param timeoutTime - The timeout to apply to the Promise.
|
10
|
+
* @param reason - Optional String reason for the timeout.
|
11
|
+
* @returns {Promise<unknown>}
|
12
|
+
*/
|
13
|
+
function timeout (promise, timeoutTime, reason = 'operation timed out') {
|
14
|
+
let timer
|
15
|
+
|
16
|
+
const timeoutPromise = new Promise(function (resolve, reject) {
|
17
|
+
timer = setTimeout(function () {
|
18
|
+
return reject(new TimeoutError(reason))
|
19
|
+
}, timeoutTime)
|
20
|
+
})
|
21
|
+
|
22
|
+
// We return the first promise to complete. If it resolves normally, the normal promise completed - so we cancel the timer
|
23
|
+
// to prevent any unnecessary hanging waiting for timeout timers.
|
24
|
+
return Promise.race([promise, timeoutPromise])
|
25
|
+
.finally(function () {
|
26
|
+
clearTimeout(timer)
|
27
|
+
})
|
28
|
+
}
|
29
|
+
|
30
|
+
module.exports = timeout
|
@@ -0,0 +1,78 @@
|
|
1
|
+
/*
|
2
|
+
const args = ['jar', 'username', 'password']
|
3
|
+
|
4
|
+
raw function login (jar, username, password)
|
5
|
+
|
6
|
+
exported function login ()
|
7
|
+
check number of arguments if necessary
|
8
|
+
options object: login(arguments[0])
|
9
|
+
individual arguments:
|
10
|
+
for each argument add to an options array corresponding with argument order
|
11
|
+
login(options)
|
12
|
+
*/
|
13
|
+
// Define
|
14
|
+
exports.wrapExport = function (wrapFunction, required, optional) {
|
15
|
+
const reqLength = required.length
|
16
|
+
if ((reqLength + optional.length) > 0) {
|
17
|
+
return function () {
|
18
|
+
let options = {}
|
19
|
+
const length = arguments.length
|
20
|
+
let assume = false
|
21
|
+
if (length > 0) {
|
22
|
+
const first = arguments[0]
|
23
|
+
let collectOptions = true
|
24
|
+
if (length === 1 && (first instanceof Object)) {
|
25
|
+
assume = true
|
26
|
+
const firstArg = required[0] || optional
|
27
|
+
if (firstArg && firstArg instanceof Object) {
|
28
|
+
for (let i = 0; i < firstArg.length; i++) {
|
29
|
+
if (first[firstArg[i]]) {
|
30
|
+
options = first
|
31
|
+
collectOptions = false
|
32
|
+
break
|
33
|
+
}
|
34
|
+
}
|
35
|
+
} else if (firstArg && first[firstArg]) {
|
36
|
+
options = first
|
37
|
+
collectOptions = false
|
38
|
+
}
|
39
|
+
}
|
40
|
+
if (collectOptions) {
|
41
|
+
for (let i = 0; i <= length; i++) {
|
42
|
+
const list = (i >= reqLength ? optional : required)
|
43
|
+
const index = list[(i >= reqLength ? (i - reqLength) : i)]
|
44
|
+
if (index instanceof Object) {
|
45
|
+
options[index[0]] = arguments[i]
|
46
|
+
} else {
|
47
|
+
options[index] = arguments[i]
|
48
|
+
}
|
49
|
+
}
|
50
|
+
}
|
51
|
+
}
|
52
|
+
for (let i = 0; i < reqLength; i++) {
|
53
|
+
const arg = required[i]
|
54
|
+
let found = false
|
55
|
+
if (arg instanceof Object) {
|
56
|
+
for (let k = 0; k <= arg.length; k++) {
|
57
|
+
if (options[arg[k]] != null) {
|
58
|
+
found = true
|
59
|
+
break
|
60
|
+
}
|
61
|
+
}
|
62
|
+
} else if (options[arg] != null) {
|
63
|
+
found = true
|
64
|
+
}
|
65
|
+
if (!found) {
|
66
|
+
if (assume) {
|
67
|
+
throw new Error('A required argument is missing')
|
68
|
+
} else {
|
69
|
+
throw new Error('Required argument "' + (arg instanceof Object ? arg.join('/') : arg) + '" is missing')
|
70
|
+
}
|
71
|
+
}
|
72
|
+
}
|
73
|
+
return wrapFunction(options)
|
74
|
+
}
|
75
|
+
} else {
|
76
|
+
return wrapFunction
|
77
|
+
}
|
78
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
// Includes
|
2
|
+
const getPageResults = require('../util/getPageResults.js').func
|
3
|
+
|
4
|
+
// Args
|
5
|
+
exports.required = ['userId']
|
6
|
+
exports.optional = ['assetType', 'sortOrder', 'limit', 'jar']
|
7
|
+
|
8
|
+
// Docs
|
9
|
+
/**
|
10
|
+
* 🔓 Get a user's collectibles.
|
11
|
+
* @category User
|
12
|
+
* @alias getCollectibles
|
13
|
+
* @param {number} userId - The id of the user whose collectibles are being retrieved.
|
14
|
+
* @param {SortOrder=} [sortOrder=Asc] - The order that the collectibles will bee sorted by (Asc or Desc)
|
15
|
+
* @param {string=} assetType - The asset type for the collectibles you're trying to get.
|
16
|
+
* @param {number} [limit=10] - The amount of results per request.
|
17
|
+
* @returns {Promise<CollectibleEntry[]>}
|
18
|
+
* @example const noblox = require("noblox.js")
|
19
|
+
* let collectibles = await noblox.getCollectibles({userId: 123456, sortOrder: "Asc", limit: 100})
|
20
|
+
**/
|
21
|
+
|
22
|
+
// Define
|
23
|
+
exports.func = function (args) {
|
24
|
+
return getPageResults({
|
25
|
+
jar: args.jar,
|
26
|
+
url: `//inventory.roblox.com/v1/users/${args.userId}/assets/collectibles`,
|
27
|
+
query: { assetType: args.assetType },
|
28
|
+
sortOrder: args.sortOrder,
|
29
|
+
limit: args.limit
|
30
|
+
})
|
31
|
+
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
// Includes
|
2
|
+
const getPageResults = require('../util/getPageResults.js').func
|
3
|
+
|
4
|
+
// Args
|
5
|
+
exports.required = ['userId', 'assetTypes']
|
6
|
+
exports.optional = ['sortOrder', 'limit', 'jar']
|
7
|
+
|
8
|
+
// Docs
|
9
|
+
/**
|
10
|
+
* 🔓 Get a user's inventory.
|
11
|
+
* NOTE: Badges must use [getPlayerBadges()]{@link https://noblox.js.org/global.html#getPlayerBadges} due to an issue with Roblox's API.
|
12
|
+
* @category User
|
13
|
+
* @alias getInventory
|
14
|
+
* @param {number} userId - The id of user whose inventory is being returned.
|
15
|
+
* @param {Array<string>} assetTypes - The types of assets being retrieved: [("Shirt", "Pants")]{@link https://developer.roblox.com/en-us/api-reference/enum/AssetType}.
|
16
|
+
* @param {SortOrder=} [sortOrder=Asc] - The order that the data will be returned in (Asc or Desc)
|
17
|
+
* @param {Limit=} [limit=10] - The number of assets returned in each request (10, 25, 50, or 100)
|
18
|
+
* @returns {Promise<InventoryEntry[]>}
|
19
|
+
* @example const noblox = require("noblox.js")
|
20
|
+
* let inventory = await noblox.getInventory({userId: 123456, assetTypes: ["Shirt"], sortOrder: "Asc", limit: 100})
|
21
|
+
**/
|
22
|
+
|
23
|
+
// Define
|
24
|
+
exports.func = function (args) {
|
25
|
+
return getPageResults({
|
26
|
+
jar: args.jar,
|
27
|
+
url: `//inventory.roblox.com/v2/users/${args.userId}/inventory`,
|
28
|
+
query: { assetTypes: args.assetTypes.join(',') },
|
29
|
+
sortOrder: args.sortOrder,
|
30
|
+
limit: args.limit
|
31
|
+
})
|
32
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
// Includes
|
2
|
+
const getPageResults = require('../util/getPageResults.js').func
|
3
|
+
|
4
|
+
// Args
|
5
|
+
exports.required = ['userId', 'assetTypeId']
|
6
|
+
exports.optional = ['sortOrder', 'limit', 'jar']
|
7
|
+
|
8
|
+
// Docs
|
9
|
+
/**
|
10
|
+
* 🔓 Get a user's inventory.
|
11
|
+
* @category User
|
12
|
+
* @alias getInventoryById
|
13
|
+
* @param {number} userId - The id of user whose inventory is being returned.
|
14
|
+
* @param {Array<number>} assetTypeId - The types of assets being retrieved: [(11, 12)]{@link https://developer.roblox.com/en-us/api-reference/enum/AssetType}.
|
15
|
+
* @param {SortOrder=} [sortOrder=Asc] - The order that the data will be returned in (Asc or Desc)
|
16
|
+
* @param {Limit=} [limit=10] - The number of assets returned in each request (10, 25, 50, or 100)
|
17
|
+
* @returns {Promise<InventoryEntry[]>}
|
18
|
+
* @example const noblox = require("noblox.js")
|
19
|
+
* let inventory = await noblox.getInventoryById({userId: 123456, assetTypeId: 2, sortOrder: "Asc", limit: 100})
|
20
|
+
**/
|
21
|
+
|
22
|
+
// Define
|
23
|
+
exports.func = function (args) {
|
24
|
+
return getPageResults({
|
25
|
+
jar: args.jar,
|
26
|
+
url: `//inventory.roblox.com/v2/users/${args.userId}/inventory/${args.assetTypeId}`,
|
27
|
+
query: {},
|
28
|
+
sortOrder: args.sortOrder,
|
29
|
+
limit: args.limit
|
30
|
+
})
|
31
|
+
}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
// Includes
|
2
|
+
const http = require('../util/http.js').func
|
3
|
+
|
4
|
+
// Args
|
5
|
+
exports.required = ['userId', 'itemTargetId']
|
6
|
+
exports.optional = ['itemType']
|
7
|
+
|
8
|
+
// Docs
|
9
|
+
/**
|
10
|
+
* ✅ Check if the user owns the asset.
|
11
|
+
* @category User
|
12
|
+
* @alias getOwnership
|
13
|
+
* @param {number} userId - The id of the user whose ownership is being checked.
|
14
|
+
* @param {number} itemTargetId - The id of the item.
|
15
|
+
* @param {("Asset" | "GamePass" | "Badge" | "Bundle")=} [itemType=Asset] - The type of item in question (Asset, GamePass, Badge, Bundle)
|
16
|
+
* @returns {Promise<boolean>}
|
17
|
+
* @example const noblox = require("noblox.js")
|
18
|
+
* let ownership = await noblox.getOwnership(123456, 234567, "GamePass")
|
19
|
+
**/
|
20
|
+
|
21
|
+
// Define
|
22
|
+
function getOwnership (userId, itemTargetId, itemType) {
|
23
|
+
return new Promise((resolve, reject) => {
|
24
|
+
const httpOpt = {
|
25
|
+
url: `//inventory.roblox.com/v1/users/${userId}/items/${itemType}/${itemTargetId}`,
|
26
|
+
options: {
|
27
|
+
method: 'GET',
|
28
|
+
resolveWithFullResponse: true
|
29
|
+
}
|
30
|
+
}
|
31
|
+
return http(httpOpt)
|
32
|
+
.then(function (res) {
|
33
|
+
if (res.statusCode === 200) {
|
34
|
+
const body = JSON.parse(res.body)
|
35
|
+
resolve(body.data.length > 0)
|
36
|
+
} else {
|
37
|
+
const body = JSON.parse(res.body) || {}
|
38
|
+
if (body.errors && body.errors.length > 0) {
|
39
|
+
const errors = body.errors.map((e) => {
|
40
|
+
return e.message
|
41
|
+
})
|
42
|
+
reject(new Error(`${res.statusCode} ${errors.join(', ')}`))
|
43
|
+
} else {
|
44
|
+
reject(new Error(`${res.statusCode} ${res.body}`))
|
45
|
+
}
|
46
|
+
}
|
47
|
+
})
|
48
|
+
})
|
49
|
+
}
|
50
|
+
|
51
|
+
exports.func = function (args) {
|
52
|
+
const itemType = args.itemType || 'Asset'
|
53
|
+
return getOwnership(args.userId, args.itemTargetId, itemType)
|
54
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
// Includes
|
2
|
+
const getCollectibles = require('./getCollectibles.js').func
|
3
|
+
|
4
|
+
// Args
|
5
|
+
exports.required = ['userId', 'assetIds']
|
6
|
+
exports.optional = ['exclusionList', 'jar']
|
7
|
+
|
8
|
+
// Docs
|
9
|
+
/**
|
10
|
+
* ✅ Get a UserAssetID for a specific asset.
|
11
|
+
* @category User
|
12
|
+
* @alias getUAIDs
|
13
|
+
* @param {number} userId - The id of the user to search.
|
14
|
+
* @param {Array<number>} assetIds - The ids of the assets to retrieve.
|
15
|
+
* @param {Array<number>=} exclusionList - The UAIDs to exclude from the search.
|
16
|
+
* @returns {Promise<UAIDResponse>}
|
17
|
+
* @example const noblox = require("noblox.js")
|
18
|
+
* const UAIDInfo = await noblox.getUAIDs(80231025, [1974901902, 4255053867, 2705893733, 1532395])
|
19
|
+
**/
|
20
|
+
|
21
|
+
// Define
|
22
|
+
function getUAIDs (userId, requestedIds, excludedIds) {
|
23
|
+
return new Promise((resolve) => {
|
24
|
+
getCollectibles({ userId: userId }).then(function (collectibles) {
|
25
|
+
const retrievedIds = []
|
26
|
+
|
27
|
+
for (let index = 0; index < collectibles.length; index++) {
|
28
|
+
const collectible = collectibles[index]
|
29
|
+
const requestIndex = requestedIds.indexOf(collectible.assetId)
|
30
|
+
|
31
|
+
if (requestIndex > -1 && excludedIds.indexOf(collectible.userAssetId) === -1) {
|
32
|
+
requestedIds.splice(requestIndex, 1)
|
33
|
+
retrievedIds.push(collectible.userAssetId)
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
resolve({
|
38
|
+
uaids: retrievedIds,
|
39
|
+
failedIds: requestedIds
|
40
|
+
})
|
41
|
+
})
|
42
|
+
})
|
43
|
+
}
|
44
|
+
|
45
|
+
exports.func = function (args) {
|
46
|
+
return getUAIDs(args.userId, args.assetIds, args.exclusionList || [])
|
47
|
+
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
// Includes
|
2
|
+
const getPageResults = require('../util/getPageResults.js').func
|
3
|
+
|
4
|
+
// Args
|
5
|
+
exports.required = ['groupId', 'assetType']
|
6
|
+
exports.optional = ['sortOrder', 'limit', 'jar']
|
7
|
+
|
8
|
+
// Docs
|
9
|
+
/**
|
10
|
+
* 🔐 Get assets for a group.
|
11
|
+
* @category Group
|
12
|
+
* @alias getGroupAssets
|
13
|
+
* @param {number} groupId - The id of the group.
|
14
|
+
* @param {String} assetType - The type of asset being retrieved: [("Shirt", "Pants")]{@link https://developer.roblox.com/en-us/api-reference/enum/AssetType}.
|
15
|
+
* @param {SortOrder=} [sortOrder=Asc] - The order results are sorted in.
|
16
|
+
* @param {Limit=} [limit=∞] - The maximum number of assets to return
|
17
|
+
* @returns {Promise<GroupAssetInfo[]>}
|
18
|
+
* @example const noblox = require("noblox.js")
|
19
|
+
* // Login using your cookie
|
20
|
+
* const groupModels = await noblox.getGroupAssets({groupId: 1, assetType: 'Model', sortOrder: 'Asc', limit: '100'})
|
21
|
+
**/
|
22
|
+
|
23
|
+
// Define
|
24
|
+
exports.func = function (args) {
|
25
|
+
return getPageResults({
|
26
|
+
jar: args.jar,
|
27
|
+
url: '//itemconfiguration.roblox.com/v1/creations/get-assets',
|
28
|
+
query: { assetType: args.assetType, groupId: args.groupId },
|
29
|
+
sortOrder: args.sortOrder || 'Asc',
|
30
|
+
limit: args.limit
|
31
|
+
})
|
32
|
+
}
|
package/lib/options.js
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
// Includes
|
2
|
+
const settings = require('../settings.json')
|
3
|
+
const jar = require('./util/jar.js').func
|
4
|
+
const newCache = require('./cache/new.js')
|
5
|
+
|
6
|
+
// Define
|
7
|
+
exports.init = function () {
|
8
|
+
exports.jar = jar()
|
9
|
+
|
10
|
+
const cacheList = []
|
11
|
+
const cache = settings.cache
|
12
|
+
for (const name of Object.keys(cache)) {
|
13
|
+
const item = cache[name]
|
14
|
+
const cacheObj = {
|
15
|
+
name: name,
|
16
|
+
refresh: item.refresh,
|
17
|
+
expire: item.expire
|
18
|
+
}
|
19
|
+
cacheList.push(cacheObj)
|
20
|
+
}
|
21
|
+
exports.cache = newCache(cacheList)
|
22
|
+
|
23
|
+
exports.queue = settings.queue
|
24
|
+
}
|
25
|
+
|
26
|
+
exports.init()
|
@@ -0,0 +1,53 @@
|
|
1
|
+
const events = require('events')
|
2
|
+
|
3
|
+
const onNotification = require('../client/onNotification.js').func
|
4
|
+
|
5
|
+
exports.optional = ['jar']
|
6
|
+
|
7
|
+
// Docs
|
8
|
+
/**
|
9
|
+
* 🔐 An event for when a party is deleted.
|
10
|
+
* @category Party
|
11
|
+
* @alias onPartyDeleted
|
12
|
+
* @returns An EventEmitter that emits when a party is deleted.
|
13
|
+
* @example const noblox = require("noblox.js")
|
14
|
+
* // Login using your cookie
|
15
|
+
* const partyDeleted = noblox.onPartyDeleted()
|
16
|
+
* partyDeleted.on("data", function(data) {
|
17
|
+
* console.log("Party deleted! ", data)
|
18
|
+
* })
|
19
|
+
* partyDeleted.on("error", function(err) {
|
20
|
+
* console.error("Something went wrong: ", err)
|
21
|
+
* // Handle error as needed
|
22
|
+
* })
|
23
|
+
**/
|
24
|
+
|
25
|
+
exports.func = (args) => {
|
26
|
+
const jar = args.jar
|
27
|
+
const newEvent = new events.EventEmitter()
|
28
|
+
const notifications = onNotification({ jar: jar })
|
29
|
+
|
30
|
+
notifications.on('data', (name, message) => {
|
31
|
+
if (name === 'PartyNotifications' && message.Type === 'PartyDeleted') {
|
32
|
+
newEvent.emit('data', {
|
33
|
+
PartyId: message.PartyId,
|
34
|
+
PartyType: message.PartyType
|
35
|
+
})
|
36
|
+
}
|
37
|
+
})
|
38
|
+
|
39
|
+
notifications.on('error', (err) => {
|
40
|
+
newEvent.emit('error', err)
|
41
|
+
})
|
42
|
+
|
43
|
+
notifications.on('connect', () => {
|
44
|
+
newEvent.emit('connect')
|
45
|
+
})
|
46
|
+
|
47
|
+
notifications.on('close', (internal) => {
|
48
|
+
if (internal) return
|
49
|
+
notifications.emit('close', true)
|
50
|
+
})
|
51
|
+
|
52
|
+
return newEvent
|
53
|
+
}
|
@@ -0,0 +1,53 @@
|
|
1
|
+
const events = require('events')
|
2
|
+
|
3
|
+
const onNotification = require('../client/onNotification.js').func
|
4
|
+
|
5
|
+
exports.optional = ['jar']
|
6
|
+
|
7
|
+
// Docs
|
8
|
+
/**
|
9
|
+
* 🔐 An event for when you're invited to a party.
|
10
|
+
* @category Party
|
11
|
+
* @alias onPartyInvite
|
12
|
+
* @returns An EventEmitter that emits when you're invited to a party.
|
13
|
+
* @example const noblox = require("noblox.js")
|
14
|
+
* // Login using your cookie
|
15
|
+
* const partyInvite = noblox.onPartyInvite()
|
16
|
+
* partyInvite.on("data", function(data) {
|
17
|
+
* console.log("Invited to party! ", data)
|
18
|
+
* })
|
19
|
+
* partyInvite.on("error", function(err) {
|
20
|
+
* console.error("Something went wrong: ", err)
|
21
|
+
* // Handle error as needed
|
22
|
+
* })
|
23
|
+
**/
|
24
|
+
|
25
|
+
exports.func = (args) => {
|
26
|
+
const jar = args.jar
|
27
|
+
const newEvent = new events.EventEmitter()
|
28
|
+
const notifications = onNotification({ jar: jar })
|
29
|
+
|
30
|
+
notifications.on('data', (name, message) => {
|
31
|
+
if (name === 'PartyNotifications' && message.Type === 'InvitedToParty') {
|
32
|
+
newEvent.emit('data', {
|
33
|
+
PartyId: message.PartyId,
|
34
|
+
PartyType: message.PartyType
|
35
|
+
})
|
36
|
+
}
|
37
|
+
})
|
38
|
+
|
39
|
+
notifications.on('error', (err) => {
|
40
|
+
newEvent.emit('error', err)
|
41
|
+
})
|
42
|
+
|
43
|
+
notifications.on('connect', () => {
|
44
|
+
newEvent.emit('connect')
|
45
|
+
})
|
46
|
+
|
47
|
+
notifications.on('close', (internal) => {
|
48
|
+
if (internal) return
|
49
|
+
notifications.emit('close', true)
|
50
|
+
})
|
51
|
+
|
52
|
+
return newEvent
|
53
|
+
}
|