Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e2df9d9bda | |||
| 99bc618e3e | |||
| ece1502813 |
@@ -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>
|
||||
|
||||

|
||||

|
||||
|
||||
<br>
|
||||
<h2>Quick Web Deployment</h2>
|
||||
|
||||
[](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!
|
||||
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
name: Polaris
|
||||
|
||||
services:
|
||||
polaris:
|
||||
build: .
|
||||
ports:
|
||||
- "8080:8080"
|
||||
+23
@@ -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
@@ -8,7 +8,8 @@ var config = {
|
||||
},
|
||||
minify: false,
|
||||
assetScrambling: false,
|
||||
allowDangerousTemplateInsert: true
|
||||
allowDangerousTemplateInsert: true,
|
||||
filtering: true
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Generated
+407
-1300
File diff suppressed because it is too large
Load Diff
+9
-11
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
};
|
||||
@@ -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
@@ -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,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"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
]
|
||||
]
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
[
|
||||
{
|
||||
"quote": "The <span class='blue'>first</span> quote??!"
|
||||
}
|
||||
]
|
||||
+15
-107
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 |
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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
@@ -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,6 +1,6 @@
|
||||
import { createViewPage, isValidURL } from './utils.js';
|
||||
|
||||
const load = async () => {
|
||||
const load = () => {
|
||||
const form = document.querySelector('#wpf');
|
||||
const query = document.querySelector('#query');
|
||||
|
||||
|
||||
@@ -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')) {
|
||||
|
||||
|
||||
+24
-54
@@ -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
|
||||
};
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
@@ -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
@@ -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 };
|
||||
@@ -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
@@ -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
@@ -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>
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
<head>
|
||||
<!--el:meta-->
|
||||
<!--el:adtop-->
|
||||
<!--el:analytics-->
|
||||
|
||||
<link rel="stylesheet" href="/assets/css/main.css">
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user