| 
							
								 | 
							
							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) <a> element
 | 
						
						
						
						
							 | 
							
								 | 
							
									const join_link = a_href.getAttribute("href"); // get link
 | 
						
						
						
						
							 | 
							
								 | 
							
									const cell_content = join_link.substring(0, 31) + "...<button class=\"copy_button\" onclick=\"copyToClipboard('" + join_link + "')\">Copy</button>";
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
									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;
 | 
						
						
						
						
							 | 
							
								 | 
							
										}
 | 
						
						
						
						
							 | 
							
								 | 
							
									}
 | 
						
						
						
						
							 | 
							
								 | 
							
								}
 | 
						
						
						
						
							 | 
							
								 | 
							
							}
 |