From 229a2ad9e87f6b31f42b5f5dd91a85754f3ce220 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Tue, 24 Sep 2024 05:51:15 +0000 Subject: [PATCH 01/19] Add UsernameHistoryEntry type --- typings/index.d.ts | 4 ++++ typings/jsDocs.ts | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/typings/index.d.ts b/typings/index.d.ts index 5f12970f..8b84c314 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1096,6 +1096,10 @@ declare module "noblox.js" { displayName: string; } + interface UsernameHistoryEntry { + name: string; + } + interface PrivateMessageParent { page: number; } diff --git a/typings/jsDocs.ts b/typings/jsDocs.ts index 6a85a8a3..fc40c351 100644 --- a/typings/jsDocs.ts +++ b/typings/jsDocs.ts @@ -1509,6 +1509,13 @@ type UserEntry = { displayName: string; } +/** + * @typedef +*/ +type UsernameHistoryEntry = { + name: string; +} + /** * @typedef */ From 529bef5449cc109173bd8b984b3dd094c707156c Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Tue, 24 Sep 2024 05:52:13 +0000 Subject: [PATCH 02/19] Create getUsernameHistory method --- lib/index.js | 1 + lib/users/getUsernameHistory.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 lib/users/getUsernameHistory.js diff --git a/lib/index.js b/lib/index.js index bd6063b3..b7fe99c3 100644 --- a/lib/index.js +++ b/lib/index.js @@ -168,6 +168,7 @@ noblox.getBlurb = require('./users/getBlurb.js') noblox.getIdFromUsername = require('./users/getIdFromUsername.js') noblox.getPlayerInfo = require('./users/getPlayerInfo.js') noblox.getUsernameFromId = require('./users/getUsernameFromId.js') +noblox.getUsernameHistory = require('./users/getUsernameHistory.js') noblox.onBlurbChange = require('./users/onBlurbChange.js') noblox.clearSession = require('./util/clearSession.js') noblox.generalRequest = require('./util/generalRequest.js') diff --git a/lib/users/getUsernameHistory.js b/lib/users/getUsernameHistory.js new file mode 100644 index 00000000..8e9214f5 --- /dev/null +++ b/lib/users/getUsernameHistory.js @@ -0,0 +1,31 @@ +// Includes +const getPageResults = require('../util/getPageResults.js').func + +// Args +exports.required = ['userId'] +exports.optional = ['limit', 'sortOrder', 'pageCursor'] + +// Docs +/** + * ✅ Get a user's username history. + * @category User + * @alias getUsernameHistory + * @param { number } userId + * @param { number } [limit=10] + * @param { SortOrder= } [sortOrder=Asc] + * @param { string } cursor + * @returns {Promise} + * @example const noblox = require("noblox.js") + * const history = await noblox.getUsernameHistory(1, 10, "Asc", "cursorstring") +**/ + +// Define +exports.func = function (args) { + return getPageResults({ + url: `//users.roblox.com/v1/users/${args.userId}/username-history`, + query: {}, + limit: args.limit, + pageCursor: args.pageCursor, + sortOrder: args.sortOrder + }) +} From 77518981de42c7d64680265393c5a6f04e2754e6 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Tue, 24 Sep 2024 05:58:36 +0000 Subject: [PATCH 03/19] Add test for getUsernameHistory --- test/users.test.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/test/users.test.js b/test/users.test.js index 8d9be36c..1acc5430 100644 --- a/test/users.test.js +++ b/test/users.test.js @@ -1,4 +1,5 @@ -const { getBlurb, getIdFromUsername, getPlayerInfo, getUsernameFromId, setCookie } = require('../lib') +const { it } = require('node:test') +const { getBlurb, getIdFromUsername, getPlayerInfo, getUsernameFromId, getUsernameHistory, setCookie } = require('../lib') beforeAll(() => { return new Promise(resolve => { @@ -65,4 +66,18 @@ describe('Users Methods', () => { return expect(res).toEqual(expect.any(String)) }) }) + + it('getUsernameHistory() returns a player\'s username history', () => { + return getUsernameHistory(55549140).then((res) => { + return expect(res).toMatchObject({ + previousPageCursor: expect.toBeOneOf([expect.any(String), null]), + nextPageCursor: expect.toBeOneOf([expect.any(String), null]), + data: expect.arrayContaining([ + expect.objectContaining({ + name: expect.any(String) + }) + ]) + }) + }) + }) }) From 9b98cffc2ab5a944a5ed0937185cfb4f53408ae3 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Tue, 1 Oct 2024 04:24:47 +0000 Subject: [PATCH 04/19] Fix getUsernameHistory test --- test/users.test.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/test/users.test.js b/test/users.test.js index 1acc5430..147e6c50 100644 --- a/test/users.test.js +++ b/test/users.test.js @@ -69,15 +69,13 @@ describe('Users Methods', () => { it('getUsernameHistory() returns a player\'s username history', () => { return getUsernameHistory(55549140).then((res) => { - return expect(res).toMatchObject({ - previousPageCursor: expect.toBeOneOf([expect.any(String), null]), - nextPageCursor: expect.toBeOneOf([expect.any(String), null]), - data: expect.arrayContaining([ + return expect(res).toMatchObject( + expect.arrayContaining([ expect.objectContaining({ name: expect.any(String) }) ]) - }) + ) }) }) }) From 888af602687227dfc8ed26157c69d39b880b6178 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Tue, 1 Oct 2024 04:25:02 +0000 Subject: [PATCH 05/19] Add getFollowerCount method --- lib/friends/getFollowerCount.js | 43 +++++++++++++++++++++++++++++++++ test/friends.test.js | 8 +++++- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 lib/friends/getFollowerCount.js diff --git a/lib/friends/getFollowerCount.js b/lib/friends/getFollowerCount.js new file mode 100644 index 00000000..3eed474f --- /dev/null +++ b/lib/friends/getFollowerCount.js @@ -0,0 +1,43 @@ +// Includes +const http = require('../util/http.js') + +// Args +exports.required = ['userId'] +exports.optional = ['jar'] + +// Docs +/** + * ✅ Gets the number of followers a user has. + * @category User + * @alias getFollowerCount + * @param { number } userId + * @returns Promise + * @example const noblox = require("noblox.js") + * const numberOfFollowers = await noblox.getFollowerCount(55549140) +**/ + +// Define +function getFollowerCount(jar, userId) { + const httpOpt = { + url: `//friends.roblox.com/v1/users/${userId}/followers/count`, + options: { + jar, + json: true, + method: 'GET', + resolveWithFullResponse: true + } + } + + return http(httpOpt).then(function (res) { + if (res.statusCode === 200) + return res.body.count + + throw new Error( + `Failed to retrieve follower count: (${res.statusCode}) ${res.body}` + ) + }) +} + +exports.func = function (args) { + return getFollowerCount(args.jar, args.userId) +} diff --git a/test/friends.test.js b/test/friends.test.js index fa734f5d..2d197d50 100644 --- a/test/friends.test.js +++ b/test/friends.test.js @@ -1,4 +1,4 @@ -const { acceptFriendRequest, declineAllFriendRequests, declineFriendRequest, getFollowers, getFollowings, getFriendRequests, getFriends, removeFriend, sendFriendRequest, unfollow, setCookie } = require('../lib') +const { acceptFriendRequest, declineAllFriendRequests, declineFriendRequest, getFollowerCount, getFollowers, getFollowings, getFriendRequests, getFriends, removeFriend, sendFriendRequest, unfollow, setCookie } = require('../lib') beforeAll(() => { return new Promise(resolve => { @@ -32,6 +32,12 @@ describe('Friends Methods', () => { return await expect(unfollow(55549140)).resolves.not.toThrow() }) + it('getFollowerCount() returns the number of user\'s followers', () => { + return getFollowerCount(55549140).then((res) => { + return expect(res).toBeGreaterThanOrEqual(0) + }) + }) + it('getFollowers() returns a user\'s followers', () => { return getFollowers(55549140).then((res) => { return expect(res).toMatchObject({ From d94edb75dbe0fbf4e8289f3d0900654eea209426 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Tue, 1 Oct 2024 04:28:35 +0000 Subject: [PATCH 06/19] Add getFollowingCount --- lib/friends/getFollowingCount.js | 43 ++++++++++++++++++++++++++++++++ test/friends.test.js | 8 +++++- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 lib/friends/getFollowingCount.js diff --git a/lib/friends/getFollowingCount.js b/lib/friends/getFollowingCount.js new file mode 100644 index 00000000..5b538ff0 --- /dev/null +++ b/lib/friends/getFollowingCount.js @@ -0,0 +1,43 @@ +// Includes +const http = require('../util/http.js') + +// Args +exports.required = ['userId'] +exports.optional = ['jar'] + +// Docs +/** + * ✅ Gets the number of users a user is following. + * @category User + * @alias getFollowingCount + * @param { number } userId + * @returns Promise + * @example const noblox = require("noblox.js") + * const numberOfFollowings = await noblox.getFollowingCount(55549140) +**/ + +// Define +function getFollowingCount(jar, userId) { + const httpOpt = { + url: `//friends.roblox.com/v1/users/${userId}/followings/count`, + options: { + jar, + json: true, + method: 'GET', + resolveWithFullResponse: true + } + } + + return http(httpOpt).then(function (res) { + if (res.statusCode === 200) + return res.body.count + + throw new Error( + `Failed to retrieve following count: (${res.statusCode}) ${res.body}` + ) + }) +} + +exports.func = function (args) { + return getFollowingCount(args.jar, args.userId) +} diff --git a/test/friends.test.js b/test/friends.test.js index 2d197d50..a0074592 100644 --- a/test/friends.test.js +++ b/test/friends.test.js @@ -1,4 +1,4 @@ -const { acceptFriendRequest, declineAllFriendRequests, declineFriendRequest, getFollowerCount, getFollowers, getFollowings, getFriendRequests, getFriends, removeFriend, sendFriendRequest, unfollow, setCookie } = require('../lib') +const { acceptFriendRequest, declineAllFriendRequests, declineFriendRequest, getFollowerCount, getFollowers, getFollowingCount, getFollowings, getFriendRequests, getFriends, removeFriend, sendFriendRequest, unfollow, setCookie } = require('../lib') beforeAll(() => { return new Promise(resolve => { @@ -54,6 +54,12 @@ describe('Friends Methods', () => { }) }) + it('getFollowingCount() returns the number of users that are following the user', () => { + return getFollowingCount(55549140).then((res) => { + return expect(res).toBeGreaterThanOrEqual(0) + }) + }) + it('getFollowings() returns which users are being followed by the specified user', () => { return getFollowings(55549140).then((res) => { return expect(res).toMatchObject({ From 2302dd3a068797037f91b8275b8f36cfce338c70 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Tue, 1 Oct 2024 04:43:01 +0000 Subject: [PATCH 07/19] Add getFriendCount method --- lib/friends/getFriendCount.js | 43 +++++++++++++++++++++++++++++++++++ test/friends.test.js | 8 ++++++- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 lib/friends/getFriendCount.js diff --git a/lib/friends/getFriendCount.js b/lib/friends/getFriendCount.js new file mode 100644 index 00000000..a1a17de9 --- /dev/null +++ b/lib/friends/getFriendCount.js @@ -0,0 +1,43 @@ +// Includes +const http = require('../util/http.js') + +// Args +exports.required = ['userId'] +exports.optional = ['jar'] + +// Docs +/** + * ✅ Gets the number of friends a user has. + * @category User + * @alias getFriendCount + * @param { number } userId + * @returns Promise + * @example const noblox = require("noblox.js") + * const numberOfFriends = await noblox.getFriendCount(55549140) +**/ + +// Define +function getFriendCount(jar, userId) { + const httpOpt = { + url: `//friends.roblox.com/v1/users/${userId}/friends/count`, + options: { + jar, + json: true, + method: 'GET', + resolveWithFullResponse: true + } + } + + return http(httpOpt).then(function (res) { + if (res.statusCode === 200) + return res.body.count + + throw new Error( + `Failed to retrieve friend count: (${res.statusCode}) ${res.body}` + ) + }) +} + +exports.func = function (args) { + return getFriendCount(args.jar, args.userId) +} diff --git a/test/friends.test.js b/test/friends.test.js index a0074592..69bced3b 100644 --- a/test/friends.test.js +++ b/test/friends.test.js @@ -1,4 +1,4 @@ -const { acceptFriendRequest, declineAllFriendRequests, declineFriendRequest, getFollowerCount, getFollowers, getFollowingCount, getFollowings, getFriendRequests, getFriends, removeFriend, sendFriendRequest, unfollow, setCookie } = require('../lib') +const { acceptFriendRequest, declineAllFriendRequests, declineFriendRequest, getFollowerCount, getFollowers, getFollowingCount, getFollowings, getFriendCount, getFriendRequests, getFriends, removeFriend, sendFriendRequest, unfollow, setCookie } = require('../lib') beforeAll(() => { return new Promise(resolve => { @@ -76,6 +76,12 @@ describe('Friends Methods', () => { }) }) + it('getFriendCount() returns the number of friends the specified user has', () => { + return getFriendCount(55549140).then((res) => { + return expect(res).toBeGreaterThanOrEqual(0) + }) + }) + it('getFriendRequests() returns the logged in user\'s incoming friend requests', () => { return getFriendRequests().then((res) => { return expect(res).toMatchObject({ From 6898c813ea42770e54894f99985fa3b98c8dac29 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Mon, 7 Oct 2024 19:30:53 +0000 Subject: [PATCH 08/19] Create getUserInfo method --- lib/index.js | 1 + lib/users/getUserInfo.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 lib/users/getUserInfo.js diff --git a/lib/index.js b/lib/index.js index b7fe99c3..47d9c0c8 100644 --- a/lib/index.js +++ b/lib/index.js @@ -167,6 +167,7 @@ noblox.sendTrade = require('./trades/sendTrade.js') noblox.getBlurb = require('./users/getBlurb.js') noblox.getIdFromUsername = require('./users/getIdFromUsername.js') noblox.getPlayerInfo = require('./users/getPlayerInfo.js') +noblox.getUserInfo = require('./users/getUserInfo.js') noblox.getUsernameFromId = require('./users/getUsernameFromId.js') noblox.getUsernameHistory = require('./users/getUsernameHistory.js') noblox.onBlurbChange = require('./users/onBlurbChange.js') diff --git a/lib/users/getUserInfo.js b/lib/users/getUserInfo.js new file mode 100644 index 00000000..b37d3389 --- /dev/null +++ b/lib/users/getUserInfo.js @@ -0,0 +1,33 @@ +// Includes +const http = require('../util/http.js').func + +// Args +exports.required = ['userId'] + +// Docs +/** + * ✅ Get base-level user profile information + * @category User + * @alias getUserInfo + * @param { number } userId + * @returns {Promise} +**/ + +// Define +exports.func = function (args) { + const httpOpt = { + url: `//users.roblox.com/v1/users/${args.userId}`, + options: { + json: true, + method: 'GET', + resolveWithFullResponse: true + } + } + + return http(httpOpt).then(function (res) { + if (res.statusCode !== 200) + throw new Error(`Failed to fetch user information: ${res.body.errors?.join(', ')}`) + + return res.body + }) +} From 70dd76c1a6a424928d958084dfd4323cf95fa398 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Mon, 7 Oct 2024 19:31:01 +0000 Subject: [PATCH 09/19] Add UserInfo type --- typings/index.d.ts | 11 +++++++++++ typings/jsDocs.ts | 13 +++++++++++++ 2 files changed, 24 insertions(+) diff --git a/typings/index.d.ts b/typings/index.d.ts index 8b84c314..717b830d 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1148,6 +1148,17 @@ declare module "noblox.js" { oldNames?: string[]; isBanned: boolean; } + + interface UserInfo { + description: string; + created: Date; + isBanned: boolean; + hasVerifiedBadge: boolean; + id: number; + name: string; + displayName: string; + } + interface Presences { userPresences: UserPresence[] } diff --git a/typings/jsDocs.ts b/typings/jsDocs.ts index fc40c351..54298d4d 100644 --- a/typings/jsDocs.ts +++ b/typings/jsDocs.ts @@ -1583,6 +1583,19 @@ type PlayerInfo = { isBanned: boolean; } +/** + * @typedef +*/ +type UserInfo = { + description: string; + created: Date; + isBanned: boolean; + hasVerifiedBadge: boolean; + id: number; + name: string; + displayName: string; +} + /** * @typedef */ From ce4bec4d05e1062ec9fbcc03a294facbc196e968 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Mon, 7 Oct 2024 15:36:24 -0400 Subject: [PATCH 10/19] Fix formatting --- lib/friends/getFollowerCount.js | 5 ++--- lib/friends/getFollowingCount.js | 5 ++--- lib/friends/getFriendCount.js | 5 ++--- lib/users/getUserInfo.js | 3 +-- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/lib/friends/getFollowerCount.js b/lib/friends/getFollowerCount.js index 3eed474f..d594f5e6 100644 --- a/lib/friends/getFollowerCount.js +++ b/lib/friends/getFollowerCount.js @@ -17,7 +17,7 @@ exports.optional = ['jar'] **/ // Define -function getFollowerCount(jar, userId) { +function getFollowerCount (jar, userId) { const httpOpt = { url: `//friends.roblox.com/v1/users/${userId}/followers/count`, options: { @@ -29,8 +29,7 @@ function getFollowerCount(jar, userId) { } return http(httpOpt).then(function (res) { - if (res.statusCode === 200) - return res.body.count + if (res.statusCode === 200) { return res.body.count } throw new Error( `Failed to retrieve follower count: (${res.statusCode}) ${res.body}` diff --git a/lib/friends/getFollowingCount.js b/lib/friends/getFollowingCount.js index 5b538ff0..d7124ad7 100644 --- a/lib/friends/getFollowingCount.js +++ b/lib/friends/getFollowingCount.js @@ -17,7 +17,7 @@ exports.optional = ['jar'] **/ // Define -function getFollowingCount(jar, userId) { +function getFollowingCount (jar, userId) { const httpOpt = { url: `//friends.roblox.com/v1/users/${userId}/followings/count`, options: { @@ -29,8 +29,7 @@ function getFollowingCount(jar, userId) { } return http(httpOpt).then(function (res) { - if (res.statusCode === 200) - return res.body.count + if (res.statusCode === 200) { return res.body.count } throw new Error( `Failed to retrieve following count: (${res.statusCode}) ${res.body}` diff --git a/lib/friends/getFriendCount.js b/lib/friends/getFriendCount.js index a1a17de9..3d6b2ad0 100644 --- a/lib/friends/getFriendCount.js +++ b/lib/friends/getFriendCount.js @@ -17,7 +17,7 @@ exports.optional = ['jar'] **/ // Define -function getFriendCount(jar, userId) { +function getFriendCount (jar, userId) { const httpOpt = { url: `//friends.roblox.com/v1/users/${userId}/friends/count`, options: { @@ -29,8 +29,7 @@ function getFriendCount(jar, userId) { } return http(httpOpt).then(function (res) { - if (res.statusCode === 200) - return res.body.count + if (res.statusCode === 200) { return res.body.count } throw new Error( `Failed to retrieve friend count: (${res.statusCode}) ${res.body}` diff --git a/lib/users/getUserInfo.js b/lib/users/getUserInfo.js index b37d3389..7a6e7901 100644 --- a/lib/users/getUserInfo.js +++ b/lib/users/getUserInfo.js @@ -25,8 +25,7 @@ exports.func = function (args) { } return http(httpOpt).then(function (res) { - if (res.statusCode !== 200) - throw new Error(`Failed to fetch user information: ${res.body.errors?.join(', ')}`) + if (res.statusCode !== 200) { throw new Error(`Failed to fetch user information: ${res.body.errors?.join(', ')}`) } return res.body }) From a5076ebf41b2d25889ef8810b01be101b7eee013 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Thu, 10 Oct 2024 07:15:02 +0000 Subject: [PATCH 11/19] Fix method overall --- lib/users/getUsernameHistory.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/lib/users/getUsernameHistory.js b/lib/users/getUsernameHistory.js index 8e9214f5..a62889e6 100644 --- a/lib/users/getUsernameHistory.js +++ b/lib/users/getUsernameHistory.js @@ -10,22 +10,26 @@ exports.optional = ['limit', 'sortOrder', 'pageCursor'] * ✅ Get a user's username history. * @category User * @alias getUsernameHistory - * @param { number } userId - * @param { number } [limit=10] - * @param { SortOrder= } [sortOrder=Asc] - * @param { string } cursor + * @param {number} userId + * @param {Limit=} [limit=10] + * @param {SortOrder=} [sortOrder=Asc] + * @param {string} cursor * @returns {Promise} * @example const noblox = require("noblox.js") - * const history = await noblox.getUsernameHistory(1, 10, "Asc", "cursorstring") + * const history = await noblox.getUsernameHistory({ userId: 1, limit: 10, sortOrder: "Asc", cursor: "somecursorstring" }) **/ // Define -exports.func = function (args) { +function getUsernameHistory (userId, limit, sortOrder, cursor) { return getPageResults({ - url: `//users.roblox.com/v1/users/${args.userId}/username-history`, + url: `//users.roblox.com/v1/users/${userId}/username-history`, query: {}, - limit: args.limit, - pageCursor: args.pageCursor, - sortOrder: args.sortOrder + limit, + pageCursor: cursor, + sortOrder }) } + +exports.func = function (args) { + return getUsernameHistory(args.userId, args.limit, args.sortOrder, args.cursor) +} From ff975cc59210370a78bf8fefc1c93dc4f09547ee Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Thu, 10 Oct 2024 07:16:08 +0000 Subject: [PATCH 12/19] It is in fact not an args object --- lib/users/getUserInfo.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/users/getUserInfo.js b/lib/users/getUserInfo.js index 7a6e7901..b1e1f2da 100644 --- a/lib/users/getUserInfo.js +++ b/lib/users/getUserInfo.js @@ -14,9 +14,9 @@ exports.required = ['userId'] **/ // Define -exports.func = function (args) { +exports.func = function (userId) { const httpOpt = { - url: `//users.roblox.com/v1/users/${args.userId}`, + url: `//users.roblox.com/v1/users/${userId}`, options: { json: true, method: 'GET', @@ -27,6 +27,6 @@ exports.func = function (args) { return http(httpOpt).then(function (res) { if (res.statusCode !== 200) { throw new Error(`Failed to fetch user information: ${res.body.errors?.join(', ')}`) } - return res.body + return res }) } From bd7b74f1d2e21d9042c5c3567149aa1a120aaf27 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Thu, 10 Oct 2024 07:16:42 +0000 Subject: [PATCH 13/19] Remove inclusion of jar param in counts methods --- lib/friends/getFollowerCount.js | 10 ++-------- lib/friends/getFollowingCount.js | 10 ++-------- lib/friends/getFriendCount.js | 10 ++-------- 3 files changed, 6 insertions(+), 24 deletions(-) diff --git a/lib/friends/getFollowerCount.js b/lib/friends/getFollowerCount.js index d594f5e6..cef07304 100644 --- a/lib/friends/getFollowerCount.js +++ b/lib/friends/getFollowerCount.js @@ -1,9 +1,8 @@ // Includes -const http = require('../util/http.js') +const http = require('../util/http.js').func // Args exports.required = ['userId'] -exports.optional = ['jar'] // Docs /** @@ -17,11 +16,10 @@ exports.optional = ['jar'] **/ // Define -function getFollowerCount (jar, userId) { +exports.func = function (userId) { const httpOpt = { url: `//friends.roblox.com/v1/users/${userId}/followers/count`, options: { - jar, json: true, method: 'GET', resolveWithFullResponse: true @@ -36,7 +34,3 @@ function getFollowerCount (jar, userId) { ) }) } - -exports.func = function (args) { - return getFollowerCount(args.jar, args.userId) -} diff --git a/lib/friends/getFollowingCount.js b/lib/friends/getFollowingCount.js index d7124ad7..bd43cc94 100644 --- a/lib/friends/getFollowingCount.js +++ b/lib/friends/getFollowingCount.js @@ -1,9 +1,8 @@ // Includes -const http = require('../util/http.js') +const http = require('../util/http.js').func // Args exports.required = ['userId'] -exports.optional = ['jar'] // Docs /** @@ -17,11 +16,10 @@ exports.optional = ['jar'] **/ // Define -function getFollowingCount (jar, userId) { +exports.func = function (userId) { const httpOpt = { url: `//friends.roblox.com/v1/users/${userId}/followings/count`, options: { - jar, json: true, method: 'GET', resolveWithFullResponse: true @@ -36,7 +34,3 @@ function getFollowingCount (jar, userId) { ) }) } - -exports.func = function (args) { - return getFollowingCount(args.jar, args.userId) -} diff --git a/lib/friends/getFriendCount.js b/lib/friends/getFriendCount.js index 3d6b2ad0..72ceb1cb 100644 --- a/lib/friends/getFriendCount.js +++ b/lib/friends/getFriendCount.js @@ -1,9 +1,8 @@ // Includes -const http = require('../util/http.js') +const http = require('../util/http.js').func // Args exports.required = ['userId'] -exports.optional = ['jar'] // Docs /** @@ -17,11 +16,10 @@ exports.optional = ['jar'] **/ // Define -function getFriendCount (jar, userId) { +exports.func = function (userId) { const httpOpt = { url: `//friends.roblox.com/v1/users/${userId}/friends/count`, options: { - jar, json: true, method: 'GET', resolveWithFullResponse: true @@ -36,7 +34,3 @@ function getFriendCount (jar, userId) { ) }) } - -exports.func = function (args) { - return getFriendCount(args.jar, args.userId) -} From 766774612dffa0fff514652c9ce5b464ceadacdb Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Thu, 10 Oct 2024 07:17:13 +0000 Subject: [PATCH 14/19] Replace constructRequest with imports of needed methods --- lib/users/getPlayerInfo.js | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/lib/users/getPlayerInfo.js b/lib/users/getPlayerInfo.js index 0fe59c75..4b0c3d6b 100644 --- a/lib/users/getPlayerInfo.js +++ b/lib/users/getPlayerInfo.js @@ -1,6 +1,9 @@ // Includes -const http = require('../util/http.js').func -const getPageResults = require('../util/getPageResults.js').func +const getFollowingCount = require('../friends/getFollowingCount.js').func +const getFollowerCount = require('../friends/getFollowerCount.js').func +const getFriendCount = require('../friends/getFriendCount.js').func +const getUserInfo = require('../users/getUserInfo.js').func +const getUsernameHistory = require('../users/getUsernameHistory.js').func // Args exports.required = ['userId'] @@ -20,11 +23,11 @@ exports.required = ['userId'] function getPlayerInfo (userId) { return new Promise((resolve, reject) => { const requests = [ - constructRequest(`//users.roblox.com/v1/users/${userId}`), - constructRequest(`//friends.roblox.com/v1/users/${userId}/friends/count`), - constructRequest(`//friends.roblox.com/v1/users/${userId}/followings/count`), - constructRequest(`//friends.roblox.com/v1/users/${userId}/followers/count`), - getPageResults({ url: `//users.roblox.com/v1/users/${userId}/username-history`, query: {}, limit: 1000 }) + getUserInfo(userId), + getFriendCount(userId), + getFollowingCount(userId), + getFollowerCount(userId), + getUsernameHistory({ userId }) ].map(promise => promise.then( val => ({ status: 'fulfilled', value: val }), rej => ({ status: 'rejected', reason: rej }) @@ -53,11 +56,11 @@ function getPlayerInfo (userId) { } else if (failedResponse) { reject(new Error('User does not exist.')) } else { - const responseBodies = responses.map(res => res.body) + const responseBodies = responses.map(res => res.body ?? res) const oldNames = responses[4].map(nameObject => nameObject.name) || [] - const friendCount = responseBodies[1].count - const followerCount = responseBodies[3].count - const followingCount = responseBodies[2].count + const friendCount = responseBodies[1] + const followerCount = responseBodies[3] + const followingCount = responseBodies[2] const joinDate = new Date(userBody.created) const blurb = userBody.description const isBanned = userBody.isBanned @@ -84,17 +87,6 @@ function getPlayerInfo (userId) { }) } -function constructRequest (url) { - return http({ - url, - options: { - resolveWithFullResponse: true, - followRedirect: false, - json: true - } - }) -} - exports.func = (args) => { return getPlayerInfo(args.userId) } From c9dc8244a046d7e2607deb859262ddb84fe767e6 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Sat, 26 Oct 2024 02:09:09 +0000 Subject: [PATCH 15/19] Add function types --- typings/index.d.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/typings/index.d.ts b/typings/index.d.ts index 717b830d..01e2b975 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1809,16 +1809,31 @@ declare module "noblox.js" { */ function declineFriendRequest(userId: number, jar?: CookieJar): Promise; + /** + * ✅ Gets the number of followers a user has. + */ + function getFollowerCount(userId: number): Promise; + /** * ✅ Get the followers of a user (users who follow the specified person) */ function getFollowers(userId: number, sortOrder?: SortOrder, limit?: Limit, cursor?: string, jar?: CookieJar): Promise; + /** + * ✅ Gets the number of followings a user has (users who have been followed by the specified person). + */ + function getFollowingCount(userId: number): Promise; + /** * ✅ Get the followings of a user (users who have been followed by the specified person) */ function getFollowings(userId: number, sortOrder?: SortOrder, limit?: Limit, cursor?: string, jar?: CookieJar): Promise; + /** + * ✅ Get the number of friends a user has. + */ + function getFriendCount(userId: number): Promise; + /** * 🔐 Gets the pending friend requests of the logged in user. */ @@ -2179,11 +2194,21 @@ declare module "noblox.js" { */ function getPlayerInfo(userId: number): Promise; + /** + * ✅ Gets basic user information. + */ + function getUserInfo(userId: number): Promise; + /** * ✅ Gets `username` of user with `id` and caches according to settings. */ function getUsernameFromId(id: number): Promise; + /** + * ✅ Gets a list of usernames the specified user has used. + */ + function getUsernameHistory(userId: number, limit?: Limit, sortOrder?: SortOrder, cursor?: string): Promise; + /// Utility /** From 9b909c5bb380429e578b5effb149c030705d8e61 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Sat, 26 Oct 2024 02:22:55 +0000 Subject: [PATCH 16/19] Export other created methods --- lib/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/index.js b/lib/index.js index 47d9c0c8..a047417d 100644 --- a/lib/index.js +++ b/lib/index.js @@ -77,8 +77,11 @@ noblox.onGroupTransaction = require('./economy/onGroupTransaction.js') noblox.acceptFriendRequest = require('./friends/acceptFriendRequest.js') noblox.declineAllFriendRequests = require('./friends/declineAllFriendRequests.js') noblox.declineFriendRequest = require('./friends/declineFriendRequest.js') +noblox.getFollowerCount = require('./friends/getFollowerCount.js') noblox.getFollowers = require('./friends/getFollowers.js') +noblox.getFollowingCount = require('./friends/getFollowingCount.js') noblox.getFollowings = require('./friends/getFollowings.js') +noblox.getFriendCount = require('./friends/getFriendCount.js') noblox.getFriendRequests = require('./friends/getFriendRequests.js') noblox.getFriends = require('./friends/getFriends.js') noblox.onFriendRequest = require('./friends/onFriendRequest.js') From e7b3dec55fadabf8f05efdadf6397b05f5682b05 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Sat, 26 Oct 2024 02:28:07 +0000 Subject: [PATCH 17/19] Actually return the data object instead of whole response (and parse date) --- lib/users/getUserInfo.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/users/getUserInfo.js b/lib/users/getUserInfo.js index b1e1f2da..edb94ab6 100644 --- a/lib/users/getUserInfo.js +++ b/lib/users/getUserInfo.js @@ -27,6 +27,8 @@ exports.func = function (userId) { return http(httpOpt).then(function (res) { if (res.statusCode !== 200) { throw new Error(`Failed to fetch user information: ${res.body.errors?.join(', ')}`) } - return res + res.body.created = new Date(res.body.created) + + return res.body }) } From b79754b31eced2bf6f1cb68131dc4b2a047a5977 Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Sat, 26 Oct 2024 02:33:10 +0000 Subject: [PATCH 18/19] Add test for getUserInfo --- test/users.test.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/test/users.test.js b/test/users.test.js index 147e6c50..b947b79b 100644 --- a/test/users.test.js +++ b/test/users.test.js @@ -1,5 +1,5 @@ const { it } = require('node:test') -const { getBlurb, getIdFromUsername, getPlayerInfo, getUsernameFromId, getUsernameHistory, setCookie } = require('../lib') +const { getBlurb, getIdFromUsername, getPlayerInfo, getUserInfo, getUsernameFromId, getUsernameHistory, setCookie } = require('../lib') beforeAll(() => { return new Promise(resolve => { @@ -61,6 +61,21 @@ describe('Users Methods', () => { }) }) + it('getUserInfo() returns profile information on the specified user', () => { + return getUserInfo(55549140).then((res) => { + return expect(res).toMatchObject({ + description: expect.any(String), + created: expect.any(Date), + isBanned: expect.any(Boolean), + externalAppDisplayName: expect.any(null), + hasVerifiedBadge: expect.any(Boolean), + id: expect.any(Number), + name: expect.any(String), + displayName: expect.any(String) + }) + }) + }) + it('getUsernameFromId() returns a player\'s username given an ID', () => { return getUsernameFromId(1).then((res) => { return expect(res).toEqual(expect.any(String)) From 13315e32ce4cf2d8e855b8652ae7f554d6b613fe Mon Sep 17 00:00:00 2001 From: Regalijan <72576136+Regalijan@users.noreply.github.com> Date: Tue, 29 Oct 2024 02:55:44 -0400 Subject: [PATCH 19/19] Remove stray import --- test/users.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/users.test.js b/test/users.test.js index b947b79b..0f2593b4 100644 --- a/test/users.test.js +++ b/test/users.test.js @@ -1,4 +1,3 @@ -const { it } = require('node:test') const { getBlurb, getIdFromUsername, getPlayerInfo, getUserInfo, getUsernameFromId, getUsernameHistory, setCookie } = require('../lib') beforeAll(() => {