Compare commits
12 Commits
15ddca379f
...
a3fbdf5859
| Author | SHA1 | Date | |
|---|---|---|---|
| a3fbdf5859 | |||
| 865c5433a9 | |||
| 83231a085d | |||
| 4c904551dc | |||
| 350445a58c | |||
| a206ba2cf0 | |||
| 8f6b096d17 | |||
| dc3ee12e48 | |||
| 82a487d3dd | |||
| 69753dac66 | |||
| 40fc554954 | |||
| 94dc08ee8d |
39
admin.php
39
admin.php
@ -1,3 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
if (null !== $_POST['set_pwd']) {
|
||||||
|
$pwd = $_POST['set_pwd'];
|
||||||
|
file_put_contents('data/admin_pwd', password_hash($pwd, PASSWORD_DEFAULT));
|
||||||
|
setcookie('owe_admin', base64_encode($pwd), ['httponly' => true]);
|
||||||
|
header('location: admin.php');
|
||||||
|
} elseif (null !== $_POST['pwd']) {
|
||||||
|
$pwd = $_POST['pwd'];
|
||||||
|
if (password_verify($pwd, file_get_contents('data/admin_pwd'))) {
|
||||||
|
setcookie('owe_admin', base64_encode($pwd), ['httponly' => true]);
|
||||||
|
header('location: admin.php');
|
||||||
|
print("DER KEKS MÜSSTE GESETZT SEIN");
|
||||||
|
} else {
|
||||||
|
print("Nope, falsch");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
@ -47,13 +66,6 @@ $config_data = json_decode($raw_json_config, false);
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
if (null !== $_POST['set_pwd']) {
|
|
||||||
$pwd = $_POST['set_pwd'];
|
|
||||||
file_put_contents('data/admin_pwd', password_hash($pwd, PASSWORD_DEFAULT));
|
|
||||||
setcookie('owe_admin', base64_encode($pwd), ['httponly' => true]);
|
|
||||||
header('location: admin.php');
|
|
||||||
}
|
|
||||||
|
|
||||||
endif;
|
endif;
|
||||||
|
|
||||||
if ($login):
|
if ($login):
|
||||||
@ -96,17 +108,8 @@ $config_data = json_decode($raw_json_config, false);
|
|||||||
</form>
|
</form>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
if (null !== $_POST['pwd']) {
|
endif;
|
||||||
$pwd = $_POST['pwd'];
|
?>
|
||||||
if (password_verify($pwd, file_get_contents('data/admin_pwd'))) {
|
|
||||||
setcookie('owe_admin', base64_encode($pwd), ['httponly' => true]);
|
|
||||||
header('location: admin.php');
|
|
||||||
} else {
|
|
||||||
print("Nope, falsch");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
endif; ?>
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|||||||
17
index.php
17
index.php
@ -1,21 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
header("Cache-Control: no-cache, no-store, must-revalidate");
|
||||||
|
?>
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
function get_color_from_ip($ip) {
|
function get_color_from_userdata($data) {
|
||||||
$ip_elem = explode(".", $ip);
|
|
||||||
$css = "background-color: hsl(";
|
$css = "background-color: hsl(";
|
||||||
$number = abs(crc32($ip));
|
$number = abs(crc32($data));
|
||||||
$css .= ($number % 360).", ";
|
$css .= ($number % 360).", ";
|
||||||
$css .= (50 + (($number >> 3) % 51))."%, ";
|
$css .= (50 + (($number >> 3) % 51))."%, ";
|
||||||
$css .= (50 + (($number >> 5) % 51))."%);";
|
$css .= (50 + (($number >> 5) % 31))."%);"; // maximal 80%, es soll nicht einfach weiß sein
|
||||||
|
|
||||||
return $css;
|
return $css;
|
||||||
}
|
}
|
||||||
|
|
||||||
//header("refresh: 28");
|
|
||||||
header("Cache-Control: no-cache, no-store, must-revalidate");
|
|
||||||
|
|
||||||
if (!is_dir("data")) {
|
if (!is_dir("data")) {
|
||||||
// initialize everything
|
// initialize everything
|
||||||
mkdir("data", 0755);
|
mkdir("data", 0755);
|
||||||
@ -46,7 +46,8 @@ if (array_key_exists("submitted", $_REQUEST)) {
|
|||||||
if ($botrequest) {
|
if ($botrequest) {
|
||||||
$content .= "background-color: darksalmon; color: white;'>";
|
$content .= "background-color: darksalmon; color: white;'>";
|
||||||
} else {
|
} else {
|
||||||
$content .= get_color_from_ip($_SERVER['REMOTE_ADDR'])."'>";
|
// Farbe hängt ab von Benutzer und ändert sich nach gewisser Zeit.
|
||||||
|
$content .= get_color_from_userdata($_REQUEST["user"].strval(intdiv(time(),60*60*24*7)))."'>";
|
||||||
}
|
}
|
||||||
|
|
||||||
$ends_of_sentence = ['.', '!', '?'];
|
$ends_of_sentence = ['.', '!', '?'];
|
||||||
|
|||||||
236
owe.js
236
owe.js
@ -2,7 +2,7 @@ var previousTextLength;
|
|||||||
var config_data;
|
var config_data;
|
||||||
var unread_words = 0;
|
var unread_words = 0;
|
||||||
|
|
||||||
function loadSentences(alertIfNew = false, increaseUnread = true) {
|
async function loadSentences(alertIfNew = false, increaseUnread = true) {
|
||||||
fetch("./data/sentences.txt", {headers: {"Cache-Control": "no-cache, no-store"}})
|
fetch("./data/sentences.txt", {headers: {"Cache-Control": "no-cache, no-store"}})
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
return response.text().then((text) => {
|
return response.text().then((text) => {
|
||||||
@ -31,17 +31,20 @@ function loadSentences(alertIfNew = false, increaseUnread = true) {
|
|||||||
|
|
||||||
// color
|
// color
|
||||||
var spans = document.querySelector(".sentences").getElementsByTagName("span");
|
var spans = document.querySelector(".sentences").getElementsByTagName("span");
|
||||||
// we expect this to be from the user who's turn it is now (2 users)
|
|
||||||
var histurnspan = spans[spans.length - 2];
|
|
||||||
//console.log(histurnspan.getAttribute("style"));
|
|
||||||
document.getElementById("wordinput").setAttribute("style", histurnspan.getAttribute("style"));
|
|
||||||
|
|
||||||
|
if (spans.length >= config_data.users.length) {
|
||||||
|
var histurnspan = spans[spans.length - config_data.users.length];
|
||||||
|
//console.log(histurnspan.getAttribute("style"));
|
||||||
|
document.getElementById("wordinput").setAttribute("style", histurnspan.getAttribute("style"));
|
||||||
|
} else {
|
||||||
|
console.error('Not enough spans available for users.');
|
||||||
|
}
|
||||||
initializeLoginArea();
|
initializeLoginArea();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadConfig() {
|
async function loadConfig() {
|
||||||
fetch("./data/config.json", {headers: {"Cache-Control": "no-cache, no-store"}}).then((response) => {
|
fetch("./data/config.json", {headers: {"Cache-Control": "no-cache, no-store"}}).then((response) => {
|
||||||
return response.text().then((text) => {
|
return response.text().then((text) => {
|
||||||
config_data = JSON.parse(text);
|
config_data = JSON.parse(text);
|
||||||
@ -52,6 +55,29 @@ function loadConfig() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getUsernameFromCookie() {
|
||||||
|
// Split the document.cookie string into individual cookie key-value pairs
|
||||||
|
var cookies = document.cookie.split(';').map(cookie => cookie.trim());
|
||||||
|
|
||||||
|
// Loop through the cookies to find the 'owe_user' cookie
|
||||||
|
for (var i = 0; i < cookies.length; i++) {
|
||||||
|
var cookie = cookies[i];
|
||||||
|
if (cookie.startsWith('owe_user=')) {
|
||||||
|
// Extract the username from the 'owe_user' cookie
|
||||||
|
return decodeURIComponent(cookie.substring('owe_user='.length));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return null if the 'owe_user' cookie is not set
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteUsernameCookie() {
|
||||||
|
// Set the 'owe_user' cookie to expire by setting its expiration date to a time in the past
|
||||||
|
document.cookie = 'owe_user=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=.;';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function onReloadClicked() {
|
function onReloadClicked() {
|
||||||
loadSentences();
|
loadSentences();
|
||||||
document.querySelector("#but-reload").style.visibility = "hidden";
|
document.querySelector("#but-reload").style.visibility = "hidden";
|
||||||
@ -60,18 +86,31 @@ function onReloadClicked() {
|
|||||||
}, 100);
|
}, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendWord() {
|
async function sendWord() {
|
||||||
var data = new FormData();
|
try {
|
||||||
data.append('submitted', encodeURI(document.getElementById("wordinput").value));
|
var data = new FormData();
|
||||||
data.append('user', getNextPlayer());
|
var wordInput = document.getElementById("wordinput");
|
||||||
const Http = new XMLHttpRequest();
|
data.append('submitted', encodeURI(wordInput.value));
|
||||||
Http.open('POST', '.');
|
|
||||||
Http.onreadystatechange=(e)=>{
|
// Use await to get the next player asynchronously
|
||||||
document.getElementById("wordinput").value = "";
|
var nextPlayer = await getNextPlayer();
|
||||||
loadSentences(false, false);
|
data.append('user', nextPlayer);
|
||||||
resetUnread();
|
|
||||||
}
|
const Http = new XMLHttpRequest();
|
||||||
Http.send(data);
|
Http.open('POST', '.');
|
||||||
|
Http.onreadystatechange = (e) => {
|
||||||
|
wordInput.value = "";
|
||||||
|
loadSentences(false, false);
|
||||||
|
resetUnread();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Set the 'owe_user' cookie with the value obtained from getNextPlayer
|
||||||
|
document.cookie = `owe_user=${encodeURIComponent(nextPlayer)}; path=.`;
|
||||||
|
|
||||||
|
Http.send(data);
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error in sendWord:", error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function displayNotification(word) {
|
function displayNotification(word) {
|
||||||
@ -105,30 +144,151 @@ function resetUnread() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getNextPlayer() {
|
function getNextPlayer() {
|
||||||
var spans = document.querySelector(".sentences").getElementsByTagName("span");
|
var sentencesDiv = document.querySelector(".sentences");
|
||||||
var lastspan = spans[spans.length - 1];
|
var spans = sentencesDiv.getElementsByTagName("span");
|
||||||
var lastplayer = lastspan.dataset.user;
|
|
||||||
var idx_next = (config_data.users.indexOf(lastplayer) + 1) % config_data.users.length;
|
if (spans.length > 0) {
|
||||||
return config_data.users[idx_next];
|
var lastSpan = spans[spans.length - 1];
|
||||||
|
var lastPlayer = lastSpan.dataset.user;
|
||||||
|
var idxNext = (config_data.users.indexOf(lastPlayer) + 1) % config_data.users.length;
|
||||||
|
return config_data.users[idxNext];
|
||||||
|
} else {
|
||||||
|
// If there are no spans, determine the next user from the archive file
|
||||||
|
var archiveFileUrl = getArchiveFileUrl(); // Replace with the actual function that returns the archive file URL
|
||||||
|
return getLastUserFromArchive(archiveFileUrl)
|
||||||
|
.then(lastUser => {
|
||||||
|
if (lastUser) {
|
||||||
|
// Calculate the next user's index based on the list of users
|
||||||
|
var idxNext = (config_data.users.indexOf(lastUser) + 1) % config_data.users.length;
|
||||||
|
return config_data.users[idxNext];
|
||||||
|
} else {
|
||||||
|
// Handle the case when the archive file is empty or contains no spans
|
||||||
|
console.error("Archive file is empty or contains no spans.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error("Error fetching archive file:", error);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTimeSinceLast() {
|
|
||||||
var spans = document.querySelector(".sentences").getElementsByTagName("span");
|
function getLastUserFromArchive(archiveFileUrl) {
|
||||||
var lastspan = spans[spans.length - 1];
|
// Fetch the last span from the archive file and extract the username
|
||||||
var lasttime = lastspan.dataset.time;
|
return getLastSpanFromArchive(archiveFileUrl)
|
||||||
return Date.now()/1e3 - lasttime; // in seconds
|
.then(lastArchiveSpan => {
|
||||||
|
if (lastArchiveSpan) {
|
||||||
|
return lastArchiveSpan.dataset.user;
|
||||||
|
} else {
|
||||||
|
// Handle the case when the archive file is empty or contains no spans
|
||||||
|
console.error("Archive file is empty or contains no spans.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error("Error fetching archive file:", error);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function initializeLoginArea() {
|
function getLastSpanFromArchive(archiveFileUrl) {
|
||||||
var loginArea = document.getElementById('login_area');
|
// Make an asynchronous request to fetch the content of the archive file
|
||||||
//loginArea.innerHTML = "Eingeloggt als NOCH NICHT IMPLEMENTIERT";
|
return fetch(archiveFileUrl)
|
||||||
loginArea.innerHTML = ""; // first clear it out
|
.then(response => response.text())
|
||||||
loginArea.innerHTML += getNextPlayer() + " ist dran!<br>\n";
|
.then(htmlContent => {
|
||||||
var relative_time = getTimeSinceLast();
|
// Parse the HTML content to get the last span
|
||||||
var days = Math.floor(relative_time/(3600*24));
|
var parser = new DOMParser();
|
||||||
var hours = Math.floor(relative_time/(3600))%24;
|
var doc = parser.parseFromString(htmlContent, 'text/html');
|
||||||
var minutes = Math.floor(relative_time/(60))%60;
|
var archiveSpans = doc.querySelectorAll("span");
|
||||||
loginArea.innerHTML += "Schon seit " + days + " Tagen, " + hours + " Stunden und " + minutes + " Minuten!";
|
|
||||||
|
if (archiveSpans.length > 0) {
|
||||||
|
return archiveSpans[archiveSpans.length - 1];
|
||||||
|
} else {
|
||||||
|
// Return null if the archive file is empty or contains no spans
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// bullshit implementation:
|
||||||
|
function getArchiveFileUrl() {
|
||||||
|
return "./data/sentences-archive-25-nov-23-26-jan-24.txt";
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getTimeSinceLast() {
|
||||||
|
var sentencesDiv = document.querySelector(".sentences");
|
||||||
|
var spans = sentencesDiv.getElementsByTagName("span");
|
||||||
|
|
||||||
|
if (spans.length > 0) {
|
||||||
|
var lastSpan = spans[spans.length - 1];
|
||||||
|
var lastTime = lastSpan.dataset.time;
|
||||||
|
return Date.now() / 1e3 - lastTime; // in seconds
|
||||||
|
} else {
|
||||||
|
// If there are no spans, determine the last time from the archive file
|
||||||
|
var archiveFileUrl = getArchiveFileUrl(); // Replace with the actual function that returns the archive file URL
|
||||||
|
return getLastTimeFromArchive(archiveFileUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getLastTimeFromArchive(archiveFileUrl) {
|
||||||
|
try {
|
||||||
|
// Fetch the last span from the archive file
|
||||||
|
var lastSpan = await getLastSpanFromArchive(archiveFileUrl);
|
||||||
|
|
||||||
|
if (lastSpan) {
|
||||||
|
var lastTime = lastSpan.dataset.time;
|
||||||
|
return Date.now() / 1e3 - lastTime; // in seconds
|
||||||
|
} else {
|
||||||
|
// Handle the case when the archive file is empty or contains no spans
|
||||||
|
console.error("Archive file is empty or contains no spans.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error fetching archive file:", error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function logoutUser() {
|
||||||
|
deleteUsernameCookie();
|
||||||
|
initializeLoginArea(); // Reload everything in the login area
|
||||||
|
}
|
||||||
|
|
||||||
|
async function initializeLoginArea() {
|
||||||
|
var loginArea = document.getElementById('login_area');
|
||||||
|
|
||||||
|
var sendButton = document.getElementById('sendbut');
|
||||||
|
sendButton.style.display = "unset"
|
||||||
|
var wordInput = document.getElementById('wordinput');
|
||||||
|
wordInput.disabled = false;
|
||||||
|
|
||||||
|
// Use async/await to wait for the result of getNextPlayer
|
||||||
|
try {
|
||||||
|
var loggedInPlayer = getUsernameFromCookie();
|
||||||
|
var nextPlayer = await getNextPlayer();
|
||||||
|
var relative_time = await getTimeSinceLast();
|
||||||
|
// Clear the login area
|
||||||
|
loginArea.innerHTML = "";
|
||||||
|
if (loggedInPlayer != null) {
|
||||||
|
loginArea.innerHTML += "Du bist angemeldet als " + loggedInPlayer + "."
|
||||||
|
loginArea.innerHTML += " <button onclick='logoutUser()'>abmelden</button><br>\n";
|
||||||
|
if (loggedInPlayer != nextPlayer) {
|
||||||
|
sendButton.style.display = "none";
|
||||||
|
wordInput.disabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
loginArea.innerHTML += nextPlayer + " ist dran!<br>\n";
|
||||||
|
|
||||||
|
var days = Math.floor(relative_time / (3600 * 24));
|
||||||
|
var hours = Math.floor(relative_time / 3600) % 24;
|
||||||
|
var minutes = Math.floor(relative_time / 60) % 60;
|
||||||
|
loginArea.innerHTML += "Schon seit " + days + " Tagen, " + hours + " Stunden und " + minutes + " Minuten!";
|
||||||
|
} catch (error) {
|
||||||
|
// Handle any errors that may occur in the getNextPlayer function
|
||||||
|
console.error("Error in initializeLoginArea:", error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
window.onfocus = resetUnread;
|
window.onfocus = resetUnread;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user