2 function loadConfigPopularTxtFile()
4 if (!$GLOBALS['popuplarTxtFile']) {
8 if (!file_exists($GLOBALS['popuplarTxtFile'])) {
9 throw new \Exception('popuplarTxtFile does not exist');
12 $GLOBALS['popular'] = file(
13 $GLOBALS['popuplarTxtFile'], FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES
17 function loadConfigFeaturedFile()
19 if (!$GLOBALS['featuredFile']) {
23 if (!file_exists($GLOBALS['featuredFile'])) {
24 throw new \Exception('featuredFile does not exist');
27 $featured = json_decode(file_get_contents($GLOBALS['featuredFile']));
28 if ($featured === null) {
29 throw new \Exception('cache/featured.json cannot be loaded');
32 foreach ($featured as $age => $packages) {
33 $GLOBALS['featured'][$age] = $packages;
38 * Load game data files and return them
40 function loadGames(array $gameFiles): array
43 foreach ($gameFiles as $gameFile) {
44 $gameData = json_decode(file_get_contents($gameFile));
45 if ($gameData === null) {
46 throw new \Exception('Cannot load game file: ' . $gameFile);
48 $games[$gameData->package] = $gameData;
54 * Convert a meta data game info into a structure that is suitable
55 * for http://l2.gamestickservices.net/api/rest/connect/stick/stick/xxx/view.json
57 function convertGameDataForConnect(object $gameData, array $popular): ?array
59 $userCurrency = 'EUR';
62 'id' => $gameData->id,
63 'package' => $gameData->package,
64 'name' => $gameData->name,
65 'description' => $gameData->description,
67 'minAge' => $gameData->minAge,
68 'genre' => current($gameData->genres),
79 'popular' => $popular[$gameData->package] ?? 0,
83 'downloadedfree' => false,
85 'isfree' => $gameData->prices->buy->$userCurrency->amount == 0,
88 'price' => $userCurrency . ' '
89 . $gameData->prices->buy->$userCurrency->amount,
102 'companyname' => $gameData->companyname,
103 'companylogofile' => '',
104 'companyiconsize' => 0,
108 foreach ($gameData->genres as $genre) {
109 $connectData['genres'][] = [
115 foreach ($gameData->prices->buy as $currencySymbol => $price) {
116 $connectData['multipricing']['buy'][] = [
117 'amount' => $price->amount,
118 'isocurrency' => $currencySymbol,
119 'symbol' => $price->symbol,
120 'symbolpostindex' => $price->symbolpostindex,
121 'formattedcurrency' => $price->formattedcurrency,
126 $highestVersionCode = 0;
127 $highestVersionKey = null;
128 foreach ($gameData->releases as $releaseKey => $release) {
129 if (isset($release->broken) && $release->broken === true) {
132 if ($release->versionCode > $highestVersionCode) {
133 $highestVersionCode = $release->versionCode;
134 $highestVersionKey = $releaseKey;
138 if ($highestVersionKey !== null) {
139 $release = $gameData->releases[$highestVersionKey];
140 $connectData['version'] = $release->uuid;
141 $connectData['gameversion'] = $release->gsName ?? $release->name;
143 $connectData['size'] = round($release->size / 1024 / 1024 * 1000);
144 $connectData['download'] = [
145 'url' => $release->url,
146 'version' => $release->versionCode,
149 } else if (count($gameData->releases)) {
150 $firstRelease = reset($gameData->releases);
151 $connectData['name'] = '!! ' . $connectData['name'];
152 $connectData['description']
153 = "Download broken!\n\n" . $connectData['description'];
154 $connectData['version'] = $firstRelease->uuid;
155 $connectData['gameversion'] = $firstRelease->gsName ?? $firstRelease->name;
158 $connectData['name'] = '!!! ' . $connectData['name'];
159 $connectData['description']
160 = "Release data missing!\n\n" . $connectData['description'];
163 foreach ($gameData->videos as $videoNum => $video) {
164 $connectData['videos'][] = [
165 'version' => $video->version,
166 'url' => $video->url,
168 $connectData['images'][] = [
171 'url' => $video->thumb,
175 'name' => 'STICK_VIDEO' . ($videoNum + 1) . '_SCREENSHOT',
183 'name' => 'STICK_THUMBNAIL1',
188 'name' => 'STICK_THUMBNAIL2',
193 'name' => 'STICK_THUMBNAIL3',
198 'name' => 'STICK_THUMBNAIL4',
203 'name' => 'STICK_THUMBNAIL1_1080',
208 'name' => 'STICK_THUMBNAIL2_1080',
213 'name' => 'STICK_THUMBNAIL3_1080',
218 'name' => 'STICK_THUMBNAIL4_1080',
222 'icon-registration' => [
223 'name' => 'STICK_REGISTRATION_GAME_ICON',
228 'name' => 'STICK_ICON',
233 'name' => 'STICK_SCREENSHOT',
237 'screenshots-big' => [
238 'name' => 'STICK_SCREENSHOT_1080',
243 foreach ($gameData->images as $imageKey => $imageData) {
244 if (!isset($imageNameMap[$imageKey])) {
245 throw new \Exception('Unknown image key: ' . $imageKey);
247 if ($imageData === null) {
251 'name' => $imageNameMap[$imageKey]['name'],
252 'width' => $imageNameMap[$imageKey]['width'],
253 'height' => $imageNameMap[$imageKey]['height'],
256 $urls = (array) $imageData;
257 foreach ($urls as $imageUrl) {
258 $connectImage['urls'][] = [
263 $connectData['images'][] = $connectImage;
271 * @param array $featured Array keys are the ages, values
272 * are array of "package name => height"
274 * @return array Suitable for
275 * http://l2.gamestickservices.net/api/rest/connect/stick/stick/xxx/view.json
277 function buildFeaturedMenu(array $featured, array $games)
280 foreach ($featured as $age => $packages) {
289 foreach ($packages as $package => $height) {
290 if ($heightSum + $height > 6) {
294 $connectAge['entries'][] = $columnData;
297 'column' => $columnNum,
298 'columnentries' => [],
301 if (!isset($games[$package])) {
302 throw new \Exception('Unknown featured game: ' . $package);
304 $columnData['columnentries'][] = [
305 'gameID' => $games[$package]->id,
306 'thumbnail' => $height,
307 'column' => $columnNum,
309 $heightSum += $height;
311 if (count($columnData['columnentries'])) {
312 $connectAge['entries'][] = $columnData;
315 $connectMenu[] = $connectAge;