3 Commits

Author SHA1 Message Date
Dean @ Skool e2df9d9bda add backup analytics for inaccuracies 2024-02-07 08:44:04 -05:00
Dean @ Skool 99bc618e3e add mob control 2024-02-04 00:30:03 -05:00
Russell2259 ece1502813 basic filtering prototype 2024-01-29 07:38:52 -07:00
67 changed files with 1279 additions and 2896 deletions
+4 -6
View File
@@ -1,13 +1,12 @@
<div align="center">
<img src="https://github.com/Skoolgq/Polaris/assets/93336301/dc994d43-06f4-4947-a15f-226c840f6880" width="600px">
<h2 style="color: yellow;">Polaris has been deprecated. New updates will not be made but bugs may still be fixed.</h2>
<s><p><a href="https://dsc.gg/skoolworld">Join our Discord server</a></p></s>
<img src="./static/android-chrome-512x512.png" width="300px">
<h1>Polaris</h1>
<p>The professional unblocked games site.</p>
![Discord](https://img.shields.io/discord/950407933408198717?label=Discord&style=for-the-badge)
![Commit activity](https://img.shields.io/github/commit-activity/w/SkoolGQ/Polaris?style=for-the-badge)
<br>
<h2>Quick Web Deployment</h2>
[![Deploy to Vercel](https://binbashbanana.github.io/deploy-buttons/buttons/remade/vercel.svg)](https://vercel.com/new/clone?repository-url=https://github.com/Skoolgq/Polaris)
@@ -26,4 +25,3 @@
2. Install Dependencies: `npm install`
3. Start the app: `npm start`
4. Visit [localhost:8080](http://localhost:8080) for your local Polaris!
-7
View File
@@ -1,7 +0,0 @@
name: Polaris
services:
polaris:
build: .
ports:
- "8080:8080"
+23
View File
@@ -0,0 +1,23 @@
-> URL Filter
-> Any proxied url with these words will be blocked
porn
pornography
sex
ass
dick
cock
bitch
busty
boob
cum
fuck
xx
nude
tit
vagina
semen
penis
masturbate
anal
anus
+2 -1
View File
@@ -8,7 +8,8 @@ var config = {
},
minify: false,
assetScrambling: false,
allowDangerousTemplateInsert: true
allowDangerousTemplateInsert: true,
filtering: true
}
};
+407 -1300
View File
File diff suppressed because it is too large Load Diff
+9 -11
View File
@@ -1,8 +1,8 @@
{
"name": "polaris",
"version": "1.3.2",
"version": "1.2.1",
"description": "The professional unblocked games site.",
"main": "server/index.js",
"main": "index.js",
"type": "module",
"scripts": {
"start": "node server",
@@ -12,17 +12,15 @@
"author": "Polaris Development Group",
"license": "GNU-3.0-or-later",
"dependencies": {
"@mercuryworkshop/bare-mux": "^2.0.4",
"@mercuryworkshop/epoxy-transport": "^2.1.18",
"@mercuryworkshop/libcurl-transport": "1.3.10",
"@titaniumnetwork-dev/ultraviolet": "^3.2.7",
"cors": "^2.8.5",
"express": "^4.21.2",
"@tomphttp/bare-server-node": "^2.0.1",
"cors": "*",
"easyviolet": "github:Russell2259/Easyviolet",
"express": "*",
"html-minifier": "^4.0.0",
"is-word": "^1.0.4",
"javascript-obfuscator": "^4.1.0",
"jsdom": "^23.0.1",
"mime": "^4.0.1",
"uuid": "^9.0.1",
"wisp-server-node": "^1.1.3"
"mime": "*",
"uuid": "^9.0.1"
}
}
+2 -4
View File
@@ -21,7 +21,7 @@
</div>
<script type="module">
import { loadProxyWorker, storage, loadCJS } from '/assets/js/utils.js';
import { loadProxyWorker, storage } from '/assets/js/utils.js';
const settingsStorage = storage('settings');
@@ -33,9 +33,7 @@
}));
}
await loadCJS('/baremux/bare.cjs');
if (location.pathname.slice(1).startsWith((settingsStorage.get('proxy') || '').split(':')[0] || 'uv')) loadProxyWorker((settingsStorage.get('proxy') || '').split(':')[0] || 'uv')
if (location.pathname.slice(1).startsWith(settingsStorage.get('proxy') || 'uv')) loadProxyWorker(settingsStorage.get('proxy') || 'uv')
.then(() => location.reload())
.catch(() => {
document.querySelector('h1').textContent = 'Error';
+5 -4
View File
@@ -8,10 +8,11 @@ export default useConfig({
minify: false,
//Beta
assetScrambling: false,
allowDangerousTemplateInsert: false,
allowDangerousTemplateInsert: true,
api: {
domain: 'api.skoolworld.org',
domain: 'api.polarislearning.org',
secure: true
}
},
filtering: true
}
});
});
+74 -36
View File
@@ -1,12 +1,9 @@
import { epoxyPath } from '@mercuryworkshop/epoxy-transport';
import { uvPath } from '@titaniumnetwork-dev/ultraviolet';
import { baremuxPath } from '@mercuryworkshop/bare-mux/node';
import wisp from 'wisp-server-node';
import { createBareServer } from '@tomphttp/bare-server-node';
import express from 'express';
import mime from 'mime';
import cors from 'cors';
import { pathToFile, TokenManager, rewriter } from './utils.js';
import { pathToFile, TokenManager, rewriter, filter } from './utils.js';
import config from '../polaris.config.js';
import api from './api.js';
@@ -18,42 +15,57 @@ import fs from 'node:fs';
const app = express();
const server = http.createServer();
const bareServer = createBareServer('/bare/');
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
const packageFile = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json')));
const swPaths = [
'/uv/sw.js',
'/assets/js/offline.js'
];
app.use(express.json());
api(app);
app.get('/cdn/3kh0/*', cors({
origin: false
}), async (req, res, next) => {
let reqTarget = `https://codeberg.org/derpman/echo/raw/branch/main/${req.path.replace('/cdn/3kh0/', '')}`;
const asset = await fetch(reqTarget);
if (asset.status == 200) {
var data = Buffer.from(await asset.arrayBuffer());
const noRewrite = ['.unityweb'];
if (!noRewrite.includes(mime.getExtension(reqTarget))) res.writeHead(200, {
'content-type': mime.getType(reqTarget)
});
if (mime.getType(reqTarget) === 'text/html') data = data + '<script src=\'/assets/js/cdn.inject.js\' preload=\'true\'></script>';
res.end(data);
} else next();
});
app.get('/cdn/*', cors({
origin: false
}), async (req, res, next) => {
const reqTarget = req.path.startsWith('/cdn/3kh0/') ? `https://player.work/${req.path.replace('/cdn/3kh0/', '')}` : `https://raw.githubusercontent.com/Skoolgq/Polaris-Assets/main/${req.path.replace('/cdn/', '')}`;
let reqTarget = `https://raw.githubusercontent.com/Skoolgq/Polaris-Assets/main/${req.path.replace('/cdn/', '')}`;
try {
const asset = await fetch(reqTarget);
const asset = await fetch(reqTarget);
if (asset.status == 200) {
var data = Buffer.from(await asset.arrayBuffer());
if (asset.status == 200) {
var data = Buffer.from(await asset.arrayBuffer());
const noRewrite = ['.unityweb'];
if (!noRewrite.includes(mime.getExtension(reqTarget))) res.writeHead(200, {
'content-type': mime.getType(reqTarget)
});
const noRewrite = ['.unityweb'];
if (!noRewrite.includes(mime.getExtension(reqTarget))) res.writeHead(200, {
'content-type': mime.getType(reqTarget)
});
if (mime.getType(reqTarget) === 'text/html') data = data + '<script src=\'/assets/js/cdn.inject.js\' preload=\'true\'></script>';
if (mime.getType(reqTarget) === 'text/html') data = data + '<script src=\'/assets/js/cdn.inject.js\' preload=\'true\'></script>';
res.end(data);
} else next();
} catch {
res.setHeader('content-type', 'text/html');
res.status(404).end(await rewriter.html(fs.readFileSync(path.join(__dirname, '../pages/404.html'))));
}
res.end(data);
} else next();
});
app.get('*', (req, res, next) => {
@@ -91,8 +103,11 @@ app.get('/asset/:token', async (req, res, next) => {
}
});
app.get('/uv/service/*', async (req, res) => res.end(await rewriter.html(fs.readFileSync(path.join(__dirname, '../pages/proxy_404.html')))));
app.get('/uv/service/*', async (req, res) => {
console.log(req.url);
res.end(await rewriter.html(fs.readFileSync(path.join(__dirname, '../pages/proxy_404.html'))));
});
app.get('/dynamic/service/*', async (req, res) => res.end(await rewriter.html(fs.readFileSync(path.join(__dirname, '../pages/proxy_404.html')))));
app.use(async (req, res, next) => {
if (req.path === '/index') res.redirect('/');
@@ -112,24 +127,47 @@ app.use(async (req, res, next) => {
else if (mime.getType(filePath) === 'text/css') res.end(await rewriter.css(fs.readFileSync(filePath), req.path));
else res.sendFile(filePath);
}
} else next();
} else {
res.setHeader('content-type', 'text/html');
res.status(404).end(await rewriter.html(fs.readFileSync(path.join(__dirname, '../pages/404.html'))));
}
}
});
server.on('request', async (req, res) => {
if (bareServer.shouldRoute(req)) {
try {
const results = await filter(req.headers['x-bare-url'].replace(req.headers['x-bare-url'].split('://')[0] + '://', ''));
app.get('/uv/service/*', async (req, res) => res.end(await rewriter.html(fs.readFileSync(path.join(__dirname, '../pages/proxy_404.html')))));
console.log(results);
app.use('/uv/', express.static(uvPath));
app.use("/epoxy/", express.static(epoxyPath));
app.use("/baremux/", express.static(baremuxPath));
//console.log(req.headers.host);
server.on('request', (req, res) => {
app(req, res);
if (results.flagged) {
return;
}
} catch (e) { }
bareServer.routeRequest(req, res);
} else app(req, res);
});
server.on('upgrade', (req, socket, head) => {
if (req.url.endsWith('/wisp/')) wisp.routeRequest(req, socket, head);
else socket.end();
server.on('upgrade', async (req, socket, head) => {
if (bareServer.shouldRoute(req)) {
try {
const results = await filter(req.headers['x-bare-url'].replace(req.headers['x-bare-url'].split('://')[0] + '://', ''));
console.log(results);
//console.log(req.headers.host);
if (results.flagged) {
return;
}
} catch (e) { }
bareServer.routeUpgrade(req, socket, head);
} else socket.end();
});
server.listen(config.port, () => console.log(`Polaris running\n\nPort: ${server.address().port}\nVersion: ${packageFile.version + (Number(packageFile.version.split('.')[0]) <= 1 ? ' Beta' : '') || 'Unknown'} ${childProcess.execSync('git rev-parse HEAD').toString().trim().slice(0, 7) || 'Unknown'}\nMode: ${config.mode === 'dev' ? 'development' : 'production'}\nAPI Server: ${config.options.api.domain}\nNode.js: ${process.version}`));
server.listen(config.port, () => console.log(`Polaris running\n\nPort: ${server.address().port}\nVersion: ${packageFile.version + (Number(packageFile.version.split('.')[0]) <= 1 ? ' Beta' : '') || 'Unknown'} ${childProcess.execSync('git rev-parse HEAD').toString().trim().slice(0, 7) || 'Unknown'}\nMode: ${config.mode === 'dev' ? 'development' : 'production'}\nProxy Filter: ${config.options.filtering ? 'enabled' : 'disabled'}\nAPI Server: ${config.options.api.domain}\nNode.js: ${process.version}`));
+102 -2
View File
@@ -1,15 +1,31 @@
import isWord from 'is-word';
import * as rewriter from './utils/rewriter.js';
import TokenManager from './utils/token.js';
import config from '../polaris.config.js';
import path from 'node:path';
import url from 'node:url';
import fs from 'node:fs';
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
const dictionary = fs.readFileSync(path.join(__dirname, '../node_modules/is-word/dictionary/american-english.txt'))
.toString()
.split('\n')
.map(word => word.trim());
const englishWords = isWord('american-english');
const parsedFilter = config.options.filtering ? fs.readFileSync(path.join(__dirname, '../filter.txt'))
.toString()
.split('\n')
.map(query => query.trim())
.filter(query => query && !query.startsWith('->')) : [];
/**
* @param {string} url
* @param {string} folderPath
* @returns {{ exists: boolean, path: string }}
*/
const pathToFile = (url = '', folderPath) => {
export const pathToFile = (url = '', folderPath) => {
if (url.endsWith('/')) url = url + 'index.html';
else if (url.split(/[#?]/)[0].split('.').pop().trim() === url) {
if (!fs.existsSync(path.join(folderPath, url))) url = url + '.html';
@@ -21,14 +37,98 @@ const pathToFile = (url = '', folderPath) => {
};
};
/**
* Get words from a string
* @param {string} input
* @param {Array.<string>} words
* @returns {Promise.<Array.<string>>}
*/
export const getWords = (input, words) => new Promise(async (resolve, reject) => {
let output = [];
for (let i = 0; i < words.length; i++) {
output.push(...Array((input.match(RegExp(words[i], 'gi')) || []).length).fill(words[i]));
if (i + 1 === words.length) resolve(output);
}
});
/**
* @param {string} query
* @returns {Promise.<{ flagged: true, query: string }>}
*/
export const filter = (query) => new Promise(async (resolve, reject) => {
if (parsedFilter.length === 0) {
resolve({
flagged: false,
query: ''
});
return;
}
const parsedQuery = query.replaceAll('/', ' ').replaceAll('-', ' ').replaceAll('_', ' ').split(' ');
for (let i = 0; i < parsedQuery.length; i++) {
/**
* @type {string}
*/
const query = parsedQuery[i];
const validWord = englishWords.check(query);
if (validWord && parsedFilter.includes(query)) {
resolve({
flagged: true,
query
});
return;
}
if (!validWord) {
const results = await (new Promise((resolve, reject) => {
for (let i = 0; i < parsedFilter.length; i++) {
const hasFiltered = query.includes(parsedFilter[i]);
if (hasFiltered) {
resolve({
flagged: true,
query: parsedFilter[i]
});
return;
}
if (i + 1 === parsedFilter.length) resolve({
flagged: false,
query: ''
});
}
}));
console.log(query);
if (results.flagged) {
resolve({
flagged: true,
query: results.query
});
return;
}
}
if (i + 1 === parsedQuery.length) resolve({
flagged: false,
query: ''
});
}
});
export default {
pathToFile,
filter,
TokenManager,
rewriter
};
export {
pathToFile,
TokenManager,
rewriter
};
+1 -2
View File
@@ -11,7 +11,6 @@ import url from 'node:url';
import fs from 'node:fs';
const __dirname = url.fileURLToPath(new URL('../', import.meta.url));
const mode = config.mode;
const templateParser = (data) => {
return new Promise(async (resolve, reject) => {
@@ -23,7 +22,7 @@ const templateParser = (data) => {
.map(data => {
if (data) {
if (data.startsWith('{{') && data.split(':')[data.split(':').length - 2].endsWith('}}')) {
if (config.options.allowDangerousTemplateInsert) {
if (config.allowDangerousTemplateInsert) {
if (Boolean(eval(String(data.split(':')[data.split(':').length - 2]).slice(2, -2)))) return data;
else return undefined;
} else return undefined;
+44 -34
View File
@@ -1,44 +1,54 @@
<!DOCTYPE html>
<html lang="en">
<head>
<!--el:meta-->
<!--el:adtop-->
<!--el:analytics-->
<link rel="stylesheet" href="/assets/css/main.css" />
<head>
<!--el:meta-->
<!--el:adtop-->
<!--el:analytics-->
<title>Apps | Polaris</title>
</head>
<link rel="stylesheet" href="/assets/css/main.css">
<body>
<!--el:navbar-->
<!--el:sidebar-->
<title>Apps | Polaris</title>
</head>
<div class="content centered">
<h1>Apps</h1>
<br />
<div class="apps"></div>
</div>
<br />
<br />
<div id="largebillboard1"></div>
<body>
<!--el:navbar-->
<!--el:sidebar-->
<div class="centered">
<!--<script type="text/javascript">
atOptions = {
'key' : 'cf0bb7d0401f5ae5534ac09c2e959d20',
'format' : 'iframe',
'height' : 90,
'width' : 728,
'params' : {}
};
document.write('<scr' + 'ipt type="text/javascript" src="//outrightsham.com/cf0bb7d0401f5ae5534ac09c2e959d20/invoke.js"></scr' + 'ipt>');
</script>-->
</div>
<!--el:discord_widget-->
<div class="content centered">
<h1>Apps</h1>
<br>
<div class="apps"></div>
<script src="/assets/js/main.js" type="module"></script>
</div>
<br>
<br>
<div id="largebillboard1"></div>
<script>
window['nitroAds'].createAd('largebillboard1', {
"refreshTime": 30,
"renderVisibleOnly": true,
"sizes": [
[
"970",
"250"
]
],
"report": {
"enabled": true,
"icon": true,
"wording": "Report Ad",
"position": "top-right"
}
});
</script>
<!--el:discord_widget-->
<script src="/assets/js/main.js" type="module"></script>
<!--el:{{mode === 'dev'}}:development-->
</body>
<!--el:{{mode === 'dev'}}:development-->
</body>
</html>
+1 -21
View File
@@ -1,19 +1,9 @@
[
{
"name": "Android OS",
"image": "/cdn/images/android.png",
"target": "https://now.gg/iframe/snippet?app_pkg=com.uncube.launcher3&partner=skool"
},
{
"name": "Spotify",
"image": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Spotify_logo_without_text.svg/168px-Spotify_logo_without_text.svg.png",
"target": "https://open.spotify.com/"
},
{
"name": "ChatGPT",
"image": "/cdn/images/chatgpt.webp",
"target": "https://chat.shuttleai.app"
},
{
"name": "Chess.com",
"image": "https://play-lh.googleusercontent.com/a7R5nyeaX8lIEWdBOxjlvbyq9LcFwh3XMvNtBPEKR3LPGgdvgGrec4sJwn8tUaaSkw",
@@ -47,7 +37,7 @@
{
"name": "Movies/TV",
"image": "https://avatars.githubusercontent.com/u/121455091",
"target": "https://movie-web.app"
"target": "//movie-web.app"
},
{
"name": "Paramount+",
@@ -73,15 +63,5 @@
"name": "Youtube",
"image": "/cdn/images/youtube.png",
"target": "https://youtube.com"
},
{
"name": "Youtube Downloader",
"image": "/cdn/images/youtubedownloader.png",
"target": "https://cobalt.tools"
},
{
"name": "Youtube Music",
"image": "/cdn/images/yt-music.png",
"target": "https://music.youtube.com"
}
]
-68
View File
@@ -1,72 +1,4 @@
[
{
"date": "3/28/2024",
"simpleDescription": "Changed Navbar Style"
},
{
"date": "3/10/2024",
"simpleDescription": "Fixed Settings Menu and improved Game Search"
},
{
"date": "3/7/2024",
"simpleDescription": "Added 10 games"
},
{
"date": "3/1/2024",
"simpleDescription": "Fix roblox"
},
{
"date": "2/28/2024",
"simpleDescription": "Added 2 games"
},
{
"date": "2/27/2024",
"simpleDescription": "Added 4 games and removed Buckshot Roulette"
},
{
"date": "2/26/2024",
"simpleDescription": "Added Buckshot Roulette"
},
{
"date": "2/24/2024",
"simpleDescription": "Added a random game button"
},
{
"date": "2/23/2024",
"simpleDescription": "Added 6 games and changed popular games"
},
{
"date": "2/22/2024",
"simpleDescription": "Added 17 games (200+ games 🎉), and removed 1 game"
},
{
"date": "2/21/2024",
"simpleDescription": "Fixed more games, added 15 games, and added 2 new themes"
},
{
"date": "2/20/2024",
"simpleDescription": "Fixed Lots of games"
},
{
"date": "2/16/2024",
"simpleDescription": "Fixed Roblox"
},
{
"date": "2/15/2024",
"simpleDescription": "Added 4 games"
},
{
"date": "2/14/2024",
"simpleDescription": "Fixed 3 games, added 23 games, and added Youtube Music"
},
{
"date": "2/13/2024",
"simpleDescription": "Fixed issues with the cdn and added 8 new games"
},
{
"date": "2/12/2024",
"simpleDescription": "Added 15 games and changed the featured game to Run 3"
},
{
"date": "1/25/2024",
"simpleDescription": "Changed featured game to 99 Balls 3D"
+42 -586
View File
@@ -40,11 +40,6 @@
"target": "/cdn/amidst-the-clouds/index.html",
"image": "/cdn/amidst-the-clouds/splash.png"
},
{
"name": "Aquapark.io",
"target": "https://html5.gamedistribution.com/rvvASMiM/ce67b95f0db44d66b8b0dc48ade7ce1a/index.html",
"image": "https://teen.media/assets/aqua.jpeg"
},
{
"name": "Archery World Tour",
"target": "https://gamesnacks.com/embed/games/archery",
@@ -62,7 +57,7 @@
},
{
"name": "Asphalt Retro",
"target": "https://html5.gamedistribution.com/rvvASMiM/2c122cee7ef04222a962449e32a34e98/?gd_sdk_referrer_url=https://gamedistribution.com/games/asphalt-retro",
"target": "https://html5.gamedistribution.com/2c122cee7ef04222a962449e32a34e98/?gd_sdk_referrer_url=https://gamedistribution.com/games/asphalt-retro",
"image": "/cdn/images/asr.jpg"
},
{
@@ -87,12 +82,12 @@
},
{
"name": "Basket Random",
"target": "https://html5.gamedistribution.com/rvvASMiM/bf1268dccb5d43e7970bb3edaa54afc8/?gd_sdk_referrer_url=https://gamedistribution.com/games/basket-random",
"target": "https://html5.gamedistribution.com/bf1268dccb5d43e7970bb3edaa54afc8/?gd_sdk_referrer_url=https://gamedistribution.com/games/basket-random",
"image": "https://img.gamedistribution.com/bf1268dccb5d43e7970bb3edaa54afc8-512x512.jpeg"
},
{
"name": "Basketball Stars",
"target": "https://html5.gamedistribution.com/rvvASMiM/69d78d071f704fa183d75b4114ae40ec/?gd_sdk_referrer_url=https://gamedistribution.com/games/basketball-stars",
"target": "https://html5.gamedistribution.com/69d78d071f704fa183d75b4114ae40ec/?gd_sdk_referrer_url=https://gamedistribution.com/games/basketball-stars",
"image": "https://img.gamedistribution.com/69d78d071f704fa183d75b4114ae40ec-512x512.jpeg"
},
{
@@ -107,7 +102,7 @@
},
{
"name": "BitLife",
"target": "https://html5.gamedistribution.com/rvvASMiM/rvvASMiM/2e44fb60fd3f4606b1b06c17a2b9d60d/index.html",
"target": "https://html5.gamedistribution.com/rvvASMiM/2e44fb60fd3f4606b1b06c17a2b9d60d/index.html",
"image": "https://play-lh.googleusercontent.com/fUM-UyywXxjC8soxAZdIlxJrlRRXmql8wkE426SHzft4lJycSKVd2jCYQQX1BEG9Xw=w240-h480-rw"
},
{
@@ -132,7 +127,7 @@
},
{
"name": "Bonk.io",
"target": "https://bonk.io",
"target": "//bonk.io",
"image": "https://b.thumbs.redditmedia.com/9p8-wn2_KPdgjPTaR9fx-NIVgFhvsgBL0WPdbv5GMkA.png"
},
{
@@ -168,12 +163,8 @@
{
"name": "COD Mobile",
"target": "https://now.gg/play/activision-publishing-inc/7935/call-of-duty.html",
"image": "https://static.wikia.nocookie.net/callofduty/images/f/f4/App_Icon_CODM_Global.jpg/revision/latest?cb=20200507033012"
},
{
"name": "Counter Strike",
"target": "https://play-cs.com",
"image": "https://cdn2.iconfinder.com/data/icons/popular-games-1/50/csgo_squircle-512.png"
"image": "https://static.wikia.nocookie.net/callofduty/images/f/f4/App_Icon_CODM_Global.jpg/revision/latest?cb=20200507033012",
"popular": true
},
{
"name": "Crossy Road",
@@ -221,19 +212,24 @@
"image": "/cdn/images/driftboss.png"
},
{
"name": "Drift Hunters",
"name": "Drift Hunters (have patience)",
"target": "https://webglmath.github.io/drift-hunters/",
"image": "https://play-lh.googleusercontent.com/smo8Ln-PRREDGq_QjA-Nws7ZNJQhvQfUB2oA8XV0GW12uq6hqdhvwXCB2rdl6zjekcow=w240-h480-rw"
},
{
"name": "Drive Mad",
"target": "/cdn/3kh0/drive-mad/index.html",
"image": "/cdn/images/dmd.jpg",
"image": "/cdn/images/dmd.jpg"
},
{
"name": "Fortnite",
"target": "https://now.gg/play/epic-games/7308/fortnite",
"image": "https://upload.wikimedia.org/wikipedia/commons/7/7c/Fortnite_F_lettermark_logo.png",
"popular": true
},
{
"name": "Fireboy and Watergirl",
"target": "https://html5.gamedistribution.com/rvvASMiM/a55c9cc9c21e4fc683c8c6857f3d0c75/?gd_sdk_referrer_url=https://gamedistribution.com/games/fireboy-and-watergirl-1-forest-temple",
"target": "https://html5.gamedistribution.com/a55c9cc9c21e4fc683c8c6857f3d0c75/?gd_sdk_referrer_url=https://gamedistribution.com/games/fireboy-and-watergirl-1-forest-temple",
"image": "https://img.gamedistribution.com/a55c9cc9c21e4fc683c8c6857f3d0c75-512x512.jpeg"
},
{
@@ -248,12 +244,12 @@
},
{
"name": "Fruit Ninja",
"target": "/cdn/3kh0/fruitninja/index.html",
"target": "/cdn/fruit-ninja/index.html",
"image": "/cdn/fruit-ninja/FruitNinjaTeaser.jpg"
},
{
"name": "Genshin Impact",
"target": "https://nowgg.nl/play/cognosphere-pte-ltd-/1773/genshin-impact.html",
"target": "https://now.gg/play/cognosphere-pte-ltd-/1773/genshin-impact.html",
"image": "https://cdn2.steamgriddb.com/icon_thumb/73e5080f0f3804cb9cf470a8ce895dac.png"
},
{
@@ -288,7 +284,7 @@
},
{
"name": "Janissary Battles",
"target": "https://html5.gamedistribution.com/rvvASMiM/8b55f4f729be4e70b6155f27d2e04690/?gd_sdk_referrer_url=https://gamedistribution.com/games/janissary-battles",
"target": "https://html5.gamedistribution.com/8b55f4f729be4e70b6155f27d2e04690/?gd_sdk_referrer_url=https://gamedistribution.com/games/janissary-battles",
"image": "/cdn/images/janissary.png"
},
{
@@ -328,7 +324,7 @@
},
{
"name": "Melon Sandbox",
"target": "https://nowgg.nl/play/playducky/7199/melon-sandbox.html",
"target": "https://now.gg/play/playducky/7199/melon-sandbox.html",
"image": "https://play-lh.googleusercontent.com/6q7J7_wky8t9gMihsZsvmKAIvfJ1h1gen2SwakrzN7OGigFFN2_VUycZBaOTn2Qs6_E"
},
{
@@ -337,25 +333,21 @@
"image": "/cdn/mindustry/splash.png"
},
{
"name": "Minecraft 1.3",
"target": "https://rawcdn.githack.com/CybriaTech/Opium/main/games/eagler-1.3/index.html",
"image": "https://i.ytimg.com/vi/IB2h3OTbbvA/sddefault.jpg"
},
{
"name": "Minecraft 1.5.2",
"target": "https://rawcdn.githack.com/CybriaTech/Opium/main/games/eagler-1.5.2/index.html",
"image": "https://images.squarespace-cdn.com/content/v1/5e172d9413c1a94fc0a5a165/1596626261379-ZV6K2M7DC4S3QNIO82R7/block.jpg?format=500w"
},
{
"name": "Minecraft 1.8",
"target": "https://rawcdn.githack.com/CybriaTech/Opium/main/games/eagler-1.8/index.html",
"image": "/cdn/images/minecraft.svg"
"name": "Minecraft",
"target": "/cdn/3kh0/minecraft-15/index.html",
"image": "/cdn/images/mc.jpeg",
"popular": true
},
{
"name": "Missiles",
"target": "/cdn/missiles/index.html",
"image": "/cdn/missiles/miss.png"
},
{
"name": "Mob Control",
"target": "//13240254712035459300.playables.usercontent.goog/v/assets/index.html",
"image": "https://play-lh.googleusercontent.com/WG9LoxydQHtU2S7iUvlLAdt1_fc5edPzT0Q_pJ7QJLhriQlz4G-ToaG6UJDiNJoBSAoA"
},
{
"name": "Monkey Mart",
"target": "/cdn/monkey-mart/index.html",
@@ -393,7 +385,7 @@
},
{
"name": "osu!",
"target": "/cdn/3kh0/osu/index.html",
"target": "https://skoolgq.github.io/skool-osu",
"image": "/cdn/images/osu.png"
},
{
@@ -449,7 +441,7 @@
},
{
"name": "Roblox",
"target": "https://now.gg/iframe/snippet?app_pkg=com.roblox.client&partner=skool",
"target": "https://now.gg/play/roblox-corporation/5349/roblox",
"image": "/cdn/images/roblox.png",
"popular": true
},
@@ -465,7 +457,7 @@
},
{
"name": "Rotate",
"target": "https://html5.gamedistribution.com/rvvASMiM/0faa4468d18e4f7aa2e0161b4fefa193/?gd_sdk_referrer_url=https://gamedistribution.com/games/rotate",
"target": "https://html5.gamedistribution.com/0faa4468d18e4f7aa2e0161b4fefa193/?gd_sdk_referrer_url=https://gamedistribution.com/games/rotate",
"image": "https://img.gamedistribution.com/0faa4468d18e4f7aa2e0161b4fefa193-512x512.jpeg"
},
{
@@ -490,7 +482,7 @@
},
{
"name": "Soccer Random",
"target": "https://html5.gamedistribution.com/rvvASMiM/308d826f20034d7b972f25258c8d0a44/?gd_sdk_referrer_url=https://gamedistribution.com/games/soccer-random",
"target": "https://html5.gamedistribution.com/308d826f20034d7b972f25258c8d0a44/?gd_sdk_referrer_url=https://gamedistribution.com/games/soccer-random",
"image": "https://img.gamedistribution.com/308d826f20034d7b972f25258c8d0a44-512x512.jpeg"
},
{
@@ -500,8 +492,9 @@
},
{
"name": "Stumble Guys",
"target": "https://now.gg/iframe/snippet?app_pkg=com.kitkagames.fallbuddies&partner=skool",
"image": "https://play-lh.googleusercontent.com/Oci7f4WR0JShbn-n5hnwubbXaMssleb2b1Dv7AMOzFFcgstIdC9kg-E3LHx3em8RCaLf"
"target": "https://now.gg/play/kitka-games/7999/stumble-guys.html",
"image": "https://play-lh.googleusercontent.com/Oci7f4WR0JShbn-n5hnwubbXaMssleb2b1Dv7AMOzFFcgstIdC9kg-E3LHx3em8RCaLf",
"popular":true
},
{
"name": "Subway Surfers",
@@ -540,32 +533,32 @@
},
{
"name": "Vex 3",
"target": "https://html5.gamedistribution.com/rvvASMiM/762c932b4db74c6da0c1d101b2da8be6/?gd_sdk_referrer_url=https://gamedistribution.com/games/vex-3",
"target": "https://html5.gamedistribution.com/762c932b4db74c6da0c1d101b2da8be6/?gd_sdk_referrer_url=https://gamedistribution.com/games/vex-3",
"image": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/87/06/4e/87064e7a-c9fd-7135-6ba3-f321f013e01e/mzl.kqcjsyop.png/512x512bb.jpg"
},
{
"name": "Vex 4",
"target": "https://html5.gamedistribution.com/rvvASMiM/80e6a5ae477f4d4fbcd1ea293d10087d/?gd_sdk_referrer_url=https://gamedistribution.com/games/vex-4",
"target": "https://html5.gamedistribution.com/80e6a5ae477f4d4fbcd1ea293d10087d/?gd_sdk_referrer_url=https://gamedistribution.com/games/vex-4",
"image": "https://mobimg.b-cdn.net/v2/fetch/1d/1d957ad4cb8024ec9b63d54d6c61235b.png"
},
{
"name": "Vex 5",
"target": "https://html5.gamedistribution.com/rvvASMiM/f120262ab72743039fbce88c1f370df8/?gd_sdk_referrer_url=https://gamedistribution.com/games/vex-5",
"target": "https://html5.gamedistribution.com/f120262ab72743039fbce88c1f370df8/?gd_sdk_referrer_url=https://gamedistribution.com/games/vex-5",
"image": "https://img.gamedistribution.com/f120262ab72743039fbce88c1f370df8-512x512.jpeg"
},
{
"name": "Vex 6",
"target": "https://html5.gamedistribution.com/rvvASMiM/4925e12574364121a48c61c35f649c36/?gd_sdk_referrer_url=https://gamedistribution.com/games/vex-6",
"target": "https://html5.gamedistribution.com/4925e12574364121a48c61c35f649c36/?gd_sdk_referrer_url=https://gamedistribution.com/games/vex-6",
"image": "/cdn/images/vex-6.png"
},
{
"name": "Vex 7",
"target": "https://html5.gamedistribution.com/rvvASMiM/rvvASMiM/0c454c9562d249d28ba3a2b50564042c/index.html?gd_sdk_referrer_url=https%3A%2F%2Ftr.y8.com%2Fgames%2Fvex_7&key=y8&value=default&gd_zone_config=eyJwYXJlbnRVUkwiOiJodHRwczovL3RyLnk4LmNvbS9nYW1lcy92ZXhfNyIsInBhcmVudERvbWFpbiI6InRyLnk4LmNvbSIsInRvcERvbWFpbiI6InRyLnk4LmNvbSIsImhhc0ltcHJlc3Npb24iOmZhbHNlLCJsb2FkZXJFbmFibGVkIjp0cnVlLCJob3N0IjoiaHRtbDUuZ2FtZWRpc3RyaWJ1dGlvbi5jb20iLCJ2ZXJzaW9uIjoiMS41LjE2In0%253D",
"target": "https://html5.gamedistribution.com/rvvASMiM/0c454c9562d249d28ba3a2b50564042c/index.html?gd_sdk_referrer_url=https%3A%2F%2Ftr.y8.com%2Fgames%2Fvex_7&key=y8&value=default&gd_zone_config=eyJwYXJlbnRVUkwiOiJodHRwczovL3RyLnk4LmNvbS9nYW1lcy92ZXhfNyIsInBhcmVudERvbWFpbiI6InRyLnk4LmNvbSIsInRvcERvbWFpbiI6InRyLnk4LmNvbSIsImhhc0ltcHJlc3Npb24iOmZhbHNlLCJsb2FkZXJFbmFibGVkIjp0cnVlLCJob3N0IjoiaHRtbDUuZ2FtZWRpc3RyaWJ1dGlvbi5jb20iLCJ2ZXJzaW9uIjoiMS41LjE2In0%253D",
"image": "https://img.gamedistribution.com/0c454c9562d249d28ba3a2b50564042c-512x512.jpg"
},
{
"name": "Volley Random",
"target": "https://html5.gamedistribution.com/rvvASMiM/b6f03bdc505e4d78a17379a5a83e206b/?gd_sdk_referrer_url=https://gamedistribution.com/games/volley-random",
"target": "https://html5.gamedistribution.com/b6f03bdc505e4d78a17379a5a83e206b/?gd_sdk_referrer_url=https://gamedistribution.com/games/volley-random",
"image": "https://img.gamedistribution.com/b6f03bdc505e4d78a17379a5a83e206b-512x512.jpeg"
},
{
@@ -587,542 +580,5 @@
"name": "Super Mario Bros",
"target": "/cdn/mario/index.html",
"image": "https://lh3.googleusercontent.com/PwJw4lIjmSVwOkpaeYigpJgwzEnTKIRQhxy7PmV0qnEVh4xuHb2vojFtNU4JCrCJL5YL5xi8WG7peK2kscQXjaEQ=w640-h400-e365-rj-sc0x00ffffff"
},
{
"name": "Funny Shooter 2",
"target": "https://rawcdn.githack.com/nightrose-labs/quartz/master/1/6af3cc65-32f9-4f3d-a66c-6c8882a7c5df/index.html",
"image": "https://raw.githubusercontent.com/nightrose-labs/quartz/master/thumb/6af3cc65-32f9-4f3d-a66c-6c8882a7c5df.jpg",
"popular": true
},
{
"name": "Amongus",
"target": "/cdn/3kh0/among-us/index.html",
"image": "https://play-lh.googleusercontent.com/8ddL1kuoNUB5vUvgDVjYY3_6HwQcrg1K2fd_R8soD-e2QYj8fT9cfhfh3G0hnSruLKec"
},
{
"name": "Taming.io",
"target": "https://taming.io",
"image": "https://play-lh.googleusercontent.com/EoY1Ey67rMjTHXIUqZCL3m4Ad4Of8BQr7tUHIcHWkM4YEiMugylaTPBNPAZQ6J8jumI=w240-h480-rw"
},
{
"name": "Rooftop Snipers",
"target": "/cdn/3kh0/rooftop-snipers/index.html",
"image": "https://img.poki.com/cdn-cgi/image/quality=78,width=600,height=600,fit=cover,f=auto/c127771edb0e821e4109b7058ae3f094.jpeg"
},
{
"name": "Google Snake",
"target": "/cdn/3kh0/google-snake/index.html",
"image": "https://play-lh.googleusercontent.com/p19u9SINIT3SZUQ8NcdcX5ROSFeEgTBc8J2okk8TsqSz2cq6eFJ0ekT-TwwqEXAKrQ"
},
{
"name": "Hextris",
"target": "/cdn/3kh0/hextris/index.html",
"image": "https://codeberg.org/derpman/echo/raw/branch/main/hextris/images/hextris-logo.png"
},
{
"name": "HexGL",
"target": "/cdn/3kh0/HexGL/index.html",
"image": "https://codeberg.org/derpman/echo/raw/branch/main/HexGL/icon.png"
},
{
"name": "Appel",
"target": "/cdn/appel/index.html",
"image": "https://store-images.s-microsoft.com/image/apps.14476.13631454430641262.37c87ec2-8482-46a7-a63a-261257b0eba0.238f1630-e1a2-4cdc-ab31-ae80905aacb4?mode=scale&q=90&h=300&w=300"
},
{
"name": "Temple Run 2",
"target": "/cdn/3kh0/temple-run-2/index.html",
"image": "https://upload.wikimedia.org/wikipedia/en/9/98/Temple_Run_2.png"
},
{
"name": "Stack Bump 3D",
"target": "/cdn/3kh0/stack-bump-3d/index.html",
"image": "/cdn/3kh0/stack-bump-3d/thumbnail.jpg"
},
{
"name": "Stack",
"target": "/cdn/3kh0/stack/index.html",
"image": "/cdn/3kh0/stack/stack.png"
},
{
"name": "Death Run 3D",
"target": "/cdn/3kh0/death-run-3d/index.html",
"image": "/cdn/3kh0/death-run-3d/img/death.png"
},
{
"name": "Cut the Rope Time Travel",
"target": "/cdn/3kh0/ctr-tr/index.html",
"image": "/cdn/3kh0/ctr-tr/logo.png"
},
{
"name": "Cut the Rope Holiday",
"target": "/cdn/3kh0/ctr-holiday/index.html",
"image": "/cdn/3kh0/ctr-holiday/Holiday_Gift.webp"
},
{
"name": "Ducklife 3",
"target": "/cdn/3kh0/ducklife3/index.html",
"image": "/cdn/3kh0/ducklife3/duck.png"
},
{
"name": "Ducklife 4",
"target": "/cdn/3kh0/ducklife4/index.html",
"image": "/cdn/3kh0/ducklife4/splash.jpg"
},
{
"name": "Om-Nom Bounce",
"target": "/cdn/3kh0/om-bounce/index.html",
"image": "/cdn/3kh0/om-bounce/assets/icon.jpeg"
},
{
"name": "Stickman Hook",
"target": "/cdn/3kh0/stickman-hook/index.html",
"image": "/cdn/3kh0/stickman-hook/unnamed.jpg"
},
{
"name": "Slither.io",
"target": "https://slither.io",
"image": "https://play-lh.googleusercontent.com/oObkhKfUXOY5yzheKe9w1Y1pXZBgdiSksMeNmT0BijoQ8J75maTCIW2TA7-6pA6EMA"
},
{
"name": "Evowars.io",
"target": "https://evowars.io",
"image": "https://play-lh.googleusercontent.com/8MffWSh6-Onwm--Hb5r7UUi21c7MxurIFIrNbBfIPHbb6KIcthHB2PUKcch6L0dO7HA"
},
{
"name": "Deepest Sword",
"target": "https://html-classic.itch.zone/html/4017918/index.html",
"image": "https://images.sftcdn.net/images/t_app-icon-m/p/f97701fd-a064-4cac-9247-9793e72d8220/2271577798/deepest-sword-logo"
},
{
"name": "Tunnel Rush Mania",
"target": "https://html5.gamemonetize.co/2fp4sd31llh6u6vjxe1wxbx8meapsgop/",
"image": "https://play-lh.googleusercontent.com/tl2qr3PCg-vpzloUgjMAY9eXz9y58Gdmb77_d9RbmrWoQu8rIvj4Fn3eCurqBoWsY84"
},
{
"name": "Bacon May Die",
"target": "https://game.enjoy4fun.com/baconmaydie/v2/index.html",
"image": "https://img.poki.com/cdn-cgi/image/quality=78,width=600,height=600,fit=cover,f=auto/0b3b5b2de68b3a604693bf23b3994aa7.png"
},
{
"name": "Google Feud",
"target": "/cdn/3kh0/google-feud/index.html",
"image": "/cdn/3kh0/google-feud/splash.png"
},
{
"name": "Eggy Car",
"target": "https://webglmath.github.io/eggy-car/",
"image": "https://eggy-car.github.io/img/hero/hero.jpg"
},
{
"name": "Cookie Clicker",
"target": "https://orteil.dashnet.org/cookieclicker/",
"image": "https://play-lh.googleusercontent.com/Z1MOuuiD05ZN5LkVmMEvKF0mqAc-FknaQ2j8s4dZiO-LSPQX4EEA3RVJdlQEtxe96ok"
},
{
"name": "Papery Planes",
"target": "/cdn/3kh0/papery-planes/index.html",
"image": "/cdn/3kh0/papery-planes/splash.jpg"
},
{
"name": "Rolly Vortex",
"target": "/cdn/3kh0/rolly-vortex/index.html",
"image": "/cdn/3kh0/rolly-vortex/icon-256.png"
},
{
"name": "Snowbattle.io",
"target": "/cdn/3kh0/snowbattle/index.html",
"image": "/cdn/3kh0/snowbattle/img/logo.png"
},
{
"name": "Swerve",
"target": "/cdn/3kh0/swerve/index.html",
"image": "/cdn/3kh0/swerve/img/favicon.jpg"
},
{
"name": "Tube Jumpers",
"target": "/cdn/3kh0/tube-jumpers/index.html",
"image": "/cdn/3kh0/tube-jumpers/img/shark.jpg"
},
{
"name": "Superhot",
"target": "/cdn/3kh0/superhot/index.html",
"image": "/cdn/3kh0/superhot/hot.jpg"
},
{
"name": "Glass City",
"target": "/cdn/3kh0/glass-city/index.html",
"image": "/cdn/3kh0/glass-city/image.png"
},
{
"name": "Connect 3",
"target": "/cdn/3kh0/connect3/index.html",
"image": "/cdn/3kh0/connect3/connect3.png"
},
{
"name": "Henry Stickmin: Breaking the Bank",
"target": "/cdn/3kh0/breakingthebank/index.html",
"image": "/cdn/3kh0/breakingthebank/breakingthebank.png"
},
{
"name": "Bloons TD",
"target": "/cdn/3kh0/bloonstd/index.html",
"image": "/cdn/3kh0/bloonstd/bloonstd.jpg"
},
{
"name": "Portal",
"target": "/cdn/3kh0/portalflash/index.html",
"image": "/cdn/3kh0/portalflash/portaltheflashversion.jpg"
},
{
"name": "Riddle School",
"target": "/cdn/3kh0/riddleschool/index.html",
"image": "/cdn/3kh0/riddleschool/riddleschool.png"
},
{
"name": "Riddle School 2",
"target": "/cdn/3kh0/riddleschool2/index.html",
"image": "/cdn/3kh0/riddleschool2/riddleschool2.png"
},
{
"name": "Riddle School 3",
"target": "/cdn/3kh0/riddleschool3/index.html",
"image": "/cdn/3kh0/riddleschool3/riddleschool3.png"
},
{
"name": "Riddle School 4",
"target": "/cdn/3kh0/riddleschool4/index.html",
"image": "/cdn/3kh0/riddleschool4/riddleschool4.png"
},
{
"name": "Riddle School 5",
"target": "/cdn/3kh0/riddleschool5/index.html",
"image": "/cdn/3kh0/riddleschool5/riddleschool5.png"
},
{
"name": "Riddle Transfer",
"target": "/cdn/3kh0/riddletransfer/index.html",
"image": "/cdn/3kh0/riddletransfer/riddletransfer.png"
},
{
"name": "Riddle Transfer 2",
"target": "/cdn/3kh0/riddletransfer2/index.html",
"image": "/cdn/3kh0/riddletransfer2/riddletransfer2.png"
},
{
"name": "Slope 2",
"target": "/cdn/3kh0/slope-2/index.html",
"image": "/cdn/3kh0/slope-2/slope-2-logo.png"
},
{
"name": "Slope Ball",
"target": "/cdn/3kh0/slope-ball/index.html",
"image": "/cdn/3kh0/slope-ball/splash.png"
},
{
"name": "Rabbit Samurai",
"target": "/cdn/3kh0/rabbit-samurai/index.html",
"image": "/cdn/3kh0/rabbit-samurai/splash.png"
},
{
"name": "Rabbit Samurai 2",
"target": "/cdn/3kh0/rabbit-samurai2/index.html",
"image": "/cdn/3kh0/rabbit-samurai2/splash.png"
},
{
"name": "Little Alchemy",
"target": "https://littlealchemy.com",
"image": "https://assets-prd.ignimgs.com/2022/08/15/little-academy-mobile-1660600636606.png"
},
{
"name": "Little Alchemy 2",
"target": "https://littlealchemy2.com",
"image": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTaLDbrBKQlCSOXK7WNgx3myLJKrMD--5F8YkpI7ILih54J3ka6hyXDGOmZJr8_aXhuQA4&usqp=CAU"
},
{
"name": "OvO 2",
"target": "https://dthesle.github.io/OvO2/",
"image": "https://lh3.googleusercontent.com/FOaLiWCIhdC5K-oE5UofoDpn3w2ZEAq359yAembr-Q-7mRqNd9ramV97FqyqPuqohwDdQZOm5MF9DL-QcTliLNmf=w640-h400-e365-rj-sc0x00ffffff"
},
{
"name": "OvO Dimensions",
"target": "https://www.miniplay.com/embed/ovo-dimensions",
"image": "https://img.poki.com/cdn-cgi/image/quality=78,width=600,height=600,fit=cover,f=auto/76d0bf7026c6bf569a2fa96e92289484.png"
},
{
"name": "Ages of Conflict",
"target": "/cdn/3kh0/ages-of-conflict/index.html",
"image": "/cdn/3kh0/ages-of-conflict/splash.jpg"
},
{
"name": "Amazing Rope Police",
"target": "/cdn/3kh0/amazing-rope-police/index.html",
"image": "https://3kh0.github.io/images/amazing-rope.jpeg"
},
{
"name": "99 Balls Evo",
"target": "/cdn/3kh0/99balls/index.html",
"image": "https://3kh0.github.io/images/99-balls-evo.jpg"
},
{
"name": "Bad Ice Cream",
"target": "/cdn/3kh0/bad-ice-cream/index.html",
"image": "/cdn/3kh0/bad-ice-cream/bad-ice-cream.png"
},
{
"name": "Bad Ice Cream 2",
"target": "/cdn/3kh0/bad-ice-cream-2/index.html",
"image": "/cdn/3kh0/bad-ice-cream-2/bad-ice-cream-2.png"
},
{
"name": "Bad Ice Cream 3",
"target": "/cdn/3kh0/bad-ice-cream-3/index.html",
"image": "/cdn/3kh0/bad-ice-cream-3/bad-ice-cream-3.png"
},
{
"name": "Core Ball",
"target": "/cdn/3kh0/core-ball/index.html",
"image": "/cdn/3kh0/core-ball/pr_source.png"
},
{
"name": "Champion Island",
"target": "/cdn/3kh0/champion-island/index.html",
"image": "/cdn/3kh0/champion-island/splash.png"
},
{
"name": "Cannon Basketball 4",
"target": "/cdn/3kh0/cannon-basketball-4/index.html",
"image": "/cdn/3kh0/cannon-basketball-4/img/splash.png"
},
{
"name": "Paper.io",
"target": "https://g-class.biz/lessons/1/",
"image": "https://gamaddy.com/paper-io.png"
},
{
"name": "Slime Rush TD",
"target": "/cdn/3kh0/slime-rush-td/index.html",
"image": "/cdn/3kh0/slime-rush-td/splash.png"
},
{
"name": "Station 141",
"target": "/cdn/3kh0/station-141/index.html",
"image": "https://img.itch.zone/aW1nLzU4ODM5NjMucG5n/original/75wxYs.png"
},
{
"name": "Rolling Forests",
"target": "/cdn/3kh0/rolling-forests/index.html",
"image": "/cdn/3kh0/rolling-forests/icon.png"
},
{
"name": "Veloce",
"target": "/cdn/3kh0/veloce/index.html",
"image": "https://img.itch.zone/aW1nLzI1NjI0MjgucG5n/original/qN6zkD.png"
},
{
"name": "Polybranch",
"target": "/cdn/3kh0/polybranch/index.html",
"image": "/cdn/3kh0/polybranch/img/pic1.png"
},
{
"name": "Stick Archers",
"target": "/cdn/3kh0/stick-archers/index.html",
"image": "/cdn/3kh0/stick-archers/splash.jpg"
},
{
"name": "Soccer Skills",
"target": "/cdn/3kh0/soccer-skills/index.html",
"image": "/cdn/3kh0/soccer-skills/splash.png"
},
{
"name": "Stick Merge",
"target": "/cdn/3kh0/stick-merge/index.html",
"image": "/cdn/3kh0/stick-merge/splash.png"
},
{
"name": "Subway Surfers: New York",
"target": "/cdn/3kh0/subway-surfers-ny/index.html",
"image": "/cdn/3kh0/subway-surfers-ny/NewYorkIcon.png"
},
{
"name": "Henry Stickmin: Escaping The Prision",
"target": "/cdn/3kh0/escapingtheprison/index.html",
"image": "/cdn/3kh0/escapingtheprison/escapingtheprison.jpg"
},
{
"name": "Knife Master",
"target": "/cdn/3kh0/knife-master/index.html",
"image": "/cdn/3kh0/knife-master/512x512.jpg"
},
{
"name": "Monster Tracks",
"target": "/cdn/3kh0/monster-tracks/index.html",
"image": "https://3kh0.github.io/images/monster-tracks.jpg"
},
{
"name": "Madalin Stunt Cars 2",
"target": "/cdn/3kh0/madalin-stunt-cars-2/index.html",
"image": "/cdn/3kh0/madalin-stunt-cars-2/img/logo.jpg"
},
{
"name": "Madalin Stunt Cars 3",
"target": "/cdn/3kh0/madalin-stunt-cars-3/index.html",
"image": "/cdn/3kh0/madalin-stunt-cars-3/img/index.jpg"
},
{
"name": "Henry Stickmin: Fleeing The Complex",
"target": "/cdn/3kh0/fleeingthecomplex/index.html",
"image": "https://3kh0.github.io/images/fleeing.jpeg"
},
{
"name": "Grey Box",
"target": "/cdn/3kh0/greybox/index.html",
"image": "/cdn/3kh0/greybox/ico.png"
},
{
"name": "Cars Simulator",
"target": "/cdn/3kh0/cars-simulator/index.html",
"image": "/cdn/3kh0/cars-simulator/splash.png"
},
{
"name": "Cell Machine",
"target": "/cdn/3kh0/cell-machine/index.html",
"image": "/cdn/3kh0/cell-machine/img/te9nDu.png"
},
{
"name": "Stickman Survival",
"target": "/cdn/3kh0/Stickman-Survival/index.html",
"image": "/cdn/3kh0/Stickman-Survival/Icon.png"
},
{
"name": "Avalanche",
"target": "/cdn/3kh0/avalanche/index.html",
"image": "/cdn/3kh0/avalanche/avalanche.png"
},
{
"name": "Ducklife",
"target": "/cdn/3kh0/ducklife1/index.html",
"image": "/cdn/3kh0/ducklife1/ducklife.png"
},
{
"name": "Ducklife 2",
"target": "/cdn/3kh0/ducklife2/index.html",
"image": "/cdn/3kh0/ducklife2/ducklife2.png"
},
{
"name": "Pool/Billiards Classic",
"target": "https://13582048327635951979.playables.usercontent.goog/v/assets/index.html",
"image": "https://play-lh.googleusercontent.com/KAyIN39YIUSorZxZ8iDtwO12C4V90ZSdi3tO7RUfxPxqGOhF6BYXv5VpAxlvfUWozI18"
},
{
"name": "Alien Shooter",
"target": "https://16702553337040190672.playables.usercontent.goog/v/assets/index.html",
"image": "https://www2.minijuegosgratis.com/v3/games/thumbnails/241062_7_sq.jpg"
},
{
"name": "Amaze!",
"target": "https://580820627722902829.playables.usercontent.goog/v/assets/index.html",
"image": "https://play-lh.googleusercontent.com/hypAu2hPcTpg-FkZr7CjrWDspK_9Nm3UKvPWln9zaFUnIr-m6WQvEZ2baAaG0ufzrg"
},
{
"name": "Angry Birds: Showdown",
"target": "https://6381249690777614785.playables.usercontent.goog/v/assets/index.html",
"image": "https://static.wikia.nocookie.net/angrybirdsfanon/images/0/0a/Angry_Birds_Showdown_App_Icon_%28Alpha%29.png/revision/latest?cb=20190801034150"
},
{
"name": "Basketball FRVR",
"target": "https://11024365036548115513.playables.usercontent.goog/v/assets/index.html",
"image": "https://img.poki.com/cdn-cgi/image/quality=78,width=600,height=600,fit=cover,f=auto/5aae527bebe68094c3d3276387150197.png"
},
{
"name": "Cannon Balls 3D",
"target": "https://14726002176993811037.playables.usercontent.goog/v/assets/index.html",
"image": "https://gameforge.com/de-DE/littlegames/includes/images/games/7_5ea03e7e3fe27.jpg"
},
{
"name": "Radius Raid",
"target": "https://jackrugile.com/radius-raid/",
"image": "/cdn/images/radiusraid.jpg"
},
{
"name": "The Chroma Incident",
"target": "https://js13kgames.com/games/the-chroma-incident/index.html",
"image": "/cdn/images/thechromaincident.png"
},
{
"name": "Dino Run 3d",
"target": "https://russell2259.github.io/dino3d/",
"image": "/cdn/images/dino3d.jpg"
},
{
"name": "Burrito Bison: Launcha Libre",
"target": "https://rawcdn.githack.com/GameHub88/Yexex-Assets/main/bb/index.html",
"image": "https://play-lh.googleusercontent.com/vpTgm9u7-GzZP_MceTWpDi0HbinXd_4phCoTwf4ZspFL-115FtNRdo_SU1p-khLDnLA"
},
{
"name": "Yohoho.io",
"target": "https://rawcdn.githack.com/GameHub88/Yexex-Assets/main/yohoho/index.html",
"image": "https://lh3.googleusercontent.com/BulAgT61Ocg2r5obu2apG_IOYUi3t16vdmBwy0uAgmiOatFUfcRVuRKFPGSsz0kRJN8N"
},
{
"name": "Jacksmith",
"target": "https://moonlight.silvereen.net/src/static/games/jacksmith/index.html",
"image": "https://img.poki.com/cdn-cgi/image/quality=78,width=600,height=600,fit=cover,f=auto/ebe99c6629baa3ea5f4d9c13f36a37bb.png"
},
{
"name": "Sans Fight Simulator",
"target": "https://jcw87.github.io/c2-sans-fight/",
"image": "https://img.itch.zone/aW1nLzE2MDEzODIucG5n/original/oNevX4.png"
},
{
"name": "Slowroads",
"target": "https://slowroads.io",
"image": "https://cdn-1.webcatalog.io/catalog/slow-roads/slow-roads-icon-filled-256.png?v=1678597634783"
},
{
"name": "Duck Life 5",
"target": "https://rawcdn.githack.com/CybriaTech/Opium/main/games/duck-life-5/index.html",
"image": "https://play-lh.googleusercontent.com/JQqSn7wuCj0SxBqpBThNI33qCR9gwY0str2TIAnu-m_xrVCgZk3IPxYK2S7zC9WG0ig"
},
{
"name": "Bloons TD 4",
"target": "https://rawcdn.githack.com/CybriaTech/Opium/main/games/btd-4/index.html",
"image": "https://assets-prd.ignimgs.com/2022/08/16/bloons-td4-button-1660612386362.jpg"
},
{
"name": "Bloons TD 5",
"target": "https://rawcdn.githack.com/CybriaTech/Opium/main/games/btd-5/index.html",
"image": "https://m.media-amazon.com/images/M/MV5BNTkzYTJmNWEtOTdjMS00MzBjLWJiZmUtNzhlMDQzYzhkODA2XkEyXkFqcGdeQXVyNTgyNTA4MjM@._V1_.jpg"
},
{
"name": "Raft Wars",
"target": "https://rawcdn.githack.com/CybriaTech/Opium/main/games/raft-wars/index.html",
"image": "https://i.ytimg.com/vi/FPZMXwGSwpQ/hqdefault.jpg"
},
{
"name": "Raft Wars 2",
"target": "https://rawcdn.githack.com/CybriaTech/Opium/main/games/raft-wars-2/index.html",
"image": "https://static.wikia.nocookie.net/raftwars/images/c/c2/Rw2.jpg/revision/latest?cb=20141110013832"
},
{
"name": "Run",
"target": "https://rawcdn.githack.com/CybriaTech/Opium/main/games/run/index.html",
"image": "https://www.coolmathgames.com/sites/default/files/Run_OG-logo.jpg"
},
{
"name": "Run 2",
"target": "https://rawcdn.githack.com/CybriaTech/Opium/main/games/run2/index.html",
"image": "https://www.coolmathgames.com/sites/default/files/run-2.png"
},
{
"name": "Subway Surfers: Singapore",
"target": "https://rawcdn.githack.com/CybriaTech/Opium/main/games/subway-surfers-singapore/index.html",
"image": "https://static.wikia.nocookie.net/subwaysurf/images/6/6d/Singapore2019LoadingScreen.png/revision/latest/scale-to-width-down/250?cb=20220403173202"
},
{
"name": "Polytrack",
"target": "https:/game.glimbo.xyz/polytrack",
"image": "https://www.speedrun.com/static/game/w6j7ml76/cover.jpg?v=05316e4",
"popular": true
}
]
]
+5
View File
@@ -0,0 +1,5 @@
[
{
"quote": "The <span class='blue'>first</span> quote??!"
}
]
+15 -107
View File
@@ -79,7 +79,7 @@ body::-webkit-scrollbar-corner {
.row.mainpage {
position: absolute;
margin-top: 0px;
top: calc(calc(9vh + 2.5em) + 60px);
top: calc(calc(9vh + 2.5em) + 100px);
bottom: 50px;
}
@@ -87,72 +87,12 @@ body::-webkit-scrollbar-corner {
display: none;
}
.search {
#searchInput {
margin-bottom: 20px;
display: flex;
input {
width: 40vh;
height: 7.5vh;
border-radius: 2vh;
font-size: 3vh;
cursor: text;
border-top-right-radius: 0px;
border-bottom-right-radius: 0px;
transition: all 0.5s ease;
margin: 0px;
padding: 0px;
margin-right: 2.5px;
margin-left: calc(50vw - calc(44vh + 45px));
background-color: var(--background-darker);
}
input:focus {
width: 50vh;
margin-left: calc(50vw - calc(54vh + 45px));
}
input::placeholder {
transition: opacity 0.3s ease;
}
input:focus::placeholder {
opacity: 0;
}
select {
height: 7.5vh;
border-radius: 2vh;
font-size: 3vh;
background-color: var(--background-darker);
margin-left: 0px;
border-top-left-radius: 0px;
border-bottom-left-radius: 0px;
margin: 0px;
}
button {
text-align: center;
box-shadow: 0.5vh 0.5vh 1vh 0vh var(--shadow-color);
cursor: pointer;
height: 7.5vh;
background-color: var(--background-darker);
color: var(--text);
margin-left: 0px;
border-radius: 0px;
padding: 0px;
margin: 0px;
outline: none;
border: none;
margin-right: 2.5px;
padding-left: 10px;
padding-right: 10px;
}
button i {
font-size: 3vh;
}
width: 40vh;
height: 7vh;
border-radius: 2vh;
font-size: 3vh;
}
i {
@@ -176,7 +116,7 @@ h1.title {
hr {
border: 0;
height: 0.3vh;
background-image: var(--hr-style);
background-image: linear-gradient(to right, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.75), rgba(255, 255, 255, 0));
}
.small {
@@ -210,27 +150,6 @@ hr {
margin-top: 2vh;
}
.proxyinput-index {
text-align: center;
font-size: 2vh;
box-shadow: 0.5vh 0.5vh 1vh 0vh var(--shadow-color);
border: none;
border-radius: 2vh;
cursor: pointer;
background: var(--sidebar-bg);
width: 20vw;
height: 6vh;
color: var(--text);
transition: 0.5s;
margin: auto;
margin: 2vh;
transition: all 0.5s ease;
}
.proxyinput-index:focus {
width: 30vw;
}
button {
text-align: center;
border: none;
@@ -259,11 +178,6 @@ input {
transition: 0.5s;
margin: auto;
margin-top: 2vh;
transition: border-color 0.4s linear;
}
input:hover{
border-color: var(--nav-hover);
}
input::placeholder {
@@ -298,6 +212,10 @@ select {
margin-top: 2vh;
}
button:hover {
opacity: 0.8;
}
.switch {
position: relative;
display: inline-block;
@@ -388,8 +306,7 @@ input:checked+.slider:before {
display: block;
border: none;
cursor: pointer;
transition: all 0.5s ease;
filter: brightness(100%);
transition: .4s;
overflow: hidden;
position: relative;
box-shadow: 0vh 0.75vh 1.5vh 0vh black;
@@ -403,7 +320,7 @@ input:checked+.slider:before {
}
.game:hover {
filter: brightness(105%);
filter: brightness(95%);
transform: translateY(-0.2vh);
border-color: #ffffff;
}
@@ -622,6 +539,7 @@ input:checked+.slider:before {
color: var(--text);
overflow: hidden;
margin-left: 50px;
margin-right: 25px;
text-align: center;
}
@@ -673,17 +591,7 @@ img.featured:hover {
margin-right: 100px;
}
#changelog i {
overflow: hidden;
white-space: nowrap;
display: block;
/*Converting percentage into px so text-overflow: ellipsis; will apply*/
width: calc(100% - 1px + 1px);
text-overflow: ellipsis;
}
@keyframes beat {
0%,
50%,
100% {
@@ -746,4 +654,4 @@ img.featured:hover {
100% {
transform: translate(1px, -2px) rotate(-1deg);
}
}
}
+62 -62
View File
@@ -1,85 +1,85 @@
@media (max-width: 960px) {
.navbar > .right {
display: none;
}
@media (max-width:960px) {
.navbar>.right {
display: none;
}
}
.navbar {
box-shadow: 0vh 0.5vh 0.75vh 0vh var(--shadow-color);
position: fixed;
width: calc(calc(100% - 100px) - calc(1.5em * 2));
background-color: var(--background-color);
top: 0;
margin-left: 50px;
margin-right: 50px;
margin-top: 40px;
color: rgb(255, 255, 255);
z-index: 100;
display: flex;
border-radius: 2vh;
padding: 1.5em;
padding-bottom: 1em;
text-align: center;
backdrop-filter: blur(7.1px);
-webkit-backdrop-filter: blur(7.1px);
box-shadow: 0vh 0.5vh 0.75vh 0vh var(--shadow-color);
position: fixed;
width: calc(calc(100% - 100px) - calc(1.5em * 2));
background-color: var(--background-color);
top: 0;
margin-left: 50px;
margin-right: 50px;
margin-top: 50px;
color: rgb(255, 255, 255);
z-index: 100;
display: flex;
border-radius: 2vh;
padding: 1.5em;
padding-bottom: 1em;
text-align: center;
backdrop-filter: blur(7.1px);
-webkit-backdrop-filter: blur(7.1px);
}
.navbar.scrolling {
background-color: var(--background-darker);
color: black;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
background-color: var(--background-darker);
color: black;
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(3px);
}
.navbar > .title {
margin: 1vh;
.navbar>.title {
margin: 1vh;
}
.navbar > .title > img {
width: 6vh;
border-radius: 1vh;
.navbar>.title>img {
width: 6vh;
border-radius: 1vh;
}
.navbar > .title > span {
font-family: "Lato-Black";
font-size: 3vh;
left: 11vh;
position: absolute;
text-align: left;
.navbar>.title>span {
font-family: 'Lato-Black';
font-size: 3vh;
left: 11vh;
position: absolute;
text-align: left;
}
.navbar > .title > span > span {
display: flex;
position: relative;
font-size: 1.2vh;
width: auto;
.navbar>.title>span>span {
display: flex;
position: relative;
font-size: 1.2vh;
width: auto;
}
.navbar > .right {
position: absolute;
right: 0;
margin: 2vh;
margin-top: 2.5vh;
margin-right: 3vh;
.navbar>.right {
position: absolute;
right: 0;
margin: 2vh;
margin-top: 2.5vh;
margin-right: 3vh;
}
.navbar > .right > a {
border-style: solid;
border-width: 0.3vh;
margin: 0.3rem;
padding: 0.8rem;
cursor: pointer;
font-size: 2.7vh;
border-radius: 1.5vh;
border-color: var(--button-bg);
transition: border-color 0.4s linear;
background-color: var(--button-bg);
.navbar>.right>a {
border-style: solid;
border-width: 0.5vh;
margin: 0.3rem;
padding: 0.8rem;
cursor: pointer;
font-size: 2.7vh;
border-radius: 1.5vh;
border-color: rgba(0, 0, 0, 0);
transition: border-color 0.4s linear;
}
.navbar > .right > a:hover {
border-color: var(--nav-hover);
.navbar>.right>a:hover {
border-color: rgba(255, 255, 255, 1);
}
.navbar > .right > a.active {
border-color: rgba(255, 255, 255, 1);
.navbar>.right>a.active {
border-color: rgba(255, 255, 255, 1);
}
+7 -70
View File
@@ -1,36 +1,33 @@
body[data-theme='dark'] {
--background-color: rgba(17, 22, 31, 0.8);
--background-darker: rgba(0, 0, 0, 0.9);
--background-color: rgba(0, 0, 0, 0.8);
--background-darker: rgba(26, 25, 32, 0.75);
--text: #fff;
--sidebar-bg: #161f2eef;
--button-bg: #44385e69;
--button-bg: #1c1c1c69;
--shadow-color: #000;
--switch-color: #42424259;
--switch-active: #2196F3;
--nav-hover: #2196F3;
--scrollbar-color: #ffffff59;
--solid: #1b2735;
--hover: #757575;
--hr-style: linear-gradient(to right, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.75), rgba(255, 255, 255, 0));
background: radial-gradient(at center bottom, rgb(27, 39, 53) 0%, rgb(9, 10, 15) 100%);
background-repeat: no-repeat;
}
body[data-theme='light'] {
--background-color: #fff;
--background-darker: var(--background-color);
--background-color: #ffffffcc;
--background-darker: rgba(235, 235, 235, 0.8);
--text: #000;
--sidebar-bg: #e9e9e9ee;
--hover: #757575;
--sidebar-bg: #ffffffee;
--button-bg: #ecececee;
--shadow-color: #c9c9c9;
--switch-color: #111111b0;
--nav-hover: #9c9c9c;
--switch-active: #2196F3;
--scrollbar-color: #4242424b;
--solid: #ffffffee;
--hover: #757575;
--hr-style: linear-gradient(to right, rgba(255, 255, 255, 0), rgba(0, 0, 0, 0.75), rgba(255, 255, 255, 0));
background: radial-gradient(ellipse at bottom, #b1b1b1 0%, #f6f5f0 100%);
background-repeat: no-repeat;
@@ -216,66 +213,6 @@ body[data-theme='violet'] {
}
}
body[data-theme='cyan'] {
--background-color: rgba(0, 0, 0, 0.8);
--background-darker: rgba(0, 0, 0, 0.9);
--text: #fff;
--sidebar-bg: #000000;
--button-bg: #000000;
--shadow-color: #1f4e4c;
--switch-color: #00404b;
--switch-active: #00fff2;
--scrollbar-color: #000000;
--solid: #000000;
--hover: #8fe0dc;
background: linear-gradient(90deg, rgb(94, 255, 247) 0%, rgb(78, 138, 157) 85%);
animation: cyan-gradient 12s ease infinite;
@keyframes cyan-gradient {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
}
body[data-theme='bronze'] {
--background-color: rgba(0, 0, 0, 0.8);
--background-darker: rgba(0, 0, 0, 0.9);
--text: #fff;
--sidebar-bg: #000000;
--button-bg: #000000;
--shadow-color: #4c2b04;
--switch-color: #643c00;
--switch-active: #ffa318;
--scrollbar-color: #000000;
--solid: #000000;
--hover: #ffb74a;
background: linear-gradient(90deg, rgb(253, 135, 1) 0%, rgb(58, 32, 3));
animation: bronze-gradient 12s ease infinite;
@keyframes bronze-gradient {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
}
@media screen and (prefers-color-scheme: light) {
body[data-theme='system-default'] {
--background-color: #fff;
Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 MiB

+3
View File
@@ -9,6 +9,7 @@ const load = () => fetch('/api/apps').then(res => res.json()).then(apps => {
const image = document.createElement('img');
image.src = app.image;
image.loading = 'lazy';
image.onerror = () => image.src = '/assets/img/logo.png';
el.appendChild(image);
@@ -27,6 +28,8 @@ const load = () => fetch('/api/apps').then(res => res.json()).then(apps => {
el.addEventListener('click', async () => {
document.body.style.opacity = '0.7';
umami.track('app_' + app.name);
setTimeout(() => {
if (isValidURL(app.target)) createViewPage({
target: app.target,
+3
View File
@@ -10,6 +10,7 @@ const load = () => fetch('/api/cheats')
const image = document.createElement('img');
image.src = cheat.image;
image.loading = 'lazy';
image.onerror = () => image.src = '/assets/img/logo.png';
el.appendChild(image);
@@ -28,6 +29,8 @@ const load = () => fetch('/api/cheats')
el.addEventListener('click', () => {
document.body.style.opacity = '0.7';
umami.track('cheat_' + cheat.name);
setTimeout(() => {
if (isValidURL(cheat.target)) createViewPage({
target: cheat.target,
+1 -41
View File
@@ -7,9 +7,8 @@
/**
* @typedef easterEgg
* @type {object}
* @property {'keybind' | 'date'} easterEgg.type
* @property {'keybind' | 'click'} easterEgg.type
* @property {string} easterEgg.phrase
* @property {string} easterEgg.date
* @property {number} easterEgg.clickCount
* @property {object} easterEgg.element
* @property {object} easterEgg.variables
@@ -56,31 +55,6 @@ const utils = {
return {
remove: () => window.removeEventListener(listener)
};
},
/**
* @param {string} date
* @param {easterEgg['run']} script
*/
createDate: async (date, script) => {
date = date.split('/');
if (date.length === 3) {
const day = date[1] === '*' ? new Date().getDate() : date[1];
const month = date[0] === '*' ? new Date().getMonth() : date[0];
const year = date[2] === '*' ? new Date().getFullYear() : date[2];
if (!utils.easterEggActive && (new Date().getDate() === day && new Date().getMonth() === month && new Date().getFullYear() === year)) {
try {
await script({
remove: () => window.removeEventListener('keydown', listener, true)
});
utils.easterEggActive = false;
} catch (e) {
utils.easterEggActive = false;
}
}
} else throw new Error('Invalid date');
}
};
@@ -412,24 +386,10 @@ easterEggs.push({
})
});
easterEggs.push({
type: 'date',
date: '4/1/*',
run: () => {
// April fools =)
}
});
export default () => easterEggs.forEach(easterEgg => {
if (easterEgg.type === 'keybind') {
utils.createKeybind(easterEgg.phrase, easterEgg.run);
try {
easterEgg.preload();
} catch (e) { }
} else if (easterEgg.type === 'date') {
utils.createDate(easterEgg.date, easterEgg.run);
try {
easterEgg.preload();
} catch (e) { }
+12 -103
View File
@@ -1,79 +1,17 @@
import { createViewPage, isValidURL, PolarisError, storage } from './utils.js';
import { createViewPage, isValidURL, PolarisError } from './utils.js';
import effects from './effects.js';
const settingsStorage = storage('settings');
const load = () => {
const sortListener = document.querySelector('#searchSort').addEventListener('change', () => {
settingsStorage.set('game_sort', document.querySelector('#searchSort').value);
const games = document.querySelectorAll('.games>.game');
for (let i = 0; i < games.length; i++) games[i].remove();
fetch('/api/games')
.then(res => res.json())
.then(games => {
if (settingsStorage.get('game_sort') === 'abc') games.all.sort((a, b) => a.name.localeCompare(b.name));
if (settingsStorage.get('game_sort') === 'newest') games.all.reverse();
games.all.forEach(game => {
const el = document.createElement('div');
el.classList = 'game';
document.querySelector('.games').appendChild(el);
const image = document.createElement('img');
image.src = game.image;
image.loading = 'lazy';
image.onerror = () => image.src = '/assets/img/logo.png';
el.appendChild(image);
const name = document.createElement('h3');
name.textContent = game.name;
el.appendChild(name);
effects.hoverTilt({
max: 8,
perspective: 1000,
scale: 1.05,
speed: 800,
easing: 'cubic-bezier(.03,.98,.52,.99)'
}, el);
el.addEventListener('click', async () => {
document.body.style.opacity = '0.7';
setTimeout(() => {
if (isValidURL(game.target)) createViewPage({
target: game.target,
title: game.name,
proxied: true
});
else createViewPage({
target: game.target,
title: game.name
});
}, 1000);
});
});
});
});
if (!settingsStorage.get('game_sort')) settingsStorage.set('game_sort', 'none');
document.querySelector('#searchSort').value = settingsStorage.get('game_sort');
fetch('/api/games')
.then(res => res.json())
.then(games => {
if (settingsStorage.get('game_sort') === 'abc') games.all.sort((a, b) => a.name.localeCompare(b.name));
if (settingsStorage.get('game_sort') === 'newest') games.all.reverse();
const searchBar = document.querySelector('#searchInput');
searchBar.setAttribute('placeholder', `Search ${games.all.length} Games`);
searchBar.addEventListener('input', () => {
console.log(searchBar.value);
if (searchBar.value) {
var result = false;
@@ -98,9 +36,10 @@ const load = () => {
const popularEl = document.createElement('div');
popularEl.classList = 'game';
document.querySelector('.popular-games').appendChild(popularEl);
const image = document.createElement('img');
image.src = game.image;
image.loading = 'lazy';
image.onerror = () => image.src = '/assets/img/logo.png';
popularEl.appendChild(image);
@@ -111,17 +50,17 @@ const load = () => {
popularEl.addEventListener('click', async () => {
document.body.style.opacity = '0.7';
umami.track('popular-game_' + game.name);
setTimeout(() => {
if (isValidURL(game.target)) createViewPage({
target: game.target,
title: game.name,
image: game.image,
proxied: true
});
else createViewPage({
target: game.target,
title: game.name,
image: game.image
title: game.name
});
}, 500);
});
@@ -142,6 +81,7 @@ const load = () => {
const image = document.createElement('img');
image.src = game.image;
image.loading = 'lazy';
image.onerror = () => image.src = '/assets/img/logo.png';
el.appendChild(image);
@@ -160,6 +100,8 @@ const load = () => {
el.addEventListener('click', async () => {
document.body.style.opacity = '0.7';
umami.track('game-' + game.name);
setTimeout(() => {
if (isValidURL(game.target)) createViewPage({
target: game.target,
@@ -175,41 +117,8 @@ const load = () => {
});
})
.catch(e => new PolarisError('Failed to load games'));
document.querySelector('#randomGame').addEventListener('click', () => {
const games = document.querySelectorAll('.games>.game');
if (games.length > 0) {
const randomGame = games[Math.floor(Math.random() * games.length)];
randomGame.click();
}
});
};
const loadGameFromURL = () => {
const urlParams = new URLSearchParams(window.location.search);
const gameName = urlParams.get('game');
if (!gameName) {
throw new PolarisError('No game specified in the URL');
}
fetch('/assets/JSON/games.json')
.then(res => res.json())
.then(data => {
const game = data.find(g => g.name === decodeURIComponent(gameName));
if (!game) {
throw new PolarisError(`Game "${gameName}" not found`);
}
renderGames([game]);
})
.catch(e => new PolarisError('Failed to load game'));
};
export default {
load,
loadGameFromURL
load
};
+29 -24
View File
@@ -1,4 +1,4 @@
import { createViewPage, isValidURL, getVH, PolarisError, storage } from './utils.js';
import { createViewPage, isValidURL, getVH, CrossTabCommunication, PolarisError, storage } from './utils.js';
import { loadSettings, loadSidebarInterface } from './settings.js';
import loadEasterEggs from './eastereggs.js';
import loadAnalytics from './analytics.js';
@@ -7,7 +7,7 @@ import Cheats from './cheats.js';
import Games from './games.js';
import Apps from './apps.js';
loadAnalytics();
await loadAnalytics();
if (location.pathname !== '/view') loadSidebarInterface();
loadEasterEggs();
@@ -35,19 +35,20 @@ window.addEventListener('beforeunload', (e) => {
if (settingsStorage.get('prevent_close')) {
e.preventDefault();
document.body.style.opacity = '1';
return e;
}
});
setInterval(() => {
if (sessionStorage.getItem('was_closing') === 'true') document.body.style.opacity = '1';
preventClose = settingsStorage.get('prevent_close');
}, 1);
/*await navigator.serviceWorker.register('/assets/js/offline.js', {
scope: '/'
});*/
window.addEventListener('load', () => setTimeout(() => document.body.style.opacity = 1, 1000));
setTimeout(() => document.body.style.opacity = 1, 5000);
window.addEventListener('DOMContentLoaded', () => setTimeout(() => document.body.style.opacity = 1, 1000));
/**
* @param {HTMLAnchorElement} hyperlink
@@ -105,10 +106,15 @@ const hyperlinkHandler = (hyperlink, e) => {
document.querySelectorAll('a').forEach(hyperlink => hyperlink.addEventListener('click', (e) => hyperlinkHandler(hyperlink, e)));
window.addEventListener('hashchange', () => {
if (location.hash === '#settings') document.querySelector('.sidebar').classList.add('active');
else document.querySelector('.sidebar').classList.remove('active');
});
window.onhashchange = () => {
if (location.hash === '#settings') {
document.querySelector('.sidebar').classList.add('active');
umami.track('sidebar-open');
} else {
document.querySelector('.sidebar').classList.remove('active');
umami.track('sidebar-close');
}
};
if (window.self === window.top && location.pathname !== '/view') setTimeout(async () => {
loadSettings();
@@ -132,12 +138,14 @@ if (location.pathname === '/') {
fetch('/api/games')
.then(res => res.json())
.then(games => {
const gameName = 'Stickman Archero Fight';
const gameName = '99 Balls 3D';
const game = games.all.filter(g => g.name === gameName)[0];
document.querySelector('.featured').addEventListener('click', () => {
document.body.style.opacity = '0.7';
umami.track('featured-game_' + game.name);
setTimeout(() => {
if (isValidURL(game.target)) createViewPage({
target: game.target,
@@ -151,7 +159,7 @@ if (location.pathname === '/') {
}, 1000);
});
document.querySelector('.featured').src = '/assets/img/wide/stickman-archero-fight.png';
document.querySelector('.featured').src = '/assets/img/wide/99balls.jpg';
}).catch(e => new PolarisError('Failed to load featured game.'));
const logHeight = () => {
@@ -178,7 +186,7 @@ if (location.pathname === '/') {
const getAvalibleHeight = () => {
var total = 0;
document.querySelectorAll('.container.right>*:not(#changelog)').forEach(el => total += Number((el.currentStyle || window.getComputedStyle(el)).marginTop.r1lace('px', '')) + Number((el.currentStyle || window.getComputedStyle(el)).marginTop.replace('px', '')) + el.clientHeight);
document.querySelectorAll('.container.right>*:not(#changelog)').forEach(el => total += Number((el.currentStyle || window.getComputedStyle(el)).marginTop.replace('px', '')) + Number((el.currentStyle || window.getComputedStyle(el)).marginTop.replace('px', '')) + el.clientHeight);
return (document.querySelector('.container.right').clientHeight - getVH(2)) - total;
}
@@ -201,9 +209,10 @@ if (location.pathname === '/') {
description.textContent = change.simpleDescription;
description.classList = 'small';
log.appendChild(description);
});
const resizeChangelog = (amount = 3) => {
const updateChangelog = (amount = 3) => {
amount = amount - 1;
for (let i = 0; i < document.querySelector('#changelog').children.length; i++) {
@@ -212,8 +221,8 @@ if (location.pathname === '/') {
}
}
resizeChangelog(Math.floor(getAvalibleHeight() / logHeight()));
window.addEventListener('resize', () => resizeChangelog(Math.floor(getAvalibleHeight() / logHeight())));
updateChangelog(Math.floor(getAvalibleHeight() / logHeight()));
window.addEventListener('resize', () => updateChangelog(Math.floor(getAvalibleHeight() / logHeight())));
});
}
@@ -222,13 +231,9 @@ if (window.self === window.top && location.pathname !== '/view') {
else document.querySelector('.navbar').classList.remove('scrolling');
}
if (window.self === window.top && location.pathname !== '/view') window.addEventListener('scroll', () => {
if (window.self === window.top && location.pathname !== '/view') window.onscroll = () => {
if (window.scrollY !== 0) document.querySelector('.navbar').classList.add('scrolling');
else document.querySelector('.navbar').classList.remove('scrolling');
});
}
if (window.self !== window.top && document.querySelector('.navbar')) document.querySelector('.navbar').remove();
if (location.pathname === '/share' && new URLSearchParams(location.search).has('game')) {
Games.loadGameFromURL();
}
if (window.self !== window.top && document.querySelector('.navbar')) document.querySelector('.navbar').remove();
+1 -1
View File
@@ -1,6 +1,6 @@
import { createViewPage, isValidURL } from './utils.js';
const load = async () => {
const load = () => {
const form = document.querySelector('#wpf');
const query = document.querySelector('#query');
+6 -5
View File
@@ -1,4 +1,4 @@
import Dexie from 'https://esm.sh/dexie@latest/dist/modern/dexie.mjs';
import Dexie from 'https://unpkg.com/dexie@latest/dist/modern/dexie.mjs';
import { isScrollable, storage, indexedDBExporter, cookie, EventEmitter, PolarisError } from './utils.js';
import Theme from './themes.js';
@@ -278,12 +278,12 @@ const loadSidebarInterface = () => {
document.querySelector('#panic_url').addEventListener('input', (e) => settingsStorage.set('panic_url', document.querySelector('#panic_url').value));
window.addEventListener('keydown', (e) => {
window.onkeydown = (e) => {
if (document.querySelector('#panic_key') == document.activeElement) {
document.querySelector('#panic_key').value = e.key;
settingsStorage.set('panic_key', document.querySelector('#panic_key').value);
}
});
}
document.querySelector('#themes').querySelectorAll('button').forEach(el => el.onclick = () => Theme.set(el.innerText.toLocaleLowerCase()));
@@ -349,11 +349,12 @@ const loadSettings = () => {
});
}
window.addEventListener('keydown', (e) => {
window.onkeydown = (e) => {
if (e.key === settingsStorage.get('panic_key')) {
if (settingsStorage.get('panic_url')) window.location.href = settingsStorage.get('panic_url');
else new PolarisError('A panic key was used but no url was found.');
}
});
}
/*if (new URLSearchParams(location.search).get('clickoff')) {
View File
+24 -54
View File
@@ -8,7 +8,7 @@ import ctc from './utils/ctc.js';
* The storage interface for polaris
* @param {string} containerName
*/
export const storage = (containerName) => {
const storage = (containerName) => {
return {
/**
* Get a value from the storage container
@@ -54,47 +54,21 @@ export const storage = (containerName) => {
/**
* @returns {string}
*/
export const uuid = () => ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));
const uuid = () => ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));
/**
* Register a proxy service worker
* @param {'uv' | 'dynamic'} proxy
*/
export const loadProxyWorker = async (proxy) => await navigator.serviceWorker.register(`/${proxy.split(':')[0]}/sw.js`, {
scope: `/${proxy.split(':')[0]}/service/`
const loadProxyWorker = async (proxy) => await navigator.serviceWorker.register(`/${proxy}/sw.js`, {
scope: `/${proxy}/service/`
});
/**
* Set the bare transport
* @param {'epoxy' | 'libcurl' | 'bare'} name
* @param {any} options
*/
export const setTransport = async (name, options) => {
const transports = {
'epoxy': {
src: '/epoxy/index.js',
id: 'EpxMod.EpoxyClient',
options: {
wisp: location.origin.replace('http', 'ws') + '/wisp/'
}
}
};
if (!Object.keys(transports).includes(name)) throw 'Invalid Transport';
const transport = transports[name];
await loadCJS(transport.src);
await loadCJS('/baremux/bare.cjs');
BareMux.SetTransport(transport.id, options || transport.options);
}
/**
Broken
* Get the current encoding method
* @param {'uv'} proxy
* @param {'uv' | 'dynamic'} proxy
* @returns {Promise.<string>}
const getEncodingMethod = (proxy) => {
return new Promise(async (resolve, reject) => {
@@ -128,7 +102,7 @@ const loadPageScript = () => {
}
};
export const encoder = {
const encoder = {
b64: {
encode: (data) => btoa(data),
decode: (data) => atob(data)
@@ -144,7 +118,7 @@ export const encoder = {
* @param {string} target
* @param {{ trusted: boolean }} options
*/
export const redirect = (target, options) => location.href = `/view?load=${btoa(JSON.stringify({
const redirect = (target, options) => location.href = `/view?load=${btoa(JSON.stringify({
target,
redirect: true,
trusted: options.trusted
@@ -154,12 +128,11 @@ export const redirect = (target, options) => location.href = `/view?load=${btoa(
* Load a url into the view page
* @param {{ target: string, title: string, return: string, proxied: boolean }} options
*/
export const createViewPage = (options) => location.href = `/view?load=${btoa(JSON.stringify({
const createViewPage = (options) => location.href = `/view?load=${btoa(JSON.stringify({
return: options.return || location.href,
proxied: options.proxied,
target: options.target,
title: options.title,
image: options.image
title: options.title
}))}`;
/**
@@ -167,28 +140,15 @@ export const createViewPage = (options) => location.href = `/view?load=${btoa(JS
* @param {string} url
* @returns {boolean}
*/
export const isValidURL = (url) => /^(http(s)?:\/\/)?([\w-]+\.)+[\w]{2,}(\/.*)?$/.test(url);
const isValidURL = (url) => /^(http(s)?:\/\/)?([\w-]+\.)+[\w]{2,}(\/.*)?$/.test(url);
/**
* Get the css vh value
* @param {*} value
* @returns {number}
*/
export const getVH = (value) => (value * Math.max(document.documentElement.clientHeight, window.innerHeight || 0)) / 100;
export const getVW = (value) => (value * Math.max(document.documentElement.clientWidth, window.innerWidth || 0)) / 100;
export const isScrollable = (element) => element.scrollWidth > element.clientWidth || element.scrollHeight > element.clientHeight;
/**
* @param {() => {}} code
* @returns {string}
*/
export const evalify = (code) => '(' + String(code) + ')()';
export const loadCJS = (src) => new Promise((resolve, reject) => {
const el = document.createElement('script');
el.src = src;
document.body.appendChild(el);
el.onload = () => resolve();
});
const getVH = (value) => (value * Math.max(document.documentElement.clientHeight, window.innerHeight || 0)) / 100;
const getVW = (value) => (value * Math.max(document.documentElement.clientWidth, window.innerWidth || 0)) / 100;
const isScrollable = (element) => element.scrollWidth > element.clientWidth || element.scrollHeight > element.clientHeight;
/**
* @type {import('./utils/ctc.js').CrossTabCommunication}
@@ -197,7 +157,7 @@ var CrossTabCommunication;
try {
CrossTabCommunication = ctc;
} catch { CrossTabCommunication = () => { }; }
} catch { CrossTabCommunication = () => {}; }
export default {
storage,
@@ -218,9 +178,19 @@ export default {
};
export {
storage,
loadProxyWorker,
encoder,
redirect,
createViewPage,
isValidURL,
getVH,
getVW,
isScrollable,
indexedDBExporter,
EventEmitter,
cookie,
uuid,
CrossTabCommunication,
PolarisError
};
+5 -9
View File
@@ -1,15 +1,11 @@
import { loadProxyWorker, encoder, storage, loadCJS, setTransport } from './utils.js';
import { loadProxyWorker, encoder, storage } from './utils.js';
import { loadSettings } from './settings.js';
await loadCJS('/baremux/bare.cjs');
loadSettings();
const params = new URLSearchParams(location.search);
const settingsStorage = storage('settings');
if ((settingsStorage.get('proxy') || 'uv').startsWith('uv')) await setTransport((settingsStorage.get('proxy') || '').split(':')[1] || 'libcurl');
window.history.replaceState({}, '', location.pathname);
if (params.get('load')) {
@@ -22,9 +18,9 @@ if (params.get('load')) {
sessionStorage.setItem('loaddata', JSON.stringify(parsedData));
if (parsedData.proxied) {
await loadProxyWorker((settingsStorage.get('proxy') || '').split(':')[0] || 'uv');
await loadProxyWorker(settingsStorage.get('proxy') || 'uv');
document.querySelector('#loadframe').src = `/${(settingsStorage.get('proxy') || '').split(':')[0] || 'uv'}/service/${encoder['xor'].encode(parsedData.target)}`;
document.querySelector('#loadframe').src = `/${settingsStorage.get('proxy') || 'uv'}/service/${encoder['xor'].encode(parsedData.target)}`;
} else document.querySelector('#loadframe').src = parsedData.target;
document.querySelector('#loadframe').addEventListener('load', () => {
@@ -32,7 +28,7 @@ if (params.get('load')) {
document.querySelector('#loadframe').style.transition = 'none';
document.querySelector('#loadframe').style.background = '#fff';
document.querySelector('#loadframe').addEventListener('mouseover', () => {
document.querySelector('.gamebar').classList.add('collapsed');
document.querySelector('.hitbox').classList.remove('active');
@@ -65,7 +61,7 @@ if (params.get('load')) {
document.querySelector('#return').addEventListener('click', () => {
document.body.style.opacity = '0.7';
setTimeout(() => window.location.href = parsedData.return, 500);
});
} else if (parsedData.target && parsedData.redirect === true) {
+1 -4
View File
@@ -21,15 +21,12 @@
<div id="changelog"></div>
<br><br>
<hr>
<br><br><hr>
<p>
Running Polaris <span id="changelog_version">unknown</span>
<br>
<br>
<small>
Commit: <span id="changelog_version_sha">unknown</span>
<br>
+22 -22
View File
@@ -22,35 +22,35 @@
<div class="cheats"></div>
</div>
<br><br>
<br>
<br>
<div id="largebillboard1"></div>
<script>
window['nitroAds'].createAd('largebillboard1', {
"refreshTime": 30,
"renderVisibleOnly": true,
"sizes": [
[
"970",
"250"
]
],
"report": {
"enabled": true,
"icon": true,
"wording": "Report Ad",
"position": "top-right"
}
});
</script>
<script>
window['nitroAds'].createAd('largebillboard1', {
"refreshTime": 30,
"renderVisibleOnly": true,
"sizes": [
[
"970",
"250"
]
],
"report": {
"enabled": true,
"icon": true,
"wording": "Report Ad",
"position": "top-right"
}
});
</script>
<!--el:discord_widget-->
<script src="/assets/js/main.js" type="module"></script>
<!--el:{{mode === 'dev'}}:development-->
</body>
</html>
</html>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+45
View File
@@ -0,0 +1,45 @@
const xor = {
encode: (str, key = 2) => {
if (!str) return str;
return encodeURIComponent(str.split('').map((e, i) => i % key ? String.fromCharCode(e.charCodeAt(0) ^ key) : e).join(''));
},
decode: (str, key = 2) => {
if (!str) return str;
return decodeURIComponent(str).split('').map((e, i) => i % key ? String.fromCharCode(e.charCodeAt(0) ^ key) : e).join('');
}
}
const plain = {
encode: (str) => {
if (!str) return str;
return encodeURIComponent(str);
},
decode: (str) => {
if (!str) return str;
return decodeURIComponent(str);
}
}
const none = {
encode: (str) => str,
decode: (str) => str,
}
const base64 = {
encode: (str) => {
if (!str) return str;
return decodeURIComponent(btoa(str));
},
decode: (str) => {
if (!str) return str;
return atob(str);
}
}
export { xor, plain, none, base64 };
+28
View File
@@ -0,0 +1,28 @@
self.__dynamic$config = {
prefix: '/dynamic/service/',
encoding: 'xor',
mode: 'production',
logLevel: 0,
bare: {
version: 2,
path: '/bare/'
},
tab: {
title: 'Service',
icon: null,
ua: null
},
assets: {
prefix: '/dynamic/',
files: {
handler: 'dynamic.handler.js',
client: 'dynamic.client.js',
worker: 'dynamic.worker.js',
config: 'dynamic.config.js',
inject: null
}
},
block: [
]
};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+9
View File
@@ -0,0 +1,9 @@
importScripts('/dynamic/dynamic.config.js');
importScripts('/dynamic/dynamic.worker.js');
const sw = new Dynamic();
self.addEventListener('fetch', async (event) => {
/*if (await sw.route(event)) */event.respondWith(sw.fetch(event));
//else event.respondWith(fetch(event.request));
});
+22 -16
View File
@@ -14,31 +14,36 @@
<body>
<!--el:navbar-->
<!--el:sidebar-->
<script>
window['nitroAds'].createAd('outstreamplayer1', {
"refreshTime": 30,
"format": "floating",
"report": {
"enabled": true,
"icon": true,
"wording": "Report Ad",
"position": "top-left"
}
});
</script>
<div class="content centered">
<h1 style="font-size: 6vh;">Games</h1>
<h1 style="font-size: 4vh;" class="gamesectionheader">Popular</h1>
<div class="popular-games">
</div>
<h1 style="font-size: 4vh;" class="gamesectionheader">All Games</h1>
<div class="search">
<input type="text" id="searchInput" placeholder="Search Games">
<button id="randomGame" title="Play a random game">
<i class="fa-solid fa-dice"></i>
</button>
<select id="searchSort" title="Sort the games">
<option value="none" selected>Don't Sort</option>
<option value="newest">Newest</option>
<option value="abc">Alphabetical</option>
</select>
</div>
<input type="text" id="searchInput" placeholder="Search Games">
<br>
<!--<script type='text/javascript' src='//outrightsham.com/44/75/cd/4475cd08e506eb8c6ed41e04b8c16197.js'></script>-->
<!--el:ad_horizontal-->
<br>
<br>
<div class="games">
</div>
@@ -47,6 +52,7 @@
<br>
<p>Oops, we couldn't find the game you were looking for.</p>
</div>
<!--el:discord_widget-->
<script src="/assets/js/main.js" type="module"></script>
+1
View File
@@ -3,6 +3,7 @@
<head>
<!--el:meta-->
<!--el:adtop-->
<!--el:analytics-->
<link rel="stylesheet" href="/assets/css/main.css">
-39
View File
@@ -1,39 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<!--el:meta-->
<!--el:adtop-->
<!--el:analytics-->
<link rel="stylesheet" href="/assets/css/main.css">
<title>Premium | Polaris</title>
</head>
<body>
<!--el:navbar-->
<!--el:sidebar-->
<br>
<div class="content">
<div class="container centered">
<h1 style="font-size: 6vh; margin: 0;" class="gamesectionheader">Premium</h1>
<h1 style="font-size: 2vh; margin: 0;" class="gamesectionheader">Coming Soon...</h1>
<br>
<p>With a premium membership you will get access to</p>
<ul style="text-align: left;">
<li>High speed exclusive servers</li>
<li>Insider information on future updates</li>
<li>Early access to new links</li>
<li>And much more to come</li>
</ul>
</div>
</div>
<!--el:discord_widget-->
<script src="/assets/js/main.js" type="module"></script>
<!--el:{{mode === 'dev'}}:development-->
</body>
</html>
+2 -13
View File
@@ -19,29 +19,18 @@
<div class="container centered">
<h1 class="title">Proxy</h1>
<p class="proxyDescription">Search the web without restrictions</p>
<text class="proxyDescription">Access the World Wide Web with no restrictions</text>
<form id="wpf">
<input class="proxyinput" type="text" id="query" placeholder="URL or Search Query" />
</form>
<br>
<br>
<div class="centered">
<button onclick="joinDiscord()">Join Our Discord (more links)</button>
</div>
</div>
<br>
<!--el:discord_widget-->
<script src="/assets/js/main.js" type="module"></script>
<script>
function joinDiscord() {
var url = "https://discord.gg/skool-community-950407933408198717";
var input = document.getElementById('query');
input.value = url;
}
</script>
<!--el:{{mode === 'dev'}}:development-->
</body>
-54
View File
@@ -1,54 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<!--el:meta-->
<!--el:adtop-->
<!--el:analytics-->
<link rel="stylesheet" href="/assets/css/main.css">
<title>Loading... | Polaris</title>
</head>
<body>
<div class="container centered">
<h1 style="font-size: 50px;">Loading</h1>
<p>
Loading game...
</p>
</div>
<script type="module">
import { createViewPage, isValidURL } from '/assets/js/utils.js';
fetch('/api/games')
.then(res => res.json())
.then(games => {
const searchParams = new URLSearchParams(location.search);
const game = games.all.filter(g => g.name.toLowerCase() === searchParams.get('name'))[0].toLowerCase() || games.all[searchParams.get('id')];
if (game) {
if (isValidURL(game.target)) createViewPage({
target: game.target,
title: game.name,
return: '/games',
proxied: true,
type: 'game'
});
else createViewPage({
target: game.target,
title: game.name,
return: '/games',
image: game.image,
type: 'game'
});
} else location.replace('/');
});
</script>
<!--el:{{mode === 'dev'}}:development-->
</body>
</html>
+3 -16
View File
@@ -1,20 +1,7 @@
// UV Transports
importScripts('/epoxy/index.js');
importScripts('/uv/uv.bundle.js');
importScripts('/uv/uv.config.js');
importScripts(__uv$config.sw || '/uv/uv.sw.js');
importScripts('/uv/uv.sw.js');
const uv = new UVServiceWorker();
const sw = new UVServiceWorker();
async function handleRequest(event) {
if (uv.route(event)) {
return await uv.fetch(event);
}
return await fetch(event.request)
}
self.addEventListener('fetch', (event) => {
event.respondWith(handleRequest(event));
});
self.addEventListener('fetch', (event) => event.respondWith(sw.fetch(event)));
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+3 -84
View File
@@ -1,92 +1,11 @@
self.__uv$config = {
prefix: '/uv/service/',
bare: '/bare/',
encodeUrl: Ultraviolet.codec.xor.encode,
decodeUrl: Ultraviolet.codec.xor.decode,
handler: '/uv/uv.handler.js',
client: '/uv/uv.client.js',
bundle: '/uv/uv.bundle.js',
config: '/uv/uv.config.js',
sw: '/uv/uv.sw.js'
};
/**
* The storage interface for polaris
* @param {string} containerName
*
const storage = (containerName) => {
return {
/**
* Get a value from the storage container
* @param {string} name The name of the value
* @returns {string}
*
get: (name) => {
if (!localStorage.getItem(containerName)) localStorage.setItem(containerName, JSON.stringify({}));
else {
try {
JSON.parse(localStorage.getItem(containerName));
} catch (e) {
localStorage.setItem(containerName, JSON.stringify({}));
}
}
const container = JSON.parse(localStorage.getItem(containerName));
return container[name];
},
/**
* Set a value from a storage container
* @param {string} name The name of the value
* @param {string | object} value The value to be set
*
set: (name, value) => {
if (!localStorage.getItem(containerName)) localStorage.setItem(containerName, JSON.stringify({}));
else {
try {
JSON.parse(localStorage.getItem(containerName));
} catch (e) {
localStorage.setItem(containerName, JSON.stringify({}));
}
}
const container = JSON.parse(localStorage.getItem(containerName));
container[name] = value;
localStorage.setItem(containerName, JSON.stringify(container));
}
};
};
const setTransport = (name, options) => {
const transports = {
'epoxy': {
src: '/epoxy/index.js',
id: 'EpxMod.EpoxyClient',
options: {
wisp: location.origin.replace('http', 'ws') + '/wisp/'
}
},
'libcurl': {
src: '/libcurl/index.cjs',
id: 'CurlMod.LibcurlClient',
options: {
wisp: location.origin.replace('http', 'ws') + '/wisp/',
wasm: location.origin + '/libcurl/libcurl.wasm'
}
},
'bare': {
src: '/assets/js/bare-transport.js',
id: 'BareMod.BareClient',
options: location.origin + '/bare/'
}
};
if (!Object.keys(transports).includes(name)) throw 'Invalid Transport';
const transport = transports[name];
BareMux.SetTransport(transport.id, options || transport.options);
}
const settingsStorage = storage('settings');
setTransport((settingsStorage.get('proxy') || '').split(':')[1] || 'libcurl');*/
sw: '/uv/uv.sw.js',
};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+4 -7
View File
@@ -3,6 +3,7 @@
<head>
<!--el:meta-->
<!--el:adtop-->
<!--el:analytics-->
<link rel="stylesheet" href="/assets/css/main.css">
@@ -10,13 +11,8 @@
<title>View | Polaris</title>
</head>
<body class="hidden">
<script>
window.onload = function() {
alert("IF YOU GET AN ERROR SUCH AS 'there are no bare clients' RELOAD THE PAGE!");
};
</script>
<body class="hidden">
<iframe frameborder="0" id="loadframe"></iframe>
<div class="gamebar">
@@ -25,9 +21,10 @@
</a>
<h1 class="title">Loading...</h1>
<div class="right">
<span class="item" id="return">
<i class="fa-solid fa-angle-left"></i>
<i class="fa-solid fa-chevron-left"></i>
</span>
<span class="item" id="fullscreen">
+16 -44
View File
@@ -1,48 +1,20 @@
<div id="bannerad728"></div>
<script src="//outrightsham.com/cf0bb7d0401f5ae5534ac09c2e959d20/invoke.js" type="text/html"></script>
<script type="module">
import { createBareClient } from 'https://esm.sh/@tomphttp/bare-client@latest/dist/index.js';
import { evalify } from '/assets/js/utils.js';
const client = await createBareClient(location.origin + '/bare/');
window.atOptions = {
'key': 'cf0bb7d0401f5ae5534ac09c2e959d20',
'format': 'iframe',
'height': 90,
'width': 728,
'params': {}
};
eval(evalify(() => {
const window = {
...self,
location: {
...self.location,
replace: () => {
throw new Error('Failed to redirect')
}
}
};
const location = {
...self.location,
replace: () => {
throw new Error('Failed to redirect')
}
};
{{ ad_src }}
}).replace('{{ ad_src }}', await (await client.fetch('//outrightsham.com/cf0bb7d0401f5ae5534ac09c2e959d20/invoke.js', {
headers: {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br, zstd',
'Accept-Language': 'en-US,en;q=0.9',
'Connection': 'keep-alive',
'Host': 'outrightsham.com',
'Origin': location.origin,
'Referer': document.referrer,
'User-Agent': window.navigator.userAgent
<script>
window['nitroAds'].createAd('bannerad728', {
"refreshTime": 30,
"renderVisibleOnly": false,
"sizes": [
[
"728",
"90"
]
],
"report": {
"enabled": true,
"icon": true,
"wording": "Report Ad",
"position": "top-right"
}
})).text()));
});
</script>
+2 -2
View File
@@ -1,2 +1,2 @@
<script data-cfasync="false">window.nitroAds = window.nitroAds || { createAd: function () { return new Promise(e => { window.nitroAds.queue.push(["createAd", arguments, e]) }) }, addUserToken: function () { window.nitroAds.queue.push(["addUserToken", arguments]) }, queue: [] };</script>
<script data-cfasync="false" async src="https://s.nitropay.com/ads-1751.js"></script>
<script data-cfasync="false">window.nitroAds=window.nitroAds||{createAd:function(){return new Promise(e=>{window.nitroAds.queue.push(["createAd",arguments,e])})},addUserToken:function(){window.nitroAds.queue.push(["addUserToken",arguments])},queue:[]};</script>
<script data-cfasync="false" async src="https://s.nitropay.com/ads-1751.js"></script>
+2
View File
@@ -1,8 +1,10 @@
<script src="https://polaris4.statuspage.io/embed/script.js"></script>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-KZRKZE212Q"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-KZRKZE212Q');
</script>
+14 -32
View File
@@ -1,35 +1,17 @@
<div class="navbar">
<a class="title" href="/">
<img src="/assets/img/logo.png" />
<a class="title" href="/">
<img src="/assets/img/logo.png" />
<span
>Polaris
<span>By Skool</span>
</span>
</a>
<span>Polaris
<span>By Skool</span>
</span>
</a>
<div class="right">
<a href="/premium" class="premium" style="border-color: rgb(0, 60, 255);"
><i class="fa-solid fa-star"></i>Premium</a
>
<a href="/games" class="navButton"
><i class="fa-solid fa-gamepad-modern fa-xs"></i>Games</a
>
<a href="/apps" class="navButton"
><i class="fa-solid fa-rocket-launch fa-xs"></i>Apps</a
>
<a href="/search" class="navButton"
><i class="fa-solid fa-magnifying-glass fa-xs"></i>Proxy</a
>
<a href="/cheats" class="navButton"
><i class="fa-solid fa-computer fa-xs"></i>Cheats</a
>
<a
href="#settings"
class="navButton"
data-action="no_redirect"
data-attr="sidebar_trigger"
><i class="fa-solid fa-gear fa-sm"></i>Settings</a
>
</div>
</div>
<div class="right">
<a href="/games"><i class="fa-solid fa-gamepad-modern fa-xs"></i>Games</a>
<a href="/apps"><i class="fa-solid fa-rocket-launch fa-xs"></i>Apps</a>
<a href="/search"><i class="fa-solid fa-magnifying-glass fa-xs"></i>Proxy</a>
<a href="/cheats"><i class="fa-solid fa-computer fa-xs"></i>Cheats</a>
<a href="#settings" data-action="no_redirect" data-attr="sidebar_trigger"><i class="fa-solid fa-gear fa-sm"></i>Settings</a>
</div>
</div>
+4 -5
View File
@@ -7,7 +7,8 @@
<h3>Panic Key</h3>
<input class="settings-input" type="text" name="Panic Key" id="panic_key" value="Click and press any key" readonly />
<input class="settings-input" type="text" name="Panic Key" id="panic_key" value="Click and press any key"
readonly />
<button class="settings-button" id="reset_panic">Reset</button>
<br>
@@ -29,8 +30,6 @@
<button class="settings-button">Inferno</button>
<button class="settings-button">Indigo</button>
<button class="settings-button">Violet</button>
<button class="settings-button">Cyan</button>
<button class="settings-button">Bronze</button>
</div>
<h3>Tab Cloak</h3>
@@ -51,8 +50,8 @@
<h3>Proxy</h3>
<select id="proxy_select">
<option value="uv:bare">Ultraviolet</option>
<option value="uv:epoxy" selected>Ultraviolet (Epoxy)</option>
<option value="uv">Ultraviolet</option>
<option value="dynamic" disabled>Dynamic</option>
</select>
<h3>Prevent close</h3>