diff --git a/examples/rank.js b/examples/rank.js index f83de86..aa720cb 100644 --- a/examples/rank.js +++ b/examples/rank.js @@ -11,10 +11,11 @@ client.on("ready", async () => { client.defaultGroup = 13299030 - const rank = await tyblox.getGroupRank(531761235, 3395411) - console.log(rank) + const getrank = await tyblox.getGroupRank(531761235, 3395411) + console.log(getrank) - await tyblox.setRank(client, 445177180, 2) + const setrank = await tyblox.setRank(client, 87516258, 2) + console.log(setrank) }) client.login(process.env.example_cookie); diff --git a/src/client/Client.js b/src/client/Client.js index 8d8af9b..94125cc 100644 --- a/src/client/Client.js +++ b/src/client/Client.js @@ -37,7 +37,7 @@ class Client extends EventEmitter { if (!cookie || !this.cookie) throw new Error("NO COOKIE PROVIDED OR FOUND"); /** - * @type {import('../../typings/routes').response} + * @type {import('../../typings/response').response} */ let tokenReq = await request.post({ url: `${routes.v2.bases.authApi()}${routes.v2.logout()}`, diff --git a/src/group/getRanks.js b/src/group/getRanks.js index 2163fa9..5debf96 100644 --- a/src/group/getRanks.js +++ b/src/group/getRanks.js @@ -4,7 +4,7 @@ const routes = require("../routes"); /** * Get the users group ranks * @param {string | number} userId The user id you want to find the rank for - * @returns {import('../../typings/routes').v2_groups_ranks} + * @returns {import('../../typings/response').v2_groups_ranks} * @example * ```js * const tyblox = require("tyblox.js") @@ -19,7 +19,7 @@ const routes = require("../routes"); if (!userId) throw new Error("MISSING GROUP ID") /** - * @type {import('../../typings/routes').v2_groups_ranks | null} + * @type {import('../../typings/response').v2_groups_ranks | null} */ let rolesets = await request.get({ url: `${routes.v1.bases.groupsApi()}${routes.global.getUserRanks(userId)}` @@ -48,7 +48,7 @@ exports.getGroupRank = async (userId, groupId) => { if (!groupId) throw new Error("MISSING GROUP ID") /** - * @type {import('../../typings/routes').v2_groups_ranks | null} + * @type {import('../../typings/response').v2_groups_ranks | null} */ let ranks = await request.get({ url: `${routes.v1.bases.groupsApi()}${routes.global.getUserRanks(userId)}`, diff --git a/src/group/getRolesets.js b/src/group/getRolesets.js index fdb27ae..dd0dcd5 100644 --- a/src/group/getRolesets.js +++ b/src/group/getRolesets.js @@ -4,7 +4,7 @@ const routes = require("../routes"); /** * Get the groups roles in a list * @param {string | number} groupId The group id for the rolesets you want to get - * @returns {import('../../typings/routes').v1_groups_rolesets} + * @returns {import('../../typings/response').v1_groups_rolesets} * @example * ```js * const tyblox = require("tyblox.js") @@ -19,11 +19,11 @@ module.exports = async (groupId) => { if (!groupId) throw new Error("MISSING GROUP ID") /** - * @type {import('../../typings/routes').v1_groups_rolesets | null} + * @type {import('../../typings/response').v1_groups_rolesets | null} */ let rolesets = await request.get({ url: `${routes.v1.bases.groupsApi()}${routes.v1.getRolesets(groupId)}` }) - return rolesets.data + return rolesets } \ No newline at end of file diff --git a/src/group/setRank.js b/src/group/setRank.js index 06f457a..2a3c4ad 100644 --- a/src/group/setRank.js +++ b/src/group/setRank.js @@ -25,18 +25,21 @@ module.exports = async (client, userId, newRank, groupId) => { if (newRank > 255 || newRank < 1) throw new Error("INVALID NEW RANK") let rolesets = await getRolesets(groupId || client.defaultGroup) - let rolesetFound = rolesets.roles.find((roleset) => { - if (roleset.rank === newRank) return true; + let rolesetFound = rolesets.data.roles.find((roleset) => { + return (roleset.rank === newRank) }) if (!rolesetFound) throw new Error("ROLE ID NOT FOUND FOR THIS GROUP") + console.log(parseInt(rolesetFound.id)) - await request.patch({ + const req = await request.patch({ url: `${routes.v1.bases.groupsApi()}${routes.v1.groupMember(groupId || client.defaultGroup, userId)}`, cookie: client.cookie, token: client.token, silenceErr: true, body: { - roleId: newRank + roleId: parseInt(rolesetFound.id) } }) + + return req.data } \ No newline at end of file diff --git a/src/index.js b/src/index.js index a4c3bdf..2d1a745 100644 --- a/src/index.js +++ b/src/index.js @@ -2,6 +2,9 @@ // Internal exports.internal = { + /** + * @type {import('../typings/index').request} + */ request: require("./request") } diff --git a/src/request.js b/src/request.js index adaf48f..7b1869c 100644 --- a/src/request.js +++ b/src/request.js @@ -3,7 +3,6 @@ const axios = require('axios').default; /** * Do a `GET` request to an API, usually roblox. * @param {import('../typings/index').RequestOptions} options The request options. - * @returns {Promise} * @example * request.get(...options); */ @@ -42,7 +41,6 @@ exports.get = async (options) => { /** * Do a `POST` request to an API, usually roblox. * @param {import('../typings/index').RequestOptions} options The request options. - * @returns {Promise} * @example * request.get(...options); */ @@ -99,7 +97,7 @@ exports.get = async (options) => { }); if (options.silenceErr) { - return await axios.patch(options.url, JSON.stringify(options.body) || {}, { + return await axios.patch(options.url, options.body || {}, { method: "PATCH", withCredentials: true, headers: finalHeaders, @@ -109,7 +107,7 @@ exports.get = async (options) => { return {code: res.status, headers: res.headers, data: res.data}; }); } else { - return await axios.patch(options.url, JSON.stringify(options.body) || {}, { + return await axios.patch(options.url, options.body || {}, { method: "PATCH", withCredentials: true, headers: finalHeaders, diff --git a/src/routes.js b/src/routes.js index 6b1f634..594b9cf 100644 --- a/src/routes.js +++ b/src/routes.js @@ -113,7 +113,7 @@ const routes = { * * @param {string} groupId * @param {string} userId - * @returns + * @returns {`/groups/${groupId}/users/${userId}`} */ groupMember: (groupId, userId) => `/groups/${groupId}/users/${userId}`, @@ -124,7 +124,7 @@ const routes = { * @param {boolean} circular * @param {import('../typings/index').ThumbnailAvatarSize} size * @param {import('../typings/index').AvatarFormat} format - * @returns + * @returns {`/users/avatar?format=${format}&size=${size}&isCircular=${circular}&userIds=${userIds.join(",")}`} */ userAvatarThumbnail: (userIds, circular, size = "720x720", format = "Png") => `/users/avatar?format=${format}&size=${size}&isCircular=${circular}&userIds=${userIds.join(",")}`, @@ -135,7 +135,7 @@ const routes = { * @param {boolean} circular * @param {import('../typings/index').BustAvatarSize} size * @param {import('../typings/index').AvatarFormat} format - * @returns + * @returns {`/users/avatar-bust?format=${format}&size=${size}&isCircular=${circular}&userIds=${userIds.join(",")}`} */ userAvatarBust: (userIds, circular, size = "420x420", format = "Png") => `/users/avatar-bust?format=${format}&size=${size}&isCircular=${circular}&userIds=${userIds.join(",")}`, @@ -146,7 +146,7 @@ const routes = { * @param {boolean} circular * @param {import('../typings/index').HeadshotAvatarSize} size * @param {import('../typings/index').AvatarFormat} format - * @returns + * @returns {`/users/avatar-headshot?format=${format}&size=${size}&isCircular=${circular}&userIds=${userIds.join(",")}`} */ userAvatarHeadshot: (userIds, circular, size = "720x720", format = "Png") => `/users/avatar-headshot?format=${format}&size=${size}&isCircular=${circular}&userIds=${userIds.join(",")}`, diff --git a/src/thumbnail/avatar/getAvatar.js b/src/thumbnail/avatar/getAvatar.js index a099d8b..0d886ae 100644 --- a/src/thumbnail/avatar/getAvatar.js +++ b/src/thumbnail/avatar/getAvatar.js @@ -5,7 +5,7 @@ const routes = require("../../routes"); * Gets the users avatar thumbnail * @param {string[] | number[]} userIds The User Ids to get the avatar urls. * @param {boolean} circle If the returned image should be a circle - * @returns {Promise} + * @returns {Promise} * @example * ```js * const tyblox = require("tyblox.js") @@ -15,7 +15,7 @@ const routes = require("../../routes"); */ module.exports = async (userIds, circular) => { /** - * @type {import('../../../typings/routes').v1_thumbnails_user_avatars | null} + * @type {import('../../../typings/response').v1_thumbnails_user_avatars | null} */ let thumbnailData = await request.get({ url: `${routes.v1.bases.thumbnailsApi()}${routes.v1.userAvatarThumbnail(userIds, circular, "720x720", "Png")}` diff --git a/src/thumbnail/avatar/getBust.js b/src/thumbnail/avatar/getBust.js index 9b93d13..07b0428 100644 --- a/src/thumbnail/avatar/getBust.js +++ b/src/thumbnail/avatar/getBust.js @@ -5,7 +5,7 @@ const routes = require("../../routes"); * Gets the users avatar bust * @param {string[] | number[]} userIds The User Ids to get the avatar urls. * @param {boolean} circle If the returned image should be a circle - * @returns {Promise} + * @returns {Promise} * @example * ```js * const tyblox = require("tyblox.js") @@ -15,7 +15,7 @@ const routes = require("../../routes"); */ module.exports = async (userIds, circular) => { /** - * @type {import('../../../typings/routes').v1_thumbnails_user_avatars | null} + * @type {import('../../../typings/response').v1_thumbnails_user_avatars | null} */ let thumbnailData = await request.get({ url: `${routes.v1.bases.thumbnailsApi()}${routes.v1.userAvatarBust(userIds, circular, "420x420", "Png")}` diff --git a/src/thumbnail/avatar/getHeadshot.js b/src/thumbnail/avatar/getHeadshot.js index 9c933de..0395999 100644 --- a/src/thumbnail/avatar/getHeadshot.js +++ b/src/thumbnail/avatar/getHeadshot.js @@ -5,7 +5,7 @@ const routes = require("../../routes"); * Gets the users avatar headshot * @param {string[] | number[]} userIds The User Ids to get the avatar urls. * @param {boolean} circle If the returned image should be a circle - * @returns {Promise} + * @returns {Promise} * @example * ```js * const tyblox = require("tyblox.js") @@ -15,7 +15,7 @@ const routes = require("../../routes"); */ module.exports = async (userIds, circular) => { /** - * @type {import('../../../typings/routes').v1_thumbnails_user_avatars | null} + * @type {import('../../../typings/response').v1_thumbnails_user_avatars | null} */ let thumbnailData = await request.get({ url: `${routes.v1.bases.thumbnailsApi()}${routes.v1.userAvatarHeadshot(userIds, circular, "720x720", "Png")}` diff --git a/src/user/User.js b/src/user/User.js index 4b5dd9e..29bfe91 100644 --- a/src/user/User.js +++ b/src/user/User.js @@ -169,7 +169,7 @@ class User { */ async getPreviousNames() { /** - * @type {import('../../typings/routes').v1_users_username_history} + * @type {import('../../typings/response').v1_users_username_history} */ let names = await request.get({ url: `${routes.v1.bases.usersApi()}${routes.v1.usernameHistory(this.userId)}` diff --git a/src/user/getUser.js b/src/user/getUser.js index d8b4c27..ad78306 100644 --- a/src/user/getUser.js +++ b/src/user/getUser.js @@ -16,7 +16,7 @@ const routes = require("../routes"); exports.usingId = async (userId) => { /** - * @type {import('../../typings/routes').v1_users_get_user_info_id | null} + * @type {import('../../typings/response').v1_users_get_user_info_id | null} */ let dataPublic = await request.get({ url: `${routes.global.bases.api}${routes.global.getUserInfoById(userId)}` @@ -52,7 +52,7 @@ exports.usingId = async (userId) => { exports.usingCookie = async (cookie, forceLimited) => { /** - * @type {import('../../typings/routes').v1_users_mobileapi_userinfo | null} + * @type {import('../../typings/response').v1_users_mobileapi_userinfo | null} */ let req1 = await request.get({ url: `${routes.global.bases.mobileApi()}${routes.global.mobileUserInfo()}`, @@ -61,7 +61,7 @@ exports.usingCookie = async (cookie, forceLimited) => { let partialDataLoggedIn = req1.data; /** - * @type {import('../../typings/routes').v1_users_get_user_info_id | null} + * @type {import('../../typings/response').v1_users_get_user_info_id | null} */ let req2 = await request.get({ url: `${routes.global.bases.api()}${routes.global.getUserInfoById(partialDataLoggedIn.UserID)}` diff --git a/typings/body.d.ts b/typings/body.d.ts new file mode 100644 index 0000000..de37783 --- /dev/null +++ b/typings/body.d.ts @@ -0,0 +1,3 @@ +export interface body { + [key: string]: string; +} diff --git a/typings/index.d.ts b/typings/index.d.ts index ebdca6b..d861d7b 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1,4 +1,6 @@ import EventEmitter = require("events"); +import { body } from "./body"; +import { response } from "./response"; export enum AvatarType { avatarThumbnail = "thumbnail", @@ -100,11 +102,52 @@ export interface Header { value: string; } -export interface RequestOptions { +export interface RequestOptions { url: string; headers?: Header[]; cookie?: string; token?: string; - body?: any; + body?: T; silenceErr: boolean; } + +export interface request { + /** + * Do a `GET` request to an API, usually roblox. + * @example + * request.get(...options); + * + * // or + * + * internal.reqest.get(...options); + */ + get( + options: RequestOptions + ): Promise; + + /** + * Do a `POST` request to an API, usually roblox. + * @example + * request.post(...options); + * + * // or + * + * internal.request.post(...options); + */ + post( + options: RequestOptions + ): Promise; + + /** + * Do a `PATCH` request to an API, usually roblox. + * @example + * request.patch(...options); + * + * // or + * + * internal.request.patch(...options); + */ + patch( + options: RequestOptions + ): Promise; +} diff --git a/typings/routes.d.ts b/typings/response.d.ts similarity index 94% rename from typings/routes.d.ts rename to typings/response.d.ts index 4fc8867..9aee539 100644 --- a/typings/routes.d.ts +++ b/typings/response.d.ts @@ -82,13 +82,11 @@ export interface v1_groups_info extends response { } export interface v1_groups_roleset { - data: { - id: string; - name: string; - rank: number; - memberCount: number; - description?: string; - }; + id: string; + name: string; + rank: number; + memberCount: number; + description?: string; } export interface v1_groups_rolesets extends response {