Created
December 12, 2023 12:15
-
-
Save arlm/d3ad33294b1d75585eeeaabda9d53a09 to your computer and use it in GitHub Desktop.
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
var articles = []; | |
var maps = []; | |
var execRegex = function (regex, callback, buffer) { | |
var matches = regex.exec(buffer); | |
if ((matches?.length ?? 0) > 0) { | |
callback(matches); | |
return buffer.replace(regex, ""); | |
} | |
return buffer; | |
}; | |
[].forEach.call(document.querySelectorAll("div[role='article']"), function(item, index, array) { | |
var article = { | |
"sender" : { | |
"name" : "", // div:nth-child(1) > h2 span > span => text | |
"profile_url" : "", // div:nth-child(1) > img => src | |
}, | |
"message_content" : "", // div:nth-child(1) > img ~ h2 ~ div => text | |
"map": "", // div:nth-child(2) > div > div > a => href | |
"game": "", | |
"winner": { | |
"user":"", | |
"power": "", | |
"score": "", | |
}, | |
"defeated":{ | |
"user" : "", | |
"power" : "", | |
"score": "", | |
}, | |
"year": "", | |
"season": "", | |
"score": { | |
"NATO": 0, | |
"USSR": 0, | |
}, | |
"NMR": 0, | |
"victory_type": "", | |
}; | |
article.sender.name = item.querySelector("h2 span[id^='message-username'] > span")?.textContent; | |
article.sender.profile_url = item.querySelector("img[class^='avatar']")?.src; | |
article.map = item.querySelector("div[id^='message-accessories'] a[class^='originalLink']")?.href; | |
var contents = item.querySelectorAll("div[id^='message-content']")?.cloneNode(true); | |
if (!!content) { | |
[].forEach.call(contents, function(content) { | |
var emojis = content.querySelectorAll("span[class^='emojiContainer']"); | |
if (!!emojis) { | |
[].forEach.call(emojis, function(element) { | |
var number = element.children[0]?.alt; | |
switch (number) { | |
case "1️⃣": | |
element.replaceChild(document.createTextNode("1"), element.children[0]); | |
break; | |
case "2️⃣": | |
element.replaceChild(document.createTextNode("2"), element.children[0]); | |
break; | |
case "3️⃣": | |
element.replaceChild(document.createTextNode("3"), element.children[0]); | |
break; | |
case "4️⃣": | |
content.replaceChild(document.createTextNode("4"), element.children[0]); | |
break; | |
case "5️⃣": | |
element.replaceChild(document.createTextNode("5"), element.children[0]); | |
break; | |
case "6️⃣": | |
element.replaceChild(document.createTextNode("6"), element.children[0]); | |
break; | |
case "7️⃣": | |
element.replaceChild(document.createTextNode("7"), element.children[0]); | |
break; | |
case "8️⃣": | |
element.replaceChild(document.createTextNode("8"), element.children[0]); | |
break; | |
case "9️⃣": | |
element.replaceChild(document.createTextNode("9"), element.children[0]); | |
break; | |
case "🔟": | |
element.replaceChild(document.createTextNode("10"), element.children[0]); | |
break; | |
case "0️⃣": | |
element.replaceChild(document.createTextNode("0"), element.children[0]); | |
break; | |
} | |
element.normalize(); | |
}); | |
content.normalize(); | |
} | |
article.message_content = content.textContent; | |
var hasOnlyMap = !!article.map && !article.message_content; | |
if (hasOnlyMap && articles.length > 0) { | |
articles[articles.length - 1].map = article.map; | |
return; | |
} | |
var buffer = article.message_content; | |
if (!buffer) | |
{ | |
return; | |
} | |
buffer = buffer.replace(/\(edited\)| ,| [.:]|(?:!)!+|^\s+/gim, ""); | |
buffer = buffer.replace(/ +|\n/gim, " "); | |
buffer = execRegex(/^((?:(game|CW5?)\W+)?(?<side1>W?ea?st)\W*(?:CW5?\W+)?(?<game1>\d{1,2})|(?:(game|CW5?)\W+)?(?<game2>\d{1,2})\W+(?<side2>W?ea?st))(?:\W|$)/gi, | |
function (matches) { | |
article.game = ((matches.groups.side1 ?? matches.groups.side2) + " " + (matches.groups.game1 ?? matches.groups.game2)).toLowerCase(); | |
}, buffer); | |
buffer = execRegex(/(in )?((((?<season1>fall|autumn|spring|winter) )?(?<year1>\b\d{4})( (?<endOfYear1>EoY))?)|(\b(?<season2>F|A|S|W)(?:19)?(?<year2>\d{2}))( (?<endOfYear2>EoY))?)/gi, | |
function (matches) { | |
article.year = matches.groups.year1 ?? "19" + matches.groups.year2; | |
article.season = (matches.groups.season1 ?? matches.groups.season2 ?? matches.groups.endOfYear1 ?? matches.groups.endOfYear2)?.toLowerCase(); | |
switch (article.season) { | |
case "autumn": | |
article.season = "fall"; | |
break; | |
case "eoy": | |
article.season = "winter"; | |
break; | |
case undefined: | |
article.season = "fall (inferred)" | |
} | |
}, | |
buffer); | |
var hasScore = false; | |
var winner = 0; | |
var defeated = 0; | |
buffer = execRegex(/\(?(?:by )?(?<score1>\d{1,2}) ?[-:] ?(?<score2>\d{1,2})\)?/gi, | |
function (matches) { | |
var score1 = +matches.groups.score1; | |
var score2 = +matches.groups.score2; | |
hasScore = !!score1 && !!score2; | |
if (hasScore) { | |
winner = score1 > score2 ? score1 : score2; | |
defeated = score1 > score2 ? score2 : score1; | |
} | |
}, | |
buffer); | |
if (!hasScore) { | |
buffer = execRegex( /(?:\(?NATO\)?:? ?)(?<nato>\d{1,2})/gi, | |
function (matches) { | |
article.score.NATO = matches.groups.nato; | |
}, | |
buffer); | |
buffer = execRegex(/(?:\(?USSR\)?:? ?)(?<ussr>\d{1,2})/gi, | |
function(matches) { | |
article.score.USSR = matches.groups.ussr; | |
}, | |
buffer); | |
} | |
buffer = execRegex(/(?<nmr>nmr)( (?<times>\d) times?)?/i, | |
function (matches) { | |
article.NMR = !!matches.groups.nmr ? (!!matches.groups.times ? matches.groups.times : 1) : 0; | |
}, | |
buffer); | |
buffer = buffer.replace(/\(edited\)| ,| [.:]|(?:!)!+|^\s+/gim, ""); | |
buffer = buffer.replace(/ +|\n/gim, " "); | |
buffer = execRegex(/(?:ends )?(?:\b(by|via) )?(?:\ba )?(?<state>conce(de|ssion)|resign(ation|ed)|time|forfeit)/gi, | |
function (matches) { | |
article.victory_type = matches.groups.state.toLowerCase() ?? "victory"; | |
switch (article.victory_type) { | |
case "concede": | |
case "conceded": | |
case "concession": | |
case "resign": | |
case "resigns": | |
case "resignation": | |
case "resigned": | |
article.victory_type = "concession"; | |
break; | |
case "time": | |
case "timeout": | |
article.victory_type = "concession"; | |
break; | |
default: | |
article.victory_type = "victory"; | |
break; | |
} | |
}, | |
buffer); | |
buffer = execRegex(/@?(?<userName1>[⭐a-z0-9_][⭐a-z0-9 _\-.!]+)#?(=?\s*\(?(?<power1>NATO|USSR|URSS)\)?\??)\s*(?<action>(was )?defeat(s|ed)( by)?|over|w[io]ns?( against)?|lost|beats|vs?)?,?\s+@?(?<userName2>[⭐a-z0-9_][⭐a-z0-9 _\-.!]+(\(France\))?)#?(=?\s*\(?(?<power2>NATO|USSR|URSS)\)?)/gi, | |
function (matches) { | |
if (!!matches.groups.score1 && !!matches.groups.score2) { | |
var score1 = +matches.groups.score1; | |
var score2 = +matches.groups.score2; | |
winner = score1 > score2 ? score1 : score2; | |
defeated = score1 > score2 ? score2 : score1; | |
} | |
var party1 = matches.groups.userName1; | |
var power1 = matches.groups.power1.toUpperCase(); | |
if (power1 == "URSS") { | |
power1 = "USSR"; | |
} | |
var action = matches.groups.action; | |
var party2 = matches.groups.userName2; | |
var power2 = matches.groups.power2.toUpperCase(); | |
if (power2 == "URSS") { | |
power2 = "USSR"; | |
} | |
if (action == "defeated by" || action == "lost") { | |
article.winner.user = party2; | |
article.winner.power = power2; | |
article.winner.score = winner ; | |
article.defeated.user = party1; | |
article.defeated.power = power1; | |
article.defeated.score = defeated; | |
article.score.NATO = power2 == "NATO" ? winner : defeated; | |
article.score.USSR = power2 == "USSR" ? winner : defeated; | |
} else { | |
article.winner.user = party1; | |
article.winner.power = power1; | |
article.winner.score = winner; | |
article.defeated.user = party2; | |
article.defeated.power = power2; | |
article.defeated.score = defeated; | |
article.score.NATO = power1 == "NATO" ? winner : defeated; | |
article.score.USSR = power1 == "USSR" ? winner : defeated; | |
} | |
}, | |
buffer); | |
buffer = execRegex(/@?(?<userName1>[⭐a-z0-9_][⭐a-z0-9 _\-.!]+)\s*(?<action>(was )?defeat(s|ed)( by)?|over|w[io]ns?( against)?|lost|beats|vs?),?\s*@?(?<userName2>[⭐a-z0-9_][⭐a-z0-9 _\-.!]+(\(France\))?)?/gi, | |
function (matches) { | |
var party1 = matches.groups.userName1; | |
var action = matches.groups.action; | |
var party2 = matches.groups.userName2; | |
if (action == "defeated by" || action == "lost") { | |
article.winner.user = party2; | |
article.defeated.user = party1; | |
} else { | |
article.winner.user = party1; | |
article.defeated.user = party2; | |
} | |
if (winner > 0) { | |
article.score.winner = winner; | |
} | |
if (defeated > 0) { | |
article.score.defeated = defeated; | |
} | |
}, | |
buffer); | |
if (!!article.victory_type || article.victory_type == "") { | |
article.victory_type = "victory"; | |
} | |
if (!!article.score.NATO && !!article.score.USSR && !article.game && articles.length > 0) { | |
var prior = articles[articles.length - 1]; | |
if (!prior.score.NATO && !prior.score.USSR) { | |
prior.score.NATO = article.score.NATO; | |
prior.score.USSR = article.score.USSR; | |
prior.winner.score = prior.winner.power == "NATO" ? article.score.NATO : article.score.USSR; | |
prior.defeated.score = prior.defeated.power == "USSR" ? article.score.USSR : article.score.NATO; | |
if (!prior.map) { | |
prior.map = article.map; | |
} | |
return; | |
} | |
} | |
if (!!article.year && !article.game && articles.length > 0) { | |
var prior = articles[articles.length - 1]; | |
if (!prior.year) { | |
prior.year = article.year; | |
return; | |
} | |
} | |
if (!hasOnlyMap && (!!article.game && !!article.message_content)) { | |
articles.push(article); | |
} | |
}); | |
}); | |
var messagesOnly = articles.filter(function(i) { return !!i.message_content }).map(function(i) { return i.message_content }); | |
var mapsOnly = articles.filter(function(i) { return !!i.map }).map(function(i) { return {"name": i.game, "image": i.map} }); | |
var noMapsOnly = articles.filter(function(i) { return !i.map }).map(function(i) { return i }); | |
var noScore = articles.filter(function(i) { return !i.score.NATO || !i.score.USSR || !i.winner.score || !i.defeated.score }).map(function(i) { return i }); | |
var curl = ""; | |
[].forEach.call(articles, function(item) { | |
var downloadURI = function(uri, name) { | |
var link = document.createElement("a"); | |
link.download = name; | |
link.href = uri; | |
document.body.appendChild(link); | |
link.click(); | |
document.body.removeChild(link); | |
delete link; | |
} | |
var map = { | |
"name" : "", | |
"url" : "", | |
}; | |
if (!item.map) { | |
return; | |
} | |
var winner_power = !!item.winner.power ? " (" + item.winner.power + ")" : ""; | |
var defeated_power = !!item.defeated.power ? " (" + item.defeated.power + ")" : ""; | |
var hasNMR = item.NMR > 0; | |
var isNotVictory = item.victory_type != "victory"; | |
var nmr = item.NMR > 0 ? item.NMR + " " + " NMRs" : ""; | |
var comna = item.NMR > 0 && item.victory_type != "victory" ? ", " : ""; | |
var victory = item.victory_type != "victory" ? item.victory_type : ""; | |
map.name = item.game.charAt(0).toUpperCase() + item.game.slice(1) + " - " + item.winner.user + winner_power + " defeated " + item.defeated.user + defeated_power + " by " + item.winner.score + "x" + item.defeated.score + " in " + item.season + " " + item.year + ( (hasNMR || isNotVictory) ? " (" + nmr + comna + victory + ")" : "") + "." + item.map.split('.').pop(); | |
map.url = item.map; | |
if (!!map.name) { | |
maps.push(map); | |
curl += "curl "+ map.url + " --output \"" + map.name + "\" &&\n"; | |
} | |
}); | |
articles; | |
var messages = []; | |
[].forEach.call(document.querySelectorAll("div[role='article'] div[id^='message-content']"), function(item) { | |
var content =item.cloneNode(true); | |
if (!!content) { | |
var emojis = content.querySelectorAll("span[class^='emojiContainer']"); | |
if (!!emojis) { | |
[].forEach.call(emojis, function(element) { | |
var number = element.children[0]?.alt; | |
switch (number) { | |
case "1️⃣": | |
element.replaceChild(document.createTextNode("1"), element.children[0]); | |
break; | |
case "2️⃣": | |
element.replaceChild(document.createTextNode("2"), element.children[0]); | |
break; | |
case "3️⃣": | |
element.replaceChild(document.createTextNode("3"), element.children[0]); | |
break; | |
case "4️⃣": | |
content.replaceChild(document.createTextNode("4"), element.children[0]); | |
break; | |
case "5️⃣": | |
element.replaceChild(document.createTextNode("5"), element.children[0]); | |
break; | |
case "6️⃣": | |
element.replaceChild(document.createTextNode("6"), element.children[0]); | |
break; | |
case "7️⃣": | |
element.replaceChild(document.createTextNode("7"), element.children[0]); | |
break; | |
case "8️⃣": | |
element.replaceChild(document.createTextNode("8"), element.children[0]); | |
break; | |
case "9️⃣": | |
element.replaceChild(document.createTextNode("9"), element.children[0]); | |
break; | |
case "🔟": | |
element.replaceChild(document.createTextNode("10"), element.children[0]); | |
break; | |
case "0️⃣": | |
element.replaceChild(document.createTextNode("0"), element.children[0]); | |
break; | |
} | |
element.normalize(); | |
}); | |
} | |
content.normalize(); | |
} | |
var buffer = content.innerText; | |
buffer = buffer.replace(/\(edited\)| ,| [.:]|(?:!)!+|^ +|\\n/gi, ""); | |
buffer = buffer.replace(/ +/g, " "); | |
messages.push(buffer) | |
}); | |
[...new Set(messages)]; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment