myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
История благодарностей участнику Enyby. Спасибо сказали: 239
Дата поста: В теме: За сообщение: Спасибо сказали:
20.11.2011, 21:05 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
Цитата(LAV © @ 20.11.2011, 20:21) *
Спасибо, сработало big_smile.gif Как-то пропустил мимо глаз этот параметр.
Спасибо тут не пишут в постах. Есть специальная кнопка внизу каждого поста. Если какой-то пост вам помог - нажимаете кнопку.
Цитата(LAV © @ 20.11.2011, 20:21) *
На PHP 5.2.14 попробовал внести указанные изменения, заработало, но были периодические сообщения об ошибках, поэтому сменил на 5.3.8.
Неплохо бы эти ошибки озвучить. тогда и исправить что-то можно.
LAV ©, dj_crazy_joker
20.11.2011, 19:03 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
Цитата(LAV © @ 20.11.2011, 18:35) *
Спасибо за хаблист. Фактически это первый заслуживающий внимания хаблист, из выложенных на сайте.

Не согласен. Tiny тоже неплох. По крайней мере со стороны. Как он там ставится и работает я не пробовал.
Цитата(LAV © @ 20.11.2011, 18:35) *
Наверное, имеет смысл обратить внимание пользователей, что хаблист без критических ошибок работает только на PHP 5.3.X, т.к. на предыдущих версиях возникает описанная в топике ошибка с сокетами, приводящая к зависанию.

В этом же топике доступно и исправление для php версии ниже 5.3. В дальнейшем оно будет добавлено в хаблист, а архив будет перезалит в тему.
Цитата(LAV © @ 20.11.2011, 18:35) *
Столкнулся с еще одной особенностью работы этого хаблиста.
Раз в час он обменивается с хабами командой $BotINFO, что вызывает именно на VerliHub (версия 0.9.8e-r2) сообщение в опчат:
Код
The following BOT has just entered the hub :DCPinger/2.0.3; Visit http://inethub.olvi.net.ua for more information. -- IP=' x.x.x.x ' Host='  ' User=' hublist '

На птоке все ок. Не нашел в настройках верлика где отключить эти сообщения. Есть какие-то мысли?

Мыслей нет. Немного поковырял исходники - вывод этого сообщения зависит от флага botinfo_report. Попробуйте поискать его в конфиге и поставить там 0, а не 1.
LAV ©, dj_crazy_joker
19.11.2011, 2:26 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
header.php:
Код
function shutdown() { // функция, срабатывающая при завершении работы скрипта
    $content = ob_get_contents(); // получаем весь предыдущий вывод в переменную содержимого
    ob_end_clean(); // очищаем весь вывод
    $title = isset($GLOBALS['title']) ? $GLOBALS['title'].' - '.HUBLIST_TITLE : HUBLIST_TITLE; // устанавливаем титул страницы
    echo '
<html>
    <head>
        <title>'.$title.'</title>
        <link rel="stylesheet" href="./default.css" type="text/css" />
    </head>
    <body>
        <div id="menu">
            <ul>
                <li><a href="./">Хабы</a></li>
                <li><a href="./addhub.php">Добавить хаб</a></li>
                <li><a href="./Favorites.php">Favorites.xml</a></li>
                <li><a href="./bat.php">Hubs.bat</a></li>
                <li><a href="./about.php">О хаблисте</a></li>
            </ul>
        </div>
        <div id="main-box">
            <div id="left-column">
                Это левая колонка
            </div>
            <div id="right-column">
                Это правая колонка
            </div>
            <div id="content">
                '.$content.'
            </div>
        </div>
        <div id="footer">
            Это подвал сайта. Тут может быть что угодно.
        </div>
    </body>
</html>'; // пошел полный вывод страницы, тут может быть все что угодно и как угодно (шапка, подвал, боковые колонки или еще что)
}
Чтобы колонки были колонками, можно добавить такие стили:
Код
#left-column {
    float: left;
    width: 200px;
}
#right-column {
    float: right;
    width: 300px;
}
Если ничего не напутал - должно работать.
Гарик БатьковиЪ
18.11.2011, 16:50 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
Неплохо, Гарик БатьковиЪ! Если хочешь, можешь и графики подправить. Это делается в day.php. Находишь там участок:
Код
$color = new stdClass();
$color->grid = imagecolorallocate($canvas, 0, 0, 0);
$color->background = imagecolorallocate($canvas, 255, 255, 255);
$color->down = imagecolorallocate($canvas, 255, 0, 0);
$color->up = imagecolorallocate($canvas, 0, 255, 0);
$color->base = imagecolorallocate($canvas, 127, 127, 0);
числа, это цвет. RGB в десятичном представлении. Хотя на деле, ты можешь, чтобы не мучится с перекодировкой, писать в шестнадцетирчном представлении. Это будет как-то так:
Код
$color = new stdClass();
$color->grid = imagecolorallocate($canvas, 0x00, 0x00, 0x00); // оси графика
$color->background = imagecolorallocate($canvas, 0xFF, 0xFF, 0xFF); // фон графика
$color->down = imagecolorallocate($canvas, 0xFF, 0x00, 0x00); // цвет падения значения
$color->up = imagecolorallocate($canvas, 0x00, 0xFF, 0x00); // цвет подъема значения
$color->base = imagecolorallocate($canvas, 0x7F, 0x7F, 0x00); // цвет базы значения


PS Чуть ниже находится переменная $font, отвечающая за размер шрифта. Можно и сней поиграться по вкусу.
Гарик БатьковиЪ
17.11.2011, 13:55 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
Цитата(Гарик БатьковиЪ @ 17.11.2011, 0:40) *
я ещё пытался понять твой файл default.css с кодом фона, не поможешь сделать что бы было на чёрном фоне с белым ширифтом? )) пож...
Можешь вообще его удалить и нарисовать css с нуля, какой захочешь.
Цитата(Гарик БатьковиЪ @ 17.11.2011, 0:40) *
и ещё, в некоторых хаблистах (на других сайтах) в начале хаба стоит иконка, у твоего скрипта есть такая функция? big_smile.gif
Нет.
Гарик БатьковиЪ
17.11.2011, 0:43 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
Если кратко - пиши всегда и везде "text/html" и в header и в meta.
Гарик БатьковиЪ
17.11.2011, 0:36 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
Есть. Некотрые браузеры игнорируют meta тэг, а реагируют на заголовок. В любом случае - хуже не будет.

PS Не посмотрел что там стоит "application/vnd.wap.xhtml+xml". Что это? И зачем оно тут? Мало "text/html"?
Гарик БатьковиЪ
17.11.2011, 0:27 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
В файле header.php замени
Код
function shutdown() {
    $content = ob_get_contents();
    ob_end_clean();
    $title = isset($GLOBALS['title']) ? $GLOBALS['title'].' - '.HUBLIST_TITLE : HUBLIST_TITLE;
на
Код
function shutdown() {
    $content = ob_get_contents();
    ob_end_clean();
    header('Content-Type: text/html; charset=UTF-8');
    $title = isset($GLOBALS['title']) ? $GLOBALS['title'].' - '.HUBLIST_TITLE : HUBLIST_TITLE;
Гарик БатьковиЪ, dj_crazy_joker
16.11.2011, 23:54 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
Кажется я нашел причину. Проблема в редакторе. которым ты правишь сайт. В частности его работой с юникодом. Когда ты вносил данные про БД, ты сохранил файл с BOM меткой, это три байта в начале файла. Вот сейчас я вижу три метки в коде главной страницы. Но если с html или текстом это работает, то с картинками это не работает.
Тебе нужно через нормальный редактор сохранить файлы без BOM метки. Я использую AkelPad. Можешь использовать его или какой-то другой, если он тебе известен.
Гарик БатьковиЪ
16.11.2011, 22:11 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
Попробовать заменить
Код
imagejpeg($canvas, null, 100);
на
Код
imagejpeg($canvas);
А вставку убрать.
Гарик БатьковиЪ, dj_crazy_joker
16.11.2011, 21:43 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
Вставку делать в файле day.php. Смотреть результат по адресу http://32net.org/hublist/day.php?type=user...e=week&id=2
Гарик БатьковиЪ, dj_crazy_joker
15.11.2011, 21:59 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
Больше ничего не должен. Займись отладкой. После каждой строчки поочередно, начиная с последней, добавляй в конце:
Код
die('i am here');

Если сервер глохнет, то переставляй вставку на строчку выше и пробуй снова. Когда увидишь ответ "i am here", то ошибка будет в следующей строке скрипта.
Гарик БатьковиЪ
3.11.2011, 20:38 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
Цитата(Гарик БатьковиЪ @ 3.11.2011, 12:57) *
теперь при открытии refresh.php в браузере, хрень какая-то, ну вот сами взглянте refresh.php
Это не хрень. Это называется отладка. Можешь убирать изменения, я понял в чем проблема.

У тебя почему-то работа с ассоциативным массивом сокетов дает на выходе обычные перечисляемые массивы. Видно в этом PHP реализация такая. Можешь переставить на 5.3 или же в файле dc.php добавить одну строку в трех местах, отмеченных звездочкой
Код
<...>

function write(&$sockets, &$write, &$hubs, $debug = false){
    foreach($write as $key => $socket) {
*
        $hub = $hubs[$key];

<...>

function read(&$sockets, &$read, &$hubs, $debug = false) {
    foreach($read as $key => $socket) {
*
        $hub = $hubs[$key];

<...>

function error(&$sockets, &$error, &$hubs, $debug = false) {
    foreach($error as $key => $socket) {
*
        $hub = $hubs[$key];

<...>
строка вот эта:
Код
$key = array_search($socket, $sockets);
Должно решить все проблемы.

Какие люди "благодарные" пошли... Ну да ладно, это их проблемы.

С сервачком что-то там. То ли на графиках заткнулся, либо совпадение произошло, как я туда полез и графики посмотрел.

А так, товарищи мои сетевые, у кого баг подобный выше описанному, юзаем данный патчик (см. выше). Он таки рабочий, хотя изначально существовал в голове.
Со временем я начальный файлик в теме обновлю, чтобы на эти грабли поменьше наступали.

PS Нет. Таки дело в картинках. Стоит туда зайти, как сервер ложится.
Гарик БатьковиЪ, dj_crazy_joker
3.11.2011, 10:52 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
Цитата(Гарик БатьковиЪ @ 3.11.2011, 1:51) *
может я что-то сделал не правильно, но у меня добовлять, добовляется в базу MySQL, но статискика хабов не собирается unhappy.gif
а если через любой браузер я открываю файл refresh.php , идёт постоянно ошибка
Notice: Undefined offset: 0 in D:\***\***\hublist\dc.php on line 179
Содержимое таблицы с хабами в студию. У вас какие-то проблемы с функцией чтения сокетов хабов. Советую так же проверить наличие в php расширения для работы с сокетами.

Еще можете написать в 177 строчке файла dc.php вместо:
Код
function read(&$sockets, &$read, &$hubs, $debug = false) {
написать:
Код
function read(&$sockets, &$read, &$hubs, $debug = false) { var_dump($sockets, $read, $hubs, $debug);
А потом прислать сюда вывод с вызова refresh.php
Гарик БатьковиЪ
18.9.2011, 12:36 Создание текстовых квестов на LUA


Есть такой игровой движок - INSTEAD. Он позволяет создавать текстовые квесты, написав их на LUA. Может кому-то будет интересно.

Обзор: http://instead.syscall.ru/2010/09/review-instead-1-2-0/
Статья в вики: http://ru.wikipedia.org/wiki/INSTEAD_(программа)
Скачать движок: http://code.google.com/p/instead/downloads/list
Скачать игры: http://code.google.com/p/instead-games/downloads/list
Скчать лаучер: http://code.google.com/p/instead-launcher/downloads/list

Игра идет как на Windows, так и на Linux.

Лучше качать с лаучером - сможете прямо из него скачивать игры (их, в этом случае, можно вообще не качать).

Личные впечатления - весьма круто. Очень радует то, что везде графический интерфейс и нет консоли, в которую нужно догадаться, что вводить. Знай кликай себе. Возможна только клавиатурная работа, но мне не очень понравилась раскладка - привыкать к ней нужно.

Исходники каждой игры более чем открытые. Это набор музыкальных, графических файлов и скрипты LUA. Так что можно самому писать квесты или еще что-то.

PS Тема во флудилке, так как не нашел лучшего раздела. Если найдете лучшее место - перенесите, буду признателен.
Nickolya
29.8.2011, 10:45 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
Public PHP hublist by Enyby


Версия: 0.03
Платформа: Any
Автор: Enyby

Описание:
Данный хаблист свободно распостраняем и изменяем в любых разумных пределах. Наличие ссылки на разработчика не обязательно, поддержки и дальнейшего развития хаблиста от разработчика не будет.
Админки нет, все изменения через базу данных. Есть экспорт в bat, xml и поддержка прямого импорта в DC клиенты. Есть простой сервер для авторегистрации хабов.
Пингует как пингер и как клиент.
Корректная работа со всеми хабами не гарантируется.

v0.03
ftp://inethub.olvi.net.ua/pub/Soft/Server...blist_v0.03.rar
[attachment=6189:Enyby_hublist_v0.03.rar]
Демо: http://inethub.olvi.net.ua/hl_test/

Изменения:
+ добавлены всплывающие подсказки
* исправлена работа пингера в PHP < 5.3
* исправлен вывод меню


v0.01
ftp://inethub.olvi.net.ua/pub/Soft/Server...yby-hublist.rar
[attachment=6038:Enyby_hublist.rar]

Процедура установки:
1. Распаковать архив в папку веб сервера.
2. Указать в config.php парметры для подключения к БД.
3. Импортировать в БД скрипт db.sql.
4. Поставить на крон запуск refresh.php.

По желанию можно поставить на крон dchub.php для импорта списка хабов на свой хаб. Этот скрипт будет обновлять hubs.lua, который можно подключать в скрипты хаба.
Также, можно настроить запуск server.php, тогда в хаблисте будет доступна авторегистрация хабов. Выглядит это так - в настройках хаба, указывается адрес вашего хаблиста и хаб сам сообщает хаблисту свое состояние через равные интервалы времени.

Если вас интересует встраивание хаблиста в ваш сайт, вам потребуется изменить код header.php, отключив вывод общего оформления страницы или же использовать iframe, встраивая страницу без изменений.

Предполагаемые проблемы и ограничения:
1. Если хаб не соответствует протоколу NMDC возможны проблемы с его пингованием.
2. Большинство нераспостраненных хабов (включая RusHub) могут иметь неправильное определение серверного софта.
3. Для работы с большим числом хабов, потребуется переписывать модуль пингования на работу с пулом подключений, так как, в данный момент, модуль открывает соединения ко всем хабам одновременно, что может повлечь проблемы, при достаточном большом числе хабов.
4. Часть функционала, навроде хинтов по наведению, доступно в коде, но не доступно на сайте, так как не подключены скрипты для вывода этих хинтов.
5. Возможны проблемы при работе с хабами на кириллических доменах.
6. Скрипт не тестировался на линуксе - возможно будут какие-то проблемы.

Посмотреть в реале, что из себя представляет хаблист можно по адресам:
Прародитель данного хаблиста - может иметь функционал отсутствующей в данном релизе
Кастомизированный вариант - этот хаблист со своими дополнениями и улучшениями
Почти дефолтный вариант - этот хаблист без улучшений и каких было редактирований.
Кастомизированный вариант - этот хаблист со своими дополнениями и улучшениями
Кастомизированный вариант - этот хаблист со своими дополнениями и улучшениями
Nickolya, ShadoWx, PomanoB, KT315, Alexey, Kingston, CrazyKiller, dj hoodo, Saymon21, DEN 007, Гарик БатьковиЪ, dro, LEXSOR, stailzoRE, ke(x)one, dj_crazy_joker, ImDim, Valdis
29.8.2011, 7:53 Нормальный хаблист
Стоит ли выкладывать в паблик нормальный опен соурс php хаблист?
Итак, свершилось.

Версия без админки:
ftp://inethub.olvi.net.ua/pub/Soft/Server...yby-hublist.rar
[attachment=6037:Enyby_hublist.rar]

Все просто и без вкуса. Присутствует минимальное описание. Админки нет. Отвечу на любые адекватные вопросы. Как только один адекватный человек сможет его поставить и запустить, дальнейшей поддержкой я заниматься не буду. Кто захочет - берите на себя это тяжкое бремя.

Скорее всего версии с админкой не будет вообще. Так что можете и не ждать.

Вот вам бесплатная идея: закинуть код куда-нибудь, вроде github и там его пилить совместными усилиями до победного конца.

Просьба протестировать знающим людям.


Ах, да. Были еще люди, желающие в меня бросить кирпича за плагиат чужого кода. Самое время. Код есть, так что сличайте и кидайте. Хотя можете и так кинуть - мне без разницы.
Otshelnik-Fm, CrazyKiller
25.4.2011, 23:50 Нормальный хаблист
Стоит ли выкладывать в паблик нормальный опен соурс php хаблист?
Ответы ясны.

Хаблист будет предоставлен общественности. Ограничений не будет.
Когда - When it's done.
Alexey, Hammer, Saymon21, Mustik
20.4.2011, 0:00 Нормальный хаблист
Стоит ли выкладывать в паблик нормальный опен соурс php хаблист?
Собственно речь о этой поделке: http://inethub.olvi.net.ua/dc/
Могу выделить в отдельный проект и выложить в паблик.

Поддержкой заниматься не планирую.

Интересует мнение общества, нужны ли такие готовые вещи.

Вижу два аргумента:

+ Хорошо, когда есть локальные хаблисты провайдеров
- Плохо когда масса хаблистов с тремя хабами.

UPD: Ах, да! Чуть не забыл. Самое главное. Убедите меня, что хаблист нужно выкладывать в паблик. Привествуются конструктивные развернутые точки зрения.

UPD2: Добавил еще один вопрос.
Perspect
19.4.2011, 12:12 Swapper
API2 | Обмен никами на хабе по взаимному согласию
Название скрипта: Swapper
Версия скрипта: v1.0
Версия API: API2

Описание скрипта:
Игра обмен никами заключается в следующем:
Когда вы в игре, вы можете писать от сообщения в двух режимах - свой ник и ник партнера. При старте игры эти ники совпадают. Во время игры вы можете выслать приглашение любому пользователю для обмена вашими партнерскими никами. Если этот пользователь подтвердит обмен, то ваши партнерские ники обменяются. Обмен можно делать неограниченное число раз, с любыми пользователями.
Одновременно можно отослать не более одного приглашения на обмен. Приглашение действует до тех пор пока вы его не отозовете.
Для смены режима или отзыва предложения воспользуйтесь меню на вкладке хаба. Для отправки, принятия или отказа от обмена - используйте контекстное меню ника в общем чате.
Для выхода из игры воспользуйтесь соответствующим пунктом в меню хаба.

[attachment=5759:swapper.lua]

P. S. Если у вас нет регистрации на этом форуме, а значит вы не можете качать вложения, то скачать этот скрипт, равно как и другие, можно по ссылке Мои скрипты.
zeusby
18.12.2010, 10:33 HiLo 1.0c
API2 | Угадай число
"--" (два дефиса) признак комментария. Тебе их нужно написать В НАЧАЛЕ той строки, которую ты хочешь закомментировать.

PS Если у тебя все так туго, я бы задался вопросом, нужно ли оно тебе.
sexynapku
14.12.2010, 18:15 Today
API2 | Показ даты, времени, описания времени суток в гл. чате
MARVELtm, добавь
Код
function OnStartup()
    tmr = TmrMan.AddTimer(3600*1000) -- 3600 - раз в час
end

function OnTimer(tmr)
    ChatArrival(nil, "<Bot> !сегодня|")
end
Invisible, Ksan
14.12.2010, 18:05 HiLo 1.0c
API2 | Угадай число
Код
    hlhelp = function(user,data)
        if user then
            local reply = "\n\n\t\tHiLo Command Help\n\t"..string.rep("Ї",35).."\n"
            for i,v in pairs(Cmds) do
                if i ~= "int" then
                    local desc,args = Cmds[i]()
                    reply = reply.."\t+"..string.format("%-15s",i).."\t"..desc.."\n"
                end
            end
            return reply.."\n\t"..string.rep("Ї",35).."\n\n"
        else
            return "Помощь","",""
        end
    end,
замени на
Код
    hlhelp = function(user,data)
        if user then
            local reply = "\n\nКоманды\n\t"..string.rep("=",35).."\n"
            for i,v in pairs(Cmds) do
                if i ~= "int" then
                    local desc,args = Cmds[i]()
                    reply = reply.."\t+"..string.format("%-15s",i).."\t"..desc.."\n"
                end
            end
            return reply.."\n\t"..string.rep("=",35).."\n\n"
        else
            return "Помощь","",""
        end
    end,
ну и всякие
Код
return "Помощь","",""
на
Код
return "Get HiLo Scores","",""
для каждой команды.
sexynapku
14.12.2010, 14:04 BCE3HAUKA
Спросил, узнал
Ksan, зря не смотришь.

Naum_Off, измени
Код
return find(msg, patterns, user)
на
Код
find(msg, patterns, user)
или на
Код
if find(msg, patterns, user) then
   Core.SendToUser(user, data)
   return true
end
В последнем случае юзер будет считать что сообщение прошло в чат и увидит его в чате, но никто другой его не увидит
Naum_Off
11.12.2010, 8:38 BCE3HAUKA
Спросил, узнал
REVIV,
Код
Core.SendToUser(user, '<'..Bot..'> '..texts[answers[i]])
заменить на
Код
Core.SendPmToUser(user, Bot, texts[answers[i]])
Naum_Off
30.10.2010, 22:45 посоветуйте среду и ос
Насколько я понял, речь идет о взломе хеша пароля, простым брутфорсом и известно:
  • хеширующий алгоритм MD5;
  • была применена "соль", размером в 49 цифр;
  • длина пароля составляет 10 символов.


Единственный разумный вариант расчет на видеокарте. Рыть в сторону аббревиатуры "CUDA". ОС, ЯП и конфиг компа напрямую вытекает из того, что найдете по CUDA.

VNoName
30.8.2010, 10:34 Хаблисты
Цитата
array_unique — Removes duplicate values from an array

values, в данном случае, это размер шары пользователей. Зачем вам оставлять только пользователей с уникальным размером шары? Это значение, если отлично от нуля, то вероятность его совпадения у разных пользователей очень мала, но если оно равно нулю, или один пользователь сидит два раза на одном хабе, то вы попросту отсеете его.
Вы и так уже заносите в массив по никнейму как ключу, а одному ключу может соответствовать лишь одно значение массива, так что эта команда совершенно лишняя.

Код
    $hubinfo[1] = str_replace("<", "<", $hubinfo[1]);
    $hubinfo[1] = str_replace(">", ">", $hubinfo[1]);
    $hubinfo[3] = str_replace("<", "<", $hubinfo[3]);
    $hubinfo[3] = str_replace(">", ">", $hubinfo[3]);

Даже если форматирование, такого рода замены можно ускорить, сделав их одновременно, еще до этапа разбивки на части $hubinfo:
Код
    $hubinfo = str_replace(array("<", ">", "HubINFO "), array("<", ">", ""), $hubinfo[1]);
    $hubinfo = explode('$', $hubinfo);
    $hubinfo[3] = str_replace(".px.", " ", $hubinfo[3]);


Код
                case '$Hello':
                    if ($user[1] == $nick) {
                    execute($socket, '$Version 1,0091');
                    execute($socket, '$GetNickList');
                    execute($socket, '$MyINFO $ALL '.$nick.' Bot by dro <++ V:0.674,M:A,H:1/0/1,S:20>$ $LAN(T3).$alexandr@drozdin.ru$'.$myshare.'$');
                    #execute($socket, '$MyINFO $ALL '.$nick.' Bot by dro <FlylinkDC++ V:(r386),M:P,H:1/0/1,S:15>$ $100    $alexandr@drozdin.ru$670969607454$');
                    execute($socket, '$BotINFO {HubListPinger} hublist pinger');
                    }
else {
// some code
}

Просто если ники не совпадут, то вы не отошлете кучу команд, грубо говоря, вы проигнорируете команду хаба и будете ждать у моря погоды. Необходимо делать обработчики всех возможных событий. Если вы делаете if, то он может как выполниться, так и не выполниться. Нужно учитывать оба варианта.
dro
30.8.2010, 7:50 Хаблисты
Код
if(preg_match('#не поддерживает пинга#',$linie[$i])){

Стоит добавить и англоязычный вариант, хотя в своем пингере это никак не отслеживаю, так как каждый хаб выдает сообщения такие какие ему заблагорассудится. У меня это выглядит как таймаут.

Код
$user = explode(' ', $linie[$i]);

$user - совершенно не информативное название переменной для данного случая, возможно стоит заменить на что-то более понятное. Но это больше относиться к стилю написания кода, чем к его работе.

Код
execute($socket, '$Supports NoGetINFO NoHello UserIP2 Feed MCTo HubTopic ClientID MiniSlots GetZBlock ADCGet CHUNK GetCID BotINFO');

Думаю стоит оставить лишь те характеристики, что действительно поддерживаются пингером. Например, GetZBlock и ADCGet служат для скачиваний файлов.

Код
execute($socket, '$Key '.lock2key($user[1],$data['Port']));

Порт следует убрать, так как функция принимает только один параметр, а не два.

Код
case '$Hello':
                    if ($user[1] == $nick) {

Если уж и делаеться проверка, то в случае ее не прохождения надо тоже что-то делать, не правда ли? Иначе зачем она нужна.

Код
execute($socket, '$MyINFO $ALL '.$nick.' Bot by dro <++ V:0.674,M:A,H:1/0/1,S:20>$ $LAN(T3).$alexandr@drozdin.ru$'.$myshare.'$');

На некоторые хабы пингер не зайдет с подстрокой "Bot" в описании пользователя, если там есть админы, которые борются с ботами и ставят фильтры.

Код
execute($socket, '$BotINFO {HubListPinger} hublist pinger');

Вы не проверили того, что хаб поддерживает данную команду, в ответных Supports. Я уже писал об этом.

Код
    $hubinfo[1] = str_replace("<", "<", $hubinfo[1]);
    $hubinfo[1] = str_replace(">", ">", $hubinfo[1]);
    $hubinfo[3] = str_replace("<", "<", $hubinfo[3]);
    $hubinfo[3] = str_replace(">", ">", $hubinfo[3]);

Или часть кода прошла преформатирование при выводе на форум или тут вы делаете что-то не то.

Код
$hubinfo = str_replace( "HubINFO ", "", $hubinfo);

У вас нет гарантий, что переменная $hubinfo будет инциализирована, после выполнения кода находящегося выше.

Код
$hubinfo[3] = str_replace(".px.", " ", $hubinfo[3]);

Некорректное решение в общем случае, так как заменяет везде ".px." на пробел. Хаб PtokaX дописывает данную строку лишь в самый конец, т. е. вам стоит проверять последние 4 символа на предмет соответствия и извлекать подстроку, если это так.

Код
        $hubinfo[1] = $hubname;

Опять же, инициализация переменной не гарантирована. Следите за этим. Ничего страшного в PHP не происходит, только warning'и, которые замедляют работу скрипта, вызывая обращения к логам, но если бы вы писали на C, то все может закончиться куда плачевнее. Помните, что когда вы пишете код, вы порождаете свой стиль, с которым потом будет трудно бороться, если вы смените язык программирования.

Код
array_unique($info);

Вы делаете ошибку вызывая эту функцию. Ознакомтесь с ее действием. Пример ошибки: У двух пользователей размер шары одинаковый до байта, например равне 0 - вы подсчитаете лишь одного из них.

Код
            $total_share=$share+$total_share;
        }
        $total_share=$total_share - $myshare;

Старайтесь, где это возможно, использовать операторы "+=" и "-=".

Код
        mysql_query("UPDATE `".$dbtable."` SET Name = '".$hubinfo[1]."',Descr = '".$hubinfo[3]."',
                     Maxusers = '".$hubinfo[4]."', MinShare = '".$hubinfo[5]."', MinSlots = '".$hubinfo[6]."',
                     MaxHubs = '".$hubinfo[7]."', Soft = '".$hubinfo[8]."'  WHERE id = ".$data['ID']."");

Типичный пример включения не проверенных данных в SQL запрос, может приводит к SQL иньекции, со всеми отсюда вытекающими последствиями. Необходимо все строковые значения пропускать через функцию mysql_real_escape_string, все целочисленные - через intval, а дробные через floatval. Это касается всех MySQL запросов.

Код
    mysql_query("UPDATE `".$dbtable."` SET Users = ".$useri.", Status = 'Online', Share = ".floatval($total_share)." WHERE id = ".$data['ID']."");

Чтобы не терять часть значащих знаков, я предпочитаю с $total_share работать, как со строкой. Преобразование к дробному числу может перевести к потери нескольких значащих знаков. Соответственно для MySQL таблицы нужно указать BIGINT поле для хранения таких чисел, ну или VARCHAR, хотя это и не очень хорошо.

Код
    if ($useri > $data['Userspeak']){

Замечание по стилю именования: "Userspeak" имеет две расшифровки, "user speak" и "users peak", для большей понятности кода такую двойственность лучше не создавать. Например, "usersPeak" или "users_peak".

Код
    mysql_query("UPDATE `".$dbtable."` SET Status = 'Offline' WHERE id = ".$data['ID']."");
    mysql_query("UPDATE `".$dbtable."` SET Users = '0' WHERE id = ".$data['ID']."");
    mysql_query("UPDATE `".$dbtable."` SET Share = '0' WHERE id = ".$data['ID']."");

В данном случае следует выполнять один запрос к БД, а не три. Также, если используется InnoDB в качества движка таблиц, то рекомендуется использовать явно задание транзакций, если число запросов на изменение, составляющих атомарную цепочку, более одного.
Nickolya, PomanoB, dro
29.8.2010, 22:04 Хаблисты
Цитата(dro @ 29.8.2010, 20:02) *
А если размер буффера поставить больше?

Возврат из функции socket_read происходит по двум причинам:
  1. заполнился буфер;
  2. превышено время ожидания заполнения буфера;

Если буфер слишком мал, то скрипт будет частенько бегать в цикле, не обрабатывая команды, а лишь инкрементно приращая переменную $end. Если же буфер слишком велик, то большую часть времени скрипт будет ждать таймаута заполнения буфера, в результате чего, хаб имеет право разорвать соединение, как слишком медленное, но даже если этого не произойдет, все равно будет существенное падение скорости работы пингера.
dro
29.8.2010, 18:30 Хаблисты
PomanoB прав. Чтобы подобного не возникало, нужно последний элемент всегда приплюсовывать к новому буферу, например так:
Код
        while ($buffer = socket_read($socket, 2048, PHP_BINARY_READ)) {
            $linie = explode('|', $end.$buffer);
            $size = sizeof($linie);
            for ($i = 0; $i < $size; ++$i) {
                if ($i + 1 == $size) {
                    $end = $linie[$i];
                    break;
                }

Если элемент последний, то он заносится в переменную $end, которая затем приписывается спереди к новому буферу.

UPD: На самом деле не важно где прервалсь команда, на ключевом слове или где-то еще, в любом случае дальнейшая обработка фрагмента будет ошибочной.
dro
20.8.2010, 13:00 Хаблисты
Итак, по порядку.

Как было справделиво замеченно, можно отсекать по команде не MyINFO, после MyINFO, но не все тут гладко.
Можно довольно долго висеть на хабе из 5 человек ожидая другой команды.

Вообще говоря, по протоколу, список MyINFO, должен заканчиваться MyINFO хаблиста, но, к сожалению, так поступают не все хабы.

Дальше. Есть такое расширение протокола как Zon. Которое предполагает сжатие gzip дл передаваемых данных. проблема состоит в том, что некоторые хабы в любом случае включат это сжатие не смотря поддерживается оно клиентом или нет. Эта команда может появляться где угодно и, обычно, список пользователей передается в сжатом виде, что означает, что ее нужно игнорировать и не разрывать соединение, так как процесс входа на хаб может быть не завершен.

Также следует отслеживать команды ValidateDenide и ForceMove. Первая означает что ник занят или не является допустимым, а вторая - дает редирект, при переполнении или других причинах. Четкой команды, свидетельствующей о бане не существует, обычно это сообщение от бота со словом ban, но не обязательно.

100% алгоритма определения окончания инициализации не существует или мне он не известен. Пользуюсь набором правил следующего вида:
  1. Если получены команды Quit или Search - вход завершен.
  2. Если получена команда OpList и перед этим была получена хоть одна команда MyINFO - вход завершен. Некоторые хабы, отсылают список операторов ранее списка пользователей, хотя это и не соответствует протоколу.
  3. Если было зафиксировано получение команд MyINFO, а после этого пришла команда не Zon и не MyINFO - вход завершен.


Как вариант, можно еще пытаться отлавливать MOTD, но оно может отсылаться в ЛС.

По поводу дубликатов, проблема решается просто, все это дело заноситься в ассциативный массив по ключу ника, а потом из массива и считается шара и число пользователей. Также необходимо отслеживать свой ник и его игнорировать.

Еще. Хаб может не поддерживать BotINFO/HubINFO, тогда с текущим алгоритмом вы будете ждать вечность команды HubINFO. Чтобы этого не произошло, необходимо, после указания поддержки данных команд в отсылаемом Supports, проверить наличие поддержи в полученном Supports.
dro
20.8.2010, 1:38 Хаблисты
Пингом - быстрей, но пинг предоставляет недостаточно информации. С другой стороны, он виден админу, и если часто пинговать, то вас попросту забанят. Поэтому у меня раз в 5 минут хаблист заходит как клиент и раз в час - как пингер, т. е. каждый 12 раз из тех, что по 5 минут.

В целом пингер неплох.
Критика по коду:
  1. Соблюдайте отступы, намного приятнее будет читать. Для этих целей лучше пользоваться IDE с автоформатированием кода, например, Eclipse.
  2. Лучше не использовать принудительное подавление @, а писать так, чтобы никаких ошибок не было.
  3. Код
    $myinfo = explode('$', $linie[$i]);
    @$share = $share + $myinfo[6];

    У вас нет никаких гарантий что в массиве 6 элементов. Целесобразнее:
    Код
    $myinfo = explode('$', $linie[$i]);
    if(isset($myinfo[6]))
    $share = $share + $myinfo[6];

  4. Код
    $useri = $useri + 1;

    Лучше писать через оператор ++.
  5. Код
    function lock2key($_LOCK, $port)

    Не тот алгоритм. Этот алгоритм для захода ХАБА на хаблист, а вам нужен обычный, в котором не порта. Да и порт вы не тот указали, вы указали порт подключения, а в этом алгоритме нужно указать локальный порт.


Чтобы бота пускали на все хабы, не нужно передавать специфический тэг клиента. Да и число хабов онлайн можно не 21 ставить. "H:21/0/1" - 21 хаб 1 и на одном админ.

UPD:
И да, я тут увидел зачатки работы как клиента (Подсчет MyINFO). Вам предстоит нетривиальная задача определения когда заканчивается процесс инициализации хаба. Также вам необходимо отсевать свой собственный MyINFO, так как он вносит погрешность в ваши измерения. В дополнение к этому есть скрипты манипулирующие MyINFO, из-за них оно может приходить несколько раз для одного пользователя, что вызовет искажение размера шары и числа пользователей.

Так что работы тут еще много.
dro
29.7.2010, 1:10 lock2key для hublist'а
Код для работы с хаблистом.
Итак, по порядку. Известно что хаблисты используют схему $Lock-$Key. Основная проблема заключаеться в том, что этот алгоритм чуть-чуть отличается от обычного. Если быть точным, ровно на первый байт.

В интернете видел информацию, что большинство хаблистов благополучно игнорируют правильность этого кода и есть там один, особо задиристый. Однако, чем черт не шутит. Поэтому наваял свою реализацию на PHP.

Но, буду последователен. Исходником послужил код из исходников PtokaX хаба:
Код
uint16_t lport =  (uint16_t)ntohs(addr.sin_port);
char cMagic = (char) ((lport&0xFF)+((lport>>8)&0xFF));

// strip the Lock data
char *temp;
if((temp = strchr(sBuffer+6, ' ')) != NULL) {
    temp[0] = '\0';
}

// Compute the key
memcpy(sMsg, "$Key ", 5);
sMsg[5] = '\0';
size_t iLen = temp-sBuffer;
char v;

// first make the crypting stuff
for(size_t i = 6; i < iLen; i++) {
    if(i == 6) {
        v = sBuffer[i] ^ sBuffer[iLen] ^ sBuffer[iLen-1] ^ cMagic;
    } else {
        v = sBuffer[i] ^ sBuffer[i-1];
    }

    // Swap nibbles (0xF0 = 11110000, 0x0F = 00001111)
    v = (char)(((v << 4) & 0xF0) | ((v >> 4) & 0x0F));

    switch(v) {
        case 0:
            strcat(sMsg, "/%DCN000%/");
            break;
        case 5:
            strcat(sMsg, "/%DCN005%/");
            break;
        case 36:
            strcat(sMsg, "/%DCN036%/");
            break;
        case 96:
            strcat(sMsg, "/%DCN096%/");
            break;
        case 124:
            strcat(sMsg, "/%DCN124%/");
            break;
        case 126:
            strcat(sMsg, "/%DCN126%/");
            break;
        default:
            strncat(sMsg, (char *)&v, 1);
            break;
    }
}

На старте задается lport как локальный порт хаба, в подключении к хаблисту. У хаблиста порт, естественно, 2501. У нас же, тот что назначит система, а значит случайный.
sBuffer - содержит исходный $Lock код. sMsg - по завершении будет содержать нужный $Key код.

Теперь собственно код на PHP:
Код
function lock2key($_LOCK, $port)
{
    $lockLength = strlen($_LOCK);

    $LockToKey = '';

    for ($j = 0; $j < strlen($_LOCK); $j++)
    {
        if($j == 0) {
            $h = ord($_LOCK{0}) ^ 0 ^ ord( $_LOCK{ $lockLength - 1} ) ^ ($port % 256 + ($port>>8) % 256);
        }
        else {
            $h = ord($_LOCK{$j}) ^ ord($_LOCK{$j-1});
        }

        $h = $h % 256;

        $a = (($h<<4) & 240) | (($h>>4) & 15);

        if($a == '126' or $a == '124' or $a == '96' or $a == '36' or $a == '5' or $a == '0') {
            $LockToKey .= "/%DCN";

              if ($a < 100) $LockToKey .= "0";
              if ($a < 10) $LockToKey .= "0";

              $LockToKey .= $a;
              $LockToKey .= "%/";
        }
        else {
              $LockToKey .= chr($a);
        }
    }
    return $LockToKey;
}

Из заметных отличий от стандартного следующие:
Код
$h = ord($_LOCK{0}) ^ 0 ^ ord( $_LOCK{ $lockLength - 1} ) ^ ($port % 256 + ($port>>8) % 256);

Используется связка первого символа с нулем (вместо последнего символа), а затем с последним символом (вместо предпоследнего). Также, вместо константы 5, используется магический байт вычисляемый как сумма верхнего и нижнего байта шестнадцетиричного представления номера порта.
Все остальные "отличия" - экономия "на спичках" + изменения форматирования, не меняющие алгоритма работы.
Функция принимает два параметра, строку $Lock и номер порта.

Было бы неплохо этот код обосновать в соответствующей теме, описания протокола.
Nickolya, Setuper, Saymon21
20.4.2010, 17:34 Хаблисты
Полный код я давать не буду. Дам часть, только боюсь что он вырван из контекста и многое не будет понятно. К слову программу я определяю именно через $BotInfo, а шару через получение списка.

Код
case '$HubINFO':
                        $hubinfo = explode(' ', $linie[$i], 2);
                        $tmp = explode('$', $hubinfo[1]);
                        $hub['online'] = 2;
                        $hub['name'] = $tmp[0];
                        $hub['address'] = $tmp[1];
                        $hub['description'] = $tmp[2];
                        $hub['maxusers'] = $tmp[3];
                        $hub['minshare'] = $tmp[4];
                        $hub['minslots'] = $tmp[5];
                        $hub['maxhubs'] = $tmp[6];
                        $hub['type'] = $tmp[7];
                        $hub['admin'] = $tmp[8];

Код
                    case '$MyINFO':
                        $hub['MyINFO'] = true;
                        if ($user[2] != $hub['me']->nick) {
                            $tmp = explode('$', $linie[$i]);
                            if(!isset($hub['users'][$user[2]]))
                            $hub['share'] += $tmp[count($tmp) - 2];
                            $hub['users'][$user[2]] = '';
                        }
                        break;
Accelerator
4.11.2009, 15:18 Хаблисты
Код
<?php
function lock2key($_LOCK) {

    $lockLength = strlen ($_LOCK);

    $h = ord($_LOCK{0}) ^ ord( $_LOCK{ $lockLength - 1} ) ^ ord( $_LOCK{ $lockLength - 2} ) ^ 5;
    while ($h > 255) {$h = $h - 256;}

    $h = (($h<<4) & 240) | (($h>>4) & 15);

    $a = $h;

    if ($a == '126' || // '~'
    $a == '124' || // '|'
    $a == '96' || // '`'
    $a == '36' || // '$'
    $a == '5' || // '^E'
    $a == '0') // NUL
    {
        $LockToKey = "/%DCN";

        if ($a < 100)
        $LockToKey .="0";
        if ($a < 10)
        $LockToKey .="0";
        $LockToKey .= $a;
        $LockToKey .= "%/";
    } else {
        $LockToKey = chr ($a);
    }

    for ($j = 1; $j < strlen($_LOCK); $j++) {
        $h = ord($_LOCK{$j}) ^ ord($_LOCK{$j-1});

        while ($h > 255) {$h = $h - 256;}

        $h = (($h<<4) & 240) | (($h>>4) & 15);
        $a = $h;

        if ($a == '126' || // '~'
        $a == '124' || // '|'
        $a == '96' || // '`'
        $a == '36' || // '$'
        $a == '5' || // '^E'
        $a == '0') // NUL
        {
            $LockToKey .= "/%DCN";

            if ($a < 100)
            $LockToKey .="0";
            if ($a < 10)
            $LockToKey .="0";
            $LockToKey .= $a;
            $LockToKey .= "%/";
        } else {
            $LockToKey .= chr ($a);
        }
    }

    return $LockToKey;
}

function process($sock, $str) {
//    echo "A: ".$str.'|'.PHP_EOL;
    socket_send($sock, $str.'|', strlen($str) + 1, NULL);
}

function checkHub($address, $port) {
    $nick = substr(md5(mt_rand(0, 100000)), 0, 10);
    $description = substr(md5(mt_rand(0, 100000)), 0, 10);
    $email = substr(md5(mt_rand(0, 100000)), 0, 10);
    $sharesize = mt_rand(10*1024, 20*1024)*mt_rand(1024*1024,2*1024*1024);
    $status = new stdClass();

    if ($fp=@fsockopen(htmlentities($address, ENT_QUOTES),$port,$ERROR_NO,$ERROR_STR,5))
    {
        fclose($fp);
        $status->online = true;
        $status->users = 0;

        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if (!socket_connect($socket, gethostbyname($address), $port)) {
            echo 'Ошибка: '.socket_strerror(socket_last_error());
            return;
        }
        $end = '';
        while ($buffer = socket_read($socket, 2048, PHP_BINARY_READ)) {
            $linie = explode('|', $end.$buffer);
            $size = sizeof($linie);
            for ($i = 0; $i < $size; ++$i) {
                if ($i + 1 == $size) {
                    $end = $linie[$i];
                    break;
                }
                $user = explode(' ', $linie[$i]);
//                echo "Q: ".$linie[$i].PHP_EOL;                
                switch($user[0]) {
                    case '$Hello':
//                        echo "Q: ".$linie[$i].PHP_EOL;
                        if ($user[1] == $nick) {
                            process($socket, '$Version 1,0091');
                            process($socket, '$GetNickList');
                            process($socket, '$MyINFO $ALL '.$nick.' '.$description.'<++ V:0.674,M:A,H:1/0/1,S:20>$ $LAN(T3).$'.$email.'$'.$sharesize.'$');
                        }                        
                        break;
                    case '$HubTopic':
//                        echo "Q: ".$linie[$i].PHP_EOL;    
                        $tmp = explode(' ', $linie[$i], 2);
                        $status->topic = $tmp[1];                                                
                        break;
                    case '$HubName':
//                        echo "Q: ".$linie[$i].PHP_EOL;    
                        $hubinfo = explode(' ', $linie[$i], 2);
                        $tmp = explode(' - ', $hubinfo[1], 2);
                        $status->name = $tmp[0];
                        $status->topic = (count($tmp) > 1) ? $tmp[1] : '';                                            
                        break;
                    case '$Lock':
//                        echo "Q: ".$linie[$i].PHP_EOL;
//                        process($socket, '$Supports NoGetINFO NoHello UserIP2 ');
                        process($socket, '$Key '.lock2key($user[1]));
                        process($socket, '$ValidateNick '.$nick);
                        break;
                    case '$NickList':
//                        echo "Q: ".$linie[$i].PHP_EOL;
                        $tmp = explode(' ', $linie[$i], 2);
                        $nicks = explode('$$', $tmp[1]);
                        $status->users = count($nicks);                        
                        break 3;
                        break;
                    case '$MyINFO':    
//                        echo "Q: ".$linie[$i].PHP_EOL;                    
                        if ($user[2] != $nick) {
                            $status->users++;
                        }
                        else {
                            break 3;
                        }
                        break;
                    default:
//                        echo "Q: ".$linie[$i].PHP_EOL;
                        break;
                }
            }
        }
        socket_close($socket);
    }
    else {
        $status->online = false;
    }
    return $status;
}

Простейший пингер на php. По сути полноценный ДС клиент, обрезаный не хило. Интересует специфиакация общения хабпингер - хаб. Ибо после $BotINFO мне рвут соединение без какого-либо ответа.
Accelerator

5 страниц V  « < 2 3 4 5 >
RSS Сейчас: 23.11.2024, 5:41