diff --git a/app/config/cloud/employees.json b/app/config/cloud/employees.json index 6ae544eb57..3ef0f8c758 100644 --- a/app/config/cloud/employees.json +++ b/app/config/cloud/employees.json @@ -1 +1,32 @@ -["eldad@appwrite.io","christy@appwrite.io","torsten@appwrite.io","damodar@appwrite.io","bradley@appwrite.io","jake@appwrite.io","sara@appwrite.io","matej@appwrite.io","aditya@appwrite.io","wess@appwrite.io","may@appwrite.io","elad@appwrite.io","vincent@appwrite.io","haimantika@appwrite.io","chen@appwrite.io","tessa@appwrite.io","shimon@appwrite.io","shmuel@appwrite.io","arman@appwrite.io","carla@appwrite.io","emma@appwrite.io","dylan@appwrite.io","steven@appwrite.io","jyoti@appwrite.io","jade@appwrite.io","khushboo@appwrite.io","thomas@appwrite.io","holly@appwrite.io","laura@appwrite.io","caio@appwrite.io"] \ No newline at end of file +{ + "eldad@appwrite.io": { "memberSince": "2020-10-15", "spot": "0", "gitHub": "eldadfux" }, + "christy@appwrite.io": { "memberSince": "2020-12-01", "spot": "1", "gitHub": "https://github.com/christyjacob4" }, + "torsten@appwrite.io": { "memberSince": "2020-12-28", "spot": "2", "gitHub": "https://github.com/torstendittmann " }, + "damodar@appwrite.io": { "memberSince": "2021-01-02", "spot": "3", "gitHub": "https://github.com/lohanidamodar" }, + "bradley@appwrite.io": { "memberSince": "2021-05-21", "spot": "5", "gitHub": "https://github.com/PineappleIOnic" }, + "jake@appwrite.io": { "memberSince": "2021-06-28", "spot": "6", "gitHub": "https://github.com/abnegate" }, + "sara@appwrite.io": { "memberSince": "2021-08-16", "spot": "7", "gitHub": "https://github.com/sarakaandorp" }, + "matej@appwrite.io": { "memberSince": "2021-08-23", "spot": "8", "gitHub": "meldiron" }, + "aditya@appwrite.io": { "memberSince": "2021-09-01", "spot": "9", "gitHub": "https://github.com/adityaoberai" }, + "wess@appwrite.io": { "memberSince": "2021-11-08", "spot": "12", "gitHub": "https://github.com/wess" }, + "may@appwrite.io": { "memberSince": "2021-11-28", "spot": "14", "gitHub": "https://github.com/MayEnder" }, + "elad@appwrite.io": { "memberSince": "2021-12-19", "spot": "15", "gitHub": "https://github.com/elad2412" }, + "vincent@appwrite.io": { "memberSince": "2022-01-01", "spot": "16", "gitHub": "https://github.com/gewenyu99" }, + "haimantika@appwrite.io": { "memberSince": "2022-04-01", "spot": "18", "gitHub": "https://github.com/Haimantika" }, + "chen@appwrite.io": { "memberSince": "2022-01-24", "spot": "19", "gitHub": "https://github.com/chenparnasa" }, + "tessa@appwrite.io": { "memberSince": "2022-04-21", "spot": "20", "gitHub": "https://github.com/tessamero" }, + "shimon@appwrite.io": { "memberSince": "2022-05-01", "spot": "23", "gitHub": "https://github.com/shimonewman" }, + "shmuel@appwrite.io": { "memberSince": "2022-03-20", "spot": "24", "gitHub": "https://github.com/fogelito" }, + "arman@appwrite.io": { "memberSince": "2022-04-04", "spot": "25", "gitHub": "https://github.com/ArmanNik" }, + "carla@appwrite.io": { "memberSince": "2022-04-04", "spot": "26", "gitHub": "https://github.com/heyCarla" }, + "emma@appwrite.io": { "memberSince": "2022-05-08", "spot": "27", "gitHub": "https://github.com/emmacarpagnano1" }, + "dylan@appwrite.io": { "memberSince": "2022-05-09", "spot": "28", "gitHub": "https://github.com/DylanG-64" }, + "steven@appwrite.io": { "memberSince": "2022-07-01", "spot": "30", "gitHub": "https://github.com/stnguyen90" }, + "jyoti@appwrite.io": { "memberSince": "2022-10-24", "spot": "31", "gitHub": "https://github.com/joeyouss" }, + "jade@appwrite.io": { "memberSince": "2022-10-31", "spot": "32", "gitHub": "https://github.com/dajebp" }, + "khushboo@appwrite.io": { "memberSince": "2021-11-08", "spot": "13", "gitHub": "https://github.com/vermakhushboo" }, + "thomas@appwrite.io": { "memberSince": "2022-11-03", "spot": "34", "gitHub": "https://github.com/TGlide/" }, + "holly@appwrite.io": { "memberSince": "2022-12-05", "spot": "35", "gitHub": "" }, + "laura@appwrite.io": { "memberSince": "2023-01-25", "spot": "36", "gitHub": "https://github.com/LauraDuRy" }, + "caio@appwrite.io": { "memberSince": "2023-03-27", "spot": "37", "gitHub": "https://github.com/ariascaio" } +} diff --git a/app/config/cloud/heroes.json b/app/config/cloud/heroes.json index e2b664f551..d711df31c3 100644 --- a/app/config/cloud/heroes.json +++ b/app/config/cloud/heroes.json @@ -1 +1,9 @@ -["kinmount_turonian@rnlay.com","chlorofluorocarbons_vahan@rnlay.com","emilia@emilia.codes","codewithsimon@gmail.com","a.stephensimon@outlook.com","lucasaudart@gmail.com","bishwajeet.techmaster@gmail.com","alves.mckl@gmail.com","hidianapham@gmail.com","tkarmakar27112000@gmail.com"] \ No newline at end of file +{ + "bishwajeet.techmaster@gmail.com": { "memberSince": "2023-02-07" }, + "lucasaudart@gmail.com": { "memberSince": "2023-02-07" }, + "tkarmakar27112000@gmail.com": { "memberSince": "2023-02-07" }, + "alves.mckl@gmail.com": { "memberSince": "2023-02-07" }, + "emilia@emilia.codes": { "memberSince": "2023-02-07" }, + "a.stephensimon@outlook.com": { "memberSince": "2023-02-07" }, + "hidianapham@gmail.com": { "memberSince": "2023-02-07" } +} diff --git a/app/controllers/api/avatars.php b/app/controllers/api/avatars.php index e3fe902c04..e267379f2d 100644 --- a/app/controllers/api/avatars.php +++ b/app/controllers/api/avatars.php @@ -91,7 +91,7 @@ $getUserGitHub = function (Document $user, Document $project, Database $dbForPro $dbForProject->deleteCachedDocument('users', $user->getId()); } catch (Throwable $err) { - // Race contition + // TODO: Fix Race contition $sessions = $user->getAttribute('sessions', []); $session = $sessions[0] ?? new Document(); $accessToken = $session->getAttribute('providerAccessToken'); @@ -514,10 +514,25 @@ App::get('/v1/cards/cloud') $githubName = $gitHub['name'] ?? ''; $githubId = $gitHub['id'] ?? ''; - $isHero = \in_array($email, $heroes); + $isHero = \array_key_exists($email, $heroes); $isContributor = \in_array($githubId, $contributors); - $isEmployee = \in_array($email, $employees); - $employeeNumber = $isEmployee ? \array_search($email, $employees) : ''; + $isEmployee = \array_key_exists($email, $employees); + $employeeNumber = $isEmployee ? $employees[$email]['spot'] : ''; + + if ($isHero) { + $createdAt = new \DateTime($heroes[$email]['memberSince'] ?? ''); + } else if ($isEmployee) { + $createdAt = new \DateTime($employees[$email]['memberSince'] ?? ''); + } + + if (!$isEmployee) { + $employeeGitHub = \array_search(\strtolower($githubName), \array_map(fn ($employee) => \strtolower($employee['gitHub']) ?? '', $employees)); + if (!empty($employeeGitHub)) { + $isEmployee = true; + $employeeNumber = $isEmployee ? $employees[$employeeGitHub]['spot'] : ''; + $createdAt = new \DateTime($employees[$employeeGitHub]['memberSince'] ?? ''); + } + } $isPlatinum = $user->getInternalId() % 100 === 0; } else { @@ -537,6 +552,21 @@ App::get('/v1/cards/cloud') $isPlatinum = $mock === 'platinum'; } + if ($isEmployee) { + $isContributor = false; + $isHero = false; + } + + if ($isHero) { + $isContributor = false; + $isEmployee = false; + } + + if ($isContributor) { + $isHero = false; + $isEmployee = false; + } + $isGolden = $isEmployee || $isHero || $isContributor; $isPlatinum = $isGolden ? false : $isPlatinum; $memberSince = \strtoupper('Member since ' . $createdAt->format('M') . ' ' . $createdAt->format('d') . ', ' . $createdAt->format('o')); @@ -622,7 +652,7 @@ App::get('/v1/cards/cloud') $text->setFillColor(new \ImagickPixel($isGolden || $isPlatinum ? '#FFFFFF' : '#FFB9CC')); $text->setFontSize(28); $text->setFontWeight(600); - $text->setTextKerning(1.08); + $text->setTextKerning(1.12); $baseImage->annotateImage($text, 512, 550, 0, \strtoupper($memberSince)); if (!empty($githubName)) { @@ -687,9 +717,9 @@ App::get('/v1/cards/cloud-back') $gitHub = $getUserGitHub($user, $project, $dbForProject); $githubId = $gitHub['id'] ?? ''; - $isHero = \in_array($email, $heroes); + $isHero = \array_key_exists($email, $heroes); $isContributor = \in_array($githubId, $contributors); - $isEmployee = \in_array($email, $employees); + $isEmployee = \array_key_exists($email, $employees); $isGolden = $isEmployee || $isHero || $isContributor; $isPlatinum = $user->getInternalId() % 100 === 0; @@ -739,7 +769,7 @@ App::get('/v1/cards/cloud-og') ->label('docs', false) ->label('origin', '*') ->param('userId', '', new UID(), 'User ID.', true) - ->param('mock', '', new WhiteList(['employee', 'employee-2digit', 'employee-3digit', 'hero', 'contributor', 'normal', 'platinum', 'normal-no-github', 'normal-long', 'normal-bg2', 'normal-bg3', 'normal-right', 'platinum-right', 'golden-right']), 'Mocking behaviour.', true) + ->param('mock', '', new WhiteList(['employee', 'employee-2digit', 'employee-3digit', 'hero', 'contributor', 'normal', 'platinum', 'normal-no-github', 'normal-long', 'normal-bg2', 'normal-bg3', 'normal-right', 'platinum-right', 'hero-right', 'contributor-right', 'employee-right']), 'Mocking behaviour.', true) ->param('width', 0, new Range(0, 1024), 'Resize image card width, Pass an integer between 0 to 1024.', true) ->param('height', 0, new Range(0, 1024), 'Resize image card height, Pass an integer between 0 to 1024.', true) ->inject('user') @@ -770,10 +800,25 @@ App::get('/v1/cards/cloud-og') $githubName = $gitHub['name'] ?? ''; $githubId = $gitHub['id'] ?? ''; - $isHero = \in_array($email, $heroes); + $isHero = \array_key_exists($email, $heroes); $isContributor = \in_array($githubId, $contributors); - $isEmployee = \in_array($email, $employees); - $employeeNumber = $isEmployee ? \array_search($email, $employees) : ''; + $isEmployee = \array_key_exists($email, $employees); + $employeeNumber = $isEmployee ? $employees[$email]['spot'] : ''; + + if ($isHero) { + $createdAt = new \DateTime($heroes[$email]['memberSince'] ?? ''); + } else if ($isEmployee) { + $createdAt = new \DateTime($employees[$email]['memberSince'] ?? ''); + } + + if (!$isEmployee) { + $employeeGitHub = \array_search(\strtolower($githubName), \array_map(fn ($employee) => \strtolower($employee['gitHub']) ?? '', $employees)); + if (!empty($employeeGitHub)) { + $isEmployee = true; + $employeeNumber = $isEmployee ? $employees[$employeeGitHub]['spot'] : ''; + $createdAt = new \DateTime($employees[$employeeGitHub]['memberSince'] ?? ''); + } + } $isPlatinum = $user->getInternalId() % 100 === 0; } else { @@ -782,11 +827,12 @@ App::get('/v1/cards/cloud-og') $name = $mock === 'normal-long' ? 'Sir First Walter O\'Brian Junior' : 'Walter O\'Brian'; $createdAt = new \DateTime('now'); $githubName = $mock === 'normal-no-github' ? '' : ($mock === 'normal-long' ? 'sir-first-walterobrian-junior' : 'walterobrian'); - $isHero = $mock === 'hero'; - $isContributor = $mock === 'contributor'; + $isHero = \str_starts_with($mock, 'hero'); + $isContributor = \str_starts_with($mock, 'contributor'); $isEmployee = \str_starts_with($mock, 'employee'); $employeeNumber = match ($mock) { 'employee' => '1', + 'employee-right' => '1', 'employee-2digit' => '18', 'employee-3digit' => '246', default => '' @@ -795,6 +841,21 @@ App::get('/v1/cards/cloud-og') $isPlatinum = $mock === 'platinum'; } + if ($isEmployee) { + $isContributor = false; + $isHero = false; + } + + if ($isHero) { + $isContributor = false; + $isEmployee = false; + } + + if ($isContributor) { + $isHero = false; + $isEmployee = false; + } + $isGolden = $isEmployee || $isHero || $isContributor; $isPlatinum = $isGolden ? false : $isPlatinum; $memberSince = \strtoupper('Member since ' . $createdAt->format('M') . ' ' . $createdAt->format('d') . ', ' . $createdAt->format('o')); @@ -820,20 +881,142 @@ App::get('/v1/cards/cloud-og') $baseImage->compositeImage($image, Imagick::COMPOSITE_OVER, -20, 710); } - // TODO: isemployee - // TODO: isContributor - // TODO: isHero - // TODO: + if ($isEmployee) { + $image = new Imagick('public/images/cards/cloud/employee.png'); + $image->setGravity(Imagick::GRAVITY_CENTER); + $image->resizeImage(120, 120, Imagick::FILTER_LANCZOS, 1); + $image->rotateImage(new ImagickPixel('#00000000'), $cardVariation === '1' ? -20 : 30); + $baseImage->compositeImage($image, Imagick::COMPOSITE_OVER, $cardVariation === '1' ? 612 : 715, $cardVariation === '1' ? 203 : 425); + + $hashtag = new \ImagickDraw(); + $hashtag->setTextAlignment(Imagick::ALIGN_LEFT); + $hashtag->setFont("public/fonts/Inter-Bold.ttf"); + $hashtag->setFillColor(new \ImagickPixel('#FFFADF')); + $hashtag->setFontSize(20); + $hashtag->setFontWeight(700); + $metricsHashtag = $baseImage->queryFontMetrics($hashtag, '#'); + + $text = new \ImagickDraw(); + $text->setTextAlignment(Imagick::ALIGN_LEFT); + $text->setFont("public/fonts/Inter-Bold.ttf"); + $text->setFillColor(new \ImagickPixel('#FFFADF')); + $text->setFontSize(\strlen($employeeNumber) <= 1 ? 36 : 28); + $text->setFontWeight(700); + $metricsText = $baseImage->queryFontMetrics($text, $employeeNumber); + + $group = new Imagick(); + $groupWidth = $metricsHashtag['textWidth'] + 6 + $metricsText['textWidth']; + $group->newImage($groupWidth, $metricsText['textHeight'], '#00000000'); + + $group->annotateImage($hashtag, 0, $metricsText['textHeight'], 0, '#'); + $group->annotateImage($text, $metricsHashtag['textWidth'] + 6, $metricsText['textHeight'], 0, $employeeNumber); + + if ($cardVariation === '1') { + $group->rotateImage(new ImagickPixel('#00000000'), -22); + + if(\strlen($employeeNumber) <= 1) { + $baseImage->compositeImage($group, Imagick::COMPOSITE_OVER, 660, 245); + } else { + $baseImage->compositeImage($group, Imagick::COMPOSITE_OVER, 655, 247); + } + } else { + $group->rotateImage(new ImagickPixel('#00000000'), 32); + + if(\strlen($employeeNumber) <= 1) { + $baseImage->compositeImage($group, Imagick::COMPOSITE_OVER, 775, 465); + } else { + $baseImage->compositeImage($group, Imagick::COMPOSITE_OVER, 767, 470); + } + } + } + + + if ($isContributor) { + $image = new Imagick('public/images/cards/cloud/contributor.png'); + $image->setGravity(Imagick::GRAVITY_CENTER); + $image->resizeImage(120, 120, Imagick::FILTER_LANCZOS, 1); + $image->rotateImage(new ImagickPixel('#00000000'), $cardVariation === '1' ? -20 : 30); + $baseImage->compositeImage($image, Imagick::COMPOSITE_OVER, $cardVariation === '1' ? 612 : 715, $cardVariation === '1' ? 203 : 425); + } + + if ($isHero) { + $image = new Imagick('public/images/cards/cloud/hero.png'); + $image->setGravity(Imagick::GRAVITY_CENTER); + $image->resizeImage(120, 120, Imagick::FILTER_LANCZOS, 1); + $image->rotateImage(new ImagickPixel('#00000000'), $cardVariation === '1' ? -20 : 30); + $baseImage->compositeImage($image, Imagick::COMPOSITE_OVER, $cardVariation === '1' ? 612 : 715, $cardVariation === '1' ? 185 : 425); + } setlocale(LC_ALL, "en_US.utf8"); $name = \iconv("utf-8", "ascii//TRANSLIT", $name); $memberSince = \iconv("utf-8", "ascii//TRANSLIT", $memberSince); $githubName = \iconv("utf-8", "ascii//TRANSLIT", $githubName); + $text = new \ImagickDraw(); + $text->setTextAlignment(Imagick::ALIGN_CENTER); + $text->setFont("public/fonts/Poppins-Bold.ttf"); + $text->setFillColor(new \ImagickPixel('#FFFFFF')); - // TODO: Name - // TODO: memberSince - // TODO: githubName + if (\strlen($name) > 33) { + $name = \substr($name, 0, 33); + } + + if (\strlen($name) <= 23) { + $text->setFontSize(48); + } else { + $text->setFontSize(28); + } + $text->setFontWeight(700); + + if ($cardVariation === '1') { + $baseImage->annotateImage($text, 550, 600, -22, $name); + } else { + $baseImage->annotateImage($text, 440, 585, 32, $name); + } + + $text = new \ImagickDraw(); + $text->setTextAlignment(Imagick::ALIGN_CENTER); + $text->setFont("public/fonts/Inter-SemiBold.ttf"); + $text->setFillColor(new \ImagickPixel($isGolden || $isPlatinum ? '#FFFFFF' : '#FFB9CC')); + $text->setFontSize(18); + $text->setFontWeight(600); + $text->setTextKerning(1.12); + + if ($cardVariation === '1') { + $baseImage->annotateImage($text, 580, 630, -22, $memberSince); + } else { + $baseImage->annotateImage($text, 420, 620, 32, $memberSince); + } + + if (!empty($githubName)) { + $text = new \ImagickDraw(); + $text->setTextAlignment(Imagick::ALIGN_LEFT); + $text->setFont("public/fonts/Inter-Regular.ttf"); + $text->setFillColor(new \ImagickPixel('#FFFFFF')); + $text->setFontSize(26); + $text->setFontWeight(400); + $metrics = $baseImage->queryFontMetrics($text, $githubName); + + $image = new Imagick('public/images/cards/cloud/github.png'); + $image->setGravity(Imagick::GRAVITY_CENTER); + $image->resizeImage(32, 32, Imagick::FILTER_LANCZOS, 1); + $precisionFix = 5; + + $group = new Imagick(); + $groupWidth = $metrics['textWidth'] + 32 + 4; + $group->newImage($groupWidth, $metrics['textHeight'], '#00000000'); + + $group->compositeImage($image, Imagick::COMPOSITE_OVER, 0, 0); + $group->annotateImage($text, 32 + 4, $metrics['textHeight'] - $precisionFix, 0, $githubName); + + if ($cardVariation === '1') { + $group->rotateImage(new ImagickPixel('#00000000'), -22); + $baseImage->compositeImage($group, Imagick::COMPOSITE_OVER, 440, 475); + } else { + $group->rotateImage(new ImagickPixel('#00000000'), 32); + $baseImage->compositeImage($group, Imagick::COMPOSITE_OVER, 410, 465); + } + } if (!empty($width) || !empty($height)) { $baseImage->resizeImage($width, $height, Imagick::FILTER_LANCZOS, 1);