commit 80ad09dd3b216c44b51f71582674b6fceb3cf684 Author: Evan Prodromou Date: Tue Dec 20 12:24:22 2011 -0500 Initial version gets score at end of notice save diff --git a/ActivitySpamPlugin.php b/ActivitySpamPlugin.php new file mode 100644 index 0000000000..473ba9ded0 --- /dev/null +++ b/ActivitySpamPlugin.php @@ -0,0 +1,163 @@ +. + * + * @category Spam + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * Check new notices with activity spam service. + * + * @category Spam + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ +class ActivitySpamPlugin extends Plugin +{ + public $server = null; + + public $username = null; + public $password = null; + + /** + * Initializer + * + * @return boolean hook value; true means continue processing, false means stop. + */ + function initialize() + { + foreach (array('username', 'password', 'server') as $attr) { + if (!$this->$attr) { + $this->$attr = common_config('activityspam', $attr); + } + } + + return true; + } + + /** + * Database schema setup + * + * @see Schema + * @see ColumnDef + * + * @return boolean hook value; true means continue processing, false means stop. + */ + + function onCheckSchema() + { + $this->log(LOG_INFO, "Checking schema"); + + $schema = Schema::get(); + $schema->ensureTable('spam_score', Spam_score::schemaDef()); + + $this->log(LOG_INFO, "Checked schema"); + + return true; + } + + /** + * Load related modules when needed + * + * @param string $cls Name of the class to be loaded + * + * @return boolean hook value; true means continue processing, false means stop. + */ + + function onAutoload($cls) + { + $dir = dirname(__FILE__); + + switch ($cls) + { + case 'Spam_score': + include_once $dir . '/'.$cls.'.php'; + return false; + default: + return true; + } + } + + /** + * This should probably be done in its own queue handler + */ + + function onEndNoticeSave($notice) + { + // FIXME: need this to autoload ActivityStreamsMediaLink + $doc = new ActivityStreamJSONDocument(); + + $activity = $notice->asActivity(null); + + $client = new HTTPClient($this->server . "/is-this-spam"); + + $client->setMethod('POST'); + $client->setAuth($this->username, $this->password); + $client->setHeader('Content-Type', 'application/json'); + $client->setBody(json_encode($activity->asArray())); + + $response = $client->send(); + + if (!$response->isOK()) { + $this->log(LOG_ERR, "Error " . $response->getStatus() . " checking spam score: " . $response->getBody()); + return true; + } + + $result = json_decode($response->getBody()); + + $score = new Spam_score(); + + $score->notice_id = $notice->id; + $score->score = $result->probability; + $score->created = common_sql_now(); + + $score->insert(); + + $this->log(LOG_INFO, "Notice " . $notice->id . " has spam score " . $score->score); + + return true; + } + + function onPluginVersion(&$versions) + { + $versions[] = array('name' => 'ActivitySpam', + 'version' => STATUSNET_VERSION, + 'author' => 'Evan Prodromou', + 'homepage' => 'http://status.net/wiki/Plugin:ActivitySpam', + 'description' => + _m('Test notices against the Activity Spam service.')); + return true; + } +} diff --git a/Spam_score.php b/Spam_score.php new file mode 100644 index 0000000000..fde2876d0c --- /dev/null +++ b/Spam_score.php @@ -0,0 +1,96 @@ +. + * + * @category Spam + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * Score of a notice per the activity spam service + * + * @category Spam + * @package StatusNet + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + * + * @see DB_DataObject + */ + +class Spam_score extends Managed_DataObject +{ + public $__table = 'spam_score'; // table name + + public $notice_id; // int + public $score; // float + public $created; // datetime + + /** + * Get an instance by key + * + * @param string $k Key to use to lookup (usually 'notice_id' for this class) + * @param mixed $v Value to lookup + * + * @return Spam_score object found, or null for no hits + * + */ + function staticGet($k, $v=null) + { + return Managed_DataObject::staticGet('Spam_score', $k, $v); + } + + /** + * The One True Thingy that must be defined and declared. + */ + public static function schemaDef() + { + return array( + 'description' => 'score of the notice per activityspam', + 'fields' => array( + 'notice_id' => array('type' => 'int', + 'not null' => true, + 'description' => 'notice getting scored'), + 'score' => array('type' => 'double', + 'not null' => true, + 'description' => 'score for the notice (0.0, 1.0)'), + 'created' => array('type' => 'datetime', + 'not null' => true, + 'description' => 'date this record was created'), + ), + 'primary key' => array('notice_id'), + 'foreign keys' => array( + 'spam_score_notice_id_fkey' => array('notice', array('notice_id' => 'id')), + ), + 'indexes' => array( + 'spam_score_created_idx' => array('created'), + ), + ); + } +}