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;
|
|
}
|
|
}
|
|
}
|
|
}
|