3 && !str_ends_with($parts[0], "e") && $parts[0] !== "Filly") { if (str_contains($parts[0], "/")) { return explode("/", $parts[0])[0]; } else { return $parts[0]; } } else { return $name; } } } if (!function_exists("getSystemMember")) { function getSystemMember(string $system, string $id) { $systemID = $system; $members = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$systemID-members.json"), true); $member = null; foreach ($members as $m) { if ($m["id"] === $id) $member = $m; } return $member; } } if (!function_exists("timeAgo")) { function timeAgo($time): string { if (!is_numeric($time)) { $time = strtotime($time); } $periods = ["second", "minute", "hour", "day", "week", "month", "year", "age"]; $lengths = array("60", "60", "24", "7", "4.35", "12", "100"); $now = time(); $difference = $now - $time; if ($difference <= 10 && $difference >= 0) { return $tense = "now"; } elseif ($difference > 0) { $tense = "ago"; } else { $tense = "later"; } for ($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) { $difference /= $lengths[$j]; } $difference = round($difference); $period = $periods[$j] . ($difference >1 ? "s" :''); return "{$difference} {$period} {$tense}"; } } function _header_getMember(string $id, $system) { $members = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system-members.json"), true); $member = null; foreach ($members as $m) { if ($m["id"] === $id) $member = $m; } return $member; } function _header_memberPartOfSubsystem(array $member) { global $subsystems; $is = false; foreach ($subsystems as $subsystem) { if (in_array($member["id"], $subsystem["members"])) { $is = true; } } return $is; } function _header_getSubsystemFromMember(array $member) { global $subsystems; $ss = false; foreach ($subsystems as $subsystem) { if (in_array($member["id"], $subsystem["members"])) { $ss = $subsystem; } } return $ss; } function getMemberBannerData(string $id, string $system) { global $subsystems; global $travelling; $subsystems = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system-subsystems.json"), true) ?? []; $member = getSystemMember($system, $id); $metadata = parseMetadata(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system-$id-metadata.json"), true)); $prn = getMemberPronouns($member['pronouns']); $prefixes = []; foreach ($member['proxy_tags'] as $proxy) { if ($travelling[$member['id']]["travelling"]) { $prefixes[] = "+" . $proxy["prefix"] . ($proxy["suffix"] !== "" && $proxy["suffix"] !== null ? "..." . $proxy["suffix"] : ""); } else { $prefixes[] = $proxy["prefix"] . ($proxy["suffix"] !== "" && $proxy["suffix"] !== null ? "..." . $proxy["suffix"] : ""); } } $lastFronted = null; if (!$metadata["median"]) { $fronters = array_map(function ($item) { return $item["id"]; }, json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system-fronters.json"), true)["members"]); if (in_array($id, $fronters)) { $lastFronted = [ 'now' => true, 'relative' => timeAgo(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system-fronters.json"), true)["timestamp"]), 'absolute' => date("D j M Y, G:i:s (e)", strtotime(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system-fronters.json"), true)["timestamp"])), 'timestamp' => strtotime(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system-fronters.json"), true)["timestamp"]), 'duration' => [ 'seconds' => null, 'pretty' => null ] ]; } else { $switches = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system-switches.json"), true); $thisMember = array_filter($switches, function ($item) { global $memberData; return in_array($memberData["id"], $item["members"]); }); $thisMember = array_values($thisMember); $frontingEnd = null; if (count($thisMember) > 0) { $thisIndex = array_search($thisMember[0], $switches); $frontingStart = $thisMember[0]; $frontingEnd = $switches[$thisIndex - 1]; } if ($frontingEnd !== null && isset($frontingStart)) { $seconds = (strtotime($frontingEnd["timestamp"]) - strtotime($frontingStart["timestamp"])); $lastFronted = [ 'now' => false, 'relative' => timeAgo($frontingEnd["timestamp"]), 'absolute' => date("D j M Y, G:i:s (e)", strtotime($frontingEnd["timestamp"])), 'timestamp' => strtotime($frontingEnd["timestamp"]), 'duration' => [ 'seconds' => $seconds, 'pretty' => $seconds . " seconds" ] ]; if ($seconds > 60) { if ($seconds > 3600) { $lastFronted['duration']['pretty'] = round($seconds / 3600) . " hours"; } else { $lastFronted['duration']['pretty'] = round($seconds / 60) . " minutes"; } } } } } $speciesList = []; foreach ($metadata["species"] ?? [] as $species) { $name = match ($species) { "earth" => $metadata["robot"] ? "Robot earth pony" : "Earth pony", "alicorn" => $metadata["robot"] ? "Robot alicorn" : "Alicorn", "crystal" => $metadata["robot"] ? "Robot crystal pony" : "Crystal pony", "pegasus" => $metadata["robot"] ? "Robot pegasus" : "Pegasus", "batpony" => $metadata["robot"] ? "Robot bat pony" : "Bat pony", "unicorn" => $metadata["robot"] ? "Robot unicorn" : "Unicorn", default => $species . "_" . $metadata["robot"] }; $speciesList[] = [ "id" => $species, "name" => $name, "robot" => $metadata["robot"], "icon" => $species . ($metadata["robot"] ? "-robot" : "") . ".png" ]; } $systemData = []; $systemData['page'] = "/" . ($system === "gdapd" ? "raindrops" : "cloudburst"); $systemData['icon'] = ($system === "gdapd" ? "raindrops" : "cloudburst") . ".png"; $systemData['name'] = $system === "gdapd" ? "Raindrops" : "Cloudburst"; $systemData['full_name'] = $system === "gdapd" ? "Raindrops System" : "Cloudburst System"; $systemData['subsystem'] = null; $systemData['temporary'] = false; if (_header_memberPartOfSubsystem($member) && _header_getSubsystemFromMember($member)["source_type"] !== "member") { $subsystem = _header_getSubsystemFromMember($member); $systemData['subsystem'] = [ "page" => $systemData['page'] . "/-/subsystem/" . $subsystem["source"], "icon" => "ss-$subsystem[source].png", "name" => file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system-subsystem-$subsystem[source].json") ? json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system-subsystem-$subsystem[source].json"), true)["name"] : $subsystem["source"] ]; } if ($travelling[$member['id']]["travelling"]) { $systemData['page'] = "/" . ($system === "gdapd" ? "cloudburst" : "raindrops"); $systemData['icon'] = ($system === "gdapd" ? "cloudburst" : "raindrops") . ".png"; $systemData['name'] = $system === "gdapd" ? "Cloudburst" : "Raindrops"; $systemData['full_name'] = $system === "gdapd" ? "Cloudburst System" : "Raindrops System"; $systemData['subsystem'] = null; $systemData['temporary'] = true; } $marefriends = []; foreach ($metadata["marefriends"] as $marefriend) { $mfSystem = explode("/", $marefriend)[0]; $mfMemberID = explode("/", $marefriend)[1]; $mfMember = array_filter(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$mfSystem-members.json"), true), function ($item) use ($mfMemberID) { return $item["id"] === $mfMemberID; }); sort($mfMember); $mfMember = $mfMember[0]; $marefriends[] = [ "id" => $marefriend, "link" => "/" . ($mfSystem === "gdapd" ? "raindrops" : "cloudburst") . "/" . ($mfMember["name"]), "icon" => "pt" . (file_exists($_SERVER['DOCUMENT_ROOT'] . "/assets/uploads/pt-" . $mfMember['name'] . ".png") ? "-" . $mfMember['name'] : "") . ".png", "name" => getMiniName($mfMember["display_name"] ?? $mfMember["name"]), "full_name" => $mfMember["display_name"] ?? $mfMember["name"] ]; } $sisters = []; foreach ($metadata["sisters"] as $marefriend) { $mfSystem = explode("/", $marefriend)[0]; $mfMemberID = explode("/", $marefriend)[1]; $mfMember = array_filter(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$mfSystem-members.json"), true), function ($item) use ($mfMemberID) { return $item["id"] === $mfMemberID; }); sort($mfMember); $mfMember = $mfMember[0]; $sisters[] = [ "id" => $marefriend, "link" => "/" . ($mfSystem === "gdapd" ? "raindrops" : "cloudburst") . "/" . ($mfMember["name"]), "icon" => "pt" . (file_exists($_SERVER['DOCUMENT_ROOT'] . "/assets/uploads/pt-" . $mfMember['name'] . ".png") ? "-" . $mfMember['name'] : "") . ".png", "name" => getMiniName($mfMember["display_name"] ?? $mfMember["name"]), "full_name" => $mfMember["display_name"] ?? $mfMember["name"] ]; } $caretakers = null; if ($metadata["little"] === 2) { $caretakers = []; foreach ($metadata["caretakers"] as $marefriend) { $mfSystem = explode("/", $marefriend)[0]; $mfMemberID = explode("/", $marefriend)[1]; $mfMember = array_filter(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$mfSystem-members.json"), true), function ($item) use ($mfMemberID) { return $item["id"] === $mfMemberID; }); sort($mfMember); $mfMember = $mfMember[0]; $caretakers[] = [ "id" => $marefriend, "link" => "/" . ($mfSystem === "gdapd" ? "raindrops" : "cloudburst") . "/" . ($mfMember["name"]), "icon" => "pt" . (file_exists($_SERVER['DOCUMENT_ROOT'] . "/assets/uploads/pt-" . $mfMember['name'] . ".png") ? "-" . $mfMember['name'] : "") . ".png", "name" => getMiniName($mfMember["display_name"] ?? $mfMember["name"]), "full_name" => $mfMember["display_name"] ?? $mfMember["name"] ]; } } $badges = []; if ($metadata["host"] ?? false) { if (!$travelling[$member['id']]["travelling"]) { $badges[] = [ "id" => "host", "color" => "primary", "html" => 'Host' ]; } } if ($metadata["fictive"] ?? false) { $badges[] = [ "id" => "fictive", "color" => "info", "html" => 'Fictive' ]; } if ($metadata["protector"] ?? false) { $badges[] = [ "id" => "protector", "color" => "black", "html" => 'Protector' ]; } if (($metadata["little"] ?? 0) === 2) { $badges[] = [ "id" => "little", "color" => "success", "html" => 'Little' ]; } if (($metadata["little"] ?? 0) === 3) { $badges[] = [ "id" => "younger", "color" => "dark", "html" => 'Younger' ]; } if (($metadata["little"] ?? 0) === 1) { if ($metadata["regression"] !== null && $metadata["regression"] !== false) { $regression = _header_getMember($metadata["regression"], $system); $badges[] = [ "id" => "regressor_median", "color" => "secondary", "html" => 'Age regresses into '. (getMiniName($regression["display_name"] ?? $regression["name"])) . '' ]; } else { $badges[] = [ "id" => "regressor", "color" => "secondary", "html" => 'Age regressor' ]; } } if ($metadata["median"] !== null && $metadata["median"] !== false) { $source = _header_getMember($metadata["median"], $system); if ($metadata["little"] > 0) { $badges[] = [ "id" => "regressed", "color" => "warning", "html" => 'Age regressed from ' . (getMiniName($source["display_name"] ?? $source["name"])) . '' ]; } else { $badges[] = [ "id" => "facet", "color" => "light", "html" => 'Facet of ' . getMiniName($source["display_name"] ?? $source["name"]) . '' ]; } } return [ 'id' => $member['name'], 'color' => $member["color"] ?? "000000", 'icon' => [ "online" => $member['avatar_url'], "offline" => "pf-$system-$id.webp" ], 'median' => $metadata["median"], 'little' => $metadata["little"] === 2, 'name' => $member["display_name"] ?? $member["name"], 'badges' => $badges, 'prefixes' => $prefixes, 'pronouns' => getTooltipsFromMark($member["pronouns"]) ?? "she/her", 'pronouns_usage' => $prn, 'last_fronted' => $lastFronted, 'species' => $speciesList, 'system' => $systemData, 'relations' => [ 'marefriends' => $marefriends, 'sisters' => $sisters, 'caretakers' => $caretakers ] ]; }