summaryrefslogtreecommitdiff
path: root/includes/banner.inc
diff options
context:
space:
mode:
Diffstat (limited to 'includes/banner.inc')
-rw-r--r--includes/banner.inc456
1 files changed, 456 insertions, 0 deletions
diff --git a/includes/banner.inc b/includes/banner.inc
new file mode 100644
index 0000000..a3c6f10
--- /dev/null
+++ b/includes/banner.inc
@@ -0,0 +1,456 @@
+<?php
+
+require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/session.inc"; global $isLoggedIn;
+require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/pronouns.inc";
+require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/functions.inc";
+
+$travelling = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/travelling/travelling.json"), true);
+
+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, bool $french = false) {
+ global $subsystems;
+ global $travelling;
+ global $isLoggedIn;
+
+ $subsystems = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/subsystems/$system.json"), true) ?? [];
+
+ $member = getSystemMember($system, $id);
+ $metadata = file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/metadata/$id.json") ? parseMetadata(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/metadata/$id.json"), true)) : parseMetadata([
+ "bitset" => 4196352,
+ "regression" => null,
+ "median" => null,
+ "marefriends" => [],
+ "sisters" => [],
+ "caretakers" => []
+ ]);
+
+ $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 . ($french ? " secondes" : " seconds")
+ ]
+ ];
+ if ($french) {
+ if ($seconds > 60) {
+ if ($seconds > 3600) {
+ $lastFronted['duration']['pretty'] = round($seconds / 3600) . " heures";
+ } else {
+ $lastFronted['duration']['pretty'] = round($seconds / 60) . " minutes";
+ }
+ }
+ } else {
+ 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) {
+ if ($french) {
+ $name = match ($species) {
+ "earth" => $metadata["robot"] ? "Robot poney terrestre" : (!$metadata["plush"] ? "Poney terrestre" : "Poney terrestre en peluche"),
+ "alicorn" => $metadata["robot"] ? "Robot alicorne" : (!$metadata["plush"] ? "Alicorne" : "Alicorne en peluche"),
+ "crystal" => $metadata["robot"] ? "Robot poney de crystal" : (!$metadata["plush"] ? "Poney de crystal" : "Poney de crystal en peluche"),
+ "pegasus" => $metadata["robot"] ? "Robot pégase" : (!$metadata["plush"] ? "Pégase" : "Pégase en peluche"),
+ "batpony" => $metadata["robot"] ? "Robot Poney chauve souris" : (!$metadata["plush"] ? "Poney chauve souris" : "Poney chauve souris en peluche"),
+ "unicorn" => $metadata["robot"] ? "Robot licorne" : (!$metadata["plush"] ? "Licorne" : "Licorne en peluche"),
+ default => $species . "_" . $metadata["robot"]
+ };
+ } else {
+ $name = match ($species) {
+ "earth" => $metadata["robot"] ? "Robot earth pony" : (!$metadata["plush"] ? "Earth pony" : "Earth pony plush"),
+ "alicorn" => $metadata["robot"] ? "Robot alicorn" : (!$metadata["plush"] ? "Alicorn" : "Alicorn plush"),
+ "crystal" => $metadata["robot"] ? "Robot crystal pony" : (!$metadata["plush"] ? "Crystal pony" : "Crystal pony plush"),
+ "pegasus" => $metadata["robot"] ? "Robot pegasus" : (!$metadata["plush"] ? "Pegasus" : "Pegasus plush"),
+ "batpony" => $metadata["robot"] ? "Robot bat pony" : (!$metadata["plush"] ? "Bat pony" : "Bat pony plush"),
+ "unicorn" => $metadata["robot"] ? "Robot unicorn" : (!$metadata["plush"] ? "Unicorn" : "Unicorn plush"),
+ default => $species . "_" . $metadata["robot"]
+ };
+ }
+
+ $speciesList[] = [
+ "id" => $species,
+ "name" => $name,
+ "robot" => $metadata["robot"],
+ "plush" => $metadata["plush"],
+ "icon" => $species . ($metadata["robot"] ? "-robot" : ($metadata["plush"] ? "-plush" : "")) . ".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/subsystems/$system-$subsystem[source].json") ? json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/subsystems/$system-$subsystem[source].json"), true)["name"] : $subsystem["source"]
+ ];
+ }
+
+ if ($travelling[$member['id']]["travelling"]) {
+ $systemData['page'] = "/" . ($system === "gdapd" ? "cloudburst" : "raindrops");
+ $systemData['icon'] = getAsset($system);
+ $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" => "/" . ($mfMember["name"]),
+ "icon" => getAsset($mfSystem, $mfMemberID, "heads"),
+ "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" => "/" . ($mfMember["name"]),
+ "icon" => getAsset($mfSystem, $mfMemberID, "heads"),
+ "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" => "/" . ($mfMember["name"]),
+ "icon" => getAsset($mfSystem, $mfMemberID, "heads"),
+ "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" => "mcf",
+ "color" => "primary",
+ "html" => (
+ $french
+ ?
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Fronteuse la plus présente</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' the one who fronts the most often in ' . getMemberPronouns($member['pronouns'])["possessive_det"] . ' system." class="badge rounded-pill bg-primary">Fronteuse la plus présente</span>'
+ :
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Most common fronter</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' the one who fronts the most often in ' . getMemberPronouns($member['pronouns'])["possessive_det"] . ' system." class="badge rounded-pill bg-primary">Most common fronter</span>'
+ )
+ ];
+ }
+ }
+
+ if (($metadata["age_spells"] ?? false) && !$french) {
+ $badges[] = [
+ "id" => "age_spells",
+ "color" => "#6f42c1",
+ "html" => '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Affected by age spells</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' can feel younger than ' . getMemberPronouns($member['pronouns'])["subjective"] . ' actually ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' when somepony else casts an age spell on ' . getMemberPronouns($member['pronouns'])["object"] . '." class="badge rounded-pill" style="background-color: #6f42c1;">Affected by age spells</span>'
+ ];
+ }
+
+ if ($metadata["fictive"] ?? false) {
+ $badges[] = [
+ "id" => "fictive",
+ "color" => "info",
+ "html" => (
+ $french
+ ?
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Fictive</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' based on the personality, look and behavior of a character that is fictional in this world." class="badge rounded-pill bg-info">Fictive</span>'
+ :
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Fictive</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' based on the personality, look and behavior of a character that is fictional in this world." class="badge rounded-pill bg-info">Fictive</span>'
+ )
+ ];
+ }
+
+ if ($metadata["less_frequent"] ?? false) {
+ $badges[] = [
+ "id" => "nonverbal",
+ "color" => "#fd7e14",
+ "html" => '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Fronts less often</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "front" : "fronts") . ' less often than ' . getMemberPronouns($member['pronouns'])["possessive_det"] . ' headmates, this can due to various reasons." class="badge rounded-pill" style="background-color:#fd7e14;">Fronts less often</span>'
+ ];
+ }
+
+ if ($metadata["nonverbal"] ?? false) {
+ $badges[] = [
+ "id" => "nonverbal",
+ "color" => "#20c997",
+ "html" => '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Non verbal IRL</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' non verbal in real life, although text communication is still possible." class="badge rounded-pill" style="background-color:#20c997;">Non verbal IRL</span>'
+ ];
+ }
+
+ if ($member["name"] === "fusion") {
+ $badges[] = [
+ "id" => "fusion",
+ "color" => "d63384",
+ "html" => '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Fusion</b><br>She is the result of multiple ponies purposefully merging in a way that makes them impossible to tell apart." class="badge rounded-pill" style="background-color:#d63384;">Fusion</span>'
+ ];
+ }
+
+ if (($metadata["sexually_active"] ?? false) && !$french && $isLoggedIn) {
+ $badges[] = [
+ "id" => "sexually_active",
+ "color" => "d6a833",
+ "html" => '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Sexually active</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' doing sexual acts and would pleasure ' . getMemberPronouns($member['pronouns'])["possessive_det"] . ' marefriend·s IRL if ' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' had the chance." class="badge rounded-pill" style="background-color:#d68f33;">Sexually active</span>'
+ ];
+ }
+
+ if ($metadata["protector"] ?? false) {
+ $badges[] = [
+ "id" => "protector",
+ "color" => "black",
+ "html" => (
+ $french
+ ?
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>' . (getMemberPronouns($member['pronouns'])["gender"] === "female" ? "Protectrice" : (getMemberPronouns($member['pronouns'])["gender"] === "male" ? "Protecteur" : "Protecteur·ice")) . '</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' a protector in the system and will front when somepony cannot handle it anymore." class="badge rounded-pill bg-black">' . (getMemberPronouns($member['pronouns'])["gender"] === "female" ? "Protectrice" : (getMemberPronouns($member['pronouns'])["gender"] === "male" ? "Protecteur" : "Protecteur·ice")) . '</span>'
+ :
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Protector</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' a protector in the system and will front when somepony cannot handle it anymore." class="badge rounded-pill bg-black">Protector</span>'
+ )
+ ];
+ }
+
+ if (($metadata["little"] ?? 0) === 2) {
+ $badges[] = [
+ "id" => "little",
+ "color" => "success",
+ "html" => (
+ $french
+ ?
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Petit' . (getMemberPronouns($member['pronouns'])["gender"] === "female" ? "e" : (getMemberPronouns($member['pronouns'])["gender"] === "male" ? "" : "·e")) . '</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' mentally younger, and therefore behaves and feels younger than the body is." class="badge rounded-pill bg-success">Petit' . (getMemberPronouns($member['pronouns'])["gender"] === "female" ? "e" : (getMemberPronouns($member['pronouns'])["gender"] === "male" ? "" : "·e")) . '</span>'
+ :
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Little</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' mentally younger, and therefore behaves and feels younger than the body is." class="badge rounded-pill bg-success">Little</span>'
+ )
+ ];
+ }
+
+ if (($metadata["little"] ?? 0) === 3) {
+ $badges[] = [
+ "id" => "younger",
+ "color" => "dark",
+ "html" => (
+ $french
+ ?
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Plus jeune</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' younger than the body, but not young enough to be classified as a little." class="badge rounded-pill bg-dark">Plus jeune</span>'
+ :
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Younger</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' younger than the body, but not young enough to be classified as a little." class="badge rounded-pill bg-dark">Younger</span>'
+ )
+ ];
+ }
+
+ if (($metadata["age_regressor"] ?? false)) {
+ if ($metadata["regression"] !== null && $metadata["regression"] !== false) {
+ $regression = _header_getMember($metadata["regression"], $system);
+ $badges[] = [
+ "id" => "regressor_median",
+ "color" => "secondary",
+ "html" => (
+ $french
+ ?
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Régresseur d\'âge</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' capable of regressing ' . getMemberPronouns($member['pronouns'])["possessive_det"] . ' mental age, which causes ' . getMemberPronouns($member['pronouns'])["object"] . ' to become ' . (getMiniName($regression["display_name"] ?? $regression["name"])) . ', temporarily behaving and feeling younger than the body is." class="badge rounded-pill bg-secondary">Régresse en âge en <a href="/' . $regression["name"] . '">'. (getMiniName($regression["display_name"] ?? $regression["name"])) . '</a></span>'
+ :
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Age regressor</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' capable of regressing ' . getMemberPronouns($member['pronouns'])["possessive_det"] . ' mental age, which causes ' . getMemberPronouns($member['pronouns'])["object"] . ' to become ' . (getMiniName($regression["display_name"] ?? $regression["name"])) . ', temporarily behaving and feeling younger than the body is." class="badge rounded-pill bg-secondary">Age regresses into <a href="/' . $regression["name"] . '">'. (getMiniName($regression["display_name"] ?? $regression["name"])) . '</a></span>'
+ )
+ ];
+ } else {
+ $badges[] = [
+ "id" => "regressor",
+ "color" => "secondary",
+ "html" => (
+ $french
+ ?
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Régresseur d\'âge</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' capable of regressing ' . getMemberPronouns($member['pronouns'])["possessive_det"] . ' mental age, temporarily behaving and feeling younger than the body is." class="badge rounded-pill bg-secondary">Régresseur d\'âge</span>'
+ :
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Age regressor</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' capable of regressing ' . getMemberPronouns($member['pronouns'])["possessive_det"] . ' mental age, temporarily behaving and feeling younger than the body is." class="badge rounded-pill bg-secondary">Age regressor</span>'
+ )
+ ];
+ }
+ }
+
+ if ($metadata["median"] !== null && $metadata["median"] !== false) {
+ $source = _header_getMember($metadata["median"], $system);
+ if ($metadata["little"] > 0) {
+ $badges[] = [
+ "id" => "regressed",
+ "color" => "warning",
+ "html" => (
+ $french
+ ?
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Régressée en âge</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' has regressed ' . getMemberPronouns($member['pronouns'])["possessive_det"] . ' mental age, making ' . getMemberPronouns($member['pronouns'])["object"] . ' ' . getMiniName($member["display_name"] ?? $member["name"]) . ' instead of ' . (getMiniName($source["display_name"] ?? $source["name"])) . ', temporarily behaving and feeling younger than the body is." class="badge rounded-pill bg-warning">Régressé en âge de <a href="/' . $source["name"] . '">' . (getMiniName($source["display_name"] ?? $source["name"])) . '</a></span>'
+ :
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Age regressed</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' has regressed ' . getMemberPronouns($member['pronouns'])["possessive_det"] . ' mental age, making ' . getMemberPronouns($member['pronouns'])["object"] . ' ' . getMiniName($member["display_name"] ?? $member["name"]) . ' instead of ' . (getMiniName($source["display_name"] ?? $source["name"])) . ', temporarily behaving and feeling younger than the body is." class="badge rounded-pill bg-warning">Age regressed from <a href="/' . $source["name"] . '">' . (getMiniName($source["display_name"] ?? $source["name"])) . '</a></span>'
+ )
+ ];
+ } else {
+ $badges[] = [
+ "id" => "facet",
+ "color" => "light",
+ "html" => (
+ $french
+ ?
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Facette</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' is a facet of ' . getMiniName($source["display_name"] ?? $source["name"]) . ', meaning ' . getMemberPronouns($member['pronouns'])["subjective"] . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' not totally independent of ' . getMiniName($source["display_name"] ?? $source["name"]) . '." class="badge rounded-pill bg-light">Facette de <a href="/' . $source["name"] . '">' . getMiniName($source["display_name"] ?? $source["name"]) . '</a></span>'
+ :
+ '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Facet</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' is a facet of ' . getMiniName($source["display_name"] ?? $source["name"]) . ', meaning ' . getMemberPronouns($member['pronouns'])["subjective"] . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' not totally independent of ' . getMiniName($source["display_name"] ?? $source["name"]) . '." class="badge rounded-pill bg-light">Facet of <a href="/' . $source["name"] . '">' . getMiniName($source["display_name"] ?? $source["name"]) . '</a></span>'
+ )
+ ];
+ }
+ }
+
+ return [
+ 'id' => $member['name'],
+ 'color' => $member["color"] ?? "000000",
+ 'icon' => [
+ "online" => getAsset($system, $member["id"]),
+ "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"], $french) ?? "<span data-bs-toggle='tooltip' title='Pronouns not specified' class='text-muted'>she/her</span>",
+ 'pronouns_usage' => getMemberPronouns($member['pronouns']),
+ 'last_fronted' => $lastFronted,
+ 'species' => $speciesList,
+ 'system' => $systemData,
+ 'relations' => [
+ 'marefriends' => $marefriends,
+ 'sisters' => $sisters,
+ 'caretakers' => $caretakers
+ ]
+ ];
+} \ No newline at end of file