myDC.ru

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

 
История благодарностей участнику Enyby. Спасибо сказали: 239
Дата поста: В теме: За сообщение: Спасибо сказали:
15.1.2012, 20:02 User Mode Fixer
API 2 | Исправление режима подключения пользователя
Название скрипта: User Mode Fixer
Версия скрипта: 2.05
Платформа: PtokaX
Версия API: API2
Автор: Enyby
Автор идеи: Meloun

Библиотека: Для работы скрипта требуется библиотека Lua Socket

Описание: Скрипт предназначен для исправления режима подключения пользователей. Подменяет нерабочий актив на пассив в поиске и запросах на соединение.

Возможности скрипта:
При подключении нового пользователя, если он актив, то проверяется доступность порта для соединения. Если порт не доступен, то хаб переводит клиента в режим переопределенного пассива. В этом режиме поисковые команды преобразуются в пассивные, а CTM в RCTM.
При включении режима исправлений IP адресов и ников, скрипт исправляет команды с неверными данными. DDoS'еры получают DDoS на свой адрес, а обычные пользователи могут искать и качать даже с неверным внешним IP адресом и/или ненастроенном активе. Правда только как пассивы.

Дополнительная информация:
  • Возможно будут наблюдаться приличные тормоза хаба, сразу после включения и после входа большого числа пользователей единовременно. Большого числа пользователей в активном режиме. Если все в пассиве, то тормозов не будет. Начиная с версии 1.06 с этим проблем нет.
  • Также возможны глюки при входе более чем 255 активных пользователей одновременно. Если будет потребность в этом скрипте на крупных хабах - перепишу на использование очереди с пулом сокетов, в этом случае проблем быть не должно. Начиная с версии 1.06 с этим проблем нет.
  • Скрипт игнорирует команды расширений NMDC протокола: TLS Шифрование и NAT Traversal. Если включено исправление IP и ника в командах, то они будут исправлены и в командах указанных расширений.


Совместимость с другими скриптами:
  • Совместим со скриптами фильтрации поиска. Такие скрипты должны быть выше в списке скриптов, чем данный скрипт. Фильтрация поиска должна осуществляться запретом обработки команд поиска.
  • Совместим со скриптами запрещающими соединение пользователей (команды ConnectToMe и RevConnectToMe). Такие скрипты должны быть выше в списке скриптов, чем данный скрипт.
  • Частично совместим со скриптами использующими бота хаба как пассивного клиента (подключение через RevConnectToMe к боту хаба). Для работы с такими скриптами потребуется указать использование отдельного бота в скрипте (sBotName = "UserModeFixer").
  • Частично совместим со скриптами, которые подменяют MyINFO. Совместим только при bFixMyINFO = false.
  • Несовместим со скриптами, которые подменяют или самостоятельно обрабатывают команды соединения пользователей (ConnectToMe и RevConnectToMe). Данные команды обработаны этим скриптом не будут. Никаких ошибок не будет, но необработанные команды могут работать неверно.
  • Несовместим со скриптами подменяющими поиск или же которые сами организуют поиск. Эти команды поиска не будут обработаны скриптом. Никаких ошибок не будет, но необработанные команды могут работать неверно.


TODO list
  1. Сделать проверку на наличие на порту нужного DC клиента, так как там может быть случайно указан какой-то другой открытый порт. Увы, сокеты в луа не позволяют это выполнить с приемлимыми затратами.
  2. Сделать проверку активных (по присылаемому тэгу) клиентов не только при входе на хаб, но и периодически во время нахождения на хабе, так как за это время проброс портов может измениться. Да и не только он. Функция опциональна и должна быть отключаема. По дефолту включена. Интервал проверки должен задаваться отдельно. По умолчанию 1 час.
  3. Сделать проверку размера очереди. Если значение больше некоторого предела, то уведомлять операторов, возможно утечка в пуле или еще какие-то проблемы.

История версий
v2.05:
  • Реализована обработка отключения пользователей без вызова UserDisconnected.

v2.04:
  • Доработан отладочный вывод.

v2.03:
  • Добавлена дополнительная проверка для одного плавающего бага.

v2.02:
  • Доработан вывод ошибок
  • Добавлены дополнительные проверки
  • Доработана статистика

v2.01:
  • Исправлены дефолтные настройки

v2.00:
  • Ядро скрипта переписано заново
  • Своя система учета числа пользователей
  • Экономное расходование ресурсов пула

v1.13:
  • Улучшена и доработана статистика.
  • Исправлен баг, связанный с учетом отключений пользователей разных профилей
  • Добавлена опция отключения валидации через функцию PtokaX

v1.12:
  • Улучшена и доработана статистика.

v1.11:
  • Улучшена и доработана статистика.
  • Улучшена и доработана быстрая отладка.
  • Добавлена возможность использования пользовательского меню.
  • Добавлена возможность исправления тэгов пользователей.

v1.10:
  • Улучшена и доработана статистика.
  • Меню сделано зависимым от активных настроек скрипта.

v1.09:
  • Исправлена ошибка целостности.
  • Добавлено исправление целостности при ее нарушении.
  • Добавлена быстрая отладка.
  • Добавлена генерация репортов при валидации. Теперь репорты приходят адекватно.
  • Поддержка изменения режима подключения "на лету", без переподключения к хабу.

v1.08:
  • Переработан вывод статистики.
  • Добавлена опция валидации целостности.

v1.07:
  • Исправлен подсчет занятого пула.

v1.06:
  • Добавлена возможность исправления IP адресов и ников в командах.
  • Добавлена очередь с пулом.
  • Реализован мягкий старт скрипта. Никаких подвисаний на старте.
  • Добавлена возможность указания отдельного бота для скрипта.
  • Добавлена возможность ведения отладочного лога.

v1.05:
  • Исправлена ошибка двойной отсылки статистики.
  • Добавлены данные про хаб и ОС в статистику.

v1.04:
  • Исправлена ошибка в очищении таблицы сокетов.
  • Добавлена статистика.

v1.03:
  • Добавлена возможность игнорирования несовпадения IP адресов. Если она не включена - будет выкидывать с хаба с соответствующим сообщением.

v1.02:
  • Убрана возможность исправления IP. Потому как это только дополнительная нагрузка на хаб. Для работы этой опции нужно отключить встроенную защиту хаба от DDoS, что крайне опасно.

v1.01:
  • Добавлены проверки на предмет существования адресата CTM на хабе.
  • Добавлена возможность исправления CTM команд с неверным IP адресом. Полезна как дополнительная защита от DDoS и от кривых настроек активного режима у клиентов.
  • Добавлена возможность включить игнорирование несовпадения ников в CTM команде.
  • Содержит ошибки! В частности в 119 строке.

v1.00:
  • Первая версия. Публичный релиз.


[attachment=6312:UserMode...er_v2.05.lua]
Предыдущие версии
[attachment=6309:UserMode...er_v2.04.lua]
[attachment=6308:UserMode...er_v2.03.lua]
[attachment=6305:UserMode...er_v2.02.lua]
[attachment=6297:UserMode...er_v2.01.lua]
[attachment=6295:UserMode...er_v2.00.lua]
[attachment=6293:UserMode...er_v1.13.lua]
[attachment=6288:UserMode...er_v1.12.lua]
[attachment=6279:UserMode...er_v1.11.lua]
[attachment=6277:UserMode...er_v1.10.lua]
[attachment=6276:UserMode...er_v1.09.lua]
[attachment=6274:UserMode...er_v1.08.lua]
[attachment=6273:UserMode...er_v1.07.lua]
[attachment=6272:UserMode...er_v1.06.lua]
[attachment=6268:UserMode...er_v1.05.lua]
[attachment=6267:UserMode...er_v1.04.lua]
[attachment=6260:UserMode...er_v1.03.lua]
[attachment=6259:UserMode...er_v1.02.lua]
[attachment=6258:UserMode...er_v1.01.lua]
[attachment=6257:UserMode...er_v1.00.lua]
Предыдущие версии выложены, исключительно, для ознакомления с их исходным кодом. Это связано с тем, что я могу убрать из последней версии какой-то функционал, который вам может пригодится при написании своих скриптов. Если же вас интересует использование скрипта на своем хабе, настоятельно рекомендую использовать только последнюю версию. В старых версиях могут быть ошибки.


P. S. Если у вас нет регистрации на этом форуме, а значит вы не можете качать вложения, то скачать этот скрипт, равно как и другие, можно по ссылке Мои скрипты.
Nickolya, ustas, Tsd, mariner, Артём, PomanoB, rival, Kingston, LoT, Saymon21, AndreiDC, Damaks, nafig, Littlemuk, AfLc, graforlof, мамин_парень, Unique
9.1.2012, 20:55 Instahub
Instant PtokaX-based Hub with scripts (API2)
Может у кого-то остался скачанный вариант. У того и просите. Например у nafig.
8.1.2012, 14:29 RegmeEmail
API2 | Регистрация через e-mail
Вижу в коде переменную iDelay, которая не инициализирована. Первый раз используется в указанной строке, а второй раз передается в
Код
    Core.SendToUser(tUser, ("<%s> Пароль отправлен на адрес: (e-mail). Письмо с вашим паролем было успешно отправлено (Message with your password was sent successfully)"):format(sBot, iDelay))

Но в строку формата не подставляется.

Более того, судя по названию переменной это целое число. А выводится как строка.
Дальше. Судя по сообщению скрипта, должен быть таймаут повторной регистрации. Его нет. Во всяком случае в коде я его не вижу.

Как экспресс фикс, можно в начале скрипта написать:
Код
iDelay = "5"

Но это неправильный подход.

UPD:
Резюмируя, могу сказать, что скрипт требует переделки, если предлагается реализовывать заявленный функционал.

Если же не переделывать, то достаточно изменить так:

Код
function Regme(tUser)
  local sEmail = cmd.msParams
  if tMailList[sEmail] then
    return nil, ("С введённым вами e-mail адресом уже зарегистрирован пользователь. Если письмо не пришло на ящик, для перерегистрации обратитесь к оператору.")
  end
  local sPasswd = GetPass()
  local res, err = email.SendMail(sEmail, sSubject, GetMsg(tUser.sNick, sPasswd))
  if res then
    RegMan.AddReg(tUser.sNick, sPasswd, iRegProfile)
    Core.SendToOps("Зарегистрировался юзер с ником "..tUser.sNick)
    tMailList[sEmail] = tUser.sNick
    tNickList[tUser.sNick] = sEmail
    Save(tMailList, "tMailList", sFile)
    tNoActivate[tUser.sNick] = true
    Core.SendToUser(tUser, ("<%s> Пароль отправлен на адрес: (e-mail). Письмо с вашим паролем было успешно отправлено (Message with your password was sent successfully)"):format(sBot))
  end
  return res, err
end
Ameet
3.1.2012, 2:43 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Цитата(MIKHAIL @ 3.1.2012, 0:50) *
Вопрос: есть ли существенная разница между
Код
function GetData(sData)

и
Код
GetData = function(sData)

???

Тест

Код:
Код
function ChatArrival(tUser, sData)
  local iLimit = 10*1000*1000
  
  local iStart = os.time()
  for i = 0, iLimit, 1 do
    function GetData(sData)
        sData = "0"
    end
  end
  Core.SendToAll(" " .. os.difftime(os.time(), iStart));
  
  iStart = os.time()
  for i = 0, iLimit, 1 do
    GetData = function(sData)
        sData = "0"
    end
  end
  Core.SendToAll(" " .. os.difftime(os.time(), iStart));
end

Результат:
Код
[01:40:49] * 10
[01:40:49] * 11

Вывод:
Все естественно. Во втором случае создается безымянная функция, которая присваивается в переменную, а во втором случае, все то же самое, только функция имеет имя сразу. На этом и выигрыш.

MIKHAIL
3.1.2012, 2:16 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Это вопрос или утверждение?

ADD:
Цитата(MIKHAIL @ 1.1.2012, 23:46) *
Согласно Сообщение #1, п. 4 нижеуказанная замена подпадает под этот метод оптимизации? А именно, имеющийся код:
Код
local data = string.sub(data,1,-2)

заменить на:
Код
local data = data:sub(1,-2)

Тест
Код:
Код
function ChatArrival(tUser, sData)
  local iLimit = 10000000
  
  local sData = 'Sample text'
  local sResult= '';
  
  local iStart = os.time()
  for i = 0, iLimit, 1 do
    sResult = string.sub(sData, 1, -2)
  end
  Core.SendToAll(" " .. os.difftime(os.time(), iStart));
  
  iStart = os.time()
  for i = 0, iLimit, 1 do
    sResult = sData:sub(1, -2)
  end
  Core.SendToAll(" " .. os.difftime(os.time(), iStart));
end

Результат:
Код
[00:57:07] * 11
[00:57:07] * 9

Вывод:
ООП вариант быстрее (это тот, который через двоеточие).


PS Если охота заниматься "блошиной" оптимизацией, то пиши сам подобные скрипты и проверяй что быстрее, не так уж они и сложны.
И да, "выигрыш" нереально "крут" - 2/10 000 000 секунд с одного оператора на моей машине. Так что не стоит заморачиваться.

ADD:
Цитата(MIKHAIL @ 1.1.2012, 21:19) *
Скажите, пожалуйста, какой вариант кода в данном случае будет быстрее работать?
Вариант №1:
Код
local sData1 = "0"
local sData2 = "0"

или вариант №2:
Код
local sData1 = "0"
local sData2 = sData1

Тест
Код:
Код
function ChatArrival(tUser, sData)
  local iLimit = 100*1000*1000
  
  local sData1 = ''
  local sData2 = ''
  
  local iStart = os.time()
  for i = 0, iLimit, 1 do
    sData1 = "0"
    sData2 = "0"
  end
  Core.SendToAll(" " .. os.difftime(os.time(), iStart));
  
  iStart = os.time()
  for i = 0, iLimit, 1 do
    sData1 = "0"
    sData2 = sData1
  end
  Core.SendToAll(" " .. os.difftime(os.time(), iStart));
end

Результат:
Код
[01:08:04] * 15
[01:08:04] * 18

Вывод:
Первый вариант быстрее. На три секунды. При 100 миллионном повторении. extreme_sexy_girl.gif

Цитата(MIKHAIL @ 1.1.2012, 21:19) *
Есть ли, опять же, в данном случае разница (существенная, на глубинном уровне) в коде и какова в данном случае?
Вариант №1:
Код
local sData = "0"

Вариант №2:
Код
local sData = 0

Тест
Код:
Код
function ChatArrival(tUser, sData)
  local iLimit = 30*1000*1000
  
  local iData1 = ''
  local iData2 = 0
  
  local iStart = os.time()
  iData2 = "0"
  for i = 0, iLimit, 1 do
    iData1 = "1"
    iData2 = iData2 + iData1
  end
  Core.SendToAll(iData2 .. " " .. os.difftime(os.time(), iStart));
  
  iStart = os.time()
  iData2 = 0
  for i = 0, iLimit, 1 do
    iData1 = 1
    iData2 = iData2 + iData1
  end
  Core.SendToAll(iData2 .. " " .. os.difftime(os.time(), iStart));
end

Результат:
Код
[01:14:33] *30000001 18
[01:14:33] *30000001 6

Вывод:
Если у вас число, то быстрее будет как число. Не будете лишний раз конвертировать.
MIKHAIL
2.1.2012, 23:29 Способы Повышения Производительности
методы оптимизации lua кода
Ну и что. На 10 млн проверок (!) нужно порядка 10 секунд, на не самой быстрой машине. Т. е. порядка 1 млн проверок в секунду. Это не существенно. У вас юзеров за спам забанит намного раньше.

ADD:
Цитата(MIKHAIL @ 2.1.2012, 22:11) *
Enyby, Вы так "жёстко" определили где команда, а где сообщение. Это понятно, правильно. Но ведь есть разные случаи жизни, кто-то ошибается с вводом команды... и получается сообщение... по разным причинам. Или кто-то подбирает команды... а в результате могут получатся и команды, и сообщения.

А так и есть. Все варианты не предугадаешь. Так что и не стоит даже заморачиваться. Завтра кошка будет по клавиатуре бегать, так вы скрипт анти кошка писать будете? big_smile.gif
Цитата(MIKHAIL @ 2.1.2012, 22:11) *
Код
[22:07:31] 127.0.0.1 | ??    на хабе    Находится <ВВВВВВВВВВВВВВВВВВВВ> test

Уточните, пожалуйста, что это?

Это вывод в ДС клиенте сообщения в чат. Временной штамп, ип, страна, локация/провайдер, ник и само сообщение.
Чтоб было понятнее - запустите тестовый скрипт и отправьте сообщение.
Правда хаб подвисает на время брожения в циклах. Так что это нормально.

ADD:
В общем стоит задача отсеять "возможно команды" от точно "не команд". Все что началось не с префикса - командой быть не может. А если есть префикс, то тогда нужно регулярку, захватывать текст и проверять что это, известная команда или отсебятина. В любом случае, это будет менее ресурсоёмко, чем проверка каждого сообщения регуляркой.
MIKHAIL
2.1.2012, 23:10 Способы Повышения Производительности
методы оптимизации lua кода
А? Ты че-то не то пишешь. Или не туда. Тут речь о префиксах команд. Т. е. о наименее ресурсоёмком определение, что именно прислал пользователь - команду или текстовое сообщение в чат.
"!regme" - это команда
"Привет всем!" - это сообщение.
В первом случае скрипт должен отработать и что-то сделать, перехватив вывод команды в чат, а во-втором, пропустить сообщение в чат, ничего не выполняя, с наименьшими затратами ресурсов.

ADD:
Продолжая тему оптимизации.
Тест
Код:
Код
function ChatArrival(tUser, sData)
  local iPos = #tUser.sNick + 4
  local iLimit = 10000000
  local sChar = '!'
  local iChar = sChar:byte(1);
  local iCounter = 0;
  
  local iStart = os.time()
  iCounter = 0
  for i = 0, iLimit, 1 do
    if sData:sub(iPos, iPos):find('!', 1, true) then
        iCounter = iCounter + 1
    end
  end
  Core.SendToAll(iCounter .. " " .. os.difftime(os.time(), iStart));
  
  iStart = os.time()
  iCounter = 0
  for i = 0, iLimit, 1 do
    if sData:sub(iPos, iPos) == '!' then
       iCounter = iCounter + 1
    end
  end
  Core.SendToAll(iCounter .. " " .. os.difftime(os.time(), iStart));
  
  iStart = os.time()
  iCounter = 0
  for i = 0, iLimit, 1 do
    if sData:byte(iPos) == iChar then
       iCounter = iCounter + 1
    end
  end
  Core.SendToAll(iCounter .. " " .. os.difftime(os.time(), iStart));
end

Результат:
Код
[22:18:22] *10000001 19
[22:18:22] *10000001 11
[22:18:22] *10000001 10
[22:18:22] 127.0.0.1 | ??    на хабе    Находится <ВВВВВВВВВВВВВВВВВВВВ> !say test
[22:19:11] *0 18
[22:19:11] *0 11
[22:19:11] *0 9
[22:19:11] 127.0.0.1 | ??    на хабе    Находится <ВВВВВВВВВВВВВВВВВВВВ> test

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


UPD: Исправил ошибку в коде.

PS что интересно, так это четко видная буферизация вывода. В клиент все пришло одновременно, независимо от того, что отдельные строки отсылались с разрывом порядка 10 секунд.
Alexey, MIKHAIL
2.1.2012, 11:33 Способы Повышения Производительности
методы оптимизации lua кода
#tUser.sNick - число символов в нике
4 - число символов до начала сообщения:
Код
<Ник> Сообщение|

В данном случае длина ника составляет 3 символа, а смещение 4 переходит вперед по символам "<> ", пропуская их. Таким образом это будет позиция первого символа сообщения.

ADD:
Цитата(Setuper @ 23.9.2010, 9:09) *
Наиболее оптимизированный вариант:

Код
function ChatArrival(tUser, sData)
  local iPos = #tUser.sNick + 4
  if sData:sub(iPos, iPos):find('!', 1, true) then --поиск префикса команды

    -- дальнейшие действия (в том числе поиск и сравнение команд)

  end
end


Есть код:
Код
function ChatArrival(tUser, sData)
  local iPos = #tUser.sNick + 4
  local iLimit = 10000000
  local sChar = ''
  local iStart = os.time()
  for i = 0, iLimit, 1 do
    sChar = sData:sub(iPos, iPos):find('!', 1, true)
  end
  Core.SendToAll("" .. os.difftime(os.time(), iStart));
  iStart = os.time()
  for i = 0, iLimit, 1 do
    sChar = sData:sub(iPos, iPos) == '!'
  end
  Core.SendToAll("" .. os.difftime(os.time(), iStart));
end

Есть результат:
Цитата
[10:27:50] *16
[10:27:50] *8
[10:27:50] 127.0.0.1 | ?? на хабе Находится <ВВВВВВВВВВВВВВВВВВВВ> test

Есть вывод:
Прямое сравнение быстрее любых find'ов.

ADD:
Другой вопрос, если префиксов несколько. Там или циклом или регуляркой.
Alexey, MIKHAIL
1.1.2012, 11:57 Kinozal_tv
API2 | Скрипт новостей с трекера
Assert:
Цитата
assert (v [, message])
Issues an error when the value of its argument v is false (i.e., nil or false); otherwise, returns all its arguments. message is an error message; when absent, it defaults to "assertion failed!"

http://www.lua.org/manual/5.1/manual.html#pdf-assert

Require:
Цитата
require (modname)

Loads the given module. The function starts by looking into the package.loaded table to determine whether modname is already loaded. If it is, then require returns the value stored at package.loaded[modname]. Otherwise, it tries to find a loader for the module.

To find a loader, require is guided by the package.loaders array. By changing this array, we can change how require looks for a module. The following explanation is based on the default configuration for package.loaders.

First require queries package.preload[modname]. If it has a value, this value (which should be a function) is the loader. Otherwise require searches for a Lua loader using the path stored in package.path. If that also fails, it searches for a C loader using the path stored in package.cpath. If that also fails, it tries an all-in-one loader (see package.loaders).

Once a loader is found, require calls the loader with a single argument, modname. If the loader returns any value, require assigns the returned value to package.loaded[modname]. If the loader returns no value and has not assigned any value to package.loaded[modname], then require assigns true to this entry. In any case, require returns the final value of package.loaded[modname].

If there is any error loading or running the module, or if it cannot find any loader for the module, then require signals an error.

http://www.lua.org/manual/5.1/manual.html#pdf-require

Судя по условиям, assert вылетит тогда, когда библиотека будет состоять их нескольких модулей, причем тот модуль, который указан в качестве параметра require будет, а другого не будет. Тогда require из загрузчика вернет false и assert выдаст сообщение.
MIKHAIL
31.12.2011, 19:13 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Реально все. Это лишь вопрос времени и ресурсов.

Это не кодировка. Это способ эйскепирования символов юникода в кодировках, его не поддерживающих.
В данном конкретном случае надо разбить шестнадцетиричное число, идущее после "/u", на две части, перевести эти части в байты. Полученная последовательность байт будет юникодом, который можно прогнать через Utf8ToAnsi.
MIKHAIL
31.12.2011, 9:26 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Код
"\u041d\u0430\u0443\u043a\u0430 \u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438" == "Наука и технологии"

http://dukehome.kiev.ua/docs/JavaScript/Ja...ialsymbols.html
MIKHAIL
28.12.2011, 22:33 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Навскидку: умножить на нужное число, потом округлить и поделить обратно. Например, для трех знаков это будет: round(3,141592654 * 1000) / 1000
MIKHAIL
27.12.2011, 3:05 Ваши Вопросы И Предложения По Поводу Форума
Хе-хе. А бага-то уже нет...
Nickolya
25.12.2011, 13:17 Ваши Вопросы И Предложения По Поводу Форума
Это вообще псевдо код с датами "от фонаря". Важна идея. Чтобы не забывать.
Nickolya
25.12.2011, 0:24 Ваши Вопросы И Предложения По Поводу Форума
Вижу проблему в Опере 9.63. При клике на картинке оверлей (серое нечто, должное прикрывать сайт от клика), ставится по размеру экрана, а не на весь размер сайта. И остается это, затемненное чудо, в самом верху страницы. При этом можно открыть несколько увеличенных картинок сразу. Главное чтобы они были разными, дубликаты не открываются.
Собственно предложение: Или убрать оверлей или сделать его рабочим. Я не знаю как он там работает, может растягиваться должен, а не растягивается на сколько надо. А может надо position: fixed или компенсировать скроллирование на JS.

ADD:
Цитата(Nickolya @ 19.12.2011, 11:33) *
Setuper, да, в этом году что-то припозднились... забыл я совсем про НГ. правда шапку вернуть - пара кликов big_smile.gif

Можно же сделать условный оператор:
Код
if (date('dd.mm') > '25.12' && date('dd.mm') < '14.01')
    include 'new_year.tpl';
else
    include 'header.tpl';
Nickolya
24.12.2011, 9:56 Переделка скриптов
Прошу помощи
Проверил с ip-to-country.csv. Работать не будет. Причина проста - соответствие аббревиатур и их расшифровок жестко зашиты в PtokaX.
Тогда только второй вариант. Например так:
Код
tDiaps = {
    {"192.168.0.1", "192.168.0.255", "ISP 1"},
    {"192.168.32.1", "192.168.32.255", "ISP 2"},
    {"192.168.34.1", "192.168.34.255", "ISP 2"},
    {"10.0.0.1", "10.0.50.255", "Corbina"},
    {"127.0.0.1", "127.255.255.255", "Loopback"},
}

function OnStartup()
    for _, tDiap in ipairs(tDiaps) do
        tDiap[4] = ipToLong(tDiap[1])
        tDiap[5] = ipToLong(tDiap[2])
    end
end

function getDiapName(sIP)
    local iIP = ipToLong(sIP)
    for _, tDiap in ipairs(tDiaps) do
        if tDiap[4] <= iIP and iIP <= tDiap[5] then
            return tDiap[3]
        end
    end
    return "Unknown"
end

function ipToLong(sIP)    
    local _, _, iFirst, iSecond, iThird, iFourth = sIP:find("^(%d+)%.(%d+)%.(%d+)%.(%d+)$")
    return ((iFirst*256 + iSecond)*256 + iThird)*256 + iFourth
end

function UserConnected(tUser)
local Profile = (ProfMan.GetProfile(tUser.iProfile) and ProfMan.GetProfile(tUser.iProfile).sProfileName) or "Guest"
Core.SendToUser(tUser,"\n[::] Информация: \n[::] : Ник " ..tUser.sNick.." \n[::] Класс : "..Profile.." ("..tUser.iProfile..") \n[::] Ваш ip: "..tUser.sIP.." \n[::] Провайдер: "..getDiapName(tUser.sIP).."\n")
end
RegConnected = UserConnected
OpConnected = UserConnected
Fe(one)X
24.12.2011, 3:29 Переделка скриптов
Прошу помощи
Цифры это ип. Начальный и конечный для диапазона. Тебе нужно сделать следующее: устанавливаешь ипы на нужные, а потом меняешь название страны, не трогая ее аббревиатуру. Именем страны будет служить имя провайдера.
Ип рассчитывается как: ((A*256 + B)*256 + C)*256 + D где A.B.C.D - это IP адрес.
Например: 192.168.0.1 => ((192*256 + 168)*256 + 0)*256 + 1 = 3232235521
Fe(one)X
24.12.2011, 2:45 Переделка скриптов
Прошу помощи
Fe(one)X
21.12.2011, 9:00 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
index.php
Цитата
<td class="status status-<?php echo htmlspecialchars($row['online'] == 1 ? "0" : '4'); ?>">
<span<?php echo ($row['online'] != 1 and $row['date'] != '') ?
' tooltip="Последний раз онлайн: '.htmlspecialchars($row['date']).'"' : '';
?>><?php echo htmlspecialchars($row['status']); ?></span>
</td>

Часть выделенным жирным можно заменить на вывод картинки, например, так:
Код
<img src="status/<?php echo urlencode($row['status']); ?>.png" />

Дальше создать папку status с картинками, названными согласно статусам в БД. Желательно в таблице статусов изменить все наименования на анголоязыные: "Статус" => "status" и т. д.

По поводу провайдера - еще одно поле в базу данных, а потом добавить вывод на страницу.

Подумываю переписать на использование шаблона.
dj hoodo
21.12.2011, 8:41 Tiny Hublist
Программа для создания хаблистов
Цитата(dj hoodo @ 20.12.2011, 4:21) *
Ато предыдущий криво пинговал некоторые хабы

Если речь о моей поделке, то можно было бы хотя бы сообщить что не так, в соответствующей теме.
Цитата(dj hoodo @ 20.12.2011, 4:21) *
1 Явно инетные хабы опредиляются как локальная сеть. В одном случае действительно хаб находился за NAT и имел адрес 10.***
Во втором случае еще не разобрался - домен резолвится на инет адрес но хаблист показывает лок сеть.

Переделать резолв с адреса хаба в его настройках, на адрес хаба, записанный в хаблисте.
Цитата(dj hoodo @ 20.12.2011, 4:21) *
2 Добавил иконки хаб софта, но некоторые хабы отдают софт с версией и вместо картинки просто название YnHub 1.036.

Предлагаю обрезать название до пробела. Должно хватить для однозначной идентификации.
Цитата(dj hoodo @ 20.12.2011, 4:21) *
А некоторые отдают прописными буквами . - в винде такое бы прокатило наверное Verlihub вместо VerliHub, но в линуксе не прокатывает.
можно конечно дописать (продублировать) эти значения в скрипт.. или есть другой вариант?

Привести все названия софта к нижнему регистру и проблем не будет.
dj hoodo
17.12.2011, 0:07 IP2Country
База адресов
Исправил.
Артём
16.12.2011, 19:57 Mellon DC Hub List
Код
if ( !socket_connect( $socket, $data['address'], $data['port'] ) )
        {
            echo 'Error..';
            return;
        }

Этот участок приводит к тому, что если не удается установить соединение с каким-то хабом, то пингование всех последующих не происходит.
Вот пример:
Код
Starting xdn.msk.ru

End xdn.msk.ru

[...]

Starting 89.151.129.239

End 89.151.129.239

Hub if offline.
Warning: socket_connect() [function.socket-connect]: unable to connect [0]: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера. in D:\Site\xdn.msk.ru\hub\bot.php on line 138
Error..

Пример был взят с адреса http://xdn.msk.ru/hub/bot.php

Второе. Нет никакого таймаута. Если добавить хаб с адресом yandex.ru и портом 80, то бот затыкается и висит.

Третье. В демо есть какие-то проблемы с пейджингом. Если зайти на вторую страницу, то хабов будет 13 штук, т. е. и те 3, которые должны быть на третьей странице. К слову они там будут. Так же неверно проставлены номера хабов. Нумерация на каждой странице начинается заново.

Кстати. Некий dro уже выкладывал на этом форуме код пингера, очень похожего на этот.

Мне без разницы кто у кого воровал и воровал ли. Мои комментарии к коду пингера можно посмотреть по ссылке: http://mydc.ru/index.html?showtopic=404&am...ost&p=33135
Nickolya
15.12.2011, 17:48 От: Mellon DC Hub List
От темы с ID: 5060
Цитата(Mellon @ 2.12.2011, 15:52) *
Данный срипт [...]

Срипт являеться [...]

Может сКрипт?
Maximum
14.12.2011, 19:49 Хаблисты
Некоторое количество хаблистов
На просторах интернета нашел некоторое количество хаблистов. Да простит меня Ksan, выложу их сюда, чтобы они не пропали даром. Может кого-то это сподвигнет на создание своего.

Итак:
  1. A Drupal module for creating online Direct Connect hublist
    [attachment=6192:hublist_6.x_1.0.rar]
    [attachment=6193:hublist_....0_beta1.zip]
    Уворовано с: http://sourceforge.net/projects/elitedc/
  2. Java Extended ADC&NMDC Hublist & Pinger
    [attachment=6201:jexhls_0.7.1.tar.gz]
    [attachment=6202:jexhls_0.7.5.tar.gz]
    Уворовано с: http://sourceforge.net/projects/jexhls/
  3. Best HUBList - DC++ HUB Management
    Написан на PHP.
    [attachment=6194:hublist_v1.1.rar]
    [attachment=6195:hublist_v1.2.rar]
    [attachment=6196:hublist_v1.3.rar]
    [attachment=6197:hublist_v1.4.rar]
    [attachment=6199:hublist_v1.5.rar]
    [attachment=6200:hublist_v1.6.rar]
    уворовано с: http://sourceforge.net/projects/hublist/


Ну и, для не знающих, на этом форуме можно найти несколько разных хаблистов.
Nickolya, CrazyKiller, bENNY!, killserver, dj_crazy_joker
14.12.2011, 18:55 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
Добавил в шапке версию 0.03 и ссылки на демо.
dj hoodo
4.12.2011, 9:48 Базы CustomLocations.zip
Ссылки на готовые базы
На данный момент нашел всего два проекта, по данной теме, заслуживающие внимания:
  1. http://ipdip.org/
  2. http://gl.sdims.ru/customloc/ ( http://www.assembla.com/wiki/show/dFin_GPU8r3QJieJe5afGb )
Прямые ссылки:
  1. http://ipdip.org/file/CustomLocations.zip (62,8 мб)
  2. http://dc.sdims.ru/cl/repo/customlocations.zip (2,2 мб)

Поддерживается формат базы CustomLocations, введенный в 5.94 версии DC++ клиента GreyLink:
Цитата
Теперь это ZIP-архив, где иконки сетей представлены каждая отдельным bmp-файлом. ini-файлов в архиве может быть несколько (разделение по сетям, городам или провайдерам) для удобства редактирования. Страна вычисляется вычисляется отдельно от провайдера (при наличии файла GeoIPCountryCSV.zip). В новом формате у ip-диапазона можно указать город, а городу назначить флаг.
Nickolya
3.12.2011, 19:42 IP2Country
База адресов
http://inethub.olvi.net.ua/db/
Автоматом собирается 1 раз в день, в 5 утра. Есть CSV и архивы. Для DC и для PtokaX.
Со временем может что-то еще появится.
Канал слабый, но что есть, то есть.
Nickolya, Alexey, Saymon21, Meloun
3.12.2011, 12:50 От: Mellon DC Hub List
От темы с ID: 5060
Цитата(Mellon @ 3.12.2011, 10:36) *
Проект с 2004 года и дизайн там был изначально этот уж скорее dchublist.ru угнали дизайн у jkoffa или тех кто был до него (а если быть точным первая версия dchublist.ru была основана как раз на этом скрипте), ты об этом мало что знаешь (так как тебя тогда не было)

Цитата(Ksan @ 3.12.2011, 11:30) *
Интересно было бы услышать комментарии оппонента на эту тему. big_smile.gif

А что тут комментировать? Ноу комментс. Могу только сделать вывод, что оппонент считает что мне и 8 лет нет. Его право. Завтра он скажет, что он на Марс пешком ходит. Я что врач ему?

Diff лога я не вижу, говорить не о чем.

PS Кстати, меня позабавила та реплика
Цитата(Mellon @ 3.12.2011, 10:36) *
Твой скрипт как то раз пробовал поставить там пришлось многое переписать что бы заработало спс за гемор ))

Оппонент не смог меня "задавить" в рамках мужской логики и перешел на женскую. Кому интересно, есть интересная статья "Заметки по женской логике" на эту тему.

UPD:
Пока писал, пришел очередный ответ:
Цитата(Mellon @ 3.12.2011, 11:40) *
Времени просто нет если честно, меня уже год выложить просят (так что это не моя инициатива) тем более писать посты. Просили ? я выложил, наслаждайтесь, все равно каждый останется при своем мнении как бы там ни было на самом деле...

Ну что я могу сказать... Слив защитан.
Я мог бы тут рассказывать что меня тоже просят не один день, но не вижу смысла. Что более интересно, это то что за всех уже все "решено". Т. е. уже предопределено что
Цитата(Mellon @ 3.12.2011, 11:40) *
каждый останется при своем мнении как бы там ни было на самом деле
. Это мне напоминает одну историю:
Цитата
Какой-то ученый вынес на суд академии новое открытие, на что ему было отвечено: "Такого не может быть, потому что такого не может быть никогда. А если бы и было, то было бы давно уже открыто и изучено." Имя ученого и что за открытие я не помню.
-=ДЕМОН=-
3.12.2011, 1:51 От: Mellon DC Hub List
От темы с ID: 5060
Цитата(Mellon @ 2.12.2011, 15:52) *
Описывать так же и оформлять ничего не хочу данный хаблист является рабочим модификом хаблста от jkoff - который давал мне лично jkoff он значительно отличался от того что лежит на этом сайте или уважаемый товарищ VOVKT пытался мне его пихнуть.

Разъяснение.
С JKoff я разговаривал изначально все писал он далее взял человека который будет ему помогать, который его подставил полагаю этот человек основал проект Small и пытался продать то что Jkoff делал своими руками своим трудом причем бесплатно для народа и.т.п.. это крайне не красиво было, решил его поддержать от того весь кипишь..

Такие хаблисты типо как Small или от Enyby есть подозрение что тоже модификации моего или jkoff но мы в отличии от этих авторов не пытаемся чего то доказать что это мы написали хоть и на самом деле их хаблисты это всего лишь плагиат. Моё уважение заслужил лиж только один проект Tiny Hublist это действительно хоть и не очень функциональный но собственный проект а не копипаст копипаста моего хаблиста или жкоффа

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

О... Я думал ты так и не отважишся кинуть камень в меня публично.

Ну что ж. Давайте расставим все точки над i.

Во-первых, хаблист ценен, в первую очередь, реализацией пингера. В данном вопросе у моего хаблиста есть неоспоримое преимущество, поскольку я осилил неблокирующие сокеты и мой хаблист позволяет пингование 70 хабов менее чем за 5 минут.

Во-вторых, судить по дизайну о "слизанности" хаблиста - полнейшее профанство. Вон ВКонтакте "слил" дизайн у Facebook в начале своего существования, но никто же не вопит, что ВК это украденный FB, ибо дело тут в наполнении а не форме.
Я ни капли не скрываю, что брал дизайн dchublist.ru за основу. Впрочем как и подавляющее большинство хаблистов.

Цитата(Mellon @ 2.12.2011, 15:52) *
Такие хаблисты типо как Small или от Enyby есть подозрение что тоже модификации моего или jkoff но мы в отличии от этих авторов не пытаемся чего то доказать что это мы написали хоть и на самом деле их хаблисты это всего лишь плагиат.
Ога, да. "Все ****расы, а я д'Артаньян". Этой фразой ставим сразу в положение виноватого, теперь я должен оправдываться и рассказывать, что я не верблюд. Не дождетесь. Давайте diff лог, а после этого поговорим у кого что списано. До этого ваши слова лищь пустой треп уровня бабки на завалинке.

И да, мне кажется что вам не знакомо значение слова модификация: "видоизменение, преобразование, появление новых свойств." (с) БСЭ.
Например, FreeBSD НЕ яляется модификацией BSD, в виду того что она была переписана ко второй версии.

В-третьих, на счет отличий моего релиза и проекта. Там вроде значится что это прародитель. И там есть ссылки на развернутый релиз в двух местах.

Вот-с.

Ах да, еще. Позвольте кинутся какашкой в вашем стиле. "Все хаблисты уворованы у dchublist.ru, ибо у них одинаковый дизайн. Ну там табличка на странице хаба и все такое". Ну или, как минимум, уворован дизайн. ;-) И да, товарищ святой Mellon и его брат jkoff, вы тоже так же поступили. Или вы скажете что это dchublist.ru у вас украл дизайн? Или то что они сильно похожи - совпадение?

Тэкс. Пожалуй на этом все. Ах нет, еще спасибо, за релиз кода. Нажимать кнопку "спасибо" в посте я не хочу, ибо там много гадостей написано.

За сим считаю тему исчерпаной. по крайней мере до той поры, пока мне не покажут что-то весомее пустого трепа из серии "а я вот считаю".
-=ДЕМОН=-
23.11.2011, 11:27 Public PHP hublist (Хаблист) by Enyby
Публичный открытый хаблист на PHP
В работе этого хаблиста существует ограничение - не более 256 хабов. Когда их количество станет больше этого числа, пингование перестанет работать. Это связано с реализацией функции php socket_select (под Windows точно работать не будет, а вот под Unix - нужно тестировать). Чтобы обойти это ограничение вам потребуется переписать код пингера на использование пула сокетов. В пуле должно быть не более 256 сокетов одновременно.
dj_crazy_joker
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  < 1 2 3 4 5 >
RSS Сейчас: 25.4.2024, 4:27