UNPKG

funblox.js

Version:

This package made by fedee#9606 this a roblox API you may use it for your verification or something if you use our package give us credit <3.

1 lines 57.4 kB
{"version":3,"sources":["../src/api.ts","../src/utils/jar.ts","../src/utils/caches.ts","../src/utils/getIdFromName.ts","../src/user/getUser.ts","../src/group/getGroup.ts","../src/user/getUserRank.ts","../src/user/getUserFavoriteGames.ts","../src/catalog/getCategories.ts","../src/catalog/getFavoritesOfBundle.ts","../src/catalog/getFavoritesOfItem.ts","../src/user/getPlayerThumbnail.ts","../src/user/getUserBundles.ts","../src/game/getPlaceInfo.ts","../src/game/getGameVotes.ts","../src/game/getUniverseId.ts","../src/utils/getGeneralToken.ts","../src/group/getRoles.ts","../src/group/getRole.ts","../src/group/setRank.ts","../src/utils/changeRank.ts","../src/group/promote.ts","../src/group/demote.ts","../src/utils/getCurrentUser.ts","../src/user/setCookie.ts","../src/user/getGroups.ts","../src/group/deletePost.ts","../src/group/deletePostBySpecificUser.ts","../src/group/getGroupWall.ts","../src/group/getGroupGames.ts"],"sourcesContent":["import got from 'got-cjs';\nimport jar from './utils/jar';\nimport { webCache } from './utils/caches';\n\nexport const api = got.extend({\n prefixUrl: 'https://api.roblox.com/',\n responseType: 'json',\n cookieJar: jar,\n cache: webCache,\n});\n\nexport const economy = got.extend({\n prefixUrl: 'https://economy.roblox.com/',\n responseType: 'json',\n cookieJar: jar,\n cache: webCache,\n});\n\nexport const auth = got.extend({\n prefixUrl: 'https://auth.roblox.com/',\n responseType: 'json',\n cookieJar: jar,\n cache: webCache,\n});\n\nexport const groups = got.extend({\n prefixUrl: 'https://groups.roblox.com/',\n responseType: 'json',\n cookieJar: jar,\n cache: webCache,\n});\n\nexport const games = got.extend({\n prefixUrl: 'https://games.roblox.com/',\n responseType: 'json',\n cookieJar: jar,\n cache: webCache,\n});\n\nexport const catalog = got.extend({\n prefixUrl: 'https://catalog.roblox.com/',\n responseType: 'json',\n cookieJar: jar,\n cache: webCache,\n});\n\nexport const friends = got.extend({\n prefixUrl: 'https://friends.roblox.com/',\n responseType: 'json',\n cookieJar: jar,\n cache: webCache,\n});\nexport const thumbnails = got.extend({\n prefixUrl: 'https://thumbnails.roblox.com/',\n responseType: 'json',\n cookieJar: jar,\n cache: webCache,\n});\n\nexport const users = got.extend({\n prefixUrl: 'https://users.roblox.com/',\n responseType: 'json',\n cookieJar: jar,\n cache: webCache,\n});\n\nexport const mobileAPI = got.extend({\n prefixUrl: 'https://www.roblox.com/mobileapi/',\n responseType: 'json',\n cookieJar: jar,\n cache: webCache,\n});\n","import tough from 'tough-cookie';\nimport { FileCookieStore } from 'tough-cookie-file-store';\nconst jar = new tough.CookieJar(new FileCookieStore('./.cookies'));\n\nexport default jar;\n","export const webCache = new Map();\nexport const generalCache = new Map();\n","/* eslint-disable max-len */\nimport { users } from '../api';\nimport type { SearchUserAPIResponse } from './APITypes';\n\n/**\n *\n * @param {String | string} username\n * @return {Promise<number>}\n */\nexport default function getIdFromName(username: string, showBannedUsers?: boolean): Promise<number> {\n return new Promise(async (resolve, reject) => {\n const res = await users.post('v1/usernames/users', { \n json: {\n \"usernames\": [username],\n \"excludeBannedUsers\": showBannedUsers || false\n },\n headers: {\n \"Content-Type\": \"application/json\",\n \"accept\": \"application/json\"\n }\n });\n const data: SearchUserAPIResponse = JSON.parse(JSON.stringify(res.body));\n\n if (res.statusCode !== 200) {\n return reject(new Error('Not found. - utils/getIdFromName.js'));\n }\n\n resolve(data.data[0].id);\n });\n}\n","/* eslint-disable no-new-wrappers */\n/* eslint-disable no-tabs */\n/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\nimport { Response } from 'got-cjs';\nimport { friends, thumbnails, users } from '../api';\nimport getNameFromId from '../utils/getIdFromName';\n\ninterface UserResponse {\n id: number;\n username: string;\n displayName: string;\n description: string;\n created: string;\n avatar_url: string;\n friends: {\n count: number;\n ids: Array<number>;\n };\n followers: {\n count: number;\n ids: Array<number>;\n };\n following: {\n count: number;\n ids: Array<number>;\n };\n}\n\n/**\n *\n * @param {number | string} identifier\n * @return {Promise<UserResponse>}\n */\nexport default async function getUser(\n identifier: number | string,\n): Promise<UserResponse> {\n return new Promise(async (resolve, reject) => {\n if (!isNaN(identifier as number)) {\n const userid = Number(identifier);\n\n const basicResponse: Response<string> = await users(\n `v1/users/${userid}/`,\n );\n const followersResponse: Response<string> = await friends(\n `v1/users/${userid}/followers`,\n );\n const friendsResponse: Response<string> = await friends(\n `v1/users/${userid}/friends`,\n );\n const followingResponse: Response<string> = await friends(\n `v1/users/${userid}/followings`,\n );\n const avatarResponse: Response<string> = await thumbnails(\n `v1/users/avatar?userIds=${userid}&size=720x720&format=Png&isCircular=false`,\n );\n\n // Counter for followings, friends and followers\n const followingCountResponse: Response<string> = await friends(\n `v1/users/${userid}/followings/count`,\n );\n const friendsCountResponse: Response<string> = await friends(\n `v1/users/${userid}/friends/count`,\n );\n const followersCountResponse: Response<string> = await friends(\n `v1/users/${userid}/followers/count`,\n );\n\n // I love parsing.com\n const basicData = JSON.parse(JSON.stringify(basicResponse.body));\n const followersData = JSON.parse(JSON.stringify(followersResponse.body));\n const friendsData = JSON.parse(JSON.stringify(friendsResponse.body));\n const followingData = JSON.parse(JSON.stringify(followingResponse.body));\n const avatarData = JSON.parse(JSON.stringify(avatarResponse.body));\n\n const followingCountData = JSON.parse(\n JSON.stringify(followingCountResponse.body),\n );\n const friendsCountData = JSON.parse(\n JSON.stringify(friendsCountResponse.body),\n );\n const followersCountData = JSON.parse(\n JSON.stringify(followersCountResponse.body),\n );\n\n // Use raw data to get the numbers\n const followingCount: number = followingCountData.count;\n const friendsCount: number = friendsCountData.count;\n const followersCount: number = followersCountData.count;\n\n const followersArr = [];\n followersData.data.forEach((user) => {\n followersArr.push(user.id);\n });\n const friendsArr = [];\n friendsData.data.forEach((user) => {\n friendsArr.push(user.id);\n });\n const followingArr = [];\n followingData.data.forEach((user) => {\n followingArr.push(user.id);\n });\n\n resolve({\n id: basicData.id,\n username: basicData.name,\n displayName: basicData.displayName,\n description: basicData.description,\n created: basicData.created,\n avatar_url: avatarData.data[0].imageUrl,\n friends: {\n count: friendsCount,\n ids: friendsArr,\n },\n followers: {\n count: followersCount,\n ids: followersArr,\n },\n following: {\n count: followingCount,\n ids: followingArr,\n },\n });\n } else {\n if (typeof identifier === 'string') {\n const wow = await getNameFromId(identifier);\n const bruh = await getUser(wow);\n\n resolve(bruh);\n } else {\n reject(new TypeError('Identifier must be a number or a string'));\n }\n }\n });\n}\n","/* eslint-disable max-len */\nimport { Response } from 'got-cjs';\nimport { groups, thumbnails } from '../api';\n\ninterface GroupData {\n id: number;\n name: string;\n description: string;\n owner: OwnerObject;\n membercount: number;\n thumbnail: string;\n shout: Shout;\n roles: Array<RoleJSON>;\n}\n\ninterface RoleJSON {\n id: number;\n name: string;\n membercount: number;\n}\n\ninterface OwnerObject {\n buildersClubMembershipType: string;\n userId: number;\n username: string;\n displayName: string;\n}\n\ninterface Shout {\n content: string;\n created: string;\n author: ShoutAuthor;\n}\n\ninterface ShoutAuthor {\n id: number;\n username: string;\n displayName: string;\n}\n\n/**\n *\n * @param {number | string} identifier\n * @return {Promise<GroupData>}\n */\nexport default function getGroup(\n identifier: number | string,\n): Promise<GroupData> {\n return new Promise(async (resolve, reject) => {\n if (typeof identifier === 'number') {\n const roleResponse: Response<string> = await groups.get(\n `v1/groups/${identifier}/roles`,\n );\n const thumbnailResponse: Response<string> = await thumbnails.get(\n `v1/groups/icons?format=Png&groupIds=${identifier}&isCircular=false&size=420x420`,\n );\n const groupData: Response<string> = await groups.get(\n `v1/groups/${identifier}`,\n );\n const roles = JSON.parse(JSON.stringify(roleResponse.body));\n const group = JSON.parse(JSON.stringify(groupData.body));\n const thumbnail = JSON.parse(JSON.stringify(thumbnailResponse.body));\n\n // Time to return!\n const returnable = {\n id: group.id || null,\n name: group.name || null,\n description: group.description || null,\n owner: group.owner || null,\n membercount: group.memberCount || null,\n thumbnail: thumbnail.data[0].imageUrl || null,\n shout: null,\n roles: [],\n };\n\n if (group.shout) {\n returnable.shout = {\n content: group.shout.body,\n created: group.shout.created,\n author: {\n id: group.shout.poster.userId,\n username: group.shout.poster.username,\n displayName: group.shout.poster.displayName,\n },\n };\n }\n\n for (const role of roles.roles) {\n const i = roles.roles.indexOf(role);\n returnable.roles.push({\n id: role.id,\n name: role.name,\n membercount: role.memberCount,\n });\n if (i + 1 == roles.roles.length) return resolve(returnable);\n }\n\n return resolve(returnable);\n } else {\n const searchRes: Response<string> = await groups.get(\n `v1/groups/search/lookup?groupName=${identifier}`,\n );\n const search = JSON.parse(JSON.stringify(searchRes.body));\n\n if (!search.data.length) throw new Error('Group not found');\n\n const data: GroupData = await getGroup(search.data[0].id);\n if (data) {\n return resolve(data);\n } else {\n reject(new Error('Group not found'));\n }\n }\n });\n}\n","/* eslint-disable max-len */\nimport { Response } from 'got-cjs';\nimport { groups } from '../api';\nimport getNameFromId from '../utils/getIdFromName';\n\ninterface RoleObject {\n id: number;\n name: string;\n rank: number;\n}\n\n/**\n * **getGroupRank**\n *\n * Gets user's group rank within a group\n * @param {number | string} groupId\n * @param {number | string} user\n * @return {Promise<RoleObject>} A Promise that resolves to the user's role in the group\n */\nexport default function getGroupRank(\n groupId: number | string,\n user: number | string,\n): Promise<RoleObject> {\n return new Promise(async (resolve, reject) => {\n if (Number(user)) {\n const body: Response<string> = await groups.get(\n `v2/users/${Number(user)}/groups/roles?groupid=${Number(groupId)}`,\n );\n const parsedBody = JSON.parse(JSON.stringify(body.body));\n\n if (parsedBody.errors) {\n if (parsedBody.errors[0].code == 1) {\n return reject(new Error('Not found. - getUserRank.js'));\n }\n }\n\n const groupObject = parsedBody.data.find(\n (info) => groupId === info.group.id,\n );\n\n if (!groupObject) return reject(new Error('Not found. - getUserRank.js'));\n\n resolve(groupObject.role);\n } else {\n // Ensure it is an acutal string and get the user's id\n if (typeof user === 'string') {\n const wow = await getNameFromId(user, false);\n\n if (!wow) return reject(new TypeError('User was not found.'));\n\n const result = await getGroupRank(groupId, wow);\n\n resolve(result);\n }\n }\n });\n}\n","/* eslint-disable new-cap */\n/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\nimport { Response } from 'got-cjs';\nimport { games } from '../api';\n\ninterface Game {\n id: number;\n name: string;\n description: string;\n creator: GameCreator;\n rootPlace: PlaceRoot;\n created: string;\n updated: string;\n placeVisits: number;\n}\n\ninterface GameCreator {\n id: number;\n type: string;\n name: string;\n}\ninterface PlaceRoot {\n id: number;\n type: string;\n name: string;\n}\n/**\n *\n * @param {number | string} userId\n * @param {number} limit\n * @return {Promise<Array<Game>>}\n */\nexport default function getUserFavoriteGames(\n userId: number | string,\n limit: number,\n): Promise<Array<Game>> {\n return new Promise(async (resolve, reject) => {\n if (Number(userId)) {\n try {\n const favoriteGamesRes: Response<string> = await games.get(\n `v2/users/${userId}/favorite/games?accessFilter=All&limit=${limit}&sortOrder=Asc`,\n );\n const favoriteGames = JSON.parse(JSON.stringify(favoriteGamesRes.body));\n\n resolve(favoriteGames.data);\n } catch (error) {\n reject(error);\n }\n } else {\n reject(new Error('userId must be a number'));\n }\n });\n}\n","/* eslint-disable require-jsdoc */\nimport { catalog } from '../api';\n\nexport default function getCategories(): Promise<Object> {\n return new Promise(async (resolve, reject) => {\n try {\n const categories = catalog.get('v1/categories');\n\n resolve(categories.json());\n } catch (e) {\n reject(e);\n }\n });\n}\n","/* eslint-disable max-len */\nimport { catalog } from '../api';\n\n/**\n *\n * @param {number | string} bundleId\n * @return {Promise<string>}\n */\nexport default function getFavoritesOfBundle(\n bundleId: number | string,\n): Promise<string> {\n return new Promise(async (resolve, reject) => {\n if (Number(bundleId)) {\n try {\n const favorites = await catalog.get(\n `v1/favorites/bundles/${bundleId}/count`,\n );\n resolve(JSON.parse(JSON.stringify(favorites.body)));\n } catch (error) {\n reject(error);\n }\n } else {\n reject(new Error('Item ID must be a number'));\n }\n });\n}\n","/* eslint-disable max-len */\nimport { catalog } from '../api';\n\n/**\n *\n * @param {number | string} itemId\n * @return {Promise<string>}\n */\nexport default function getFavoritesOfItem(\n itemId: number | string,\n): Promise<string> {\n return new Promise(async (resolve, reject) => {\n if (Number(itemId)) {\n try {\n const favorites = await catalog.get(\n `v1/favorites/assets/${Number(itemId)}/count`,\n );\n resolve(JSON.parse(JSON.stringify(favorites.body)));\n } catch (error) {\n reject(error);\n }\n } else {\n reject(new Error('Item ID must be a number'));\n }\n });\n}\n","/* eslint-disable require-jsdoc */\n/* eslint-disable max-len */\nimport { Response } from 'got-cjs';\nimport { thumbnails } from '../api';\nimport getUser from './getUser';\n\ninterface EligibleSizes {\n body: EligibleSizesData;\n bust: EligibleSizesData;\n headshot: EligibleSizesData;\n}\n\ninterface EligibleSizesData {\n sizes: Array<string>;\n endpoint: string;\n}\n\ninterface PlayerThumbnail {\n Thumbnail: string;\n}\n\nconst eligibleSizes: EligibleSizes = {\n body: {\n sizes: [\n '30x30',\n '48x48',\n '60x60',\n '75x75',\n '100x100',\n '110x110',\n '140x140',\n '150x150',\n '150x200',\n '180x180',\n '250x250',\n '352x352',\n '420x420',\n '720x720',\n ],\n endpoint: 'avatar',\n },\n bust: {\n sizes: [\n '48x48',\n '50x50',\n '60x60',\n '75x75',\n '100x100',\n '150x150',\n '180x180',\n '352x352',\n '420x420',\n ],\n endpoint: 'avatar-bust',\n },\n headshot: {\n sizes: [\n '48x48',\n '50x50',\n '60x60',\n '75x75',\n '100x100',\n '110x110',\n '150x150',\n '180x180',\n '352x352',\n '420x420',\n '720x720',\n ],\n endpoint: 'avatar-headshot',\n },\n};\n\n/**\n * **getPlayerThumbnail**\n * @param {number | string} user\n * @param {string} size\n * @param {string} format\n * @param {boolean} isCircular\n * @param {string} cropType\n * @return {Promise<PlayerThumbnail>}\n */\nexport default async function getPlayerThumbnail(\n user: number | string,\n size: string,\n format: string,\n isCircular: boolean,\n cropType = 'body',\n): Promise<PlayerThumbnail> {\n return new Promise(async (resolve, reject) => {\n if (Number(user)) {\n cropType = cropType.toLowerCase();\n if (!Object.keys(eligibleSizes).includes(cropType)) {\n reject(\n new TypeError(\n `Invalid cropping type provided: ${cropType} | Use: ${Object.keys(\n eligibleSizes,\n ).join(', ')}`,\n ),\n );\n }\n const { sizes, endpoint } = eligibleSizes[cropType];\n // Validate size\n size = size || sizes[sizes.length - 1];\n if (typeof size === 'number') {\n size = `${size}x${size}`;\n }\n if (!sizes.includes(size)) {\n reject(\n new TypeError(\n `Invalid size parameter provided: ${size} | [${cropType.toUpperCase()}] Use: ${sizes.join(\n ', ',\n )}`,\n ),\n );\n }\n if (format.toLowerCase() !== 'png' && format.toLowerCase() !== 'jpeg') {\n reject(\n new TypeError(\n `Invalid image type provided: ${format} | Use: png, jpeg`,\n ),\n );\n }\n\n const avatarResponse: Response<string> = await thumbnails.get(\n `v1/users/${endpoint}?userIds=${user}&size=${size}&format=${format}&isCircular=${isCircular}`,\n );\n const avatarData = JSON.parse(JSON.stringify(avatarResponse.body));\n\n return resolve({\n Thumbnail: avatarData.data[0].imageUrl,\n });\n } else {\n const userData = await getUser(user);\n if (userData.id) {\n const bruh = await getPlayerThumbnail(\n userData.id,\n size,\n format,\n isCircular,\n cropType,\n );\n return resolve(bruh);\n } else {\n reject(new Error('User not found'));\n }\n }\n });\n}\n","/* eslint-disable max-len */\nimport { catalog } from '../api';\nimport { Response } from 'got-cjs';\n\ninterface Bundle {\n id: number;\n name: string;\n bundleType: string;\n creator: BundleCreator;\n}\n\ninterface BundleCreator {\n id: number;\n name: string;\n type: string;\n}\n/**\n *\n * @param {string | number} userId\n * @return {Promise<Array<any>>}\n */\nexport default function getUserBundles(\n userId: string | number,\n): Promise<Bundle> {\n return new Promise(async (resolve, reject) => {\n try {\n const resultRes: Response<string> = await catalog.get(\n `v1/users/${Number(userId)}/bundles`,\n );\n const result = JSON.parse(JSON.stringify(resultRes.body));\n\n resolve(result.data);\n } catch (error) {\n reject(error);\n }\n });\n}\n","/* eslint-disable max-len */\nimport { Response } from 'got-cjs';\nimport { games, thumbnails } from '../api';\n\ninterface GameData {\n id: number;\n name: string;\n description: string;\n creator: OwnerObject;\n thumbnails: string;\n price: number;\n allowedGearGenres: string;\n allowedGearCategories: string;\n playing: number;\n visits: number;\n maxPlayers: number;\n created: string;\n updated: string;\n genres: string;\n favoritedCount: number;\n}\n\ninterface OwnerObject {\n id: number;\n name: string;\n type: string;\n isRNVAccount: boolean;\n}\n\n/**\n *\n * @param {number} identifier\n * @return {Promise<GameData>}\n */\nexport default function (identifier: number): Promise<GameData> {\n // eslint-disable-next-line require-jsdoc\n return new Promise(async (resolve, reject) => {\n if (Number(identifier)) {\n const gameData: Response<string> = await games.get(\n `v1/games?universeIds=${identifier}`,\n );\n const thumbnailresponse: Response<string> = await thumbnails.get(\n `v1/places/gameicons?placeIds=${identifier}&size=128x128&format=Jpeg&isCircular=true`,\n );\n const game = JSON.parse(JSON.stringify(gameData.body));\n const thumbnail = JSON.parse(JSON.stringify(thumbnailresponse.body));\n resolve({\n id: game.id || null,\n name: game.name || null,\n description: game.description || null,\n creator: game.creator || null,\n thumbnails: thumbnail.imageUrl || null,\n price: game.price || null,\n allowedGearGenres: game.allowedGearGenres || null,\n allowedGearCategories: game.allowedGearCategories || null,\n playing: game.playing || null,\n visits: game.visits || null,\n maxPlayers: game.maxPlayers || null,\n created: game.created || null,\n updated: game.updated || null,\n genres: game.genres || null,\n favoritedCount: game.favoritedCount || null,\n });\n } else {\n return reject(\n new Error('Invalid identifier, it should be a number not a string.'),\n );\n }\n });\n}\n","/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\nimport { games } from '../api';\n// Types\ninterface VotesData {\n upVotes: number;\n downVotes: number;\n}\n\n// Error Messages\nconst notUniversalId =\n 'Number is not a universe id, use getUniverseId() to get the universe id.';\n\nexport default function getGameVotes(id: number | string): Promise<VotesData> {\n function statusIs500(status: number) {\n if (status == 500 || 501 || 502 || 503 || 504) {\n return true;\n } else {\n return false;\n }\n }\n return new Promise(async function (resolve, reject) {\n if (Number(id)) {\n const bruh = await games.get(`v1/games/votes?universeIds=${id}`);\n const data = JSON.parse(JSON.stringify(bruh.body));\n if (statusIs500(bruh.statusCode)) {\n reject(new Error(`${bruh.statusCode}: ${bruh.statusMessage}`));\n }\n\n if (!data[0]) {\n reject(new TypeError(notUniversalId));\n }\n\n return resolve({\n upVotes: data.data[0].upVotes,\n downVotes: data.data[0].downVotes,\n });\n }\n });\n}\n","/* eslint-disable max-len */\nimport { Response } from 'got-cjs';\nimport { api } from '../api';\n\n/**\n * @param {string} placeId\n * @return {Promise<Number>}\n */\nexport default function getUniverseId(\n placeId: number | string,\n): Promise<number> {\n return new Promise(async (resolve, reject) => {\n const res: Response<string> = await api.get(\n `universes/get-universe-containing-place?placeid=${placeId}`,\n );\n const data = JSON.parse(JSON.stringify(res.body));\n\n if (data.body.success) {\n resolve(data.data.universeId);\n } else {\n reject(new Error(data.data.errors[0].message));\n }\n });\n}\n","/* eslint-disable max-len */\nimport { generalCache } from './caches';\nimport cookieJar from './jar';\nimport { auth } from '../api';\n\n/**\n * Get the XCSRF token. (Utility only)\n * @param {string} jar\n * @return {string}\n */\nexport default function getGeneralToken(): Promise<string | string[]> {\n return new Promise(async (resolve, reject) => {\n if (generalCache.has('XCSRF')) {\n return resolve(generalCache.get('XCSRF'));\n }\n\n const res = await auth.post('/v2/logout', {\n cookieJar,\n });\n\n if (res.statusCode !== 200) {\n return reject(new Error('Authentication API returned an error: ' + res.statusCode));\n }\n\n const csrfToken: string | string[] = res.headers['x-csrf-token'];\n\n if (!csrfToken) {\n return reject(new Error('Could not get XCSRF token!'));\n } else {\n generalCache.set('XCSRF', csrfToken);\n return resolve(csrfToken);\n }\n });\n}\n","/* eslint-disable max-len */\nimport { Response } from 'got-cjs';\nimport { groups } from '../api';\n\ninterface Roles {\n roles: Array<RoleJSON>\n}\n\ninterface RoleJSON {\n id: number;\n name: string;\n membercount: number;\n}\n\n\n/**\n *\n * @param { number } groupid\n * @return {Promise<Roles>}\n */\nexport default function getRoles( groupid: number ): Promise<Roles> {\n return new Promise(async (resolve, reject) => {\n if (typeof groupid === 'number') {\n const roleResponse: Response<string> = await groups.get(\n `v1/groups/${groupid}/roles`,\n );\n const roles = JSON.parse(JSON.stringify(roleResponse.body));\n const data = {\n roles: [],\n };\n\n for (const role of roles.roles) {\n const i = roles.roles.indexOf(role);\n data[0].roles.push({\n id: role.id,\n name: role.name,\n membercount: role.memberCount,\n });\n if (i + 1 == roles.roles.length) return resolve(data);\n }\n\n return resolve(data);\n } else {\n reject(new TypeError('Group param must be a number'));\n }\n });\n}\n","import getRoles from \"./getRoles\";\n\ninterface RoleJSON{\n id: number;\n name: string;\n membercount: number;\n}\n\n\n/**\n *\n * @param { number } groupid\n * @return {Promise<Roles>}\n */\n export default function getRole( groupid: number, rank: number | string ): Promise<RoleJSON> {\n return new Promise(async (resolve, reject) => {\n\n const roles = await getRoles(groupid);\n if(typeof rank === 'number' || typeof rank === 'string' && typeof groupid === 'number') {\n\n if(typeof rank === 'string'){\n\n const result = roles.roles.find( ({ name }) => name === rank );\n\n return resolve({\n id: result.id,\n name: result.name,\n membercount: result.membercount\n })\n\n \n }else if(typeof rank === 'number'){\n const result = roles.roles.find( ({ id }) => id === rank );\n\n return resolve({\n id: result.id,\n name: result.name,\n membercount: result.membercount\n })\n\n }\n\n }else{\n reject(new TypeError('The rank must be a number/string and the groupID must be a number.'))\n }\n })\n}","/* eslint-disable max-len */\nimport { groups } from '../api';\nimport getGroupRank from '../user/getUserRank';\nimport cookieJar from '../utils/jar';\nimport getGeneralToken from '../utils/getGeneralToken';\nimport getRole from './getRole'\n\n/**\n * **setRank**\n * @param {number } groupid\n * @param { number } user\n * @param { number } newrank\n * @return {Promise<Object>}\n */\nexport default function setRank(groupid: number, user: number, newrank: number): Promise<object> {\n return new Promise(async (resolve, reject) => {\n if (typeof groupid == 'number' && typeof user == 'number' && typeof newrank == 'number') {\n const userRank = await getGroupRank(groupid, user);\n const data = { roleId: newrank };\n\n await groups.patch(`v1/groups/${groupid}/users/${user}`, {\n cookieJar, json: data, headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': await getGeneralToken() },\n }).then(function() {\n const newRankInfo = getRole(groupid, newrank)\n resolve({ oldRank: userRank, newRank: newRankInfo });\n }).catch(function(err) {\n reject(err);\n });\n } else {\n reject(new TypeError('All the parameters in this function should be numeric, please check your parameters'));\n }\n });\n}\n","/* eslint-disable max-len */\nimport { groups } from '../api';\nimport getGroupRank from '../user/getUserRank';\nimport setRank from '../group/setRank';\n\n\n/**\n * **Change Rank**\n * @param {number } groupid\n * @param { number | string } user\n * @param { number } method\n * @return {Promise<object>}\n */\nexport default function changeRank(groupid: number, user: number, method: number): Promise<object> {\n return new Promise(async (resolve, reject) => {\n const roleResponse1 = await groups.get(\n `v1/groups/${groupid}/roles`,\n );\n\n const roleResponse = JSON.parse(JSON.stringify(roleResponse1.body));\n const userrank = await getGroupRank(groupid, user);\n\n for (let i = 0; i < roleResponse.roles.length; i++) {\n const role1 = roleResponse.roles[i];\n const Rank = role1.id;\n\n if (Rank === userrank.id) {\n const change = i + method;\n const nextrank = roleResponse.roles[change];\n const index = roleResponse.roles.indexOf(nextrank);\n const role = roleResponse.roles[index];\n\n if (nextrank === 0) {\n reject(new TypeError('Can\\'t demote someone to rank 0 (GUEST) unless I exile them...'));\n } else if (!nextrank) {\n reject(new TypeError('Can\\'t find this user next rank...'));\n } else if (nextrank > 0 && nextrank && nextrank < 255) {\n await setRank(groupid, user, index.rolese).then(async function() {\n return resolve({ newRank: role, oldRank: userrank });\n }).catch(function(err) {\n reject(new TypeError(err));\n });\n }\n }\n }\n });\n}\n","/* eslint-disable max-len */\nimport changeRank from '../utils/changeRank';\nimport getIdFromName from '../utils/getIdFromName';\n/**\n * **Promote**\n * @param {number } groupid\n * @param { number | string } user\n * @return {Promise<Object>}\n */\nexport default async function promote(groupid: number, user: string | number): Promise<object> {\n return new Promise(async (resolve, reject) => {\n if (!isNaN(groupid)) {\n if (typeof user == 'number') {\n const result = await changeRank(groupid, user, 1);\n resolve(result);\n } else if (typeof user == 'string') {\n const userid = await getIdFromName(user);\n const result = await changeRank(groupid, userid, 1);\n resolve(result);\n } else {\n reject(new TypeError('User must be a number or a string'));\n }\n }\n });\n}\n","/* eslint-disable max-len */\nimport changeRank from '../utils/changeRank';\nimport getIdFromName from '../utils/getIdFromName';\n/**\n * **Demote**\n * @param {number } groupid\n * @param { number | string } user\n * @return {Promise<Object>}\n */\nexport default function demote(groupid: number, user: string | number): Promise<object> {\n return new Promise(async (resolve, reject) => {\n if (!isNaN(groupid)) {\n if (typeof user == 'number') {\n const result = await changeRank(groupid, user, Number(-1));\n resolve(result);\n } else if (typeof user == 'string') {\n const userid = await getIdFromName(user);\n const result = await changeRank(groupid, userid, Number(-1));\n resolve(result);\n } else {\n reject(new TypeError('User must be a number or a string'));\n }\n }\n });\n}\n","/* eslint-disable max-len */\nimport { mobileAPI } from '../api';\nimport tough from 'tough-cookie';\nimport cookieJar from './jar';\n\n/**\n * Get the current user's data. (Utility only)\n * @param {string} jar\n* @return {Promise<Object>}\n */\nexport default function getCurrentUser(jar?: string) {\n return new Promise(async function(resolve, reject) {\n switch (jar) {\n case jar:\n const Cookie = tough.Cookie;\n const bruh = Cookie.parse('.ROBLOSECURITY');\n bruh.value = jar;\n cookieJar.setCookie(bruh, 'https://roblox.com', async (err: boolean) => {\n switch (err) {\n case true:\n reject(err);\n break;\n default:\n const resA = await mobileAPI.get('userinfo', {\n cookieJar,\n });\n if (resA.statusCode !== 200) {\n reject(new Error('You are not logged in!'));\n }\n resolve(JSON.parse(JSON.stringify(resA.body)));\n }\n });\n break;\n default:\n const resB = await mobileAPI.get('userinfo', {\n cookieJar,\n });\n if (resB.statusCode !== 200) {\n reject(new Error('You are not logged in!'));\n }\n resolve(resB.body);\n break;\n }\n });\n}\n","import getCurrentUser from '../utils/getCurrentUser';\n\ninterface LoggedInUserData {\n UserID: number\n UserName: string\n RobuxBalance: number\n ThumbnailUrl: string\n IsAnyBuildersClubMember: boolean\n IsPremium: boolean\n}\n\n/**\n * Set the cookie for the user\n * @param {string} cookie\n * @return {Promise<void>}\n */\nexport default function setCookie(cookie: string): Promise<LoggedInUserData> {\n return new Promise(async (resolve, reject) => {\n if (!cookie.toLowerCase().includes('warning:-')) {\n // eslint-disable-next-line max-len\n return reject(new TypeError('You didn\\'t include the Roblox Warning. Please include the entire .ROBLOSECURITY cookie.'));\n }\n\n getCurrentUser(cookie).then(resolve).catch(reject);\n });\n}\n","/* eslint-disable max-len */\nimport { Response } from 'got-cjs';\nimport { groups } from '../api';\nimport getNameFromId from '../utils/getIdFromName';\n\ninterface GroupObject {\n data: []\n}\n\n/**\n * **getGroups**\n *\n * Gets user's groups\n * @param {number | string} user\n * @return {Promise<GroupObject>} A Promise that resolves to the user's groups\n */\nexport default function getGroups(\n user: number | string,\n): Promise<GroupObject> {\n return new Promise(async (resolve, reject) => {\n if (Number(user)) {\n const body: Response<string> = await groups.get(\n `v2/users/${Number(user)}/groups/roles`,\n );\n const parsedBody = JSON.parse(JSON.stringify(body.body));\n\n if (parsedBody.errors) {\n if (parsedBody.errors[0].code == 1) {\n return reject(new Error('Not found. - getUserRank.js'));\n }\n }\n\n\n resolve(parsedBody);\n } else {\n // Ensure it is an acutal string and get the user's id\n if (typeof user === 'string') {\n const wow = await getNameFromId(user);\n\n if (!wow) return reject(new TypeError('User was not found.'));\n\n const result = await getGroups(wow);\n\n resolve(result);\n }\n }\n });\n}\n","/* eslint-disable max-len */\nimport { groups } from '../api';\nimport cookieJar from '../utils/jar';\nimport getGeneralToken from '../utils/getGeneralToken';\n\n/**\n * **deletePost**\n * @param { number } groupid\n * @param { number } postId \n\n * @return { Promise<Object> }\n */\nexport default function deletePost(groupid: number, postId: number): Promise<Object> {\n return new Promise(async (resolve, reject) => {\n if(typeof groupid === 'number' && typeof postId === 'number'){\n\n const response = await groups.delete(`/v1/groups/${groupid}/wall/posts/${postId}`, {\n cookieJar, headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': await getGeneralToken() },\n })\n\n if (response.statusCode !== 200) return reject(new Error(\"\"))\n\n return resolve(postId);\n }\n })\n}","/* eslint-disable max-len */\nimport { groups } from '../api';\nimport cookieJar from '../utils/jar';\nimport getGeneralToken from '../utils/getGeneralToken';\n\n/**\n * **deletePostBySpecificUser**\n * @param { number } groupid\n * @param { number } userid \n\n * @return { Promise<Object> }\n */\nexport default function deletePostBySpecificUser(groupid: number, userid: number): Promise<Object> {\n return new Promise(async (resolve, reject) => {\n if(typeof groupid === 'number' && typeof userid === 'number'){\n\n const response = await groups.delete(`/v1/groups/${groupid}/wall/users/${userid}/posts`, {\n cookieJar, headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': await getGeneralToken() },\n })\n\n if (response.statusCode !== 200) return reject(new Error(\"\"))\n\n return resolve(userid);\n }\n })\n}","/* eslint-disable max-len */\nimport { groups } from '../api';\nimport cookieJar from '../utils/jar';\nimport getGeneralToken from '../utils/getGeneralToken';\n\ninterface WallResponse {\n data: [];\n}\n\n/**\n * **getGroupWall**\n * @param { number } groupid\n * @param { number } limit //Max 100\n * @param { string } cursor\n * @param { string } sortOrder\n * @return { Promise<WallResponse> }\n */\nexport default function getGroupWall(groupid: number, limit?: number, cursor?: string, sortOrder?: string): Promise<WallResponse> {\n return new Promise(async (resolve, reject) => {\n if(typeof groupid === 'number'){\n if(!cursor) cursor = 'cursor'\n if(!limit) limit = 10\n if(!sortOrder) sortOrder = 'Asc'\n\n const response = await groups.get(`/v1/groups/${groupid}/wall/posts?limit=${limit}?cursor=${cursor}?sortOrder=${sortOrder}`, {\n cookieJar, headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': await getGeneralToken() },\n })\n\n if (response.statusCode !== 200) return reject(new Error(\"\"))\n\n return resolve(JSON.parse(JSON.stringify(response.body)));\n }\n })\n}","/* eslint-disable max-len */\n\nimport { games } from \"../api\"\nimport type { GroupGamesAPIResponse } from \"../utils/APITypes\";\n\ntype GroupGame = {\n id: number,\n name: string,\n description: string,\n placeVisits: number\n}\n\nexport default function getGroupGames(groupId: string | number): Promise<GroupGame[]> {\n return new Promise(async (resolve, reject) => {\n const finishedData = [];\n const gamesInGroupData = await games.get(`v2/groups/${groupId}/games`)\n const gamesInGroup: GroupGamesAPIResponse = JSON.parse(JSON.stringify(gamesInGroupData.body));\n gamesInGroup.data.forEach(game => {\n finishedData.push({ id: game.id, name: game.name, description: game.description, placeVisits: game.placeVisits })\n });\n resolve(finishedData);\n })\n}"],"mappings":"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