Passed
Push — 1.5.0 ( 69a1f7...b0fcb0 )
by Sylver
03:02
created

controller::create_img()   B

Complexity

Conditions 10
Paths 10

Size

Total Lines 74
Code Lines 49

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 49
c 0
b 0
f 0
dl 0
loc 74
rs 7.246
cc 10
nc 10
nop 9

How to fix   Long Method    Complexity    Many Parameters   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
/**
4
 * @author		Sylver35 <[email protected]>
5
 * @package		Breizh Smilie Creator Extension
6
 * @copyright	(c) 2019-2024 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
		header('Pragma: public');
186
		header('Expires: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT');
187
		header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT');
188
		header('Content-Disposition: inline; filename="smilecreator-' . $text . '.png"');
189
		header('Cache-Control: maxage=10');
190
191
		// A good place for debug here if wanted
192
		if ($debug !== false)
193
		{
194
			header('Content-Type: text/html');
195
		}
196
		else
197
		{
198
			header('Content-Type: image/png');
199
			header('Content-Length: ' . @filesize(/** @scrutinizer ignore-type */$image));
0 ignored issues
show
Bug introduced by
Are you sure @filesize($image) of type false|integer can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

199
			header('Content-Length: ' . /** @scrutinizer ignore-type */ @filesize(/** @scrutinizer ignore-type */$image));
Loading history...
200
		}
201
202
		$this->template->assign_var('SMILEY', $image);
203
204
		$this->template->set_filenames([
205
			'body'	=> '@sylver35_smilecreator/smiley.html'
206
		]);
207
208
		garbage_collection();
209
		exit_handler();
210
	}
211
212
	private function build_select($type)
213
	{
214
		$list = [
215
			'silver'	=> 'C0C0C0',
216
			'darkred'	=> '8B0000',
217
			'red'		=> 'FF0000',
218
			'orange'	=> 'FFA500',
219
			'brown'		=> 'A52A2A',
220
			'green'		=> '00AA00',
221
			'olive'		=> '808000',
222
			'cyan'		=> '00FFFF',
223
			'blue'		=> '0000FF',
224
			'darkblue'	=> '00008B',
225
			'indigo'	=> '4B0082',
226
			'violet'	=> 'EE82EE',
227
			'black'		=> '000000',
228
			'yellow'	=> 'FFFF00',
229
			'white'		=> 'FFFFFF',
230
		];
231
232
		$select = '<option style="color: black;background-color: white;" value="' . (($type) ? '000000' : '0') . '">' . $this->language->lang($type ? 'COLOR_DEFAULT' : 'SHADOWCOLOR_NO') . '</option>';
233
234
		foreach ($list as $color => $code)
235
		{
236
			$background = ($color === 'white' || $color === 'yellow') ? 'black' : 'white';
237
			$select .= '<option name="' . $color . '" style="color: #' . $code . ';background-color: ' . $background . ';" value="' . $code . '">' . $this->language->lang('COLOR_' . strtoupper($color)) . '</option>';
238
		}
239
240
		return $select;
241
	}
242
243
	private function clean_text($text)
244
	{
245
		return  str_replace(
246
			['  ', 'é', 'ê', 'è', 'ë', 'É', 'Ê', 'È', 'Ë', 'à', 'â', 'ä', 'ã', 'À', 'Â', 'Ä', 'Ã', 'î', 'ï', 'Î', 'Ï', 'ó', 'ò', 'ô', 'ö', 'õ', 'Ó', 'Ò', 'Ô', 'Ö', 'Õ', 'ù', 'û', 'ü', 'Ù', 'Û', 'Ü', 'ç', 'Ç', 'ñ', 'Ñ'],
247
			[' ', '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'],
248
			str_replace(["'", '"', ',', ';', '%', '€', '£', '?', '=', '&lt;', '&gt;', '&quot;', '&amp;', '<', '>', '&'], '', $text)
249
		);
250
	}
251
252
	private function clean_nb($nb, $range)
253
	{
254
		return (($nb + $range) > 255) ? 255 : $nb + $range;
255
	}
256
257
	private function create_img($smiley, $width, $height, $fontcolor, $shadowcolor, $shieldshadow, $fontwidth, $fontheight, $output)
258
	{
259
		$image = @imagecreate($width, $height);
260
		$smiley = @imagecreatefrompng($this->ext_path . 'images/smilie' . $smiley . '.png');
261
		$schild = @imagecreatefrompng($this->ext_path . 'images/schild.png');
262
263
		if ($image === false || $smiley === false || $schild === false)
264
		{
265
			throw new http_exception(400, 'CREATE_ERROR');
266
		}
267
268
		$r1 = (int) hexdec(substr($fontcolor, 0, 2));
269
		$g1 = (int) hexdec(substr($fontcolor, 2, 2));
270
		$b1 = (int) hexdec(substr($fontcolor, 4, 2));
271
		$r2 = (int) hexdec(substr($shadowcolor, 0, 2));
272
		$g2 = (int) hexdec(substr($shadowcolor, 2, 2));
273
		$b2 = (int) hexdec(substr($shadowcolor, 4, 2));
274
		$bgcolor = imagecolorallocate($image, 111, 252, 134);
275
		$txtcolor = imagecolorallocate($image, $r1, $g1, $b1);
276
		$txt2color = imagecolorallocate($image, $r2, $g2, $b2);
277
		$bocolor = imagecolorallocate($image, 0, 0, 0);
278
		$schcolor = imagecolorallocate($image, 255, 255, 255);
279
		$shadow1color = imagecolorallocate($image, 235, 235, 235);
280
		$shadow2color = imagecolorallocate($image, 219, 219, 219);
281
		$smileycolor = imagecolorsforindex($smiley, imagecolorat($smiley, 5, 14));
282
283
		imagesetpixel($schild, 1, 14, imagecolorallocate($schild, $this->clean_nb($smileycolor['red'], 52), $this->clean_nb($smileycolor['green'], 59), $this->clean_nb($smileycolor['blue'], 11)));
284
		imagesetpixel($schild, 2, 14, imagecolorallocate($schild, $this->clean_nb($smileycolor['red'], 50), $this->clean_nb($smileycolor['green'], 52), $this->clean_nb($smileycolor['blue'], 50)));
285
		imagesetpixel($schild, 1, 15, imagecolorallocate($schild, $this->clean_nb($smileycolor['red'], 50), $this->clean_nb($smileycolor['green'], 52), $this->clean_nb($smileycolor['blue'], 50)));
286
		imagesetpixel($schild, 2, 15, imagecolorallocate($schild, $this->clean_nb($smileycolor['red'], 22), $this->clean_nb($smileycolor['green'], 21), $this->clean_nb($smileycolor['blue'], 35)));
287
		imagesetpixel($schild, 1, 16, imagecolorat($smiley, 5, 14));
288
		imagesetpixel($schild, 2, 16, imagecolorat($smiley, 5, 14));
289
		imagesetpixel($schild, 5, 16, imagecolorallocate($schild, $this->clean_nb($smileycolor['red'], 22), $this->clean_nb($smileycolor['green'], 21), $this->clean_nb($smileycolor['blue'], 35)));
290
		imagesetpixel($schild, 6, 16, imagecolorat($smiley, 5, 14));
291
		imagesetpixel($schild, 5, 15, imagecolorallocate($schild, $this->clean_nb($smileycolor['red'], 52), $this->clean_nb($smileycolor['green'], 59), $this->clean_nb($smileycolor['blue'], 11)));
292
		imagesetpixel($schild, 6, 15, imagecolorallocate($schild, $this->clean_nb($smileycolor['red'], 50), $this->clean_nb($smileycolor['green'], 52), $this->clean_nb($smileycolor['blue'], 50)));
293
294
		if (@imagecopy($image, $schild, ($width / 2 - 3), 0, 0, 0, 6, 4) === false)
295
		{
296
			throw new http_exception(400, 'CREATE_ERROR');
297
		}
298
		if (@imagecopy($image, $schild, ($width / 2 - 3), ($height - 24), 0, 5, 9, 17) === false)
299
		{
300
			throw new http_exception(400, 'CREATE_ERROR');
301
		}
302
		if (@imagecopy($image, $smiley, ($width / 2 + 6), ($height - 24), 0, 0, 23, 23) === false)
303
		{
304
			throw new http_exception(400, 'CREATE_ERROR');
305
		}
306
307
		imagefilledrectangle($image, 0, 4, $width, ($height - 25), $bocolor);
308
		imagefilledrectangle($image, 1, 5, ($width - 2), ($height - 26), $schcolor);
309
310
		if ($shieldshadow)
311
		{
312
			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);
313
			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);
314
		}
315
316
		$i = 0;
317
		while ($i < sizeof($output))
318
		{
319
			if ($shadowcolor)
320
			{
321
				imagestring($image, 2, (($width - (strlen(trim($output[$i])) * $fontwidth) - 2) / 2 + 1), ($i * $fontheight + 6), trim($output[$i]), $txt2color);
322
			}
323
			imagestring($image, 2, (($width - (strlen(trim($output[$i])) * $fontwidth) - 2) / 2), ($i * $fontheight + 5), trim($output[$i]), $txtcolor);
324
			$i++;
325
		}
326
327
		imagecolortransparent($image, $bgcolor);
328
		imageinterlace($image, 1);
329
330
		return $image;
331
	}
332
}
333