myDC.ru

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

 
История благодарностей участнику Setuper. Спасибо сказали: 1708
Дата поста: В теме: За сообщение: Спасибо сказали:
27.12.2008, 15:44 От: Объектно-ориентированные Принципы В Lua
От темы с ID: 1429
Продолжаю знакомство с ООП в LUA.

Реализация класса в lua.
  • Конструкторы
  • Открытые переменные и функции (public)
  • Закрытые переменные и функции (private)

Код
--//Функция-конструктор класса cMyClass
cMyClass = function(tData)
    local t = {}
    tData = tData or {}
    
--//private:
    t.z = 0 --//Значение по умолчанию
    t.PrivateFunc = function()
        return "Это закрытая функция, которая доступна только внутри данного класса cMyClass!"
    end
    
--//public:
    tData.x = tData.x or 0
    tData.y = tData.y or 0
    
    
    --//Инициализация полей 'x' и 'y'
    t.__call = function(f, a, b)
        if a then tData.x = a end
        if b then tData.y = b end
    end
    
    
    --//Получения значения индекса
    t.__index = function(tab, key)
        if key == "z" then --//Защита от чтения 'private' переменной 'z'
            return
            
        elseif key == "GetZ" then --//Объявление 'public' функции, которая возвращает значание 'private' переменной 'z'
            return function()
                return t.z
            end
            
        elseif key == "SetZ" then --//Объявление 'public' функции, которая записывает значание в 'private' переменную 'z'
            return function(z)
                t.z = z
                return true
            end
            
        elseif key == "x" then --//Доступ к 'public' полю 'x'
            return tData.x or 0
            
        elseif key == "y" then --//Доступ к 'public' полю 'y'
            return tData.y or 0
            
        elseif rawget(tab, key) then --//Доступ к любому другому 'public' полю
            return rawget(tab, key)
        end
    end
    
    
    --//Присвоение новому индексу значения
    t.__newindex = function(tab, key, val)
        if key == "z" then --//Защита от записи в 'private' переменную 'z'
            return
            
        else --//Запись в любое другое поле
            return rawset(tab, key, val)
        end
    end
    
    
    setmetatable(tData, t)
    return tData
end



Использование класса cMyClass
Код
--//Создаём объект 'u' типа 'cMyClass' с 'public' полем 'z'
local u = cMyClass({z="u.z_value"})


--//Создаём объект 'v' типа 'cMyClass' с 'public' полями 'x' и 'y'
local v = cMyClass({x="v.x_value",y="v.y_value"})


--//Инициализируем 'public' поля 'x' и 'y' объекта 'u'
u("u.x_value", "u.y_value")


--//Устанавливаем значение 'private' поля 'z' объекта 'u'
u.SetZ("private_z_value")


--//Выводим результаты
Core.SendToAll("\n==============================================\n\t"..
"u.x = '"..tostring(u.x).."', \tv.x = '"..tostring(v.x).."';\n\t"..
"u.y = '"..tostring(u.y).."', \tv.y = '"..tostring(v.y).."';\n\t"..
"u.z = '"..tostring(u.z).."', \tv.z = '"..tostring(v.z).."';\n\t"..
"u.GetZ() = '"..tostring(u.GetZ()).."', \tv.GetZ() = '"..tostring(v.GetZ()).."'.\n"..
"==============================================")
MIKHAIL
22.12.2008, 22:35 Антиреклама
идея более сложного скрипта
хехе. Давайте я вам расскажу самый продвинутый способ борьбы против рекламы.

Смысл вот в чём: если хорошенько подумать, то можно понять, что избавиться от рекламы не так уж и просто, потому что если запрещаешь что-то, то юзер находит обходные пути. Тогда назревает вопрос: как сделать так, чтобы юзер не мог найти обходные пути. Ответ на этот вопрос прост: надо чтобы юзер не находил обходные пути, то есть использовал старые пути, которые уже известны. Этого можно добиться только в том случае, если у юзера не возникает потребности изобретать что-то новое.

Из всего сказанного следует простой метод борьбы с рекламой: надо уверить рекламщика в том, что его реклама успешно прошла.


Пример:

Рекламщик пытается рекламировать свой хаб: dchub://10.10.10.10

Антиреклама действует следующим образом: она рекламщику отсылает его же рекламу: dchub://10.10.10.10
А всем остальным пользователям отсылается модифицированное сообщение. Допустим установлен генератор случайных чисел и всем пользователям (кроме рекламщика) придёт сообщение: dchub://245.85.94.77

То есть мы уверили рекламщика в том, что его реклама прошла в чат, и он, успокоившись, уже не станет изобретать какие-то другие методы рекламы.

Метод реализован в проекте мульти-бота SBot.

За два с половиной года существования на моём хабе такого метода антирекламы никто не смог прорекламировать свои хабы.
LOKI
20.12.2008, 15:40 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$To

Синтаксис:

Код
$To: [Ник_получателя] From: [Ник_отправителя] $<[Ник]> [Сообщение]|


Направление команды:

Клиент ---> Хаб
Хаб ---> Клиент

Описание:

Эта команда используется для отправки личного сообщения.

[Ник] - этот параметр не обязан совпадать с ником отправителя (это может быть, например, бот), НО он не обязан совпадать только в случае поступления этой команды от хаба клиенту, а не от клиента хабу! При поступлении команды от клиента хабу, последний может (обязан) проверять совпадение ника с ником отправителя.
[Ник_получателя] - ник получателя приватного сообщения.

При поступлении данной команды от клиента, хаб просто транслирует эту команду в соответствующее соединение.
Saymon21
20.12.2008, 15:33 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Send

Синтаксис:

Код
$Send|


Направление команды:

Клиент ---> Клиент

Описание:

Данная команда посылается скачивающим клиентом в ответ на команду $FileLength отдающего клиента.
Команда просит отдающего клиента начать отдачу файла.
20.12.2008, 15:27 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$MyNick

Синтаксис:

Код
$MyNick [Ник]|


Направление команды:

Клиент ---> Клиент

Описание:

Первая команда, которую нужно послать клиенту при соединении с другим клиентом.
Команда $Lock должна быть послана вслед за данной командой.

Специфичность:

DC++ проверяет, чтобы указанный в этой команде ник был найден хотя бы на одном из хабов, в противном случае соединение закрывается немедленно.
20.12.2008, 15:20 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$MCTo

Синтаксис:

Код
$MCTo: [Ник_принимающего] $[Ник_отсылающего] [Сообщение]|


Направление команды:

Клиент ---> Хаб

Описание:

Данная команда отсылает сообщение пользователю, которое видно в чате только ему.
20.12.2008, 15:06 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$MaxedOut

Синтаксис:

Код
$MaxedOut|


Направление команды:

Клиент ---> Клиент

Описание:

Данная команда отсылается клиентом, когда у него нету свободных слотов.
20.12.2008, 15:01 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$GetListLen

Синтаксис:

Код
$GetListLen|


Направление команды:

Клиент ---> Клиент

Описание:

Старая команда.

Данная команда используется для того, чтобы получит размер файл-листа стиля DcLst удалённого пользователя. Удалённый пользователь в ответ отправит команду $ListLen.

Однако эта команда давно исключена из протокола. Начиная с версии 0.69, DC++ больше не генерирует списки стиля DcLst.
20.12.2008, 14:49 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Get

Синтаксис:

Код
$Get [Файл]$[Число]|


Направление команды:

Клиент ---> Клиент

Описание:

Данная команда используется для инициализации загрузки нужного файла. Клиент как бы просит у другого клиента файл.

[Файл] - это полное имя файла и путь к нему в соответствие с указанным в команде $SR или в файл-листе.
[Число] - начальная точка загрузки (начинается с 1, а не с 0)

Команда $Error с параметром "File Not Found" посылается когда файл не доступен. NMDC разъединяет пользователя если в запросе не указана директория. (то есть клиент отсылает команду $Error в ответ на команду "$Get не_существующая_директория\не_существующий_файл$1|" и разъединяет в ответ на команду "$Get не_существующий_файл$1|")

Когда файл доступен, источник файла отсылает команду $FileLength.

Для извлечения файл-листа служит команда:
Код
$Get MyList.DcLst$1|
20.12.2008, 14:35 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$FileLength

Синтаксис:

Код
$FileLength [Размер_файла]|


Направление команды:

Клиент ---> Клиент

Описание:

Данная команда отсылается отдающим клиентом скачивающему клиенту в ответ на команду $Get. Единственным параметром является размер скачиваемого файла в байтах.
20.12.2008, 14:30 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Failed

Синтаксис:

Код
$Failed [Сообщение]|


Направление команды:

Клиент ---> Клиент

Описание:

Эта команда является командой DC++ дополнительных характеристик. Отсылается в ответ на команду $GetZBlock, $UGetBlock, или $UGetZBlock. Одним из значений параметра [Сообщение] может быть значение "File Not Available" (Файл не найден).
20.12.2008, 14:23 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Error

Синтаксис:

Код
$Error [Сообщение]|


Направление команды:

Клиент ---> Клиент

Описание:

Эта команда отсылается когда возникает ошибка.

[Сообщение] - это строка, описывающая ошибку. Наиболее распространённая ошибка "File Not Available" (Файл не доступен), возвращается когда у запрошенного клиента не оказалось нужного файла (хотя он раньше у него был). Если вы пишете своего клиента, то учтите, что реализация этой строки может привести к несовместимости.
20.12.2008, 14:11 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Direction

Синтаксис:

Код
$Direction [Направление] [Номер]|


Направление команды:

Клиент ---> Клиент

Описание:

Эта команда отсылается в ответ на команду $Key. Команда решает какая сторона будет скачивать.

[Направление] - данный параметр может принимать значения "Upload" или "Download". Параметр принимает значение "Upload" только в случае если ваш клиент ничего не хочет скачать с соединяемого пользователя.
[Номер] - это случайное число. Когда оба клиента хотят скачивать друг у друга, первым начинает скачивать тот, у кого это число выше. Если эти числа равны, то соединение закрывается.

Специфичность:

Максимальное значение параметра [Номер] - 0x7FFF. NMDC должен разорвать соединение, если отсылаемое число вдруг оказалось больше максимального.

DC++ может не посылать эту команду после команды $Lock, если в команде $Lock встретилось значение EXTENDED. Смотрите описание команды $Supports.

У DC++ клиентов есть следующий баг:
У клиента A ноль свободных слотов, у клиента B есть свободные слоты. Клиент B хочет скачать у A файлы, клиент A также хочет скачать у B некоторые файлы.
Если клиент A хочет получить что-то от клиента B и он посылает случайное число, клиент B не может получить слот, потому что их нет у клиента A и тогда в статусной строке появляется надпись "Соединение...". Решение этой проблемы предложено на страницах обсуждения клиента. Выход из этой ситуации осуществляется отправкой всё большего и большего случайного числа, пока не освободится свободный слот и не установится соединение.
20.12.2008, 13:35 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Canceled

Синтаксис:

Код
$Canceled


Направление команды:

Клиент ---> Клиент

Описание:

Данная команда отсылается клиентом в ответ на команду $Cancel другого клиента. Смотрите описание команды $Cancel для более детального вникания. Следует отметить орфографию написания команды $Canceled, в отличии от хорошо известного слова "Cancelled."
20.12.2008, 13:22 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Cancel

Синтаксис:

Код
$Cancel


Направление команды:

Клиент ---> Клиент

Описание:

Скачивающий клиент может отменить скачку с некоторых клиентов (версии NMDC Windows по крайней мере). Это делается с помощью отсылки команды $Cancel (без символа | на конце!).

В свою очередь отдающий клиент при получении этой команды должен закрыть поток и отослать в ответ команду $Canceled (также без символа | на конце). Следующий пример показывает как это работает. D - скачивающий клиент, U - отдающий клиент.

Цитата
D>U: $Send|
U>D: файловый поток (D сохраняет куски файла на диск)
D>U: $Cancel (D прекращает сохранять на диск и ожидает команду $Canceled)
U>D: отдача может продолжаться, однако она уже будет игнорироваться клиентом D
U>D: $Canceled


Данная команда поддерживается только в версиях NMDC 1.x. Mac и Windows NMDC 2.x версии не могут отменить передачу как это делает NMDC 1.x. DC++ никогда не поддерживал команду $Cancel или $Canceled.

Смотрите также описание команды $Canceled
20.12.2008, 12:05 Описание Бота
помогите перевести под API1
исправил
мамин_парень
20.12.2008, 2:43 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$ValidateDenide

Синтаксис:

Код
$ValidateDenide [Ник]|


Направление команды:

Хаб ---> Клиент

Описание:

Эта команда является частью рукопожатия между клиентом и хабом. Хаб отправит эту команду клиенту в ответ на команду $ValidateNick, если такой ник уже используется на хабе, или ник совпадает с зарезервированным ником (таким как "Hub-Security").

[Ник] - это отвергнутый ник.
После того как эта команда придёт к клиенту клиент сгенерирует сообщение "Your nick was already taken (Ваш ник уже используется)" (содержание этого сообщения, вообще говоря, настраивается в клиенте).

Замечание:
Обратите внимание на название команды: $ValidateDenide, а не $ValidateDenied, как казалось бы должно быть!
Saymon21, мамин_парень
20.12.2008, 2:31 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$ValidateNick

Синтаксис:

Код
$ValidateNick [Ник]|


Направление команды:

Клиент ---> Хаб

Описание:

Эта команда является частью рукопожатия между клиентом и хабом. Она посылается клиентом на хаб после команды $Key. Она определяет ник [Ник], который вы хотите использовать на хабе.

Внимание!
По протоколу ник не должен содержать символы: $ | и пробел.
Клиент, до входа на хаб, может преобразовывать все пробелы на нижние подчёркивания, и, таким образом, продолжать использование данного модифицированного ника.

Смотрите также:

$HubIsFull, когда хаб полон
$ValidateDenide, когда ник уже используется
$GetPass, когда для ника запрашивается пароль
$Hello, когда ник принят
20.12.2008, 2:23 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Version

Направление команды:

Клиент ---> Хаб

Синтаксис:

Код
$Version [Версия]|


Описание:

Команда, содержащая версию NMDC протокола клиента.
Эта команда должна быть послана клиентом на хаб после того, как хаб пошлёт клиенту команду $Hello.

Последняя 1.x версия NMDC была 1.0091. Используется альтернативный десятичный разделитель (,). Поэтому, DC++ использует номер версии в качестве числа 1,0091 не зависимый от местоположения компьютера.
20.12.2008, 2:10 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$UserIP

Направление команды:

Хаб ---> Клиент
Клиент ---> Хаб

Синтаксис:

Запрос со стороны клиента:

Код
$UserIP [Ник1]$$[Ник2]$$[Ник3]$$ ... $$[НикN]$$|


Ответ со стороны сервера:

Код
$UserIP [Ник1] [IP1]$$[Ник2] [IP2]$$[Ник3] [IP3]$$ ... $$[НикN] [IPN]$$|


Описание:

Эта команда посылается клиентом на хаб, для того, чтобы получить ip адрес одного или более пользователей. Все пользователи разделены в команде знаками $$ (также как и в командах $NickList и $OpList). IP адрес, посылаемый хабом, должен быть реальным для хаба удалённым IP адресом, и этот IP адрес может отличаться от IP адреса, посылаемого в команде $ConnectToMe (потому что клиент может быть подключен к хабу напрямую, а между вторым клиентом и данным клиентом может находится маршрутизатор, который и сменит ip адрес в случае использования команды $ConnectToMe). DC++ не просит свой собственный IP адрес. Хабы, поддерживающие расширение протокола UserIP2 (UserIP v2), должны автоматически отсылать собственный IP клиента при входе на хаб.
20.12.2008, 1:50 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$UserCommand

Направление команды:

Хаб ---> Клиент

Синтаксис:

Код
$UserCommand [Тип] [Контекст] [Детали]||




[Тип] - положительное, целое число, описывающее тип команды:
0 - разделитель
1 - raw команда
2 - raw команда с ограничением на единственный ник %[nick]
255 - очистка команд
[Контекст] - целое число, регулирующее где показывать контекстные менюшки:
[1] - Контекстное меню хаба (доступно по клику на вкладке хаба). Примеры: просмотр правил, смена пароля. Эта команда может содержать параметр %[nick]. Вместо этого следует использовать переменную %[mynick] или %[line:blah].
[2] - Контекстное меню юзера (доступно по клику на любого юзера). Примеры: показ статистики юзера, проверка бана юзера. Эта команда может содержать переменные: %[nick], %[mynick] и %[line:blah].
[4] - Контекстное меню поиска. Пример: сообщить о битом файле. Эта команда может содержать специфические аргументы ника и файла.
[8] - Конкестное меню файл-листа. Пример: сообщение о найденном итом файле у юзера в списке файлов. Эта команда может содержать специфические аргументы ника и файла.
Замечание: этот контекст является новым в DC++ 0.669

[Детали] - этот параметр зависит от параметра [Тип]
[Тип] = 0 (разделитель) и [Тип] = 255 (очистка) не должны содержать параметра [Детали]
[Тип] = 1 (raw) использует в качестве деталей [Заголовок]$[Команда]
[Заголовок] - это название менюшки. Менюшка может быть составной, то есть содержать подменюшки. Для построения подменюшки используется обратный слеш (\). Например, [Подменю]\[Заголовок]. Степень вложенности подменюшек может быть любой.

Более высокие числа зарезервированы для дальнейшего использования.


Эскейп последовательности:
Если в меню используются знаки $, | и &, то их необходимо заменить на кодовые аналоги (аналоги html). Соответственно $ | и &

Как и все команды NMDC, данная команда разделяется от других знаком |.


Контекст:

Контекстное число - это бинарный флаг, который может быть составлен из других чисел, например, меню юзера и меню поиска вместе дадут (2 | 4 = 6). То есть для того, чтобы менюшка появилась в меню юзера и в меню поиска следует указывать контекст равный шести.


Детали:

Разделитель (вертикальная черта):

Код
$UserCommand 0 [Контекст] |


После [Контекста] и перед символом | может находиться некий текст, который в любом случае будет игнорироваться

Raw команды:

Код
$UserCommand 1 [Контекст] [Заголовок]$[raw]||


Команда добавляет raw пункт меню с заголовком [Заголовок] и raw командой [raw]. Эта команда должна оканчиваться на |, и если этого символа нет, то она отвергается.

Raw команда с ограничением на единственный ник:

Код
$UserCommand 2 [Контекст] [Заголовок]$[raw]||


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

Очистка меню:

Код
$UserCommand 255 [Контекст] |


Команда стирает все менюшки из указанного контекста и ниже. То есть, например, 7 - сотрёт все менюшки с контекстами 1,2 и 4.

Примеры:

Код
$UserCommand 2 6 Кик$$To: %[nick] From: %[mynick] $<%[mynick]> You are being kicked====|$Kick %[nick]||


Эта команда отсылает в приват сообщение "You are being kicked====" для ника, и отправляет команду $Kick. Менюшки будут в поиске и меню юзера. Raw команда с ограничением на единственный ник не позволит сделать множественный кик.

Код
$UserCommand 255 1 |


Команда удалить все менюшки из контекстного меню хаба (вкладка хаба).

На поддержку данной команды может указывать наличие характеристики UserCommand в команде $Supports. Однако, из-за большой распространённости данной команды наличие этой характеристики в команде $Supports не обязательно.
Saymon21, TiGRpp
19.12.2008, 10:39 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Supports

Синтаксис:

Код
$Supports [Характеристика1] [Характеристика2] [Характеристика3] ... [ХарактеристикаN] |


Характеристики поддерживаются: DC++ 0.17+ (Клиент - Клиент), DC++ 0.300 (Хаб - Клиент)

Направление команды:

Хаб ---> Клиент
Клиент ---> Хаб
Клиент ---> Клиент
Хаблист ---> Хаб
Хаб ---> Хаблист
Пингер ---> Хаб
Хаб ---> Пингер

Описание:

Данная команда используется для определения характеристик. Чтобы указать на то, что сервер имеет хотя бы одну характеристику, он должен отослать в начале команды $Lock следующую фразу EXTENDEDPROTOCOL. Если вторая сторона также поддерживает некоторые характеристики, то она также отсылает $Supports. Эта команда обязательно предшествует команде $Key.

Замечания:

• EXTENDEDPROTOCOL не должна отсылаться, если сервер не поддерживает никакие характеристики
• Пустая команда $Supports не допустима
• Пробелы в именах характеристик также не допустимы
• Для характеристик клиента, имя дополнения должно быть таким же как и имя команды этого дополнения.
• Хабы обычно хотят получить команду $Supports до команд $Key и $ValidateNick. Итак, последовательность должна быть такова:
Код
$Supports ..|$Key ..|$ValidateNick ..|


Характеристики для связи Клиент - Хаб:

BotList
ClientID
Feed
HubTopic
IN
MCTo
NoGetINFO
NoHello
OpPlus
QuickList
TTHSearch
UserCommand
UserIP2
ZLine
ZPipe0


Характеристики для связи Клиент - Клиент:

ADCGet
BZList
CHUNK
ClientID
GetCID
GetTestZBlock
GetZBlock
MiniSlots
TTHL
TTHF
XmlBZList
ZLIG
19.12.2008, 10:20 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$SR

Синтаксис:

Код
$SR [Ник_ответчика] [Результат][0x05][Свободные_слоты]/[Всего_слотов][0x05][Имя_хаба] ([IP_хаба:Порт]){[0x05][Целевой_ник]}|


Направление команды:

Клиент ---> Хаб
Хаб ---> Клиент
Клиент ---> Клиент
Хаб ---> Хаб

Описание:

Данная команда используется для возврата файла или директории, которая соответствует запросу в команде $Search. Все условия, которые находятся в оригинальном запросе, должны находиться в [Результат], и все типы и ограничения, используемые в команде $Search, должны быть выполнены.

[Результат] представляет из себя либо [Имя_файла][0x05][Размер_файла] для поиска по файлам, либо [Директория] для поиска по директориям
[0x05] - это 5-ый ASCII символ (используется в качестве разделителя).

Данная команда посылается клиентом, если у данного клиента нашлось что-то из запроса команды $Search от другого клиента.
Если команда $Search была послана от пассивного пользователя, то команда $SR должна быть возвращена хабу (через TCP). В этом случае, в конец данной команды должно быть дописано [0x05][Целевой_ник]. Перед пересылкой этой команды пользователю, который инициализировал поиск, хаб удаляет данную приписку с разделителем и целевым ником. Если команда $Search была послана от активного пользователя, то команда $SR возвращается на указанный в команде $Search IP адрес и UDP порт.
Параметр [IP_хаба:Порт] нужен только в том случае, если порт хаба не является портом по умолчанию (411).
В UNIX системах в путях к файлу должен встречаться только прямой слеш (/).
DC++ клиент будет отсылать максимум 5 результатов поиска для пассивных пользователей и 10 для активных. Кроме этого, для того, чтобы снизить нагрузку, хаб может сократить количество возвращаемых поисковых запросов.
Для файлов, содержащих TTH, параметр [Имя_хаба] заменяется на TTH:[base32_encoded_tth_hash] (см. TTH)

Примеры:

Ответ на пассивный поиск:

Код
$SR Вася Файл.txt[0x05]437 3/4[0x05]МойХаб (10.10.10.10:411)[0x05]Петя|


Ответ на активный поиск:

Код
$SR Вася Файл.txt[0x05]437 3/4[0x05]МойХаб (10.10.10.10:411)|
Karumo, PPA
18.12.2008, 21:44 Метод Быстрого Перевода Скриптов Под API_1
Самостоятельный быстрый перевод из API_2 ---> в API_1
v 1.4.0.0 (файл перезалит в первой теме)

Fixed:

* Исправлена ошибка функции Core.GetUser (Огромное спасибо prapor-у за указание на найденную ошибку.)

Added:

* Добавлена реализация функции Core.GetUserValue
Invisible
17.12.2008, 19:24 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Search

Синтаксис:

Пользователь в активе:

Код
$Search [IP]:[Порт] [Строка_поиска]


Пользователь в пассиве:

Код
$Search Hub:[Ник] [Строка_поиска]


Направление команды:

Клиент ---> Хаб
Хаб ---> Клиент
Хаб ---> Хаб

Описание:

Данная команда используется для начала поиска файлов на хабе. Формат [Строки_поиска] не зависит от режима подключения клиента (актив, писсив).


[IP] - IP адрес активного пользователя.
[Порт] - UDP порт, который клиент слушает для приёма ответов на запрос от других клиентов.
[Ник] - ник пассивного пользователя.
[Строка_поиска] - строка поиска, которая описывает файл, который ищет клиент. Части этой строки разделяются знаками вопроса ('?'):

[Размер_ограничения]?[Максимальный_размер]?[Размер]?[Тип_данных]?[Поисковый_параметр]

[Размер_ограничения] - принимает значение 'T', если поиск должен быть ограничен максимальным или минимальным размером, иначе 'F'.
[Максимальный_размер] - принимает значение 'F', если [Размер_ограничения] равен 'F' или если размер ограничения устанавливает более низкий предел размера файла, инача 'T'.
[Размер] - минимальный или максимальный размер файла в байтах (в случае если указан [Максимальный_размер]) и если [Размер_ограничения] принимает значение 'T', иначе 0.
[Тип_данных] - ограничение поиска по типу файлов. Данное ограничение принимает одно из следующих целых чисел:
  • 1 для любого типа файлов;
  • 2 для аудио файлов ("mp3", "mp2", "wav", "au", "rm", "mid", "sm");
  • 3 для архивов и сжатых файлов ("zip", "arj", "rar", "lzh", "gz", "z", "arc", "pak");
  • 4 для документов и текстовых файлов ("doc", "txt", "wri", "pdf", "ps", "tex");
  • 5 для выполняемых файлов ("pm", "exe", "bat", "com");
  • 6 для картинок ("gif", "jpg", "jpeg", "bmp", "pcx", "png", "wmf", "psd");
  • 7 для видео ("mpg", "mpeg", "avi", "asf", "mov");
  • 8 для папок;
  • 9 для TTH поиска;
  • 10 для CD/DVD образов.

[Поисковый_параметр] - поисковый параметр определяет совпадения в имени файлов
Если тип поиска установлен в 9, то поисковый параметр должен представлять из себя TTH искомого файла.

Как и во всех сообщениях NMDC, в поисковом параметре следует избегать употребления следующих символов: "$", "|" и "&".
Все пробелы в поисковом параметре заменяются на знак '$'.

После отправки на хаб этого сообщения, хаб должен без изменений переслать это сообщение всем пользователям хаба. Каждый пользователь с одним или более совпадениями должен послать UDP пакет на [IP]:[Порт] в случае активного запроса или на хаб в случае пассивного запроса.

Смотрите описание команды $SR для детального разбора.

Примеры:

Код
$Search 10.10.10.10:412 T?T?500000?1?Gentoo$2005
$Search Hub:Вася T?T?500000?1?Gentoo$2005

$Search 10.10.10.10:3746 F?T?0?9?TTH:TO32WPD6AQE7VA7654HEAM5GKFQGIL7F2BEKFNA
$Search Hub:Пётр F?T?0?9?TTH:TO32WPD6AQE7VA7654HEAM5GKFQGIL7F2BEKFNA
Karumo, PPA
17.12.2008, 18:10 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$RevConnectToMe

Синтаксис:

Код
$RevConnectToMe [Ник1] [Ник2]|


Направление команды:

Клиент ---> Хаб
Хаб ---> Клиент

Описание:

Клиент посылает данную команду на хаб для того, чтобы попросить пользователя [Ник2] инициализировать соединение с помощью команды $ConnectToMe. Команда $RevConnectToMe отсылается когда клиент не может сам соединиться (находится в пассивном режиме соединения с хабом).

[Ник1] - ник клиента, который просить соединиться с ним (пассивный).
[Ник2] - ник клиента, с которым нужно соединиться (активный).

Примечание:

Данная команда не применима к пассивному пользователю (к клиенту в пассивном режиме). Соединение пассив-пассив невозможно!
17.12.2008, 17:47 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Quit

Синтаксис:

Код
$Quit [Ник]|


Направление команды:

Хаб ---> Клиент
возможен случай: Клиент ---> Хаб

Описание:

Данная команда может отсылаться только хабом для того, чтобы клиент удалил разъединившегося пользователя из своего списка пользователей. Если вы решили написать свой клиент, не посылайте на хаб команду $Quit.
Данная команда показывает, что [Ник] отключился от хаба.

Пример:

Код
$Quit Вася|


Известны случаи, когда данная команда использовалась на хабе. Данная команда отсылалась клиентом на хаб и ник являлся ником клиента - хаб закрывал соединение с клиентом. Реализован этот принцип в Verli хабе.
Saymon21
17.12.2008, 17:36 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$OpList

Синтаксис:

Код
$OpList [ОПератор1]$$[ОПератор2]$$[ОПератор3]$$ ... $$|


Направление команды:

Хаб ---> Клиент

Описание:

Данная команда используется хабом для отсылки клиентам списка ОПераторов (ники с ключиками). Этот список ограничен и разделён символами "$$".

В старых версиях протокола NMDC команда $OpList является подмножеством команды $NickList.

По протоколу NMDC v1 хаб также включает в команду $OpList всех зарегистрированных на хабе ботов. Современные хабы должны быть наделены способностью как показывать ботов среди ОПераторов, так и не показывать.

Если клиент найдёт в параметрах данной команды свой ник, то он должен включить у себя функции перенаправления и кика пользователей (добавить соответствующие контекстные менюшки).
Saymon21
17.12.2008, 17:19 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$OpForceMove

Синтаксис:

Код
$OpForceMove $Who: [Ник_жертвы]$Where: [Новый_адрес]$Msg: [Причина]|


Направление команды:

Клиент ---> Хаб

Описание:

ОПератор может отослать команду $OpForceMove для того, чтобы предложить клиенту переместиться на другой хаб.

[Ник_жертвы] - ник, которому предлагается перенаправиться.
[Новый_адрес] - это IP адрес или хост-имя (и опционально через двоеточие порт) другого хаба, на который происходит перенаправление.
[Причина] - причина перенаправления.

После получения этой команды хаб должен отослать жертве команду $ForceMove.
Сервер разъединяет клиента, однако клиент и сам закрывает соединение с хабом.

Комментарии:

После отправки ОПератором на хаб команды $OpForceMove, хаб отсылает жертве команды
Код
$ForceMove [Новый_адрес]|
$To:[Ник_жертвы] From: [Ник_отправителя] $<[Ник_отправителя]> You are being re-directed to [Новый_адрес] because: [Причина]
и прекращает отсылать клиенту-жертве какие-либо команды.
Если команда $OpForceMove послана на хаб пользователем, не являющемся ОПератором, хаб должен разъединить такого пользователя.
Invisible
17.12.2008, 16:35 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$NickList

Синтаксис:

Код
$NickList [Ник1]$$[Ник2]$$[Ник3]$$ ... $$|


Направление команды:

Хаб ---> Клиент

Описание:

Данная команда используется хабом для того, чтобы отправить ники пользователей, которые находятся на хабе в данный момент. Этот список ников оканчивается и разделён символами "$$". Команда используется в старых версиях протокола NMDC.

Смотрите также $OpList, $GetNickList
Invisible
17.12.2008, 16:24 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$MyPass

Синтаксис:

Код
$MyPass [Пароль]|


Направление команды:

Клиент ---> Хаб

Описание:

Данная команда посылается клиентом на хаб в ответ на команду $GetPass.
[Пароль] - это обычно не шифрованный текст пароля клиента.
Символ | недопустим в пароле.

Также см. команду $GetPass
Invisible, Saymon21
17.12.2008, 3:11 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$MyINFO

Синтаксис:

Код
$MyINFO $ALL [Ник] [Описание][Тэг]$ $[Соедиенние][Флаг]$[E-Mail]$[Шара]$|


Направление команды:

Клиент ---> Хаб
Хаб ---> Клиент

Описание:
Данная команда отправляется клиентом на хаб, и хабом всем клиентам и, содержит всю основную информацию о клиенте.

Описание параметров команды:

[Ник] - ник пользователя (без пробелов).

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

[Тэг] - автоматически добавляемый клиентом тэг. Общий вид любого тэга: <[Имя_клиента] V:[Версия_клиента],M:[Режим],H:[Хабы],S:[Слоты],[Ограничители]>
Вообще говоря параметры не обязательно должны быть в тэге именно в такой последовательности. Такая последовательность просто является общепринятой, и некоторые клиенты любую другую последовательность параметров могут воспринимать не правильно.

Несколько примеров различных видов тэгов:

DC++:
<++ V:x,M:x,H:x/y/z,S:x,O:x>

BCDC++:
<++ V:x,M:x,H:x/y/z,S:x,O:x,B:x>

CZDC++:
<++ V:x,M:x,H:x/y/z,S:x,O:x,L:x>

DC:Pro:
<DC:PRO V:x,M:x,H:x/y/z,S:x,O:x,F:x/y>

DC++k CDM:
<++ V:x,M:x,H:x/y/z,S:x,O:x>

DCDM++:
<++ V:x,M:x,H:x/y/z,S:x,O:x,B:x>

DCGUI:
<DCGUI V:x,M:x,H:x,S:x,L:x>

iDC++:
<++ V:x,M:x,H:x/y/z,S:x,O:x>

MS++V:
<++ V:x,M:x,H:x/y/z,S:x,O:x,B:x>

NMDC v2:
<DC V:x,M:x,H:x/y/z,S:x,O:x>

oDC:
<oDC V:x,M:x,H:x/y/z,S:x,O:x>

PhantomDC:
<++ V:x,M:x,H:x/y/z,S:x,O:x,B:x>

PeerWebDC++:
<PWDC++ V:x,M:x,H:x/y/z,S:x>

PeerWebDC++:
<PWSDC++ V:x,M:x,H:x/y/z,S:x>

rmDC++:
<RMDC++ V:y,M:x,H:x/y/z,S:x,O:x,B:x,D:x>

StrongDC++:
<StrgDC++ V:y,M:x,H:x/y/z,S:x,O:x,L:x>

zDC++
<++ V:x,M:x,H:x/y/z,S:x,O:x>

Z++
<Z++ V:x,M:x,H:x/y/z,S:x,L:x>

LDC++
<LDC++ V:x,M:x,H:x/y/z,S:x,L:x>

ApexDC++
<ApexDC++ V:x,M:x,H:x/y/z,S:x,L:x>

AvaDC++
<AvaDC V:x,M:x,H:x/y/z,S:x,L:x>

FlylinkDC++
<FlylinkDC++ V:x,M:x,H:x/y/z,S:x,L:x>

Greylink++
<gl++ V:x,M:x,H:x/y/z,S:x,L:x>

Pelink++
<pl++ V:x,M:x,H:x/y/z,S:x,L:x>

RSX++
<RSX++ V:x,M:x,H:x/y/z,S:x,L:x>

zK++
<zK++ V:x,M:x,H:x/y/z,S:x,L:x>

UKCable++
<UKC++ V:x,M:x,H:x/y/z,S:x,L:x>





[Имя_клиента] - имя, которое определяет тот или иной клиент.

[Версия_клиента] - версия, под которой выпущен клиент.

[Режим] - режим клиента. Может принимать значения: A, P или иное (5). A - активное соединение с хабом, P - пассивное соединение с хабом, 5 - соединение через прокси-сервер SOCKS5.

[Хабы] - хабы на которых находится клиент. Параметр может иметь следующий формат: U/R/O, где U - число хабов, на которых данный пользователь является незарегистрированным, R - число хабов, на которых данный пользователь является зарегистрированным, O - число хабов, на которых пользователь яляется ОПератором.

[Слоты] - число свободных или полное число слотов в клиенте.

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

[Соединение] - тип соединения с хабом (указывается либо тип соединения, либо скорость соединения). Устанавливается непосредственно пользователем клиента.
Типы соединений в клиенте NMDC1: 28.8Kbps, 33.6Kbps, 56Kbps, Satellite, ISDN, DSL, Cable, LAN(T1), LAN(T3).
Типы соединений в клиенте NMDC2: Modem, ISDN, Wireless, DSL, Cable, Satellite, LAN(T1), LAN(T3).
Новые типы (Мбит/c): 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100, 1000

[Флаг] - статус пользоателя (ascii символ). Этот символ ещё называют магическим байтом. При отсутствии принимает значение кода 0.
Типы статусов (коды ascii символов для данного статуса):
  • normal (1, 16, 17, 32);
  • normal away (2, 3, 18, 19);
  • server (4, 5, 12, 13, 20, 21, 28, 29);
  • server away (6, 7, 14, 15, 22, 23, 30, 31);
  • fireball (8, 9, 24, 25);
  • fireball away (10, 11, 26, 27).

Статус server используется, когда клиент пробыл на хабе больше 2 часов, расшарил больше 2 ГБ и имеет отдачу свыше 200 МБ.
Статус fireball используется, когда с клиента скачивают со скоростью, превышающей 100 КБ/с.

[E-Mail] - email адрес пользователя. Может отсутствовать (пустая строка).

[Шара] - количество байт, которые расшарил пользователь. Этот параметр в любом случае должен приводится к числу.



Расшифровка буквенных обозначений тэга (на английском):
V: Client Version.
M: Mode.
H: The number of Hubs the client is connected to.
S: Number of Slots open.
O: Open an extra slot if speed is below.
B: Upload Bandwidth limit in kb/s.
L: Upload bandwidth Limit.
D: Download bandwidth limit in kb/s.
F: Fraction download / upload.



Возможные комбинации ограничителей:
  • L:x
  • O:x
  • O:x,B:x
  • O:x,B:x,D:x
  • O:x,L:x
  • O:x,F:x/y
Ограничители, ограничивающие скорость скачки:
  • L:x
  • B:x
  • F:x/y




В параметрах данной команды символы $ и | не допустимы!

Эта команда является частью рукопожатия между клиентом и хабом. Посылается клиентом на хаб после получения команды $Hello. Клиент также отсылает эту команду время от времени, а также когда какой-либо из параметров этой команды изменится. Любая, как правило изменённая, отсылка этой команды транслируется хабом всем клиентам с характеристикой NoHello.
Invisible, mariner, Saymon21, TiGRpp, Enyby
17.12.2008, 2:32 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$LogedIn

Синтаксис:

Код
$LogedIn [Ник]|


Направление команды:

Хаб ---> Клиент

Описание:

Данная команда отсылается хабом клиенту в ответ на успешную последовательность пройденных команд $GetPass / $MyPass. Эта команда отправляется исключительно ОПераторам. Команда как бы контролирует вход операторов.

Замечание:
Обратите внимание на название команды: $LogedIn, а не $LoggedIn, как казалось бы должно быть.
Invisible
17.12.2008, 2:20 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Lock

Синтаксис:

Код
$Lock [Код] Pk=[ПК]|


Направление команды:

Хаб ---> Клиент
Клиент ---> Клиент
Хаблист ---> Хаб
Хаб ---> Пингер

Описание:

Данная команда используется для того, чтобы убедиться в том, что с сервером соединяется оригинальный клиент DC (NMDC). Сервер (хаб, клиент, хаблист) может и не проверять отправленный клиентом (клиент, хаб, пингер) ключ, однако ключ должен посылаться клиентом в любом случае.

[Код] - это какая-либо последовательность символов (может даже случайная), исключая пробел, $ и |, максимальная и минимальная длина которой неизвестна.
[ПК] - это идентификатор устройства.

Эта команда является частью рукопожатия между клиентом и хабом, между клиентом и клиентом и в регистрации хаб-листа. Из-за того, что используемый алгоритм легко декодируется (см. Lock2Key), практически каждый может создать свой клиент.

Клиент никогда не должен посылать команду $Lock на хаб. Клиенты должны отсылать команду $Lock, когда два клиента соединяются друг с другом.

Пример для DC++:

Код
$Lock EXTENDEDPROTOCOLABCABCABCABCABCABC Pk=DCPLUSPLUS0.242ABCABC|


Секции "ABCABC" являются наполнителями.

Ключевое слово EXTENDEDPROTOCOL в коде команды даёт право клиенту, кроме прочих команд рукопожатия отправить команду $Supports. Те есть это слово говорит о том, что хаб (клиент) поддерживает систему дополнительных расширений или характеристик.
Хаб(клиент) в ответ на команду $Supports также отправляет эту команду другой стороне уже со своим списком поддерживаемых расширений. Если какой-либо из участников не поддерживает дополнительные расширения, отправки команды $Supports не происходит.

Характеристики команды $Lock в протоколе NMDC:
  • длина кода от 46 до 115 символов;
  • длина Pk до 16 символов;
  • символы команды $Lock: случайные, с кодами от 37 до 122.
  • символы команд $Lock и $Key с кодами 0, 5, 36, 96, 124 и 126 должны быть заменены, соответственно, на /%DCN000%/, /%DCN005%/, /%DCN036%/, /%DCN096%/, /%DCN124%/ и /%DCN126%/

Экранируемые коды(символы):
0 (\0), 5(\5), 36($), 96(`), 124(|), 126(~)
Invisible, Enyby
17.12.2008, 1:58 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Kick

Синтаксис:

Код
$Kick [Ник_жертвы]|


Направление команды:

Клиент ---> Хаб

Описание:

Данная команда отсылается на хаб клиентом и заставляет хаб закрыть соединение с жертвой. Жертве отсылается оповещение, в отличии от команды $Close. Только ОПераторы могут отсылать команду $Kick. В простонароде данную команду называют КИК.

Замечание:
На самом дела на хаб клиентом отправляется строка, состоящая из 3 команд:
Код
$To: [Ник_жертвы] From: [Ник_оператора] $<[Ник_оператора]> You are being kicked because: [Причина_кика]|<[Ник_оператора]> is kicking [Ник_жертвы] because: [Причина_кика]|$Kick [Ник_жертвы]|

Однако, первые 2 команды, которые представляют из себя, соответственно, сообщение в личку жертве, и сообщение всем в чат, автоматически приписывает клиентом. А непосредственно за кик отвечает только последняя команда: $Kick [Ник_жертвы]|
Invisible, Saymon21
17.12.2008, 1:49 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Key

Синтаксис:

Код
$Key [Рассчитанный_ключ]|


Направление команды:

Клиент ---> Хаб
Хаб ---> Хаблист
Клиент ---> Клиент
Пингер ---> Хаб

Описание:

Команда $Key отсылается на хаб в ответ на команду $Lock, которая отсылается хабом перед входом на хаб. Когда соединяются клиент с клиентом, или хаб с клиентом, ключ рассчитывается по определённому алгоритму, исходные коды которого доступны и свободно распространяются на разных языках программирования (см. Lock2Key). Команда $Key также используется, когда хаб регистрируется в хаб-листе, однако, в этом случае ключ вычисляется по иному. Такой обмен ключами является своего рода гарантом того, что соединяемые устройства работают на одном протоколе.

Сторона, которой отсылается ключ, может и не проверять правильность этого ключа, однако, отсылающая сторона всегда обязана отсылать рассчитанный ключ.
Invisible, Enyby
17.12.2008, 1:33 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$HubTopic

Синтаксис:

Код
$HubTopic [Топик]|


Направление команды:

Хаб ---> Клиент

Описание:

Команда $HubTopic отсылает клиенту топик хаба, на подобии IRC.

[Топик] - это строка, содержащая топик.

Доступность команды в клиентах:

Данная команда поддерживается почти всеми современными клиентами.

Данная команда поддерживается следующими хабами: Verlihub, RusHub. Хаб PtokaX не поддерживает данную команду, однако команда может отправляться скриптом. На поддержку данной команды может указывать наличие дополнения HubTopic в команде $Supports, однако, это наличие не обязательно.
Invisible, Enyby
17.12.2008, 1:21 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$HubName

Синтаксис:

Код
$HubName [Имя_хаба]|


Направление команды:

Хаб ---> Клиент

Описание:

Данная команда является частью рукопожатия между клиентом и хабом. Команда отправляет клиенту имя хаба.

[Имя_хаба] - это имя, которое использует данный хаб. Имя хаба обычно состоит из самого имени и из топика.

Дополнения:
Эта команда может быть отправлена в любое время, например, когда хаб изменил имя. Данная команда используется только для описания хаба.

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

В Имени хаба в DC++ вместо символов (&, |, $) ожидаются их HTML эквиваленты.
Invisible
17.12.2008, 0:59 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$HubIsFull

Синтаксис:

Код
$HubIsFull|


Направление команды:

Хаб ---> Клиент

Описание:
Команда, посылаемая клиенту хабом для того, чтобы сообщить, что хаб полный, то есть на хабе достигнут предел пользователей.

Связанная с данной команда: $ValidateNick
Invisible
17.12.2008, 0:53 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Hello

Синтаксис:

Код
$Hello [Ник]|


Направление команды:

Хаб ---> Клиент

Описание:

Данная команда является частью рукопожатия между клиентом и хабом. Посылается клиенту для того, чтобы указать ему ник, с которым хаб сопоставляет данный клиент. Хаб как бы даёт согласие на вход пользователя под данным ником. В ответ на эту команду, входящий на хаб клиент, должен отослать команду $Version

Данная команда является командой приветствия пользователя и отправляется хабом не только вошедшему на хаб клиенту, но и всем клиентам, находящимся в данный момент на хабе. Однако, если клиент при входе на хаб в команде $Supports указал характеристику NoHello, то такому клиенту, при входе какого-либо пользователя, хаб не будет отправлять команду $Hello.
Invisible, Saymon21
17.12.2008, 0:41 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$GetPass

Синтаксис:

Код
$GetPass|


Направление команды:

Хаб ---> Клиент

Описание:

Хаб посылает данную команду клиенту для запроса пароля зарегистрированного пользователя.
Команда посылается соединяющемуся с хабом пользователю только если его ник находится в регистрационном листе хаба (ник зарегистрирован на хабе).

Также см. команду $MyPass
Invisible, Saymon21
17.12.2008, 0:29 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$GetNickList

Синтаксис:

Код
$GetNickList|


Направление команды:

Клиент ---> Хаб

Описание:

Эта команда заставляет хаб послать клиенту 2 списка зарегистрированных(вошедших) ников.

Код
$NickList [Ник1]$$[Ник2]$$[Ник3]$$ ... $$|
$OpList [ОПератор1]$$[ОПератор2]$$[ОПератор3]$$ ... $$|


Тут надо отметить, что список $OpList является подмножеством списка $NickList. Если на хабе нет операторов и ботов, то хаб должен послать просто "$OpList $$|".

Однако, только старые версии протокола отправляют данные команды. Новые же версии несколько упрощены и отправляют только команду $OpList, а вместо команды $NickList используется команда $MyINFO.

Замечание:
Клиент не обязан запрашивать у хаба список пользователей, поэтому данная команда по своей сути не является обязательной.
Invisible, Saymon21, Enyby
16.12.2008, 23:32 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$ForceMove

Синтаксис:

Код
$ForceMove [Новый_адрес]


Команда сопровождается отсылкой в личку оповещения о перенаправлении:

Код
$To: [Ник_жертвы] From: [Ник_отправителя] $<[Ник_отправителя]> You are being redirected to [Новый_адрес]: [Причина]|


Команда сопровождается отсылкой в чат оповещения о перенаправлении:

Код
<[Ник_бота]> [Причина]|


Направление команды:

Хаб ---> Клиент

Описание:

Хаб отсылает команду $ForceMove клиенту, чтобы предложить ему переместиться на другой хаб (предлагает клиенту перенаправиться).

[Ник_отправителя] - ник, который отправляет команду $OpForceMove.
[Ник_бота] - ник основного бота на хабе.
[Ник_жертвы] - ник, который должен быть перенаправлен на новый адрес.
[Новый_адрес] - это IP адрес или хост-имя (и опционально, через двоеточие, порт) другого хаба, на который происходит перенаправление.
[Причина] - причина перенаправления.

Комментарии:

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

Примечание:

Обратите внимание, что если команды чата и лички следуют после команды перенаправления, то в случае автоматического следования перенаправлению пользователь не увидит сообщения о перенаправлении в чате и личке, однако, последовательность отсылаемых команд полностью на совести хаба, который может отослать сообщения как после команды перенаправления, так и до.
Invisible, Saymon21
16.12.2008, 20:21 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$ConnectToMe

Синтаксис:

Для клиентов DC++ и NMDC.

Код
$ConnectToMe [Ник_получателя] [IP_отправителя]:[Порт_отправителя]|


Пример:

Код
$ConnectToMe Вася 10.10.10.10:16437|


Для клиентов NMDC v2.205 и DC:PRO v0.2.3.97A:

Код
$ConnectToMe [Ник_отправителя] [Ник_получателя] [IP_отправителя]:[Порт_отправителя]|


Пример:

Код
$ConnectToMe Петя Вася 10.10.10.10:16437|


Направление команды:

Клиент ---> Хаб
Хаб ---> Клиент
Хаб ---> Хаб

Описание:

Эта команда начинает процесс соединения между клиентами. Команда отправляется на хаб клиентом, находящимся в активном режиме соединения с хабом. Хаб пересылает эту команду целевому клиенту без изменения. Получив эту команду, целевой клиент отвечает, соединяясь напрямую с указанным IP через указанный порт.

[Ник_отправителя] - ник клиента в активном режиме, который хочет соединиться с целевым клиентом [Ник_получателя]. Клиент отправителя, после отправки на хаб запроса на соединение, начинает слушать указанный в запросе TCP порт.

Замечание:

Обратите внимание, что в скриптовую функцию старой версии PtokaX данная команда передаётся без символа вертикальной черты '|' на конце.
Invisible, Saymon21, Enyby
16.12.2008, 19:50 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Close

Синтаксис:

Код
$Close [Ник]|


Направление команды:

Клиент ---> Хаб

Описание:

Эта команда заставляет хаб закрыть соединение с клиентом, чей ник написан в аргументе этой команды. Только операторы могут (имеют право) отправлять эту команду хабу. Эта команда в простонародье называется ДРОП.

[Ник] - ник пользователя, который подлежит разъединению с хабом.

В отличии от команды $Kick, команда $Close разъединяет пользователя без уведомления о разъединении. (По крайней мере на хабах NMDC первой версии эта команда работает именно так).
Invisible
16.12.2008, 19:35 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$BotList

Синтаксис:

Код
$BotList [Бот1]$$[Бот2]$$[Бот3]$$ ... $$|


Направление команды:

Хаб ---> Клиент

Описание:

Данная команда используется хабом для передачи клиенту списка ботов. Этот список ограничен и разделён символами "$$". Клиенты BDCH, BlackDC и ZionPlusPlus поддерживают эту команду для того чтобы различать операторов и ботов. Однако данная команда не является распространённой и не поддерживается большинством хабов.

На поддержку данной команды указывает наличие характеристики BotList в команде $Supports.
Invisible, Saymon21
16.12.2008, 19:19 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$BadPass

Синтаксис:

Код
$BadPass|


Направление команды:

Хаб ---> Клиент

Описание:

Эту команду отсылает хаб клиенту, который коннектится. Команда посылается, если клиент отослал хабу неправильный(некорректный) пароль в ответ на посланную хабом команду $GetPass. После отсылки этой команды хаб закрывает соединение с этим клиентом, или даже банит его.
Invisible
16.12.2008, 18:57 Описание Протокола NMDC
NeoModus Direct Connect Protocol
Protocol NMDC

Структурированное описание протокола NeoModus Direct Connect (NMDC), под управлением которого на сегодняшний день работает подавляющее большинство хабов. Хотя уже внедряется новый протокол ADC, однако, как говориться, всему своё время.

По мере написания, на каждую команду будет появляться ссылка на пост, описывающий эту команду.
Делаю тему закрытой, дабы структурировано описать команды.


О структуре команд

Все команды протокола начинаются с символа $. Исключение составляет команда сообщения чата, которая должна иметь следующую структуру:
Код
<Ник> Сообщение|
При этом, данный синтаксис команды чата обязателен в направлении клиент -> хаб, в то время, как хаб может отсылать клиенту любые сообщения, не начинающиеся с символа $, и клиент должен принимать такие сообщения, однако обработка таких сообщение не регламентирована протоколом (клиент может отображать такие сообщения как в чате, так и в статусной строке, или же вовсе игнорировать такие сообщения).

Символы-разделители протокола: $, | и пробел. Протокол не имеет экранирующих символов, поэтому для отсылки символов $ и | в параметрах команд нужно использовать их коды: &#36; и &#124;
Строка сообщения разделяется на команды по средствам символа |. Пример трёх команд, отосланных одной строкой:
Код
$Cmd1 параметр|$Cmd2|$Cmd3 параметр1 параметр2$параметр3|



Взаимодействие хаб-клиент


$BadPass
$Close
$ConnectToMe
$ForceMove
$GetINFO
$GetNickList
$GetPass
$Hello
$HubIsFull
$HubName
$HubTopic
$Key
$Kick
$Lock
$LogedIn
$MyINFO
$MyPass
$MultiConnectToMe
$MultiSearch
$NickList
$OpForceMove
$OpList
$Quit
$RevConnectToMe
$Search
$SR
$Supports
$UserCommand
$UserIP
$Version
$ValidateNick
$ValidateDenide


Взаимодействие клиент-клиент

$Cancel
$Canceled
$Direction
$Error
$Failed
$FileLength
$Get
$GetListLen
$Key
$Lock
$MaxedOut
$MyNick
$Ping
$Send
$To


Взаимодействие хаб-хаб

$FeaturedNetworks
$ConnectToMe
$Search
$SR
$Up
$UpToo




Взаимодействие хаб-хаблист

$Key
$Lock
$Supports


Взаимодействие пингер-хаб

$BotINFO
$HubINFO
$Key
$Lock
$Supports


Команды характеристик

$ADCGET / $ADCSND
$BotList
$Capabilities
$FeaturedNetworks
$GetZBlock
$MCTo
$Sending
$UGetBlock
$UGetZBlock
$Z
$ZOn


Разное

TTH
Lock2Key


Известные характеристики

Хаб-Клиент:
BotList
ClientID
Feed
HubTopic
IN
MCTo
NoGetINFO
NoHello
OpPlus
QuickList
TTHSearch
UserCommand
UserIP2
ZLine
ZPipe0

Клиент-Клиент:
ADCGet
BZList
CHUNK
ClientID
GetCID
GetTestZBlock
GetZBlock
MiniSlots
TTHL
TTHF
XmlBZList
ZLIG



Общая (обязательная) последовательность входа на хаб.
"Рукопожатие" между клиентом и хабом.

Общая (обязательная) последовательность входа на хаб
Хаб:
Код
$Lock [Код] Pk=[PrimaryKey]|

Клиент:
Код
$Key [Рассчитанный_ключ]|$ValidateNick [Ник]|

Хаб:
Код
$HubName [Имя_хаба]|$Hello [Ник]|

Клиент:
Код
$Version [Версия]|$GetNickList|$MyINFO [Строка]|

Хаб:
Код
Отсылает список пользователей.


Примечания:
  1. Команда $HubName может "выпадать" из этой последовательности и отсылаться, например, после команды $Lock, или вовсе отсутствовать.
  2. Если в начале параметра команды $Lock присутствует слово EXTENDEDPROTOCOL, то клиент должен отослать на хаб команду с поддерживаемыми им характеристиками $Supports. В ответ хаб должен отослать такую же команду со своими характеристиками. Однако, данный механизм обмена характеристиками фактически является не обязательным.
  3. Также, вне зависимости от данной последовательности, в любом месте входа хаб может отослать клиенту команду чата: "<[Бот_хаба]> Этот хаб работает под управлением...".
  4. При входе, клиент отошлёт команды $Version, $GetNickList и $MyINFO только после того, как получит от хаба команду $Hello [Ник], причём со своим ником, который он отсылал на хаб в команде $ValidateNick. Причем команда $GetNickList может и вовсе не отсылаться клиентом.
  5. Команду $Version клиент может отослать и раньше указанного шага (например, непосредственно после $ValidateNick), однако она должна быть отослана до команды $MyINFO.
  6. При отсылке хабом списка пользователей, хаб руководствуется поддержкой со стороны клиента той или иной характеристики. Подробности см. в описании характеристик NoHello и NoGetINFO.


Вход на пальцах выглядит так: Клиент коннектится, сервер отвечает командой $Lock, что мол я такой-то сервер, на что клиент отвечает: ок раз ты такой-то сервер - вот тебе ключ ($Key) и проверь мой ник ($ValidateNick), сервер проверяет ник и отправляет клиенту приглашение на вход под этим ником ($Hello), на что клиент отправляет на сервер внутреннюю версию ($Version), запрашивает список пользователей ($GetNickList) и отправляет информацию о себе ($MyINFO), а сервер отсылает ему список пользователей хаба.



Последовательность входа на хаб, который поддерживает характеристику QuickList.
Входа на хаб при поддержке характеристики QuickList (быстрый вход)
Хаб:
Код
$Lock EXTENDEDPROTOCOL[Код] Pk=[PrimaryKey]|

Клиент:
Код
$Supports QuickList|$Key [Рассчитанный_ключ]|

Хаб:
Код
$Supports QuickList|

Клиент:
Код
$MyINFO [Строка]|$GetNickList|

Хаб:
Код
Отсылает список пользователей.


См. подробности в характеристике QuickList



Последовательность действий хаба при регистрации в хаб-листе
Последовательность действий хаба при регистрации в хаб-листе
Хаб коннектится к хаб-листу.

Хаб-лист:
Код
$Lock [Код] Pk=[PrimaryKey]|

Хаб:
Код
$Key [Рассчитанный_ключ]|[Имя_хаба]|[Хост_хаба(:порт)]|[Описание_хаба]|[Число_юзеров]|[Текущая_шара]|


Тут хаб выступает в роли клиента. Он коннектится к прописанным в настройках хаб-листам и передаёт им текущую информацию о себе.
Коннект к хаб листу должен производится не чаще чем раз в 15 минут, в противном случае, хаб может быть забанен хаб-листом)).



Последовательность входа на хаб PtokaX
(последовательные команды могут отсылаться одной строкой, разделённой символом | )
Последовательность входа на хаб PtokaX
Хаб -> Клиент: ---> $Lock EXTENDEDPROTOCOL[некий_ключ_хаба] Pk=PtokaX
Клиент -> Хаб: ---> $Supports UserCommand NoGetINFO NoHello UserIP2 TTHSearch ZPipe0 |$Key [ключ_сгенерированный_по_полученному_ключу_хаба]|$ValidateNick [Мой_ник]|
Выполнение скриптовой функции SupportsArrival
Выполнение скриптовой функции KeyArrival (выполнение не происходит, если проверка ключа отключена)
Выполнение скриптовой функции ValidateNickArrival
Хаб -> Клиент: ---> $Supports NoHello|$GetPass|
Клиент -> Хаб: ---> $MyPass [Мой_пароль]|
Выполнение скриптовой функции PasswordArrival
Хаб -> Клиент: ---> $Hello [Мой_ник]|
Клиент -> Хаб: ---> $Version 1,0091|$GetNickList|$MyINFO $ALL [Мой_ник] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|
Выполнение скриптовой функции VersionArrival
Выполнение скриптовой функции GetNickListArrival
Выполнение скриптовой функции MyINFOArrival
Хаб -> Клиент: ---> $LogedIn [Мой_ник]|$HubName [Имя_хаба] - [Топик]|<[Бот_хаба]> Этот хаб работает под управлением PtokaX DC Hub ...
Хаб -> Клиент: ---> $ZOn
Хаб -> Клиент: ---> $MyINFO $ALL [Бот_хаба] [Описание]$ $ $[EMail]$0$|$MyINFO $ALL [Ник1] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|$MyINFO $ALL [Ник2] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|
...
$MyINFO $ALL [Мой_ник] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|$OpList [Оператор1]$$[Оператор2]$$[Оператор3]$$ ... $$[ОператорN]$$|$UserIP [Ник1] [IP1]$$[Ник2] [IP2]$$ ... $$[НикN] [IPN]$$|
Выполнение скриптовых функций UserConnected, RegConnected и OpConnected


Примечание: Команда $LogedIn отсылается только в случае если у вас есть ключ (операторские права).

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



Последовательность команд при получении списка пользователей (GetNickList) на хабе PtokaX
Последовательность команд при получении списка пользователей (GetNickList) на хабе PtokaX
Клиент -> Хаб: ---> $GetNickList|
Выполнение скриптовой функции GetNickListArrival
Хаб -> Клиент: ---> $MyINFO $ALL [Бот_хаба] [Описание]$ $ $[EMail]$0$
Хаб -> Клиент: ---> $MyINFO $ALL [Ник1] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|
Хаб -> Клиент: ---> $MyINFO $ALL [Ник2] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|
...
Хаб -> Клиент: ---> $MyINFO $ALL [Мой_ник] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|
Хаб -> Клиент: ---> $OpList [Оператор1]$$[Оператор2]$$[Оператор3]$$ ... $$[ОператорN]$$



Последовательность входа на хаб HeX
(последовательные команды могут отсылаться одной строкой, разделённой символом | )
Последовательность входа на хаб HeX
Хаб -> Клиент: ---> $Lock EXTENDEDPROTOCOL[некий_ключ_хаба] Pk=versiunea5.03
Клиент -> Хаб: ---> $Supports UserCommand NoGetINFO NoHello UserIP2 TTHSearch ZPipe0 |$Key [ключ_сгенерированный_по_полученному_ключу_хаба]|$ValidateNick [Мой_ник]|
Хаб -> Клиент: ---> $HubName [Имя_хаба] - [Топик]|$HubTopic [Топик]|<[Бот_хаба]> HeXHub 5.03a Firewall 1.09 Hex Script 1.1.0.2 ...|
Обработка команды $Supports скриптовой функцией OnCommand
Хаб -> Клиент: ---> $Supports UserCommand NoGetINFO NoHello|
Обработка команды $Key скриптовой функцией OnCommand
Обработка команды $ValidateNick скриптовой функцией OnCommand

Хаб -> Клиент: ---> *** Your nickname is already taken by someone else|*** Current nickname: [Мой_ник]_1|*** This nick is also taken...|*** Current nickname: [Мой_ник]_2|<[Бот_хаба]> Your nickname is registered, please enter a password|$GetPass|
Клиент -> Хаб: ---> $MyPass [Мой_пароль]|
Обработка команды $MyPass скриптовой функцией OnCommand
Хаб -> Клиент: ---> $LogedIn [Мой_ник]|$Hello [Мой_ник]|
Клиент -> Хаб: ---> $Version 1,0091|$GetNickList|$MyINFO $ALL [Мой_ник] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|
Хаб -> Клиент: ---> $Hello [Мой_ник]|
Обработка команды $Version скриптовой функцией OnCommand
Обработка команды $GetNickList скриптовой функцией OnCommand
Обработка команды $MyINFO скриптовой функцией OnCommand
Хаб -> Клиент: ---> $MyINFO $ALL [Бот_хаба] [Описание]$ $ $[EMail]$0$|$MyINFO $ALL [Ник1] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|$MyINFO $ALL [Ник2] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|
...
$MyINFO $ALL [Мой_ник]_2 [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|$OpList [Оператор1]$$[Оператор2]$$[Оператор3]$$ ... $$[ОператорN]$$|$UserIP [Ник1] [IP1]$$[Ник2] [IP2]$$ ... $$[НикN] [IPN]$$|
Выполнение скриптовой функции OnUserJoined

Примечание: Данный хаб различает вход и переподключение к хабу! Это достигается с помощью задержки в отправлении команды $Quit.


Материал из этой темы перенесён в вики: http://wiki.mydc.ru/Описание_протокола_NMDC
Nickolya, Invisible, Serx, Maximum, alex82, VNoName, Kingston, Sekretchik, Saymon21, Werwolf, dc4u, Enyby, Markiz, RAND(i)M, Meloun
13.12.2008, 15:01 Объектно-Ориентированное Программирование в Lua
Создание и использование классов
Объектно-Ориентированное Программирование (ООП) в LUA

В данной теме обсуждаются мощнейшие методы ООП big_smile.gif


Итак, потихоньку буду писать основные понятия.

Объект и класс

Прежде всего следует понять что такое объект, и что такое класс

Согласно языку С++, класс - это определяемый пользователем тип, а объект - это экземпляр класса.
Попробуем в lua определить понятие класса.

Каждому классу могут соответствовать несколько объектов. Каждый объект занимает своё место в памяти и манипулирует со своими переменными и функциями. Приведу пример класса и объектов:
Возьмём класс - автомобиль. У этого класса есть некие свои "переменные" и "функции", такие как цвет (функция определения цвета), тип (хэтчбек, универсал, седан) и тд.
Объектом данного класса, например, будет красный седан
Другим объектом будет синий универсал
Третьим объектом будет также синий универсал

Второй и третий объекты не отличаются ничем, однако, они разные объекты, физически разные машины, хоть и выглядят одинаково (они занимают разные адреса в памяти).

Итак, класс - это некая общность объектов.


Конструктор

Функция, которая предназначается для инициализации (создания) объектов называется конструктором. Ввиду того, что такая функция создаёт (конструирует) объект. В С++ имя конструктора совпадает с именем класса, и вызывается при выделении памяти под объект.
В lua бы будем использовать для конструктора имя: __init, а вызываться конструктор будет при создании объекта.

Пример:

Код
class.MyClass {
  __init = function(a, b, c) -- конструктор с параметрами a, б и c
    ... -- описание конструктора
  end
}

MyObject = MyClass(1, 2, 3) -- создание объекта (вызов конструктора)


То есть при создании объекта обязательно сначала вызывается конструктор. В приведённом примере при создании объекта по средствам конструктора в объект передаются некоторые значения: 1, 2, 3. Если конструктор не содержит передаваемых параметров, то такой конструктор называется конструктором по умолчанию.


Деструктор

Деструктор вызывается каждый раз при уничтожении объекта. Это полная противоположность конструктору.


Закрытые переменные (private переменные)

Закрытые переменные - это переменные, которые могут использоваться только членами-классами.
В lua закрытые переменные у нас будут содержать 2 подчёркивания спереди.


Защищённые переменные (protected переменные)

Защищённые переменные - это переменные, которые могут наследоваться
В lua защищённые переменные у нас будут содержать 1 подчёркивание спереди.



продолжение следует...
Saymon21
12.12.2008, 20:12 Luasocket
win32 | Работа с сокетами
вообще говоря вот код из исходников:
Код
#define LUA_PATH_DEFAULT  \
        "!\\?.lua;"  "!\\libs\\?.lua;"  "!\\scripts\\libs\\?.lua"
Отсюда можно видеть, что библиотеки можно класть в папку с PtokaX, либо в libs, либо в scripts/libs
FallenAngel, Invisible, Tarantul13, dj_crazy_joker
3.12.2008, 19:05 Жалоба Юзера
Жалоба Опираторам и админам
[attachment=1106:Report.lua]
Pro009, AfLc
3.12.2008, 17:38 Жалоба Юзера
Жалоба Опираторам и админам
исправил и перезалил))
AfLc
30.11.2008, 12:20 Жалоба Юзера
Жалоба Опираторам и админам
скрипт был написан под апи1 !!!

Под апи2 прикрепляю: [attachment=1107:Report.lua]
Pro009, AfLc
29.11.2008, 1:33 Метод Быстрого Перевода Скриптов Под API_1
Самостоятельный быстрый перевод из API_2 ---> в API_1
v 1.3.0.0 (файл перезалит в первой теме)

Fixed:

* ScriptMan.Restart()
* Core.Restart()
* TmrMan.AddTimer(nTimerInterval, sFunctionName)

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

Пример использования AddTimer:
Код
dofile(frmHub:GetPtokaXLocation().."scripts/old_api.lu")

function Core.OnStartup()
  TmrMan.AddTimer(1999,"Func1") -- округляется в меньшую сторону до 1000 (=1 сек)
  TmrMan.AddTimer(2000,"Func2") -- нечего округлять.  2000 (=2 сек)
end

function Func1()
  Core.SendToAll"Func1 -> 1999 мсек = 1 сек"
end

function Func2()
  Core.SendToAll"Func2 -> 2000 мсек = 2 сек"
end
Invisible
27.11.2008, 19:15 Ваши Вопросы И Предложения По Поводу Форума
Давно уже все просят сделать "спасибы". И флуда меньше будет, а то очень часто наблюдаю посты со словами спасибо.
мамин_парень
24.11.2008, 22:53 Вопрос По Лицензии
самая важная фраза: пользователи всех производных программ получат вышеперечисленные права
Mustik
22.11.2008, 20:40 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Если имя клиента является неизвестным, то тег клиента приклеивается к описанию!!!

Функция коррекции данных пользователя:
Код
function GetNormalValue(tUser)
  if not tUser.sTag then
    local _,_,sDescription,sTag,sClient,sClientVersion,sMode,iNormalHubs,iRegHubs,iOpHubs,iSlots,iLlimit=tUser
.sDescription:find("(.*)(<(.+)%sV:(.-),M:(.-),H:(%d+)/(%d+)/(%d+),S:(%d+)>)$")
    if not sDescription then
    _,_,sDescription,sTag,sClient,sClientVersion,sMode,iNormalHubs,iRegHubs,iOpHubs,iSlots,iLlimit=
tUser.sDescription:find("(.*)(<(.+)%sV:(.-),M:(.-),H:(%d+)/(%d+)/(%d+),S:(%d+),L:(%d+)>)$")
    end
    if not sDescription then
    _,_,sDescription,sTag,sClient,sClientVersion,sMode,iNormalHubs,iRegHubs,iOpHubs,iSlots,iLlimit=
tUser.sDescription:find("(.*)(<(.+)%sV:(.-),M:(.-),H:(%d+)/(%d+)/(%d+),S:(%d+),B:(%d+)>)$")
    end
    tUser.sDescription=sDescription
    tUser.sTag=sTag
    tUser.sClient=sClient
    tUser.sClientVersion=sClientVersion
    tUser.sMode=sMode
    tUser.iNormalHubs=iNormalHubs
    tUser.iRegHubs=iRegHubs
    tUser.iOpHubs=iOpHubs
    tUser.iHubs=iNormalHubs+iRegHubs+iOpHubs
    tUser.iSlots=iSlots
    tUser.iLlimit=iLlimit
  end
  return tUser
end


Использование коррекции:
Код
function MyINFOArrival(tUser)
  tUser=GetNormalValue(tUser)
  tUser:SendData("sName = "..tostring(tUser.sName).."\n"..
  "sClient = "..tostring(tUser.sClient).."\n"..
  "sClientVersion = "..tostring(tUser.sClientVersion).."\n"..
  "sMode = "..tostring(tUser.sMode).."\n"..
  "sMyInfoString = "..tostring(tUser.sMyInfoString:sub(1,-2)).."\n"..
  "iShareSize = "..tostring(tUser.iShareSize).."\n"..
  "iHubs = "..tostring(tUser.iHubs).."\n"..
  "iSlots = "..tostring(tUser.iSlots).."\n"..
  "sTag = "..tostring(tUser.sTag).."\n"..
  "sDescription = "..tostring(tUser.sDescription).."\n"..
  "sConnection = "..tostring(tUser.sConnection).."\n"..
  "sEmail = "..tostring(tUser.sEmail).."\n"..
  "iNormalHubs = "..tostring(tUser.iNormalHubs).."\n"..
  "iRegHubs = "..tostring(tUser.iRegHubs).."\n"..
  "iOpHubs = "..tostring(tUser.iOpHubs))
end
Saymon21
20.11.2008, 20:50 Компиляция Клиентов Dc++
создание собственных модов
Компиляция Клиентов Dc++
Думаю, что многие видели различные версии клиентов DC++.
Однако, все эти клиенты возникли от одного праотца DC++.

Для компиляции своего клиента необходимо следующее:
1). Среда разработки Microsoft Visual Studio 2008.
2). Библиотека WTL [attachment=927:WTL80_sf.7z]3). Исходники клиента DC++ [attachment=926:DCPlusPl..._src_vs9.7z]

1). Microsoft Visual Studio 2008 качаем откуда-нибудь или покупаем feel_good.gif
2). Библиотеку WTL (Windows Template Library) распаковываем в любую папку, и после этого из этой папки копируем содержимое папки include в папку Microsoft Visual Studio/VC/include.
3). В исходниках уже создан проект, поэтому просто открываем файл DCPlusPlus.sln. После открытия компилируем проект, построенный проект после компиляции появится в папке app.

Вот и всё! Строим проект, модифицируем файлы и создаём свои моды клиента exciting.gif
Saymon21, X-Sky, ™Wizard™, мамин_парень
15.11.2008, 19:02 Onenick-oneip
API1, API2 | Запрет входа с одного ip под несколькими никами
Название скрипта: OneNick-OneIP
Версия API: API1, API2 (универсальный)
Версия скрипта: 1.1
Автор: Setuper
Описание: Скрипт, запрещающий заходить с одного IP под несколькими никами.
Invisible, Sekretchik
14.11.2008, 12:35 Скрипт Наград
А конвертер юзать не пробовали? Я думаю, что нормально должно сконвертироваться.
Marc
10.11.2008, 23:20 Скрипты И Совметимость Операционных Систем
Рабочие файлы скриптов в Unix системах
Проблема совместимости некоторых скриптов заключается в путях к файлам и директориям.

Windows вообще говоря использует в путях как прямые (/), так и обратные слеши (\).
Unix'ы в путях используют только прямые слеши (/).

Отсюда возникает проблема совместимости скриптов на Windows и Unix системах.


Предлагаю эту проблему совместимости решать следующим образом:

В путях писать только прямые слеши:
Например, для API 2:
Код
dofile(Core.GetPtokaXPath().."scripts/file.lua")
Для API 1:
Код
dofile(frmHub:GetPtokaXLocation().."scripts/file.lua")

(функции Core.GetPtokaXPath() и frmHub:GetPtokaXLocation() возвращают пути с прямыми слешами)

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

Предлагаю разработчикам учесть этот факт и писать универсальные скрипты, совместимые с обеими системами windows и unix!!!


Самый универсальный, кроссплатформенный и кроссхабный метод определения абсолютных путей:
Код
sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$"
Saymon21, -=ДЕМОН=-, che_guevara
10.11.2008, 20:24 Чат Комнаты
API2 | Возможно создать несколько чат комнат
Не понимаю, что не понятного? Всё очень подробно разобрано. Объясняю всё конкретно для этого скрипта:

1). Копируем в папку scripts файл old_api.lu

2). Открываем скрипт chatrooms.lua и в самом начале скрипта (можно перед комментарием, можно после) дописываем строчку:
Код
dofile(frmHub:GetPtokaXLocation().."scripts/old_api.lu")

3). Вместо OnStartup() пишем Core.OnStartup()
Вместо UserConnected(tUser) пишем Core.UserConnected(tUser)
Вместо RegConnected=UserConnected пишем Core.RegConnected=Core.UserConnected
Вместо OpConnected=UserConnected пишем Core.OpConnected=Core.UserConnected
Вместо ChatArrival(tUser,sData) пишем Core.ChatArrival(tUser,sData)
Вместо ToArrival(tUser,sData) пишем Core.ToArrival(tUser,sData)

Всё! Скрипт переведён! Не понимаю чего тут трудного?
Всё по инструкции big_smile.gif
Invisible
8.11.2008, 21:52 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
я бы немного упростил и оптимизировал)))
Код
function GetNormalTime(s)
    s=tonumber(s) or 0
    local r=""
    if s>=31104000 then r=math.floor(s/31104000).." г. " s=math.fmod(s,31104000) end
    if s>=2592000 then r=r..math.floor(s/2592000).." мес. " s=math.fmod(s,2592000) end
    if s>=86400 then r=r..math.floor(s/86400).." д. " s=math.fmod(s,86400) end
    if s>=3600 then r=r..math.floor(s/3600).." ч. " s=math.fmod(s,3600) end
    if s>=60 then r=r..math.floor(s/60).." мин. " s=math.fmod(s,60) end
    return r..s.." сек."
end


или ещё более оптимизированный вариант (используя стандартные средства lua):
Код
function GetNormalTime(s)
    s=tonumber(s) or 0
    local r,t="",os.date("!*t",s)
    t.year,t.month,t.day=t.year-1970,t.month-1,t.day-1
    if t.year~=0 then r=t.year.." г. " end
    if t.month~=0 then r=r..t.month.." мес. " end
    if t.day~=0 then r=r..t.day.." д. " end
    if t.hour~=0 then r=r..t.hour.." ч. " end
    if t.min~=0 then r=r..t.min.." мин. " end
    if t.sec~=0 then r=r..t.sec.." сек. " end
    return r
end
Saymon21
8.11.2008, 17:40 Антибан Опов
API2
мамин_парень
8.11.2008, 16:07 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Переименовал тему в Вопросы разработчикам скриптов. Так название лучше отражает суть темы
8.11.2008, 13:36 Метод Быстрого Перевода Скриптов Под API_1
Самостоятельный быстрый перевод из API_2 ---> в API_1
Перезалил файл old_api.rar

Исправлена невозможность использовать функцию Core.GetPtokaXPath() при инициализации скрипта.
Invisible
28.10.2008, 13:44 Trans
API1, API2
Лучше бы сделал командой. Например, пользователь отправил в чат какую то фразу не в той раскладке, скрипт её сохранил и пользователю достаточно отправить какую-нибудь команду, например для крактоски, !r и скрипт отправит это сообщение повторно, но уже транслированное в нормальную раскладку.
MIKHAIL
28.10.2008, 13:02 Метод Быстрого Перевода Скриптов Под API_1
Самостоятельный быстрый перевод из API_2 ---> в API_1
Список функций, которые работают только на API2. При переводе по данной методике эти функции на API1 не будут ничего делать (будут возвращать nil)

Код
  Core.Shutdown() --Отключить хаб.
  Core.ResumeAccepts() --Продолжать прослушивать поток(и), если их прослышивание не было преостановлено.
  Core.GetBots() --Возбращает таблицу со всеми ботами, зарегистрированными скриптами, как таблицу с полями sNick, sMyINFO, bIsOP and sScriptName.
  Core.GetUserAllData(tUser) --Добавляет или обновляет все данные в таблице пользователя. Возвращает nil в случае неудачи (пользователь оффлайн) или true в случае успеха.
  Core.GetUserData(tUser, nValueId) --Добавляет или обновляет данные с указанным идентификатором в таблице пользователя. Возвращает nil в случае неудачи (пользователь оффлайн) или true в случае успеха.
  Core.DefloodWarn(tUser) --Предупреждение пользователю по причине флуда. Возвращает nil в случае неудачи, true - в случае успеха.
  SetMan.Save() --Принудительно сохраняет настройки.
  RegMan.Save() --Принудительно сохраняет зарегистрированных пользователей.
  BanMan.Save() --Принудительно cохраняет баны.
  BanMan.GetRangeBan(sIPFrom, sIPTo) --Возвращает таблицу забаненных рангов для данного ранга или nil в случае отсутствия таковой.
  BanMan.GetRangePermBan(sIPFrom, sIPTo) --Возвращает таблицу постоянно забаненных рангов для данного ранга или nil в случае отсутствия таковой.
  BanMan.GetRangeTempBan(sIPFrom, sIPTo) --Возвращает таблицу временно забаненных рангов для данного ранга или nil в случае отсутствия таковой.
  ProfMan.MoveDown(nProfileNumber) --Сдвиг профиля вниз. Возвращает nil в случае неудачи, true - в случае успеха.
  ProfMan.MoveUp(nProfileNumber) --Сдвиг профиля вверх. Возвращает nil в случае неудачи, true - в случае успеха.
  ProfMan.SetProfileName(nProfileNumber, sProfileName) --Изменяет имя профиля, возвращает true в случае удачи или nil, если указанного профиля не существует.
  ProfMan.SetProfilePermission(nProfileNumber, nPermissionId, bBoolean) --Изменяет профильную настройку с указанным идентификатором.
  UDPDbg.Reg(sIp, nPort, bAllData) --Регистрирует получателя данных от PtokaX через UDP, если параметр bAllData равен false, то получать данные только от этого скрипта. Возвращает nil в случае неудачи или true в случае успеха.
  UDPDbg.Unreg() --Удалить получателя данных.
  UDPDbg.Send(sData) --Отправить данные через UDP. Если скрипт зарегистрирован, то только от зарегистрированного скрипта, иначе от всех скриптов. Возвращает nil в случае неудачи или true в случае успеха.
  ScriptMan.GetScript() --Возвращает таблицу этого скрипта с полями sName, bEnabled, iMemUsage.
  ScriptMan.GetScripts() --Возвращает таблицу всех скриптов с полями sName, bEnabled, iMemUsage.
  ScriptMan.MoveUp(sScriptName) --Сдвинуть указанный скрипт выше. Возвращает nil в случае неудачи или true в случае успеха.
  ScriptMan.MoveDown(sScriptName) --Сдвинуть указанный скрипт ниже. Возвращает nil в случае неудачи или true в случае успеха.
  ScriptMan.StartScript(sScriptName) --Запустить скрипт с указанным именем. Возвращает nil в случае неудачи или true в случае успеха.
  ScriptMan.RestartScript(sScriptName) --Перезапустить указанный скрипт. Возвращает nil в случае неудачи или true в случае успеха.
  ScriptMan.StopScript(sScriptName) --Остановить указанный скрипт. Возвращает nil в случае неудачи или true в случае успеха.
  ScriptMan.Refresh() --Обновить скрипт-лист.
  IP2Country.GetCountryCode(sIP) --Возвращает код страны для указанного ip или nil, если ip не действителен.
  IP2Country.GetCountryName(sIP) --Возвращает имя страны для указанного ip или nil, если ip не действителен.
  IP2Country.GetCountryName(tUser) --Возвращает имя страны для указанного пользователя.


По своей сути почти все эти функции связаны с управлением хабом, поэтому можно сказать, что почти нигде эти функции не используются!!!
Invisible, Saymon21
22.10.2008, 21:34 Open Dc Hub
Unix/Linux
Проект закрыт, а программа то существует. Может кого заинтересует, разные люди бывают))))
мамин_парень
17.10.2008, 12:38 Чат Комнаты
API2 | Возможно создать несколько чат комнат
Название: Чат комнаты
Версия: 1.0
Версия API: 2
Код: открытый
Автор: Setuper
Описание: возможно создать несколько чат комнат. Чат комнаты могут быть "закрытыми", то есть для получения сообщений нужно войти, а могут быть открытыми, то есть сообщения отсылаются всем доступным профилям (как в ОпЧате, вы не входите постоянно в ОпЧат, если вы Оператор, то он вам доступен). При запуске скрипта создаётся файл ChatRoom.dbs, в котором по умолчанию создаются 3 комнаты: комната для операторов, комната для випов и общая закрытая комната. В файле ChatRoom.dbs множество настроек. Опишу их на общей комнате:
Код
["-MembersRoom-"] = { -- название комнаты
    ["sMsgExit"] = "*** Вы покинули комнату.",  -- сообщение, отправляемое пользователю после выхода из комнаты
    ["tAllow"] = { -- профили, которым доступна комната
        [0] = 1,
        [2] = 1,
        [3] = 1,
        [1] = 1,
        [-1] = 0,
    },
    ["sDescription"] = "[БОТ] Чат комната для пользователей", -- описание бота
    ["sAway"] = false, -- режим бота: true - away, false - не away
    ["sEmail"] = "setuper@gmail.com", -- email бота
    ["sClientName"] = "DCBOT", -- название клиента бота
    ["bKey"] = true, -- имеет ли ключик бот: true - имеет, false - не имеет
    ["sTagOption"] = "M:A,H:0/0/1,S:0", -- тэг бота (не трогать, если не знаешь что это)
    ["sMsgEnter"] = "*** Добро пожаловать в чат комнату!", -- сообщение пользователю при входе в чат комнату
    ["bMembers"] = true, -- надо ли входить(выходить) в чат комнату: true - надо, false - не надо
    ["iShareSize"] = 0, -- шара бота чат комнаты
    ["tMembers"] = { -- таблица членов чат комнаты (не изменять)
    },
    ["tVisible"] = { -- профили, которым видна чат комната в списке пользователей
        [0] = 1,
        [2] = 1,
        [3] = 1,
        [1] = 1,
        [-1] = 1,
    },
    ["bReturn"] = true, -- возвращаемое значение чат комнатой
},
добавлю, что если скрипт чат комнаты в списке скриптов стоит до скрипта антирекламы и параметр bReturn=true, то сообщения чат комнаты не будут отслеживаться антирекламой, в противном случае будут.
После первого запуска скрипта в файле настроек по умолчанию создаётся 3 комнаты. Вы можете менять количество комнат по смоему усмотрению.

Конечно возможности программирования на lua не ограничены. Данный код я вырвал из SBot'a и немного преобразовал, но большая часть возможностей чат комнат осталась в SBot'е (чат комната непосредственно в чате, а не в личке, чёрные и белые списки для любого пользователя, установка паролей на чат комнаты, антифлуд, антимат, антикапс, антиреклама в чат комнатах и тд. и тп.). Нету времени.

Для самостоятельного перевода скрипта под версию API 1 следует воспользоваться инструкцией: ИНСТРУКЦИЯ

Юзаем! big_smile.gif
Nickolya, Invisible, strateg, TiGRpp, dimajak, zeusby
16.10.2008, 16:40 Метод Быстрого Перевода Скриптов Под API_1
Самостоятельный быстрый перевод из API_2 ---> в API_1
Метод быстрого перевода скриптов под API_1 (PtokaX 0.3.6.0 и ниже).

Ограничения на язык: Lua 5.1



Скрипт, подключая который на API_1, будут работать скрипты, написанные под API_2 !!!

Для этого следует всего-то проделать следующие 3 шага:

1). Помещаем в папку scripts файл из архива: [attachment=3987:old_api.rar]

2). Открываем скрипт, написанный под API_2, и дописываем в начало скрипта код:
Код
if frmHub then dofile(frmHub:GetPtokaXLocation().."scripts/old_api.lu")
elseif not Core then error("Запуск скрипта возможен только при запущенном хабе!",1)
else dofile(Core.GetPtokaXPath().."scripts/old_api.lu") end
(код изменён для использования под обе версии API)

3). В именах основных функций PtokaX (OnStartup, OnExit, UserConnected, RegConnected, OpConnected и тд.) дописываем Core. спереди.

Примеры реализации пункта 3:

Было:
Код
function OnStartup() ... end
дописав Core., получается:
Код
function Core.OnStartup() ... end



Или так: было:
Код
OnStartup=function() ... end
дописав Core., получается:
Код
Core.OnStartup=function() ... end



Или даже так: было:
Код
ToArrival=ChatArrival
дописав Core., получается:
Код
Core.ToArrival=Core.ChatArrival



Или даже так: было:
Код
OpConnected,RegConnected=UserConnected,UserConnected
дописав Core., получается:
Код
Core.OpConnected,Core.RegConnected=Core.UserConnected,Core.UserConnected




Полный список всех функций в алфавитном порядке, впереди которых надо дописывать Core. :
  • BotINFOArrival
  • ChatArrival
  • CloseArrival
  • ConnectToMeArrival
  • GetINFOArrival
  • GetNickListArrival
  • KeyArrival
  • KickArrival
  • MultiConnectToMeArrival
  • MultiSearchArrival
  • MyINFOArrival
  • OnExit
  • OnError
  • OnStartup
  • OnTimer
  • OpConnected
  • OpDisconnected
  • OpForceMoveArrival
  • PasswordArrival
  • RegConnected
  • RegDisconnected
  • RevConnectToMeArrival
  • SearchArrival
  • SRArrival
  • SupportsArrival
  • ToArrival
  • UDPSRArrival
  • UnknownArrival
  • UserConnected
  • UserDisconnected
  • ValidateNickArrival
  • VersionArrival



В общем, находим в скрипте все вышеприведённые слова (если они есть в скрипте) и перед всеми найденными словами дописываем Core.


Всё! Почти любой скрипт, написанный под API_2 будет у вас работать на API_1 (исключения составляют вещи, которые есть только в API_2 - после перевода по данной методике эти вещи будут просто игнорироваться скриптом (или возвращать nil) - это связанно с расширенной функциональностью API_2, по сравнению с API_1)!!!

Обращаю внимание, что переведя по данной методике, скрипт будет работать вне зависимости от версии API, ОДНАКО таким макаром можно переводить только скрипты, написанные под API2 !!!

Таким образом можно за пару минут самому перевести скрипт на API_1, даже больших размеров (что в некоторых случаях заняло бы для перевода несколько дней). А когда вы всё же будете готовы перейти на новые версии PtokaX, обратные изменения также не займут много времени!
Nickolya, FallenAngel, Invisible, Saymon21, X-Sky, TiGRpp, MasssteR, Litе, Олешка
13.10.2008, 20:04 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Называется венгерская нотация)))))
Код
s - string
i - integer
n - number
l - long
b - boolean
p - pointer
h - handle
C - class
T - type
t - table
mt - metatable


В lua можно использовать следующие:
Код
s - string
i - integer
b - boolean
h - handle
t - table
mt - metatable


(iShareSize, bConnected, hFile, tTable, mtTable)

http://mydc.ru/ipb.html?s=&showtopic=3...post&p=2068
26.9.2008, 18:42 Функции ===> Читаем, Дабы Не Задавать Вопросов <===
Скрипт-интерфейс PtokaX Lua. ВСЕ СКРИПТОВЫЕ ФУНКЦИИ PtokaX API
Продолжение разбора интерфейса PtokaX.

Функции API 2 и их аналоги в API 1:

Core.Version - Получить версию PtokaX.
Аналог API 1: второе значение функции getHubVresion()

Core.Restart() - Перезапустить хаб.
Аналог API 1: frmHub:Restart()

Core.Shutdown() - Отключить хаб.
Аналог API 1: нету

Core.ResumeAccepts() - Продолжать прослушивать сокет(ы), если их прослушивание не было приостановлено.
Аналог API 1: нету

Core.SuspendAccepts() - Приостановить прослушивание сокета(ов). Хаб выглядит так, как будто не работает.
Аналог API 1: SuspendAccepts(0)

Core.SuspendAccepts(nTime) - Приостановить прослушивание сокета(ов) на указанное время в секундах. Хаб выглядит так, как будто не работает.
Аналог API 1: SuspendAccepts(nTime)

Core.RegBot(sBotName, sDescription, sEmail, bHaveKey) - Регистрирует бота на хабе. Максимальная длина строковых параметров - 64 символа !!! В нике недопустимы символы: $|<>:?*"/\ и пробел. В параметрах Description и Email недопустимы символы $ и |. Функция возвращает nil в случае невозможности зарегистрировать бота, в случае удачной регистрации возвращает true.
Аналог API 1: frmHub:RegBot(sBotName, bHaveKey, sDescription, sEmail)

Core.UnregBot(sBotName) - Удаление бота. Функция возвращает nil в случае невозможности разрегистрировать бота, в случае удачной разрегистрации возвращает true.
Аналог API 1: frmHub:UnregBot(sBotName)

Core.GetBots() - Возвращает таблицу со всеми ботами, зарегистрированными скриптами, как таблицу с полями sNick, sMyINFO, bIsOP and sScriptName.
Аналог API 1: нету

Core.GetActualUsersPeak() - Возвращает фактический пик пользователей.
Аналог API 1: frmHub:GetActualUsersPeak()

Core.GetMaxUsersPeak() - Возвращает максимальный пик пользователей.
Аналог API 1: frmHub:GetMaxUsersPeak()

Core.GetCurrentSharedSize() - Возвращает суммарную шару хаба в байтах.
Аналог API 1: frmHub:GetCurrentShareAmount()

Core.GetHubIP() - Возвращает IP хаба, если он доступен, иначе возвращает nil.
Аналог API 1: frmHub:GetHubIp()

Core.GetHubSecAlias() - Возвращает фактический псевдоним Hub-Security бота.
Аналог API 1: frmHub:GetHubSecAliasName()

Core.GetPtokaXPath() - Возвращает путь до файла PtokaX.exe.
Аналог API 1: frmHub:GetPtokaXLocation()

Core.GetUsersCount() - Возвращает число пользователей на хабе.
Аналог API 1: frmHub:GetUsersCount()

Core.GetUpTime() - Возвращает время работы хаба в секундах.
Аналог API 1: frmHub:GetUpTime()

Core.GetOnlineNonOps() - Возвращает таблицу со всеми таблицами онлайн пользователей без статуса оператора.
Аналог API 1: frmHub:GetOnlineNonOperators()

Core.GetOnlineNonOps(bAllData) - Возвращает таблицу со всеми таблицами онлайн пользователей без статуса оператора. Используйте true для параметра bAllData, если вы хотите, чтобы таблицы содержали все данные.
Аналог API 1: frmHub:GetOnlineNonOperators()

Core.GetOnlineOps() - Возвращает таблицу со всеми таблицами онлайн пользователей со статусом оператора.
Аналог API 1: frmHub:GetOnlineOperators()

Core.GetOnlineOps(bAllData) - Возвращает таблицу со всеми таблицами онлайн пользователей со статусом оператора. Используйте true для параметра bAllData, если вы хотите, чтобы таблицы содержали все данные.
Аналог API 1: frmHub:GetOnlineOperators()

Core.GetOnlineRegs() - Возвращает таблицу со всеми таблицами зарегистрированных (profile > -1) онлайн пользователей.
Аналог API 1: frmHub:GetOnlineRegUsers()

Core.GetOnlineRegs(bAllData) - Возвращает таблицу со всеми таблицами зарегистрированных (profile > -1) онлайн пользователей. Используйте true для параметра bAllData, если вы хотите, чтобы таблицы содержали все данные.
Аналог API 1: frmHub:GetOnlineRegUsers()

Core.GetOnlineUsers() - Возвращает таблицу со всеми таблицами онлайн пользователей.
Аналог API 1: frmHub:GetOnlineUsers()

Core.GetOnlineUsers(bAllData) - Возвращает таблицу со всеми таблицами онлайн пользователей. Используйте true для параметра bAllData, если вы хотите, чтобы таблицы содержали все данные.
Аналог API 1: frmHub:GetOnlineUsers()

Core.GetOnlineUsers(nProfileNumber) - Возвращает таблицу пользователей с указанным профилем.
Аналог API 1: frmHub:GetOnlineUsers(nProfileNumber)

Core.GetOnlineUsers(nProfileNumber, bAllData) - Возвращает таблицу пользователей с указанным профилем. Используйте true для параметра bAllData, если вы хотите, чтобы таблицы содержали все данные.
Аналог API 1: frmHub:GetOnlineUsers(nProfileNumber)

Core.GetUser(sNick) - Возвращает таблицу онлайн пользователя по нику.
Аналог API 1: GetItemByName(sNick)

Core.GetUser(sNick, bAllData) - Возвращает таблицу онлайн пользователя по нику. Используйте true для параметра bAllData, если вы хотите, чтобы таблицы содержали все данные.
Аналог API 1: GetItemByName(sNick)

Core.GetUserAllData(tUser) - Добавляет или обновляет все данные в таблице пользователя. Возвращает nil в случае неудачи (пользователь оффлайн) или true в случае успеха.
Аналог API 1: нету

Core.GetUserData(tUser, nValueId) - Добавляет или обновляет данные с указанным идентификатором в таблице пользователя. Возвращает nil в случае неудачи (пользователь оффлайн) или true в случае успеха.
Аналог API 1: нету

Core.GetUserValue(tUser, nValueId) - Возвращает данные с указанным идентификатором или nil в случае неудачи (пользователь оффлайн).
Аналог API 1: нету

Core.GetUsers(sIP) - Возвращает онлайн пользователей с указанным ip как таблицу с таблицами пользователей или nil в случае, если пользователь с указанным ip не найден или ip введен неверно.
Аналог API 1: нету

Core.GetUsers(sIP, bAllData) - Возвращает онлайн пользователей с указанным ip как таблицу с таблицами пользователей или nil в случае, если пользователь с указанным ip не найден или ip введен неверно. Используйте true для параметра bAllData, если вы хотите, чтобы таблицы содержали все данные.
Аналог API 1: нету

Core.Disconnect(sNick) - Разъединяет пользователя с указанным ником. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: DisconnectByName(sNick)

Core.Disconnect(tUser) - Разъединяет указанного пользователя. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: tUser:Disconnect()

Core.Kick(tUser, sKickerNick, sReason) - Кикает пользователя. Максимальная длина параметра KickerNick - 64 символа, максимальная длина парамерта Reason - 128000 символов. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: tUser:Kick(sKickerNick, sReason)

Core.Redirect(tUser, sAddress, sReason) - Перенаправляет пользователя на указанный адрес с указанной причиной. Максимальная длина параметра Address - 1024 символа. Максимальная длина параметра Reason - 128000 символов. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: tUser:Redirect(sAddress, sReason)

Core.DefloodWarn(tUser) - Предупреждение пользователю по причини флуда. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: нету

Core.SendToAll(sData) - Послать данные всем пользователям. Максимальная длина параметра sData - 128000 символов. Если данные не содержат в конце символа |, то он автоматически добавляется.
Аналог API 1: SendToAll(sData)

Core.SendToNick(sNick, sData) - Послать данные пользователю с указанным ником. Максимальная длина параметра sData - 128000 символов. Если данные не содержат в конце символа |, то он автоматически добавляется.
Аналог API 1: SendToNick(sNick, sData)

Core.SendToOpChat(sData) - Послать данные, как приват сообщение, в ОпЧат. Максимальная длина параметра sData - 128000 символов. Если ОпЧат не разрещен - не посылает ничего.
Аналог API 1: SendToOpChat(sData)

Core.SendToOps(sData) - Послать данные всем операторам. Максимальная длина параметра sData - 128000 символов. Если данные не содержат в конце символа |, то он автоматически добавляется.
Аналог API 1: SendToOps(sData)

Core.SendToProfile(nProfileNumber, sData) - Послать данные пользователям с указанным профилем. Максимальная длина параметра sData - 128000 символов. Если данные не содержат в конце символа |, то он автоматически добавляется.
Аналог API 1: нету

Core.SendToUser(tUser, sData) - Послать данные указанному пользователю. Максимальная длина параметра sData - 128000 символов. Если данные не содержат в конце символа |, то он автоматически добавляется.
Аналог API 1: tUser:SendData(sData)

Core.SendPmToAll(sFromNick, sData) - Послать данные как приват сообщение всем пользователям. Максимальная длина параметра FromNick - 64 символа, максимальная длина параметра Data - 128000 символов.
Аналог API 1: SendPmToAll(sFromNick, sData)

Core.SendPmToNick(sToNick, sFromNick, sData) - Послать данные как приват сообщение пользователю с указанным ником. Максимальная длина параметра FromNick - 64 символа, максимальная длина параметра Data - 128000 символов.
Аналог API 1: SendPmToNick(sToNick, sFromNick, sData)

Core.SendPmToOps(sFromNick, sData) - Послать данные как приват сообщение всем операторам. Максимальная длина параметра FromNick - 64 символа, максимальная длина параметра Data - 128000 символов.
Аналог API 1: SendPmToOps(sFromNick, sData)

Core.SendPmToProfile(nProfileNumber, sFromNick, sData) - Послать данные как приват сообщение пользователям с указанным профилем. Максимальная длина параметра FromNick - 64 символа, максимальная длина параметра Data - 128000 символов.
Аналог API 1: нету

Core.SendPmToUser(tUser, sFromNick, sData) - Послать приват сообщение указанному пользователю. Максимальная длина параметра FromNick - 64 символа, максимальная длина параметра Data - 128000 символов.
Аналог API 1: tUser:SendPM(sFromNick, sData)



-------------------
SetMan.Save() - Принудительно сохраняет настройки.
Аналог API 1: нету

SetMan.GetMOTD() - Возвращает сообщение дня MOTD.
Аналог API 1: frmHub:GetMOTD()

SetMan.SetMOTD(sString) - Устанавливает сообщение дня MOTD. Символ | не допустим в сообщении.
Аналог API 1: frmHub:SetMOTD()

SetMan.GetBool(nBoolId) - Возвращает Булево знаечение парамерта настроек true или nil с указанным идентификатором.
Аналог API 1: нету

SetMan.SetBool(nBoolId, bBoolean) - Устанавливает Булево значение параметру настроек с указанным идентификатором.
Аналог API 1: нету

SetMan.GetNumber(nNumberId) - Возвращает числовое значение параметра с указанным идентификатором.
Аналог API 1: нету

SetMan.SetNumber(nNumberId, nNumber) - Устанавливает числовое значение параметру с указанным идентификатором.
Аналог API 1: нету

SetMan.GetString(nStringId) - Возвращает строковое значение параметра с указанным идентификатором. Возвращает строку или nil.
Аналог API 1: нету

SetMan.SetString(nStringId, sString) - Устанавливает строковое значение параметру с указанным идентификатором.
Аналог API 1: нету

SetMan.GetMinShare() - Возвращает минимальную шару в байтах.
Аналог API 1: frmHub:GetMinShare()

SetMan.SetMinShare(nShareInBytes) - Устанавливает минимальную шару в байтах.
Аналог API 1: frmHub:SetMinShare(nShareInBytes)

SetMan.SetMinShare(nMinShare, nShareUnits) - Устанавливает минимальную шару. Максимальное значение параметра nMinShare - 9999. Параметр nShareUnits может принимать следующие значения: 0 = Б, 1 = КБ, 2 = МБ, 3 = ГБ, 4 = ТБ.
Аналог API 1: frmHub:SetMinShare(nShareInBytes, nShareUnits)

SetMan.GetMaxShare() - Возвращает максимальную шару в байтах.
Аналог API 1: frmHub:GetMaxShare()

SetMan.SetMaxShare(nShareInBytes) - Устанавливает максимальную шару в байтах.
Аналог API 1: frmHub:SetMaxShare(nShareInBytes)

SetMan.SetMaxShare(nMaxShare, nShareUnits) - Устанавливает максимальную шару. Максимальное значение параметра nMinShare - 9999. Параметр nShareUnits может принимать следующие значения: 0 = Б, 1 = КБ, 2 = МБ, 3 = ГБ, 4 = ТБ.
Аналог API 1: frmHub:SetMaxShare(nShareInBytes, nShareUnits)

SetMan.SetHubSlotRatio(nHubs, nSlots) - Устанавливает соотношение хабы/слоты.
Аналог API 1: frmHub:SetHubSlotRatio(nHubs, nSlots)

SetMan.GetOpChat() - Возвращает таблицу ОпЧата с полями: sNick, sDescription, sEmail, bEnabled.
Аналог API 1: нету

SetMan.SetOpChat(bEnabled, sNewOpChatName, sNewDescription, sNewEmail) - Устанавливает параметры ОпЧата. Максимальная длина строковых параметров - 64 символа !!! В нике недопустимы символы: $|<>:?*"/\ и пробел. В параметрах Description и Email недопустимы символы $ и |. Возвращает nil в случае неудачи, иначе возвращает true.
Аналог API 1: frmHub:SetOpChatData(sNewOpChatName, sNewDescription, sNewEmail)

SetMan.GetHubBot() - Возвращает таблицу параметров главного бота с полями: sNick, sDescription, sEmail, bEnabled, bUsedAsHubSecAlias.
Аналог API 1: нету

SetMan.SetHubBot(bEnabled, sNewHubBotName, sNewDescription, sNewEmail, bUseAsHubSecAlias) - Устанавливает параметры главного бота. Максимальная длина строковых параметров - 64 символа !!! В нике недопустимы символы: $|<>:?*"/\ и пробел. В параметрах Description и Email недопустимы символы $ и |. Возвращает nil в случае неудачи, иначе возвращает true.
Аналог API 1: frmHub:SetHubBotData(sNewHubBotName, sNewDescription, sNewEmail)


-------------------
RegMan.Save() - Принудительно сохраняет зарегистрированных пользователей.
Аналог API 1: нету

RegMan.GetRegsByProfile(nProfileNumber) - Возвращает таблицу со всеми зарегистрированными пользователями с указанным профилем как таблицы RegisteredUser.
Аналог API 1: нету

RegMan.GetNonOps() - Возвращает таблицу со всеми зарегистрированными пользователями, которые не имеют статуса оператора как таблицы RegisteredUser.
Аналог API 1: frmHub:GetNonOperators()

RegMan.GetOps() - Возвращает таблицу со всеми зарегистрированными пользователями, которые имеют статус оператора как таблицы RegisteredUser.
Аналог API 1: frmHub:GetOperators()

RegMan.GetReg(sNick) - Возвращает таблицу пользователя как таблицу RegisteredUser или nil, если пользователь с указанным ником не зарегистрирован.
Аналог API 1: нету

RegMan.GetRegs() - Возвращает таблицу со всеми зарегистрированными пользователями, как таблицы RegisteredUser.
Аналог API 1: frmHub:GetRegisteredUsers()

RegMan.AddReg(sNick, sPass, nProfileNumber) - Регистрирует пользователя с указанным ником, паролем и профилем. Символы $|<>:?*"/\ и пробел не допустимы в нике. Символ | не допустим в пароле. Миксимальная длина ника/пароля - 64 символа. Возвращает nil в случае неудачи, true в случае успеха.
Аналог API 1: frmHub:AddRegUser(sNick, sPass, nProfileNumber)

RegMan.DelReg(sNick) - Удаляет регистрацию указанного пользователя. Возвращает nil в случае неудачи, true в случае
успеха.
Аналог API 1: frmHub:DelRegUser(sNick)

RegMan.ChangeReg(sNick, sPass, nProfileNumber) - Изменяет регистрацию указанного пользователя. Возвращает nil в случае неудачи, true в случае успеха.
Аналог API 1: frmHub:ChangeRegUser(sNick, sPass, nProfileNumber)

RegMan.ClrRegBadPass(sNick) - Очищает количество неудачных вводов пароля для указанного ника. Возвращает nil в случае неудачи, true в случае успеха.
Аналог API 1: ClrRegBadPass(sNick)


-------------------
BanMan.Save() - Принудительно cохраняет баны.
Аналог API 1: нету

BanMan.GetBans() - Возвращает таблицу банов.
Аналог API 1: нету

BanMan.GetTempBans() - Возвращает таблицу временных банов.
Аналог API 1: frmHub:GetTempBanList()

BanMan.GetPermBans() - Возвращает таблицу постоянных банов.
Аналог API 1: frmHub:GetPermBanList()

BanMan.GetBan(sNick/sIP) - Возвращает таблицу бана для указанного ника/ip или nil если таковой таблицы нет.
Аналог API 1: нету

BanMan.GetPermBan(sNick/sIP) - Возвращает таблицу постоянного бана для указанного ника/ip или nil если таковой таблицы нет.
Аналог API 1: нету

BanMan.GetTempBan(sNick/sIP) - Возвращает таблицу временного бана для указанного ника/ip или nil если таковой таблицы нет.
Аналог API 1: нету

BanMan.GetRangeBans() - Возвращает таблицу забаненных рангов.
Аналог API 1: нету

BanMan.GetTempRangeBans() - Возвращает таблицу временно забаненных рангов.
Аналог API 1: frmHub:GetTempRangeBans()

BanMan.GetPermRangeBans() - Возвращает таблицу постоянно забаненных рангов.
Аналог API 1: frmHub:GetPermRangeBans()

BanMan.GetRangeBan(sIPFrom, sIPTo) - Возвращает таблицу забаненных рангов для данного ранга или nil в случае отсутствия таковой.
Аналог API 1: нету

BanMan.GetRangePermBan(sIPFrom, sIPTo) - Возвращает таблицу постоянно забаненных рангов для данного ранга или nil в случае отсутствия таковой.
Аналог API 1: нету

BanMan.GetRangeTempBan(sIPFrom, sIPTo) - Возвращает таблицу временно забаненных рангов для данного ранга или nil в случае отсутствия таковой.
Аналог API 1: нету

BanMan.Unban(sNick/sIP) - Снятие бана с указанного ника или ip. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: нету

BanMan.UnbanPerm(sNick/sIP) - Снятие постоянного бана с указанного ника или ip. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: UnBan(sNick/sIP)

BanMan.UnbanTemp(sNick/sIP) - Снятие временного бана с указанного ника или ip. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: TempUnBan(sNick/sIP)

BanMan.UnbanAll(sIP) - Снятие всех банов с указанного ip.
Аналог API 1: нету

BanMan.UnbanPermAll(sIP) - Снятие всех поятоянных банов с указанного ip.
Аналог API 1: нету

BanMan.UnbanTempAll(sIP) - Снятие всех временных банов с указанного ip.
Аналог API 1: нету

BanMan.RangeUnban(sIPFrom, sIPTo) - Снятие бана с указанного ранга. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: RangeUnban(sIPFrom, sIPTo)

BanMan.RangeUnbanPerm(sIPFrom, sIPTo) - Снятие постоянного бана с указанного ранга. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: RangePermUnban(sIPFrom, sIPTo)

BanMan.RangeUnbanTemp(sIPFrom, sIPTo) - Снятие временного бана с указанного ранга. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: RangeTempUnban(sIPFrom, sIPTo)

BanMan.ClearBans() - Очистка таблицы банов.
Аналог API 1: нету

BanMan.ClearPermBans() - Очистка таблицы постоянных банов.
Аналог API 1: ClearPermBans()

BanMan.ClearTempBans() - Очистка таблицы временных банов.
Аналог API 1: ClearTempBans()

BanMan.ClearRangeBans() - Очистка таблицы бан-рангов.
Аналог API 1: ClearRangeBans()

BanMan.ClearRangePermBans() - Очистка таблицы постоянных бан-рангов.
Аналог API 1: ClearRangePermBans()

BanMan.ClearRangeTempBans() - Очистка таблицы временных бан-рангов.
Аналог API 1: ClearRangeTempBans()

BanMan.Ban(tUser, sReason, sBy, bFull) - Дать постоянный бан пользователю. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: tUser:Ban(sReason, sBy, bFull)

BanMan.BanIP(sIP, sReason, sBy, bFull) - Дать постоянный бан пользователям с указанным ip. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: Ban(sIP, sReason, sBy, bFull)

BanMan.BanNick(sNick, sReason, sBy) - Дать постоянный бан пользователю с указанным ником. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: NickBan(sNick, sReason, sBy)

BanMan.TempBan(tUser, nTime, sReason, sBy, bFull) - Дать временный бан пользователю. Параметр nTime - время в минутах (0 = время бана берётся из настроек). Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: tUser:TempBan(nTime, sReason, sBy, bFull)

BanMan.TempBanIP(sIP, nTime, sReason, sBy, bFull) - Дать временный бан пользователям с указанным ip. Параметр nTime - время в минутах (0 = время бана берётся из настроек). Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: TempBan(sIP, nTime, sReason, sBy, bFull)

BanMan.TempBanNick(sNick, nTime, sReason, sBy) - Дать временный бан пользователю с указанным ником. Параметр nTime - время в минутах (0 = время бана берётся из настроек). Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: NickTempBan(sNick, nTime, sReason, sBy)

BanMan.RangeBan(sIPFrom, sIPTo, sReason, sBy, bFull) - Постоянный бан для указанного ранга ip. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: RangeBan(sIPFrom, sIPTo, sReason, sBy, bFull)

BanMan.RangeTempBan(sIPFrom, sIPTo, nTime, sReason, sBy, bFull) - Временный бан для указанного ранга ip. Параметр nTime - время в минутах (0 = время бана берётся из настроек). Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: RangeTempBan(sIPFrom, sIPTo, nTime, sReason, sBy, bFull)


-------------------
ProfMan.AddProfile(sProfileName) - Добавляет профиль в менеджер профилей, возвращает номер профиля в случае успеха или nil, если такой профиль уже есть.
Аналог API 1: AddProfile(sProfileName,0)

ProfMan.RemoveProfile(sProfileName) - Удаляет профиль их менеджера профилей, возвращает true в случае успеха или nil, если указанный профиль не существует или наоборот существует и используется.
Аналог API 1: RemoveProfile(sProfileName)

ProfMan.MoveDown(nProfileNumber) - Сдвиг профиля вниз. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: нету

ProfMan.MoveUp(nProfileNumber) - Сдвиг профиля вверх. Возвращает nil в случае неудачи, true - в случае успеха.
Аналог API 1: нету

ProfMan.GetProfile(sProfileName/nProfileNumber) - Возвращает профиль как таблицу профиля или nil, если такого профиля нет.
Аналог API 1: нету

ProfMan.GetProfiles() - Возвращает таблицу с профилями как профильные таблицы.
Аналог API 1: GetProfiles()

ProfMan.GetProfilePermission(nProfileNumber, nPermissionId) - Возвращает true, если настройка разрешена, иначе возвращает nil.
Аналог API 1: нету

ProfMan.GetProfilePermissions(nProfileNumber) - Возвращает таблицу с настройками профиля.
Аналог API 1: GetProfilePermissions(nProfileNumber)

ProfMan.SetProfileName(nProfileNumber, sProfileName) - Изменяет имя профиля, возвращает true в случае удачи или nil, если указанного профиля не существует.
Аналог API 1: нету

ProfMan.SetProfilePermission(nProfileNumber, nPermissionId, bBoolean) - Изменяет настройку профиля с указанным идентификатором, возвращает true в случае удачи или nil, если указанного профиля не существует.
Аналог API 1: нету


-------------------
TmrMan.AddTimer(nTimerInterval) - Добавляет новый таймер для скрипта. Параметр nTimerInterval - время в милисекундах. Возвращает nil - в случае неудачи или nTimerId - в случае успеха.
Аналог API 1: SetTimer(nTimerInterval) StartTimer()

TmrMan.AddTimer(nTimerInterval, sFunctionName) - Добавляет новый таймер для скрипта. Параметр nTimerInterval - время в милисекундах. Параметр sFunctionName - это имя функции выполняемой таймером. Возвращает nil - в случае неудачи или nTimerId - в случае успеха.
Аналог API 1: нету

TmrMan.RemoveTimer(nTimerId) - Удаляет таймер с указанным идентификатором из скрипта.
Аналог API 1: StopTimer()


-------------------
UDPDbg.Reg(sIp, nPort, bAllData) - Регистрирует получателя данных от PtokaX через UDP, если параметр bAllData равен false, то получать данные только от этого скрипта. Возвращает nil в случае неудачи или true в случае успеха.
Аналог API 1: нету

UDPDbg.Unreg() - Удалить получателя данных.
Аналог API 1: нету

UDPDbg.Send(sData) - Отправить данные через UDP. Если скрипт зарегистрирован, то только от зарегистрированного скрипта, иначе от всех скриптов. Возвращает nil в случае неудачи или true в случае успеха.
Аналог API 1: нету


-------------------
ScriptMan.GetScript() - Возвращает таблицу этого скрипта с полями sName, bEnabled, iMemUsage.
Аналог API 1: нету

ScriptMan.GetScripts() - Возвращает таблицу всех скриптов с полями sName, bEnabled, iMemUsage.
Аналог API 1: нету

ScriptMan.MoveUp(sScriptName) - Сдвинуть указанный скрипт выше. Возвращает nil в случае неудачи или true в случае успеха.
Аналог API 1: нету

ScriptMan.MoveDown(sScriptName) - Сдвинуть указанный скрипт ниже. Возвращает nil в случае неудачи или true в случае успеха.
Аналог API 1: нету

ScriptMan.StartScript(sScriptName) - Запустить скрипт с указанным именем. Возвращает nil в случае неудачи или true в случае успеха.
Аналог API 1: нету

ScriptMan.RestartScript(sScriptName) - Перезапустить указанный скрипт. Возвращает nil в случае неудачи или true в случае успеха.
Аналог API 1: нету

ScriptMan.StopScript(sScriptName) - Остановить указанный скрипт. Возвращает nil в случае неудачи или true в случае успеха.
Аналог API 1: нету

ScriptMan.Restart() - Перезапустить все скрипты.
Аналог API 1: frmHub:RestartScripts()

ScriptMan.Refresh() - Обновить скрипт-лист.
Аналог API 1: нету


-------------------
IP2Country.GetCountryCode(sIP) - Возвращает код страны для указанного ip или nil, если ip не действителен.
Аналог API 1: нету

IP2Country.GetCountryName(sIP) - Возвращает имя страны для указанного ip или nil, если ip не действителен.
Аналог API 1: нету

IP2Country.GetCountryName(tUser) - Возвращает имя страны для указанного пользователя.
Аналог API 1: нету
FallenAngel, Invisible, Ksan, Karumo, Kingston, Sekretchik, Saymon21, Enyby, Damaks, ramzes, MIKHAIL
23.9.2008, 17:05 Функции Для Разработчиков
склад полезных функций
Еще несколько интересных методов. Может кому понадобятся, может кого заинтересует (Я использую их в больших проектах. Они несколько сворачивают длинные выкладки).
Код
tSys={}
function tSys:Table(t)                return type(t)=="table" and t end
function tSys:TableNoVoid(t)             return self:Table(t) and next(t) and t end
function tSys:TableOrDef(t,d)         return self:Table(t) or d or {} end
function tSys:TableNoVoidOrDef(t,d)        return self:TableNoVoid(t) or self:TableOrDef(t,d) end
function tSys:Table2(t,s)             return self:Table(t) and self:Table(t[s]) and t[s] end
function tSys:TableNoVoid2(t,s)         return self:Table2(t,s) and next(t[s]) and t[s] end
function tSys:TableOrDef2(t,s,d)        return self:Table(t) and (self:Table(t[s]) and t[s] or d or rawset(t,s,{}) and t[s]) or {} end
function tSys:TableNoVoidOrDef2(t,d)    return self:TableNoVoid2(t) or self:TableOrDef2(t,d) end
function tSys:String(s)             return type(s)=="string" and s end
function tSys:StringNoVoid(s)         return self:String(s) and s~="" and s end
function tSys:StringOrDef(s,d)         return self:String(s) or d or "" end
function tSys:StringNoVoidOrDef(s,d)     return self:StringNoVoid(s) or self:StringOrDef(s,d) end
function tSys:String2(t,s)             return self:Table(t) and self:String(t[s]) and t[s] end
function tSys:StringNoVoid2(t,s)         return self:String2(t,s) and t[s]~="" and t[s] end
function tSys:StringOrDef2(t,s,d)        return self:Table(t) and (self:String(t[s]) and t[s] or d or rawset(t,s,"") and t[s]) or "" end
function tSys:StringNoVoidOrDef2(s,d)     return self:StringNoVoid2(s) or self:StringOrDef2(s,d) end
function tSys:Number(i)             return type(i)=="number" and i end
function tSys:NumberOrDef(i,d)         return self:Number(i) or d or 0 end
function tSys:StringOrNumber(s)         return self:String(s) or self:Number(s) end
function tSys:NumberOfString(s)         return self:String(s) and tonumber(s) and s end
function tSys:ToNumber(s)             return self:String(s) and tonumber(s) or self:Number(s) end
function tSys:NoVoid(s)             return self:StringNoVoid(s) or self:Number(s) end
function tSys:Eq0(s)                 return self:Number(s) and s==0 and s end
function tSys:Eq1(s)                 return self:Number(s) and s==1 and s end
function tSys:Eq2(s)                 return self:Number(s) and s==2 and s end
function tSys:Eq01(s)                 return self:Number(s) and (s==0 or s==1) and s end

--метод возвращает количество ВСЕХ полей таблицы (а не только количество индексных полей как функции table.getn или table.maxn)
function tSys:GetN(t)
    local c=0 for _ in pairs(t) do c=c+1 end return c
end


P.S. Существуют различия между методами и функциями. tSys:GetN(t) - метод, tSys.GetN(t) - функция
Invisible
22.9.2008, 21:28 Меню
API1, API2 | Меню для всех профилей
Цитата(Cjay @ 22.9.2008, 22:16) *
насколько помню это "$UserCommand 255 3 " блокирует скрипты находящиеся до данного скрипта, лучше переправить на "$UserCommand 1 3 " И всеравно оставить первым в списке скриптов, у меня работает, такой скрипт, правда немного переделанный


Немного неверно ты думаешь. Команда "$UserCommand 255 3" не блокирует (и тем более не скрипты). Она просто стирает контекстные менюшки!

Причем существуют разновидности:
"$UserCommand 255 1", "$UserCommand 255 2", "$UserCommand 255 3", ... , "$UserCommand 255 15"
Для стирания различным менюшек.
Цитата
1 - меню хаба
2 - меню юзера
3 - меню хаба и меню юзера
4 - меню поиска
5 - меню хаба и меню поиска
6 - меню юзера и меню поиска
7 - меню хаба, юзера и поиска
8 - меню файл-листа
9 - меню хаба и файл-листа
10 - меню юзера и файл-листа
11 - меню хаба, юзера и файл-листа
12 - меню поиска и файл-листа
13 - меню хаба, поиска и файл-листа
14 - меню юзера, поиска и файл-листа
15 - меню хаба, юзера, поиска и файл-листа

big_smile.gif
Invisible, Serx
22.9.2008, 15:04 Меню
API1, API2 | Меню для всех профилей
В таблице CmdCfg установить параметр: ClearMenu = "no", вместо "yes" =)
Inkvizitor_ks
15.9.2008, 22:31 Функции Для Разработчиков
склад полезных функций
Функции преобразования ip адреса в число и обратно:
Код
function Ip2Num(sIP)
  local a, b, c, d = sIP:match"^(%d+)%.(%d+)%.(%d+)%.(%d+)$"
  return a * 16777216 + b * 65536 + c * 256 + d
end
function Num2Ip(i)
  i = tonumber(i) or 0
  local r, d, zd = '', '.', "0."
  if i >= 16777216 then r = math.floor(i / 16777216)..d i = math.fmod(i, 16777216) else r = zd end
  if i >= 65536 then r = r..math.floor(i / 65536)..d i = math.fmod(i, 65536) else r = r..zd end
  if i >= 256 then r = r..math.floor(i / 256)..d i = math.fmod(i, 256) else r = r..zd end
  return r..i
end
Можно использовать для проверки рангов ip и для оптимального хранения ip адресов в бд.
Invisible, Saymon21, shullz, Несогласный
14.9.2008, 11:36 Функции Для Разработчиков
склад полезных функций
Функции форматирования шары:
Код
function GetNormalShare(s)
  s = tonumber(s) or 0
  if s >= 1125899906842624 then return (math.floor(1000 * s / 1125899906842624) / 1000).." ПБ"
  elseif s >= 1099511627776 then return (math.floor(1000 * s / 1099511627776) / 1000).." TБ"
  elseif s >= 1073741824 then return (math.floor(1000 * s / 1073741824) / 1000).." ГБ"
  elseif s >= 1048576 then return (math.floor(1000 * s / 1048576) / 1000).." МБ"
  elseif s >= 1024 then return (math.floor(1000 * s / 1024) / 1000).." КБ"
  else return s.." Б" end
end

Код
function GetLongShare(s)
  s = tonumber(s) or 0
  local r = ''
  if s >= 1125899906842624 then r = r ~= '' and r..(" %s ПБ"):format(math.floor(s / 1125899906842624)) or r..math.floor(s / 1125899906842624).." ПБ" s = math.fmod(s, 1125899906842624) end
  if s >= 1099511627776 then r = r ~= '' and r..(" %s ТБ"):format(math.floor(s / 1099511627776)) or r..math.floor(s / 1099511627776).." ТБ" s = math.fmod(s, 1099511627776) end
  if s >= 1073741824 then r = r ~= '' and r..(" %s ГБ"):format(math.floor(s / 1073741824)) or r..math.floor(s / 1073741824).." ГБ" s = math.fmod(s, 1073741824) end
  if s >= 1048576 then r = r ~= '' and r..(" %s МБ"):format(math.floor(s / 1048576)) or r..math.floor(s / 1048576).." МБ" s = math.fmod(s, 1048576) end
  if s >= 1024 then r = r ~= '' and r..(" %s КБ"):format(math.floor(s / 1024)) or r..math.floor(s / 1024).." КБ" s = math.fmod(s, 1024) end
  if s < 1024 then r = r ~= '' and r..(" %s Б"):format(s) or r..s.." Б" end
  return r
end
Invisible, Saymon21
13.9.2008, 18:06 Функции Для Разработчиков
склад полезных функций
Функция приведения к нижнему регистру:
Код
function String2Lower(s)
  local r, b = ''
  s = s:lower()
  for i = 1, s:len() do
    b = s:byte(i)
    if b > 191 and b < 224 then
      b = b + 32
    elseif b == 168 or b == 184 then
      b = 229
    end
    r = r.._G.string.char(b)
  end
  return r
end

Функция приведения к верхнему регистру:
Код
function String2Upper(s)
  local r, b = ''
  s = s:upper()
  for i = 1, s:len() do
    b = s:byte(i)
    if b > 223 then
      b = b - 32
    elseif b == 168 or b == 184 then
      b = 197
    end
    r = r.._G.string.char(b)
  end
  return r
end



Более оптимальные по выполнению функции:
Код
String2Lower = function(s)
  for i = 192, 223 do
    s = s:gsub(_G.string.char(i), _G.string.char(i + 32))
  end
  s = s:gsub(_G.string.char(168), _G.string.char(184))
  return s:lower()
end

Код
String2Upper = function(s)
  for i = 224, 255 do
    s = s:gsub(_G.string.char(i), _G.string.char(i - 32))
  end
  s = s:gsub(_G.string.char(184), _G.string.char(168))
  return s:upper()
end
Invisible, Saymon21, мамин_парень
8.9.2008, 11:32 Weather
API2 | Скрипт погоды.
Коды городов для скрипта
NiKe10
6.9.2008, 15:58 Функции Для Разработчиков
склад полезных функций
Привожу полное преобразование на lua из кодировки cp1251 (Ansi) в utf-8 и обратно, с помощью функций AnsiToUtf8 и Utf8ToAnsi соответственно:

Код
local ansi_decode={
  [128]='\208\130',[129]='\208\131',[130]='\226\128\154',[131]='\209\147',[132]='\226\128\158',[133]='\226\128\166',
  [134]='\226\128\160',[135]='\226\128\161',[136]='\226\130\172',[137]='\226\128\176',[138]='\208\137',[139]='\226\128\185',
  [140]='\208\138',[141]='\208\140',[142]='\208\139',[143]='\208\143',[144]='\209\146',[145]='\226\128\152',
  [146]='\226\128\153',[147]='\226\128\156',[148]='\226\128\157',[149]='\226\128\162',[150]='\226\128\147',[151]='\226\128\148',
  [152]='\194\152',[153]='\226\132\162',[154]='\209\153',[155]='\226\128\186',[156]='\209\154',[157]='\209\156',
  [158]='\209\155',[159]='\209\159',[160]='\194\160',[161]='\209\142',[162]='\209\158',[163]='\208\136',
  [164]='\194\164',[165]='\210\144',[166]='\194\166',[167]='\194\167',[168]='\208\129',[169]='\194\169',
  [170]='\208\132',[171]='\194\171',[172]='\194\172',[173]='\194\173',[174]='\194\174',[175]='\208\135',
  [176]='\194\176',[177]='\194\177',[178]='\208\134',[179]='\209\150',[180]='\210\145',[181]='\194\181',
  [182]='\194\182',[183]='\194\183',[184]='\209\145',[185]='\226\132\150',[186]='\209\148',[187]='\194\187',
  [188]='\209\152',[189]='\208\133',[190]='\209\149',[191]='\209\151'
}
local utf8_decode={
  [128]={[147]='\150',[148]='\151',[152]='\145',[153]='\146',[154]='\130',[156]='\147',[157]='\148',[158]='\132',[160]='\134',[161]='\135',[162]='\149',[166]='\133',[176]='\137',[185]='\139',[186]='\155'},
  [130]={[172]='\136'},
  [132]={[150]='\185',[162]='\153'},
  [194]={[152]='\152',[160]='\160',[164]='\164',[166]='\166',[167]='\167',[169]='\169',[171]='\171',[172]='\172',[173]='\173',[174]='\174',[176]='\176',[177]='\177',[181]='\181',[182]='\182',[183]='\183',[187]='\187'},
  [208]={[129]='\168',[130]='\128',[131]='\129',[132]='\170',[133]='\189',[134]='\178',[135]='\175',[136]='\163',[137]='\138',[138]='\140',[139]='\142',[140]='\141',[143]='\143',[144]='\192',[145]='\193',[146]='\194',[147]='\195',[148]='\196',
    [149]='\197',[150]='\198',[151]='\199',[152]='\200',[153]='\201',[154]='\202',[155]='\203',[156]='\204',[157]='\205',[158]='\206',[159]='\207',[160]='\208',[161]='\209',[162]='\210',[163]='\211',[164]='\212',[165]='\213',[166]='\214',
    [167]='\215',[168]='\216',[169]='\217',[170]='\218',[171]='\219',[172]='\220',[173]='\221',[174]='\222',[175]='\223',[176]='\224',[177]='\225',[178]='\226',[179]='\227',[180]='\228',[181]='\229',[182]='\230',[183]='\231',[184]='\232',
    [185]='\233',[186]='\234',[187]='\235',[188]='\236',[189]='\237',[190]='\238',[191]='\239'},
  [209]={[128]='\240',[129]='\241',[130]='\242',[131]='\243',[132]='\244',[133]='\245',[134]='\246',[135]='\247',[136]='\248',[137]='\249',[138]='\250',[139]='\251',[140]='\252',[141]='\253',[142]='\254',[143]='\255',[144]='\161',[145]='\184',
    [146]='\144',[147]='\131',[148]='\186',[149]='\190',[150]='\179',[151]='\191',[152]='\188',[153]='\154',[154]='\156',[155]='\158',[156]='\157',[158]='\162',[159]='\159'},[210]={[144]='\165',[145]='\180'}
}

local nmdc = {
  [36] = '$',
  [124] = '|'
}

function AnsiToUtf8(s)
  local r, b = ''
  for i = 1, s and s:len() or 0 do
    b = s:byte(i)
    if b < 128 then
      r = r..string.char(b)
    else
      if b > 239 then
        r = r..'\209'..string.char(b - 112)
      elseif b > 191 then
        r = r..'\208'..string.char(b - 48)
      elseif ansi_decode[b] then
        r = r..ansi_decode[b]
      else
        r = r..'_'
      end
    end
  end
  return r
end

function Utf8ToAnsi(s)
  local a, j, r, b = 0, 0, ''
  for i = 1, s and s:len() or 0 do
    b = s:byte(i)
    if b < 128 then
      if nmdc[b] then
        r = r..nmdc[b]
      else
        r = r..string.char(b)
      end
    elseif a == 2 then
      a, j = a - 1, b
    elseif a == 1 then
      a, r = a - 1, r..utf8_decode[j][b]
    elseif b == 226 then
      a = 2
    elseif b == 194 or b == 208 or b == 209 or b == 210 then
      j, a = b, 1
    else
      r = r..'_'
    end
  end
  return r
end

big_smile.gif
Nickolya, intlive, Tsd, Invisible, Alexey, Sekretchik, Saymon21, TiGRpp, RAND(i)M, KCAHDEP, Несогласный
28.8.2008, 11:27 Бомба
API1, API2 | Классная игра на кик
Название скрипта: Bomb
Версия скрипта: 1.5
Версия API: API1 и API2 (универсальный скрипт)
Автор: Setuper
Префиксы команд: +, !, /
Команды: +bomb - подложить бомбу, +helpbomb - помощь
Код: Бинарный и Открытый
Описание скрипта: Подкладываешь бомбу и через установленное время она взрывается (юзера выкидывает или кикает с хаба), если конечно он её не обозвредит.
Настройки скрипта: После первого запуска скрипта создаётся файл "SettingsBomb.dbs", который содержит все настройки скрипта. Итак,
sBot - имя бота. Если не задано или пустая строка, то берется основной бот, иначе регистрируется на хабе указанный;
iTime - время в секундах для разминирования;
iTimer - время, через которое у вас появляются таймеры для бомб (это минимальное время между двумя подкладываниями бомб);
iTimeArmour - задержка перед запросом на установку или снятие бронежилета;
iTop - число позиций в топе;
iTopAll - число позиций в общем топе;
tWire - таблица проводов бомбы (должно быть не меньше 2 проводов);
iAction - действие при взрыве. 1 - дроп, 2 - кик;
sMenuUser - контекстное меню пользователя;
sMenuHub - контекстное меню хаба;
sArmour - контекстное меню установки/снятия бронежилета;
sCheck - контекстное меню проверки состояния бронежилета;
sHelp - контекстное меню помощи;
sTopBombers - контекстное меню топа минёров;
sTopSappers - контекстное меню топа сапёров;
sTopLosers - контекстное меню топа неудачников;
sTopAll - контекстное меню общего топа;
tProfiles - таблица профилей, под которых не подкладываются бомбы.

При возникновении каких то трудностей или ошибок скрипта отписываем сюда, указав ошибку и действие, которое вызвало ошибку.

В скриптах с закрытым кодом есть возможность отсылать цвет провода как в чат, так и в личку боту!
В скриптах с открытым кодом есть возможность отсылать цвет провода только в чат!

Версии с идентификацией по ip:
[attachment=2170:Bomb_by_...er_v_1.5.lua][attachment=2171:Bomb_by_...1.5_open.lua]

Версии с идентификацией по нику:
[attachment=2172:Bomb_by_..._nick_id.lua][attachment=2173:Bomb_by_..._nick_id.lua]

ВНИМАНИЕ!!! Перед запуском очередной новой версии необходимо удалить старый файл настроек для того чтобы появился правильный новый файл настроек!!!

Удачной игры big_smile.gif
FallenAngel, Drakula, EnerGetIck, AfLc
25.8.2008, 0:47 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Вот своял под апи2, но на работоспособность не проверял!
CODE
function OnStartup()
sBot=SetMan.GetString(21)
iTime=60 --Время в минутах, в течение которого нужно отправить подтверждение
tTmp={}
tFriends={} --база друзей
TmrMan.AddTimer(60000,"ClearRequests")
end

function ChatArrival(tUser,sData)
sData=sData:sub(string.len(tUser.sNick)+4,-2)
local _,_,sCmd,sNick=string.find(sData,"[+!/](%S+)%s+(%S+).*")
if sCmd and sNick and sCmd=="friend" then
if sNick==tUser.sNick then
Core.SendToUser(tUser,"*** О боже... Что я вижу... Вы хотите подружиться с собой! Перед тем как подружиться с собой навестите психиатора.")
end
local tUs=Core.GetUser(sNick)
if tUs then
for i,v in pairs(tFriends) do
if v[1]==tUser.sNick and v[2]==sNick or v[2]==tUser.sNick and v[1]==sNick then
Core.SendToUser(tUser,"*** Вы с '"..sNick.."' уже являетесь друзьями!")
return true
end
end
if not tTmp[tUser.sNick] then
tTmp[tUser.sNick]={}
tTmp[tUser.sNick].sNick=sNick
tTmp[tUser.sNick].iTime=os.time()+iTime*60
if tTmp[sNick] and tTmp[sNick].sNick==tUser.sNick then
tTmp[sNick]=nil
tTmp[tUser.sNick]=nil
table.insert(tFriends,{tUser.sNick,sNick}
Core.SendToUser(tUser,"$To: "..tUser.sNick.." From: "..sBot.." $<"..sBot.."> "..
"Запрос подтвержден! Вы с '"..sNick.."' с данного момента являетесь друзьями")
Core.SendToUser(tUs,"$To: "..sNick.." From: "..sBot.." $<"..sBot.."> "..
"Запрос подтвержден! Вы с '"..tUser.sNick.."' с данного момента являетесь друзьями")
else
Core.SendToUser(tUser,"*** Запрос на поддержание дружбы с пользователем '"..sNick..
"' успешно отправлен. Ждите подтверждения!")
end
else
Core.SendToUser(tUser,"*** Запрос на поддержание дружбы уже был отправлен пользователю '"..sNick.."'")
end
Core.SendToUser(tUs,"$To: "..sNick.." From: "..sBot.." $<"..tUser.sNick.."> "..
"Поступил запрос на подтверждение дружбы. Для подтверждения отправьте в чат +friend "..tUser.sNick)
else
Core.SendToUser(tUser,"*** Пользователь '"..sNick.."' оффлайн!")
end
return true
end
end

function ClearRequests()
for i,v in pairs(tTmp) do
if os.time()>v.iTime then
tTmp[i]=nil
end
end
end
мамин_парень
18.8.2008, 13:56 Создание Контекстных Менюшек Средствами Клиента
Сегодня я расскажу как на стороне клиента делать контекстные менюшки.

Открываем свой клиент и заходим: "Файл" - "Настройки" - "Команды-Юзера". Щелкаем добавить.

Видим типы команд:

Разделитель - горизонтальная черта между менюшками.
RAW - RAW команда
Чат - команда, отсылаемая в чат
PM - команда, отсылаемая в личку указанному юзеру

Далее контекст:

Меню хаба - означает, что команда будет доступна из контекстного меню хаба (правый щелчок по закладке хаба)
Меню юзера - означает, что команда будет доступна из контекстного меню юзера (правый щелчок по любому из юзеров)
Меню поиска - означает, что команда будет доступна из контекстного меню поиска (правый щелчок по файлу в результатах поиска)
Меню листа файлов - означает, что команда будет доступна из контекстного меню файл-листа (правый щелчок по файлу или папке после получения файл-листа юзера)

Далее рассмотрим параметры:

Название: в названии пишем имя контекстной менюшки. Если вы хотите создать подменю, то надо использовать обратные слеши ("\")
Команда: тут надо писать команду.
Хаб IP / DNS: тут надо писать IP или DNS имя хаба, на котором должна появиться и действовать данная команда. Если ничего не указывать, то команда появиться на всех хабах. Если указать "op", то команда появиться на всех хабах, на которых вы являетесь оператором (при условии, что рядом с вашим ником будет ключик, то есть если от хаба к клиенту прийдет команда получения статуса оператора).
К: тут обычно пишется ник получателя лички, если команда является командой типа PM.



Теперь рассмотрим простейший пример написания команд.

Устанавливаем тип команды: "чат"
Контекст: "Меню хаба" и "Меню юзера"
Название: "Меню клиента\Сказать привет"
Команда: "Всем привет"

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



Рассмотрим следующий пример:

Тип команды: "чат"
Контекст: "Меню хаба" и "Меню юзера"
Название: "Меню клиента\Послать дату и точное время в чат"
Команда: "Сегодня: %A - %d/%m/%Y. Точное время: %H:%M:%S"

Данная команда будет отсылать в чат ваше время на компьютере.



Следующий пример:

Тип команды: "чат"
Контекст: "Меню юзера"
Название: "Меню клиента\Сообщения\Сообщения в чат\Шара этого юзера"
Команда: "Шара пользователя %[userNI]: %[userSS] байт"

Список команд сохраняется в файле Favorites.xml в папке Settings вашего клиента.

Приложу мой список команд. Можете скопировать в свой файл Favorites.xml полностью тег <UserCommands> и у вас появятся менюшки на хабах.
Но перед копированием в этот файл сделайте резервную копию этого файла, если у вас ни получиться правильно скопировать, то вернёте свой старый файл. И еще! Перед записью в этот файл (Favorites.xml) нужно закрыть клиент (именно закрыть, а не свернуть!!!)

[attachment=434:Favorites.xml]
Invisible, Uncle_Dif, Saymon21, Тёмич, мамин_парень
7.8.2008, 15:54 Несколько Слов О Захватах И Регулярных Выражениях
исключительно для разработчиков
Итак, я думаю многие сталкивались в скриптах со всевозможными "захватами" и регулярными выражениями.
Почти в каждом скрипте они встречаются.

Сразу же начну с нескольких примеров:
Код
local s, e, a, b, c, d = string.find("11.12.13.14", "^(%d+)%.(%d+)%.(%d+)%.(%d+)$")
local _, _, a, b, c, d = string.find("11.12.13.14 ", "^(%d+)%.(%d+)%.(%d+)%.(%d+)$")
local _, _, a, b, c, d = string.find("10 11.12.13.14 15", "(%d+)%.(%d+)%.(%d+)%.(%d+)")
local _, _, a = string.find("Hello world", "%S+%s(%S+)")
local _, _, a, b, c = string.find("<User> !massmsg hello world", "%b<>%s+(%S)(%S+)%s*(.*)")


Можете ли вы сказать, что тут выполняется??? Если не можете, то слушайте дальше...

Сначала расскажу, что такое захват, и что такое регулярное выражение.
Формально, захват - это нахождение определённый последовательности символов и помещение их в переменную.
Например, возьмём один из примеров, который я написал сверху:
Код
local s, e, a, b, c, d = string.find("11.12.13.14", "^(%d+)%.(%d+)%.(%d+)%.(%d+)$")

этот пример - типичный пример захвата. Функция string.find "захватывает" из строки "11.12.13.14" определённую последовательность символов.
Выражение "^(%d+)%.(%d+)%.(%d+)%.(%d+)$", называется РЕГУЛЯРНЫМ ВЫРАЖЕНИЕМ.
в скобках указываются захваты, то есть тут 4 захвата. Из этой функции данные у нас заносятся в 6 локальных переменных, а именно s, e, a, b, c, d.
В переменную s (s от слова start) заносится начальная позиция захвата, равная 1. У нас строка "11.12.13.14" имеет 11 символов, следовательно 11 позиций. В переменную e (e от слова end) заносится конечная позиция захвата, равная 11. Обычно, в скриптах эти позиции не нужны, тогда, обычно, переменные обозначают одним именем (для сохранения памяти), обычно, обозначают как "_" (чтобы эта переменная была не столь заметна).
Далее в переменные a, b, c, d, соответственно, заносятся захваты (то, что захватывается скобками).
Разберём регулярное выражение: "^(%d+)%.(%d+)%.(%d+)%.(%d+)$".
Символ ^ означает, что следующее действие в регулярном выражении должно быть в начале строки. У нас следующее за символом ^ действие - это захват (%d+), следовательно, захват у нас должен выполняться обязательно с начала строки. Сейчас объясню более понятно на примерах.
Возьмём два регулярных выражения "^(%d+)" и "(%d+)".
Теперь с помощью действий:
Код
local s, e, a1 = string.find("11.12.13.14", "^(%d+)")
local s, e, a2 = string.find("11.12.13.14", "(%d+)")

в переменные a1 и a2 запишутся данные: a1="11" и a2="11".
Теперь изменим исходную строку (дописав вначале строки пробел):
Код
local s, e, a1 = string.find(" 11.12.13.14", "^(%d+)")
local s, e, a2 = string.find(" 11.12.13.14", "(%d+)")

смотрим, что в переменных: a1=nil и a2="11".
Теперь я думаю вам почти понятно в чем вся фишка, осталось только объяснить, что такое (%d+).
(%d+) - это захват числа. Во второй строке вначале стоял пробел, поэтому выражение ^(%d+) не могло захватить число вначале строки, поэтому и функция string.find вернула nil, и записала в переменные s=nil, e=nil, a1=nil, а функция string.find(" 11.12.13.14", "(%d+)") записала в переменные s=1, e=2, a2="11". Заметьте, что хоть мы и захватываем число, но тем не менее оно является строковым числом "11", а не просто 11 !!!!!!!!.
Аналогично дело обстоит с символом $, но только для конца строки.
Таким образом, мы рассмотрели 3 первых примера, которые я предложил вначале.
В первом примере: s=1, e=11, a="11", b="12", c="13", d="14" и захват происходит именно 4 чисел, разделённых точками, и никакой другой комбинации
Во втором: _=nil, a=nil, b=nil, c=nil, d=nil и захвата не произошло из-за пробела в конце.
В третьем: _=14, a="11", b="12", c="13", d="14" захват 4 чисел, разделённых точками, в любом месте (хоть вначале строки, хоть в середине, хоть в конце), и строка не обязана содержать только 4 числа, разделённых точками, в отличие от первых двух примеров.

Идём далее. Выпишу основные регулярные выражения:

Цитата
. - любой символ
%a - латинская буква
%с - контрольный символ
%d - десятичная цифра
%u - латинская буква верхнего регистра
%l - латинская буква нижнего регистра
%p - знак пунктуации
%s - символ пробела
%w - латинская буква или арабская цифра
%z - нулевой символ

%A - не латинская буква
%C - не контрольный символ
%D - не десятичныая цифра
%U - не латинская буква верхнего регистра
%L - не латинская буква нижнего регистра
%P - не знак пунктуации
%S - не символ пробела
%W - не латинская буква и не арабская цифра
%Z - не нулевой символ

вроде становится понятнее, не так ли?

Эквиваленты:
%d эквивалентно [0-9]
%D эквивалентно [^%d]
%w эквивалентно [A-Za-z0-9]
%W эквивалентно [^%w]

в 4 и 5 примерах встречается регулярное выражение %S. Находим в списке выше, и видим: %S - не символ пробела. То есть, это означает, что это не пробел, а следовательно это любой символ, кроме пробела.

Теперь рассмотрим всякие плюсики. Я буду рассматривать их совместно с регулярным выражением %s, то есть с символом пробела.

Цитата
%s - 1 символ пробела
%s+ - 1 или более символов пробела
%s- - 0 или более символов пробела
%s* - 0 или более символов пробела
%s? - 0 или 1 символ пробела


Теперь объясню разницу между * и -
Удобнее всего на следующем примере. Я уже рассказал, что означает точка (смотри выше в списке регулярных выражений: "." - любой символ).
Рассмотрим примеры следующих регулярных выражений:
Цитата
"(.*)" - захват всей строки
"/(.*)/" - захват всего, что находится между КРАЙНИМИ символами /
"/(.-)/" - захват всего, что находится между ПЕРВЫМИ ДВУМЯ символами /


Цитата
%bxy - нахождение, а в случае захвата и захват, всего того, что находится между символами x и y, включая концы x и y


Ну и последнее...

А если, допустим, я хочу захватить точку. Как быть?
Дело в том, что точка является так называемым магическим символом.
Магические символы: ( ) . % + - * ? [ ] ^ $
Перед всеми магическими символами нужно ставить %, то есть все магические символы надо экранировать.
Таким образом, чтобы захватить точку надо написать "(%.)"


На последок ещё несколько часто используемых регулярных выражений:

Цитата
"(%S)" - захват первого не пробельного символа строки;
"(%S*)" - захват первого слова или пустого слова "";
"%S*%s*(%S*)" - захват второго слова;
"(%S*)%s*(%S*)" - захват первого и второго слова;
"(%S%S)" - захват первых двух не пробельных символов;
"(%S+)%s*(%d*)" - захват слова и числа;
"(%d*%.%d*%.%d*%.%d*)" - захват строки из 4 чисел, разделенных точками (например ip адреса);
"%s*(%d*%.%d*%.%d*%.%d*)%s*(%d*)%s*(.*)" - захват чисел, разделенных точками, захват числа, захват всего оставшегося;
"()" - захват номера позиции;
"(why)" - захват слова why (в любом месте);
"^(why)" - захват слова why, только если оно стоит на первых трех (в данном случае) позициях;
"(why)$" - захват слова why, только если оно стоит на последних трех (в данном случае) позициях;
"%b<>%s+(%S)(%S+)%s*(.*)" - захват первого символа, сразу после текста, ограниченного символами < >, второй захват слова сразу после захваченного символа, третий захват - захват всего оставшегося.
[^/]+ - не пустой захват с начала до символа /


Теперь, я думаю, что вы и сами сможете написать, что же получается в примерах 4 и 5???
Nickolya, FallenAngel, Tsd, Invisible, Ksan, Accelerator, Alexey, BeN, Kingston, Sekretchik, L1stin, Saymon21, X-Sky, Stym, TiGRpp, alcorp, bot9ra, RAND(i)M, Damaks, MIKHAIL, мамин_парень
13.7.2008, 23:06 Regme
API1, API2 | Скрипт регистрации
Название скрипта: RegMe
Версия скрипта: 1.5
Версия API: API1 и API2 (универсальный скрипт)
Автор: Setuper
Префиксы команд: +, !, /
Описание скрипта: Скрипт регистрации. Содержит в себе возможности регистрации и перерегистрации. Есть возможность перед регистрацией проходить тест по правилам хаба (не пройдя тест не регистрировать). Есть возможность в случае, если не указывается пароль, давать случайный пароль. За ненадобностью регистрации 1 ник на 1 ip - эту функцию скрипт не содержит (дабы не нагружать память базой пользователей). Скрипт может регистрировать бота (или же оставить главного бота) и устанавливать его параметры, а именно: статус away, описание, email, имя клиента, тэг, шару. Скрипт представляет собой бинарный файл, но все настройки скрипта вынесены в отдельный файл RegMe.dbs, который создаётся при первом запуске скрипта, и который можно открыть с помощью блокнота и править; этот файл содержит все сообщения скрипта и все менюшки, поэтому скрипт легко переводится на другие языки - достаточно только перевести то что написано в этом файле (но будьте осторожны - ошибки в этом файле могут привести не падению скрипта). Также существуют другие файлы, которые создаются после первого обращения к ним - это файл с просьбой зарегистрироваться (для не зарегистрированного), который показывается при входе на хаб (имя файла UnRegInfo.txt) и команды помощи (RegHelp.txt)

Некоторые настройки скрипта:
bShowInfo=1 - показывать дополнительную информацию о том, как можно избежать повторных вводов пароля при входе на хаб
bShowToAll=1 - показывать всем пользователям, что на хабе новый зарегистрированный участник
bQuestions=1 - задавать ли вопросы перед регистрацией
iQuestions=число - сколько правильных ответов нужно для регистрации
bRandomPass=1 - устанавливать случайный пароль в случае его отсутствия
bSendOpReport=1 - отсылать рапорт о регистрации ОПам
iRegProf=число - профиль регистрации (по умолчанию) - обычно 3
iBlocker=число - блокировщик для незарегистрированных:
1-чат
2-ПМ
3-скачку
4-поиск
5-чат и ПМ
6-чат и скачку
7-ПМ и скачку
8-чат и поиск
9-ПМ и поиск
10-скачка и поиск
11-чат, ПМ и скачку
12-чат, ПМ и поиск
13-чат, скачку и поиск
14-ПМ, скачку и поиск
15-чат, ПМ, скачку и поиск

[attachment=1607:RegMe_v1.5.lua]
MIKHAIL
10.7.2008, 19:39 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Код
function String2Lower( sText )
    local sReturn, iByte = ""
    if sText then
        sText = string.lower( sText )
        for i = 1, string.len( sText ) do
            iByte = string.byte( sText, i )
            if iByte > 191 and iByte < 224 then
                iByte = iByte + 32
            elseif iByte == 168 or iByte == 184 then
                iByte = 229
            end
            sReturn = sReturn..string.char( iByte )
        end
    end
    return sReturn
end
Saymon21, MIKHAIL, мамин_парень
1.7.2008, 23:09 Функции ===> Читаем, Дабы Не Задавать Вопросов <===
Скрипт-интерфейс PtokaX Lua. ВСЕ СКРИПТОВЫЕ ФУНКЦИИ PtokaX API
SupportsArrival(tUser, sData)
Важная функция (с её помошью я смог устроить автоматическую регистрация по ip).
В данной функции происходить объявление основных полей таблицы пользователя, а также проверяется поддержка дополнений.
пример команды: "$Supports UserCommand NoGetINFO NoHello UserIP2 TTHSearch ZPipe0 |" - клиент говорит, что он поддерживает:
  • UserCommand - контекстные команды менюшек,
  • NoGetINFO - не нужна отсылка команды GetINFO для получения MyINFO,
  • NoHello - не обязательна отсылка команд $Hello и $NickList,
  • UserIP2 - поддержка технологии UserIP2,
  • TTHSearch - поддержка поиска по TTH,
  • ZPipe0 - поддержка команды $ZOn - команды сжатия данных (библиотека zlib)
Invisible, Sekretchik, Saymon21
1.7.2008, 22:00 Создание Dll
Принципы построения, создания и использования Dynamic Link Library (DLL)

Среды разработки и языки: Borland С++ Builder 6, lua 5, PtokaX 3.6.*.*


Немного теории.

DLL - это один или несолько участков кода, хранимых в файле с расширением .dll. Код, содержащийся в dll, может быть вызван из испольняемой программы, но сама dll не является программой. DLL может содержать функции, классы и ресурсы. Прежде чем использовать dll, её нужно загрузить в память. Существуют два вида загрузки dll: статическая и динамическая. Статическая загрузка означает, что dll автоматически загружается при запуске приложения. DLL содержит экспортируемые функции, а описания этих функций находятся в библиотеке импорта (import library). Библиотеки импорта имеют имя, совпадающее с именем соответствующей dll, и расширение .lib. Для использования статической загрузки необходимо на этапе компоновки к проекту подключить lib-файл для dll. DLL загружается при загрузке приложения и можно вызывать экспортируемые функции так же, как и любые другие функции. Это самый лёгкий подход. Недостаток его в том, что при отсутствие необходимой dll программа не будет загружаться ваобще. Второй тип загрузки - Динамическая загрузка. Означает, что DLL загружается при необходимости и выгружается по окончанию использования. Достоинством является то, что dll находится в памяти до тех пор, пока она нужна, что приводит к более эффективному использованию памяти. В lua мы используем динамический вид загрузки.

Ещё немного о содержании dll библиотек.
Как же прсмотреть содержимо dll библиотеки? Ведь dll файл нельзя ничем открыть. Для просмотра содержимого dll существуют специальные утилиты. Я использую Борнандовскую утилиту tdump (находится в папке bin вместе с bcb.exe).

Далее писать теорию влом. Если что, то спрашивайте попробую объяснить)))

Приступим к написанию.

1. Открываем Builder C++ 6
2. Закрываем автоматически созданную форму (file -> close all)
3. Создаём новый проект (file -> new -> Other -> dll wizard) указываем тип "C" (в противном случае будут необходимы некоторые манипуляции с extern "C") я уще обычно ставлю галку vc++ style dll (но это не принципиально, просто будет различаться имя основной функции dll).
4. Далее в созданном проекте видим огромный коммент -> стираем его нах (в кратце он говорит о том что для того чтобы использовать библиотеку srting необходим дополнительный гемор).
5. функцию DllMain не трогаем, а пишем выше (или ниже) следующий код (данный код является самым простейшим):
Код
#include <windows.h>
#pragma comment(lib, "PXLua.lib")
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

int __declspec(dllexport) lua_helloworld (lua_State *L)
{
        lua_pushstring(L, "Hello World!");
        return 1;
}


6. сохраняем проект (file -> save project). вам будет сначало предложено сохранить юнит, а потом уже проект.
7. для компиляции нужны заголовочные файлы (из исходников),а именно файлы: "lua.h", "lualib.h", "lauxlib.h" и "luaconf.h".
8. все эти файлы можно найти скачав исходники lua.
9. эти файлы надо поместить в директорию проекта.
10. также нужна библиотека статической загрузки "PXLua.lib"
11. создаем dll (project -> build all)
12. копируем dll из папки проекта в папку с PtokaX (dll обычно имеет имя проекта. по умолчанию "project1.dll")
13. пишем скрипт
Код
libinit = package.loadlib("project1.dll", "_lua_helloworld")
SendToAll(libinit())

тут функция содержит впереди символ подчеркивания - это "украшения" компилятора))) (хотя существуют способы убрать этот символ, но я их тут рассматривать не буду). Просмотреть названия функций в библиотеке можно опять же воспользовавшись утилитой tdump.exe
14. заходим на хаб и перезагружаем скрипт. должно появиться "Hello World!".

p.s. для написания dll для PtokaX 0.4.*.* необходима библиотека статической загрузки "PXLua.lib" для данной версии и соответственно изменить SendToAll на Core.SendToAll

p.p.s. чуть позже выложу более сложные функции (ща влом писать)

"PXLua.lib" [для PtokaX 0.3.6.0] [attachment=256:PXLua.zip]
"Заголовочные файлы" [attachment=257:lua.zip]
Invisible

23 страниц V  « < 19 20 21 22 23 >
RSS Сейчас: 26.4.2024, 7:20