Created
March 20, 2025 11:24
-
-
Save gitnik/c08f1a1bf8a3e49a8231d25a9c30289a to your computer and use it in GitHub Desktop.
standdef fixed.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name Standdeffübersicht automatisieren | |
// @version 1.1001 | |
// @description Automatisiert die SD Tabelle | |
// @author TheHebel97, Alpa | |
// @match https://*.die-staemme.de/game.php?village=*&screen=forum&screenmode=view_thread&thread_id=*&edit_post_id=*&page=0&forum_id=* | |
// @match https://*.die-staemme.de/game.php?village=*&screen=forum&screenmode=view_thread*&thread_id=* | |
// @match https://*.die-staemme.de/game.php?village=*&screen=forum&screenmode=view_forum&forum_id=*&mode=new_thread | |
// ==/UserScript== | |
function theStandDeff97() { | |
"use strict" | |
let api = typeof unsafeWindow != 'undefined' ? unsafeWindow.ScriptAPI : window.ScriptAPI; | |
var win = typeof unsafeWindow != 'undefined' ? unsafeWindow : window; | |
let ForenthreadName = typeof win.ForenthreadName != 'undefined' ? win.ForenthreadName : "Standdeff"; | |
if ($(`span[class$=selected]:contains('${ForenthreadName}')`, $(".forum-container")).length > 0) { | |
let local = localStorage | |
let urlParams = new URLSearchParams(window.location.href); | |
if (urlParams.get("mode") === "new_thread") { | |
let tbBows = game_data.units.includes("archer") ? `<img src="https://dsde.innogamescdn.com/asset/b5d78b17/graphic/unit/[email protected]" title="Bogensch\u00FCtze" alt="" class="" style="width: 15px; height: 15px"> | |
<input type="text" class="inputBow" id="inputBow" style="width:70px;background-color:#EAD5AA">` : ""; | |
let settingsBtn = `<input type="button" style="background-image: url(https://dsde.innogamescdn.com/asset/7b986b1a/graphic//buildings/smith.png); | |
background-repeat: no-repeat; width:20px;height:20px; border: none; cursor: pointer; background-color: transparent; margin-left:7px;" class="configbtn">` | |
let config = `<br><div class="configs" style="display: none; width: 95%;margin-left: auto;margin-bottom: 20px; | |
margin-right: auto;"> | |
<img src="https://dsde.innogamescdn.com/asset/b5d78b17/graphic/unit/[email protected]" title="Speertr\u00E4ger" alt="" class="" style="width: 15px; height: 15px"> | |
<input type="text" class="inputSpear" id="inputSpear" style="width:70px;background-color:#EAD5AA;margin-right: 10px"> | |
<img src="https://dsde.innogamescdn.com/asset/b5d78b17/graphic/unit/[email protected]" title="Schwertk\u00E4mpfer" alt="" class="" style="width: 15px; height: 15px"> | |
<input type="text" class="inputSword" id="inputSword" style="width:70px;background-color:#EAD5AA;margin-right: 10px"> ` + tbBows + ` | |
<br> | |
<br> | |
<input type="button" class="btn" id="setupTable" value="SD Tabelle generieren"> | |
</div> | |
` | |
$(".clearfix > h2").append(settingsBtn) | |
$(".clearfix > h2").append(config) | |
$(".configbtn").on("click", swapconfig) | |
$("#setupTable").on("click", setupTable) | |
function swapconfig() { | |
if ($(".configs").css("display") === "none") { | |
$(".configs").css("display", "block") | |
} else { | |
$(".configs").css("display", "none") | |
} | |
} | |
const createPaketString = (troopArray) => { | |
let text = ""; | |
let paketRows = Math.max(parseInt(troopArray[0].length), parseInt(troopArray[1].length), game_data.units.includes("archer") ? parseInt(troopArray[2].length) : null) | |
for (let i = 0; i < paketRows; i++) { | |
let index = 0; | |
troopArray.forEach(element => { | |
text += index === 0 ? `[unit]spear[/unit][i]${element[i] === undefined ? "0" : element[i]}[/i] ` : ""; | |
text += index === 1 ? `[unit]sword[/unit][i]${element[i] === undefined ? "0" : element[i]}[/i] ` : ""; | |
text += index === 2 && game_data.units.includes("archer") ? `[unit]archer[/unit][i]${element[i] === undefined ? "0" : element[i]}[/i] ` : ""; | |
index++; | |
}) | |
text += "\n" | |
} | |
return text; | |
} | |
function setupTable() { | |
let troopArray = []; | |
let spear = $("#inputSpear").val().split(",") | |
let sword = $("#inputSword").val().split(",") | |
let bow = game_data.units.includes("archer") ? $("#inputBow").val().split(",") : null; | |
troopArray.push(spear, sword, bow); | |
let paketText = createPaketString(troopArray) | |
let text = `[b]SD Tabelle Paketsystem[/b] | |
[table] | |
[**]ID[||]Dorfkoordinaten[||]angefordert[||]noch ben\u00F6tigt [||]Spieler[||]Bemerkung[/**] | |
[/table] | |
[b]1 Paket =[/b] | |
${paketText} | |
[spoiler=Erkl\u00E4rung Paketsystem]Zur Vereinfachung des Standdeffschickens wird ein Paketsystem verwendet. | |
-regt zum Splitten an | |
-einheitliche Bunker und keine komischen Ausrutscher | |
-Rechnung innerhalb des Skriptes einfacher :) | |
-das Pflegen der Tabelle w\u00E4re auch ohne Skript einfacher | |
Empfohlen wird die Verwendung des [url=https://forum.die-staemme.de/index.php?pages/userscripts/]DS-UI erweitern[/url] Userscriptes, da dieses unter Massenunterst\u00FCtzen(zu finden im Versammlungsplatz) die D\u00F6rfer, aus denen geschickt wird, anzeigt. | |
[spoiler=bspBild][img]https://i.imgur.com/s9jSCET.png[/img][/spoiler] | |
Diese beispielhaften "74" k\u00F6nnen dann einfach zusammen mit der ID des Zieldorfes (aus der SD Tabelle) ins Forum geschrieben werden. | |
((Alternativ kann man nat\u00FCrlich auch drauf achten wie viele D\u00F6rfer sich in der SD Splits Gruppe befinden oder aber nach dem Abschicken schauen wie viele UTs von einem auf das Zieldorf laufen (Befehle von anderen \u00FCber die Befehlsteilung ausblenden empfohlen))) | |
Wie das genau im Forum aussehen kann/soll ist in der "Erkl\u00E4rung SD Skript" zu finden :) | |
[/spoiler] | |
[spoiler=Erkl\u00E4rung SD Skript] | |
Im folgenden wird die Funktionalit\u00E4t des Standeffskriptes erl\u00E4utert. Hierbei ist es wichtig, dass bestimmte relativ einfache Richtlinien beachtet werden. | |
Diese teilen sich, f\u00FCr normale User in "Bunker anfordern" und "Bunkeranfragen abarbeiten" auf. | |
[b]Jedoch ist jede Bearbeitung oder Anfrage in eine neue Zeile zu schreiben.[/b] | |
F\u00FCr die Moderatoren des Internen Forums ist eine Anleitung zur Bedienung des Skriptes im Spoiler zu finden. | |
[b]Bunker anfordern:[/b] | |
Beim Anfragen eines Bunkers ist es wichtig, dass ein bestimmtes Format eingehalten wird. | |
Am Anfang die Koordinate. | |
Dann ein Leerzeichen entfernt die Gr\u00F6\u00DFe des Bunkers in Paketen | |
Dann den Spielernamen in "" (Name ist optional) | |
Am Ende einen optionalen Kommentar | |
[b]Beispiele:[/b] | |
[code]567|123 200"TheHebel97"ohne den Bunker front rip | |
897|123 2"-EDM"2 Pakete f\u00FCr Bruder Marwin | |
234|123 444 "alt_f4 " mauer_f4 | |
345|123 1 "Antimacht" | |
345|123 1""[/code] | |
[b]Bunkeranfragen abarbeiten:[/b] | |
Das Wichtige beim Abarbeiten ist, dass pro Zeile 2 voneinander getrennten Zahlen zu finden sind. | |
Die erste Zahl steht hierbei f\u00FCr die ID der Anfrage. (von Anfragen die bereits in der Tabelle sind) | |
Die zweite Zahl steht hierbei f\u00FCr die Anzahl der geschickten Pakete. | |
Statt der zweiten Zahl kann auch done geschrieben werden. Was den Bunker als fertig eintr\u00E4gt. | |
[u]Wichtig: keine Koordinaten beim Abarbeiten von Anfragen verwenden![/u] | |
[b]Beispiele:[/b] | |
[code]id5 20 | |
2 20 | |
1 70Pakete | |
1abcdefg20 | |
1 done[/code] | |
[spoiler=Erkl\u00E4rung Moderation] | |
Ablauf der Aktualisierung: | |
-Bearbeiten im Post der Tabelle dr\u00FCcken | |
-Update SD Tabelle dr\u00FCcken | |
-Senden dr\u00FCcken | |
-Beitr\u00E4ge L\u00F6schen dr\u00FCcken (alle Posts sollten angehakt sein) | |
-Best\u00E4tigen | |
-Fertig :) | |
[/spoiler] | |
[/spoiler] | |
` | |
$("#message").val(text); | |
} | |
} else { | |
debugger; | |
let anfragen = []; | |
let bearbeitungen = []; | |
let threadId = urlParams.get("thread_id"); | |
let updated = !local.getItem(threadId + "sdUpdated") ? false : local.getItem(threadId + "sdUpdated") | |
let postQuant = !local.getItem(threadId + "sdPostQuant") ? 0 : local.getItem(threadId + "sdPostQuant") | |
let localSPosts = !local.getItem(threadId + "sdPosts") ? "" : local.getItem(threadId + "sdPosts").split(","); | |
//auf der ersten Seite ?? | |
let page1 = />1</.test($("td[align='right']", $(".clearfix")).text()) || !/Seite/.test($("td[align='right']", $(".clearfix")).text()) | |
if ($("#message").length > 0 && page1 && $(".vis", $(".post").first()).length > 0 && updated !== "true") { | |
//ui: | |
let updateBtn = `<a class="updateSDTabelle">Update SD Tabelle</a>` | |
if ($(".post").length > 1) { | |
$(".postheader_right", $(".igmline", $(".post").first())).append(updateBtn) | |
} | |
$(".updateSDTabelle").on("click", updateData) | |
//gather Table data: | |
let tableDataRows = $("#message").val().match(/\[\*\][\s\S]+\[\/\*\]/gm) | |
if (tableDataRows != null) { | |
let row = tableDataRows[0].split("[/*]") | |
row.forEach(element => { | |
let cells = element.split("[|]") | |
if (cells.length > 1) { //skip the empty ones | |
let id = cells[0].match(/\d+/) | |
let tempObj = { | |
id: parseInt(id), | |
koord: cells[1], | |
amountAll: parseInt(cells[2]), | |
amountNeed: parseInt(cells[3]), | |
player: cells[4].match(/(?<=\[player\]).+(?=\[\/player\])/)[0], | |
comment: cells[5] | |
} | |
anfragen.push(tempObj); | |
} | |
}) | |
} | |
} else if (page1 && updated === "true") { | |
// checkbox selecten, evtl sogar smart // oder halt auch nicht smart | |
let cbCollection = $("input[type='checkbox']"); | |
for (let i = 0; i < postQuant; i++) { | |
let id = $("a", $(cbCollection[i]).parent().parent().parent()).eq(0).attr("name") | |
localSPosts.find(element => { | |
if (element === id) { | |
$(cbCollection[i]).trigger('click'); | |
} | |
}) | |
} | |
$(".evt-confirm.btn").on("click", function () { | |
//reset updated Value | |
$(".btn-confirm-yes").on("click", function () { | |
local.setItem(threadId + "sdUpdated", false); | |
local.setItem(threadId + "sdPosts", "") | |
}) | |
}) | |
} | |
function updateData() { | |
let postsString = ""; | |
$("input[name='send']").on("click", function () { | |
local.setItem(threadId + "sdPostQuant", $(".text").length) | |
updated = true; | |
local.setItem(threadId + "sdUpdated", true); | |
local.setItem(threadId + "sdPosts", postsString) | |
}) | |
$(".updateSDTabelle").hide() | |
// add new deff requests to array | |
$(".text").each(function () { | |
postsString += $("a", $(this).parent()).eq(0).attr("name") + ","; | |
let message = $(this).text(); | |
let splittedMessage = message.split(/\r?\n/); | |
let finalMessage | |
let indexOfSignatur = splittedMessage.indexOf("______________________________") | |
if (indexOfSignatur === -1) { | |
finalMessage = splittedMessage; | |
} else { | |
finalMessage = splittedMessage.slice(0, indexOfSignatur) | |
} | |
finalMessage.forEach(element => { | |
element = element.toLowerCase() | |
if (/(\d{3}\|\d{3})\)\s.+?\s(\d+).?"(.+)?"/g.test(element)) { | |
let match = /(\d{3}\|\d{3})\)\s.+?\s(\d+).?"(.+)?"/g.exec(element) | |
let rest = /".+?"(.+)/g.exec(element) | |
let skip = 0; | |
anfragen.find(element => { | |
if (element.koord === " " + match[1] + " ") { | |
element.amountNeed = element.amountNeed + parseInt(match[2]) | |
element.amountAll = element.amountAll + parseInt(match[2]) | |
skip = 1; | |
} | |
}) | |
if (skip === 0) { | |
let tempObj = { | |
id: anfragen.length + 1, | |
koord: " " + match[1] + " ", | |
amountAll: parseInt(match[2]), | |
amountNeed: parseInt(match[2]), | |
player: match[3] === undefined ? " " : match[3], | |
comment: !rest ? "" : rest[1] | |
}; | |
anfragen.push(tempObj) | |
} | |
} else if (/\D*?(\d+)\D+?(\d+|done)\D*?/g.test(element)) { //else -> Bearbeitung einer Anfrage | |
let match = /\D*?(\d+)\D+?(\d+|done)\D*?/g.exec(element) | |
let tempObj = { | |
id: parseInt(match[1]), | |
amount: /done/g.test(match[2]) ? 10000000 : parseInt(match[2]) | |
} | |
bearbeitungen.push(tempObj) | |
} | |
}) | |
}) | |
// update data | |
bearbeitungen.forEach(request => { | |
anfragen.find(element => { | |
if (element.id === request.id) { | |
element.amountNeed = element.amountNeed - request.amount | |
} | |
}) | |
}) | |
//clean up empty rows | |
let cleanupAnfragen = []; | |
anfragen.forEach(element => { | |
if (element.amountNeed > 0) { | |
cleanupAnfragen.push(element) | |
} | |
//hier einbauen, wenn erledigte Anfragen weiterverarbeitet werden sollen oder so | |
}) | |
//fixing ids | |
let index = 1; | |
cleanupAnfragen.forEach(element => { | |
element.id = index; | |
index++; | |
}) | |
// post new table | |
let tabletext = "[**]ID[||]Dorfkoordinaten[||]angefordert[||]noch ben\u00F6tigt [||]Spieler[||]Bemerkung[/**]\n"; | |
cleanupAnfragen.forEach(row => { | |
tabletext = tabletext + `[*]${row.id}[|]${row.koord}[|]${row.amountAll}[|]${row.amountNeed}[|][player]${row.player}[/player][|]${row.comment}[/*]\n` | |
}) | |
updateTable(tabletext); | |
} | |
function updateTable(tableText) { | |
let oldText = $("#message").val() | |
let twoParts = oldText.split("[/table]") | |
let finalText = `[b]SD Tabelle Paketsystem[/b] | |
[table] | |
${tableText}[/table]${twoParts[1]}` | |
$("#message").val(finalText); | |
} | |
} | |
} | |
} | |
theStandDeff97(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment