From c56cc7be73bdb3da6048fb02828336e0970ebbc4 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Thu, 1 Dec 2022 19:09:05 +0100 Subject: [PATCH] Added advanced PluginPropertyType::SELECT for improved Avatars plugin --- plugins/avatars/avatars.js | 44 +++++++----------- plugins/avatars/identicon.js | 27 ++++------- .../avatars/images/services/paypal.com.png | Bin 4545 -> 1070 bytes plugins/avatars/index.php | 37 +++++++++------ plugins/avatars/jdenticon.js | 2 +- .../Enumerations/PluginPropertyType.php | 3 +- .../Admin/AdminSettingsPluginProperty.html | 3 ++ 7 files changed, 57 insertions(+), 59 deletions(-) diff --git a/plugins/avatars/avatars.js b/plugins/avatars/avatars.js index ceb7daac6..a433234bb 100644 --- a/plugins/avatars/avatars.js +++ b/plugins/avatars/avatars.js @@ -22,10 +22,18 @@ return hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); // convert bytes to hex string }, fromChars = from => - ((from.name || from.email).split(/[^\p{L}]+/gu) || []) - .reduce((a, s) => a + (s[0] || ''), '') +// (from.name?.split(/[^\p{Lu}]+/gu) || []).reduce((a, s) => a + (s || '')), '') + (from.name?.split(/[^\p{L}]+/gu) || []).reduce((a, s) => a + (s[0] || ''), '') .slice(0,2) .toUpperCase(), + setIdenticon = (from, fn) => window.identiconSvg && hash(from.email).then(hash => + fn('data:image/svg+xml;base64,' + btoa(window.identiconSvg(hash, fromChars(from)))) + ), + addQueue = (msg, fn) => { + setIdenticon(msg.from[0], fn); + queue.push([msg, fn]); + runQueue(); + }, runQueue = (() => { let item = queue.shift(); while (item) { @@ -40,13 +48,6 @@ url = `data:${data.Result.type};base64,${data.Result.data}`; avatars.set(getAvatarUid(item[0]), url); item[1](url); - } else if (window.identiconSvg) { - // rl.pluginSettingsGet('avatars', 'identicon'); - hash(from.email).then(hash => { - let url = window.identiconSvg(hash, fromChars(from)); - avatars.set(getAvatarUid(item[0]), url); - item[1](url); - }); } runQueue(); }, 'Avatar', { @@ -115,22 +116,15 @@ init: (element, self, dummy, msg) => { if (msg) { let url = getAvatar(msg), + from = msg.from[0], fn = url=>{element.src = url}; if (url) { fn(url); } else if (msg.avatar) { - let from = msg.from[0], - bimi = 'pass' == from.dkimStatus ? 1 : 0; - if (window.identiconSvg) { - // rl.pluginSettingsGet('avatars', 'identicon'); - element.onerror = () => hash(from.email).then(hash => - fn(window.identiconSvg(hash, fromChars(from))) - ); - } - fn(`?Avatar/${bimi}/${msg.avatar}`); + element.onerror = () => setIdenticon(from, fn); + fn(`?Avatar/${'pass' == from.dkimStatus ? 1 : 0}/${msg.avatar}`); } else { - queue.push([msg, fn]); - runQueue(); + addQueue(msg, fn); } } } @@ -164,14 +158,12 @@ if (url) { fn(url); } else if (msg.avatar) { - let bimi = 'pass' == msg.from[0].dkimStatus ? 1 : 0; - fn(`?Avatar/${bimi}/${msg.avatar}`); + fn(`?Avatar/${'pass' == msg.from[0].dkimStatus ? 1 : 0}/${msg.avatar}`); } else { -// let from = msg.from[0], bimi = 'pass' == from.dkimStatus ? 1 : 0; -// view.viewUserPic(`?Avatar/${bimi}/${encodeURIComponent(from.email)}`); +// let from = msg.from[0]; +// view.viewUserPic(`?Avatar/${'pass' == from.dkimStatus ? 1 : 0}/${encodeURIComponent(from.email)}`); // view.viewUserPicVisible(true); - queue.push([msg, fn]); - runQueue(); + addQueue(msg, fn); } } }); diff --git a/plugins/avatars/identicon.js b/plugins/avatars/identicon.js index 8a124d7ff..59664ccbb 100644 --- a/plugins/avatars/identicon.js +++ b/plugins/avatars/identicon.js @@ -15,14 +15,15 @@ window.identiconSvg = (hash, txt) => { l, l + h % 1 * s, l + s - ]; + ], + m = txt ? 128 : 255, + color = 'rgb(' + [ + v[ ~~h % 6 ] * m, // red + v[ (h | 16) % 6 ] * m, // green + v[ (h | 8) % 6 ] * m // blue + ].map(Math.round).join(',') + ')'; if (txt) { - const color = 'rgb(' + [ - v[ ~~h % 6 ] * 255 / 2, // red - v[ (h | 16) % 6 ] * 255 / 2, // green - v[ (h | 8) % 6 ] * 255 / 2 // blue - ].map(Math.round).join(',') + ')'; txt = ` { dy=".1em" dominant-baseline="middle" fill="#FFF">${txt} `; } else { - const color = 'rgb(' + [ - v[ ~~h % 6 ] * 255, // red - v[ (h | 16) % 6 ] * 255, // green - v[ (h | 8) % 6 ] * 255 // blue - ].map(Math.round).join(',') + ')', - cell = Math.floor((size - ((Math.floor(size * margin)) * 2)) / 5), + const cell = Math.floor((size - ((Math.floor(size * margin)) * 2)) / 5), imargin = Math.floor((size - cell * 5) / 2), rectangles = [], add = (x, y) => rectangles.push(""); - // the first 15 characters of the hash control the pixels (even/odd) // they are drawn down the middle first, then mirrored outwards for (let i = 0; i < 15; ++i) { @@ -51,7 +46,7 @@ window.identiconSvg = (hash, txt) => { } else if (i < 10) { add(1, (i - 5)); add(3, (i - 5)); - } else if (i < 15) { + } else { add(0, (i - 10)); add(4, (i - 10)); } @@ -61,9 +56,7 @@ window.identiconSvg = (hash, txt) => { + rectangles.join('') + ""; } - return 'data:image/svg+xml;base64,' + btoa( - "" + txt + "" - ); + return "" + txt + ""; }; })(); diff --git a/plugins/avatars/images/services/paypal.com.png b/plugins/avatars/images/services/paypal.com.png index 7ddea03c9940de970baf32efa1ecc986a101b6c9..e3935011fd3b30a8711d944972da79f24967fb8a 100644 GIT binary patch literal 1070 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'avatars.js'); $this->addJsonHook('Avatar', 'DoAvatar'); $this->addPartHook('Avatar', 'ServiceAvatar'); -// $this->Config()->Get('plugin', 'identicon', false) && $this->addJs('jdenticon.js'); - // GitHub-style - $this->Config()->Get('plugin', 'identicon', false) && $this->addJs('identicon.js'); + $identicon = $this->Config()->Get('plugin', 'identicon', 'identicon'); + if ('none' != $identicon) { + if ('jdenticon' === $this->Config()->Get('plugin', 'identicon', 'identicon')) { + $this->addJs('jdenticon.js'); + } else { + $this->addJs('identicon.js'); + } + } // https://github.com/the-djmaze/snappymail/issues/714 $this->Config()->Get('plugin', 'delay', true) || $this->addHook('filter.json-response', 'FilterJsonResponse'); } @@ -84,9 +89,15 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin protected function configMapping() : array { $aResult = array( - \RainLoop\Plugins\Property::NewInstance('delay')->SetLabel('Delay loading') - ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) - ->SetDefaultValue(true), + \RainLoop\Plugins\Property::NewInstance('identicon')->SetLabel('Identicon') + ->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECT) +// ->SetAllowedInJs(true) + ->SetDefaultValue([ + ['id' => 'identicon', 'name' => 'Name characters or squares'], + ['id' => 'jdenticon', 'name' => 'Triangles shape'], + ['id' => 'none', 'name' => 'none'] + ]) + ->SetDescription('https://wikipedia.org/wiki/Identicon'), \RainLoop\Plugins\Property::NewInstance('bimi')->SetLabel('Lookup BIMI') ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) ->SetDefaultValue(false) @@ -94,7 +105,10 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin \RainLoop\Plugins\Property::NewInstance('gravatar')->SetLabel('Lookup Gravatar') ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) ->SetDefaultValue(false) - ->SetDescription('https://wikipedia.org/wiki/Gravatar') + ->SetDescription('https://wikipedia.org/wiki/Gravatar'), + \RainLoop\Plugins\Property::NewInstance('delay')->SetLabel('Delay lookup loading') + ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) + ->SetDefaultValue(true), ); /* if (\class_exists('OC') && isset(\OC::$server)) { @@ -104,11 +118,6 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin ->SetDefaultValue(false); } */ - $aResult[] = \RainLoop\Plugins\Property::NewInstance('identicon')->SetLabel('Else create Identicon') - ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) -// ->SetAllowedInJs(true) - ->SetDefaultValue(false) - ->SetDescription('https://wikipedia.org/wiki/Identicon'); return $aResult; } diff --git a/plugins/avatars/jdenticon.js b/plugins/avatars/jdenticon.js index efaf9f69d..6652881a5 100644 --- a/plugins/avatars/jdenticon.js +++ b/plugins/avatars/jdenticon.js @@ -671,7 +671,7 @@ window.identiconSvg = hash => { renderer.finish(); - return 'data:image/svg+xml;base64,' + btoa(writer); + return writer; }; })(); diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Enumerations/PluginPropertyType.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Enumerations/PluginPropertyType.php index 6b18a05f9..2cbf7a9d0 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Enumerations/PluginPropertyType.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Enumerations/PluginPropertyType.php @@ -12,5 +12,6 @@ class PluginPropertyType PASSWORD = 3, SELECTION = 4, BOOL = 5, - URL = 6; + URL = 6, + SELECT = 8; } diff --git a/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsPluginProperty.html b/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsPluginProperty.html index 0e952f2af..21a2a68d1 100644 --- a/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsPluginProperty.html +++ b/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsPluginProperty.html @@ -28,6 +28,9 @@ + + +