Skip to content

Instantly share code, notes, and snippets.

@arlm
Created December 12, 2023 12:15
Show Gist options
  • Save arlm/d3ad33294b1d75585eeeaabda9d53a09 to your computer and use it in GitHub Desktop.
Save arlm/d3ad33294b1d75585eeeaabda9d53a09 to your computer and use it in GitHub Desktop.
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