Files
roblox/lib/omniRecommendation.ts
2025-07-24 04:25:18 +03:00

88 lines
1.9 KiB
TypeScript

"use client";
import { proxyFetch } from "./utils";
type RecommendationEntry = {
contentType: "Game" | string;
contentId: number;
contentStringId: string;
contentMetadata: {
Score: string;
};
};
type RecommendationSort = {
topic: string;
topicId: number;
treatmentType: string;
recommendationList: RecommendationEntry[];
nextPageTokenForTopic: null;
numberOfRows: number;
topicLayoutData: any;
};
export type ContentMetadata = {
totalUpVotes: number;
totalDownVotes: number;
universeId: number;
name: string;
rootPlaceId: number;
description: null;
playerCount: number;
primaryMediaAsset: any;
under9: boolean;
under13: boolean;
minimumAge: number;
ageRecommendationDisplayName: string;
friendVisits: any[];
friendVisitedString: string;
layoutDataBySort: any;
};
export type OmniRecommendation = {
pageType: "Home" | string;
requestId: string;
sortsRefreshInterval: number;
contentMetadata: {
Game: { [id: string]: ContentMetadata };
CatalogAsset: any;
CatalogBundle: any;
RecommendedFriend: any;
GameCoPlay: any;
};
nextPageToken: string;
isSessionExpired: boolean;
globalLayoutData: any;
isPartialFeed: boolean;
DebugInfoGroups: boolean;
sorts: RecommendationSort[];
};
export async function getOmniRecommendationsHome(): Promise<OmniRecommendation | null> {
const data = await proxyFetch(
`https://apis.roblox.com/discovery-api/omni-recommendation`,
{
method: "POST",
body: JSON.stringify({
pageType: "Home",
sessionId: crypto.randomUUID(),
supportedTreatmentTypes: ["SortlessGrid"],
authIntentData: null,
cpuCores: 4,
maxResolution: "1920x1080",
maxMemory: 8192
}),
headers: {
"Content-Type": "application/json"
}
}
);
const J = await data.json();
if (J.errors) {
return null;
}
return J as OmniRecommendation;
}
// https://apis.roblox.com/discovery-api/omni-recommendation