diff plugins/identicon/identicon.php @ 0:1e000243b222

vanilla 1.3.3 distro, I hope
author Charlie Root
date Thu, 04 Jan 2018 15:50:29 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/identicon/identicon.php	Thu Jan 04 15:50:29 2018 -0500
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * Identicon
+ *
+ * Plugin to display a unique github-like identification icons
+ * for contacts/addresses that do not have a photo image.
+ *
+ * @todo: Make it optional and configurable via user preferences
+ * @todo: Make color palettes match the curren skin
+ * @todo: Implement optional SVG generator
+ *
+ * @license GNU GPLv3+
+ * @author Aleksander Machniak <alec@alec.pl>
+ * @website http://roundcube.net
+ */
+class identicon extends rcube_plugin
+{
+    public $task = 'addressbook';
+
+
+    /**
+     * Plugin initilization.
+     */
+    function init()
+    {
+        $this->add_hook('contact_photo', array($this, 'contact_photo'));
+    }
+
+    /**
+     * 'contact_photo' hook handler to inject an identicon image
+     */
+    function contact_photo($args)
+    {
+        // pre-conditions, exit if photo already exists or invalid input
+        if (!empty($args['url']) || !empty($args['data'])
+            || (empty($args['record']) && empty($args['email']))
+        ) {
+            return $args;
+        }
+
+        $rcmail = rcmail::get_instance();
+
+        // supporting edit/add action may be tricky, let's not do this
+        if ($rcmail->action == 'show' || $rcmail->action == 'photo') {
+            $email = $args['email'];
+            if (!$email && $args['record']) {
+                $addresses = rcube_addressbook::get_col_values('email', $args['record'], true);
+                if (!empty($addresses)) {
+                    $email = $addresses[0];
+                }
+            }
+
+            if ($email) {
+                require_once __DIR__ . '/identicon_engine.php';
+
+                $identicon = new identicon_engine($email);
+
+                if ($rcmail->action == 'show') {
+                    // set photo URL using data-uri
+                    if (($icon = $identicon->getBinary()) && ($icon = base64_encode($icon))) {
+                        $mimetype    =$identicon->getMimetype();
+                        $args['url'] = sprintf('data:%s;base64,%s', $mimetype, $icon);
+                    }
+                }
+                else {
+                    // send the icon to the browser
+                    $identicon = new identicon_engine($email);
+                    if ($identicon->sendOutput()) {
+                        exit;
+                    }
+                }
+            }
+        }
+
+        return $args;
+    }
+}