ŠACHY COMEBACK!!
This commit is contained in:
parent
41f3b94ed3
commit
43c7e1f5b1
@ -10,5 +10,6 @@
|
|||||||
"DBUser": "povinné, string - uživatelské jméno pro připojení do databáze",
|
"DBUser": "povinné, string - uživatelské jméno pro připojení do databáze",
|
||||||
"DBPwd": "povinné, string - heslo pro připojení do databáze",
|
"DBPwd": "povinné, string - heslo pro připojení do databáze",
|
||||||
"noGeneralSync": "nepovinné, boolean - nezálohovat generál dobytčárny do databáze",
|
"noGeneralSync": "nepovinné, boolean - nezálohovat generál dobytčárny do databáze",
|
||||||
"ignoreUnknownKeys": "nepovinné, boolean - vypne hlášení neznámých klíčů v config.json"
|
"ignoreUnknownKeys": "nepovinné, boolean - vypne hlášení neznámých klíčů v config.json",
|
||||||
|
"sachyDomena": "nepovinné, string - doména pro funkci sachy (základní hodnota je 'šach.ml')"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Chyba - šach.ml</title>
|
<title>Chyba - $domena</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@ -5,28 +5,15 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Šach.ml</title>
|
<title>$domena</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<h1>Šach.ml</h1>
|
<h1>$domena</h1>
|
||||||
|
|
||||||
<p>Vytajte na úvodní stránce DENIM3001 šachů!</p>
|
<p>Vytajte na úvodní stránce DENIM3001 šachů!</p>
|
||||||
|
|
||||||
<p id="sem"></p>
|
<p>$pecko</p>
|
||||||
|
|
||||||
<script>
|
|
||||||
// Jo, použivám JS na render :fujjjj:
|
|
||||||
// Prasárna, jsem si vědom, ale je to nejjednoduší :ksd:
|
|
||||||
|
|
||||||
const pecko = document.querySelector("#sem");
|
|
||||||
|
|
||||||
if ($logged) {
|
|
||||||
pecko.innerHTML = "Jsi přihlášen jako $jmeno. Pro odhlášení pokračuj <a href='logout'>sem</a>.";
|
|
||||||
} else {
|
|
||||||
pecko.innerHTML = "Pro přihlášení pokračujte <a href='login'>sem</a>.";
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Proměna</title>
|
<title>Proměna - $domena</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Šach.ml - $title</title>
|
<title>$title - $domena</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@ -1,18 +1,19 @@
|
|||||||
// Jo, šachec, :sjetec:
|
// Jo, šachec, :sjetec:
|
||||||
|
|
||||||
import { APIEmbed, Message } from "discord.js";
|
import { APIEmbed, Message } from "discord.js";
|
||||||
import { Modul, SRecord } from "../utils/types";
|
import { Modul } from "../utils/types";
|
||||||
import { fokinLookupTable, klikance, pocetKeStrane } from "../utils/sachyEtc";
|
import { fokinLookupTable, klikance, pocetKeStrane } from "../utils/sachyEtc";
|
||||||
import { emiter } from "../utils/sachyServer";
|
import { emiter, sachyDomena } from "../utils/sachyServer";
|
||||||
|
|
||||||
const hry: SRecord<Hra> = {};
|
const hry = new Map<number, Hra>(); // gameID -> Hra
|
||||||
const hraci: SRecord<string> = {};
|
const hraci = new Map<string, number>(); // hrac -> gameID
|
||||||
|
let nextGameID = 0;
|
||||||
|
|
||||||
const smery = [-8, 1, 8, -1, -7, 9, 7, -9];
|
const smery = [-8, 1, 8, -1, -7, 9, 7, -9];
|
||||||
|
|
||||||
const mkPis = (barva: Figurka["barva"], typ: Figurka["typ"]) => ({ barva, typ, netahnuta: true, enPassantovatelna: false });
|
const mkPis = (barva: Figurka["barva"], typ: Figurka["typ"]) => ({ barva, typ, netahnuta: true, enPassantovatelna: false });
|
||||||
|
|
||||||
function createGame(kanel: string, bilej: string, cernej: string, mes: Message) {
|
function createGame(gameID: number, bilej: string, cernej: string, mes: Message) {
|
||||||
|
|
||||||
const deska: Deska = [...new Array(64)];
|
const deska: Deska = [...new Array(64)];
|
||||||
|
|
||||||
@ -43,6 +44,7 @@ function createGame(kanel: string, bilej: string, cernej: string, mes: Message)
|
|||||||
deska[59] = mkPis("bila", "queen");
|
deska[59] = mkPis("bila", "queen");
|
||||||
|
|
||||||
const hra: Hra = {
|
const hra: Hra = {
|
||||||
|
id: gameID,
|
||||||
bila: bilej,
|
bila: bilej,
|
||||||
cerna: cernej,
|
cerna: cernej,
|
||||||
deska,
|
deska,
|
||||||
@ -51,7 +53,7 @@ function createGame(kanel: string, bilej: string, cernej: string, mes: Message)
|
|||||||
message: mes
|
message: mes
|
||||||
};
|
};
|
||||||
|
|
||||||
hry[kanel] = hra;
|
hry.set(gameID, hra);
|
||||||
|
|
||||||
return hra;
|
return hra;
|
||||||
}
|
}
|
||||||
@ -330,7 +332,7 @@ function renderHra(hra: Hra, konec?: true) {
|
|||||||
if (!figurka) {
|
if (!figurka) {
|
||||||
|
|
||||||
field.value += hra.tahy.includes(i)
|
field.value += hra.tahy.includes(i)
|
||||||
? (cernyPozadi ? `[<:h:1066376051422404628>](http://šach.ml/${klikanec})` : `[<:h:1066376343807336488>](http://šach.ml/${klikanec})`)
|
? (cernyPozadi ? `[<:h:1066376051422404628>](http://${sachyDomena}/${klikanec})` : `[<:h:1066376343807336488>](http://${sachyDomena}/${klikanec})`)
|
||||||
: (cernyPozadi ? "🟩" : "⬜");
|
: (cernyPozadi ? "🟩" : "⬜");
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -342,7 +344,7 @@ function renderHra(hra: Hra, konec?: true) {
|
|||||||
const figurkaStr = `<:h:${emout}>`;
|
const figurkaStr = `<:h:${emout}>`;
|
||||||
|
|
||||||
if (!konec && figurka.barva == hra.hraje || hra.tahy.includes(i)) {
|
if (!konec && figurka.barva == hra.hraje || hra.tahy.includes(i)) {
|
||||||
field.value += `[${figurkaStr}](http://šach.ml/${klikanec})`;
|
field.value += `[${figurkaStr}](http://${sachyDomena}/${klikanec})`;
|
||||||
} else {
|
} else {
|
||||||
field.value += figurkaStr;
|
field.value += figurkaStr;
|
||||||
}
|
}
|
||||||
@ -360,9 +362,11 @@ function renderHra(hra: Hra, konec?: true) {
|
|||||||
function konec(mes: Message, hra: Hra, duvod: string) {
|
function konec(mes: Message, hra: Hra, duvod: string) {
|
||||||
mes.edit({ content: `hra zkoncila ${duvod}`, embeds: [renderHra(hra, true)] });
|
mes.edit({ content: `hra zkoncila ${duvod}`, embeds: [renderHra(hra, true)] });
|
||||||
|
|
||||||
delete hraci[hra.bila];
|
const gameID = hra.id;
|
||||||
delete hraci[hra.cerna];
|
|
||||||
delete hry[mes.channelId];
|
hraci.delete(hra.bila);
|
||||||
|
hraci.delete(hra.cerna);
|
||||||
|
hry.delete(gameID);
|
||||||
}
|
}
|
||||||
|
|
||||||
function prekreslitHru(hra: Hra) {
|
function prekreslitHru(hra: Hra) {
|
||||||
@ -398,10 +402,10 @@ function prekreslitHru(hra: Hra) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
emiter.on("tah", (hrac, policko, respond, promo) => {
|
emiter.on("tah", (hrac, policko, respond, promo) => {
|
||||||
const channelId = hraci[hrac];
|
const gameID = hraci.get(hrac);
|
||||||
if (!channelId) return respond("Však vůbec nehraješ ty magore");
|
if (!gameID) return respond("Však vůbec nehraješ ty magore");
|
||||||
|
|
||||||
const hra = hry[channelId];
|
const hra = hry.get(gameID)!;
|
||||||
const barva = hra.bila == hrac ? "bila" : "cerna";
|
const barva = hra.bila == hrac ? "bila" : "cerna";
|
||||||
if (hra.hraje != barva) return respond("Teď nehraješ ty ty magore");
|
if (hra.hraje != barva) return respond("Teď nehraješ ty ty magore");
|
||||||
|
|
||||||
@ -467,20 +471,18 @@ const exp: Modul = {
|
|||||||
DMUnsafe: true,
|
DMUnsafe: true,
|
||||||
run: async mes => {
|
run: async mes => {
|
||||||
|
|
||||||
if (hry[mes.channelId]) return "nejze tady se us hraej";
|
|
||||||
|
|
||||||
const druhej = mes.mentions.members?.first()?.id;
|
const druhej = mes.mentions.members?.first()?.id;
|
||||||
if (!druhej) return "no sam asi hrat nebudez vet";
|
if (!druhej) return "no sam asi hrat nebudez vet";
|
||||||
|
|
||||||
for (const player of [mes.author.id, druhej]) {
|
for (const player of [mes.author.id, druhej]) {
|
||||||
if (hraci[player]) return "zakaz symultanki";
|
if (hraci.has(player)) return "zakaz symultanki";
|
||||||
}
|
}
|
||||||
|
|
||||||
const message = await mes.channel.send("hraj zopiciva");
|
const message = await mes.channel.send("hraj zopiciva");
|
||||||
|
|
||||||
const hra = createGame(mes.channelId, mes.author.id, druhej, message);
|
const hra = createGame(++nextGameID, mes.author.id, druhej, message);
|
||||||
hraci[mes.author.id] = mes.channelId;
|
hraci.set(mes.author.id, nextGameID);
|
||||||
hraci[druhej] = mes.channelId;
|
hraci.set(druhej, nextGameID);
|
||||||
|
|
||||||
message.edit({ content: "", embeds: [renderHra(hra)] });
|
message.edit({ content: "", embeds: [renderHra(hra)] });
|
||||||
|
|
||||||
@ -489,10 +491,10 @@ const exp: Modul = {
|
|||||||
|
|
||||||
jasevzdavam: mes => {
|
jasevzdavam: mes => {
|
||||||
|
|
||||||
if (!hraci[mes.author.id]) return "vsak nehrajes magore";
|
const gameID = hraci.get(mes.author.id);
|
||||||
|
if (!gameID) return "vsak nehrajes magore";
|
||||||
|
|
||||||
const hra = hry[mes.channelId];
|
const hra = hry.get(gameID)!;
|
||||||
if (!hra) return "tadi nehrajes";
|
|
||||||
|
|
||||||
konec(hra.message, hra, `${mes.author} je pusi`);
|
konec(hra.message, hra, `${mes.author} je pusi`);
|
||||||
}
|
}
|
||||||
@ -503,6 +505,7 @@ const exp: Modul = {
|
|||||||
module.exports = exp;
|
module.exports = exp;
|
||||||
|
|
||||||
type Hra = {
|
type Hra = {
|
||||||
|
id: number;
|
||||||
bila: string;
|
bila: string;
|
||||||
cerna: string;
|
cerna: string;
|
||||||
deska: Deska;
|
deska: Deska;
|
||||||
|
|||||||
@ -15,6 +15,8 @@ const tahStranka = readFileSync(`${basePath}/tah.html`).toString();
|
|||||||
const promoStranka = readFileSync(`${basePath}/promotion.html`).toString();
|
const promoStranka = readFileSync(`${basePath}/promotion.html`).toString();
|
||||||
const chybaStranka = readFileSync(`${basePath}/error.html`).toString();
|
const chybaStranka = readFileSync(`${basePath}/error.html`).toString();
|
||||||
|
|
||||||
|
export const sachyDomena = process.env.sachyDomena ?? "šach.ml";
|
||||||
|
|
||||||
interface Eventy {
|
interface Eventy {
|
||||||
tah: (playerId: string, square: string, verify: (err?: string) => void, promotionType?: string) => void;
|
tah: (playerId: string, square: string, verify: (err?: string) => void, promotionType?: string) => void;
|
||||||
}
|
}
|
||||||
@ -92,7 +94,11 @@ function logout(session: Session, res: ServerResponse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function loginErr(res: ServerResponse) {
|
function loginErr(res: ServerResponse) {
|
||||||
res.end(chybaStranka.replaceAll("$error", "Prihlaseni se nezdarilo, zkus to znovu a jestli to nefunguje furt, tak si holt stezuj no"));
|
res.end(
|
||||||
|
chybaStranka
|
||||||
|
.replace("$domena", sachyDomena)
|
||||||
|
.replace("$error", "Prihlaseni se nezdarilo, zkus to znovu a jestli to nefunguje furt, tak si holt stezuj no")
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function overeni(url: string, session: Session, res: ServerResponse) {
|
async function overeni(url: string, session: Session, res: ServerResponse) {
|
||||||
@ -112,7 +118,7 @@ async function overeni(url: string, session: Session, res: ServerResponse) {
|
|||||||
|
|
||||||
session.logedIn = true;
|
session.logedIn = true;
|
||||||
session.discordId = uzivatel.id;
|
session.discordId = uzivatel.id;
|
||||||
session.discordName = `${uzivatel.username}#${uzivatel.discriminator}`;
|
session.discordName = uzivatel.username;
|
||||||
|
|
||||||
redirect(res, session.redirect || "/");
|
redirect(res, session.redirect || "/");
|
||||||
}
|
}
|
||||||
@ -126,9 +132,11 @@ function validateMove(res: ServerResponse, session: Session, url: string) {
|
|||||||
|
|
||||||
function overeni(err?: string) {
|
function overeni(err?: string) {
|
||||||
if (err == "--promote--")
|
if (err == "--promote--")
|
||||||
return res.end(promoStranka);
|
return res.end(promoStranka.replace("$domena", sachyDomena));
|
||||||
|
|
||||||
const response = tahStranka.replace("$title", err ? "Neplatej tah" : "Úspšný tah")
|
const response = tahStranka
|
||||||
|
.replace("$domena", sachyDomena)
|
||||||
|
.replace("$title", err ? "Neplatej tah" : "Úspšný tah")
|
||||||
.replace("$content", err ?? "Kvalitní tah!")
|
.replace("$content", err ?? "Kvalitní tah!")
|
||||||
.replace("$podminka", err ? "0" : "1");
|
.replace("$podminka", err ? "0" : "1");
|
||||||
|
|
||||||
@ -141,17 +149,18 @@ function validateMove(res: ServerResponse, session: Session, url: string) {
|
|||||||
const server = createServer((req, res) => {
|
const server = createServer((req, res) => {
|
||||||
|
|
||||||
const session = startSession(req, res);
|
const session = startSession(req, res);
|
||||||
// TODO: Natipovaný, protože vscode jebe (možná někdy přestane, v tom případě odebrat pls)
|
const url = new URL(req.url!, `http://${sachyDomena}`);
|
||||||
const url: URL = new URL(req.url!, "http://šach.ml");
|
|
||||||
|
|
||||||
|
// Zpracování tahu
|
||||||
if (url.pathname.length == 2 || url.pathname.length == 4) return validateMove(res, session, req.url!);
|
if (url.pathname.length == 2 || url.pathname.length == 4) return validateMove(res, session, req.url!);
|
||||||
|
|
||||||
if (req.url?.startsWith("/oauth")) return overeni(req.url, session, res);
|
if (req.url?.startsWith("/oauth")) return overeni(req.url, session, res);
|
||||||
|
|
||||||
switch (url.pathname) {
|
switch (url.pathname) {
|
||||||
case "/": {
|
case "/": {
|
||||||
const response = indexStranka.replace("$logged", session.logedIn ? "1" : "0")
|
const response = indexStranka
|
||||||
.replace("$jmeno", session.discordName ?? "");
|
.replaceAll("$domena", sachyDomena)
|
||||||
|
.replace("$pecko", session.logedIn ? `Jsi přihlášen jako ${session.discordName}. Pro odhlášení pokračuj <a href="logout">sem</a>.` : `Pro přihlášení pokračuj <a href="login">sem</a>.`);
|
||||||
return res.end(response);
|
return res.end(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@ if (!existsSync("config.json")) throw new Error("config.json neexistuje");
|
|||||||
const konfig = require("../../config.json");
|
const konfig = require("../../config.json");
|
||||||
if (!konfig.ignoreUnknownKeys)
|
if (!konfig.ignoreUnknownKeys)
|
||||||
for (const klic of Object.keys(konfig)) {
|
for (const klic of Object.keys(konfig)) {
|
||||||
if (!["adminChannel", "adminID", "DBPwd", "DBUser", "dieOnError", "ignoreMess", "ignorePresence", "ignoreSpink", "ignoreUnknownKeys", "noGeneralSync", "prefix", "statPass", "token"].includes(klic)) throw new Error(`config.json obsahuje neznámý klíč: ${klic}`);
|
if (!["adminChannel", "adminID", "DBPwd", "DBUser", "dieOnError", "ignoreMess", "ignorePresence", "ignoreSpink", "ignoreUnknownKeys", "noGeneralSync", "prefix", "sachyDomena", "statPass", "token"].includes(klic)) throw new Error(`config.json obsahuje neznámý klíč: ${klic}`);
|
||||||
}
|
}
|
||||||
process.env = { ...process.env, ...konfig };
|
process.env = { ...process.env, ...konfig };
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user