myDC.ru

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

 
История благодарностей участнику Setuper. Спасибо сказали: 1695
Дата поста: В теме: За сообщение: Спасибо сказали:
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, мамин_парень
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  « < 21 22 23
RSS Сейчас: 21.11.2017, 5:31