Add known servers -> // De-dupe based on base URL -> // Test domains -> De-dupe based on pubkey $options = getopt("v", ["verbose"]); if (isset($options["v"]) or isset($options["verbose"])) { $LOGGING_VERBOSITY = LoggingVerbosity::Debug; } global $CACHE_ROOT, $ROOMS_FILE, $KNOWN_SERVERS, $KNOWN_PUBKEYS; file_exists($CACHE_ROOT) or mkdir($CACHE_ROOT, 0700); // TODO: Tag information is currently discarded. Feature needs triage. $html_pages = query_known_sources(); // Find join links in each HTML document and concatenate the results. $join_links = array_merge([], ...array_map('parse_join_links', $html_pages)); /** * @var CommunityServer[] $servers */ $servers = CommunityServer::from_join_urls($join_links); // Add known hosts. $servers = [...CommunityServer::from_known_hosts($KNOWN_SERVERS, $KNOWN_PUBKEYS), ...$servers]; $servers = CommunityServer::dedupe_by_url($servers); $servers = CommunityServer::poll_reachable($servers); $servers = CommunityServer::dedupe_by_pubkey($servers); $servers_total = count($servers); $rooms_total = count_rooms($servers); // Output query results to file. log_info("Done fetching communities."); log_info( "Found $rooms_total unique Session Communities " . "on $servers_total servers." . PHP_EOL ); file_put_contents($ROOMS_FILE, json_encode($servers)); } /** * Iteratively crawls an index for individual Session Community details. * @return string[] */ function crawl_source_index($html, $url_base, $item_url_pattern) { preg_match_all($item_url_pattern, $html, $match_result); $matched_links = $match_result[0]; foreach ($matched_links as $link) { $link = $url_base . $link; log_debug("Requesting $link"); $pages[] = file_get_contents($link); log_debug($http_response_header[0]); // Supposed to be "HTTP/1.1 200 OK" } return $pages; } /** * Fetches known sources of Session * Community join links. */ function query_known_sources() { global $SOURCES; log_info("Requesting Awesome Session Group list..."); $pages_asgl[] = file_get_contents($SOURCES['ASGL']); log_debug($http_response_header[0]); // Supposed to be "HTTP/1.1 200 OK" log_info("Requesting Lokilocker Mods Open Group list..."); $pages_loki[] = file_get_contents($SOURCES['LOKI']); log_debug($http_response_header[0]); // Supposed to be "HTTP/1.1 200 OK" log_info("Requesting session.directory list..."); $pages_sdir = []; $json_sdir = json_decode(file_get_contents($SOURCES['SDIR-JSON'])); log_debug($http_response_header[0]); // Supposed to be "HTTP/1.1 200 OK" foreach ($json_sdir as $room) $pages_sdir[] = $room->url; log_info("Requesting FreeArkham.cc list..."); $pages_fark[] = file_get_contents($SOURCES['FARK']); log_debug($http_response_header[0]); // Supposed to be "HTTP/1.1 200 OK" log_info('Done fetching sources.'); return [...$pages_asgl, ...$pages_loki, ...$pages_sdir, ...$pages_fark]; } /* * Debug function to see which communities use pinned messages already */ function print_pinned_messages($room_assignments_arr) { // for each server a.k.a. public key do foreach($room_assignments_arr as $pubkey => $room_assignment) { // for every room do foreach($room_assignment[1] as $room_array) { // info: // $room_array = array( // "token" => bla, // "name" => Blabla, // "active_users" => -1, // "description" => Blabla bla bla //); $server_url = $room_assignment[0]; $room_json_url = $server_url . "/room/" . $room_array["token"]; echo($room_json_url . PHP_EOL); $contents = file_get_contents($room_json_url); if($contents) { // print_r($contents); $json_obj = json_decode($contents); $pinned_messages = $json_obj->pinned_messages; echo("Pinned messages:" . PHP_EOL); print_r($pinned_messages); } } } } // run main function main(); ?>