forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			121 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Phergie
 | 
						|
 *
 | 
						|
 * PHP version 5
 | 
						|
 *
 | 
						|
 * LICENSE
 | 
						|
 *
 | 
						|
 * This source file is subject to the new BSD license that is bundled
 | 
						|
 * with this package in the file LICENSE.
 | 
						|
 * It is also available through the world-wide-web at this URL:
 | 
						|
 * http://phergie.org/license
 | 
						|
 *
 | 
						|
 * @category  Phergie
 | 
						|
 * @package   Phergie_Plugin_Censor
 | 
						|
 * @author    Phergie Development Team <team@phergie.org>
 | 
						|
 * @copyright 2008-2010 Phergie Development Team (http://phergie.org)
 | 
						|
 * @license   http://phergie.org/license New BSD License
 | 
						|
 * @link      http://pear.phergie.org/package/Phergie_Plugin_Censor
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * Facilitates censoring of event content or discardment of events
 | 
						|
 * containing potentially offensive phrases depending on the value of the
 | 
						|
 * configuration setting censor.mode ('off', 'censor', 'discard'). Also
 | 
						|
 * provides access to a web service for detecting censored words so that
 | 
						|
 * other plugins may optionally integrate and adjust behavior accordingly to
 | 
						|
 * prevent discardment of events.
 | 
						|
 *
 | 
						|
 * @category Phergie
 | 
						|
 * @package  Phergie_Plugin_Censor
 | 
						|
 * @author   Phergie Development Team <team@phergie.org>
 | 
						|
 * @license  http://phergie.org/license New BSD License
 | 
						|
 * @link     http://pear.phergie.org/package/Phergie_Plugin_Censor
 | 
						|
 * @uses     extension soap
 | 
						|
 */
 | 
						|
class Phergie_Plugin_Censor extends Phergie_Plugin_Abstract
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * SOAP client to interact with the CDYNE Profanity Filter API
 | 
						|
     *
 | 
						|
     * @var SoapClient
 | 
						|
     */
 | 
						|
    protected $soap;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Checks for dependencies.
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function onLoad()
 | 
						|
    {
 | 
						|
        if (!extension_loaded('soap')) {
 | 
						|
            $this->fail('The PHP soap extension is required');
 | 
						|
        }
 | 
						|
 | 
						|
        if (!in_array($this->config['censor.mode'], array('censor', 'discard'))) {
 | 
						|
            $this->plugins->removePlugin($this);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns a "clean" version of a given string.
 | 
						|
     *
 | 
						|
     * @param string $string String to clean
 | 
						|
     *
 | 
						|
     * @return string Cleaned string
 | 
						|
     */
 | 
						|
    public function cleanString($string)
 | 
						|
    {
 | 
						|
        if (empty($this->soap)) {
 | 
						|
            $this->soap = new SoapClient('http://ws.cdyne.com/ProfanityWS/Profanity.asmx?wsdl');
 | 
						|
        }
 | 
						|
        $params = array('Text' => $string);
 | 
						|
        $attempts = 0;
 | 
						|
        while ($attempts < 3) {
 | 
						|
            try {
 | 
						|
                $response = $this->soap->SimpleProfanityFilter($params);
 | 
						|
                break;
 | 
						|
            } catch (SoapFault $e) {
 | 
						|
                $attempts++;
 | 
						|
                sleep(1);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if ($attempts == 3) {
 | 
						|
            return $string;
 | 
						|
        }
 | 
						|
        return $response->SimpleProfanityFilterResult->CleanText;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Processes events before they are dispatched and either censors their
 | 
						|
     * content or discards them if they contain potentially offensive
 | 
						|
     * content.
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function preDispatch()
 | 
						|
    {
 | 
						|
        $events = $this->events->getEvents();
 | 
						|
 | 
						|
        foreach ($events as $event) {
 | 
						|
            switch ($event->getType()) {
 | 
						|
                case Phergie_Event_Request::TYPE_PRIVMSG:
 | 
						|
                case Phergie_Event_Request::TYPE_ACTION:
 | 
						|
                case Phergie_Event_Request::TYPE_NOTICE:
 | 
						|
                    $text = $event->getArgument(1);
 | 
						|
                    $clean = $this->cleanString($text);
 | 
						|
                    if ($text != $clean) {
 | 
						|
                        if ($this->config['censor.mode'] == 'censor') {
 | 
						|
                            $event->setArgument(1, $clean);
 | 
						|
                        } else {
 | 
						|
                            $this->events->removeEvent($event);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |