var numberOfHiddenCommunities = 0; function onLoad(timestamp) { setLastChecked(timestamp); hideBadCommunities(); sortTable(2); // 2 == Name createJoinLinkButtons(); } function displayQRModal(communityID) { const modalID = "modal_" + communityID; const modal = document.getElementById(modalID); modal.style.display = "block"; } function hideQRModal(communityID) { const modalID = "modal_" + communityID; const modal = document.getElementById(modalID); modal.style.display = "none"; } function createJoinLinkButtons() { const elements = document.getElementsByClassName("td_join_url"); Array.from(elements).forEach((td_element) => { const a_href = td_element.getElementsByTagName('a')[0]; // get first (only) element const join_link = a_href.getAttribute("href"); // get link const cell_content = join_link.substring(0, 31) + "..."; td_element.innerHTML = cell_content; }); } function hideBadCommunities() { const testCommunityIDs = [ "2e9345+c7fb", // TestRoom "762ba9+c7fb", // TesterRoom "b4d829+c7fb", // Test "e5853a+c7fb", // testtest "fishing+8e2e", // Example from here: https://github.com/oxen-io/session-pysogs/blob/0a5a58eb9f53e78f9ec93d2357cec3db18cefe79/administration.md "test+118d", // Testing 1, 2, 3 "test+13f6", // Testing room "test+c01b", // Testing room "test+fe93", // 测试(Test) "xyz+efca", // XYZ Room ]; const badCommunityIDs = [ "60fa60+c7fb", // "N-word" Community "ab1a4d+c7fb", // zUnsensored Group (CSAM) "gore+e5e0" // gore ]; // These communities should be checked regularly in case they updated their PySOGS version const legacyCommunitiyIDs = [ "Ukraine+02bd" // https://reccacon.com/view/room/Ukraine ]; testCommunityIDs.forEach(hideElementByID); badCommunityIDs.forEach(hideElementByID); legacyCommunitiyIDs.forEach(hideElementByID); const summary = document.getElementById("td_summary"); summaryNew = summary.innerHTML + " (" + numberOfHiddenCommunities + " hidden)"; summary.innerHTML = summaryNew; } function hideElementByID(id) { const element = document.getElementById(id); if(element != null) { element.remove(); numberOfHiddenCommunities++; } } function copyToClipboard(text) { navigator.clipboard.writeText(text); // Snackbar const snackbar = document.getElementById("copy-snackbar"); // Add the "show" class to DIV snackbar.className = "show"; // After 3 seconds, remove the show class from DIV setTimeout(function(){ snackbar.className = snackbar.className.replace("show", ""); }, 3000); } function setLastChecked(timestamp) { const now = Math.floor(Date.now() / 1000); // timestamp in seconds const time_passed_in_seconds = now - timestamp; const time_passed_in_minutes = Math.floor(time_passed_in_seconds / 60); // time in minutes, rounded down const td_last_checked = document.getElementById("td_last_checked"); td_last_checked.innerHTML = "Last checked " + time_passed_in_minutes + " minutes ago."; } function sortTable(n) { var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0; table = document.getElementById("tbl_communities"); switching = true; // Set the sorting direction to ascending: dir = "asc"; // Make a loop that will continue until no switching has been done: while (switching) { // Start by saying: no switching is done: switching = false; rows = table.rows; // Loop through all table rows (except the first, which contains table headers): for (i = 1; i < (rows.length - 1); i++) { // Start by saying there should be no switching: shouldSwitch = false; // Get the two elements you want to compare, one from current row and one from the next: x = rows[i].getElementsByTagName("TD")[n]; y = rows[i + 1].getElementsByTagName("TD")[n]; // Check if the two rows should switch place, based on the direction, asc or desc: if (dir == "asc") { // If columns is users (4), sort numerically if ( n == 4 ) { if (Number(x.innerHTML) > Number(y.innerHTML)) { shouldSwitch = true; break; } } else if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) { // If so, mark as a switch and break the loop: shouldSwitch = true; break; } } else if (dir == "desc") { if ( n == 4 ) { // If columns is users (4), sort numerically if (Number(x.innerHTML) < Number(y.innerHTML)) { shouldSwitch = true; break; } } else if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) { // If so, mark as a switch and break the loop: shouldSwitch = true; break; } } } if (shouldSwitch) { // If a switch has been marked, make the switch and mark that a switch has been done: rows[i].parentNode.insertBefore(rows[i + 1], rows[i]); switching = true; // Each time a switch is done, increase this count by 1: switchcount ++; } else { // If no switching has been done AND the direction is "asc", set the direction to "desc" and run the while loop again. if (switchcount == 0 && dir == "asc") { dir = "desc"; switching = true; } } } }