Skip to content

Instantly share code, notes, and snippets.

@MartinMuzatko
Created May 3, 2021 16:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MartinMuzatko/2452f9416e0eb0258f01596cd38bba42 to your computer and use it in GitHub Desktop.
Save MartinMuzatko/2452f9416e0eb0258f01596cd38bba42 to your computer and use it in GitHub Desktop.
<html>
<head>
<!-- Site optimized with MySEO 1.0 -->
{$seo_index}
<!-- Site optimized with MySEO 1.0 -->
<title>{$mybb->settings['bbname']}</title>
<meta http-equiv=“Pragma” content=”no-cache”>
<meta http-equiv=“Expires” content=”-1″>
<meta http-equiv=“CACHE-CONTROL” content=”NO-CACHE”>
{$headerinclude}
<style>
.button.small {
width: 70px;
}
.button.big {
width: 94px;
}
.button.gigantic {
width: 143px;
}
.inactive:hover:not(.exception) {
background-color: #666666;
cursor: pointer;
}
.inactive {
background-color: #222222;
}
.active:hover:not(.exception) {
background-color: #cccccc;
}
.active {
background-color: #aaaaaa;
cursor: pointer;
}
.button {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
color: #fff;
display: inline-block;
text-align: center;
font-weight: bold;
}
.button.upper{
margin-bottom: 2px;
}
.button.left {
margin-right: -2px;
}
.button.left.double {
margin-left: -3px;
}
.button.left.upper {
border-radius: 10px 0px 0px 0px;
}
.button.left.lower {
border-radius: 0px 0px 0px 10px;
}
.button.mid {
margin-right: -2px;
}
.button.right.upper {
border-radius: 0px 10px 0px 0px;
}
.button.right.lower {
border-radius: 0px 0px 10px 0px;
}
.invisible {
visibility: hidden;
width: 0px !important;
}
.buttonWrapper {
white-space: nowrap;
overflow-x: hidden;
width: 300px;
}
</style>
<script type="text/javascript">
<!--
lang.no_new_posts = "{$lang->no_new_posts}";
lang.click_mark_read = "{$lang->click_mark_read}";
// -->
</script>
<style type="text/css">
.navigation {display:none;} /*Index only*/
</style>
</head>
<body>
{$header}
<table width="100%" cellspacing="0" cellpadding="{$theme['tablespace']}" border="0">
<tr>
<td valign="top" width="78%">
{$forums}
{$boardstats}
</td>
<td valign="top">
<table border="0" cellspacing="{$theme['borderwidth']}" cellpadding="{$theme['tablespace']}" class="tborder">
<tr>
<td class="thead">
<div class="float_left"><strong>SERVER INFORMATIONEN</strong></div
</td>
</tr>
<tr>
<td align="center" class="trow2">
<img src="images/icons/Minecraft.png">
<strong>Minecraft:&nbsp; athalon.de<i style="font-size: 16px;"></i></strong><br>
<i class="fab fa-teamspeak" style="color:#7AD7F0"></i>
<strong>Teamspeak:&nbsp; </strong><a href="ts3server://ts.athalon.de?port=9987">ts.athalon.de</a><br>
<i class="fab fa-discord" style="color:#7289da"></i>
<strong>Discord: &nbsp;&nbsp; <i style="font-size: 16px;"></i></strong><a href=https://discord.gg/DVHzrMC> Discord beitreten!</a><br>
<i class="fab fa-wikipedia-w"></i>
<strong>Athalon Wiki:<i style="font-size: 16px;"></i></strong><a href=http://wiki.athalon.de> wiki.athalon.de</a><br>
<br>
</td>
</tr>
</table>
<br />
<table border="0" cellspacing="{$theme['borderwidth']}" cellpadding="{$theme['tablespace']}" class="tborder">
<thead>
<tr>
<td class="thead">
<strong>Zitate</strong>
</td>
</tr>
</thead>
<tbody>
<tr class="portal">
<td class="trow2" id="zitate">
</td>
</tr>
</tbody>
</table>
<br />
<script>
var object = {
"2019":[
["Freunde des Alkohols.. Es muss ja mal gesagt werden. Ich trinke auch nicht NUR Alkohol...","René","2019"],
["Ich bin nicht nachtragend!","René","2019"],
["Das gaaaanze Internet spinnt grade!","Chris","2019"],
["Kann es sein, dass ich verzögert weinen muss, weil ich vorhin Zwiebeln gegessen habe?","Zwocke (Zwiebel-Socke)","2019"],
["Dürfte ich vielleicht einmal...an Ihrem Kind riechen?","Chilaili","2019"],
["Mit dem Thema [G20] sollten wir aufhören, dabei steigt mein Cholesterinspiegel","Seb","2019"],
["Was ist, Seb? Äh...Bernt? Äh...Ati? Äh...Ardy?","Chris","2019"],
["*Jasmin legt ihm eine Schulter auf die Hand*","Jasmin (Lea)","2019"],
["Gehört diese Birke euch?","Chilaili","2019"],
["WAS IST NE MAP?! WAS IST NE MAP????","Chris","2019"],
["Christians Kinder, die er später wegen Cannabis Besitz anzeigt, entstehen auch nur aus einem Emote!","Ardy","2019"],
["Ich hasse Socken!","Socke","2019"],
["Steht auf und verschwindet, sonst scheiße ich euch vom Prioreisberg!","Amelie (Cookey)","2019"]
],
"2020":[
["Sie ist nicht katholisch, sie ist Italienerin","Chris","2020"],
["Drei ist eine große Zahl.","Cookey","2020"],
["... du schläfst schon nur mit deiner Mama zusammen oder Bernt?","Socke","2020"],
["Wir sollten einen offensiven Rückzug in ihre Richtung machen!","Alfredo Angelo (René)","2020"],
["Sag mal [Dennis], seit wann ist denn dein Ding SO GROß!?","Josi","2020"],
["Das Fleisch spritzt mich an, Hilfe!","Josi","2020"],
["Wie heißt diese Währung in Polen? Knöllies?","Socke","2020"],
["Leute wenn die jetzt gewinnen, dann haben wir verloren!","Dennis","2020"],
["Nicht zu wild pipettieren!","Chris","2020"],
["Zum Glück bin ich zu dumm!","Josi","2020"],
["Christian, du hast mal wieder gar keine Ahnung.","Chilaili","2020"],
["Aber jetzt mal ehrlich, Kartoffeln sind voll die geilen Früchte","Sam","2020"],
["Amin, warum willst du mich nicht heiraten?","Chris","2020"],
["...wer kann sich sowas bitte merken? Bist du zufällig Autist?","Itsy","2020"],
["Er wurde attentätert!", "Misan", 2020],
["Die Untoten müssen doch auch von etwas leben", "Misan", 2020],
["Aber ich habe meine Maus im Bett, haha!", "Chris", 2020],
["Von wann bis wann gingen die 70er Jahre?", "Josi", 2020],
["Das ist nicht mein Esel, das ist Chilaili!", "Misan", 2020],
["Habt ihr Bock auf serious Sam?", "Sam", 2020],
["Was ist ein Ei?", "Itsy", 2020],
["Was heißt nochmal Spiderweb auf Englisch?", "René", 2020],
["Exekutionen müssen interaktiver werden!", "Michi", 2020]
],
"2021":[
["Dieses Heilkraut ist sehr gut als Heilkraut geeignet","Dennis","2021"],
["Es gibt ja jede Richtung.","Janny","2021"],
["Wie hat mein PC eben meine Seele eingefangen?","Chris","2021"],
["Sniper laden so lange nach. Die sind echt nicht gut für long range.","Denis","2021"]
]
}
var years = [];
for (var key in object) years.push(key);
years.splice(years.length-3,0,years[years.length-3]);
years.splice(years.length-2,0,years[years.length-2]); years.splice(years.length-2,0,years[years.length-2]); years.splice(years.length-2,0,years[years.length-2]);
years.splice(years.length-1,0,years[years.length-1]); years.splice(years.length-1,0,years[years.length-1]); years.splice(years.length-1,0,years[years.length-1]);
years.splice(years.length-1,0,years[years.length-1]); years.splice(years.length-1,0,years[years.length-1]); years.splice(years.length-1,0,years[years.length-1]);
var yearMax = years.length;
var yearNumber = Math.floor(Math.random()*yearMax);
var array = object[years[yearNumber]];
var max = array.length;
var number = Math.floor(Math.random()*max);
document.getElementById("zitate").innerHTML = array[number][0] + "</br><i><small>" + array[number][1] + " ("+array[number][2]+")</small></i>";
</script>
<!-- Hier die Anpassung -->
<table border="0" cellspacing="0" cellpadding="5" class="tborder">
<tbody>
<tr>
<td class="thead">
<strong>Server Status</strong>
</td>
</tr>
<tr>
<td class="trow2 " id="server-list">
</td>
</tr>
</tbody>
</table>
<br />
<table border="0" cellspacing="0" cellpadding="5" class="tborder">
<tbody>
<tr>
<td class="thead">
<strong>Minecraft Online</strong>
</td>
</tr>
<tr>
<td class="trow2 " id="minecraft-server-player-amount">
</td>
</tr>
<tr>
<td class="trow2 " id="minecraft-server-player-list">
</td>
</tr>
</tbody>
</table>
<br />
<table border="0" cellspacing="0" cellpadding="5" class="tborder">
<tbody>
<tr>
<td class="thead">
<strong>Top Voter!</strong>
</td>
</tr>
<tr>
<td class="trow2 ">
<div class="buttonWrapper">
<span onclick="clickedUpperOne(this)" class="active button left upper small" id="upperOne">Insg.</span>
<span onclick="clickedUpperTwo(this)" class="inactive button mid upper small" id="upperTwo">Akt.</span>
<span onclick="clickedUpperThr(this)" class="inactive button mid upper small" id="upperThr">Beste</span>
<span onclick="clickedUpperFou(this)" class="inactive button right upper small" id="upperFou">Rekord</span>
<br>
<span onclick="clickedLowerOne(this)" class="active button left lower small" id="lowerOne">Monat</span>
<span onclick="clickedLowerTwo(this)" class="inactive button mid lower small" id="lowerTwo">Woche</span>
<span onclick="clickedLowerThr(this)" class="inactive button mid lower small" id="lowerThr">Tag</span>
<span onclick="clickedLowerFou(this)" class="inactive button right lower small" id="lowerFou">Insg.</span>
<div>
</td>
</tr>
<tr>
<td class="trow2 " id="top-voters">
</td>
</tr>
</tbody>
</table>
<br />
<!-- Anfang des Scriptteiles -->
<script>
const MCAPI = 'https://api.mcsrvstat.us/2/';
const TSAPI = 'https://api.cleanvoice.ru/ts3/?address=';
const IDAPI = 'https://api.minetools.eu/uuid/';
const PLAYERNAMES = 'https://board.athalon.de/data/nicks.json';
const PLAYERPROFI = 'https://de.namemc.com/profile/';
const AVATARAPI = `https://minotar.net/helm/`;
const REFRESHRATE = 10 * 1000; // 10 seconds
const MCSERVER = '5.9.51.136:25565';
const TSSERVER = '5.9.51.136:9987';
const SERVERONLINE = '/images/revolution/serverstatus/green.png';
const SERVEROFFLINE = '/images/revolution/serverstatus/red.png';
const map = (fn, list) => list.map(fn);
const concat = array => {
var retString = "";
for (var elementInt in array) {
retString += array[elementInt];
}
return retString;
};
const getMinecraftServerInfo = async server => {
const response = await fetch(MCAPI + server)
const info = await response.json()
return info
};
const getTeamspeakServerInfo = async server => {
const response = await fetch(TSAPI + server)
const info = await response.json()
return info
};
const getPlayerNames = async server => {
const response = await fetch(PLAYERNAMES)
const info = await response.text()
var array = info.split("\n");
for (var key in array) {
var element = array[key];
var first = element.substr(0, element.indexOf(":"));
var second = element.substr((element.indexOf(":")+2));
array[key] = [ first, second ];
}
return array;
};
const getPlayers = async server => {
const info = await getMinecraftServerInfo(server)
return info.players.list
};
const getMinecraftServerStatus = async server => {
const info = await getMinecraftServerInfo(server)
//return info.debug.ping
return true;
};
const getTeamspeakServerStatus = async server => {
const info = await getTeamspeakServerInfo(server)
return info.can_connect
};
const renderPlayer = player => {
var accountname = player[0];
var charname = player[1];
var retString = "" + "\r\n" +
"<div style=\"display: flex; padding: .25em; align-items: center;\">" + "\r\n" +
" <a href=\""+PLAYERPROFI+accountname+".1"+"\" style=\"display: flex; align-items: center;\"><img src=\""+ AVATARAPI + accountname + "/32.png\" width=\"32\" height=\"32\" alt=\"Katonia\" title=\"\">" + "\r\n" +
" <div style=\"margin-left: .5em\">" + charname + "</div></a>" + "\r\n" +
"</div>";
return retString;
};
const renderPlayerName = name => {
var nameArray = name.split("§");
retString = "";
for (var key in nameArray) {
var element = nameArray[key];
if (element != "")
retString += translateColor(element.substring(0,1), element.substring(1));
}
return retString;
};
const translateColor = (colorCode, string) => {
var retVal = "";
retVal += "<p style=\"color:"+translateColorCode(colorCode)+"; float:left;\";>";
retVal += string.replace(/ /g, "&nbsp;");
retVal += "</p>";
return retVal;
};
const translateColorCode = colorCode => {
if (colorCode == "0") return "Black";
else if (colorCode == "1") return "Blue";
else if (colorCode == "2") return "Green";
else if (colorCode == "3") return "DarkCyan";
else if (colorCode == "4") return "Red";
else if (colorCode == "5") return "Purple";
else if (colorCode == "6") return "Gold";
else if (colorCode == "7") return "DarkGray";
else if (colorCode == "8") return "Gray";
else if (colorCode == "9") return "LightBlue";
else if (colorCode == "a") return "LightGreen";
else if (colorCode == "b") return "Cyan";
else if (colorCode == "c") return "Salmon";
else if (colorCode == "d") return "Magenta";
else if (colorCode == "e") return "Yellow";
else if (colorCode == "f") return "White";
};
const getPlayerUUID = async name => {
const response = await fetch(IDAPI + name)
const info = await response.json()
return info.id
};
const getPlayerName = async uuid => {
var array = await getPlayerNames();
var finalName = "";
for (var key in array) {
var set = array[key];
var setUuid = set[0];
setUuid = setUuid.replace(/-/gi,"");
var setName = set[1];
if (uuid == setUuid) return setName;
};
return false;
};
const renderPlayerList = async () => {
const listElementPlayers = document.querySelector('#minecraft-server-player-list')
const listElementAmount = document.querySelector('#minecraft-server-player-amount')
const players = await getPlayers(MCSERVER)
for (var playerNumber in players) {
var accountname = players[playerNumber];
var uuid = await getPlayerUUID(accountname);
var name = await getPlayerName(uuid);
var charname = renderPlayerName(name);
players[playerNumber] = [accountname, charname];
}
var athalonMC = await getMinecraftServerStatus(MCSERVER)
if (!athalonMC) return listElementPlayers.innerHTML = 'Der Server ist gerade offline :('
if (players == undefined || players == null) {
listElementAmount.innerHTML = "<center>0 / 50</center>"
return "empty"//listElementPlayers.innerHTML = 'Momentan ist niemand online.'
}
listElementPlayers.innerHTML = concat(map(renderPlayer, players))
listElementAmount.innerHTML = "<center>" + players.length + " / 50</center>"
}
renderPlayerList();
setInterval(renderPlayerList, REFRESHRATE);
const renderServer = (name, online) => {
var link = SERVEROFFLINE;
var title = "Offline";
if (online) { link = SERVERONLINE; title = "Online"; }
var retString = "" + "\r\n" +
"<div style=\"display: flex; padding: .25em; align-items: center;\">" + "\r\n" +
" <img src=\""+ link +"\" width=\"24\" height=\"24\" alt=\"\" title=\""+ title +"\">" + "\r\n" +
" <div style=\"margin-left: .5em\">" + name + "</div>" + "\r\n" +
"</div>";
return retString;
};
const renderServerList = async () => {
const listElementServers = document.querySelector('#server-list')
const servers = []
var athalonMC = await getMinecraftServerStatus(MCSERVER)
var athalonTS = await getTeamspeakServerStatus(TSSERVER)
var athalonCl = true;
servers.push(renderServer("Minecraft", athalonMC))
servers.push(renderServer("Teamspeak", athalonTS))
servers.push(renderServer("LegacyClonk", athalonCl))
servers.push(renderServer("Trouble in Terrorist Town", athalonCl))
listElementServers.innerHTML = concat(servers)
};
renderServerList();
setInterval(renderServerList, REFRESHRATE);
var chosenUpper = 1;
var chosenLower = 1;
function clickedUpperOne(button) {
clicked(button,true,false,1);
}
function clickedUpperTwo(button) {
clicked(button,true,false,2);
}
function clickedUpperThr(button) {
clicked(button,true,false,3);
}
function clickedUpperFou(button) {
clicked(button,true,false,4);
}
function clickedLowerOne(button) {
clicked(button,false,true,1);
}
function clickedLowerTwo(button) {
clicked(button,false,true,2);
}
function clickedLowerThr(button) {
clicked(button,false,true,3);
}
function clickedLowerFou(button) {
clicked(button,false,true,4);
}
function clicked(button,upper,lower,value) {
choseButton(button,upper,lower);
if (upper) chosenUpper = value;
if (lower) chosenLower = value;
if (chosenUpper==1) {
specialCaseTotalAdd();
} else {
specialCaseTotalRemove();
}
if (chosenUpper==3) {
specialCaseBestChainAdd();
} else {
specialCaseBestChainRemove();
document.getElementById("lowerOne").classList.remove("exception");
}
renderTopVoters(determineCriterium());
}
function determineCriterium() {
if (chosenUpper==2) {
if (chosenLower==1) return "MonthVoteStreak";
else if (chosenLower==2) return "WeekVoteStreak";
else if (chosenLower==3) return "DayVoteStreak";
else return "MonthVoteStreak"
} else if (chosenUpper==3) {
if (chosenLower==2) return "BestWeekVoteStreak";
else if (chosenLower==3) return "BestDayVoteStreak";
else return "BestWeekVoteStreak"
} else if (chosenUpper==4) {
if (chosenLower==1) return "HighestMonthlyTotal";
else if (chosenLower==2) return "HighestWeeklyTotal";
else if (chosenLower==3) return "HighestDailyTotal";
else return "HighestMonthlyTotal"
} else {
if (chosenLower==1) return "MonthTotal";
else if (chosenLower==2) return "WeeklyTotal";
else if (chosenLower==3) return "DailyTotal";
else if (chosenLower==4) return "AllTimeTotal";
else return "MonthTotal";
}
}
function isStreak(criterium) {
if (criterium == "BestWeekVoteStreak"
|| criterium == "BestDayVoteStreak"
|| criterium == "BestWeekVoteStreak"
|| criterium == "MonthVoteStreak"
|| criterium == "WeekVoteStreak"
|| criterium == "DayVoteStreak") {
return true;
} else {
return false;
}
}
function choseButton(button,upper,lower){
var els = document.getElementsByClassName("button"+(upper?" upper":"")+(lower?" lower":""));
Array.prototype.forEach.call(els, function(el) {
el.classList.add("inactive");
el.classList.remove("active");
});
button.classList.add("active");
button.classList.remove("inactive");
}
function specialCaseBestChainAdd() {
if (chosenLower==1) {
chosenLower = 2;
var lowerTwo = document.getElementById("lowerTwo");
choseButton(lowerTwo,false,true);
}
document.getElementById("lowerOne").classList.add("invisible");
var lowerTwo = document.getElementById("lowerTwo");
lowerTwo.classList.remove("small");
lowerTwo.classList.remove("big");
lowerTwo.classList.add("gigantic");
lowerTwo.classList.add("double");
lowerTwo.classList.replace("mid","left");
var lowerThr = document.getElementById("lowerThr");
lowerThr.classList.remove("small");
lowerThr.classList.remove("big");
lowerThr.classList.add("gigantic");
}
function specialCaseBestChainRemove() {
document.getElementById("lowerOne").classList.remove("invisible");
var lowerTwo = document.getElementById("lowerTwo");
lowerTwo.classList.remove("gigantic");
lowerTwo.classList.remove("double");
if (chosenUpper==1)
lowerTwo.classList.add("small");
else lowerTwo.classList.add("big");
lowerTwo.classList.replace("left","mid");
var lowerThr = document.getElementById("lowerThr");
lowerThr.classList.remove("gigantic");
if (chosenUpper==1)
lowerThr.classList.add("small");
else lowerThr.classList.add("big");
}
function specialCaseTotalAdd() {
document.getElementById("lowerOne").classList.replace("big","small");
document.getElementById("lowerTwo").classList.replace("big","small");
var lowerThr = document.getElementById("lowerThr");
lowerThr.classList.replace("big","small");
lowerThr.classList.replace("right","mid");
document.getElementById("lowerFou").classList.remove("invisible");
}
function specialCaseTotalRemove() {
var lowerOne = document.getElementById("lowerOne");
lowerOne.classList.replace("small","big");
document.getElementById("lowerTwo").classList.replace("small","big");
var lowerThr = document.getElementById("lowerThr");
lowerThr.classList.replace("small","big");
lowerThr.classList.replace("mid","right");
document.getElementById("lowerFou").classList.add("invisible");
if (chosenLower==4) {
choseButton(lowerOne,false,true);
chosenLower=1;
}
}
const filterPlayers = (players, criterium) => {
var maxPlace = 5;
var retVal = [];
for (var numberKey in players) {
player = players[numberKey];
monthTotal = parseInt(player[criterium]);
if (monthTotal > 0 && !(player.TopVoterIgnore.toLowerCase() == "true")) {
found = false;
for(var retKey in retVal) {
if (monthTotal > retVal[retKey][criterium]) {
if (!found) {
retVal.splice(retKey,0,player);
found = true;
while (retVal.length>maxPlace) retVal.splice(maxPlace,1);
}
}
}
if (!found && retVal.length<maxPlace) retVal.push(player);
}
}
return retVal;
}
const renderPlayerLine = (player, place, criterium) => {
var retVal = "<tr>";
retVal += "<td class=\"trow2 \">"+place+"</td>";
retVal += "<td class=\"trow2 \">";
var accountname = player.PlayerName;
retVal += renderPlayer([accountname, accountname]);
retVal += "</td>";
retVal += "<td class=\"trow2 \">"+player[criterium]+"</td>";
retVal += "</tr>";
return retVal;
}
const wrapVoters = (playerStrings,isStreak) => {
var retVal = "<table border=\"0\" cellspacing=\"0\" cellpadding=\"5\" class=\"tborder\"><tbody>";
retVal += "<tr><td class=\"thead \" style=\"font-size: smaller;\">"+"<strong>Platz</strong>"+
"</td><td class=\"thead \" style=\"font-size: smaller;\">"+"<strong>Name</strong>"+
"</td><td class=\"thead \" style=\"font-size: smaller;\">"+"<strong>"+(isStreak?"Strecke":"Votes")+"</strong>"+"</td></tr>";
retVal += playerStrings;
retVal += "</tbody></table>";
return retVal;
}
const renderTopVoters = async (criterium) => {
const response = await fetch('https://vote.athalon.de');
var jsonResp = await response.json();
var players = jsonResp.Table;
players = filterPlayers(players,criterium);
var lines = [];
for(var playerID in players) {
var player = players[playerID];
var playerLine = renderPlayerLine(player, parseInt(playerID)+1,criterium);
lines.push(playerLine);
}
var playerStrings = concat(lines);
document.querySelector('#top-voters').innerHTML = wrapVoters(playerStrings, isStreak(criterium));
}
renderTopVoters("MonthTotal");
</script>
<!-- Ende des Scriptteiles -->
<!-- Ende der Anpassung -->
<script type="text/javascript">
jQuery(function(){
jQuery(".latestthreads").load("{$mybb->settings['bburl']}/portal.php .latestthreads_portal");
});
</script>
<table border="0" cellspacing="{$theme['borderwidth']}" cellpadding="{$theme['tablespace']}" class="tborder">
<tr>
<td class="thead">
<div class="float_left"><strong>{$lang->latest_threads}</strong></div>
</td>
</tr>
<tr>
<td class="trow2">
<div class="latestthreads float_left"></div>
</td>
</tr>
</table>
<br />
</td>
</tr>
</table>
<br class="clear" />
{$footer}
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment