Hola,
¿Un código nada obvio? ¡Marchando!
Código PHP:
<?php
class GbDefensio extends GbPlugin
{
private $statsCache;
public function __construct($pluginData){
$this->statsCache = array();
parent::__construct($pluginData);
}
public function OnActivatePlugin(){
if($this->PrepareDatabase()){
$this->SetOptions($this->GetDefaultOptions(), 1);
}else{
return new GbError(
$this->_rp('Sorry, GbDefensio cannot be install')
);
}
}
public function OnDeactivatePlugin(){
if(!$this->DeleteDatabase()){
return new GbError(
$this->_rp('Sorry, GbDefensio cannot be uninstall')
);
}
}
public function ActionCallback($actionID, $args){
if($actionID == GBPLUGINS_ACTION_COMMENT_NEW){
$this->CheckNewComment($args);
}elseif($actionID == GBPLUGINS_ACTION_COMMENTS_UPDATE){
$this->CheckUpdateComments($args);
}
return null;
}
public function ShowStats(){
$stats = $this->GetStats();
if(!empty($stats)){
$falsePos = sprintf(
$this->_rp('%s false positives'),
$stats['false-positives']
);
$falseNeg = sprintf(
$this->_rp('%s false negatives'),
$stats['false-negatives']
);
$accuracy = sprintf(
$this->_rp('%s %% accuracy'),
round($stats['accuracy'] * 100, 2)
);
$spam = sprintf(
$this->_rp('%s spam'), $stats['spam']
);
$ham = sprintf(
$this->_rp('%s innocents'), $stats['ham']
);
$ham = StrUtils::SafeHtm($ham);
$spam = StrUtils::SafeHtm($spam);
$accuracy = StrUtils::SafeHtm($accuracy);
$falsePos = StrUtils::SafeHtm($falsePos);
$falseNeg = StrUtils::SafeHtm($falseNeg);
echo"
<div class=\"gbdefensiostats\">
<ul>
<li class=\"accuracy\">{$accuracy}</li>
<li class=\"spam\">{$spam}</li>
<li class=\"ham\">{$ham}</li>
<li class=\"falsepos\">{$falsePos}</li>
<li class=\"falseneg\">{$falseNeg}</li>
</ul>
</div>";
}
return true;
}
public function ShowCounter($args = array()){
$stats = $this->GetStats();
if(!empty($stats)){
$defaultArgs = array(
'skin' => 'light'
);
$args = array_merge($defaultArgs, $args);
$imgPath = $this->GetDirImagesPath().GBDEFENSIO_COUNTER_IMAGE;
if(is_readable($imgPath)){
$query = http_build_query(array(
'skin' => $args['skin'],
'number' => $stats['spam']
));
$imgDir = $this->GetDirImagesUrl();
$imgUrl = $imgDir.GBDEFENSIO_COUNTER_IMAGE.'?'.$query;
$imgText = StrUtils::SafeHtm(
$this->_rp('%s SPAM caught by GbDefensio'));
$imgText = sprintf($imgText, $stats['spam']);
printf(
'<div class="gbdefensiocounter">
<a href="http://www.defensio.com/" title="%s"><img
src="%s" alt="%s" width="120" height="50" /></a>
</div>', $imgText, $imgUrl, $imgText
);
}
}
return true;
}
public function OptionsCallback(){
$errors = $success = array();
$options = $this->FillOptions();
$apikey = $options[GBDEFENSIO_OPT_APIKEY];
if(G::GetVar(INPUT_REQUEST_FORMSUBMIT)){
$apikey = trim(G::GetVar(GBDEFENSIO_OPT_APIKEY));
if($this->ValidateApikey($apikey)){
$options[GBDEFENSIO_OPT_APIKEY] = $apikey;
$this->SetOptions($options, 1);
$success[] = $this->_rp('Options saved, API key validated');
}else{
$errors[] = $this->_rp('The API key cannot be validated');
}
XHtmlAdmin::FormResults($errors, $success, true);
}
?>
<p>
<?php echo StrUtils::SafeHtm(
$this->_rp('Visit the Defensio website to obtain your own API Key')) ?>,
<a href="http://www.defensio.com/"
title="<?php echo StrUtils::SafeHtm($this->_rp('click here')) ?>">
<?php echo StrUtils::SafeHtm($this->_rp('click here')) ?></a>
</p>
<p>
<label>
<input value="<?php echo StrUtils::SafeHtm($apikey) ?>"
style="width: 30%" type="text" name="<?php echo GBDEFENSIO_OPT_APIKEY ?>" />
<?php echo StrUtils::SafeHtm($this->_rp('Your Defensio API Key')) ?>
</label>
</p>
<p>
<input type="submit" id="submit" name="submit"
value="<?php echo StrUtils::SafeHtm($this->_rp('Save options')) ?>" />
</p>
<?php
return true;
}
private function GetStats(){
if(empty($this->statsCache)){
$options = $this->FillOptions();
$apikey = $options[GBDEFENSIO_OPT_APIKEY];
if($this->ValidateApikey($apikey)){
$blogUrl = GbUrls::GetBlogRootUrl();
$params = array('owner-url' => $blogUrl);
$defensio = new Defensio($apikey, $blogUrl);
$response = $defensio->get_stats($params);
if($this->IsDefensioSuccessResponse($response)){
$this->statsCache = $response;
return $response;
}
}
return null;
}else{
return $this->statsCache;
}
}
private function GetComments($commentIDs){
global $gbdb;
$idsToSql = '';
$sqlLimit = count($commentIDs);
foreach($commentIDs as $commentID){
$commentID = $gbdb->Escape($commentID);
if($idsToSql == ''){
$idsToSql .= sprintf('"%s"', $commentID);
}else{
$idsToSql .= sprintf(',"%s"', $commentID);
}
}
return $gbdb->GetResults(sprintf(
GBDEFENSIO_SQL_GET_COMMENTS,
$idsToSql, $gbdb->Escape($sqlLimit)
));
}
private function CheckNewComment($comment){
$options = $this->FillOptions();
$apikey = $options[GBDEFENSIO_OPT_APIKEY];
if((trim($apikey) != '') && $this->ValidateApikey($apikey)){
$blogUrl = GbUrls::GetBlogRootUrl();
$params = array(
'owner-url' => $blogUrl,
'article-date' => date('Y/m/d'),
'user-ip' => G::GetVar('REMOTE_ADDR'),
'comment-type' => $comment['commenttype'],
'trusted-user' => G::UserIsAuthenticated(),
'comment-content' => $comment['commentcontent'],
'comment-author' => $comment['commentauthorname'],
'comment-author-url' => $comment['commentauthorurl'],
'comment-author-email' => $comment['commentauthoremail']
);
$defensio = new Defensio($apikey, $blogUrl);
$response = $defensio->audit_comment($params);
if($this->IsDefensioSuccessResponse($response)){
$this->UpdateComment($comment['commentid'],$response);
}
}
return true;
}
public function CheckUpdateComments($commentsIDs){
$options = $this->FillOptions();
$apikey = $options[GBDEFENSIO_OPT_APIKEY];
if((trim($apikey) != '') && $this->ValidateApikey($apikey)){
$falsePositives = $falseNegatives = array();
$commentsData = $this->GetComments($commentsIDs);
if(!empty($commentsData)){
foreach($commentsData as $comment){
if(!empty($comment->comment_defensio)){
$commentType = $comment->comment_type;
$defensioData = unserialize($comment->comment_defensio);
$defensioSign = $defensioData['signature'];
$isDefensioSpam = ($defensioData['spam'] == 'true');
$isCommentSpam = ($commentType == GBDB_COMMENT_TYPE_SPAM);
if(!$isCommentSpam && $isDefensioSpam){
$falsePositives[] = $defensioSign;
}elseif($isCommentSpam && !$isDefensioSpam){
$falseNegatives[] = $defensioSign;
}
}
}
if(!empty($falsePositives)
|| !empty($falseNegatives)){
$this->ReportUpdates(array(
$falsePositives,
$falseNegatives
));
}
}
}
return true;
}
private function ReportUpdates($reportData){
$options = $this->FillOptions();
$blogUrl = GbUrls::GetBlogRootUrl();
$apikey = $options[GBDEFENSIO_OPT_APIKEY];
$defensio = new Defensio($apikey, $blogUrl);
if(!empty($reportData[0])){
$signatures = $this->PrepareSignatures(
$reportData[0]);
$defensio->report_false_positives(
array('signatures' => $signatures));
}
if(!empty($reportData[1])){
$signatures = $this->PrepareSignatures(
$reportData[1]);
$defensio->report_false_negatives(
array('signatures' => $signatures));
}
return true;
}
private function PrepareSignatures($signatures){
$result = '';
foreach($signatures as $signature){
if($result = ''){
$result .= $signature;
}else{
$result .= sprintf(',%s', $signature);
}
}
return $result;
}
private function UpdateComment($commentID, $defensioData){
global $gbdb;
$storeData = serialize(array(
'spam' => $defensioData['spam'],
'spaminess' => $defensioData['spaminess'],
'signature' => $defensioData['signature']
));
if($defensioData['spam'] == 'true'){
$affectedRow = $gbdb->Execute(sprintf(
GBDEFENSIO_SQL_UPDATE_COMMENT,
GBDB_COMMENT_TYPE_SPAM,
$gbdb->Escape($storeData),
$gbdb->Escape($commentID)
));
}else{
$affectedRow = $gbdb->Execute(sprintf(
GBDEFENSIO_SQL_UPDATE_DEFENSIO,
$gbdb->Escape($storeData),
$gbdb->Escape($commentID)
));
}
return ($affectedRow == 1);
}
private function ValidateApikey($apikey){
if($this->RequireDefensioClass()){
$blogUrl = GbUrls::GetBlogRootUrl();
$defensio = new Defensio($apikey, $blogUrl);
$params = array('owner-url' => $blogUrl);
$response = $defensio->validate_key($params);
return $this->IsDefensioSuccessResponse($response);
}else{
return false;
}
}
private function IsDefensioSuccessResponse($response){
return is_array($response)
&& isset($response['status'])
&& ($response['status'] == 'success');
}
private function RequireDefensioClass(){
$script = $this->GetDirPScriptsPath()
.GBDEFENSIO_CLASS_SCRIPT;
if(is_readable($script)){
require_once($script);
return true;
}else{
return false;
}
}
private function FillOptions(){
$options = $this->GetOptions();
if(is_array($options)){
return $options;
}else{
return $this->GetDefaultOptions();
}
}
private function GetDefaultOptions(){
return array(
GBDEFENSIO_OPT_APIKEY => ''
);
}
private function PrepareDatabase(){
if($this->DatabaseExists()){
if($this->DeleteDatabase()){
return $this->CreateDatabase();
}else{
return false;
}
}else{
return $this->CreateDatabase();
}
}
private function CreateDatabase(){
$GLOBALS['gbdb']->Execute(
GBDEFENSIO_SQL_INSTALL_DEFENSIO);
return $this->DatabaseExists();
}
private function DeleteDatabase(){
$GLOBALS['gbdb']->Execute(
GBDEFENSIO_SQL_DELETE_DEFENSIO);
return !$this->DatabaseExists();
}
private function DatabaseExists(){
global $gbdb;
$usingCache = $gbdb->IsQueriesCacheOn();
if($usingCache){
$gbdb->SetQueriesCacheOff();
}
$fields = $gbdb->GetResults(
GBDEFENSIO_SQL_DESCRIBE_COMMENTS);
if($usingCache){
$gbdb->SetQueriesCacheOn();
}
if(!empty($fields)){
foreach($fields as $field){
if($field->Field
== GBDEFENSIO_TABLE_FIELD_NAME){
return true;
}
}
return false;
}else{
return false;
}
}
}
?>
No lo quería poner, por lo de no desvirtuar los hilos...