%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sender/lib/integration/bitrix24/limitation/ |
| Current File : //home/bitrix/www/bitrix/modules/sender/lib/integration/bitrix24/limitation/rating.php |
<?php
/**
* Bitrix Framework
* @package bitrix
* @subpackage sender
* @copyright 2001-2012 Bitrix
*/
namespace Bitrix\Sender\Integration\Bitrix24\Limitation;
use Bitrix\Main\Config;
use Bitrix\Main\Type\Date;
use Bitrix\Main\Localization\Loc;
use Bitrix\Sender\Message;
use Bitrix\Sender\Dispatch\Semantics;
use Bitrix\Sender\Entity\Letter;
use Bitrix\Sender\Integration\Im\Notification;
use Bitrix\Sender\Internals\Model;
Loc::loadMessages(__FILE__);
/**
* Class Rating
* @package Bitrix\Sender\Integration\Bitrix24\Limitation
*/
class Rating
{
/** @var int $base Base count of mail. */
protected static $base = 1000;
/**
* Regulate: downgrade or block.
*
* @return void
*/
public static function regulate()
{
$ratio = self::getRatio();
if ($ratio >= self::getBlockRate())
{
self::block();
}
}
/**
* Calculate.
*
* @return void
*/
public static function calculate()
{
$updateTimestamp = (int) self::getParam('date_update', 0);
$dateToday = new Date();
if ($dateToday->getTimestamp() <= $updateTimestamp)
{
return;
}
self::setParam('date_update', $dateToday->getTimestamp());
if (!$updateTimestamp)
{
return;
}
$yesterdayData = Model\DailyCounterTable::getRowByDate(1);
if (!$yesterdayData)
{
return;
}
// don't upgrade if error count more than 10% of sent
$countSent = (int) $yesterdayData['SENT_CNT'];
$countError = (int) $yesterdayData['ERROR_CNT'];
if ($countSent > 0 && ($countError / $countSent) > 0.1)
{
$countSent -= $countError;
}
$ratio = self::getRatio(1);
if ($ratio >= self::getBlockRate())
{
self::block();
}
elseif ($ratio >= self::getDownRate())
{
self::downgrade();
}
elseif ($countSent >= DailyLimit::instance()->getLimit())
{
self::upgrade();
}
}
/**
* Upgrade.
*
* @return void
*/
public static function upgrade()
{
$limit = DailyLimit::instance()->getLimit();
$limit = $limit ?: self::getInitialLimit();
$limit = $limit * self::getLimitMultiplier();
if ($limit > self::getMaxLimit())
{
return;
}
DailyLimit::instance()->setLimit($limit);
Notification::create()
->withMessage(self::getNotifyText('upgraded'))
->toAllAuthors()
->send();
}
/**
* Downgrade.
*
* @param bool $isNotify Is notify.
* @return void
*/
public static function downgrade($isNotify = true)
{
DailyLimit::instance()->setLimit(self::getInitialLimit());
if ($isNotify)
{
Notification::create()
->withMessage(self::getNotifyText('downgraded'))
->toAllAuthors()
->send();
}
}
/**
* Block.
*
* @return void
*/
public static function block()
{
$letters = Model\LetterTable::getList(array(
'select' => array('ID'),
'filter' => array(
'=STATUS' => Semantics::getWorkStates(),
'=MESSAGE_CODE' => Message\iBase::CODE_MAIL
)
));
$letter = new Letter();
foreach ($letters as $letterData)
{
$letter->load($letterData['ID']);
if (!$letter->getId())
{
continue;
}
$state = $letter->getState();
if ($state->canPause())
{
$state->pause();
}
else if ($state->canReady())
{
$state->ready();
}
else if ($state->canStop())
{
$state->stop();
}
}
self::downgrade(false);
self::setParam('blocked', 'Y');
Notification::create()
->withMessage(self::getNotifyText('blocked'))
->toAllAuthors()
->send();
}
/**
* Is blocked.
*
* @return bool
*/
public static function isBlocked()
{
return self::getParam('blocked', 'N') === 'Y';
}
/**
* Get downgrade rate.
*
* @return float
*/
public static function getDownRate()
{
return round(self::getParam('down_over_abuses', 8) / self::$base, 3);
}
/**
* Get downgrade rate.
*
* @return float
*/
public static function getBlockRate()
{
$abusesPer1000Mails = self::getParam('block_over_abuses', 20);
return round($abusesPer1000Mails / self::$base, 3);
}
/**
* Get initial limit.
*
* @return int
*/
public static function getInitialLimit()
{
return (int) self::getParam('initial', 1000);
}
/**
* Get max limit.
*
* @return float
*/
public static function getMaxLimit()
{
return (int) self::getParam('max', 16000);
}
/**
* Get limit multiplier.
*
* @return float
*/
public static function getLimitMultiplier()
{
return (float) self::getParam('multiplier', 2);
}
/**
* Get ratio.
*
* @param integer $daysLeft Days left.
* @return float
*/
protected static function getRatio($daysLeft = 0)
{
$result = Model\DailyCounterTable::getRowByDate($daysLeft);
$sentCount = $result ? (int) $result['SENT_CNT'] - (int) $result['ERROR_CNT'] : 0;
$abuseCount = $result ? $result['ABUSE_CNT'] : 0;
if (!$sentCount || $sentCount < 200 || !$abuseCount)
{
return 0;
}
return round($abuseCount / $sentCount, 3);
}
/**
* Get parameter.
*
* @param string $name Name.
* @param mixed $defaultValue Default value.
* @return mixed
*/
protected static function getParam($name, $defaultValue = 0)
{
return Config\Option::get('sender', "~r_limit_$name", $defaultValue);
}
/**
* Set parameter.
*
* @param string $name Name.
* @param mixed $value Value.
* @return void
*/
protected static function setParam($name, $value)
{
Config\Option::set('sender', "~r_limit_$name", $value);
}
/**
* Set notify text.
*
* @param string $code Code.
* @return string
*/
public static function getNotifyText($code)
{
$code = strtoupper($code);
return Loc::getMessage("SENDER_INTEGRATION_BITRIX24_RATING_{$code}1");
}
}