Completed
Push — develop ( 6ab4f3...bb7547 )
by Mario
02:35
created

main_controller::load_metadata()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 22
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 22
rs 9.2
cc 3
eloc 9
nc 3
nop 0
1
<?php
2
/**
3
 *
4
 * PayPal Donation extension for the phpBB Forum Software package.
5
 *
6
 * @copyright (c) 2015 Skouat
7
 * @license GNU General Public License, version 2 (GPL-2.0)
8
 *
9
 */
10
11
namespace skouat\ppde\controller;
12
13
use Symfony\Component\DependencyInjection\ContainerInterface;
14
15
class main_controller
16
{
17
	protected $auth;
18
	protected $config;
19
	protected $container;
20
	protected $extension_manager;
21
	protected $helper;
22
	protected $ppde_entity_currency;
23
	protected $ppde_entity_donation_pages;
24
	protected $ppde_entity_transactions;
25
	protected $ppde_operator_currency;
26
	protected $ppde_operator_donation_pages;
27
	protected $ppde_operator_transactions;
28
	protected $request;
29
	protected $template;
30
	protected $user;
31
	protected $root_path;
32
	protected $php_ext;
33
	/** @var array */
34
	protected $ext_meta = array();
35
	/** @var string */
36
	protected $ext_name;
37
	/** @var string */
38
	private $donation_body;
39
	/** @var array */
40
	private $donation_content_data;
41
	/** @var string */
42
	private $return_args_url;
43
	/** @var string */
44
	private $u_action;
45
46
	/**
47
	 * Constructor
48
	 *
49
	 * @param \phpbb\auth\auth                      $auth                         Auth object
50
	 * @param \phpbb\config\config                  $config                       Config object
51
	 * @param ContainerInterface                    $container                    Service container interface
52
	 * @param \phpbb\extension\manager              $extension_manager            An instance of the phpBB extension
53
	 *                                                                            manager
54
	 * @param \phpbb\controller\helper              $helper                       Controller helper object
55
	 * @param \skouat\ppde\entity\currency          $ppde_entity_currency         Currency entity object
56
	 * @param \skouat\ppde\entity\donation_pages    $ppde_entity_donation_pages   Donation pages entity object
57
	 * @param \skouat\ppde\entity\transactions      $ppde_entity_transactions     Transactions log entity object
58
	 * @param \skouat\ppde\operators\currency       $ppde_operator_currency       Currency operator object
59
	 * @param \skouat\ppde\operators\donation_pages $ppde_operator_donation_pages Donation pages operator object
60
	 * @param \skouat\ppde\operators\transactions   $ppde_operator_transactions   Transactions log operator object
61
	 * @param \phpbb\request\request                $request                      Request object
62
	 * @param \phpbb\template\template              $template                     Template object
63
	 * @param \phpbb\user                           $user                         User object
64
	 * @param string                                $root_path                    phpBB root path
65
	 * @param string                                $php_ext                      phpEx
66
	 *
67
	 * @return \skouat\ppde\controller\main_controller
68
	 * @access public
69
	 */
70
	public function __construct(\phpbb\auth\auth $auth, \phpbb\config\config $config, ContainerInterface $container, \phpbb\extension\manager $extension_manager, \phpbb\controller\helper $helper, \skouat\ppde\entity\currency $ppde_entity_currency, \skouat\ppde\entity\donation_pages $ppde_entity_donation_pages, \skouat\ppde\entity\transactions $ppde_entity_transactions, \skouat\ppde\operators\currency $ppde_operator_currency, \skouat\ppde\operators\donation_pages $ppde_operator_donation_pages, \skouat\ppde\operators\transactions $ppde_operator_transactions, \phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user, $root_path, $php_ext)
71
	{
72
		$this->auth = $auth;
73
		$this->config = $config;
74
		$this->container = $container;
75
		$this->extension_manager = $extension_manager;
76
		$this->helper = $helper;
77
		$this->ppde_entity_currency = $ppde_entity_currency;
78
		$this->ppde_entity_donation_pages = $ppde_entity_donation_pages;
79
		$this->ppde_entity_transactions = $ppde_entity_transactions;
80
		$this->ppde_operator_currency = $ppde_operator_currency;
81
		$this->ppde_operator_donation_pages = $ppde_operator_donation_pages;
82
		$this->ppde_operator_transactions = $ppde_operator_transactions;
83
		$this->request = $request;
84
		$this->template = $template;
85
		$this->user = $user;
86
		$this->root_path = $root_path;
87
		$this->php_ext = $php_ext;
88
	}
89
90
	public function handle()
91
	{
92
		// When this extension is disabled, redirect users back to the forum index
93
		// Else if user is not allowed to use it, disallow access to the extension main page
94
		if (empty($this->config['ppde_enable']))
95
		{
96
			redirect(append_sid("{$this->root_path}index.{$this->php_ext}"));
97
		}
98
		else if (!$this->can_use_ppde())
99
		{
100
			trigger_error('NOT_AUTHORISED');
101
		}
102
103
		$entity = $this->container->get('skouat.ppde.entity.donation_pages');
104
		$this->set_return_args_url($this->request->variable('return', 'body'));
105
106
		// Prepare message for display
107
		if ($this->get_donation_content_data($this->return_args_url))
108
		{
109
			$entity->get_vars();
110
			$this->donation_body = $entity->replace_template_vars($entity->get_message_for_display(
111
				$this->donation_content_data[0]['page_content'],
112
				$this->donation_content_data[0]['page_content_bbcode_uid'],
113
				$this->donation_content_data[0]['page_content_bbcode_bitfield'],
114
				$this->donation_content_data[0]['page_content_bbcode_options']
115
			));
116
		}
117
118
		$this->template->assign_vars(array(
119
			'DEFAULT_CURRENCY'   => $this->build_currency_select_menu($this->config['ppde_default_currency']),
120
			'DONATION_BODY'      => $this->donation_body,
121
			'IMG_LOADER'         => '<img src="' . $this->root_path . '../ext/skouat/ppde/images/loader.gif' . '" />',
122
			'PPDE_DEFAULT_VALUE' => $this->config['ppde_default_value'] ? $this->config['ppde_default_value'] : 0,
123
			'PPDE_LIST_VALUE'    => $this->build_currency_value_select_menu(),
124
125
			'S_HIDDEN_FIELDS'    => $this->paypal_hidden_fields(),
126
			'S_PPDE_FORM_ACTION' => $this->get_paypal_url(),
127
			'S_RETURN_ARGS'      => $this->return_args_url,
128
			'S_SANDBOX'          => $this->use_sandbox(),
129
		));
130
131
		$this->display_stats();
132
133
		// Send all data to the template file
134
		return $this->send_data_to_template();
135
	}
136
137
	public function donorlist_handle()
138
	{
139
		// When this extension is disabled, redirect users back to the forum index
140
		// Else if user is not allowed to view the donors list, disallow access to the extension page
141
		if (!$this->use_ipn())
142
		{
143
			redirect(append_sid($this->root_path . 'index.' . $this->php_ext));
144
		}
145
		else if (!$this->can_view_ppde_donorlist())
146
		{
147
			trigger_error('NOT_AUTHORISED');
148
		}
149
150
		// Get needed container
151
		/** @type \phpbb\pagination $pagination */
152
		$pagination = $this->container->get('pagination');
153
		/** @type \phpbb\path_helper $path_helper */
154
		$path_helper = $this->container->get('path_helper');
155
156
		// Set up general vars
157
		$default_key = 'd';
158
		$sort_key = $this->request->variable('sk', $default_key);
159
		$sort_dir = $this->request->variable('sd', 'd');
160
		$start = $this->request->variable('start', 0);
161
162
		// Sorting and order
163
		$sort_key_sql = array('a' => 'amount', 'd' => 'txn.payment_date', 'u' => 'u.username_clean');
164
165
		if (!isset($sort_key_sql[$sort_key]))
166
		{
167
			$sort_key = $default_key;
168
		}
169
170
		$order_by = $sort_key_sql[$sort_key] . ' ' . (($sort_dir == 'a') ? 'ASC' : 'DESC');
171
172
		// Build a relevant pagination_url and sort_url
173
		// We do not use request_var() here directly to save some calls (not all variables are set)
174
		$check_params = array(
175
			'sk'    => array('sk', $default_key),
176
			'sd'    => array('sd', 'a'),
177
			'start' => array('start', 0),
178
		);
179
180
		$params = $this->check_params($check_params, array('start'));
181
		$sort_params = $this->check_params($check_params, array('sk', 'sd'));
182
183
		// Set '$this->u_action'
184
		$use_page = ($this->u_action) ? $this->u_action : $this->user->page['page_name'];
185
		$this->u_action = reapply_sid($path_helper->get_valid_page($use_page, $this->config['enable_mod_rewrite']));
186
187
		$pagination_url = append_sid($this->u_action, implode('&amp;', $params), true, false, true);
188
		$sort_url = $this->set_url_delim(append_sid($this->u_action, implode('&amp;', $sort_params), true, false, true), $sort_params);
189
190
		$get_donorlist_sql_ary = $this->ppde_operator_transactions->get_sql_donorlist_ary(false, $order_by);
191
		$total_donors = $this->ppde_operator_transactions->query_sql_count($get_donorlist_sql_ary, 'txn.user_id');
192
		$start = $pagination->validate_start($start, $this->config['topics_per_page'], $total_donors);
193
194
		$pagination->generate_template_pagination($pagination_url, 'pagination', 'start', $total_donors, $this->config['topics_per_page'], $start);
195
196
		// adds fields to the table schema needed by entity->import()
197
		$additional_table_schema = array(
198
			'item_username'    => array('name' => 'username', 'type' => 'string'),
199
			'item_user_colour' => array('name' => 'user_colour', 'type' => 'string'),
200
			'item_amount'      => array('name' => 'amount', 'type' => 'float'),
201
			'item_max_txn_id'  => array('name' => 'max_txn_id', 'type' => 'integer'),
202
		);
203
204
		$data_ary = $this->ppde_entity_transactions->get_data($this->ppde_operator_transactions->build_sql_donorlist_data($get_donorlist_sql_ary), $additional_table_schema, $this->config['topics_per_page'], $start);
205
206
		// Get default currency data from the database
207
		$default_currency_data = $this->get_default_currency_data($this->config['ppde_default_currency']);
208
		$this->template->assign_vars(array(
209
			'TOTAL_DONORS'    => $this->user->lang('PPDE_DONORS', $total_donors),
210
			'U_SORT_AMOUNT'   => $sort_url . 'sk=a&amp;sd=' . $this->set_sort_key($sort_key, 'a', $sort_dir),
211
			'U_SORT_DONATED'  => $sort_url . 'sk=d&amp;sd=' . $this->set_sort_key($sort_key, 'd', $sort_dir),
212
			'U_SORT_USERNAME' => $sort_url . 'sk=u&amp;sd=' . $this->set_sort_key($sort_key, 'u', $sort_dir),
213
		));
214
215
		foreach ($data_ary as $data)
216
		{
217
			$get_last_transaction_sql_ary = $this->ppde_operator_transactions->get_sql_donorlist_ary($data['max_txn_id']);
218
			$last_donation_data = $this->ppde_entity_transactions->get_data($this->ppde_operator_transactions->build_sql_donorlist_data($get_last_transaction_sql_ary));
219
			$this->template->assign_block_vars('donorrow', array(
220
				'PPDE_DONOR_USERNAME'       => get_username_string('full', $data['user_id'], $data['username'], $data['user_colour']),
221
				'PPDE_LAST_DONATED_AMOUNT'  => $this->get_amount(number_format($last_donation_data[0]['mc_gross'], 2), $default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
222
				'PPDE_LAST_PAYMENT_DATE'    => $this->user->format_date($last_donation_data[0]['payment_date']),
223
				'PPDE_TOTAL_DONATED_AMOUNT' => $this->get_amount(number_format($data['amount'], 2), $default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
224
			));
225
		}
226
227
		// Set "return_args_url" object before sending data to template
228
		$this->set_return_args_url('donorlist');
229
230
		// Send all data to the template file
231
		return $this->send_data_to_template();
232
	}
233
234
	/**
235
	 * Set the sort key value
236
	 *
237
	 * @param string $sk
238
	 * @param string $sk_comp
239
	 * @param string $sd
240
	 *
241
	 * @return string
242
	 * @access private
243
	 */
244
	private function set_sort_key($sk, $sk_comp, $sd)
245
	{
246
		return ($sk == $sk_comp && $sd == 'a') ? 'd' : 'a';
247
	}
248
249
	/**
250
	 * Simply adds an url or &amp; delimiter to the url when params is empty
251
	 *
252
	 * @param $url
253
	 * @param $params
254
	 *
255
	 * @return string
256
	 * @access private
257
	 */
258
	private function set_url_delim($url, $params)
259
	{
260
		return (empty($params)) ? $url . '?' : $url . '&amp;';
261
	}
262
263
	/**
264
	 * @param array    $params_ary
265
	 * @param string[] $excluded_keys
266
	 *
267
	 * @return array
268
	 * @access private
269
	 */
270
	private function check_params($params_ary, $excluded_keys)
271
	{
272
		$params = array();
273
274
		foreach ($params_ary as $key => $call)
275
		{
276
			if (!isset($_REQUEST[$key]))
277
			{
278
				continue;
279
			}
280
281
			$param = call_user_func_array('request_var', $call);
282
			$param = urlencode($key) . '=' . ((is_string($param)) ? urlencode($param) : $param);
283
284
			if (!in_array($key, $excluded_keys))
285
			{
286
				$params[] = $param;
287
			}
288
		}
289
290
		return $params;
291
	}
292
293
	/**
294
	 * @return bool
295
	 * @access public
296
	 */
297
	public function can_use_ppde()
298
	{
299
		return $this->auth->acl_get('u_ppde_use');
300
	}
301
302
	/**
303
	 * @return bool
304
	 * @access public
305
	 */
306
	public function can_view_ppde_donorlist()
307
	{
308
		return $this->auth->acl_get('u_ppde_view_donorlist');
309
	}
310
311
	/**
312
	 * @param string $set_return_args_url
313
	 *
314
	 * @return null
315
	 * @access private
316
	 */
317
	private function set_return_args_url($set_return_args_url)
318
	{
319
		switch ($set_return_args_url)
320
		{
321
			case 'cancel':
322
			case 'success':
323
				$this->template->assign_vars(array(
324
					'L_PPDE_DONATION_TITLE' => $this->user->lang['PPDE_' . strtoupper($set_return_args_url) . '_TITLE'],
325
				));
326
				$this->return_args_url = $set_return_args_url;
327
				break;
328
			case 'donorlist':
329
				$this->template->assign_vars(array(
330
					'L_PPDE_DONORLIST_TITLE' => $this->user->lang['PPDE_DONORLIST_TITLE'],
331
				));
332
				$this->return_args_url = $set_return_args_url;
333
				break;
334
			default:
335
				$this->return_args_url = 'body';
336
		}
337
338
	}
339
340
	/**
341
	 * Get content of current donation pages
342
	 *
343
	 * @param string $return_args_url
344
	 *
345
	 * @return array
346
	 * @access private
347
	 */
348
	private function get_donation_content_data($return_args_url)
349
	{
350
		return $this->donation_content_data =
351
			$this->ppde_entity_donation_pages->get_data(
352
				$this->ppde_operator_donation_pages->build_sql_data($this->user->get_iso_lang_id(), $return_args_url));
353
	}
354
355
	/**
356
	 * Build pull down menu options of available currency
357
	 *
358
	 * @param int $config_value Currency identifier; default: 0
359
	 *
360
	 * @return null
361
	 * @access public
362
	 */
363
	public function build_currency_select_menu($config_value = 0)
364
	{
365
		// Grab the list of all enabled currencies; 0 is for all data
366
		$currency_items = $this->ppde_entity_currency->get_data($this->ppde_operator_currency->build_sql_data(0, true));
367
368
		// Process each rule menu item for pull-down
369
		foreach ($currency_items as $currency_item)
370
		{
371
			// Set output block vars for display in the template
372
			$this->template->assign_block_vars('options', array(
373
				'CURRENCY_ID'        => (int) $currency_item['currency_id'],
374
				'CURRENCY_ISO_CODE'  => $currency_item['currency_iso_code'],
375
				'CURRENCY_NAME'      => $currency_item['currency_name'],
376
				'CURRENCY_SYMBOL'    => $currency_item['currency_symbol'],
377
378
				'S_CURRENCY_DEFAULT' => $config_value == $currency_item['currency_id'],
379
			));
380
		}
381
		unset ($currency_items, $currency_item);
382
	}
383
384
	/**
385
	 * Build pull down menu options of available currency value
386
	 *
387
	 * @return string List of currency value set in ACP for dropdown menu
388
	 * @access private
389
	 */
390
	private function build_currency_value_select_menu()
391
	{
392
		$list_donation_value = '';
393
394
		if ($this->get_dropbox_status())
395
		{
396
			$donation_ary_value = explode(',', $this->config['ppde_dropbox_value']);
397
398
			foreach ($donation_ary_value as $value)
399
			{
400
				$int_value = $this->settype_dropbox_int_value($value);
401
				$list_donation_value .= !empty($int_value) ? '<option value="' . $int_value . '">' . $int_value . '</option>' : '';
402
			}
403
			unset($value);
404
		}
405
406
		return $list_donation_value;
407
	}
408
409
	/**
410
	 * Get dropbox config value
411
	 *
412
	 * @return bool
413
	 * @access private
414
	 */
415
	private function get_dropbox_status()
416
	{
417
		return $this->config['ppde_dropbox_enable'] && $this->config['ppde_dropbox_value'];
418
	}
419
420
	/**
421
	 * Force dropbox value to integer
422
	 *
423
	 * @param int $value
424
	 *
425
	 * @return int
426
	 * @access private
427
	 */
428
	private function settype_dropbox_int_value($value = 0)
429
	{
430
		if (settype($value, 'integer') && $value != 0)
431
		{
432
			return $value;
433
		}
434
435
		return 0;
436
	}
437
438
	/**
439
	 * Build PayPal hidden fields
440
	 *
441
	 * @return string PayPal hidden field needed to fill PayPal forms
442
	 * @access private
443
	 */
444
	private function paypal_hidden_fields()
445
	{
446
		return build_hidden_fields(array(
447
			'cmd'           => '_donations',
448
			'business'      => $this->get_account_id(),
449
			'item_name'     => $this->user->lang['PPDE_DONATION_TITLE_HEAD'] . ' ' . $this->config['sitename'],
450
			'no_shipping'   => 1,
451
			'return'        => $this->generate_paypal_return_url('success'),
452
			'notify_url'    => $this->generate_paypal_notify_return_url(),
453
			'cancel_return' => $this->generate_paypal_return_url('cancel'),
454
			'item_number'   => 'uid_' . $this->user->data['user_id'] . '_' . time(),
455
			'tax'           => 0,
456
			'bn'            => 'Board_Donate_WPS',
457
			'charset'       => 'utf-8',
458
		));
459
	}
460
461
	/**
462
	 * Get PayPal account id
463
	 *
464
	 * @return string $this Paypal account Identifier
465
	 * @access private
466
	 */
467
	private function get_account_id()
468
	{
469
		return $this->use_sandbox() ? $this->config['ppde_sandbox_address'] : $this->config['ppde_account_id'];
470
	}
471
472
	/**
473
	 * Check if Sandbox is enabled
474
	 *
475
	 * @return bool
476
	 * @access public
477
	 */
478
	public function use_sandbox()
479
	{
480
		return !empty($this->config['ppde_sandbox_enable']) && (!empty($this->config['ppde_sandbox_founder_enable']) && ($this->user->data['user_type'] == USER_FOUNDER) || empty($this->config['ppde_sandbox_founder_enable']));
481
	}
482
483
	/**
484
	 * Check if IPN is enabled
485
	 *
486
	 * @return bool
487
	 * @access public
488
	 */
489
	public function use_ipn()
490
	{
491
		return !empty($this->config['ppde_enable']) && !empty($this->config['ppde_ipn_enable']) && (!empty($this->config['ppde_curl_detected']) || !empty($this->config['ppde_fsockopen_detected']));
492
	}
493
494
	/**
495
	 * Generate PayPal return URL
496
	 *
497
	 * @param string $arg
498
	 *
499
	 * @return string
500
	 * @access private
501
	 */
502
	private function generate_paypal_return_url($arg)
503
	{
504
		return generate_board_url(true) . $this->helper->route('skouat_ppde_donate', array('return' => $arg));
505
	}
506
507
	/**
508
	 * Generate PayPal return notify URL
509
	 *
510
	 * @return string
511
	 * @access private
512
	 */
513
	private function generate_paypal_notify_return_url()
514
	{
515
		return generate_board_url(true) . $this->helper->route('skouat_ppde_ipn_listener');
516
	}
517
518
	/**
519
	 * Get PayPal URL
520
	 * Used in form and in IPN process
521
	 *
522
	 * @param bool $is_test_ipn
523
	 *
524
	 * @return string
525
	 * @access public
526
	 */
527
	public function get_paypal_url($is_test_ipn = false)
528
	{
529
		return ($is_test_ipn || $this->use_sandbox()) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr';
530
	}
531
532
	/**
533
	 * Assign statistics vars to the template
534
	 *
535
	 * @return null
536
	 * @access public
537
	 */
538
	public function display_stats()
539
	{
540
		if ($this->config['ppde_goal_enable'] || $this->config['ppde_raised_enable'] || $this->config['ppde_used_enable'])
541
		{
542
			// Get data from the database
543
			$default_currency_data = $this->get_default_currency_data($this->config['ppde_default_currency']);
544
545
			$this->template->assign_vars(array(
546
				'PPDE_GOAL_ENABLE'   => $this->config['ppde_goal_enable'],
547
				'PPDE_RAISED_ENABLE' => $this->config['ppde_raised_enable'],
548
				'PPDE_USED_ENABLE'   => $this->config['ppde_used_enable'],
549
550
				'L_PPDE_GOAL'        => $this->get_ppde_goal_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
551
				'L_PPDE_RAISED'      => $this->get_ppde_raised_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
552
				'L_PPDE_USED'        => $this->get_ppde_used_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
553
			));
554
555
			// Generate statistics percent for display
556
			$this->generate_stats_percent();
557
		}
558
	}
559
560
	/**
561
	 * Get default currency symbol
562
	 *
563
	 * @param int $id
564
	 *
565
	 * @return array
566
	 * @access public
567
	 */
568
	public function get_default_currency_data($id = 0)
569
	{
570
		return $this->ppde_entity_currency->get_data($this->ppde_operator_currency->build_sql_data($id, true));
571
	}
572
573
	/**
574
	 * Retrieve the language key for donation goal
575
	 *
576
	 * @param string $currency_symbol Currency symbol
577
	 * @param bool   $on_left         Symbol position
578
	 *
579
	 * @return string
580
	 * @access public
581
	 */
582
	public function get_ppde_goal_langkey($currency_symbol, $on_left = true)
583
	{
584
		if ((int) $this->config['ppde_goal'] <= 0)
585
		{
586
			$l_ppde_goal = $this->user->lang['DONATE_NO_GOAL'];
587
		}
588 View Code Duplication
		else if ((int) $this->config['ppde_goal'] < (int) $this->config['ppde_raised'])
589
		{
590
			$l_ppde_goal = $this->user->lang['DONATE_GOAL_REACHED'];
591
		}
592
		else
593
		{
594
			$l_ppde_goal = $this->user->lang('DONATE_GOAL_RAISE', $this->get_amount((int) $this->config['ppde_goal'], $currency_symbol, $on_left));
595
		}
596
597
		return $l_ppde_goal;
598
	}
599
600
	/**
601
	 * Put the currency on the left or on the right of the amount
602
	 *
603
	 * @param int    $value
604
	 * @param string $currency
605
	 * @param bool   $on_left
606
	 *
607
	 * @return string
608
	 * @access private
609
	 */
610
	private function get_amount($value, $currency, $on_left = true)
611
	{
612
		return $on_left ? $currency . $value : $value . $currency;
613
	}
614
615
	/**
616
	 * Retrieve the language key for donation raised
617
	 *
618
	 * @param string $currency_symbol Currency symbol
619
	 * @param bool   $on_left         Symbol position
620
	 *
621
	 * @return string
622
	 * @access public
623
	 */
624
	public function get_ppde_raised_langkey($currency_symbol, $on_left = true)
625
	{
626 View Code Duplication
		if ((int) $this->config['ppde_raised'] <= 0)
627
		{
628
			$l_ppde_raised = $this->user->lang['DONATE_NOT_RECEIVED'];
629
		}
630
		else
631
		{
632
			$l_ppde_raised = $this->user->lang('DONATE_RECEIVED', $this->get_amount((int) $this->config['ppde_raised'], $currency_symbol, $on_left));
633
		}
634
635
		return $l_ppde_raised;
636
	}
637
638
	/**
639
	 * Retrieve the language key for donation used
640
	 *
641
	 * @param string $currency_symbol Currency symbol
642
	 * @param bool   $on_left         Symbol position
643
	 *
644
	 * @return string
645
	 * @access public
646
	 */
647
	public function get_ppde_used_langkey($currency_symbol, $on_left = true)
648
	{
649
		if ((int) $this->config['ppde_used'] <= 0)
650
		{
651
			$l_ppde_used = $this->user->lang['DONATE_NOT_USED'];
652
		}
653
		else if ((int) $this->config['ppde_used'] < (int) $this->config['ppde_raised'])
654
		{
655
			$l_ppde_used = $this->user->lang('DONATE_USED', $this->get_amount((int) $this->config['ppde_used'], $currency_symbol, $on_left), $this->get_amount((int) $this->config['ppde_raised'], $currency_symbol, $on_left));
656
		}
657
		else
658
		{
659
			$l_ppde_used = $this->user->lang('DONATE_USED_EXCEEDED', $this->get_amount((int) $this->config['ppde_used'], $currency_symbol, $on_left));
660
		}
661
662
		return $l_ppde_used;
663
	}
664
665
	/**
666
	 * Generate statistics percent for display
667
	 *
668
	 * @return null
669
	 * @access private
670
	 */
671
	private function generate_stats_percent()
672
	{
673
		if ($this->config['ppde_goal_enable'] && (int) $this->config['ppde_goal'] > 0)
674
		{
675
			$this->assign_vars_stats_percent((int) $this->config['ppde_raised'], (int) $this->config['ppde_goal'], 'GOAL_NUMBER');
676
		}
677
678
		if ($this->config['ppde_used_enable'] && (int) $this->config['ppde_raised'] > 0 && (int) $this->config['ppde_used'] > 0)
679
		{
680
			$this->assign_vars_stats_percent((int) $this->config['ppde_used'], (int) $this->config['ppde_raised'], 'USED_NUMBER');
681
		}
682
	}
683
684
	/**
685
	 * Assign statistics percent vars to template
686
	 *
687
	 * @param integer $multiplicand
688
	 * @param integer $dividend
689
	 * @param string  $type
690
	 *
691
	 * @return null
692
	 * @access private
693
	 */
694
	private function assign_vars_stats_percent($multiplicand, $dividend, $type = '')
695
	{
696
		$this->template->assign_vars(array(
697
			'PPDE_' . $type => round(($multiplicand * 100) / $dividend, 2),
698
			'S_' . $type    => !empty($type) ? true : false,
699
		));
700
	}
701
702
	/**
703
	 * Send data to the template file
704
	 *
705
	 * @return \Symfony\Component\HttpFoundation\Response
706
	 * @access private
707
	 */
708
	private function send_data_to_template()
709
	{
710
		switch ($this->return_args_url)
711
		{
712
			case 'cancel':
713
			case 'success':
714
				return $this->helper->render('donate_body.html', $this->user->lang('PPDE_' . strtoupper($this->return_args_url) . '_TITLE'));
715
			case 'donorlist':
716
				return $this->helper->render('donorlist_body.html', $this->user->lang('PPDE_DONORLIST_TITLE'));
717
			default:
718
				return $this->helper->render('donate_body.html', $this->user->lang('PPDE_DONATION_TITLE'));
719
		}
720
	}
721
722
	/**
723
	 * Do action if it's the first time the extension is accessed
724
	 *
725
	 * @return null
726
	 * @access public
727
	 */
728
	public function first_start()
729
	{
730
		if ($this->config['ppde_first_start'])
731
		{
732
			$this->set_curl_info();
733
			$this->set_remote_detected();
734
			$this->config['ppde_first_start'] = false;
735
		}
736
	}
737
738
	/**
739
	 * Check if cURL is available
740
	 *
741
	 * @param bool $check_version
742
	 *
743
	 * @return array|bool
744
	 * @access public
745
	 */
746
	public function check_curl($check_version = false)
747
	{
748
		if (function_exists('curl_version') && $check_version)
749
		{
750
			return curl_version();
751
		}
752
753
		if (function_exists('curl_init') && function_exists('curl_exec'))
754
		{
755
			$this->get_ext_meta();
756
757
			$ch = curl_init($this->ext_meta['extra']['version-check']['host']);
758
759
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
760
761
			$response = curl_exec($ch);
762
			$response_status = strval(curl_getinfo($ch, CURLINFO_HTTP_CODE));
763
764
			curl_close($ch);
765
766
			return ($response !== false || $response_status !== '0') ? true : false;
767
		}
768
769
		return false;
770
	}
771
772
	/**
773
	 * Set config value for cURL version
774
	 *
775
	 * @return null
776
	 * @access public
777
	 */
778
	public function set_curl_info()
779
	{
780
		// Get cURL version informations
781
		if ($curl_info = $this->check_curl(true))
782
		{
783
			$this->config->set('ppde_curl_version', $curl_info['version']);
784
			$this->config->set('ppde_curl_ssl_version', $curl_info['ssl_version']);
785
		}
786
	}
787
788
	/**
789
	 * Set config value for cURL and fsockopen
790
	 *
791
	 * @return null
792
	 * @access public
793
	 */
794
	public function set_remote_detected()
795
	{
796
		$this->config->set('ppde_curl_detected', $this->check_curl());
797
		$this->config->set('ppde_fsock_detected', $this->check_fsockopen());
798
	}
799
800
	/**
801
	 * Get extension metadata
802
	 *
803
	 * @return null
804
	 * @access protected
805
	 */
806
	protected function get_ext_meta()
807
	{
808
		if (empty($this->ext_meta))
809
		{
810
			$this->load_metadata();
811
		}
812
	}
813
814
	/**
815
	 * Load metadata for this extension
816
	 *
817
	 * @return array
818
	 * @access public
819
	 */
820
	public function load_metadata()
821
	{
822
		// Retrieve the extension name based on the namespace of this file
823
		$this->retrieve_ext_name();
824
825
		// If they've specified an extension, let's load the metadata manager and validate it.
826
		if ($this->ext_name)
827
		{
828
			$md_manager = new \phpbb\extension\metadata_manager($this->ext_name, $this->config, $this->extension_manager, $this->template, $this->user, $this->root_path);
829
830
			try
831
			{
832
				$this->ext_meta = $md_manager->get_metadata('all');
833
			}
834
			catch (\phpbb\extension\exception $e)
835
			{
836
				trigger_error($e, E_USER_WARNING);
837
			}
838
		}
839
840
		return $this->ext_meta;
841
	}
842
843
	/**
844
	 * Retrieve the extension name
845
	 *
846
	 * @return null
847
	 * @access protected
848
	 */
849
	protected function retrieve_ext_name()
850
	{
851
		$namespace_ary = explode('\\', __NAMESPACE__);
852
		$this->ext_name = $namespace_ary[0] . '/' . $namespace_ary[1];
853
	}
854
855
	/**
856
	 * Check if fsockopen is available
857
	 *
858
	 * @return bool
859
	 * @access public
860
	 */
861
	public function check_fsockopen()
862
	{
863
		if (function_exists('fsockopen'))
864
		{
865
			$this->get_ext_meta();
866
867
			$url = parse_url($this->ext_meta['extra']['version-check']['host']);
868
869
			$fp = @fsockopen($url['path'], 80);
870
871
			return ($fp !== false) ? true : false;
872
		}
873
874
		return false;
875
	}
876
}
877