]> git.mxchange.org Git - friendica-addons.git/blob - catavatar/catavatar.php
Move Config::get() to DI::config()->get()
[friendica-addons.git] / catavatar / catavatar.php
1 <?php
2 /**
3  * Name: Cat Avatar Generator
4  * Description: Generate a default avatar based on David Revoy's cat-avatar-generator https://framagit.org/Deevad/cat-avatar-generator
5  * Version: 1.1
6  * Author: Fabio <https://kirgroup.com/profile/fabrixxm>
7  */
8
9 use Friendica\App;
10 use Friendica\Core\Config;
11 use Friendica\Core\Hook;
12 use Friendica\Core\Logger;
13 use Friendica\Core\Renderer;
14 use Friendica\Core\Worker;
15 use Friendica\Database\DBA;
16 use Friendica\DI;
17 use Friendica\Model\Contact;
18 use Friendica\Model\Photo;
19 use Friendica\Network\HTTPException\NotFoundException;
20
21 define("CATAVATAR_SIZE", 256);
22
23 /**
24  * Installs the addon hook
25  */
26 function catavatar_install()
27 {
28         Hook::register('avatar_lookup', 'addon/catavatar/catavatar.php', 'catavatar_lookup');
29         Hook::register('addon_settings', 'addon/catavatar/catavatar.php', 'catavatar_addon_settings');
30         Hook::register('addon_settings_post', 'addon/catavatar/catavatar.php', 'catavatar_addon_settings_post');
31
32         Logger::log('registered catavatar');
33 }
34
35 /**
36  * Removes the addon hook
37  */
38 function catavatar_uninstall()
39 {
40         Hook::unregister('avatar_lookup', 'addon/catavatar/catavatar.php', 'catavatar_lookup');
41         Hook::unregister('addon_settings', 'addon/catavatar/catavatar.php', 'catavatar_addon_settings');
42         Hook::unregister('addon_settings_post', 'addon/catavatar/catavatar.php', 'catavatar_addon_settings_post');
43
44         Logger::log('unregistered catavatar');
45 }
46
47 /**
48  * Cat avatar user settings page
49  */
50 function catavatar_addon_settings(App $a, &$s)
51 {
52         if (!local_user()) {
53                 return;
54         }
55
56         $t = Renderer::getMarkupTemplate('settings.tpl', 'addon/catavatar/');
57         $s .= Renderer::replaceMacros($t, [
58                 '$postpost' => !empty($_POST['catavatar-morecat']) || !empty($_POST['catavatar-emailcat']),
59                 '$uncache' => time(),
60                 '$uid' => local_user(),
61                 '$usecat' => DI::l10n()->t('Use Cat as Avatar'),
62                 '$morecat' => DI::l10n()->t('More Random Cat!'),
63                 '$emailcat' => DI::l10n()->t('Reset to email Cat'),
64                 '$seed' => DI::pConfig()->get(local_user(), 'catavatar', 'seed', false),
65                 '$header' => DI::l10n()->t('Cat Avatar Settings'),
66         ]);
67 }
68
69 /**
70  * Cat avatar user settings POST handle
71  */
72 function catavatar_addon_settings_post(App $a, &$s)
73 {
74         if (!local_user()) {
75                 return;
76         }
77
78         // delete the current cached cat avatar
79         $condition = ['uid' => local_user(), 'blocked' => false,
80                         'account_expired' => false, 'account_removed' => false];
81         $user = DBA::selectFirst('user', ['email'], $condition);
82
83         $seed = DI::pConfig()->get(local_user(), 'catavatar', 'seed', md5(trim(strtolower($user['email']))));
84
85         if (!empty($_POST['catavatar-usecat'])) {
86                 $url = DI::baseUrl()->get() . '/catavatar/' . local_user() . '?ts=' . time();
87
88                 $self = DBA::selectFirst('contact', ['id'], ['uid' => local_user(), 'self' => true]);
89                 if (!DBA::isResult($self)) {
90                         notice(DI::l10n()->t("The cat hadn't found itself."));
91                         return;
92                 }
93
94                 Photo::importProfilePhoto($url, local_user(), $self['id']);
95
96                 $condition = ['uid' => local_user(), 'contact-id' => $self['id']];
97                 $photo = DBA::selectFirst('photo', ['resource-id'], $condition);
98                 if (!DBA::isResult($photo)) {
99                         notice(DI::l10n()->t('There was an error, the cat ran away.'));
100                         return;
101                 }
102
103                 DBA::update('photo', ['profile' => false], ['profile' => true, 'uid' => local_user()]);
104
105                 $fields = ['profile' => true, 'album' => DI::l10n()->t('Profile Photos'), 'contact-id' => 0];
106                 DBA::update('photo', $fields, ['uid' => local_user(), 'resource-id' => $photo['resource-id']]);
107
108                 Photo::importProfilePhoto($url, local_user(), $self['id']);
109
110                 Contact::updateSelfFromUserID(local_user(), true);
111
112                 // Update global directory in background
113                 $url = DI::baseUrl()->get() . '/profile/' . $a->user['nickname'];
114                 if ($url && strlen(DI::config()->get('system', 'directory'))) {
115                         Worker::add(PRIORITY_LOW, 'Directory', $url);
116                 }
117
118                 Worker::add(PRIORITY_LOW, 'ProfileUpdate', local_user());
119
120                 info(DI::l10n()->t('Meow!'));
121                 return;
122         }
123
124         if (!empty($_POST['catavatar-morecat'])) {
125                 DI::pConfig()->set(local_user(), 'catavatar', 'seed', time());
126         }
127
128         if (!empty($_POST['catavatar-emailcat'])) {
129                 DI::pConfig()->delete(local_user(), 'catavatar', 'seed');
130         }
131 }
132
133 /**
134  * Returns the URL to the cat avatar
135  *
136  * @param $a array
137  * @param &$b array
138  */
139 function catavatar_lookup(App $a, &$b)
140 {
141         $user = DBA::selectFirst('user', ['uid'], ['email' => $b['email']]);
142         $url = DI::baseUrl()->get() . '/catavatar/' . $user['uid'];
143
144         switch($b['size']) {
145                 case 300: $url .= "/4"; break;
146                 case 80: $url .= "/5"; break;
147                 case 47: $url .= "/6"; break;
148         }
149
150         $b['url'] = $url;
151         $b['success'] = true;
152 }
153
154 function catavatar_module() {}
155
156 /**
157  * Returns image for user id
158  *
159  * @throws NotFoundException
160  *
161  */
162 function catavatar_content(App $a)
163 {
164         if ($a->argc < 2 || $a->argc > 3) {
165                 throw new NotFoundException(); // this should be catched on index and show default "not found" page.
166         }
167
168         $uid = intval($a->argv[1]);
169
170         $size = 0;
171         if ($a->argc == 3) {
172                 $size = intval($a->argv[2]);
173         }
174
175         $condition = ['uid' => $uid,
176                         'account_expired' => false, 'account_removed' => false];
177         $user = DBA::selectFirst('user', ['email'], $condition);
178
179         if ($user === false) {
180                 throw new NotFoundException();
181         }
182
183         $seed = DI::pConfig()->get($uid, "catavatar", "seed", md5(trim(strtolower($user['email']))));
184
185         // ...Or start generation
186         ob_start();
187
188         // render the picture:
189         build_cat($seed, $size);
190
191         ob_end_flush();
192
193         exit();
194 }
195
196
197
198 /**
199  * ====================
200  * CAT-AVATAR-GENERATOR
201  * ====================
202  *
203  * @authors: Andreas Gohr, David Revoy
204  *
205  * This PHP is licensed under the short and simple permissive:
206  * [MIT License](https://en.wikipedia.org/wiki/MIT_License)
207  *
208 **/
209
210 function build_cat($seed = '', $size = 0)
211 {
212         // init random seed
213         if ($seed) {
214                 srand(hexdec(substr(md5($seed), 0, 6)));
215         }
216
217         // throw the dice for body parts
218         $parts = array(
219                 'body' => rand(1, 15),
220                 'fur' => rand(1, 10),
221                 'eyes' => rand(1, 15),
222                 'mouth' => rand(1, 10),
223                 'accessorie' => rand(1, 20)
224         );
225
226         // create backgound
227         $cat = @imagecreatetruecolor(CATAVATAR_SIZE, CATAVATAR_SIZE)
228                 or die("GD image create failed");
229         $white = imagecolorallocate($cat, 255, 255, 255);
230         imagefill($cat, 0, 0, $white);
231
232         // add parts
233         foreach ($parts as $part => $num) {
234                 $file = dirname(__FILE__) . '/avatars/' . $part . '_' . $num . '.png';
235
236                 $im = @imagecreatefrompng($file);
237                 if (!$im) {
238                         die('Failed to load ' . $file);
239                 }
240                 imageSaveAlpha($im, true);
241                 imagecopy($cat, $im, 0, 0, 0, 0, CATAVATAR_SIZE, CATAVATAR_SIZE);
242                 imagedestroy($im);
243         }
244
245         // scale image
246         if ($size > 3 && $size < 7) {
247                 switch ($size) {
248                         case 4:
249                                 $size = 300;
250                                 break;
251                         case 5:
252                                 $size = 80;
253                                 break;
254                         case 6:
255                                 $size = 48;
256                                 break;
257                 }
258
259                 $dest = imagecreatetruecolor($size, $size);
260                 imagealphablending($dest, false);
261                 imagesavealpha($dest, true);
262                 imagecopyresampled($dest, $cat, 0, 0, 0, 0, $size, $size, CATAVATAR_SIZE, CATAVATAR_SIZE);
263                 imagedestroy($cat);
264                 $cat = $dest;
265         }
266
267         // restore random seed
268         if ($seed) {
269                 srand();
270         }
271
272         header('Pragma: public');
273         header('Cache-Control: max-age=86400');
274         header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', time() + 86400));
275         header('Content-Type: image/jpg');
276         imagejpeg($cat, NULL, 90);
277         imagedestroy($cat);
278 }