View file phpbb/mediaembed/event/main_listener.php

File size: 4.35Kb
<?php
/**
 *
 * phpBB Media Embed PlugIn extension for the phpBB Forum Software package.
 *
 * @copyright (c) 2016 phpBB Limited <https://www.phpbb.com>
 * @license GNU General Public License, version 2 (GPL-2.0)
 *
 */

namespace phpbb\mediaembed\event;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Event listener
 */
class main_listener implements EventSubscriberInterface
{
	/** @var \phpbb\config\config $config */
	protected $config;

	/** @var \phpbb\config\db_text $config_text */
	protected $config_text;

	/** @var \phpbb\language\language $language */
	protected $language;

	/** @var \phpbb\template\template $template */
	protected $template;

	/** @var bool $signature Posting mode is signature */
	protected $signature = false;

	public static function getSubscribedEvents()
	{
		return [
			'core.text_formatter_s9e_configure_after'	=> 'configure_media_embed',
			'core.display_custom_bbcodes'				=> 'setup_media_bbcode',
			'core.help_manager_add_block_before'		=> 'media_embed_help',
			'core.message_parser_check_message'			=> 'set_signature',
			'core.text_formatter_s9e_parser_setup'		=> 'disable_in_signature',
		];
	}

	/**
	 * Constructor
	 *
	 * @param \phpbb\config\config     $config
	 * @param \phpbb\config\db_text    $config_text
	 * @param \phpbb\language\language $language
	 * @param \phpbb\template\template $template
	 */
	public function __construct(\phpbb\config\config $config, \phpbb\config\db_text $config_text, \phpbb\language\language $language, \phpbb\template\template $template)
	{
		$this->config = $config;
		$this->language = $language;
		$this->template = $template;
		$this->config_text = $config_text;
	}

	/**
	 * Configure Media Embed PlugIn
	 *
	 * @param \phpbb\event\data $event The event object
	 */
	public function configure_media_embed($event)
	{
		/** @var \s9e\TextFormatter\Configurator $configurator */
		$configurator = $event['configurator'];

		foreach ($this->get_siteIds() as $siteId)
		{
			if (isset($configurator->BBCodes[$siteId]))
			{
				continue;
			}

			$configurator->MediaEmbed->add($siteId);
		}
	}

	/**
	 * Set template switch for displaying the [media] BBCode button
	 */
	public function setup_media_bbcode()
	{
		$this->language->add_lang('common', 'phpbb/mediaembed');
		$this->template->assign_var('S_BBCODE_MEDIA', $this->config->offsetGet('media_embed_bbcode'));
	}

	/**
	 * Add Media Embed help to the BBCode Guide
	 *
	 * @param \phpbb\event\data $event The event object
	 */
	public function media_embed_help($event)
	{
		if ($event['block_name'] === 'HELP_BBCODE_BLOCK_OTHERS')
		{
			$this->language->add_lang('help', 'phpbb/mediaembed');

			$this->template->assign_block_vars('faq_block', [
				'BLOCK_TITLE'	=> $this->language->lang('HELP_EMBEDDING_MEDIA'),
				'SWITCH_COLUMN'	=> false,
			]);

			$uid = $bitfield = $flags = '';
			$demo_text = $this->language->lang('HELP_EMBEDDING_MEDIA_DEMO');
			generate_text_for_storage($demo_text, $uid, $bitfield, $flags, true);
			$demo_display = generate_text_for_display($demo_text, $uid, $bitfield, $flags);
			$list_sites = implode(', ', $this->get_siteIds());

			$this->template->assign_block_vars('faq_block.faq_row', [
				'FAQ_QUESTION'	=> $this->language->lang('HELP_EMBEDDING_MEDIA_QUESTION'),
				'FAQ_ANSWER'	=> $this->language->lang('HELP_EMBEDDING_MEDIA_ANSWER', $demo_text, $demo_display, $list_sites),
			]);
		}
	}

	/**
	 * Set the signature property.
	 * Posting signatures is 'sig', reparsing signatures is 'user_signature'.
	 *
	 * @param \phpbb\event\data $event The event object
	 */
	public function set_signature($event)
	{
		$this->signature = $event['mode'] === 'sig' || $event['mode'] === 'text_reparser.user_signature';
	}

	/**
	 * Disable the Media Embed plugin when posting mode is a signature
	 *
	 * @param \phpbb\event\data $event The event object
	 */
	public function disable_in_signature($event)
	{
		if (!$this->signature || $this->config->offsetGet('media_embed_allow_sig'))
		{
			return;
		}

		/** @var \phpbb\textformatter\s9e\parser $service  */
		$service = $event['parser'];
		$parser = $service->get_parser();
		$parser->disablePlugin('MediaEmbed');
		$parser->disableTag('MEDIA');
	}

	/**
	 * Get allowed sites for media embedding
	 *
	 * @return array An array of sites
	 */
	protected function get_siteIds()
	{
		$siteIds = $this->config_text->get('media_embed_sites');

		return $siteIds ? json_decode($siteIds, true) : [];
	}
}