From b7384648e894418d90b189597de05a59637bca39 Mon Sep 17 00:00:00 2001 From: bohwaz Date: Mon, 8 Apr 2024 17:34:09 +0200 Subject: [PATCH] Implement users avatars for Collabora --- lib/KD2/Graphics/SVG/Avatar.php | 166 ++++++++++++++++++++++++++++++++ lib/KaraDAV/NextCloud.php | 6 ++ lib/KaraDAV/Storage.php | 4 +- lib/KaraDAV/Users.php | 1 + www/index.php | 2 +- www/ui.css | 5 + www/users.php | 3 + 7 files changed, 184 insertions(+), 3 deletions(-) create mode 100644 lib/KD2/Graphics/SVG/Avatar.php diff --git a/lib/KD2/Graphics/SVG/Avatar.php b/lib/KD2/Graphics/SVG/Avatar.php new file mode 100644 index 0000000..08cae95 --- /dev/null +++ b/lib/KD2/Graphics/SVG/Avatar.php @@ -0,0 +1,166 @@ += 128) ? '#000000' : '#FFFFFF'; + } + + static public function beam(string $name, array $options = []): string + { + $colors = $options['colors'] ?? ['#0c9', '#9c0', '#6f0']; + $w = intval($options['size'] ?? 36); + $options['square'] ??= false; + + $size = 36; + $numFromName = self::hashCode($name); + $range = count($colors); + $wrapperColor = self::getRandomColor($numFromName, $colors, $range); + $preTranslateX = self::getUnit($numFromName, 10, 1); + $wrapperTranslateX = $preTranslateX < 5 ? $preTranslateX + $size / 9 : $preTranslateX; + $preTranslateY = self::getUnit($numFromName, 10, 2); + $wrapperTranslateY = $preTranslateY < 5 ? $preTranslateY + $size / 9 : $preTranslateY; + + $faceColor = self::getContrast($wrapperColor); + $backgroundColor = self::getRandomColor($numFromName + 13, $colors, $range); + $wrapperRotate = self::getUnit($numFromName, 360); + $wrapperScale = 1 + self::getUnit($numFromName, intval($size / 12)) / 10; + $isMouthOpen = self::getBoolean($numFromName, 2); + $isCircle = self::getBoolean($numFromName, 1); + $eyeSpread = self::getUnit($numFromName, 5); + $mouthSpread = self::getUnit($numFromName, 3); + $faceRotate = self::getUnit($numFromName, 10, 3); + $faceTranslateX = $wrapperTranslateX > $size / 6 ? $wrapperTranslateX / 2 : self::getUnit($numFromName, 6, 1); + $faceTranslateY = $wrapperTranslateY > $size / 6 ? $wrapperTranslateY / 2 : self::getUnit($numFromName, 5, 2); + + $maskID = 'mask-' . md5(random_bytes(8)); + + $rx1 = $options['square'] ? 0 : $size * 2; + $rx2 = $isCircle ? $size : $size / 6; + $rx3 = 1 + self::getUnit($numFromName, 6, 2); + $half_size = $size / 2; + $spread = 22 + $mouthSpread; + + if (!$isMouthOpen) { + $mouth = ""; + } + else { + $mouth = ""; + } + + $x1 = 14 - $eyeSpread; + $x2 = 20 + $eyeSpread; + + return << + + + + + + + + {$mouth} + + + + + +EOF; + } +} diff --git a/lib/KaraDAV/NextCloud.php b/lib/KaraDAV/NextCloud.php index 8815333..feed3fa 100644 --- a/lib/KaraDAV/NextCloud.php +++ b/lib/KaraDAV/NextCloud.php @@ -4,6 +4,7 @@ namespace KaraDAV; use KD2\WebDAV\NextCloud as WebDAV_NextCloud; use KD2\WebDAV\Exception as WebDAV_Exception; +use KD2\Graphics\SVG\Avatar; class NextCloud extends WebDAV_NextCloud { @@ -187,4 +188,9 @@ class NextCloud extends WebDAV_NextCloud return ['created' => !$exists, 'etag' => md5(filemtime($target) . filesize($target))]; } + protected function nc_avatar(): void + { + header('Content-Type: image/svg+xml; charset=utf-8'); + echo Avatar::beam($_SERVER['REQUEST_URI'] ?? '', ['colors' => ['#009', '#ccf', '#9cf']]); + } } diff --git a/lib/KaraDAV/Storage.php b/lib/KaraDAV/Storage.php index c71c62e..f6f7546 100644 --- a/lib/KaraDAV/Storage.php +++ b/lib/KaraDAV/Storage.php @@ -649,7 +649,7 @@ class Storage extends AbstractStorage implements TrashInterface return null; } - $path = $this->users->current()->path . $uri; + $path = $user->path . $uri; if (!file_exists($path)) { return null; @@ -662,7 +662,7 @@ class Storage extends AbstractStorage implements TrashInterface WOPI::PROP_READ_ONLY => $readonly, WOPI::PROP_USER_NAME => $user->login, WOPI::PROP_USER_ID => md5($user->login), - WOPI::PROP_USER_AVATAR => null, + WOPI::PROP_USER_AVATAR => $user->avatar_url, ]; } diff --git a/lib/KaraDAV/Users.php b/lib/KaraDAV/Users.php index 6ea3813..7109147 100644 --- a/lib/KaraDAV/Users.php +++ b/lib/KaraDAV/Users.php @@ -80,6 +80,7 @@ class Users $user->path = rtrim(realpath($user->path), '/') . '/'; $user->dav_url = WWW_URL . 'files/' . $user->login . '/'; + $user->avatar_url = WWW_URL . 'avatars/' . substr(md5($user->login), 0, 16); } return $user; diff --git a/www/index.php b/www/index.php index d25d4f2..3afd37a 100644 --- a/www/index.php +++ b/www/index.php @@ -46,7 +46,7 @@ html_head('My files'); echo <<Manage my files -

Hello, {$username} !

+

Hello, {$username} !

{$percent} used, {$free} free

diff --git a/www/ui.css b/www/ui.css index 0a8f8dc..6039615 100644 --- a/www/ui.css +++ b/www/ui.css @@ -180,6 +180,11 @@ p.info tt { padding: .2em; } +h3 img { + vertical-align: middle; + margin: 0 1em; +} + @media screen and (max-width: 900px) { main { border-radius: 0; diff --git a/www/users.php b/www/users.php index 12cdaf4..a731e62 100644 --- a/www/users.php +++ b/www/users.php @@ -142,6 +142,7 @@ else { + @@ -154,11 +155,13 @@ else { $quota = $users->quota($user); printf(' + ', + $user->avatar_url, htmlspecialchars($user->login), format_bytes($quota->used), format_bytes($quota->total),
User Quota Admin
%s %s used out of %s
%s Edit Delete