AvisoDaos/ 40777 0 0 0 11535412370 5766 5 AvisoDaos/aviso.php 100777 0 0 2060 11533762152 7722 0 [бb]_? (?=[хпбмгжxpmgj])
| [бb]_? [ъь]_? (?=[еёe])
| [зz3]_? [аa] _?
)?', #по, до, пообъ, дообъ, поза, доза (двойные символы вырезаются!)
#3
'[пp]_?[рr]_?[оoиi]_?', #пр[ои]
'[зz3]_?[лl]_?[оo]_?', #зло (злоебучая)
'[нnh]_?[аa]_?[дdg]_? (?=[хпбмгжxpmgj])', #над
'[нnh]_?[аa]_?[дdg]_?[ъь]_? (?=[еёe])', #надъ
'[пp]_?[оo]_?[дdg]_? (?=[хпбмгжxpmgj])', #под
'[пp]_?[оo]_?[дdg]_?[ъь]_? (?=[еёe])', #подъ
'[рr]_?[аa]_?[зz3сc]_? (?=[хпбмгжxpmgj])', #ра[зс]
'[рr]_?[аa]_?[зz3сc]_?[ъь]_? (?=[еёe])', #ра[зс]ъ
'[вvb]_?[оo]_?[зz3сc]_? (?=[хпбмгжxpmgj])', #во[зс]
'[вvb]_?[оo]_?[зz3сc]_?[ъь]_? (?=[еёe])', #во[зс]ъ
#4
'[нnh]_?[еe]_?[дdg]_?[оo]_?', #недо
'[пp]_?[еe]_?[рr]_?[еe]_?', #пере
'[oо]_?[дdg]_?[нnh]_?[оo]_?', #одно
'[кk]_?[oо]_?[нnh]_?[оo]_?', #коно (коноебиться)
'[мm]_?[уy]_?[дdg]_?[оoаa]_?', #муд[оа] (мудаёб)
'[oо]_?[сc]_?[тt]_?[оo]_?', #осто (остопиздело)
'[дdg]_?[уy]_?[рpr]_?[оoаa]_?', #дур[оа]
'[хx]_?[уy]_?[дdg]_?[оoаa]_?', #худ[оа] (худоебина)
#5
'[мm]_?[нnh]_?[оo]_?[гg]_?[оo]_?', #много
'[мm]_?[оo]_?[рpr]_?[дdg]_?[оoаa]_?', #морд[оа]
'[мm]_?[оo]_?[зz3]_?[гg]_?[оoаa]_?', #мозг[оа]
'[дdg]_?[оo]_?[лl]_?[бb6]_?[оoаa]_?', #долб[оа]
);
static $badwords = array(
#Слово на букву Х
'(?<=[_\d]) {RE_PRETEXT}?
[hхx]_?[уyu]_?[йiеeёяюju] #хуй, хуя, хую, хуем, хуёвый
#исключения:
(? '\x20', #пробел
'[:vowel:]' => '[аеиоуыэюяёaeioyu]', #гласные буквы
'[:consonant:]' => '[^аеиоуыэюяёaeioyu\x20\d]', #согласные буквы
);
$re_badwords = str_replace('{RE_PRETEXT}',
'(?>' . implode('|', $pretext) . ')',
'~' . implode('|', $badwords) . '~sxuSX');
$re_badwords = strtr($re_badwords, $re_trans);
#вырезаем все лишнее
#скрипты не вырезаем, т.к. м.б. обходной маневр на с кодом на javascript:
#
#хотя давать пользователю возможность использовать код на javascript нехорошо
/* Закомментировал BrokenBrake
if (! function_exists('strip_tags_smart')) include_once 'strip_tags_smart.php'; #оптимизация скорости include_once
$s = strip_tags_smart($s, null, true, array('comment', 'style', 'map', 'frameset', 'object', 'applet'));
#заменяем html-сущности в "чистый" UTF-8
if (! function_exists('utf8_html_entity_decode')) include_once 'utf8_html_entity_decode.php'; #оптимизация скорости include_once
$s = utf8_html_entity_decode($s, $is_htmlspecialchars = true);
if (! function_exists('utf8_convert_case')) include_once 'utf8_convert_case.php'; #оптимизация скорости include_once
$s = utf8_convert_case($s, CASE_LOWER);
/*
Remove combining diactrical marks (Unicode 5.1).
http://www.unicode.org/charts/symbols.html#CombiningDiacriticalMarks
Вырезаем диакритические модифицирующие знаки.
Например, русские буквы Ё (U+0401) и Й (U+0419) существуют в виде монолитных символов,
хотя могут быть представлены и набором базового символа с последующим диакритическим знаком,
то есть в составной форме (Decomposed): (U+0415 U+0308), (U+0418 U+0306).
*/
$s = preg_replace('/(?: \xcc[\x80-\xb9]|\xcd[\x80-\xaf] #UNICODE range: U+0300 - U+036F (for letters)
| \xe2\x83[\x90-\xbf] #UNICODE range: U+20D0 - U+20FF (for symbols)
| \xe1\xb7[\x80-\xbf] #UNICODE range: U+1DC0 - U+1DFF (supplement)
| \xef\xb8[\xa0-\xaf] #UNICODE range: U+FE20 - U+FE2F (combining half marks)
)
/sxSX', '', $s);
static $trans = array(
"\xc2\xad" => '', #вырезаем "мягкий" перенос строки ()
#"\xcc\x81" => '', #вырезаем знак ударения (U+0301 «combining acute accent»)
'/\\' => 'л', #Б/\Я
'/|' => 'л', #Б/|Я
"\xd0\xb5\xd0\xb5" => "\xd0\xb5\xd1\x91", #ее => её
);
$s = strtr($s, $trans);
#получаем в массив только буквы и цифры
#"с_л@о#во,с\xc2\xa7лово.Слово" -> "с л о во с лово слово слово слово слово"
preg_match_all('/(?> \xd0[\xb0-\xbf]|\xd1[\x80-\x8f\x91] #[а-я]
| [a-z\d]+
)+
/sxSX', $s, $m);
$s = ' ' . implode(' ', $m[0]) . ' ';
#убираем все повторяющиеся символы, ловим обман типа "х-у-у-й"
#"сллоооовоо слово х у у й" -> "слово слово х у й"
$s = preg_replace('/( [\xd0\xd1][\x80-\xbf] (?:\x20)? #оптимизированное [а-я]
| [a-z\d] (?:\x20)?
) \\1+
/sxSX', '$1', $s);
#d($s);
$result = preg_match($re_badwords, $s, $m, PREG_OFFSET_CAPTURE);
if (function_exists('preg_last_error') && preg_last_error() !== PREG_NO_ERROR) return preg_last_error();
if ($result === false) return 1; #PREG_INTERNAL_ERROR = 1
if ($result)
{
list($word, $offset) = $m[0];
$s1 = substr($s, 0, $offset);
$s2 = substr($s, $offset + strlen($word));
$delta = intval($delta);
if ($delta < 1 || $delta > 10) $delta = 3;
preg_match('/ (?> \x20 (?>[\xd0\xd1][\x80-\xbf]|[a-z\d]+)++ ){1,' . $delta . '}+
\x20?+
$/sxSX', $s1, $m1);
preg_match('/^ (?>[\xd0\xd1][\x80-\xbf]|[a-z\d]+)*+ #окончание
\x20?+
(?> (?>[\xd0\xd1][\x80-\xbf]|[a-z\d]+)++ \x20 ){0,' . $delta . '}+
/sxSX', $s2, $m2);
$fragment = (ltrim(@$m1[0]) !== ltrim($s1) ? $continue : '') .
trim(@$m1[0] . '[' . trim($word) . ']' . @$m2[0]) .
(rtrim(@$m2[0]) !== rtrim($s2) ? $continue : '');
return $fragment;
}
return false;
}
?>
AvisoDaos/daos.php 100777 0 0 41324 11533763534 7562 0 5.2)
function fetchData($url, $timeout = 3)
{
$ctx = stream_context_create(array
('http' => array('timeout' => $timeout)));
if ($result = @file_get_contents($url, 0, $ctx))
return $result;
else return false;
} //echo fetch('http://google.com', 0.01);
# Склонение числительных (http://mcaizer.habrahabr.ru/blog/11555/)
function plural($n, $form1, $form2, $form5)
{
$n = abs($n) % 100;
$n1 = $n % 10;
if ($n > 10 && $n < 20) return $form5;
else if ($n1 > 1 && $n1 < 5) return $form2;
else if ($n1 == 1) return $form1;
return $form5;
} // echo $n." ".plural($n, "лист", "листа", "листів")." у Вас в скринці";
# Время жизни в часах и минутах
function age($sec)
{
$hours = floor(($sec / 3600));
$days = floor(($sec / 86400));
$min = floor(($sec / 60) - $hours * 60); if (!$min) $min = '';
if ($days)
{
$hours = ($hours - ($days * 24));
}
if ($min) $min = $min.' '.plural($min, 'хвилина', 'хвилини', 'хвилин');
if (!$hours) $hours = '';
if ($hours) $hours = $hours.' '.plural($hours, 'година', 'години', 'годин').' ';
if ($days)
{
$days = $days.' '.plural($days, 'день', 'дні', 'днів').' ';
$min = '';
}
else $days = '';
return $days.$hours.$min;
} //echo age(time() - 3000);
# Отправка email (Must Have - http://habrahabr.ru/blogs/webdev/17531/)
function emailSend($address, $subject, $body)
{
global $write, $set;
$address = strtolower($address);
$from = $set['email'];
$from_name = $set['txt']['name'];
$body = "$body\n\n--\n{$set['txt']['sign']}";
# =?кодировка?способ кодирования?закодированный текст?=
$from_name = base64_encode($from_name);
$subj = base64_encode($subj); $subj = "=?UTF-8?B?$subj?=";
$body = base64_encode($body);
$headers = "From: =?UTF-8?B?$from_name?= <$from>\r\n".
"Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64
X-Mailer: Daos (PHP)";
mail($address, $subject, $body, $headers);
}
/* emailSend(
'brokenbrake1.send@blogger.com',
'Daos',
'Кто-то изучает код Тормоза и ленится исправить текст :)'
);
^ вот тут я отвлёкся на 20 минут. Да, за 20 минут можно сделать полезный сервис.
Пользуйтесь - http://online-test-email.blogspot.com/
*/
# Вычесление медианы массива (http://brokenbrake.biz/2009/09/14/mediana)
function mediana($arr)
{
sort($arr);
$count = count($arr);
$n1 = floor($count / 2);
$n2 = $n1 + 1;
return ($arr[$n1] + $arr[$n2]) / 2;
} # echo mediana(array(5,5,5,5,5,5,10000)); # 5
# Создание файла рекламного блока
# 27 октября полностью переделано.
# На самом деле уже никакой генерации не происходит...
# Так, обновление настроек.
function generate()
{ global $write, $set, $stat;
$stat['styles'] = $set['styles'];
$stat['URL'] = trim($set['URL']);
$stat['charset'] = trim($set['charset']);
$stat['txt']['invite'] = $set['txt']['invite'];
$stat['styles']['daos'] = explode("\n", $set['styles']['daos']);
$stat['styles']['count'] = count($stat['styles']['daos']) - 1;
$write['stat'] = 1;
static $write;
}
# Выход строчки из ротации, запись статистики в массив $stat
# и отправка сообщения рекламодателю (если он оставил адрес).
# Да, метод избыточный и нужна декомпозиция, но всё равно
# в Daos 2.0 всё будет совсем иначе. Пусть так пока.
# Я же в прошлом году ещё не читал "Совершенный код" :)
// Функция модифицирована для AvisoDaos! Замена daos.php невозможна.
function lineOut($id)
{
global $write, $set, $stat;
$line = $stat['items'][$id];
if ($stat['mode'] !== 'standard') $stat['all']['count']++;
if ($line['views'])
$CTR = round(($line['clicks'] / $line['views'] * 100), 2);
if ($CTR) $stat['average']['CTRs'][] = $CTR;
$lim = $stat['limit'] * -2;
$stat['average']['CTRs'] = array_slice($stat['average']['CTRs'], $lim);
$stat['average']['CTR'] = mediana($stat['average']['CTRs']);
$stat['average']['ages'][] = time() - $line['time'];
$stat['average']['ages'] = array_slice($stat['average']['ages'], $lim);
$stat['average']['age'] = floor(mediana($stat['average']['ages']));
if (time() - $line['time'] > $stat['records']['age'])
$stat['records']['age'] = time() - $line['time'];
if ($line['clicks'] > $stat['records']['clicks'])
$stat['records']['clicks'] = $line['clicks'];
if ($line['views'] > $stat['records']['views'])
$stat['records']['views'] = $line['views'];
$result = ($CTR - $stat['average']['CTR']);
if ($result > 0)
$results = $set['txt']['bigCTR'];
elseif ($result < 0)
$results = $set['txt']['smallCTR'];
else $results = 'Ваша ссылка вышла из ротации.';
$recCTR = 0;
if ($CTR > $stat['records']['CTR'])
{
$stat['records']['CTR'] = $CTR;
$results = $set['txt']['superCTR'];
$recCTR = 1;
}
$CTR = str_replace('.', ',', $CTR).' %'; // Неразрывный пробел
if (isset($line['email'])) // Отмылиться куда надо
{
$comeback = 'http://'.$_SERVER['HTTP_HOST']
.preg_replace("/[\w]+\.php/", '?come#back', $_SERVER['PHP_SELF']);
$views = $line['views'].' '.plural($line['views'], "перегляд", "перегляди", "переглядів");
$clicks = $line['clicks'].' '.plural($line['clicks'], "клік", "кліки", "кліків");
$text = $line['text']; $URL = $line['URL'];
$age = age(time() - $line['time']);
$subj = str_replace('CTR', 'CTR '.$CTR, $set['txt']['subj']);
if ($recCTR) $subj = str_replace('CTR', 'Рекорд! CTR', $subj);
$message = "Вітаю!
$results
Вихідні дані:
текст — $text
URL — $URL
Статистика:
Час життя — $age,
$views, $clicks,
загалом CTR $CTR.
Хочете спробувати ще?
Daos згадує про Вас —
$comeback";
emailSend($line['email'], $subj, $message);
}
unset($stat['items'][$id]);
$write['stat'] = 1; static $stat, $write;
}
# Добавление нового объявления (без проверки)
function consent($qid)
{
global $write, $set, $queue, $stat;
if (isset($queue['items'][$qid]))
{
$stat['limit'] = $set['limit'];
$stat['items'][$qid] = $queue['items'][$qid];
$stat['items'][$qid]['time'] = time();
$stat['items'][$qid]['views'] = $stat['items'][$qid]['clicks'] = '0';
# 19.09.2010 А-а-а-а, спаси-и-и-ите!!! :)
# Блин, тут и раньше нетривиально было, а с появлением
# двух режимов и плавного перехода между ними вообще крышеснос.
# Пиздец, простите. Вот тут и проявляются недостатки проектирования.
# В Daos 2.0 всё будет гораздо проще, разберётся любой толковый программист.
# А тут сейчас разобраться могу только я. Да и то с трудом :-D
//if ($set['mode'] == 'daos') // Закомментировано для AvisoDaos
//{
foreach ($stat['items'] as $key => $val)
{
if (!isset($val['viewsNeed'])) // Если точно строчка Daos-режима
$linesDaosMode[] = $key;
}
$linesOut = array_slice($linesDaosMode, 0, -$set['limit']);
//} // Если режим Daos, тогда всякие сложности с выходом строчек
$queue['items'][$qid]['time'] = 0;
foreach ($queue['items'] as $key => $val) // чистим очередь от проср(о|а)чки
{
if ($val['time'] + 3600 > time())
{
$clean[$key] = $val;
}
else
{
$num = $val['SMS'];
$queue['SMS'][$num] = '';
}
}
unset($queue['items']);
$queue['items'] = $clean;
if (!empty($linesOut))
foreach ($linesOut as $key => $id) // Статистика для уходящих строк и мыло куда надо...
{
lineOut($id);
}
if (isset($stat['items']['заглушка']))
unset($stat['items']['заглушка']);
$write['stat'] = $write['queue'] = 1; static $write;
//generate(1);
} // Если есть вообще такой идентифкатор в очереди
}
# Таблица статистики
function fullstat()
{
global $write, $stat;
foreach ($stat['items'] as $key => $val)
{
$CTR = 0; if ($val['views'])
$CTR = round(($val['clicks'] / $val['views'] * 100), 2);
if ($CTR) $CTR .= ' %'; if (!$CTR) $CTR = '-';
$string = $val['text'];
if (isset($val['URL']))
{
$string = ''.
$val['text'].'';
}
$del = $mail = $resetRec = $resetStav = '';
if (whois())
{
$del = "
× ×
";
if (isset($val['email']))
$mail = "
{$val['email']}";
}
$viewsNeed = '';
if (isset($val['viewsNeed'])) $viewsNeed = ' из '.$val['viewsNeed'];
$tbody .= "
Час існування | Покази | Кліки | CTR |
---|