1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
/** |
4
|
|
|
* @author Sylver35 <[email protected]> |
5
|
|
|
* @package Breizh Smilie Creator Extension |
6
|
|
|
* @copyright (c) 2019-2025 Sylver35 https://breizhcode.com |
7
|
|
|
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 |
8
|
|
|
*/ |
9
|
|
|
|
10
|
|
|
namespace sylver35\smilecreator\controller; |
11
|
|
|
use phpbb\config\config; |
12
|
|
|
use phpbb\request\request; |
13
|
|
|
use phpbb\controller\helper; |
14
|
|
|
use phpbb\template\template; |
15
|
|
|
use phpbb\language\language; |
16
|
|
|
use phpbb\exception\http_exception; |
17
|
|
|
|
18
|
|
|
class controller |
19
|
|
|
{ |
20
|
|
|
/** @var \phpbb\config\config */ |
21
|
|
|
protected $config; |
22
|
|
|
|
23
|
|
|
/** @var \phpbb\request\request */ |
24
|
|
|
protected $request; |
25
|
|
|
|
26
|
|
|
/** @var \phpbb\controller\helper */ |
27
|
|
|
protected $helper; |
28
|
|
|
|
29
|
|
|
/** @var \phpbb\template\template */ |
30
|
|
|
protected $template; |
31
|
|
|
|
32
|
|
|
/** @var \phpbb\language\language */ |
33
|
|
|
protected $language; |
34
|
|
|
|
35
|
|
|
/** @var string phpBB root path */ |
36
|
|
|
protected $root_path; |
37
|
|
|
|
38
|
|
|
/** @var string phpEx */ |
39
|
|
|
protected $php_ext; |
40
|
|
|
|
41
|
|
|
/** @var string ext path */ |
42
|
|
|
protected $ext_path; |
43
|
|
|
|
44
|
|
|
/** @var string ext path web */ |
45
|
|
|
protected $ext_path_web; |
46
|
|
|
|
47
|
|
|
/** |
48
|
|
|
* Controller constructor |
49
|
|
|
*/ |
50
|
|
|
public function __construct(config $config, request $request, helper $helper, template $template, language $language, $root_path, $php_ext) |
51
|
|
|
{ |
52
|
|
|
$this->config = $config; |
53
|
|
|
$this->request = $request; |
54
|
|
|
$this->helper = $helper; |
55
|
|
|
$this->template = $template; |
56
|
|
|
$this->language = $language; |
57
|
|
|
$this->root_path = $root_path; |
58
|
|
|
$this->php_ext = $php_ext; |
59
|
|
|
$this->ext_path = $root_path . 'ext/sylver35/smilecreator/'; |
60
|
|
|
$this->ext_path_web = generate_board_url() . '/ext/sylver35/smilecreator/'; |
61
|
|
|
} |
62
|
|
|
|
63
|
|
|
public function create_smiley() |
64
|
|
|
{ |
65
|
|
|
$this->language->add_lang('smilie_creator', 'sylver35/smilecreator'); |
66
|
|
|
//Get all available smilies ( *.png ) |
67
|
|
|
if (!function_exists('filelist')) |
68
|
|
|
{ |
69
|
|
|
include($this->root_path . 'includes/functions_admin.' . $this->php_ext); |
70
|
|
|
} |
71
|
|
|
$imglist = filelist($this->ext_path . 'images/', '', 'png'); |
72
|
|
|
|
73
|
|
|
$j = $i = 0; |
74
|
|
|
foreach ($imglist as $key => $images) |
75
|
|
|
{ |
76
|
|
|
natcasesort($images); |
77
|
|
|
foreach ($images as $img) |
78
|
|
|
{ |
79
|
|
|
if ($img == 'schild.png') |
80
|
|
|
{ |
81
|
|
|
continue; |
82
|
|
|
} |
83
|
|
|
//If we have more than 5 smilies in a row, create a new row |
84
|
|
|
$rows = false; |
85
|
|
|
if ($j === 5) |
86
|
|
|
{ |
87
|
|
|
$rows = true; |
88
|
|
|
$j = 0; |
89
|
|
|
} |
90
|
|
|
$value = substr($img, 0, strrpos($img, '.')); |
91
|
|
|
$number = str_replace('smilie', '', $value); |
92
|
|
|
|
93
|
|
|
// Put the smileys into the table |
94
|
|
|
$this->template->assign_block_vars('smileys', [ |
95
|
|
|
'NR' => $i, |
96
|
|
|
'SRC' => $img, |
97
|
|
|
'TITLE' => $value, |
98
|
|
|
'SELECT' => $number, |
99
|
|
|
'ROWS' => $rows, |
100
|
|
|
]); |
101
|
|
|
$i++; |
102
|
|
|
$j++; |
103
|
|
|
} |
104
|
|
|
} |
105
|
|
|
if ((int) $this->config['smiliecreator_count'] !== $i) |
106
|
|
|
{ |
107
|
|
|
$this->config->set('smiliecreator_count', $i); |
108
|
|
|
} |
109
|
|
|
|
110
|
|
|
$this->template->assign_vars([ |
111
|
|
|
'S_IN_CREATE_SMILEY' => true, |
112
|
|
|
'SMILEY_RANDOM' => $i + 1, |
113
|
|
|
'SELECT_FONTCOLOR' => $this->build_select(true), |
114
|
|
|
'SELECT_SHADOWCOLOR' => $this->build_select(false), |
115
|
|
|
'SMILEYS_SRC' => $this->ext_path_web . 'images/', |
116
|
|
|
]); |
117
|
|
|
|
118
|
|
|
return $this->helper->render('smilie_creator.html', $this->language->lang('SMILIE_CREATOR')); |
119
|
|
|
} |
120
|
|
|
|
121
|
|
|
public function display_smiley() |
122
|
|
|
{ |
123
|
|
|
$text = (string) $this->request->variable('text', '', true); |
124
|
|
|
$smiley = (int) $this->request->variable('smiley', 0); |
125
|
|
|
$fontcolor = (string) $this->request->variable('fontcolor', ''); |
126
|
|
|
$shadowcolor = (string) $this->request->variable('shadowcolor', ''); |
127
|
|
|
$shieldshadow = (int) $this->request->variable('shieldshadow', 0); |
128
|
|
|
$fontwidth = 6; |
129
|
|
|
$fontheight = 11; |
130
|
|
|
$this->language->add_lang('smilie_creator', 'sylver35/smilecreator'); |
131
|
|
|
|
132
|
|
|
// Smilie no exist ? |
133
|
|
|
if ($smiley > $this->config['smiliecreator_count']) |
134
|
|
|
{ |
135
|
|
|
$smiley = 0; |
136
|
|
|
} |
137
|
|
|
// We have a random smilie ? |
138
|
|
|
if ($smiley === 0) |
139
|
|
|
{ |
140
|
|
|
$smiley = mt_rand(1, (int) $this->config['smiliecreator_count'] - 1); |
141
|
|
|
} |
142
|
|
|
|
143
|
|
|
// See if the debug mode is wanted |
144
|
|
|
$debug = (strrpos($text, 'debug-mode') !== false) ? true : false; |
145
|
|
|
|
146
|
|
|
// Clean the text before |
147
|
|
|
$text = $this->clean_text($text); |
148
|
|
|
|
149
|
|
|
$output = []; |
150
|
|
|
$char_count = 40; |
151
|
|
|
$nb = mb_strlen($text); |
152
|
|
|
if ($nb > 40) |
153
|
|
|
{ |
154
|
|
|
$output[0] = substr($text, 0, 40); |
155
|
|
|
if ($nb > 120) |
156
|
|
|
{ |
157
|
|
|
$output[1] = substr($text, 40, 40); |
158
|
|
|
$output[2] = substr($text, 80, 37) . '...'; |
159
|
|
|
} |
160
|
|
|
else if ($nb > 80) |
161
|
|
|
{ |
162
|
|
|
$output[1] = substr($text, 40, 40); |
163
|
|
|
$output[2] = substr($text, 80, 40); |
164
|
|
|
} |
165
|
|
|
else |
166
|
|
|
{ |
167
|
|
|
$output[1] = substr($text, 40, 40); |
168
|
|
|
} |
169
|
|
|
} |
170
|
|
|
else |
171
|
|
|
{ |
172
|
|
|
$char_count = $nb; |
173
|
|
|
$output[0] = $text; |
174
|
|
|
} |
175
|
|
|
|
176
|
|
|
// Maybe we have to tweak here a bit. Depends on the font... |
177
|
|
|
$in = ($char_count * $fontwidth) + 14; |
178
|
|
|
$width = ($in < 60) ? 60 : $in; |
179
|
|
|
$out = sizeof($output); |
180
|
|
|
$height = ($out * $fontheight) + 35; |
181
|
|
|
|
182
|
|
|
// Main work here |
183
|
|
|
// Create image and send it to the browser |
184
|
|
|
$image = @imagepng($this->create_img($smiley, $width, $height, $fontcolor, $shadowcolor, $shieldshadow, $fontwidth, $fontheight, $output), NULL, -1, PNG_ALL_FILTERS); |
185
|
|
|
// Build headers now |
186
|
|
|
$this->build_headers($image, $text, $debug); |
187
|
|
|
|
188
|
|
|
$this->template->assign_var('SMILEY', $image); |
189
|
|
|
|
190
|
|
|
$this->template->set_filenames([ |
191
|
|
|
'body' => '@sylver35_smilecreator/smiley.html' |
192
|
|
|
]); |
193
|
|
|
|
194
|
|
|
garbage_collection(); |
195
|
|
|
exit_handler(); |
196
|
|
|
} |
197
|
|
|
|
198
|
|
|
private function build_headers($image, $text, $debug) |
199
|
|
|
{ |
200
|
|
|
header('Pragma: public'); |
201
|
|
|
header('Expires: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT'); |
202
|
|
|
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT'); |
203
|
|
|
header('Content-Disposition: inline; filename="smilecreator-' . $text . '.png"'); |
204
|
|
|
header('Cache-Control: maxage=10'); |
205
|
|
|
|
206
|
|
|
// A good place for debug here if wanted |
207
|
|
|
if ($debug !== false) |
208
|
|
|
{ |
209
|
|
|
header('Content-Type: text/html'); |
210
|
|
|
} |
211
|
|
|
else |
212
|
|
|
{ |
213
|
|
|
header('Content-Type: image/png'); |
214
|
|
|
if ($filesize = filesize(/** @scrutinizer ignore-type */$image)) |
215
|
|
|
{ |
216
|
|
|
header('Content-Length: ' . $filesize); |
217
|
|
|
} |
218
|
|
|
} |
219
|
|
|
} |
220
|
|
|
|
221
|
|
|
private function build_select($type) |
222
|
|
|
{ |
223
|
|
|
$list = [ |
224
|
|
|
'silver' => 'C0C0C0', |
225
|
|
|
'darkred' => '8B0000', |
226
|
|
|
'red' => 'FF0000', |
227
|
|
|
'orange' => 'FFA500', |
228
|
|
|
'brown' => 'A52A2A', |
229
|
|
|
'green' => '00AA00', |
230
|
|
|
'olive' => '808000', |
231
|
|
|
'cyan' => '00FFFF', |
232
|
|
|
'blue' => '0000FF', |
233
|
|
|
'darkblue' => '00008B', |
234
|
|
|
'indigo' => '4B0082', |
235
|
|
|
'violet' => 'EE82EE', |
236
|
|
|
'black' => '000000', |
237
|
|
|
'yellow' => 'FFFF00', |
238
|
|
|
'white' => 'FFFFFF', |
239
|
|
|
]; |
240
|
|
|
|
241
|
|
|
$select = '<option style="color: black;background-color: white;" value="' . (($type) ? '000000' : '0') . '">' . $this->language->lang($type ? 'COLOR_DEFAULT' : 'SHADOWCOLOR_NO') . '</option>'; |
242
|
|
|
|
243
|
|
|
foreach ($list as $color => $code) |
244
|
|
|
{ |
245
|
|
|
$background = ($color === 'white' || $color === 'yellow') ? 'black' : 'white'; |
246
|
|
|
$select .= '<option name="' . $color . '" style="color: #' . $code . ';background-color: ' . $background . ';" value="' . $code . '">' . $this->language->lang('COLOR_' . strtoupper($color)) . '</option>'; |
247
|
|
|
} |
248
|
|
|
|
249
|
|
|
return $select; |
250
|
|
|
} |
251
|
|
|
|
252
|
|
|
private function clean_text($text) |
253
|
|
|
{ |
254
|
|
|
return str_replace( |
255
|
|
|
[' ', 'é', 'ê', 'è', 'ë', 'É', 'Ê', 'È', 'Ë', 'à', 'â', 'ä', 'ã', 'À', 'Â', 'Ä', 'Ã', 'î', 'ï', 'Î', 'Ï', 'ó', 'ò', 'ô', 'ö', 'õ', 'Ó', 'Ò', 'Ô', 'Ö', 'Õ', 'ù', 'û', 'ü', 'Ù', 'Û', 'Ü', 'ç', 'Ç', 'ñ', 'Ñ'], |
256
|
|
|
[' ', 'e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'i', 'i', 'I', 'I', 'o', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'O', 'u', 'u', 'u', 'U', 'U', 'U', 'c', 'c', 'n', 'n'], |
257
|
|
|
str_replace(["'", '"', ',', ';', '%', '€', '£', '?', '=', '<', '>', '"', '&', '<', '>', '&'], '', $text) |
258
|
|
|
); |
259
|
|
|
} |
260
|
|
|
|
261
|
|
|
private function clean_nb($nb, $range) |
262
|
|
|
{ |
263
|
|
|
return (($nb + $range) > 255) ? 255 : $nb + $range; |
264
|
|
|
} |
265
|
|
|
|
266
|
|
|
private function create_img($smiley, $width, $height, $fontcolor, $shadowcolor, $shieldshadow, $fontwidth, $fontheight, $output) |
267
|
|
|
{ |
268
|
|
|
$image = @imagecreate($width, $height); |
269
|
|
|
$smiley = @imagecreatefrompng($this->ext_path . 'images/smilie' . $smiley . '.png'); |
270
|
|
|
$schild = @imagecreatefrompng($this->ext_path . 'images/schild.png'); |
271
|
|
|
|
272
|
|
|
if ($image === false || $smiley === false || $schild === false) |
273
|
|
|
{ |
274
|
|
|
throw new http_exception(400, 'CREATE_ERROR'); |
275
|
|
|
} |
276
|
|
|
|
277
|
|
|
$r1 = (int) hexdec(substr($fontcolor, 0, 2)); |
278
|
|
|
$g1 = (int) hexdec(substr($fontcolor, 2, 2)); |
279
|
|
|
$b1 = (int) hexdec(substr($fontcolor, 4, 2)); |
280
|
|
|
$r2 = (int) hexdec(substr($shadowcolor, 0, 2)); |
281
|
|
|
$g2 = (int) hexdec(substr($shadowcolor, 2, 2)); |
282
|
|
|
$b2 = (int) hexdec(substr($shadowcolor, 4, 2)); |
283
|
|
|
$bgcolor = imagecolorallocate($image, 111, 252, 134); |
284
|
|
|
$txtcolor = imagecolorallocate($image, $r1, $g1, $b1); |
285
|
|
|
$txt2color = imagecolorallocate($image, $r2, $g2, $b2); |
286
|
|
|
$bocolor = imagecolorallocate($image, 0, 0, 0); |
287
|
|
|
$schcolor = imagecolorallocate($image, 255, 255, 255); |
288
|
|
|
$shadow1color = imagecolorallocate($image, 235, 235, 235); |
289
|
|
|
$shadow2color = imagecolorallocate($image, 219, 219, 219); |
290
|
|
|
$smileycolor = imagecolorsforindex($smiley, imagecolorat($smiley, 5, 14)); |
291
|
|
|
|
292
|
|
|
imagesetpixel($schild, 1, 14, imagecolorallocate($schild, $this->clean_nb($smileycolor['red'], 52), $this->clean_nb($smileycolor['green'], 59), $this->clean_nb($smileycolor['blue'], 11))); |
293
|
|
|
imagesetpixel($schild, 2, 14, imagecolorallocate($schild, $this->clean_nb($smileycolor['red'], 50), $this->clean_nb($smileycolor['green'], 52), $this->clean_nb($smileycolor['blue'], 50))); |
294
|
|
|
imagesetpixel($schild, 1, 15, imagecolorallocate($schild, $this->clean_nb($smileycolor['red'], 50), $this->clean_nb($smileycolor['green'], 52), $this->clean_nb($smileycolor['blue'], 50))); |
295
|
|
|
imagesetpixel($schild, 2, 15, imagecolorallocate($schild, $this->clean_nb($smileycolor['red'], 22), $this->clean_nb($smileycolor['green'], 21), $this->clean_nb($smileycolor['blue'], 35))); |
296
|
|
|
imagesetpixel($schild, 1, 16, imagecolorat($smiley, 5, 14)); |
297
|
|
|
imagesetpixel($schild, 2, 16, imagecolorat($smiley, 5, 14)); |
298
|
|
|
imagesetpixel($schild, 5, 16, imagecolorallocate($schild, $this->clean_nb($smileycolor['red'], 22), $this->clean_nb($smileycolor['green'], 21), $this->clean_nb($smileycolor['blue'], 35))); |
299
|
|
|
imagesetpixel($schild, 6, 16, imagecolorat($smiley, 5, 14)); |
300
|
|
|
imagesetpixel($schild, 5, 15, imagecolorallocate($schild, $this->clean_nb($smileycolor['red'], 52), $this->clean_nb($smileycolor['green'], 59), $this->clean_nb($smileycolor['blue'], 11))); |
301
|
|
|
imagesetpixel($schild, 6, 15, imagecolorallocate($schild, $this->clean_nb($smileycolor['red'], 50), $this->clean_nb($smileycolor['green'], 52), $this->clean_nb($smileycolor['blue'], 50))); |
302
|
|
|
|
303
|
|
|
if (@imagecopy($image, $schild, ($width / 2 - 3), 0, 0, 0, 6, 4) === false) |
304
|
|
|
{ |
305
|
|
|
throw new http_exception(400, 'CREATE_ERROR'); |
306
|
|
|
} |
307
|
|
|
if (@imagecopy($image, $schild, ($width / 2 - 3), ($height - 24), 0, 5, 9, 17) === false) |
308
|
|
|
{ |
309
|
|
|
throw new http_exception(400, 'CREATE_ERROR'); |
310
|
|
|
} |
311
|
|
|
if (@imagecopy($image, $smiley, ($width / 2 + 6), ($height - 24), 0, 0, 23, 23) === false) |
312
|
|
|
{ |
313
|
|
|
throw new http_exception(400, 'CREATE_ERROR'); |
314
|
|
|
} |
315
|
|
|
|
316
|
|
|
imagefilledrectangle($image, 0, 4, $width, ($height - 25), $bocolor); |
317
|
|
|
imagefilledrectangle($image, 1, 5, ($width - 2), ($height - 26), $schcolor); |
318
|
|
|
|
319
|
|
|
if ($shieldshadow) |
320
|
|
|
{ |
321
|
|
|
imagefilledpolygon($image, [(($width - 2) / 2 + ((($width - 2) / 4) - 3)), 5, (($width - 2) / 2 + ((($width - 2) / 4) + 3)), 5, (($width - 2) / 2 - ((($width - 2) / 4) - 3)), ($height - 26), (($width - 2) / 2 - ((($width - 2) / 4) + 3)), ($height - 26)], 4, $shadow1color); |
322
|
|
|
imagefilledpolygon($image, [(($width - 2) / 2 + ((($width - 2) / 4) + 4)), 5, ($width - 2), 5, ($width - 2), ($height - 26), (($width - 2) / 2 - ((($width - 2) / 4) - 4)), ($height - 26)], 4, $shadow2color); |
323
|
|
|
} |
324
|
|
|
|
325
|
|
|
$i = 0; |
326
|
|
|
while ($i < sizeof($output)) |
327
|
|
|
{ |
328
|
|
|
if ($shadowcolor) |
329
|
|
|
{ |
330
|
|
|
imagestring($image, 2, (($width - (strlen(trim($output[$i])) * $fontwidth) - 2) / 2 + 1), ($i * $fontheight + 6), trim($output[$i]), $txt2color); |
331
|
|
|
} |
332
|
|
|
imagestring($image, 2, (($width - (strlen(trim($output[$i])) * $fontwidth) - 2) / 2), ($i * $fontheight + 5), trim($output[$i]), $txtcolor); |
333
|
|
|
$i++; |
334
|
|
|
} |
335
|
|
|
|
336
|
|
|
imagecolortransparent($image, $bgcolor); |
337
|
|
|
imageinterlace($image, 1); |
338
|
|
|
|
339
|
|
|
return $image; |
340
|
|
|
} |
341
|
|
|
} |
342
|
|
|
|