boblox.js
Version:
Wrapper for the vast roblox api.
792 lines (784 loc) • 24.9 kB
TypeScript
type Limit = 10|25|50|100;
type AvatarImageSize = 30|48|60|75|100|110|140|150|250|352|420|720;
type AvatarHeadshotImageSize =48|60|75|100|110|140|150|250|352|420|720;
type HumanoidRigType = "R6" | "R15"
type AssetType = "Image"|"TShirt"|"Audio"|"Mesh"|"Lua"|"Hat"|"Place"|"Model"|"Shirt"|"Pants"|"Decal"|"Head"|"Face"|"Gear"|"Badge"|"Animation"|"Torso"|"RightArm"|"LeftArm"|"LeftLeg"|"RightLeg"|"Package"|"GamePass"|"Plugin"|"MeshPart"|"HairAccessory"|"FaceAccessory"|"NeckAccessory"|"ShoulderAccessory"|"FrontAccessory"|"BackAccessory"|"WaistAccessory"|"ClimbAnimation"|"DeathAnimation"|"FallAnimation"|"IdleAnimation"|"JumpAnimation"|"RunAnimation"|"SwimAnimation"|"WalkAnimation"|"PoseAnimation"|"EarAccessory"|"EyeAccessory"|"EmoteAnimation"|"Video"|"TShirtAccessory"|"ShirtAccessory"|"PantsAccessory"|"JacketAccessory"|"SweaterAccessory"|"ShortsAccessory"|"LeftShoeAccessory"|"RightShoeAccessory"|"DressSkirtAccessory"
type CreatorTypes = "User" |"Group"
export class thisClient{
UserID: number;
UserName: string;
RobuxBalance: number;
ThumbnailUrl:string;
IsAnyBuildersClubMember:boolean;
IsPremium:boolean;
DisplayName:string;
}
export class UniverseCreator{
id:number;
name:string;
type:CreatorTypes;
isRNVAccount:boolean;
}
export class AssetCreator{
Id:number;
Name:string;
CreatorType:CreatorTypes;
}
type RobloxDate= `${number}-${number}-${number}T${number}:${number}:${number}/${number}Z`
type UniverseAvatarType = `MorphToR15` | `MorphToR6`
type transactionType ="Sale"|"Purchase"|"AffiliateSale"|"DevEx"|"GroupPayout"|"AdImpressionPayout"|"CurrencyPurchase"|"TradeRobux"|"PremiumStipend"|"PendingRobux"|"EngagementPayout"|"GroupEngagementPayout"|"AdSpend"|"Summary"|"IndividualToGroup"|"CSAdjustment"
export class Universe{
id:number;
rootPlaceId:number;
name:string;
description?:string;
creator:UniverseCreator;
price?:number;
allowedGearGenres : Array<string>;
allowedGearCategories: Array<string>;
isGenreEnforced:boolean;
copyingAllowed:boolean;
playing:number;
visits:number;
maxPlayers:number;
created:RobloxDate;
update:RobloxDate;
studioAccessToApisAllowed:boolean;
createVipServersAllowed:boolean;
universeAvatarType:UniverseAvatarType;
genre:string;
isAllGenre:boolean;
gameRating?:Object; // Not so sure about this one but most games dont have one
isFavoritedByUser:boolean;
favoritedCount:number;
}
export class IncomingAlerts{
unreadMessageCount:number;
friendRequestsCount:number;
}
export class Asset{
TargetId:number;
ProductType?:string
AssetId:number;
ProductId:number;
Name:string;
Description?:string;
Creator:AssetCreator;
IconImageAssetId:number;
Created:RobloxDate;
Updated:RobloxDate;
PriceInRobux?:number;
PriceInTickets:null; // RIP TIX
Sales:number;
IsNew:boolean;
IsForSale:boolean;
IsPublicDomain:boolean;
IsLimited:boolean;
IsLimitedUnique:boolean;
Remaining?:number;
MinimumMembershipLevel:number;
}
export class GamePass{
TargetId:number;
ProductType:"Game Pass"
AssetId:number;
ProductId:number;
Name:string;
Description?:string;
Creator:AssetCreator;
IconImageAssetId:number;
Created:RobloxDate;
Updated:RobloxDate;
PriceInRobux?:number;
PriceInTickets:null; // RIP TIX
Sales:number;
IsNew:boolean;
IsForSale:boolean;
IsPublicDomain:boolean;
IsLimited:boolean;
IsLimitedUnique:boolean;
Remaining:null;
MinimumMembershipLevel:number;
}
export class DeviceInfo{
PlatformType:string;//PC and etc
DeviceType:string //Computer and etc
OperatingSystemType: string; //windows linux etc
}
export class Player{
description?:string;
created:RobloxDate;
isBanned:boolean;
externalAppDisplayName:string;
id:number;
name:string;
displayName:string;
}
export class UserPresence{
userPresenceType:number; // 0,1,2 etc i cant tell what exactly they mean but 0 is offline and 2 is playing?!?!?!
lastLocation:string; // Website and mobile and etc
placeId?:number;
rootPlaceId?:number;
gameId?:string // format according to api: 00000000-0000-0000-0000-000000000000
universeId?:number;
userId:number;
lastOnline:RobloxDate;
}
export class Friend {
isOnline:boolean;
presenceType:number; // 0,1,2 etc i cant tell what exactly they mean but 0 is offline and 2 is playing?!?!?!
isDeleted:boolean;
friendRequestRank:number;
description?:string;
created:RobloxDate
isBanned:boolean;
externalAppDisplayName:string;
id:number;
name:string;
displayName:string;
}
export class Follower{
isOnline:boolean;
presenceType:number; // 0,1,2 etc i cant tell what exactly they mean but 0 is offline and 2 is playing?!?!?!
isDeleted:boolean;
friendRequestRank:number;
description?:string;
created:RobloxDate
isBanned:boolean;
externalAppDisplayName:string;
id:number;
name:string;
displayName:string;
}
export class Following{
isOnline:boolean;
presenceType:number; // 0,1,2 etc i cant tell what exactly they mean but 0 is offline and 2 is playing?!?!?!
isDeleted:boolean;
friendRequestRank:number;
description?:string;
created:RobloxDate
isBanned:boolean;
externalAppDisplayName:string;
id:number;
name:string;
displayName:string;
}
export class OnlineFriendPresence{
UserPresenceType:string;
UserLocationType:string;
lastLocation:string;
placeId:number;
rootPlaceId:number;
gameInstanceId?:string;// format according to api: 00000000-0000-0000-0000-000000000000
universeId:number;
lastOnline:RobloxDate
}
export class OnlineFriend{
userPresence:OnlineFriendPresence;
id:number;
name:string;
displayName:string;
}
export class GameAsset{
assetTypeId:number; //https://developer.roblox.com/en-us/api-reference/enum/AssetType
assetType:string; //name for the asset type like Image, YoutubeVideo etc
imageId?:number;
videoHash?:string;
videoTitle?:string;
approved:boolean;
}
export class GroupGame{
id:number;
name:string;
description?:string;
creator:{
id:number;
type:"Group";
name:string;
};
rootPlace:{
id:number;
type:AssetType
};
created:RobloxDate;
updated:RobloxDate;
placeVisits:number;
}
export class FavGame{
id:number;
name:string;
description?:string;
creator:{
id:number;
type:"User";
name:string;
};
rootPlace:{
id:number;
type:AssetType
};
created:RobloxDate;
updated:RobloxDate;
placeVisits:number;
}
export class UserGame{
id:number;
name:string;
description?:string;
creator:{
id:number;
type:"User";
name:string;
};
rootPlace:{
id:number;
type:AssetType
};
created:RobloxDate;
updated:RobloxDate;
placeVisits:number;
}
export class PublicServer{
id:string;//00000000-0000-0000-0000-000000000000
maxPlayers:number;
playing:number;
playerTokens:Array<string>;
fps:number;
ping:number;
}
export class VIPServer{
maxPlayers:number;
name:string;
vipServerId:number;
accessCode:string;
ownerUserId:number;
}
export class GameProductInfo{
universeId:number;
isForSale:boolean;
productId:number;
price?:number;
sellerId:number
}
export class Place{
placeId:number;
name:string;
description?:string;
url:string;
builder:string;
builderId:number;
isPlayable:boolean;
reasonProhibited:string;
universeId:number;
universeRootPlaceId:number;
price?:number;
imageToken:string;
}
export class SearchedGameResult{
creatorId:number;
creatorName:string;
creatorType:CreatorTypes;
totalUpVotes:number;
totalDownVotes:number;
universeId:number;
name:string;
placeId:number;
playerCount:number;
imageToken:string;
isSponsored:boolean;
nativeAdData:string;
isShowSponsoredLabel:boolean;
price?:number;
analyticsIdentifier?:string;
gameDescription?:string;
genre:string;
}
export class RecommendedGame{
creatorId:number;
creatorName:string;
creatorType:CreatorTypes;
totalUpVotes:number;
totalDownVotes:number;
universeId:number;
name:string;
placeId:number;
playerCount:number;
imageToken:string;
isSponsored:boolean;
nativeAdData:string;
isShowSponsoredLabel:boolean;
price?:number;
analyticsIdentifier?:string;
gameDescription?:string;
genre:string;
}
export class GamepassResult{
id:number;
name:string;
description?:string;
productId:number;
price?:number;
}
export class GetVIPServerResult{
id:number;
name:string;
game:{
id:number;
name:string;
rootPlace:{
id:number;
name:string;
}
};
joinCode?:string;
active:boolean;
subscription:{
active: boolean;
expired: boolean;
expirationDate:RobloxDate;
price: number;
canRenew: boolean;
hasInsufficientFunds: boolean;
hasRecurringProfile: boolean;
hasPriceChanged: boolean;
};
permissions:{
clanAllowed:boolean;
enemyClanId?:boolean;
friendsAllowed:boolean;
users:Array<{
id:number;
name:string;
displayName:string;
}>;
};
voiceSettings:{
enabled:boolean;
}
}
export class SearchUserResult{
previousUsernames:Array<string>;
id:number;
name:string;
displayName:string;
}
export class UsernameHistoryObject{
name:string;
}
export class Outfit{
id:number;
name:string;
isEditable:boolean;
}
export class Avatar{
scales: {
height: number;
width: number;
head: number;
depth: number;
proportion: number;
bodyType: number
};
playerAvatarType: HumanoidRigType;
bodyColors: {
headColorId: number;
torsoColorId: number;
rightArmColorId: number;
leftArmColorId: number;
rightLegColorId: number;
leftLegColorId: number
};
assets: Array<{
id: number;
name: string;
assetType: {
id: number;
name: string
};
currentVersionId: number;
meta: {
order: number;
puffiness: number;
version: number;
}
}>
defaultShirtApplied: boolean;
defaultPantsApplied: boolean;
emotes: Array<{
assetId: number;
assetName: string,
position: number
}>
}
export class Reseller{
userAssetId:number;
seller:{
id:number;
type:CreatorTypes;
name:string;
}
price:number;
serialNumber?:number
}
export class GroupInfo{
id: number
name: string
description: string
owner: {
buildersClubMembershipType: string
userId: number
username: string
displayName: string
}
shout: {
body: string
poster: {
buildersClubMembershipType: number;
userId: number
username: string
displayName: string
}
created: RobloxDate
updated: RobloxDate
}
memberCount: number
isBuildersClubOnly: boolean
publicEntryAllowed: boolean
isLocked: boolean
}
export class Role{
id: number;
name: string;
description: string;
rank: number;
memberCount:number;
}
export class SocialLink {
id:number;
type:string; // Facebook, Youtube, Discord etc
url:string;
title:string;
}
export class Trade {
offers:Array<{
user:{
id:number;
name:string;
displayName:string;
};
userAssets:Array<{
id:number;
serialNumber:number;
assetId:number;
name:string;
recentAveragePrice:number;
originalPrice?:number;
assetStock?:number;
membershipType:string;
}>;
robux:number;
}>;
id:number;
user:{
id:number;
name:string;
displayName:string;
};
created:RobloxDate;
expiration:RobloxDate;
isActive:boolean;
status:string;
}
export class SearchGroupResult{
id: number;
name: string;
description: string;
memberCount: number;
publicEntryAllowed: boolean;
created: RobloxDate;
updated: RobloxDate;
}
export class SearchForGroupResult{
id: number;
name: string;
memberCount: number;
}
export class Chat{
conversation:{
id: number,
title: string,
initiator: {
type: "User",
targetId: number,
name: string,
displayName: string
};
hasUnreadMessages: boolean;
participants: Array<{
type: "User",
targetId: number,
name: string,
displayName: string
}>;
conversationType: "OneToOneConversation";
conversationTitle: {
titleForViewer: string,
isDefaultTitle: boolean;
};
lastUpdated: RobloxDate;
conversationUniverse: {
universeId: number;
rootPlaceId: number
};
}
}
export class DeveloperProduct{
id:number;
name:string;
Description:string;
shopId:number;
iconImageAssetId:number;
}
export class Bundle{
id:number;
name:string;
description?:string;
bundleType:string;
items:Array<{
owned:boolean;
id:number;
name:string;
type:"Asset"
}>
creator:{
id:number;
name:string;
type:CreatorTypes;
}
product:{
type:string;
isPublicDomain:boolean;
isForSale:boolean;
priceInRobux?:number;
isFree:boolean;
noPriceText?:string;
}
}
export class UserInventory{
assetId:number;
name:string;
assetType:AssetType;
created:RobloxDate;
}
export class Collectible{
userAssetId:number;
serialNumber:number;
assetId:number;
name:string;
recentAveragePrice:number;
originalPrice?:number;
assetStock?:number;
buildersClubMembershipType:number;
}
export class PlaceFromUniverse{
id:number;
name:string;
description?:string;
universeId:number;
}
export class PurchaseVipServerRes{
id:string; //00000000-0000-0000-0000-000000000000
maxPlayers:number;
playing:number;
playerTokens:Array<string>;
fps:number;
ping:number;
vipServerId:number;
accessCode:string; //00000000-0000-0000-0000-000000000000
ownerUserId:number;
}
export class UpdatedVipServerSubscription{
active: boolean;
expired: boolean;
expirationDate: RobloxDate;
price: number;
canRenew:boolean;
hasInsufficientFunds: boolean;
hasRecurringProfile:boolean;
hasPriceChanged: boolean;
}
export class UpdatedVipServer{
id:number;
name:string;
game:{
id:number;
name:string;
rootPlace:{
id:number;
name:string;
}
};
joinCode?:string;
active:boolean;
subscription:{
active: boolean;
expired: boolean;
expirationDate:RobloxDate;
price: number;
canRenew: boolean;
hasInsufficientFunds: boolean;
hasRecurringProfile: boolean;
hasPriceChanged: boolean;
};
permissions:{
clanAllowed:boolean;
enemyClanId?:boolean;
friendsAllowed:boolean;
users:Array<{
id:number;
name:string;
displayName:string;
}>;
};
voiceSettings:{
enabled:boolean;
}
}
export class Transactions{
id:number;
created:RobloxDate;
isPending:boolean;
agent:{
id:number,
type:CreatorTypes,
name: string
};
details:{
id:number,
name:string,
type:string // "Asset" for when i was testing shirt transactions
}
}
export class RobloxClient {
cookie:string;
csrf:string;
// Methods
Initialize(cookie: any): Promise<RobloxClient>;
IsValidCookie(cookiee: string): Promise<boolean>;
GetCSRFToken(): Promise<string>;
GetGameInfo(universeId: number): Promise<Universe>;
GetUniverseID(placeId: number): Promise<number>;
GetIncomingAlerts(): Promise<IncomingAlerts>;
GetAssetInfo(assetID: number): Promise<Asset>;
GetGamepassInfo(gamepassID: number): Promise<GamePass>;
UserOwnsAsset(assetID: number, UserId: number): Promise<boolean>;
GetDeviceInfo(): Promise<DeviceInfo>;
Block(UserId: number): Promise<void>;
Unblock(UserId: number): Promise<void>;
GetUserFromID(UserId: number): Promise<Player>;
GetUserFromName(username: string): Promise<Player>;
CanManageAsset(UserId: number, assetID: number): Promise<boolean>;
GetUserPresence(UserId: number): Promise<UserPresence>;
FriendCount(UserId: number): Promise<number>;
GetFriends(UserId: number): Promise<Array<Friend>>;
FollowerCount(UserId: number): Promise<number>;
GetFollowers(UserId: number, limit?: Limit): Promise<Array<Follower>>;
FollowingCount(UserId: number): Promise<number>;
GetFollowings(UserId: number, limit?: Limit): Promise<Array<Following>>;
GetCurrentUser():Promise<thisClient>;
GetOnlineFriends(): Promise<Array<OnlineFriend>>;
DeclineAllPendingFriendRequests(): Promise<void>;
AcceptFriendRequest(requesterId: number): Promise<void>;
DeclineFriendRequest(requesterId: number): Promise<void>;
Unfollow(UserId: number): Promise<void>;
Unfriend(UserId: number): Promise<void>;
IsFollowing(UserId: number): Promise<boolean>;
GetGameMedia(universeId: number): Promise<Array<GameAsset>>;
GetGamesByGroup(groupId: number, limit?: Limit): Promise<Array<GroupGame>>;
GetFavouriteGames(UserId: number, limit?: Limit): Promise<Array<FavGame>>;
GetGamesByUser(UserId: number, limit?: Limit): Promise<Array<UserGame>>;
GetGameServerList(placeId: number, serverType: string, limit?: Limit): Promise<Array<PublicServer | VIPServer>>;
GetGameProductInfo(universeId: number): Promise<GameProductInfo>;
GetPlaceInfo(placeId: number): Promise<Place>;
SearchGames(keyword: string, maxRows?: number): Promise<Array<SearchedGameResult>>;
IsPlayable(universeId : number): Promise<boolean>;
GetRecommendations(universeId : number, maxRows?: number): Promise<Array<RecommendedGame>>;
IsFavorited(universeId : number): Promise<boolean>;
Favorite(universeId : number, bool: boolean): Promise<void>;
GetFavoriteCount(universeId : number): Promise<number>;
GetGamepasses(universeId : number, limit?: Limit): Promise<Array<GamepassResult>>;
GetUserVoteStatus(universeId : number): Promise<boolean>;
VoteGame(universeId : number, bool: boolean): Promise<void>;
CanBeInvitedToVIP(UserId: number): Promise<boolean>;
GetVIPServer(vipserverId: number): Promise<GetVIPServerResult>;
UpdateVIPServer(vipserverId: number, name: string, newJoinCode: boolean, active: boolean): Promise<UpdatedVipServer>;
PurchaseVIPServer(universeId : number, name: string, expectedPrice: number): Promise<PurchaseVipServerRes>;
UpdateVIPSubscription(vipServerId: number, active: boolean, price: number): Promise<UpdatedVipServerSubscription>;
UpdateUserStatus(UserId: number, newStatus: string): Promise<void>;
GetUserStatus(UserId: number): Promise<string>;
SearchUsers(keyword: string, limit?: Limit): Promise<Array<SearchUserResult>>;
GetUserUsernameHistory(UserId: number, limit?: Limit): Promise<Array<UsernameHistoryObject>>;
GetAvatarImage(UserId: number, size: AvatarImageSize): Promise<string>;
GetAvatarHeadshot(UserId: number, size: AvatarHeadshotImageSize, isCircular?: boolean): Promise<string>;
GetOutfits(UserId: number): Promise<Array<Outfit>>;
GetAvatarRules(): Promise<Object>;
GetAvatarInfo(UserId: number): Promise<Avatar>;
RemoveAssetFromAvatar(assetId: number): Promise<void>;
WearAssetForAvatar(assetId: number): Promise<void>;
RedrawThumbnail(): Promise<void>;
SetAvatarRig(type: HumanoidRigType): Promise<void>;
SetAvatarScales( height : number, width : number,{ head, depth, proportion, bodyType }: {
head?: number;
depth?: number;
proportion?: number;
bodyType?: HumanoidRigType;
}): Promise<void>;
GetResellers(assetId: number, limit?: Limit): Promise<Array<Reseller>>;
GroupPayout(groupId: number, UserId: number, amount: number): Promise<void>;
ClaimGroupOwnership(groupId: number): Promise<void>;
ChangeGroupOwner(groupId: number, newOwnerUserId: number): Promise<void>;
GetGroupInfo(groupId: number): Promise<GroupInfo>;
GetGroupFunds(groupId: number): Promise<number>;
CreateGroup({ name, description, publicGroup, buildersClubMembersOnly, icon }: {
name: string;
description: string;
publicGroup: boolean;
buildersClubMembersOnly: boolean;
icon: File;
}): Promise<void>;
UpdateGroupDescription(groupId: number, description: string): Promise<void>;
UpdateGroupStatus(groupId: number, status: string): Promise<void>;
UpdateGroupIcon(groupId: number, newIcon: File): Promise<void>;
SetRole(UserId: number, groupId: number, roleId: number): Promise<void>;
GetRoles(groupId: number): Promise<Array<Role>>;
GetSocialLinks(groupId: number): Promise<Array<SocialLink>>;
SearchGroups(keyword: any, limit?: Limit): Promise<Array<SearchGroupResult>>;
SearchForGroup(groupName: string): Promise<SearchForGroupResult>;
SetPrimaryGroup(groupId: number): Promise<void>;
// GamePass and Badges will not work. Roblox API Limitation.
GetUserInventory(UserId: number, assetTypes: Array<AssetType>, limit?: Limit): Promise<Array<UserInventory>>;
GetCollectibles(UserId: number, assetType: AssetType, limit?: Limit): Promise<Array<Collectible>>;
SendTrade(targetUserId: number, sendingOffer: {"userAssetIds":[]}, receivingOffer : {"userAssetIds":[]}): Promise<void>;
CanTradeWith(UserId: number): Promise<boolean>;
AcceptTrade(tradeId: number): Promise<void>;
DeclineTrade(tradeId: number): Promise<void>;
GetTradeInfo(tradeId: number): Promise<Trade>;
SendPrivateMessage(recipientId: number, subject: string, body: string): Promise<void>;
SendChatMessage(coversationId: number, message: string): Promise<void>;
CreateChatWithUser(participantUserId: number): Promise<Chat>;
CreateGroupChat(title: string, participantIds: Array<number>): Promise<void>;
AddToGroupChat(conversationId: number, participantIds: Array<number>): Promise<void>;
RemoveUserFromGroupChat(participantUserId: number, conversationId: number): Promise<void>;
RenameGroupChat(conversationId: number, newTitle: string): Promise<void>;
SetConversationUniverse(conversationId: number, universeId : number): Promise<void>;
ResetConversationUniverse(conversationId: number): Promise<void>;
GetPlacesFromUniverse(universeId : number, limit?: Limit): Promise<Array<PlaceFromUniverse>>;
ActivateUniverse(universeId : number): Promise<void>;
DectivateUniverse(universeId : number): Promise<void>;
CreateDeveloperProduct(universeId : number, name: string, description: string, price: number, iconAssetId: number): Promise<DeveloperProduct>;
UserOwnsGamepass(UserId: number, gamePassId: number): Promise<boolean>;
GetBundleInfo(bundleId: number): Promise<Bundle>;
PurchaseAsset(assetId: number): Promise<void>;
GetGameSocialLinks(universeId : number): Promise<Array<SocialLink>>;
GetGroupTransactions(groupId:number,transactionType:transactionType ,limit: Limit) : Promise<Array<Transactions>>
}