Здравствуйте, гость ( Вход | Регистрация )
Дата поста: | В теме: | За сообщение: | Спасибо сказали: | ||
---|---|---|---|---|---|
27.10.2010, 21:58 |
Easy OPChat Скрипт реализующий простой ОП чат |
А зачем ты добавляешь в конец разделитель | ? Ведь он автоматически будет прибавляться если его нету |
Saymon21 | ||
24.10.2010, 19:44 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.2.6 lua plugin v 1.26 Added: Сделан poll для линукса Added: Сделана настройка включения определения mac адреса (по умолчанию отключено) Added: Добавлено событие OnConfigChange, которое выполняется при изменении какой-либо настройки хаба. Это даст возможность скриптописателю хранить настройки в локальных переменных, а при изменении настроек перезаписывать данные в переменных, а не дергать каждый раз функции. Added: Добавлена lua api функцию Core.SetHubState(iNum) - установка состояния хаба. iNum = nil или iNum = 0 - остановка хаба. iNum = 1 - рестарт хаба. Остальные значения заразервированы на будущее Fixed: Убрано логирование и остановка хаба при ошибке в Choose Fixed: Доработано автоматическое действие при смене настроек: sHubBot и bRegMainBot |
Nickolya, ShadoWx, PomanoB, ExC0tiC, CrazyKiller, Saymon21 | ||
24.10.2010, 19:33 |
Скрипт банов для RusHub тестим и комменьтруем |
В функцию UnbanUser в файле Ban.lua добавил строчку: Код return nil, "Юзер не был забанен." Это должно исправить ошибку. Честно говоря мне и самому не очень нравится данный модуль банов ![]() |
Saymon21 | ||
23.10.2010, 20:36 |
Предложения для развития |
По-моему чистыми скриптами всё это сделать легче, чем огород городить |
Saymon21 | ||
23.10.2010, 14:10 |
Предложения для развития |
Ок. Добавлю. |
Saymon21 | ||
22.10.2010, 9:16 |
Ошибки текущей версии хаба Обнаруженные ошибки публикуются в этой теме |
Да, действительно, есть такое дело. Это происходит вот из-за чего: Код (error)[Fri Oct 22 00:42:56 2010|831] (0) cDCServer: Error in Choose function: 10038 Для того чтобы отлаживать poll я добавил логирование ошибки для функции Choose (которая вызывает либо poll, либо select) и сделал принудительную остановку хаба в случае наличия ошибки. Если порт уже занят, то как раз и возникает ошибка в функции Choose (в функции select). Так как poll уже реализован и отлажен, то в следующей версии уберу логирование и остановку, то есть верну старый функционал (записал себе в TODO) ![]() |
Nickolya, Saymon21 | ||
19.10.2010, 9:24 |
Скрипт банов для RusHub тестим и комменьтруем |
действительно бредятина какая-то была написана подправил |
Saymon21 | ||
8.10.2010, 14:08 |
Вопросы Разработчикам Скриптов вопросы по скриптам (мелкие вопросы) |
Цитата Для выполнения запроса эта функция перебирает все индексы таблицы. Именно поэтому, если в таблице только целочисленные индексы (с дырами или без), то лучше использовать цикл: Код for k, v in pairs(tTable) do ... end а не цикл: Код for i = 1, table.maxn(tTable) do ... end Так как в последнем случае мы фактически пробегаемся по циклу 2 раза. |
Saymon21 | ||
7.10.2010, 13:33 |
DiapasonGag тихая заглушка по диапазону (удобно против динамич. IP) |
А попробовать самому подвигать и потестировать руки не позволяют? |
Dimon21 | ||
5.10.2010, 21:42 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.2.5 Added: Добавлены миллисекунды в логе Fixed: Исправлен баг в счётчике закрытых соединений, который сильно влиял на производительность Fixed: Проведена оптимизация основного цикла |
Nickolya, PomanoB, ExC0tiC, Saymon21 | ||
5.10.2010, 7:16 |
Модуль GeoCity Определяем местоположение по IP с точностью до города |
а собственно в чем проблема то? [attachment=5075:locations.rar] |
alex82 | ||
4.10.2010, 9:13 |
Вопросы Разработчикам Скриптов вопросы по скриптам (мелкие вопросы) |
Код for i,v in ipairs(TableN) do if v == name then // ... end end Однако лучше сделать другую структуру таблицы: Код local TableN = { в этом случае не нужен будет цикл:["Ник1"] = true, ["Ник2"] = true, ["Ник3"] = true, } Код if TableN[name] then // ... end |
Saymon21 | ||
23.9.2010, 10:09 |
Способы Повышения Производительности методы оптимизации lua кода |
Частое действие в скриптах - это проверка сообщения чата на ввод пользователем какой-либо команды. Практически в каждом скрипте делается данная проверка. Данное действие должно быть максимально оптимизировано. Наиболее оптимизированный вариант: Код function ChatArrival(tUser, sData) local iPos = #tUser.sNick + 4 if sData:sub(iPos, iPos):find('!', 1, true) then --поиск префикса команды -- дальнейшие действия (в том числе поиск и сравнение команд) end end В чём преимущество? В таком использовании метод find работает очень эффективно, так как, во-первых, регулярные выражения отключены, во-вторых, строки сравниваются блоками в памяти (такое сравнение практически мгновенное). Представим на мгновение что поиск команд осуществляется каждый раз, когда мы пишем сообщение в чат, да ещё и не один раз, а столько раз, в скольких скриптах используются команды. Предложенный вариант поиска основан на поиске единого префикса команд, ведь команды юзаются пользователями относительно редко, а сообщения чата практически никогда не начинаются с указанного префикса. Применяя предложенный вариант в своих скриптах, мы по максимуму оптимизируем события чата |
Nickolya, Invisible, PomanoB, Alexey, Saymon21, MIKHAIL | ||
14.9.2010, 13:41 |
Чат Комнаты API2 | Возможно создать несколько чат комнат |
Код ["sMsgEnter"] = [[много много очень много строк]], |
VNoName | ||
12.9.2010, 21:28 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.2.4 lua plugin v 1.25 Added: Добавлен параметр пользователя: время входа (iEnterTime - время отсылки клиентом на хаб команды $Key) Added: Добавлен отдельный объект для получения настроек в глобальном окружении Lua: Config. Например, имя бота можно теперь получить так: Config.sHubBot Fixed: Исправлено падение при удалении папки scripts в Lua плагине Fixed: Перепроверены все возможные "массовые" события Fixed: Поправлена регистрация бота с недопустимыми символами в нике. Fixed: Подправлен файл luaconf.h в Lua плагине для unix. Добавлена возможность поиска модулей в папке libs Fixed: Поправлен баг в событии OnValidateNick (возвращаемое значение) Fixed: Оптимизирована функция изменения размера хеш-таблицы (AutoResize) Fixed: Подправлены исходники под сборку на vs2010 Fixed: Оптимизированы некоторые функции хаба. В целях ускорения работы в настройках нужно поставить параметр iStepDelay = 0. Если хаб не нагружен, то обнуление данного параметра может вызвать некоторую нагрузку на процессор. |
Nickolya, Invisible, Артём, PomanoB, ExC0tiC, Saymon21 | ||
12.9.2010, 14:35 |
Ваши Вопросы И Предложения По Поводу Форума |
эм... а что предложенный мною вариант чем-то плох? Вроде ничего лучше придумать и нельзя. [attachment=5009:screen.png] Для lua конечно цвета нужно будет подправить, а так в принципе всё отлично смотрится. |
Invisible | ||
12.9.2010, 13:05 |
Ваши Вопросы И Предложения По Поводу Форума |
Вот изменения, которые нужно сделать чтобы прикрутить geshi на ipb 2.3.6: Я у себя на ipb 2.3.5 попробовал, и действительно работает ![]() Однако, там только для тэга codebox, но думаю, что для тэга code это также легко делается ![]() |
Invisible, Saymon21 | ||
31.8.2010, 17:21 |
Hub's Big Ass Bot API2 | HUBBABOT v.2.28 |
если скрипт из первого поста, то 71 строка: Код tRulesText = string.gsub(tRulesText, "%[ROLE%]", tCheck[sUser.iProfile][2]) нужно написать так: Код tRulesText = string.gsub(tRulesText, "%[ROLE%]", tCheck[sUser.iProfile] and tCheck[sUser.iProfile][2] or "unknown") |
OLGA | ||
31.8.2010, 12:15 |
Предложения для развития |
Реквестую аналог параметра птоки Сделаю.Код iLoginTime - User login time in seconds from 1.1.1970 Тогда уж и пусть запоминает и выдаёт даты максимальной шары (вместе с самой шарой) и максимального количества юзеров (вместе с самим количеством) за всё время работы РусХаба с первого включения и всё то же самое - за текущую сессию. Это планируется реализовать в пункте "Функция статистики и информации о сервере" TODOЭтого так сильно не хватало в Птоке. Есть предложение добавить новую функцию типа Core.AddCmd(sCmd, sFunc) Эта функция будет оптимизировать обработку команд, так как зачастую почти в каждом скрипте мы парсим команды в событии OnChat. При помощи этой функции можно будет добавлять команду и функцию, которая будет выполняться, если поступила данная команда. Наверное нужно сделать для каждого скрипта свой внутренний список, в который будут добавляться команды, и таким образом, команды с одинаковыми именами смогут существовать в различных скриптах и выполнять различные функции (при поступлении команды). Введя такую функцию предполагается снять нагрузку на обработку события OnChat. Пример: Код function OnStartup() Core.AddCmd("regme", "Regme") end function Regme(UID, tParams) local sPass = tParams[1] if sPass then AddReg(UID.sNick, sPass) end end function AddReg(sNick, sPass) ... end В данном примере в функцию Regme автоматически подставятся аргументы: UID пользователя и tParams - параметры команды По умолчанию я думаю зашить префиксы команд + и !, и возможно следует сделать функцию, которая будет менять или добавлять префиксы (я пока что ещё с этой идеей не переспал). Стоит ли это делать я на данный момент не знаю. |
Nickolya, mariner, Saymon21 | ||
22.8.2010, 15:04 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.2.3 Fixed: Исправлен баг (падение хаба), который возникал при дисконнекте пользователя, который находился в процессе получения списока пользователей хаба. Fixed: Исправлена задержка в отправке команд, которая составляла 0.1 - 1 сек. |
Nickolya, Invisible, ExC0tiC, BeN, Saymon21 | ||
21.8.2010, 22:08 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.2.2 Fixed: Исправлена ошибка в отправке данных при блокировке. Added: Добавлен кэш при массовой рассылке. |
Nickolya, Invisible, ExC0tiC, BeN, Saymon21 | ||
20.8.2010, 11:13 |
Скрипт запрета в никах заглавных букв |
Валидация отсутствует при QuickList |
Saymon21 | ||
16.8.2010, 15:20 |
Определение профиля получателя сообщения |
Код local tToUser = Core.GetUser(to) if tToUser then local iProfile = tProfiles[tToUser.iProfile] if iProfile and iProfile == 1 then ... end end |
Damaks | ||
7.8.2010, 19:20 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.2.1 lua plugin v 1.24 Fixed: Исправлена ошибка в таймерах. Fixed: Подкорректированы исходники под сборку на линуксе |
Nickolya, Invisible, PomanoB, ExC0tiC, BeN, Saymon21 | ||
3.8.2010, 9:01 |
С Днюхой Тебя! поздравления |
Присоединяюсь. Креативности креативному админу ![]() |
X-Sky | ||
31.7.2010, 12:52 |
Нужен скрипт ставящий люб приставку перед ником! Чтоб она везде отображался на хабе |
Префиксы для ников можно сделать только для отображения в чате. В юзер-листе изменить ник нельзя. Конечно если извратиться, то можно скрыть пользователя из юзер-листа командой $Quit, и вместо этого занести при помощи команды $MyINFO юзера с изменённым ником. Но в птохе нужно будет по таймеру скрывать постоянно старый ник, так как клиент время от времени отсылает на хаб MyINFO и хаб рассылает всем, поэтому скрытый ник может появится. Но сокрытие ника прибавит гемора, так как отсылка ПМ такому нику не будет доходить до пользователя, да и получить список файлов у такого пользователя будет нельзя. Я как-то, когда писал хаб, пытался попробовать изменить ник на стадии входа на хаб, но тут дело в том, что клиент отсылает на хаб свой ник в команде $ValidateNick [Ник] и надеется получить от хаба подтверждение командой $Hello [Ник], причём со своим ником, и пока клиент не получит команду $Hello со своим ником, он не будет ничего делать. Некоторые обходы этого есть в hex хабе, однако и hex хаб отсылает в команде $Hello реальный ник клиента и только после этого начинает манипулировать никами. |
van21 | ||
28.7.2010, 22:48 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.2.0 lua plugin v 1.23 Fixed: Исправлен баг в работе таймеров. Fixed: Переделаны алгоритмы работы таймеров и списков задач. Fixed: Установлено ограничение: максимум 100 таймеров / скрипт. При превышении ограничения скрипт отключается с добавлением ошибки в лог ошибок. Added: Функция AddTimer теперь возвращает количество зарегистрированных таймеров с указанными id (то есть добавлен контроль за числом таймеров в скрипте) - это если всё ок, если ошибка, то как и раньше nil и сообщение об ошибке. Added: Функция DelTimer теперь возвращает количество удалённых по id таймеров. Added: Оптимизированы некоторые процессы (в частности парсинг MyINFO и получение параметра объекта UID). |
Nickolya, Invisible, Otshelnik-Fm, ExC0tiC, Saymon21 | ||
28.7.2010, 19:16 |
HubTopic Скрипт показывающий ваш текст в строке состояния |
ну так замени | на | сколько раз уже натыкались на эти грабли?))) Код Core.SendToUser(UID,"$UserCommand 1 3 "..tCfg.Menu.."\\Установить тему$<%[mynick]> !хабтопик %[line:Введите тему чата]|") |
Otshelnik-Fm | ||
28.7.2010, 9:17 |
HubTopic Скрипт показывающий ваш текст в строке состояния |
Для смены топика можно использовать функцию: Код Core.SetConfig("sTopic", "Новый топик") Эта функция автоматически изменяет топик (приписку к имени хаба) в настройках и отправляет всем пользователям хаба команду $HubName с именем хаба и изменённым топиком, а новые пользователи при входе на хаб будут видеть уже изменённый топик. Кстати, для того, чтобы не отсылать контекстные менюшки при входе, а отсылать только по команде нужно писать так: Код function OnUserEnter(UID) if sHubTopic then Core.SendToUser(UID,"$HubTopic "..sHubTopic) end --ContextMenu(UID) end То есть НЕ вызывать функцию ContextMenu при входе. Функция ContextMenu будет автоматически вызываться скриптом ContextMenu при отсылке нужной команды. Вот это действительно будет экономия трафика и нагрузки. |
Nickolya, Saymon21 | ||
27.7.2010, 9:13 |
Мелкие вопросы |
Попробуй повыводить запросы к бд, и попробуй повыполнять запросы не через хаб, а например через phpMyAdmin. У меня сейчас посмотреть в чём проблема нет возможности. |
Saymon21 | ||
26.7.2010, 21:29 |
Ошибки текущей версии хаба Обнаруженные ошибки публикуются в этой теме |
Такс... Ошибка почти такая же как и уже была, когда хаб падал при добавлении задачи в очередь при процессе прохождения очереди. Тут тоже самое но со списком таймеров. Ошибка из-за добавления таймера в процессе выполнения другого таймера. Ошибку постараюсь исправить как можно быстрее. Ставлю себе приоритет бага как critical со сроком выполнения в 2 дня (до четверга) ![]() Кстати, сразу же заметил что также не работает функция удаления таймера при выполнении другого таймера (уже исправил в след. версии). Отсюда сразу же видны ограничения которые нужно будет ввести для случая намеренного увеличения таймеров. На данный момент таймеры можно добавлять пока не кончится оперативная память - это потенциальная уязвимость хаба. Будет введено ограничение: максимум 100 таймеров на скрипт. |
Saymon21 | ||
26.7.2010, 15:01 |
ChatHistorySQL История чата (MySQL) |
Каких таблиц? Написано же, что нужно создать базу, а не таблицы. Таблицы скрипт в базе создаёт сам ![]() |
Otshelnik-Fm | ||
24.7.2010, 14:13 |
Есть ли такой скрипт или программа? Есть? |
Nickolya | |||
22.7.2010, 14:08 |
Конвертер рег из YnHub в PtokaX 0.4.1.1 Помогите найти |
В нике запрещены символы: $ | и пробел В пароле запрещен символ | Символ | понятно почему запрещён, так как он является разделителем команд в протоколе. Символ $ запрещён в нике из-за того, что это символ является разделителем параметров в команде $MyINFO, а ник, как нам известно, как раз таки входит в состав MyINFO. Пробел запрещён в нике по той же причине, так как он тоже является разделителем параметров в MyINFO, в частности пробел отделает ник от описания. Про символ | в пароле также понятно, - разделитель команд. Символ $ в пароле вообще говоря может поломать некоторые хабы, поэтому обычно его также запрещают ![]() |
Nickolya, Saymon21 | ||
21.7.2010, 22:39 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.1.9 lua plugin v 1.22 Fixed: Исправлен баг в событии OnUserDisconnected, который приводил к краху после попытки получить параметр пользователя, например ник. Fixed: Исправлены значения по умолчанию для отсутствующих параметров MyINFO строки. Теперь значение по умолчанию равно nil. Примерчик вполне валидной MyINFO строки ![]() Код sMyINFO = $MyINFO $ALL Nick $ $$$$ iShare = 0 sMode = nil sDesc = sEmail = sTag = nil sConn = iByte = 0 sClientName = nil sClientVersion = nil iSlots = nil iUsHubs = nil iRegHubs = nil iOpHubs = nil iLimit = nil iOpen = nil iBandwidth = nil iDownload = nil sFraction = nil |
Nickolya, Invisible, ExC0tiC, Saymon21 | ||
18.7.2010, 13:31 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.1.8 lua plugin v 1.21 Added: Сделан парсинг MyINFO. Added: Добавлен параметр UID.sSupports. Fixed: Убран автозапуск скриптов. Fixed: Исправен баг функции os.date путём копирования файла loslib.c из lua 5.2 (там этот баг исправлен). Fixed: Сделана установка MyINFO до события OnMyINFO, а не после как было раньше. Fixed: Исправлено падение при пустом описании в MyINFO. Fixed: Исправлено падение при помещении в папку plugins некорректного плагина. Fixed: Добавлена проверка корректности пользователя в функцию Core.SendToUser. Парсинг MyINFO позволяет получать следующие параметры (перечисляю все допустимые). Важное замечание! Если пользователь ещё до конца не вошёл на хаб, то многие из этих параметров могут быть равны nil. В частности, если, например, мы в событии OnValidateNick попытаемся получить UID.iShare, или UID.sMyINFO, или какой-либо другой параметр MyINFO строки, то мы получим nil, так как на этой стадии входа ещё не определён параметр sMyINFO, он будет определён на одной из последующих стадий (см. описание протокола NMDC и последовательность входа на хаб). Код UID.sNick - ник UID.sIP - ip UID.iProfile - профиль UID.bInOpList - в оплисте UID.bInIpList - в ip листе UID.bInUserList - вошёл на хаб UID.bHide - скрыт UID.iPort - порт хаба UID.iPortConn - порт соединения UID.sMacAddress - мак адрес UID.sVersion - версия протокола UID.sData - вспомогательное текстовое поле для различных нужд UID.UID - UID юзера (lightuserdate) UID.sSupports - параметр $Suppurts команды UID.sMyINFO - MyINFO строка UID.sDesc - описание UID.sTag - тэг UID.sClientName - название клиента UID.sClientVersion - версия клиента UID.sMode - режим UID.iUsHubs - обычные хабы UID.iRegHubs - рег хабы UID.iOpHubs - оп хабы UID.iSlots - слоты UID.iLimit - ограничитель скорости скачивания с пользователя (L:x) UID.iOpen - открытые экстра слоты (O:x) UID.iBandwidth - ограничитель скорости скачивания с пользователя (B:x) UID.iDownload - ограничитель скорости скачивания пользователем (D:x) UID.sFraction - ограничитель скорости скачивания пользователем/с пользователя (F:x/y) UID.sConn - соединение UID.iByte - магический байт UID.sEmail - email UID.iShare - шара в байтах Устанавливать можно пока только следующие параметры: Код UID.iProfile UID.sMyINFO UID.bInOpList UID.bInIpList UID.bHide UID.sData |
Nickolya, Invisible, Maximum, ExC0tiC, Alexey, Sekretchik, Saymon21 | ||
17.7.2010, 15:18 |
Ошибки текущей версии хаба Обнаруженные ошибки публикуются в этой теме |
решил взять исправленную библиотеку oslib из lua 5.2. Там этот баг исправлен, и если в функции os.date встречается неизвестный параметр, то возникает lua ошибка и скрипт просто останавливается. В логе будет что-то на подобии следующей записи: Код ...ug/scripts/Dynamic_Downloads_1.0e_L5.1.lua:96: bad argument #1 to 'date' (invalid conversion specifier '%s ') |
Nickolya, Saymon21 | ||
16.7.2010, 16:24 |
Вопросы по RusHub Технические вопросы |
ок. сделаю. Тем более, что эта строка хранится в структуре юзера, просто не сделан доступ в lua. Кстати, автозапуск новых скриптов по твоему же реквесту я убрал ![]() ![]() |
Nickolya | ||
15.7.2010, 20:42 |
Ошибки текущей версии хаба Обнаруженные ошибки публикуются в этой теме |
хехе Данный баг не связан с рус хабом. Это баг в lua. Проверил на чистом lua - тоже падает. Баг в функции os.date. В частности баг даёт о себе знать если подставить неверный параметр, например os.date("%s") Существующие параметры: %A, %a, %B, %b, %c, %d, %H, %I, %j, %m, %M, %p, %S, %U, %W, %w, %X, %x, %Y, %y, %Z, %z, %% Как видим параметра %s в этом списке нету. Функция будет падать при любом отсутствующем в этом списке параметре если его ставить после процента Тогда возникает вопрос почему же в птохе не падает? Видимо РРК там что-то подкрутил, так как даже на чистом луа падает ![]() |
Saymon21 | ||
13.7.2010, 22:06 |
Чат бот для greylink |
Код DC():SendPublicMessage(huburl, mini_table["answer"][math.random(1,table.getn(mini_table["answer"]))]:gsub("%[NICK%]", userInfo.NI)) |
KURAGE | ||
13.7.2010, 21:52 |
Ошибки текущей версии хаба Обнаруженные ошибки публикуются в этой теме |
Баги с падением хаба, о которых было написано в предыдущем моём посте, в текущей версии lua плагина (1.20) устранены. Однако, нашел ещё небольшой баг. Заключается он в следующем: в событии OnMyINFO у пользователя НЕ только что присланная на хаб MyINFO строка, а предыдущая. Другими словами, сейчас MyINFO записывается после отработки события OnMyINFO, что является в корне не правильным, так как именно в данном событии по большому счёту и осуществляются различные проверки параметров пользователя. В следующей версии это будет исправлено. Плюс в следующей версии наконец таки будет сделан парсинг MyINFO строки и возможность получать в скриптах параметры MyINFO строки. Некое резюме по поводу события OnMyINFO и парсинга MyINFO строки: Во-первых, стоит отметить, что в новой версии MyINFO строка будет устанавливаться до вызова события OnMyINFO. То есть в событии OnMyINFO можно будет получить актуальные параметры пользователя. Во-вторых, в самом событии OnMyINFO (и не только в этом событии) мы можем переустановить (переопределить) MyINFO строку по своему усмотрению. Делается это простым присвоением UID.sMyINFO = "$MyINFO ...". Самое главное в строке придерживаться правильного синтаксиса (по NMDC протоколу). При этом при переустановке будет автоматически произведён парсинг. Чем важен этот пункт? Да тем, что мы одним движением руки можем изменить, например, описание пользователя, которое содержит рекламу. Кстати, в дальнейшем также планируется и более мощное действие: изменение описания пользователя не установкой MyINFO строки с последующим парсингом и, соответственно, изменением описания, а прямое изменение описания, с последующим восстановлением по всем параметрам MyINFO строки ![]() В-третьих, вернув в событии OnMyINFO значение true, мы тем самым запрещаем хабу рассылать всем пользователям только что изменённую строку MyINFO, причём не важно каким образом была изменения эта MyINFO строка. То есть все её изменения сохраняются, он эти изменения не будут отсылаться пользователям хаба. Это действие также можно использовать в скриптах, например, для сокрытия пользователя. Хотя на хабе предусмотрен более мощный механизм сокрытия, который скрывается пользователя из списка для всех, кроме самого этого пользователя. |
Nickolya, Saymon21 | ||
4.7.2010, 21:20 |
RusHub Кроссплатформенный консольный DC хаб |
lua plugin v 1.20 Fixed: Исправлен баг в очередях задач, который приводил к падению хаба. Работа по оптимизации пока не производилась (возможно в следующей версии проведу). |
Nickolya, Invisible, Otshelnik-Fm, ExC0tiC | ||
26.6.2010, 11:18 |
проблема безопасности помогите решить проблему плиз |
Да, на сервер обязательно нужен фаервол, также желательно у себя иметь фаервол. При попытках ARP атак фаервол обнаружит подмены маков и заблокирует атакующего. Вообще говоря в некоторых локальных сетях админы наблюдают за подобного рода действиями, и успешно обнаруживают использование различного рода снифферов с последующими санкциями физического отключения от сети атакующего. Видимо в вашей сети не практикуются такие действия. Ещё одной мерой борьбы является перевод сети на протокол PPPOE с шифрованием передаваемых данных. Шифрование пароля в DC нельзя сделать, так как по NMDC протоколу не предусмотрено шифрование. |
baralgin | ||
21.6.2010, 12:22 |
Ошибки текущей версии хаба Обнаруженные ошибки публикуются в этой теме |
Предыдущий баг в функции Core.GetGVal пофикшен. На данный момент существуют серьёзные баги, которые могут возникать при ошибках в событиях скриптов OnExit и OnError. Баги приводят к падению хаба, при этом ошибки всё же логируются. Устранение этих багов требует серьёзных изменений способа хранения скриптов в списке. Постараюсь как можно быстрее исправить эти баги. Пока что для того чтобы эти баги не проявлялись, нужно стараться писать скрипты без ошибок в событиях OnExit и OnError. |
Nickolya | ||
19.6.2010, 16:47 |
RusHub Кроссплатформенный консольный DC хаб |
lua plugin v 1.19 Fixed: Исправлено падение хаба при циклическом вызове функций GetGVal/SetGVal (reported by Phazeus). Fixed: Немного оптимизирована работа lua. |
Nickolya, Invisible, ExC0tiC, Saymon21 | ||
2.6.2010, 7:13 |
От: Экзекутор (ekzekutor) От темы с ID: 1403 |
Сделай под русхаб. Большая функциональность - это всегда плюс, если только эта функциональность не приводит к тормозам ![]() |
Saymon21 | ||
30.5.2010, 20:14 |
Logger скрипт логирования всех манипуляций и действий на хабе |
Invisible, Saymon21 | |||
30.5.2010, 19:48 |
Logger скрипт логирования всех манипуляций и действий на хабе |
Название скрипта: Logger Хаб: RusHub Автор: Setuper Описание: Скрипт логирования всех манипуляций и действий на хабе. Сохраняет все команды проходящие через хаб в базу данных sqlite3. Для работы скрипта необходимо установить библиотеку sqlite3 Скрипт работает с lua плагином, начиная только с версии 1.18 [attachment=4556:logger.lua] |
Nickolya, Invisible, Alexey, Saymon21, hipimps71 | ||
30.5.2010, 19:02 |
RusHub Кроссплатформенный консольный DC хаб |
lua plugin v 1.18 Added: В событие OnAny добавлен третьим аргументом тип команды: OnAny(UID, sData, iType). Существующие на данный момент типы: Код 0 - $MultiSearch 1 - $MultiSearch Hub: 2 - $Search Hub: 3 - $Search 4 - $SR 5 - $SR (UDP) 6 - $MyNIFO 7 - $Support 8 - $Key 9 - $ValidateNick 10 - $Version 11 - $GetNickList 12 - Chat 13 - $To 14 - $Quit 15 - $MyPass 16 - $ConnecToMe 17 - $RevConnectToMe 18 - $MultiConnectToMe 19 - $Kick 20 - $OpForceMove 21 - $GetINFO 22 - $MCTo 23 - $UserIP 24 - ping 25 - $Unknown |
Nickolya, Invisible, Otshelnik-Fm, ExC0tiC, Saymon21 | ||
23.5.2010, 21:46 |
sqlite3 win32 | База данных |
Название: sqlite3 Версия библиотеки: devel-0.7 Версия БД: 3.6.23 Авторы: Tiago Dionizio, Doug Currie Описание: Библиотека для подключения базы данных sqlite3. Использование: Содержимое архива sqlite3.rar распаковываем в папку libs. Подключается библиотека так: require"luasql.sqlite3" У некоторых папка luasql уже может быть создана в папке libs и содержать библиотеку mysql.dll, - кладём туда же библиотеку sqlite3.dll. Кроме этого, кладём библиотеку sqlite.dll рядом с екзешником ptokax.exe. Некоторые пользователи не умеют или не хотят ставить базу данных MySQL, поэтому на помощь в данном случае может прийти SQLite ![]() Архив с бибиотекой: [attachment=4533:sqlite3.rar] Пример для проверки: [attachment=4532:test_sqlite3.lua] Для просмотра содержимого базы данных можно использовать Описание функций библиотеки Описание функций библиотеки: Методы объекта среды разработки (env): env:complete(sql) В случае верного синтаксиса SQL команды возвращает true, иначе возвращает false. env:open(filename) или env:connect(filename) Открывает (или создаёт, если не создана) SQLite базу с именем filename и возвращает её хендл, который имеет lua тип userdata (возвращаемый данной функцией объект в дальнейшем используется для вызовов всех методов для данного соединения с базой данных). Пример: Код env = luasql.sqlite3() con = env:open("mybase.db3") -- открытие базы данных -- некоторые действия с базой данных... con:close() -- закрытие базы данных env:close() В случае ошибки, функция возвращает nil, код ошибки и сообщение об ошибке. env:open_memory() Открывает временную базу данных (в памяти) и возвращает хендл, который имеет lua тип userdata. В случае ошибки, функция возвращает nil, код ошибки и сообщение об ошибке. (В памяти база данных изменяется, но никогда не сохраняется на диск.) env:close() Закрывает текущую среду разработки (env). env._VERSION Возвращает строку с информацией о версии SQLite (в формате "x.y[.z]"). Методы объекта соединения (con): После открытия базы данных при помощи метода env:open() или env:open_memory() возвращается хендл этой базы. Открытые базы данных поддерживают следующие методы: con:busy_handler([func [, udata]]) Этот вызов позволяет указать lua функцию-обработчик, которая будет вызываться в случае, если файл базы данных был заблокирован другим процессом или потоком. Если func равен nil, то удаляется ранее установленная функция и любой вызов метода exec вернет состояние занятости env.BUSY немедленно при доступе к заблокированной таблице. Если функция-обработчик указана, то она вызовется с двумя аргументами. Первый аргумент - это указанный в методе busy_handler аргумент udata. Второй аргумент – предыдущее количество вызовов обработчика, при доступе к заблокированному ресурсу. Если обработчик вернул nil, false или 0, то метод exec вернет env.BUSY, в противном случае, метод exec будет пытаться открыть в цикле выполнить свой запрос. По умолчанию обработчика нету. Sqlite реентерабельна, и в обработчике возможно выполнять запросы. Не совсем понятно, зачем это может пригодиться, но в теории это возможно. Обработчик не должен закрывать файл базы данных. Закрытие базы из обработчика вызовет удаление структур вышестоящего запроса и может привести к аварийному завершению. con:busy_timeout(t) Этот вызов позволяет установить время t в миллисекундах, которое нужно подождать в случае если транзакция не была завершена (файл базы данных был заблокирован другим процессом или потоком). Вызов этого метода удалит все функции-обработчики, установленные методом busy_handler. Вызов этого метода с аргументом меньше либо равном 0 отключит все функции-обработчики. con:close() Закрывает базу данных. Все sql запросы, использующие con:prepare(), завершаются при вызове данного метода. Метод возвращает env.OK в случае успеха, и числовой код ошибки в случае неудачи. con:create_aggregate(name, nargs, step, final) Этот метод создаёт функцию обратного вызова. Функция вызывается для каждой строки запроса. Аргумент name - это строка, которая содержит имя создаваемой sql функции. Аргумент nargs - это число аргументов у sql функции. Аргумент step - это непосредственно lua функция, которая будет выполняться для каждой строки запроса, эта функция вызывается с аргументом context и аргументами sql функции. Аргумент final - это функция, которая будет вызываться один раз в самом конце запроса, эта функция вызывается с один аргументом - context. Пример использования: Код con:exec[[ CREATE TABLE numbers(num1, num2); INSERT INTO numbers VALUES(1, 11); INSERT INTO numbers VALUES(2, 22); INSERT INTO numbers VALUES(3, 33); ]] local num_sum = 0 local function oneRow(context,num) num_sum = num_sum + num end local function afterLast(context) context:result_number(num_sum) num_sum = 0 end con:create_aggregate("do_the_sums", 1, oneRow, afterLast) for sum in con:urows('SELECT do_the_sums(num1) FROM numbers') do Core.SendToAll("Sum of col 1: "..sum) end for sum in con:urows('SELECT do_the_sums(num2) FROM numbers') do Core.SendToAll("Sum of col 2: "..sum) end В результате на экране увидим следующее: Код Sum of col 1: 6 Sum of col 2: 66 con:create_collation(name, func) Этот метод создают сортирующую функцию обратного вызова. Функция обратного вызова нужна для установки порядка сортировки, по большей части за счёт сравнения строк. Аргумент name - это строка, содержащая имя sql сортировки. Аргумент func - это непосредственно lua функция сортировки, принимающая 2 строковых аргумента и возвращающая 0, если строковые аргументы равны, -1 - если первый аргумент "меньше" второго, и 1 - если первый аргумент "больше" второго. Пример использования: Код local function collate(s1, s2) s1 = s1:lower() s2 = s2:lower() if s1 == s2 then return 0 elseif s1 < s2 then return -1 else return 1 end end con:exec[[ CREATE TABLE test(id INTEGER PRIMARY KEY, content COLLATE CINSENS); INSERT INTO test VALUES(NULL, 'hello world'); INSERT INTO test VALUES(NULL, 'Buenos dias'); INSERT INTO test VALUES(NULL, 'HELLO WORLD'); ]] con:create_collation("CINSENS", collate) for row in con:nrows("SELECT * FROM test") do Core.SendToAll(row.id..' '..row.content) end con:create_function(name, nargs, func) Этот метод создаёт функцию обратного вызова. Функция вызывается для каждой строки запроса. Аргумент name - это строка, которая содержит имя создаваемой sql функции. Аргумент nargs - это число аргументов у sql функции. Аргумент func - это непосредственно lua функция, которая будет выполняться для каждой строки запроса, эта функция вызывается с аргументом context и аргументами sql функции. Пример использования: Код con:exec"CREATE TABLE test(col1, col2, col3)" con:exec"INSERT INTO test VALUES(1, 2, 4)" con:exec"INSERT INTO test VALUES(2, 4, 9)" con:exec"INSERT INTO test VALUES(3, 6, 16)" con:create_function("sum_cols", 3, function(context, a, b, c) context:result_number(a + b + c) end)) for col1, col2, col3, sum in con:urows("SELECT *, sum_cols(col1, col2, col3) FROM test") do Core.SendToAll(("%d + %d + %d = %d"):format(col1, col2, col3, sum)) end con:errcode() или con:error_code() Возвращает числовой код (или расширенный код) для недавнего неудавшегося вызова метода базы данных. con:errmsg() или con:error_message() Возвращает сообщение с ошибкой для недавнего неудавшегося вызова метода базы данных. con:exec(sql [, func [, udata]]) или con:execute(sql [, func [, udata]]) или con:query(sql [, func [, udata]]) Составляет и выполняет sql запрос, указанный в первом аргументе этого метода. Запросы просто выполняются друг за другом не сохраняясь. Функция возвращает env.OK в случае успеха и числовой код ошибки в случае неудачи. Если один или несколько утверждений являются запросами, и если во втором параметре данного метода указана функция func, то эта функция выполнится для каждой строки результатов запроса. Эта функция будет вызываться с 4 аргументами: udata (третий аргумент метода exec), числом колонок в строке(cols), таблицей (values), содержащей все данные всех колонок, и другой таблицей (names), содержащей имена всех колонок. Эта функция должна возвратить 0. Если она вернёт не 0, то запрос будет считаться прерванным. Все последующие запросы не будут выполняться, а метод exec вернёт код env.ABORT. Пример использования: Код local sql = [[ CREATE TABLE numbers(num1, num2, str); INSERT INTO numbers VALUES(1, 11, 'ABC'); INSERT INTO numbers VALUES(2, 22, 'DEF'); INSERT INTO numbers VALUES(3, 33, 'UVW'); INSERT INTO numbers VALUES(4, 44, 'XYZ'); SELECT * FROM numbers; ]] function showrow(udata, cols, values, names) assert(udata == "test_udata") Core.SendToAll("exec:") for i = 1, cols do Core.SendToAll(names[i]..' '..values[i]) end return 0 end con:exec(sql, showrow, "test_udata") con:interrupt() Этот метод прерывает выполнение операции базы данных. Метод ничего не возвращает. con:isopen() или con:isconnect() Этот метод возвращает true, если база открыта, иначе возвращает false. con:last_insert_rowid() Этот метод возвращает идентификатор строки последнего INSERT запроса. Если INSERT запрос никогда не выполнялся, то метод возвращает 0. Каждая строка в SQLite таблице имеет уникальный 64-битный целочисленный ключ 'rowid'. Этот идентификатор всегда доступен по имени ROWID, OID, или _ROWID_. Если таблица имеет поле с типом INTEGER PRIMARY KEY, то эта колонка является псевонимом для 'rowid'. Если INSERT выполняется внутри триггера, то идентификатор rowid вносимой строки будет возвращаться так долго, как долго будет работать тригер. Как только триггер завершит свою работу вернётся то значение, которое было до работы триггера. con:nrows(sql) Метод создаёт итератор, который возвращает последующие строки, выбирая их из запроса sql. Каждый вызов итератора возвращает таблицу, ключами которой являются поля таблицы, а значениями - значения этих полей. Пример использования: Код con:exec[[ CREATE TABLE numbers(num1, num2); INSERT INTO numbers VALUES(1, 11); INSERT INTO numbers VALUES(2, 22); INSERT INTO numbers VALUES(3, 33); ]] for a in con:nrows("SELECT * FROM numbers") do for i,v in pairs(a) do Core.SendToAll(i..": "..v) end end Результаты работы: Код num2: 11 num1: 1 num2: 22 num1: 2 num2: 33 num1: 3 con:prepare(sql) Данный метод компилирует sql утверждение во внутренне представление и возвращает cur объект (курсор) типа userdata для дальнейших операций. con:progress_handler(n, func, udata) Этот метод устанавливает функцию обратного вызова func, которая выполняется периодически в течение длинных вызовов метода con:exec() или cur:step(). Вызов функции происходит каждые n операций, где n передаётся в качестве первого аргумента в указанную функцию. udata передаётся в качестве второго аргумента. Если действий в методе con:exec() или cur:step() меньше n, то функция обратного вызова не будет выполняться. Только одна функция обратного вызова может быть зарегистрирована для каждой открытой базы данных. Повторный вызов данного метода перезапишет прежде установленную функцию. Для того, чтобы удалить функцию обратного вызова, достаточно в методе вторым аргументом указать nil. Если функция обратного вызова возвращает значение, отличное от 0, то текущий запрос незамедлительно прерывается и база данных откатывается назад, а метод con:exec() или cur:step() вернёт число env.INTERRUPT. Данный метод может быть использован для отмены длительных запросов. con:rows(sql) Метод создаёт итератор, который возвращает последующие строки, выбирая их из запроса sql. Каждый вызов итератора возвращает таблицу, ключами которой являются номера полей таблицы, а значениями - значения этих полей. Пример использования: Код con:exec[[ CREATE TABLE numbers(num1, num2); INSERT INTO numbers VALUES(1, 11); INSERT INTO numbers VALUES(2, 22); INSERT INTO numbers VALUES(3, 33); ]] for a in con:rows("SELECT * FROM numbers") do for i,v in pairs(a) do Core.SendToAll(i..": "..v) end end Результаты работы: Код 1: 1 2: 11 1: 2 2: 22 1: 3 2: 33 con:total_changes() Этот метод возвращает общее число строк, которое было модифицировано при помощи INSERT, UPDATE или DELETE, за всё время, в течение которого база была открытой. Сюда также включаются операции в триггерах. Изменения записываются как только выполняется любой из вызовов cur:reset() или cur:finalize(). con:trace(func, udata) Этот метод устанавливает функцию трассировки. func - это lua функция, которую вызывает SQLite до разбора sql утверждения. В эту функцию передаются 2 аргумента. Первый - это аргумент udata, второй - это строка с sql утверждением. con:urows(sql) Метод создаёт итератор, который возвращает последующие строки, выбирая их из запроса sql. Каждый вызов итератора возвращает значения всех полей данной строки. Пример использования: Код con:exec[[ CREATE TABLE numbers(num1, num2); INSERT INTO numbers VALUES(1, 11); INSERT INTO numbers VALUES(2, 22); INSERT INTO numbers VALUES(3, 33); ]] for a, b in con:urows("SELECT * FROM numbers") do Core.SendToAll(a..": "..b) end Результаты работы: Код 1 11 2 22 3 33 con:commit() Метод выполнения (завершения) текущей транзакции. Возвращает true в случае успеха, nil и сообщение ошибки - в случае, когда транзакция не может быть завершина или база данных не поддерживает транзакции. con:rollback() Метод отката на предыдущую транзакцию. Возвращает true в случае успеха, nil и сообщение ошибки - в случае, когда операция не может быть выполнена или база данных не поддерживает транзакции. con:setautocommit(boolean) Метод включения/отключения автоматических транзакций. Эта функция не может работать в базах, на которых не осуществляются транзакции. В базах данных, на которых нет понятия режима автоматических транзакций, этот механизм осуществляется драйвером. Метод возвращает true в случае успеха, и вызывает ошибку - в случае невыполнимости или неосуществимости. Методы объекта курсор (cur): После создания подзапроса при помощи метода con:prepare(), к этому подзапросу можно применять следующие методы: cur:bind(n [, value]) Связывает данные value с переменной n в запросе. Если тип данных value является строкой или числом, то эти данные связываются как text или double соответственно. Если типом данных переменной value является тип boolean или эта переменная равна nil или вовсе отсутствует missing, то предыдущая связь удаляется. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи. cur:bind_blob(n, blob) Связывает строку blob (которая может быть бинарной строкой) с параметром n. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи. cur:bind_names(nametable) Связывает параметры запроса с данными таблицы nametable. Если есть параметры запроса вида ":AAA" или "$AAA", то ищутся соответствующие поля таблицы, если параметры в запросе не именованные, то ищутся числовые поля таблицы nametable. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи. cur:bind_parameter_count() Возвращает максимальный индекс подзапроса. Если параметры подзапроса имеют вид ":AAA" или вид "?", то назначается последовательно увеличивающееся число, начинающиеся с 1, так что возвращаемая величина является количеством параметров. Тем не менее если одно и тоже имя используется в подзапросе несколько раз, то все повторные имена не считаются, то есть возвращается величина, являющаяся числом уникальных параметров в подзапросе. Если какой-либо параметр подзапроса имеет вид "?NNN" (где NNN - целое число), то могут быть промежутки в нумерации и возвращаемая величина будет равна индексу параметра подзапроса с самой большой индексной величиной. cur:bind_parameter_name(n) Возвращает имя n-го параметра подзапроса stmt. Параметры ":AAA", "@AAA", "$VVV" будут иметь имена ":AAA", "@AAA", "$VVV", соответственно. Другими словами, символы ":", "$" и "@" включаются в имя. Параметры "?" и "?NNN" не имеют имени. Первый связанный параметр имеет индекс 1. Если величина n за допустимыми рамками, или если n-ый параметр не имеет имени, то возвращается nil. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи. cur:bind_values(value1, value2, ..., valueN) Связывает указанные данные с параметрами подзапроса. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи. cur:columns() или cur:numcols() Возвращает количество колонок в результатах запроса, или 0, если подзапрос не возвращает ничего. cur:finalize() Эта функция завершает подзапрос. Если поздапрос выполнился успешно или не выполнился, то функция возвращает env.OK, в случае неудачи возвращает численный код ошибки. cur:get_name(n) или cur:getcolname(n) Возвращает имя n-ого столбца в результатах подзапроа (номер самого левого столбца - 0). cur:get_named_types() или cur:getcolntypes() Возвращает таблицу с именами и типами всех столбцов подзапроса. cur:get_named_values() или cur:getcolnvalues() Возвращает таблицу с именами и данными текущей строки результатов подзапроса. cur:get_names() или cur:getcolnames() Возвращает массив с именами всех столбцов в результатах подзапроса. cur:get_type(n) или cur:getcoltype(n) Возвращает тип n-ого столбца подзапроса (номер самого левого столбца - 0). cur:get_types() или cur:getcoltypes() Возвращает массив с типами всех столбцов подзапроса. cur:get_unames() или cur:getcolunames() Возвращает имена всех столбцов подзапроса. cur:get_utypes() или cur:getcolutypes() Возвращает типы всех столбцов подзапроса. cur:get_uvalues() или cur:getcoluvalues() Возвращает данные всех столбцов текущей сроки подзапроса. cur:get_value(n) или cur:getcolvalue(n) Возвращает данные n-ого столбца подзапроса (номер самого левого столбца - 0). cur:get_values() или cur:getcolvalues() Возвращает массив данных всех столбцов подзапроса. cur:isopen() или cur:isconnect() Возвращает true, если запрос ещё открыт (не заверщён при помощи метода finalize), иначе возвращает false. cur:close() Закрывает текущий курсор (cur). cur:nrows() Возвращает итератор, который возвращает последующие строки, выбирая их из подзапроса. Каждый вызов итератора возвращает таблицу, ключами которой являются поля таблицы, а значениями - значения этих полей. cur:reset() Этот метод восстанавливает подзапрос, для того чтобы он был выполнен. Переменные, которые были связаны при помощи методов cur:bind*() сохраняют свои значения. cur:rows() Возвращает итератор, который возвращает последующие строки, выбирая их из подзапроса. Каждый вызов итератора возвращает таблицу, ключами которой являются номера полей таблицы, а значениями - значения этих полей. cur:step() Этот метод должен быть вызван для того чтобы оценить следующую итерацию подзапроса. Она возвращает одо из следующих значений: env.BUSY: база данных была занята. Если подзапрос подтверждён (COMMIT), то вы можете повторить запрос, в противном случае можно откатиться на предыдущую транзакцию. env.DONE: подзапрос успешно завершил работу (finalize). Метод cur:step() не должен вызываться заново, без вызова метода cur:reset(), который сбросит всё на начальное состояние. env.ROW: возвращается всякий раз, когда новая строка с данными готова для обработки вызывающим оператором. Данные могут быть доступны использованием функций доступа к строкам. cur:step(), может вызываться снова, чтобы извлекать следующую строку с данными. env.ERROR: ошибка во время выполнения (например, нарушение ограничений). Метод cur:step() не должен вызываться снова. Более детальную информацию можно посмотреть, вызвав метод con:errmsg(). Более специфический код ошибки может быть получен при вызове метода cur:reset(). env.MISUSE: вызвана неподходящая функция. Такое возможно если предыдущий подзапрос завершил работу (finalize), или предыдущий вызов метода cur:step() вернул env.ERROR или env.DONE. cur:urows() Возвращает итератор, который возвращает последующие строки, выбирая их из подзапроса. Каждый вызов итератора возвращает значения всех полей данной строки. Методы объекта context функций обратного вызова: Объекта context доступен как параметр в функциях обратного вызова методов con:create_aggregate() и con:create_function(). Этот объект обладает следующими методами: ctx:aggregate_count() Метод возвращает число вызовов функции обратного вызова. ctx:get_aggregate_data() Возвращает данные определенного пользователем поля. ctx:set_aggregate_data(udata) Устанавливает данные для определённого пользователем поля. ctx:result(res) Устанавливает результат функции обратного вызова в res. Тип результата зависит от типа res и является числом, или строкой или nil. Все другие величины поднимают сообщение ошибки. ctx:result_null() Устанавливает результат функции обратного вызова в nil. Метод ничего не возвращает. ctx:result_number(number) или ctx:result_double(number) Устанавливает результат функции обратного вызова как число number. Метод ничего не возвращает. ctx:result_int(number) Устанавливает результат функции обратного вызова как целое число number. Метод ничего не возвращает. ctx:result_text(str) Устанавливает результат функции обратного вызова как строку str. Метод ничего не возвращает. ctx:result_blob(blob) Устанавливает результат функции обратного вызова как бинарную строку blob. Метод ничего не возвращает. ctx:result_error(err) Устанавливает результат функции обратного вызова как ошибку err. Метод ничего не возвращает. ctx:user_data() Возвращает userdata параметр поступивший при вызове, чтобы устанавливать функцию возврата (см. описания методов con:create_aggregate() и con:create_function()). В заключении приведу числовые коды ошибок: Код env.OK: 0 env.ERROR: 1 env.INTERNAL: 2 env.PERM: 3 env.ABORT: 4 env.BUSY: 5 env.LOCKED: 6 env.NOMEM: 7 env.READONLY: 8 env.INTERRUPT: 9 env.IOERR: 10 env.CORRUPT: 11 env.NOTFOUND: 12 env.FULL: 13 env.CANTOPEN: 14 env.PROTOCOL: 15 env.EMPTY: 16 env.SCHEMA: 17 env.TOOBIG: 18 env.CONSTRAINT: 19 env.MISMATCH: 20 env.MISUSE: 21 env.NOLFS: 22 env.FORMAT: 24 env.RANGE: 25 env.NOTADB: 26 env.ROW: 100 env.DONE: 101 |
Nickolya, intlive, Ksan, Alexey, Saymon21, forZejkee | ||
21.5.2010, 17:41 |
С Днюхой Тебя! поздравления |
Стоял я в очередь за стеком, Готов был съесть дистрибутив, Но Nickolya погибнуть не дал, Свой бутерброд он разломил! Он такой от мирозданья, Он просто рыцарь Винды, И всех скриптов он есть дыханье, Пью за элитный ум страны! С днём рождения! |
Nickolya, Maximum, X-Sky | ||
17.5.2010, 20:01 |
DC++ FAQ Часто Задаваемые Вопросы |
Хватит оффтопить. Уже надоедает удалять. Буду банить! |
Saymon21 | ||
8.5.2010, 21:13 |
Дисконектер |
Правильнее написать так: Код function ValidateNickArrival(tUser,data) Core.SendToUser(tUser, "Хаб на реконструкции") Core.Disconnect(tUser) end UserConnected, RegConnected = ValidateNickArrival, ValidateNickArrival Последовательности входов могут быть разными. См. Вход на хаб при поддержке характеристики QuickList. Птоха поддерживает эту характеристику. И при такой последовательности валидация ника отсутствует! |
Serx, Drakula, Saymon21, мамин_парень | ||
6.5.2010, 21:00 |
Функции Для Разработчиков склад полезных функций |
Единственное препятствие - это функции сохранения. Однако это легко устраняется. Поэтому не вижу никаких препятствий в установки русской локали. |
Ksan | ||
5.5.2010, 23:54 |
Функции Для Разработчиков склад полезных функций |
Дело в том, что в lua разделителем дробной и целой части является точка (и этот символ не зависит от локали, а является синтаксическим правилом). Поэтому для того чтобы загружать файл при помощи lua функции dofile нужно чтобы внутри файла был исключительно lua формат. Однако если мы сохраняем файл и при этом установлена русская локаль, то явно или неявно функция tostring преобразует разделитель из точки в запятую и после этого загрузить такой файл функцией dofile уже не удастся. Поэтому делаем так: везде используем русскую локаль, установленную один раз, но перед тем как сохранить в файл устанавливаем локаль "C", сохраняем в файл, и после сохранения опять возвращаем русскую локаль. Таким образом стандартную локаль нужно устанавливать только на время сохранения информации в файл (для того чтобы оставить в сохранности lua синтаксис в файле). |
Nickolya, Ksan, Alexey, Saymon21, MIKHAIL | ||
2.5.2010, 11:15 |
Скрипт тестирования множеств в регулярных выражениях |
Стоит подчеркнуть, что результат зависит от установленной локали. То есть, пишем в начале скрипта Код os.setlocale"Russian_Russia.1251" и получаем другой результат ![]() |
Saymon21, Sergey2009 | ||
28.4.2010, 20:14 |
Вопросы Разработчикам Скриптов вопросы по скриптам (мелкие вопросы) |
Код local Table = BanMan.GetBans() for key, value in pairs(Table) do Core.SendToAll( "key = "..tostring(key).. "value = "..tostring(value).. "Table["..key.."] = "..totring(Table[key]) ) end |
intlive, Saymon21 | ||
27.4.2010, 2:38 |
LuaSec win32 - API2 | TLS/SSL/HTTPS |
Название: LuaSec Версия: 0.4 Версия lua: 5.1 Версия API: 2 Разрядность ОС: 32 Описание: OpenSSL библиотека для обеспечения TLS/SSL соединений. Протестировано: на PtokaX 0.4.1.1 Копирайт: Copyright © 2006-2009 Bruno Silvestre Установка: Скопируйте в папку libs файлы ssl.lua и ssl.dll, а также ssl/https.lua для возможности работать с https. Файлы libeay32.dll и ssleay32.dll необходимо разместить рядом с исходником ptokax.exe (ну или как альтернатива - забросить в папку system32 ![]() [attachment=4426:LuaSec.rar] [attachment=4427:samples.rar] |
Nickolya, Invisible, Артём | ||
16.4.2010, 14:32 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.1.7 Fixed: Исправлен баг с падением хаба при загрузке заведомо "левого" плагина. |
Nickolya, derSpinner, Invisible, ExC0tiC, Saymon21 | ||
13.4.2010, 11:41 |
От: mysql От темы с ID: 2952 |
Ты что запихнул эту библиотеку в папку plugins? Написано же: Цитата Содержимое архива mysql_2.1.1.rar распаковываем в папку libs. И без скрипта библиотека не подключается! Падение хаба при неправильных плагинах устраню в ближайшее время. |
derSpinner | ||
12.4.2010, 20:36 |
ChatLogsMySQL API2 | Лог главного чата |
Код v = v:gsub("%%", "%%%%") sMsg = sMsg:gsub(i, v) или просто вот так: Код sMsg = sMsg:gsub(i, (v:gsub("%%", "%%%%"))) |
whuru | ||
11.4.2010, 22:54 |
ChatLogsMySQL API2 | Лог главного чата |
Код sMsg = sMsg:gsub("%%", "%%%%"):gsub(i, "%%s"):format(v) |
whuru | ||
11.4.2010, 20:45 |
NoDescAdv API2 | Удаление рекламы из описания юзеров |
Очень затратно использовать функцию Core.GetUserAllData(tUser). Старайтесь избегать её использования! В данном случае можно было сделать так: Код function UserConnected(tUser) MyINFOArrival(tUser, Core.GetUserValue(tUser, 1)) end RegConnected, OpConnected = UserConnected, UserConnected |
Saymon21 | ||
5.4.2010, 13:23 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.1.6 lua plugin v 1.17 Fixed: Исправлена ошибка, связанная с отключениями за частую отсылку пустых команд, которые прикреплены к другим командам, вместо отключения только за частые пинги. Fixed: Исправлен баг с падением хаба после входа компьютера из спящего режима. Fixed: Исправлен баг в событии OnWebData (перепутанные возвращаемые значения события) Fixed: Для файлов настроек установлены абсолютные пути вместо относительных. Added: В таблице Core добавлено новое поле Core.sSystem, хранящее название и версию системы, на которой работает сервер. Added: Модифицированы возвращаемые значения событий: 1) return false, return nil, return 0 - безусловное выполнение события 2) return true, return 1 - блокировка события 3) return 2 - выполнеие события и блокировка после обхода всех скриптов 4) return 3 - выполнение публичного события для всех соединений, кроме соединения, породившего это событие 5) return 4 - выполнение публичного события для всех соединений, кроме соединений, имеющих такой же ip адрес, что и соединение, породившее это событие Added: К переменной UID теперь привязана метатаблица, поэтому отпадает нужда в функциях Core.GetUser и Core.SetUser, но эти функции сохранены для совместимости и для определения пользователя по нику. Added: Добавлена сборка под x64 системы. Пока что не добавлена встроенная возможность добавления хаба в список сервисов windows (в процессе тестирования). |
Nickolya, derSpinner, Invisible, fixx, Jackson, ExC0tiC, Saymon21 | ||
4.4.2010, 22:08 |
Ошибки текущей версии хаба Обнаруженные ошибки публикуются в этой теме |
По поводу веб-сервера хз. По поводу гибернации, то это будет уже исправлено в следующей версии. С таймерами да - ищется глобальная функция. Так уж устроено. Я подумаю как сделать для любых функций. |
Nickolya | ||
31.3.2010, 20:20 |
Antibot |
Перезалил скрипт, исправив ошибки. |
Nickolya, Invisible, Saymon21 | ||
31.3.2010, 19:16 |
Вопросы Разработчикам Скриптов вопросы по скриптам (мелкие вопросы) |
функция BanMan.GetBans() возвращает таблицу банов, то есть k будет таблицей |
Saymon21 | ||
31.3.2010, 15:51 |
Скрипт для пингеров |
Пингер разъединялся до получения списка пользователей, поэтому не было никаких рекордов и тд. Разъединение происходило после отработки события OnUnknown. Вернув true, мы предотвращаем разъединение. Так уж устроено событие OnUnknown, которое разъединяет всякий раз, если в нём не возвращается true. Сделано это специально для безопасности и от возможных атак на хаб. Скрипт перезалит в первом посту. Качаем и пробуем. Проблем не должно быть ![]() Если по-прежнему будут проблемы с рекордами, то будем дальше разбираться в чём ещё проблемы. |
Nickolya, Saymon21 | ||
31.3.2010, 15:12 |
Ошибки текущей версии хаба Обнаруженные ошибки публикуются в этой теме |
Тестировал на XP с оперой 10.51. Ничего подобного не выявил. Надо 20 раз подряд грузить страницу или что? ================== Я понял откуда ноги растут с секундными задержками. Дело в том, что в ответе на запрос указывается: Connection: close, и, следовательно, браузер ждёт от сервера закрытия соединения. На хабе баг в событии OnWebData так как в описании сказано, что по умолчанию сервер разъединяет клиента после отработки события, а на практике всё с точностью наоборот. То есть, на деле получается, что если событие OnWebData ничего не возвращает, клиент не разъединяется, если же вернуть true, то будет работать всё как надо. В следующей версии это будет исправлено, и по умолчанию всё же будет разъединения клиента, а return true в событии OnWebData будет отвечать за удержание коннекта. |
Nickolya | ||
30.3.2010, 18:38 |
RSS лента |
попробуй: [attachment=4318:FeedWatch.lua] |
Accelerator | ||
30.3.2010, 15:28 |
RegmeEmail API2 | Регистрация через e-mail |
Изменение кодировки: открываем папку libs открываем файл email.lua ищем в этом файле следующие строчки: Код local tMessage = { headers = { to = sTo, from = tVal.sFrom, subject = sSubject, }, body = sMsg } изменяем их на: Код local tMessage = { headers = { to = sTo, from = tVal.sFrom, subject = sSubject, ['content-type'] = 'text/plain; charset="cp1251"' }, body = sMsg } Другими словами, в таблицу headers нужно дописать поле ['content-type'] = 'text/plain; charset="cp1251"' |
Saymon21, striker, GULAM33 | ||
30.3.2010, 14:40 |
Физический адрес и IP вопрос по способу. |
Хаб видит мак-адрес модема. Вот и банит этот мак-адрес. Ну что тут непонятного? Пакеты, которые идут от модема к хабу уже будут содержать мак-адрес модема, а не мак-адрес компа. То есть при переходе через модем мак-адрес изменяется. |
MemberV | ||
30.3.2010, 13:37 |
RusRC Графический интерфейс для управления RusHub'ом |
ошибка "script was contained mistakes" - это сообщение одной из api-функций русхаба. В следующей версии плагина это уже исправлено, и вместо этого будет выдаваться реальная ошибка скрипта, а не сообщение о какой-либо ошибке ![]() |
Saymon21 | ||
24.3.2010, 1:26 |
sqlite3 RusHub | Библиотека базы данных sqlite |
Название: sqlite3 Версия библиотеки: devel-0.7 Хаб: RusHub Версия БД: 3.6.23 Авторы: Tiago Dionizio, Doug Currie Описание: Библиотека для подключения базы данных sqlite3. Использование: Содержимое архива sqlite3.rar распаковываем в папку libs. Подключается библиотека так: require"luasql.sqlite3" У некоторых папка luasql уже может быть создана в папке libs и содержать библиотеку mysql.dll, - кладём туда же библиотеку sqlite3.dll Некоторые пользователи не умеют или не хотят ставить базу данных MySQL, поэтому на помощь в данном случае может прийти SQLite ![]() Библиотека win32: [attachment=4380:sqlite3.rar] Библиотека win64: [attachment=5820:sqlite3_win64.rar] Пример для проверки: [attachment=4381:test.lua](раньше в PtokaX нельзя было создать больше одной таблицы, тут всё создаётся) Для просмотра содержимого базы данных можно использовать Описание функций библиотеки Описание функций библиотеки: Методы объекта среды разработки (env): env:complete(sql) В случае верного синтаксиса SQL команды возвращает true, иначе возвращает false. env:open(filename) или env:connect(filename) Открывает (или создаёт, если не создана) SQLite базу с именем filename и возвращает её хендл, который имеет lua тип userdata (возвращаемый данной функцией объект в дальнейшем используется для вызовов всех методов для данного соединения с базой данных). Пример: Код env = luasql.sqlite3() con = env:open("mybase.db3") -- открытие базы данных -- некоторые действия с базой данных... con:close() -- закрытие базы данных env:close() В случае ошибки, функция возвращает nil, код ошибки и сообщение об ошибке. env:open_memory() Открывает временную базу данных (в памяти) и возвращает хендл, который имеет lua тип userdata. В случае ошибки, функция возвращает nil, код ошибки и сообщение об ошибке. (В памяти база данных изменяется, но никогда не сохраняется на диск.) env:close() Закрывает текущую среду разработки (env). env._VERSION Возвращает строку с информацией о версии SQLite (в формате "x.y[.z]"). Методы объекта соединения (con): После открытия базы данных при помощи метода env:open() или env:open_memory() возвращается хендл этой базы. Открытые базы данных поддерживают следующие методы: con:busy_handler([func [, udata]]) Этот вызов позволяет указать lua функцию-обработчик, которая будет вызываться в случае, если файл базы данных был заблокирован другим процессом или потоком. Если func равен nil, то удаляется ранее установленная функция и любой вызов метода exec вернет состояние занятости env.BUSY немедленно при доступе к заблокированной таблице. Если функция-обработчик указана, то она вызовется с двумя аргументами. Первый аргумент - это указанный в методе busy_handler аргумент udata. Второй аргумент – предыдущее количество вызовов обработчика, при доступе к заблокированному ресурсу. Если обработчик вернул nil, false или 0, то метод exec вернет env.BUSY, в противном случае, метод exec будет пытаться открыть в цикле выполнить свой запрос. По умолчанию обработчика нету. Sqlite реентерабельна, и в обработчике возможно выполнять запросы. Не совсем понятно, зачем это может пригодиться, но в теории это возможно. Обработчик не должен закрывать файл базы данных. Закрытие базы из обработчика вызовет удаление структур вышестоящего запроса и может привести к аварийному завершению. con:busy_timeout(t) Этот вызов позволяет установить время t в миллисекундах, которое нужно подождать в случае если транзакция не была завершена (файл базы данных был заблокирован другим процессом или потоком). Вызов этого метода удалит все функции-обработчики, установленные методом busy_handler. Вызов этого метода с аргументом меньше либо равном 0 отключит все функции-обработчики. con:close() Закрывает базу данных. Все sql запросы, использующие con:prepare() завершаются при вызове данного метода. Метод возвращает env.OK в случае успеха, и числовой код ошибки в случае неудачи. con:create_aggregate(name, nargs, step, final) Этот метод создаёт функцию обратного вызова. Функция вызывается для каждой строки запроса. Аргумент name - это строка, которая содержит имя создаваемой sql функции. Аргумент nargs - это число аргументов у sql функции. Аргумент step - это непосредственно lua функция, которая будет выполняться для каждой строки запроса, эта функция вызывается с аргументом context и аргументами sql функции. Аргумент final - это функция, которая будет вызываться один раз в самом конце запроса, эта функция вызывается с один аргументом - context. Пример использования: Код con:exec[[ CREATE TABLE numbers(num1, num2); INSERT INTO numbers VALUES(1, 11); INSERT INTO numbers VALUES(2, 22); INSERT INTO numbers VALUES(3, 33); ]] local num_sum = 0 local function oneRow(context,num) num_sum = num_sum + num end local function afterLast(context) context:result_number(num_sum) num_sum = 0 end con:create_aggregate("do_the_sums", 1, oneRow, afterLast) for sum in con:urows('SELECT do_the_sums(num1) FROM numbers') do Core.SendToAll("Sum of col 1: "..sum) end for sum in con:urows('SELECT do_the_sums(num2) FROM numbers') do Core.SendToAll("Sum of col 2: "..sum) end В результате на экране увидим следующее: Код Sum of col 1: 6 Sum of col 2: 66 con:create_collation(name, func) Этот метод создают сортирующую функцию обратного вызова. Функция обратного вызова нужна для установки порядка сортировки, по большей части за счёт сравнения строк. Аргумент name - это строка, содержащая имя sql сортировки. Аргумент func - это непосредственно lua функция сортировки, принимающая 2 строковых аргумента и возвращающая 0, если строковые аргументы равны, -1 - если первый аргумент "меньше" второго, и 1 - если первый аргумент "больше" второго. Пример использования: Код local function collate(s1, s2) s1 = s1:lower() s2 = s2:lower() if s1 == s2 then return 0 elseif s1 < s2 then return -1 else return 1 end end con:exec[[ CREATE TABLE test(id INTEGER PRIMARY KEY, content COLLATE CINSENS); INSERT INTO test VALUES(NULL, 'hello world'); INSERT INTO test VALUES(NULL, 'Buenos dias'); INSERT INTO test VALUES(NULL, 'HELLO WORLD'); ]] con:create_collation("CINSENS", collate) for row in con:nrows("SELECT * FROM test") do Core.SendToAll(row.id..' '..row.content) end con:create_function(name, nargs, func) Этот метод создаёт функцию обратного вызова. Функция вызывается для каждой строки запроса. Аргумент name - это строка, которая содержит имя создаваемой sql функции. Аргумент nargs - это число аргументов у sql функции. Аргумент func - это непосредственно lua функция, которая будет выполняться для каждой строки запроса, эта функция вызывается с аргументом context и аргументами sql функции. Пример использования: Код con:exec"CREATE TABLE test(col1, col2, col3)" con:exec"INSERT INTO test VALUES(1, 2, 4)" con:exec"INSERT INTO test VALUES(2, 4, 9)" con:exec"INSERT INTO test VALUES(3, 6, 16)" con:create_function("sum_cols", 3, function(context, a, b, c) context:result_number(a + b + c) end)) for col1, col2, col3, sum in con:urows("SELECT *, sum_cols(col1, col2, col3) FROM test") do Core.SendToAll(("%d + %d + %d = %d"):format(col1, col2, col3, sum)) end con:errcode() или con:error_code() Возвращает числовой код (или расширенный код) для недавнего неудавшегося вызова метода базы данных. con:errmsg() или con:error_message() Возвращает сообщение с ошибкой для недавнего неудавшегося вызова метода базы данных. con:exec(sql [, func [, udata]]) или con:execute(sql [, func [, udata]]) или con:query(sql [, func [, udata]]) Составляет и выполняет sql запрос, указанный в первом аргументе этого метода. Запросы просто выполняются друг за другом не сохраняясь. Функция возвращает env.OK в случае успеха и числовой код ошибки в случае неудачи. Если один или несколько утверждений являются запросами, и если во втором параметре данного метода указана функция func, то эта функция выполнится для каждой строки результатов запроса. Эта функция будет вызываться с 4 аргументами: udata (третий аргумент метода exec), числом колонок в строке(cols), таблицей (values), содержащей все данные всех колонок, и другой таблицей (names), содержащей имена всех колонок. Эта функция должна возвратить 0. Если она вернёт не 0, то запрос будет считаться прерванным. Все последующие запросы не будут выполняться, а метод exec вернёт код env.ABORT. Пример использования: Код local sql = [[ CREATE TABLE numbers(num1, num2, str); INSERT INTO numbers VALUES(1, 11, 'ABC'); INSERT INTO numbers VALUES(2, 22, 'DEF'); INSERT INTO numbers VALUES(3, 33, 'UVW'); INSERT INTO numbers VALUES(4, 44, 'XYZ'); SELECT * FROM numbers; ]] function showrow(udata, cols, values, names) assert(udata == "test_udata") Core.SendToAll("exec:") for i = 1, cols do Core.SendToAll(names[i]..' '..values[i]) end return 0 end con:exec(sql, showrow, "test_udata") con:interrupt() Этот метод прерывает выполнение операции базы данных. Метод ничего не возвращает. con:isopen() или con:isconnect() Этот метод возвращает true, если база открыта, иначе возвращает false. con:last_insert_rowid() Этот метод возвращает идентификатор строки последнего INSERT запроса. Если INSERT запрос никогда не выполнялся, то метод возвращает 0. Каждая строка в SQLite таблице имеет уникальный 64-битный целочисленный ключ 'rowid'. Этот идентификатор всегда доступен по имени ROWID, OID, или _ROWID_. Если таблица имеет поле с типом INTEGER PRIMARY KEY, то эта колонка является псевонимом для 'rowid'. Если INSERT выполняется внутри триггера, то идентификатор rowid вносимой строки будет возвращаться так долго, как долго будет работать тригер. Как только триггер завершит свою работу вернётся то значение, которое было до работы триггера. con:nrows(sql) Метод создаёт итератор, который возвращает последующие строки, выбирая их из запроса sql. Каждый вызов итератора возвращает таблицу, ключами которой являются поля таблицы, а значениями - значения этих полей. Пример использования: Код con:exec[[ CREATE TABLE numbers(num1, num2); INSERT INTO numbers VALUES(1, 11); INSERT INTO numbers VALUES(2, 22); INSERT INTO numbers VALUES(3, 33); ]] for a in con:nrows("SELECT * FROM numbers") do for i,v in pairs(a) do Core.SendToAll(i..": "..v) end end Результаты работы: Код num2: 11 num1: 1 num2: 22 num1: 2 num2: 33 num1: 3 con:prepare(sql) Данный метод компилирует sql утверждение во внутренне представление и возвращает cur объект (курсор) типа userdata для дальнейших операций. con:progress_handler(n, func, udata) Этот метод устанавливает функцию обратного вызова func, которая выполняется периодически в течение длинных вызовов метода con:exec() или cur:step(). Вызов функции происходит каждые n операций, где n передаётся в качестве первого аргумента в указанную функцию. udata передаётся в качестве второго аргумента. Если действий в методе con:exec() или cur:step() меньше n, то функция обратного вызова не будет выполняться. Только одна функция обратного вызова может быть зарегистрирована для каждой открытой базы данных. Повторный вызов данного метода перезапишет прежде установленную функцию. Для того, чтобы удалить функцию обратного вызова, достаточно в методе вторым аргументом указать nil. Если функция обратного вызова возвращает значение, отличное от 0, то текущий запрос незамедлительно прерывается и база данных откатывается назад, а метод con:exec() или cur:step() вернёт число env.INTERRUPT. Данный метод может быть использован для отмены длительных запросов. con:rows(sql) Метод создаёт итератор, который возвращает последующие строки, выбирая их из запроса sql. Каждый вызов итератора возвращает таблицу, ключами которой являются номера полей таблицы, а значениями - значения этих полей. Пример использования: Код con:exec[[ CREATE TABLE numbers(num1, num2); INSERT INTO numbers VALUES(1, 11); INSERT INTO numbers VALUES(2, 22); INSERT INTO numbers VALUES(3, 33); ]] for a in con:rows("SELECT * FROM numbers") do for i,v in pairs(a) do Core.SendToAll(i..": "..v) end end Результаты работы: Код 1: 1 2: 11 1: 2 2: 22 1: 3 2: 33 con:total_changes() Этот метод возвращает общее число строк, которое было модифицировано при помощи INSERT, UPDATE или DELETE, за всё время, в течение которого база была открытой. Сюда также включаются операции в триггерах. Изменения записываются как только выполняется любой из вызовов cur:reset() или cur:finalize(). con:trace(func, udata) Этот метод устанавливает функцию трассировки. func - это lua функция, которую вызывает SQLite до разбора sql утверждения. В эту функцию передаются 2 аргумента. Первый - это аргумент udata, второй - это строка с sql утверждением. con:urows(sql) Метод создаёт итератор, который возвращает последующие строки, выбирая их из запроса sql. Каждый вызов итератора возвращает значения всех полей данной строки. Пример использования: Код con:exec[[ CREATE TABLE numbers(num1, num2); INSERT INTO numbers VALUES(1, 11); INSERT INTO numbers VALUES(2, 22); INSERT INTO numbers VALUES(3, 33); ]] for a, b in con:urows("SELECT * FROM numbers") do Core.SendToAll(a..": "..b) end Результаты работы: Код 1 11 2 22 3 33 con:commit() Метод выполнения (завершения) текущей транзакции. Возвращает true в случае успеха, nil и сообщение ошибки - в случае, когда транзакция не может быть завершина или база данных не поддерживает транзакции. con:rollback() Метод отката на предыдущую транзакцию. Возвращает true в случае успеха, nil и сообщение ошибки - в случае, когда операция не может быть выполнена или база данных не поддерживает транзакции. con:setautocommit(boolean) Метод включения/отключения автоматических транзакций. Эта функция не может работать в базах, на которых не осуществляются транзакции. В базах данных, на которых нет понятия режима автоматических транзакций, этот механизм осуществляется драйвером. Метод возвращает true в случае успеха, и вызывает ошибку - в случае невыполнимости или неосуществимости. Методы объекта курсор (cur): После создания подзапроса при помощи метода con:prepare(), к этому подзапросу можно применять следующие методы: cur:bind(n [, value]) Связывает данные value с переменной n в запросе. Если тип данных value является строкой или числом, то эти данные связываются как text или double соответственно. Если типом данных переменной value является тип boolean или эта переменная равна nil или вовсе отсутствует missing, то предыдущая связь удаляется. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи. cur:bind_blob(n, blob) Связывает строку blob (которая может быть бинарной строкой) с параметром n. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи. cur:bind_names(nametable) Связывает параметры запроса с данными таблицы nametable. Если есть параметры запроса вида ":AAA" или "$AAA", то ищутся соответствующие поля таблицы, если параметры в запросе не именованные, то ищутся числовые поля таблицы nametable. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи. cur:bind_parameter_count() Возвращает максимальный индекс подзапроса. Если параметры подзапроса имеют вид ":AAA" или вид "?", то назначается последовательно увеличивающееся число, начинающиеся с 1, так что возвращаемая величина является количеством параметров. Тем не менее если одно и тоже имя используется в подзапросе несколько раз, то все повторные имена не считаются, то есть возвращается величина, являющаяся числом уникальных параметров в подзапросе. Если какой-либо параметр подзапроса имеет вид "?NNN" (где NNN - целое число), то могут быть промежутки в нумерации и возвращаемая величина будет равна индексу параметра подзапроса с самой большой индексной величиной. cur:bind_parameter_name(n) Возвращает имя n-го параметра подзапроса stmt. Параметры ":AAA", "@AAA", "$VVV" будут иметь имена ":AAA", "@AAA", "$VVV", соответственно. Другими словами, символы ":", "$" и "@" включаются в имя. Параметры "?" и "?NNN" не имеют имени. Первый связанный параметр имеет индекс 1. Если величина n за допустимыми рамками, или если n-ый параметр не имеет имени, то возвращается nil. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи. cur:bind_values(value1, value2, ..., valueN) Связывает указанные данные с параметрами подзапроса. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи. cur:columns() или cur:numcols() Возвращает количество колонок в результатах запроса, или 0, если подзапрос не возвращает ничего. cur:finalize() Эта функция завершает подзапрос. Если поздапрос выполнился успешно или не выполнился, то функция возвращает env.OK, в случае неудачи возвращает численный код ошибки. cur:get_name(n) или cur:getcolname(n) Возвращает имя n-ого столбца в результатах подзапроа (номер самого левого столбца - 0). cur:get_named_types() или cur:getcolntypes() Возвращает таблицу с именами и типами всех столбцов подзапроса. cur:get_named_values() или cur:getcolnvalues() Возвращает таблицу с именами и данными текущей строки результатов подзапроса. cur:get_names() или cur:getcolnames() Возвращает массив с именами всех столбцов в результатах подзапроса. cur:get_type(n) или cur:getcoltype(n) Возвращает тип n-ого столбца подзапроса (номер самого левого столбца - 0). cur:get_types() или cur:getcoltypes() Возвращает массив с типами всех столбцов подзапроса. cur:get_unames() или cur:getcolunames() Возвращает имена всех столбцов подзапроса. cur:get_utypes() или cur:getcolutypes() Возвращает типы всех столбцов подзапроса. cur:get_uvalues() или cur:getcoluvalues() Возвращает данные всех столбцов текущей сроки подзапроса. cur:get_value(n) или cur:getcolvalue(n) Возвращает данные n-ого столбца подзапроса (номер самого левого столбца - 0). cur:get_values() или cur:getcolvalues() Возвращает массив данных всех столбцов подзапроса. cur:isopen() или cur:isconnect() Возвращает true, если запрос ещё открыт (не заверщён при помощи метода finalize), иначе возвращает false. cur:close() Закрывает текущий курсор (cur). cur:nrows() Возвращает итератор, который возвращает последующие строки, выбирая их из подзапроса. Каждый вызов итератора возвращает таблицу, ключами которой являются поля таблицы, а значениями - значения этих полей. cur:reset() Этот метод восстанавливает подзапрос, для того чтобы он был выполнен. Переменные, которые были связаны при помощи методов cur:bind*() сохраняют свои значения. cur:rows() Возвращает итератор, который возвращает последующие строки, выбирая их из подзапроса. Каждый вызов итератора возвращает таблицу, ключами которой являются номера полей таблицы, а значениями - значения этих полей. cur:step() Этот метод должен быть вызван для того чтобы оценить следующую итерацию подзапроса. Она возвращает одо из следующих значений: env.BUSY: база данных была занята. Если подзапрос подтверждён (COMMIT), то вы можете повторить запрос, в противном случае можно откатиться на предыдущую транзакцию. env.DONE: подзапрос успешно завершил работу (finalize). Метод cur:step() не должен вызываться заново, без вызова метода cur:reset(), который сбросит всё на начальное состояние. env.ROW: возвращается всякий раз, когда новая строка с данными готова для обработки вызывающим оператором. Данные могут быть доступны использованием функций доступа к строкам. cur:step(), может вызываться снова, чтобы извлекать следующую строку с данными. env.ERROR: ошибка во время выполнения (например, нарушение ограничений). Метод cur:step() не должен вызываться снова. Более детальную информацию можно посмотреть, вызвав метод con:errmsg(). Более специфический код ошибки может быть получен при вызове метода cur:reset(). env.MISUSE: вызвана неподходящая функция. Такое возможно если предыдущий подзапрос завершил работу (finalize), или предыдущий вызов метода cur:step() вернул env.ERROR или env.DONE. cur:urows() Возвращает итератор, который возвращает последующие строки, выбирая их из подзапроса. Каждый вызов итератора возвращает значения всех полей данной строки. Методы объекта context функций обратного вызова: Объекта context доступен как параметр в функциях обратного вызова методов con:create_aggregate() и con:create_function(). Этот объект обладает следующими методами: ctx:aggregate_count() Метод возвращает число вызовов функции обратного вызова. ctx:get_aggregate_data() Возвращает данные определенного пользователем поля. ctx:set_aggregate_data(udata) Устанавливает данные для определённого пользователем поля. ctx:result(res) Устанавливает результат функции обратного вызова в res. Тип результата зависит от типа res и является числом, или строкой или nil. Все другие величины поднимают сообщение ошибки. ctx:result_null() Устанавливает результат функции обратного вызова в nil. Метод ничего не возвращает. ctx:result_number(number) или ctx:result_double(number) Устанавливает результат функции обратного вызова как число number. Метод ничего не возвращает. ctx:result_int(number) Устанавливает результат функции обратного вызова как целое число number. Метод ничего не возвращает. ctx:result_text(str) Устанавливает результат функции обратного вызова как строку str. Метод ничего не возвращает. ctx:result_blob(blob) Устанавливает результат функции обратного вызова как бинарную строку blob. Метод ничего не возвращает. ctx:result_error(err) Устанавливает результат функции обратного вызова как ошибку err. Метод ничего не возвращает. ctx:user_data() Возвращает userdata параметр поступивший при вызове, чтобы устанавливать функцию возврата (см. описания методов con:create_aggregate() и con:create_function()). В заключении приведу числовые коды ошибок: Код env.OK: 0 env.ERROR: 1 env.INTERNAL: 2 env.PERM: 3 env.ABORT: 4 env.BUSY: 5 env.LOCKED: 6 env.NOMEM: 7 env.READONLY: 8 env.INTERRUPT: 9 env.IOERR: 10 env.CORRUPT: 11 env.NOTFOUND: 12 env.FULL: 13 env.CANTOPEN: 14 env.PROTOCOL: 15 env.EMPTY: 16 env.SCHEMA: 17 env.TOOBIG: 18 env.CONSTRAINT: 19 env.MISMATCH: 20 env.MISUSE: 21 env.NOLFS: 22 env.FORMAT: 24 env.RANGE: 25 env.NOTADB: 26 env.ROW: 100 env.DONE: 101 |
Nickolya, Invisible, fixx, Otshelnik-Fm, Saymon21 | ||
21.3.2010, 16:17 |
iconv RusHub | Библиотека кодировок |
Оказывается библиотеку iconv.dll нужно поместить в папку с выполняемым экзешником rushub.exe, или в папку system32, в противном случае данная библиотека не сможет подключиться к программе статически. У меня эта библиотека уже была в папке system32, поэтому у меня никаких проблем не возникало. iconv.dll - это очень распространённая библиотека, которая используется во многих программах, например, в том же самом апаче в php. Что касается падения, то не представляю из-за чего оно могло быть. |
Nickolya, Invisible | ||
20.3.2010, 12:42 |
iconv RusHub | Библиотека кодировок |
Название: iconv Версия: 6 Хаб: RusHub Автор библиотеки: Alexandre Erwin Ittner Описание: Библиотека для преобразования кодировок. Использование: Содержимое архива iconv.rar распаковываем в папку libs (т.е. в папке libs должна находится папка iconv с тремя файлами). В скриптах библиотека подключается так: require"iconv". ВНИМАНИЕ! (для win32, win64 это не касается) В случае отсутствия в вашей системе (в папке system32) библиотеки iconv.dll, нужно из данного архива либо скопировать эту библиотеку в system32, либо положить эту библиотеку рядом с исполняемым файлом rushub.exe ! После подключения библиотеки в глобальном окружении будет доступна функция string.convert(sText, sFrom, sTo) Возвращаемые значения: Функция возвращает преобразованный текст. В случае возникновения ошибки, функция возвращает описание ошибки во втором аргументе. Если встретилась неправильная последовательность символов, то функция вернёт переведённый фрагмент (до этого места) и сообщение об ошибке ("ERROR: Failed to convert."). При неправильном задании типа кодировки скрипт вылетит с ошибкой: "Failed to create a converter object." Аргументы: Первый параметр - непосредственно сам текст, который нужно преобразовать, второй параметр sFrom отвечает за текущую кодировку текста, третий параметр sTo отвечает за ту кодировку, в которую необходимо перевести. Список доступных библиотеке кодировок:
Пример перевода текста из cp1251(windows-1251) в utf-8: Код require"iconv" local sText = "Текст, который нужно преобразовать в utf-8." local sStr, sErr = sText:convert("cp1251", "utf-8") Core.SendToAll(sStr) Библиотека win32: [attachment=4259:iconv.rar] Библиотека win64: [attachment=5821:iconv_win64.rar] Проект для сборки на vs2008: [attachment=6414:iconv_6_src_vs9.zip] P.S. Немного модифицировал библиотеку, добавив функцию convert в таблицу string, и теперь можно использовать функцию convert как обычный строковый метод (только нужно не забыть подключить библиотеку ![]() |
Nickolya, Invisible, Saymon21 | ||
18.3.2010, 13:32 |
Hub 3000 Online 100% Загрузки |
да да. В сетевухе может быть проблема. У меня было так: на компе 2 сетевухи, через одну качаю из дц со скоростью 50 Кб/c, переподключаюсь через вторую и начинаю качать со скоростью 25 Мб/c. ![]() |
Unians | ||
18.3.2010, 12:03 |
Вопросы по RusHub Технические вопросы |
За флуд пингами отвечает параметр miMinClientPingInt. По умолчанию он равен 30 сек. Уменьши его, допустим, до 15 сек. Однако, что это за клиенты такие, которые пингуют чаще чем раз в 30 сек? Не попытки ли это атак? ![]() Пинг - это отсылка со стороны клиента пустой команды, то есть отсылка просто пайпа |. Эта отсылка служит для проверки состояния сервера, - жив ли он ещё? Хотя возможно что это просто пустая команда, прицепленная к обычной команде. В таком случае параметр miMinClientPingInt пока можно уменьшить до 0. В следующей версии исправлю это ![]() |
Accelerator | ||
17.3.2010, 20:28 |
Официальная страничка RusHUB Внимание - вопрос |
Хехе. В FF для тестирования не обязательно выносить всё в один файл, ради того чтобы браузер не сохранял в кеш. Ведь в Лисичке для этих целей есть комбинация клавиш Ctrl-F5, при использовании которой, хеш использоваться не будет и всё будет загружено заново ![]() Кстати, в опере загрузка без использования хеша - это просто клавиша F5 ![]() Поэтому можно писать всё как обычно, - с файлами ![]() |
bot9ra | ||
12.3.2010, 12:13 |
Модули для скриптов RusHub |
Тут дело такое... Если определить таблицу вне функции, то это безусловно будет быстрее, так как при вызове функции каждый раз не будет создаваться таблица, с другой стороны, эта таблица будет постоянно занимать некоторое место в памяти, в отличие от таблицы внутри функции, которая будет удаляться из памяти сразу же после отработки функции. Можно и так и так, однако, не думаю, что данная функция так уж часто используется, чтобы задумываться о быстродействии, тем более если данный модуль будет использоваться в нескольких скриптах, то занимаемая этой таблицей память будет прямо пропорциональна числу скриптов, использующих этот модуль, даже если скрипт и не использует функцию DoShareUnits !!! Насчёт расширения этой таблицы, то 1024 ПБ - это очень много. И я думаю, что в ближайшие лет 20 мы ещё не доберёмся до таких размеров ![]() |
Nickolya | ||
11.3.2010, 19:58 |
Модули для скриптов RusHub |
Добавил, немного оптимизировав ![]() |
Nickolya, Accelerator, Saymon21 | ||
9.3.2010, 22:08 |
JsHttpRequest RusHub | Библиотека взаимодействия с веб-сервером |
Название: JsHttpRequest Описание: Библиотека, переписанная с php на lua. Позволяет по технологии ajax взаимодействовать браузеру с "lua-веб-сервером". Применение: Код _G.require"JsHttpRequest" -- подключение библиотеки _G.JsHttpRequest.JsHttpRequest(SERVER, GET) -- вызов "конструктора" local Result = {} Result["msg"] = "test" print(_G.JsHttpRequest.Handler(Result)) -- отсылка данных клиенту Файл JsHttpRequest.lua нужно положить в папку libs, остальные js файлы должны быть доступны браузеру для скачивания. Простейшее взаимодействие. В зависимости от GET и POST данных, присланных клиентом на сервер, отсылаем данным механизмом ответ. В отличии от php библиотеки, данная библиотека не работает с преобразованием кодировок. Все преобразования лежат на плечах веб-сервера. Для ознакомления с технологией взаимодействия см.: [attachment=4208:JsHttpRequest.rar] |
Nickolya, Jaska, Invisible, мамин_парень | ||
9.3.2010, 20:36 |
WebServer скрипт создающий веб-интерфейс для хаба |
Библиотека для аякса написана. Однако, при испытаниях с данным скриптом, клиент не может ничего отослать на сервер, так как соединение сервер не поддерживает. Переписав немного данный скрипт под использование на встроенном в хаб веб-сервере, не разрывая соединение с клиентом, клиент при помощи библиотеки jquery отправляет запрос на сервер, однако от сервера получает в ответ lua файл с исполняемым кодом))))))) Подозреваю что все дело в заголовке: "Content-Type: text/html;" Поэтому для успешной работы аякса необходима функция установки полей заголовка (аналог php функции header). строчка: Код if tClient.tHeaders["Content-Type"] == "application/x-www-form-urlencoded" then не даёт получить POST данные. Например, мой браузер отправляет в POST заголовке следующее: Код Content-Type: application/octet-stream; Ух... Наконец-то реализовал на lua обмен данными по технологии аякс!!! ![]() С мозиллой и ie аякс пашет на отлично, даже без специального Content-Type. А вот для оперы нужна функция header ((( |
Nickolya | ||
8.3.2010, 16:35 |
WebServer скрипт создающий веб-интерфейс для хаба |
Разбор полётов. Сравнение полей PHP переменной $_SERVER с полями Lua таблицы SERVER. Обозначение соответствия: php <=> lua Заголовки: Код $_SERVER["HTTP_ACCEPT"] <=> SERVER["tHeaders"]["Accept"] $_SERVER["HTTP_ACCEPT_LANGUAGE"] <=> SERVER["tHeaders"]["Accept-Language"] $_SERVER["HTTP_ACCEPT_ENCODING"] <=> SERVER["tHeaders"]["Accept-Encoding"] $_SERVER["HTTP_ACCEPT_CHARSET"] <=> SERVER["tHeaders"]["Accept-Charset"] $_SERVER["HTTP_HOST"] <=> SERVER["tHeaders"]["Host"] $_SERVER["HTTP_USER_AGENT"] <=> SERVER["tHeaders"]["User-Agent"] $_SERVER["HTTP_CONNECTION"] <=> SERVER["tHeaders"]["Connection"] $_SERVER["HTTP_KEEP_ALIVE"] <=> SERVER["tHeaders"]["Keep-Alive"] $_SERVER["HTTP_COOKIE"] <=> SERVER["tHeaders"]["Cookie"] $_SERVER["HTTP_REFERER"] <=> SERVER["tHeaders"]["Referer"] $_SERVER["HTTP_TE"] <=> SERVER["tHeaders"]["TE"] $_SERVER["HTTP_FROM"] <=> SERVER["tHeaders"]["From"] $_SERVER["HTTP_EXPECT"] <=> SERVER["tHeaders"]["Expect"] $_SERVER["HTTP_RANGE"] <=> SERVER["tHeaders"]["Range"] $_SERVER["HTTP_AUTHORIZATION"] <=> SERVER["tHeaders"]["Authorization"] $_SERVER["HTTP_IF_MATCH"] <=> SERVER["tHeaders"]["If-Match"] $_SERVER["HTTP_IF_MODIFIED_SINCE"] <=> SERVER["tHeaders"]["If-Modified-Since"] $_SERVER["HTTP_IF_MODIFIED_SINCE"] <=> SERVER["tHeaders"]["If-None-Match"] $_SERVER["HTTP_IF_RANGE"] <=> SERVER["tHeaders"]["If-Range"] $_SERVER["HTTP_IF_UNMODIFIED_SINCE"] <=> SERVER["tHeaders"]["If-Unmodified-Since"] $_SERVER["HTTP_MAX_FORWARDS"] <=> SERVER["tHeaders"]["Max-Forwards"] $_SERVER["HTTP_X_FORWARDED_FOR"] <=> SERVER["tHeaders"]["X-Forwarded-For"] $_SERVER["HTTP_PROXY_AUTHORIZATION"] <=> SERVER["tHeaders"]["Proxy-Authorization"] $_SERVER["CONTENT_LENGTH"] <=> SERVER["tHeaders"]["Content-Length"] $_SERVER["CONTENT_TYPE"] <=> SERVER["tHeaders"]["Content-Type"] Переменные сервера: Код $_SERVER["GATEWAY_INTERFACE"] <=> ? $_SERVER["PATH_INFO"] <=> ? $_SERVER["PATH_TRANSLATED"] <=> ? $_SERVER["REMOTE_ADDR"] <=> ? $_SERVER["REMOTE_HOST"] <=> ? $_SERVER["REMOTE_PORT"] <=> ? $_SERVER["REMOTE_USER"] <=> ? $_SERVER["SERVER_ADDR"] <=> ? $_SERVER["SERVER_NAME"] <=> ? $_SERVER["SERVER_PORT"] <=> ? $_SERVER["SERVER_SOFTWARE"] <=> ? $_SERVER["SCRIPT_FILENAME"] <=> SERVER["sLoadFileWay"] $_SERVER["SERVER_PROTOCOL"] <=> SERVER["sVersion"] $_SERVER["REQUEST_METHOD"] <=> SERVER["sMethod"] $_SERVER["QUERY_STRING"] <=> SERVER["sGetData"] $_SERVER["REQUEST_URI"] <=> SERVER["sUrl"] $_SERVER["SCRIPT_NAME"] <=> SERVER["sPath"]..SERVER["sFile"] $_SERVER["REQUEST_TIME"] <=> _G.os.time() Переменные сервера Apache: Код $_SERVER["DOCUMENT_ROOT"] <=> _G.Core.sScriptsPath.."www/" $_SERVER["SERVER_ADMIN"] <=> ? $_SERVER["SERVER_SIGNATURE"] <=> ? Замечания: PHP переменная $_SERVER["SCRIPT_NAME"] содержит информацию вместе взятых Lua переменных: SERVER["sPath"]..SERVER["sFile"] PHP переменная $_SERVER["REQUEST_TIME"] отличается от lua переменной SERVER["iStartTime"] тем, что в отличии от последней возвращает os.time(), а не os.clock(). |
Nickolya, Invisible | ||
8.3.2010, 1:11 |
Antibot |
Название скрипта: Antibot Хаб: RusHub Автор: Setuper Описание: Скрипт запрещает писать в чат или в приват незарегистрированному, пока пользователь не ответит на вопрос. [attachment=4323:antibot.lua] |
Nickolya, Invisible, CrazyKiller, Saymon21, hipimps71, AltSide, AfLc | ||
7.3.2010, 12:04 |
CollectorMagnets |
как вариант: Код for sMagnet in sData:gmatch"([mh][at][gt][np]e?t?:%S+)" do хотя в таком варианте может захватываться и кое-что лишнее. Для 100% уверенности, что захватиться то, что нам нужно надо делать 2 цикла: Код for sMagnet in sData:gmatch"(magnet:%S+)" do ... end for sMagnet in sData:gmatch"(http:%S+)" do ... end |
Otshelnik-Fm, Saymon21 | ||
6.3.2010, 14:50 |
Trivia Mod API2 | Игра "Викторина" |
Или просто в функции OnStartup написать Код os.setlocale"Russian_Russia.1251" |
Nickolya, Kingston | ||
5.3.2010, 19:20 |
FirstRusHubBot приводим RusHub к рабочему виду функционалом скриптов |
Немного отредактировал скрипт. Добавил строку, отвечающую за отсылку ip адресов всех пользователей операторам, а также добавил функцию ContextMenu для использования совместно со скриптом ContextMenu.lua. По умолчанию контекстные менюшки отсылаются при входе. Если у вас установлен скрипт ContextMenu.lua, то для того чтобы менюшки отсылались только по команде, а не при входе нужно в конце функции OnUserEnter закомментировать строку ContextMenu(UID). |
Nickolya, Invisible, Infinity_Love, Saymon21 | ||
5.3.2010, 18:08 |
Репорты об ошибках старых версий архив темы ошибок текущей версии хаба |
Для начала нужно установить версию по-новее. Помнится у меня тоже при тестировании на ранних версиях иногда падал хаб, если, например, не передавать в функцию ContextMenu UID пользователя. То есть например написать: Код function ContextMenu() Core.SendToUser(UID, "...") end вместо: Код function ContextMenu(UID) Core.SendToUser(UID, "...") end Думаю, поставив последнюю версию хаба никаких падений не будет, а при такой описке выскочит ошибка. Если же всё равно будет падать, то будем разбираться из-за чего. |
Saymon21 | ||
5.3.2010, 17:43 |
Не могу разобраться с кодировкой в скрипте Не могу разобраться с кодировкой в скрипте |
Грей использует кодировку utf8, в которой русские буквы занимают по 2 байта, поэтому нельзя перемешивать байты одной буквы, ибо получится совершенно другой символ. Выход есть. Нужно из utf8 перейти в кодировку cp1251 и работать уже в ней (в ней русские буквы занимают по 1 байту). В грее есть функции DC():FromUtf8(str) и DC():ToUtf8(str). Воспользуйся ими для перевода сначала в cp1251, а после всех операций обратно в utf8. |
a97873 | ||
5.3.2010, 17:05 |
Бомба развлекательный скрипт |
Название скрипта: Bomb Версия скрипта: 1.6 Хаб: RusHub Автор: Setuper Описание: Всем известный скрипт бомбы теперь и под RusHub. Закладываем бомбы под пользователей и наблюдаем за их удачными или не удачными действиями. В сообщениях о том что вас заминировали появились подсказки. На самом деле они рандомные и в большинстве случаев не правильно подсказывают цвет провода, однако так веселее ![]() Скрип рекомендуется использовать совместно со скриптом ContextMenu.lua (для быстродействия и экономии трафика ![]() Код --ContextMenu(UID) [attachment=4173:Bomb.lua] |
Invisible, fixx, ShadoWx, Otshelnik-Fm, PomanoB, Saymon21, ™Wizard™, hipimps71 | ||
5.3.2010, 13:03 |
md5 RusHub | Библиотека криптографии |
Название: md5 Версия: 1.1.2 Хаб: RusHub Автор библиотеки: Roberto Ierusalimschy Описание: Библиотека для получения md5 хеша. Использование: Содержимое архива md5_1.1.2.rar распаковываем в папку libs. В скриптах библиотека подключается так: require"md5" Мануал по функциям библиотеки Все функции, зарегистрированные в таблице md5
Библиотека win32: [attachment=4169:md5_1.1.2.rar] Библиотека win64: [attachment=5817:md5_1.1.2_win64.rar] Скрипт для тестирования и обучения работе с функциями: [attachment=4170:test_md5.lua] Проект для сборки на vs2008: [attachment=6417:md5_1.1.2_src_vs9.zip] |
Nickolya, Invisible | ||
4.3.2010, 17:31 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.1.5 lua plugin v 1.16 Основные изменения: Added: Добавлено новое событие OnScriptStart(sScriptName), вызываемое при запуске скрипта sScriptName. Added: Добавлено новое событие OnScriptStop(sScriptName), вызываемое при остановке скрипта sScriptName. Fixed: Исправлена работа веб-сервера. Предотвращена двойная отсылка. Fixed: Исправлена ошибка отсутствия тела сообщения в POST запросах. Не заморачиваясь насчёт парсера, оставлено это дело на плечах Lua. Если клиентом было отправлено тело запроса, то оно всегда прибавляется к заголовку, даже в случае, например GET запроса, а не POST запроса, поэтому это должен отфильтровывать парсер в Lua, дабы придерживаться http протокола и не позволять отправлять левые запросы. Fixed: WebID полностью совмещён с UID, и к нему применимы все функции, применимые к UID. Например, отключение веб-пользователя Core.Disconnect(UID/WebID). Хотя специфические функции типа GetUser могут возвращать не все нужные результаты из-за их отсутствия для данного соединения, или функция DisconnectIP не может разъединить веб-пользователя с указанным ip. |
Nickolya, Jaska, Invisible, fixx, Otshelnik-Fm, alex82, ExC0tiC | ||
4.3.2010, 3:35 |
Вопросы по скриптам Мелкие вопросы |
Это никак не исправить. На стадии валидации ника определён только ip адрес и ник, больше ничего не определено, так как пользователь ещё не отослал на хаб MyINFO строку. |
Saymon21 | ||
3.3.2010, 21:11 |
Модули для скриптов RusHub |
Не доступна только менюшка. Сама команда $Kick доступна. Для защиты от дурака нужно проверить условие: Код if Core.GetUser(UID, 64) then -- проверка что киком воспользовался пользователь с ключиком Core.Disconnect(sNick) end Кстати, по протоколу ( http://mydc.ru/index.html?showtopic=915&am...post&p=6718 ) команда $Kick не содержит причины кика, а содержит только ник, поэтому бестолку извлекать из этой команды причину. В итоге получаем: Код function OnKick(UID, sData) if Core.GetUser(UID, 64) then Core.Disconnect(sData:match"$Kick (%S+)") end end |
Accelerator, Sekretchik, Saymon21 | ||
2.3.2010, 12:34 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.1.4 lua plugin v 1.15 Fixed: Удалена функция Core.SendToWeb. Вместо неё для отсылки данных веб пользователю нужно использовать функцию Core.SendToUser(WebID, sData). Added: Для получения ip адреса и других параметров веб-пользователя можно использовать ту же функцию, что и для обычного dc-пользователя: Core.GetUser(WebID, iByte). Свожу все функции к единому интерфейсу. |
Nickolya, Jaska, Invisible, Otshelnik-Fm, ExC0tiC | ||
28.2.2010, 17:49 |
WebModule RusHub | Модуль для встроенного web-сервера |
Хорошая работа. Поясню как этим пользоваться. Пишем и запускаем скрипт: Код require"web" function OnWebData(WebID, sData) return Web.OnWebData(WebID, Web.GetEnv(sData)) end После этого уже можно браузером входит. |
fixx | ||
28.2.2010, 16:38 |
Вопросы по RusHub Технические вопросы |
Открываем скрипт FirstRusHubBot и изменяем функцию OnValidateNick: Код function OnValidateNick(UID, sData) local sNick = Core.GetUser(UID, 1).sNick local tRegInfo = tRegUsers[sNick] -- Получаем регистрационные данные local iProfile = -1 if tRegInfo then iProfile = tRegInfo.iProfile end if tProfiles[iProfile].bHaveKey then Core.SetUser(UID, 4, true) -- КЛЮЧИК Core.SetUser(UID, 6, true) -- ПОЛУЧЕНИЕ IP АДРЕСОВ ВСЕХ ПОЛЬЗОВАТЕЛЕЙ end if tRegInfo then -- Проверяем зарегистрированность ника return true -- Возвращаем true для того, чтобы запросить пароль end end |
Accelerator | ||
27.2.2010, 18:47 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.1.3 lua plugin v 1.14 Fixed: Исправлены некоторые достаточно серьёзные ошибки старых версий. Added: Добавлен веб-сервер (по умолчанию отключен). Веб-сервер предназначен только для использования его в Lua. Некоторые новые настройки: bWebServer - включить веб-сервер (по умолчанию отключен). sWebServerIP - адрес веб-сервера. iWebServerPort - порт веб-сервера (по умолчанию 81). iWebTimeout - тайм-аут соединения с веб сервером (в сек.). Время бездействия, по истечению которого веб-сервер закрывает соединение с клиентом. iWebStrSizeMax - максимальный размер сообщения, которое может отослать на сервер клиент. Новое событие: OnWebData(WebID, sData) Новая api функция: Core.SendToWeb(WebID, sData) Пример скрипта для проверки работы веб сервера: Код function OnWebData(WebID, sData) Так как в событии OnWebData не возвращается true, то клиент будет автоматически отключен после отправки ему всех данных.Core.SendToAll(sData) Core.SendToWeb(WebID, "test") end Функция Core.SendToWeb автоматически добавляет разделитель ("\r\n\r\n") в конец, если он отсутствует на конце сообщения. |
Nickolya, Jaska, Invisible, PomanoB, ExC0tiC, Saymon21 | ||
26.2.2010, 0:35 |
Функции Для Разработчиков склад полезных функций |
Всё достаточно просто. Переводим текст в UTF8 и каждый "нужный" байт представляем в 16-ричном виде ![]() Функцию AnsiToUtf8 берём из первого поста. Код function URICoding(sText) local function Check(i) if i < 33 or 126 < i then return nil end if i == 33 then return true elseif 38 < i and i < 43 then return true elseif 44 < i and i < 47 then return true elseif 47 < i and i < 58 then return true elseif 64 < i and i < 91 then return true elseif 96 < i and i < 123 then return true elseif i == 126 then return true end end local s, r = AnsiToUtf8(sText), '' for i = 1, #s do local b = s:byte(i) if Check(b) then r = r..string.char(b) else r = r..("%%%X"):format(b) end end return r end |
Serx | ||
23.2.2010, 16:22 |
Анализ ответа от PtokaX Вопрос по сокетам |
Sergey2009 | |||
23.2.2010, 16:08 |
Скрипт запрета в никах заглавных букв |
Код Core.SendToUser(sUser, "*** Ваш ник не должен быть в КАПСовом виде!") |
Nickolya, thehawk | ||
23.2.2010, 13:49 |
Анализ ответа от PtokaX Вопрос по сокетам |
А при чём тут вообще ADC? Хаб PtokaX работает на NMDC протоколе. Это разные протоколы. А TCP - это сетевой протокол, который нужен для передачи данных по сети. А уже эти данные содержат в себе NMDC протокол. Вообще, как так можно что-то писать, не разобравшись даже для чего нужен TCP протокол?)))) |
Sergey2009 | ||
23.2.2010, 12:43 |
Предложения для развития |
Saymon, так профиль итак устанавливается в одном скрипте, а потом используется во всех скриптах. То есть в роли плагина тут выступает скрипт. По поводу установки топика, то можно написать скрипт: Код local tAllow = { [0] = true, [1] = true } function OnChat(UID, sData) local sTopic = sData:match"%b<> [!%+]settopic (.+)" if sTopic then local tUser = Core.GetUser(UID, 9) if tAllow[tUser.iProfile] then Core.SendToAll("*** "..tUser.sNick.." установил новый топик.") Core.SetConfig("sTopic", sTopic) else Core.SendToUser(UID, "У вас нет прав на использование этой команды") end return true end end |
Accelerator, Saymon21 | ||
22.2.2010, 17:58 |
Запрет символов в никах и цифровых ников Запрет символов в никах и цифровых ников |
Тогда уж без квадратных скобок и с использованием find, а не match Код local sNick = tUser.sNick if sNick:find"^%-+$" or sNick:find"^%.+$" or sNick:find"^z+$" then |
DrakonSP | ||
22.2.2010, 17:52 |
Вопросы по скриптам Мелкие вопросы |
вместо этого: Код local sData = string.sub(sData,1,-2) local sCmd = sData:match"%b<>%s+[!+*](%S+)" лучше писать так: Код local sCmd = sData:match"%b<>%s+[!+*](%S+)|$" |
Accelerator, Saymon21 | ||
21.2.2010, 23:49 |
Запрет символов в никах и цифровых ников Запрет символов в никах и цифровых ников |
Потому что такое регулярное выражение ловит только один символ -, то есть ник, состоящий только из одного этого символа. Нужно чтобы ловился один и более, для этого нужно поставить плюсик: Код if tUser.sNick:find"^%-+$" then Ведь если бы мы в предыдущем примере не поставили плюсик: Код if tUser.sNick:find"^%d$" then то ловилась бы тоже одна цифра, а не любое число. |
DrakonSP | ||
21.2.2010, 14:04 |
Hub's Big Ass Bot API2 | HUBBABOT v.2.28 |
Баги птохи)) http://mydc.ru/index.html?showtopic=915&am...post&p=6692 Цитата Обратите внимание, что в скриптовую функцию PtokaX данная команда передаётся без символа вертикальной черты '|' на конце. Поэтому наверное нужно так: Код function ConnectToMeArrival(sUser,sData) Core.GetUserAllData(sUser) local _,_,towho = string.find(sData, "^%p%S+%s+(%S+).*") |
Nickolya, thehawk, mastersweet | ||
21.2.2010, 13:50 |
WebServer скрипт создающий веб-интерфейс для хаба |
Пустая строка - это \r\n То есть по своей сути нужно ловить \r\n\r\n. Предыдущий перенос и перенос текущей пустой строки. Сейчас проверю действительно ли это так Да, действительно, клиент в конце своего запроса ставит пустую строку. Разделитель определён. Осталось реализовать ![]() |
Nickolya | ||
21.2.2010, 0:40 |
замена стандартной команде !stat |
вообще говоря команды 2. !stat и !stats Поэтому если сделать замену одной команды, то можно использовать другую. Поэтому замени команду !stat, а !stats оставь, и таким образом можешь смотреть. |
Saymon21 | ||
21.2.2010, 0:26 |
замена стандартной команде !stat |
Ну так если знаешь как делается действие по команде, ну так вперёд. Что мешает сделать действие на команду !stat ? Не понятна суть проблемы. Код function ChatArrival(tUser, sData) if sData:find"!stat" then Core.SendToUser(tUser, "Наша инфа к команде !stat") return true end end |
Saymon21 | ||
20.2.2010, 18:01 |
Вопросы по скриптам Мелкие вопросы |
Пардон. Вот так нужно: Код SaveTable(sFile, tCounts, "tCounts") Второй параметр в кавычки ![]() Перезалил |
DrakonSP | ||
20.2.2010, 16:20 |
WebServer скрипт создающий веб-интерфейс для хаба |
Дела обстоят так... Взвесив все за и против, решил написать веб сервер в дополнении к уже имеющемуся dc серверу (встроить веб сервер). Точнее вот как: На хабе существует обычный сервер, который принимает соединения. Этот сервер наследуется dc сервером. Так вот... Можно точно также сделать надстройку веб сервера. При этом все соединения, будь они dc соединениями или соединениями веб сервера, будут обрабатываться одним единым сервером, а после обработки парситься уже своими серверами. Данная система "многосерверности" была заложена изначально, и является гениальным конструктивным решением. Общая обработка и, разные парсеры и дальнейшее поведение. При всём сказанном пока имеем вот что: прослушиваем порт 411 для dc сервера и, например, порт 8080 для веб-сервера. При коннекте на порт веб сервера, начинаем получать данные от клиента. После получения данных в lua вызывается событие, которое будет отвечать за полученные данные. Из функции этого события можно будет с помощью api функции отправить клиенту ответ, при этом сервер будет держать некоторое время соединение. Теперь встаёт вопрос. Как работают веб серверы? Ведь они закрывают иногда соединения. Когда они его закрывают? Ведь в случае частых обменов данными между клиентом и сервером (например, онлайн веб-чат), не логично рвать соединение. Хотя разорвать соединение - это обычная практика для веб-серверов, так как в любом случае существуют куки, которые отвечают за состояние и стадии клиента. Поэтому возможен случай разрыва соединения после определённого интервала времени бездействия. Теперь, почему нельзя сделать так: принять соединение клиента, получить данные от клиента, отправить ответ клиенту и разорвать соединение? Так нельзя сделать по причине существования на сервере неблокирующих сокетов, из-за того, что за один раз данные сервер может получить от клиента не все, а только часть. Отсюда возникает ещё один вопрос: какой разделитель команд в протоколе http ? Для NMDC протокола всё прозрачно: получаем данные из неблокирующего сокета и записываем их в буфер до тех пор, пока не встретим разделитель протокола (а именно знак |). После того, как встретили разделитель протокола, извлекаем из буфера команду до этого разделителя и отсылаем это команду парсеру на обработку. В http протоколе не понятно когда обрабатывать и вызывать lua событие, ведь для вызова lua события нужно получить все данные, ну или хотя бы 1 команду, а из-за неблокирующих сокетов за 1 раз мы не можем гарантировать что получим все данные от клиента, поэтому не можем вызывать lua событие. Вот такие трудности по написанию веб-сервера, которые я надеюсь вы мне поможете решить ![]() |
Nickolya, Invisible | ||
20.2.2010, 11:49 |
Вопросы по скриптам Мелкие вопросы |
Можно. Можно сделать показ количества просмотров за время непрерывной работы скрипта, тогда можно просто завести переменную-счётчик, в противном случае (в общем случае) нужно будет сохранение счётчика в файл. [attachment=4095:TextBot.lua] |
DrakonSP, Saymon21, TiGRpp | ||
20.2.2010, 1:27 |
Помогите Пересести Скрипт с АР1 на АР2 |
Код local sBot = SetMan.GetString(21) local tCmds = { ["!ban"] = 1, ["!banip"] = 1, ["!fullban"] = 1, ["!fullbanip"] = 1, ["!nickban"] = 1, ["!tempban"] = 1, ["!tempbanip"] = 1, ["!fulltempban"] = 1, ["!fulltempbanip"] = 1, ["!nicktempban"] = 1, } function ChatArrival(tUser, sData) local sCmd = sData:match"%b<>%s+(%S+).*|$" if tCmds[sCmd] and tCmds[sCmd] == 1 and GetUserValue(tUser, 11) then local sNick = sData:match"%b<>%s+%S+%s+(%S+)" if sNick and not sNick:find"%d+%.%d+%.%d+%.%d+" then local tProfile = ProfMan.GetProfile(tUser.iProfile) if RegMan.GetReg(sNick) ~= nil then Core.SendToOps("<"..sBot.."> *** Регистрация пользователя "..sNick.." была удалена. Удалил: "..ProfMan.GetProfile(tUser.iProfile).sProfileName.." "..tUser.sNick..".") RegMan.DelReg(sNick) else Core.SendToOps("<"..sBot.."> *** Пользователь "..sNick.." не зарегистрирован.") end end end end Только совсем не понятно зачем при бане по нику удалять регистрацию пользователя? |
Mc-JuNiOr | ||
19.2.2010, 22:42 |
Скрипт банов для RusHub тестим и комменьтруем |
Код local tUser = Core.GetUser(UID, 1) local sUser = Core.GetUser(UID, 8) это можно объединить в одну таблицу Код local tUser = Core.GetUser(UID, 9) |
Saymon21 | ||
18.2.2010, 11:32 |
Вопросы по скриптам Мелкие вопросы |
Пардон. В строке: Код sMsg = sMsg:gsub("^%$", "$") знак $ нужно заэкранировать.Твой скрипт тоже работает. Однако, особенности протокола заставляют нас обходить некоторые знаки. Например, в твоём скрипте: 1) пользователям не отсылались бы сообщения, начинающиеся со знака $; 2) знак | в сообщении служил бы разделителем команд и не отображался бы в чате, а всё что шло после этого знака отсылалось бы в следующей команде; 3) любые цифры от 1 до 255, перед которыми стояли бы символы &#, и после которых стоял бы символ ;, преобразовывались бы из кодов в некоторые символы перед тем как поступить в чат пользователя. |
Nickolya, DrakonSP | ||
18.2.2010, 2:22 |
Вопросы по скриптам Мелкие вопросы |
Я бы вот так написал ![]() Код local sPath = Core.GetPtokaXPath().."scripts/TextBot/" function ChatArrival(tUser, sData) local sCmd = sData:match"^%b<>%s+%p(%S+).*|$" if sCmd then local sMsg = LoadText(sPath..sCmd..".txt") if sMsg then Core.SendToUser(tUser, sMsg) return true end end end function LoadText(sFile) local hFile = io.open(sFile) if hFile then local sMsg = hFile:read"*a" sMsg = sMsg:gsub("&#(%d+);", "&#%1;") sMsg = sMsg:gsub("|", "|") sMsg = sMsg:gsub("^%$", "$") hFile:flush() hFile:close() return sMsg end return nil, "Не удалось открыть файл "..sFile end |
DrakonSP | ||
17.2.2010, 0:29 |
Запрет символов в никах и цифровых ников Запрет символов в никах и цифровых ников |
Код if tUser.sNick:find(""..sbansymbol.."") then это очень дурная привычка так писать!!! Вы даже не представляете насколько это вредно. Нужно всеми способами избавляться от лишних конкатенаций, а тут наоборот делают. Почему не написать так: Код if tUser.sNick:find(sbansymbol) then зачем делать лишнюю конкатенацию? Эту привычку надо искоренять! Не пойму, кто вас научил делать эту лишнюю конкатенацию? Ведь никто из скриптописателей данного форума так не пишет. |
DrakonSP | ||
17.2.2010, 0:02 |
Запрет символов в никах и цифровых ников Запрет символов в никах и цифровых ников |
В функцию можно передавать текстовый параметр целиком, без конкатенация, записывая его без скобок, во всех иных случаях скобки нужны (я предпочитаю их использовать всегда): естественно Код if tUser.sNick:find("[!@]") then и Код if tUser.sNick:find"([!@])" then различия очевидны. В первом случае скобки являются скобками метода find, во втором случае, скобки - это захват символа. Естественно их надо различать.Как уже было сказано, если строка является постоянным строковым литералом, то скобки можно опускать. Я предпочитаю опускать скобки почти везде, где это можно делать и не только у функции, но и просто по приоритету операций. Можно написать так: Код if ((a and b) or (c and d)) then А можно тоже самое писать без скобок, зная приоритеты выполнения операций.То же самое касается и конструкторов таблиц. Пример: Код function F(tab) for i,v in pairs(tab) do ... end end Вызов этой функции может быть такой: Код F({1,2,3,4,5}) Но можно и по-другому вызвать (без скобок):Код F{1,2,3,4,5} Данный "сахар" смотрится очень красиво и эффектно в некоторых случаях, поэтому я и опускаю скобки. Однако, кто не гонится за сокращение на пару символов кода, и кому нужна наглядность и практичность, а не элегантность, могут ставить скобки, - дело вкуса и понимания ![]() Пример эффектной функции: Код function prnt(x) Напишите в птохе и проверьте, что этот код действительно работает. Согласитесь, что если бы мы написали prnt("one")("two")("three"), то было бы тоже забавно, но не так, как 3 строковых литерала подряд if x then Core.SendToAll(x) return prnt end end prnt "one" "two" "three" ![]() |
DrakonSP, Saymon21 | ||
16.2.2010, 22:41 |
Запрет символов в никах и цифровых ников Запрет символов в никах и цифровых ников |
Во-первых, символ ! не нуждается в экранировании. Во-вторых, скобочки не нужно писать (если мы используем условие): Код if tUser.sNick:find"[!@]" then ... |
DrakonSP | ||
15.2.2010, 20:01 |
ContextMenu скрипт отсылки контекстного меню по запросу |
Всё зависит от количества менюшек. А вообще тут не только экономия трафика, но и ускорение входа на хаб, особенно на больших хабах ![]() На маленьких хабах можно сказать: а что ещё хабу делать? он итак не нагружен. На больших хабах идёт борьба за быстродействие и отсылка пары лишних команд каждую секунду иногда сильно сказывается на работе хаба |
Saymon21 | ||
15.2.2010, 16:31 |
ContextMenu скрипт отсылки контекстного меню по запросу |
Название: ContextMenu Версия: 1.0 Описание: Скрипт предназначен для экономии трафика при отсылке контекстного меню. То есть отсылать меню не каждый раз при входе, а по запросу. При этом, скриптописателям предлагается в скриптах контекстные меню отправлять в специальной глобальной функции ContextMenu. Пример меню в скрипте test.lua: Код local sMenu = "$UserCommand 1 3 Меню1$<%[mynick]> !cmd1||".. "$UserCommand 1 3 Меню2$<%[mynick]> !cmd2||".. "$UserCommand 1 3 Меню3$<%[mynick]> !cmd3|" function ContextMenu(UID) Core.SendToUser(UID, sMenu) end Таким образом, по запросу из скрипта ContextMenu.lua выполнится функция ContextMenu скрипта test.lua, а также прочих скриптов, которые запущены на данный момент. Если в скрипте отсутствует функция ContextMenu, то будет выполняться функция OnUserEnter, если таковая имеется. Однако всё же лучше договориться и выносить во всех скриптах отсылку контекстных менюшек в функцию ContextMenu, так как в функции OnUserEnter могут выполняться вещи, которые необходимо выполнять только 1 раз за вход. Если нужно принудительно отослать менюшку какого-то скрипта при входе, то всегда можно вызвать функцию ContextMenu внутри функции OnUserEnter ![]() [attachment=4077:ContextMenu.lua] |
Nickolya, Invisible, fixx, Otshelnik-Fm, Alexey, Saymon21, TiGRpp, AfLc | ||
14.2.2010, 18:52 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.1.2 lua plugin v 1.13 Основные изменения: Fixed: Исправлен баг в работе события OnScriptError. Fixed: Исправлен баг, который не позволял в некоторых случаях при медленной скорости соединения получить полностью команду. Fixed: Исправлен баг в изменении команды события. Added: Добавлена функция Core.SendToIP(sIP, sData, sNick, sFrom, iProfile/tProfiles) отсылки сообщения ip адресу. Added: Добавлена функция Core.SendToAllExceptIps(tExcept, sData, sNick, sFrom) отсылки сообщения всем, кроме ip адресов таблицы tExcept. Added: Добавлена функция Core.RegBot(sNick, bKey, sMyINFO, sIP) регистрации бота на хабе (sMyINFO - это не полное MyINFO, а только всё то что после ника). Added: Добавлена функция Core.UnregBot(sNick) удаления регистрации бота. Added: Модифицирована функция Core.DisconnectIP(sIP, iProfile/tProfiles). Добавлен необязательный параметр. |
Nickolya, BIMMER71, Jaska, Invisible, Otshelnik-Fm, Accelerator, ExC0tiC, Saymon21 | ||
14.2.2010, 17:33 |
Запрет символов в никах и цифровых ников Запрет символов в никах и цифровых ников |
Лучше вот так: Код function ValidateNickArrival(tUser) if tUser.sNick:find"^%d+$" then Core.SendToUser(tUser, "Ники состоящие только из цифр запрещены") Core.Disconnect(tUser) end end Захват (%d+) лучше не делать, так как это лишние действия, и вместо match в условии использовать find. Так как интерпретатору проще сравнить число, которое возвращает find, со значением boolean, чем сравнивать строку, которую возвращает match. Ведь строка - это массив символов. Намного проще работать с числами, чем с массивами. Не делая захваты, строк вообще не будет, а метод find вернёт только 2 числа (начало и конец регулярного выражения, если таковое было обнаружено). |
Nickolya, DrakonSP, Saymon21 | ||
12.2.2010, 11:01 |
Вопросы Разработчикам Скриптов вопросы по скриптам (мелкие вопросы) |
DrakonSP | |||
10.2.2010, 15:30 |
AscIIArtBot API2 | хы, может быть кто то и захочет вопользоваться =) |
Поскольку таблица tSettings не передаётся в качестве аргументов какой-либо функции, то затрат на копирование при передачи аргументов в стек вызова нету, поэтому в данном случае без разницы как хранить настройки в таблице или без. Для разъяснения приведу 2 фрагмента, которые делают одно и тоже: Код function F(s1) return s1.." world" end local s = "hello" Core.SendToAll(s) s = F(s) -- тут 2 копирования. Сначала создаётся параметр s1 функции F, и в него копируется содержимое переменной s, -- потом, после завершения работы функции, грубо говоря, параметр s1 копируется опять в s. Core.SendToAll(s) Код function F(t1) t1[1] = t1[1].." world" end local t = {"hello"} Core.SendToAll(t[1]) F(t) -- тут нет копирования. Таблица t передаётся в функцию по ссылке, -- а не по значению, поэтому t и t1 - это одна и та же таблица в памяти. Core.SendToAll(t[1]) Первый код - передача параметра функции по значению (создание каждый раз при вызове функции нового параметра и копирование данных в этот параметр). Второй код - передача параметра функции по ссылке (не создаётся новый параметр, а идёт работа с памятью уже существующего параметра, поэтому нет создания новой переменной и нет копирования). Строка - это массив букв, поэтому нужно тщательнее подходить к вопросам копирования именно строк, дабы не копировать по нескольку раз большое количество символов. Заметьте, что оба фрагмента делают одно и тоже, но второй это делает значительно оптимальнее. |
Jaska, Wariner, che_guevara | ||
8.2.2010, 13:45 |
Репорты об ошибках старых версий архив темы ошибок текущей версии хаба |
(error)[Fri Jan 29 21:39:47 2010] (1) cDCConn: (sock 252) Error in sending: Attempt send more than 10, closing Причина ошибки найдена. Будет исправлена в следующей версии (2.1.2) хаба. Из-за данной ошибки могли не полностью отправляться менюшки и MOTD, как было кем-то замечено. |
Nickolya | ||
5.2.2010, 13:24 |
Вопросы по RusHub Технические вопросы |
Фактически да. |
Nickolya | ||
4.2.2010, 20:39 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.1.1 lua plugin v 1.12 В результате глобальных изменений могут неправильно работать некоторые функции, хотя я думаю что будет всё ок. Основные изменения: Added: Установленные типы защиты:
Работа над защитой ещё не окончена. Added: Новое событие: OnScriptError(sScriptName, sErrMsg, bStoped) Функция выполняется при возникновении ошибки в скрипте sScriptName. sErrMsg - сообщение с ошибкой. Флаг bStoped равен true если скрипт, в котором возникла ошибка, был остановлен, в противном случае флаг bStoped равен false. Функция не вызывается для текущего скрипта. Для отслеживания ошибок в текущем скрипте нужно использовать функцию OnError(sErrMsg). Напомню, что по умолчанию скрипт отключается при ошибке, отключение скрипта можно предотвратить возвратом true в функции OnError этого скрипта. Added: Новое событие: OnFlood(UID, iType, iNum) Функция выполняется при обнаружении флуда со стороны пользователя. Может служить для установки бана за флуд или для разрешения флуда ОПераторам хаба. Параметр iType указывает тип флуда (0 - чат-флуд, 1 - флуд в личке, 2 - MyINFO-флуд, 3 - флуд получения списка, 4 - поисковый-флуд, 5 - SR-флуд, 6 - CTM-флуд, 7 - RCTM-флуд, 8 - флуд неизвестными командами). Параметр iNum указывает номер срабатываемого флуда 1 или 2 (см. настройки флуда). Возвращаемое значение: true или 1 - не отключать пользователя. Updated: Обновлена функция Core.RestartScripts(iType) (в функцию добавлен не обязательный параметр) Функция перезапускает все скрипты. Если параметр iType отсутствует, равен nil или равен 0, то перезагружаются все скрипты без исключения. Если параметр iType равен 1, то перезагружаются все скрипты, кроме работающих на данный момент. Если параметр iType равен 2, то перезагружаются все скрипты, кроме текущего скрипта (из которого была вызвана данная функция). Плагин с поддержкой Lua 5.2 (чисто испробовать что за зверь ![]() |
Nickolya, Jaska, Invisible, alex82, ExC0tiC | ||
28.1.2010, 21:31 |
Lua 5.2 тестовый вариант |
Изменения в lua.
Изменения в api.
|
Nickolya, Invisible, Saymon21 | ||
27.1.2010, 16:40 |
Support API2 | Комната техподдержки |
ошибка "attempt to call global 'SendToRoom' (a nil value)" исправляется заменой строки Код function Core.SendToRoom(name,msg) на Код function SendToRoom(name,msg) ошибка "attempt to call global 'GetOnlineOps' (a nil value)" исправляется заменой строки Код for _,user in pairs(GetOnlineOps()) do на Код for _,user in pairs(Core.GetOnlineOps() or {}) do На всякий случай прикладываю файл: [attachment=3986:support.lua] |
Invisible, morn, мамин_парень | ||
25.1.2010, 1:15 |
Клиент FGlink DC++ NEW Впервые представлен пользователям |
Если разработчик своего клиента использует исходный код любого DC клиента, который распространяется под лицензией GPL, то это обязывает разработчика наследовать для своего клиента эту лицензию GPL, в противном случае разработчик должен писать весь код клиента сам (ни чего не заимствуя из других DC клиентов с лицензией GPL). |
Nickolya | ||
24.1.2010, 15:07 |
WebServer скрипт создающий веб-интерфейс для хаба |
В коде скрипта так: Код function OnError(sErrorMsg) Core.SendToAll("*** Произошла ошибка в скрипте: "..sErrorMsg) return true end поэтому сообщение об ошибке отправляется всем. Чтобы отправлялось только админу нужно исправить: Код function OnError(sErrorMsg) (при условии, что профиль 0 - это профиль админа Core.SendToProfile(0, "*** Произошла ошибка в скрипте: "..sErrorMsg) return true end ![]() |
Otshelnik-Fm | ||
23.1.2010, 19:03 |
RusHub Кроссплатформенный консольный DC хаб |
Незапланированные версии хаба и lua плагина с фиксами в функциях Core.GetConfig(sName) и Core.GetLang(sName) |
Nickolya, Invisible, ExC0tiC | ||
23.1.2010, 18:43 |
Репорты об ошибках старых версий архив темы ошибок текущей версии хаба |
Багу нашёл. Всё исправлю в ближайшее время. сейчас я пока только приметил еще что iMaxErrLevel и iMaxLevel меняются в любом диапазоне, а не в рабочем, меняется при чем даже на отрицательное значение. А изменение настройки на неправильное значение, к примеру ввод в настройку числового типа букв сбрасывает настройку в 0. Другие значения параметров iMaxErrLevel и iMaxLevel зарезервированы так сказать на будущее. Например, любое отрицательное значение на данный момент отвечает отключению лога вообще, а любое значение, которое больше максимального, будет логировать всё то, что логирует максимальное значение. А любое неправильное значение действительно превращается в ноль, - так уж работает сишная функция atoi ![]() |
Nickolya | ||
23.1.2010, 1:23 |
Клиент FGlink DC++ NEW Впервые представлен пользователям |
Ресторатором менять всякие ресурсы программы. Ресурсы менять не сложно (модифицировать или удалять имеющиеся). |
Saymon21 | ||
22.1.2010, 16:15 |
RusHub Кроссплатформенный консольный DC хаб |
lua plugin v 1.11 Изменения: Fixed: Исправлены баг в работе функции Core.GetGVal. (Баг появился из-за модернизации кода в плагине v 1.10) Fixed: Исправлен баг в работе функции Core.RestartScripts. (спасибо fixx-у за очередной репорт). |
Nickolya, Invisible, Артём, ExC0tiC | ||
22.1.2010, 13:11 |
Вопросы по RusHub Технические вопросы |
На больших хабах вполне естественно что всё упирается в производительность системы. При использовании стека протоколов TCP/IP пользователь идентифицируется сервером по своему ip-адресу, порту на клиентской машине и ip-адресу с портом на серверной машине. Обычно, на серверной машине выделяется по одному порту на каждого из клиентов в текущий момент, следовательно работать с ними можно пользуясь номерами портов и используемым ip-адресом. Вся эта информация скрывается внутри сокетов, которыми можно оперировать как обычными файлами. Можно создавать для каждого пользователя отдельный процесс с копией сервера. Если это делать каждый раз при коннекте пользователя и потом процесс уничтожать, то такой подход становится чрезвычайно расточительным, в связи с тем, что вызов для создания процессов, является очень дорогостоящим: происходит создание копии процесса-родителя (который вызвал этот процесс), что приводит к перемещениям больших объемов данных из одного места оперативной памяти в другое. Можно сразу же создать некоторое количество серверов в отдельных процессах и передавать им управление при поступлении новых запросов. Этот способ значительно лучше, тем не менее он хорошо подходит для процессов, в которых время обработки запросов само по себе значительно, а в данный момент мы рассматриваем обработку данных, когда большую часть затраченного времени составляет именно работа с сетью. Следующий вариант состоит в создании нескольких потоков управления внутри одного процесса. Это так же не является хорошей идеей, потому что очень много процессорного времени будет теряться на переключение процессора с одного потока на другой, в то время как каждый из этих потоков будет занят лишь ожиданием готовности клиента и операционной системы к приему или передаче данных. В случае большого количества одновременных запросов это будет очень медленно. Остается действовать в пределах одного процесса и организовывать цикл обработки сообщений от сетевого окружения операционной системы. Чаще всего используются системные вызовы poll() или select(). Необходимо обратить внимание на то, что конкретно происходит каждый раз, когда выполняется внутренность цикла. Во-первых, инициализация множеств является битовым массивом, где индексом служит числовое значение файлового дескриптора. Эти массивы копируются из адресного пространства процесса в адресное пространство ядра при вызове select() и потом копируются обратно при возврате. Надо отметить, что подобные операции достаточно длительны. Понятно, что при большом количестве соединений количество открытых дескрипторов увеличивается и, тем самым, копируется все большее и большее количество данных из процесса в ядро и обратно. Затем следует "пробежка" по множествам с целью поиска "готовых" дескрипторов. Опять же, в случае большого количества соединений эта операция достаточно длительна. Если на каждую запись или чтение выполняется какая-то своя длительная операция, со своими внутренними циклами, ветвлениями и прочим, то все это не особенно важно. Но если обработка полученных дескрипторов сводится к копированию данных из внутренних буферов в дескрипторы и обратно, то выполнение бесконечного цикла обработки select(), копирования данных при вызове, а так же пробежка по битовым массивам становится, по сути, единственными действиями, которые выполняет сервер. На самом деле, именно эти операции ограничивают его производительность. |
Nickolya | ||
22.1.2010, 1:23 |
Предложения для развития |
1 - зачем задержка? Когда сетевые службы загрузятся тогда и войдёшь на хаб. 2 - выход - запуск хаба как службу. 3 - обновляться модули, библиотеки и хаб могут независимо друг от друга. Для возможности перезагрузит все скрипты используй скрипт FirstRusHubBot |
Otshelnik-Fm | ||
22.1.2010, 0:49 |
Вопросы по RusHub Технические вопросы |
Для lua нет разницы, можете называть просто userdata (даже неверное так и следует делать чтобы не сбивать с толку). Разница есть только для си. ![]() |
Nickolya, alex82 | ||
21.1.2010, 23:26 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.0.9 lua plugin v 1.10 Изменения: Added: Добавлена lua функция отправки данных профилю/профилям: Core.SendToProfile(iProfile/tProfiles, sData, sNick, sFrom). Если первый аргумент - число, то сообщение отправляется профилю, если первый аргумент таблица, то отправляется профилям, указанным в этой таблице. Пример: Код Core.SendToProfile({0, 1}, "Hello", "Bot") -- отправка от бота сообщения Hello профилям 0 и 1 Fixed: Исправлены некоторые мелкие и не значительные баги, а также оптимизированы некоторые процессы. |
Nickolya, Invisible, fixx, Артём, ExC0tiC, Sekretchik, Saymon21 | ||
20.1.2010, 0:07 |
RusHub Кроссплатформенный консольный DC хаб |
lua plugin v 1.9 Изменения: Added: Добавлена api функция Core.Call(sScriptName, sFunc, ...), при помощи которой можно вызывать функции других скриптов. Параметры функции и возвращаемые значения функции могут быть только следующих типов: string, number, boolean, table и userlightdata. |
Nickolya, Invisible, Артём, ExC0tiC | ||
18.1.2010, 19:20 |
Предложения для развития |
Список пока не реализованных идей и запросов ( todo / future request / change request / improvement ). ToDo:
|
Nickolya, Invisible, Infinity_Love, KT315, Saymon21, DEN 007 | ||
17.1.2010, 17:50 |
Предложения для развития |
Отсылку по таблице с профилями тоже реализую. Значение возвращается в том окружении, где вызвана функция. |
Nickolya | ||
17.1.2010, 15:36 |
Предложения для развития |
API функция Core.SendToProfile будет конечно работать быстрее, но пока её нету, можешь использовать lua аналог: Код Core.SendToProfile = function(iProfile, sData, sNick, sFrom) for i, v in ipairs(Core.GetUsers(12)) do if v.iProfile == iProfile then Core.SendToUser(v.UID, sData, sNick, sFrom) end end end После того как я сделаю api функцию Core.SendToProfile, эту lua функцию можно будет удалить, при этом вызовы этой функции не пострадают ![]() |
Nickolya | ||
17.1.2010, 14:49 |
Предложения для развития |
Сделал. Используя потоки добился того, что можно вызвать глобальную функцию другого скрипта с передачей параметров из текущего скрипта, причём глобальная функция будет работать в том окружении, в котором она находится, то есть другими словами вызов функции может менять и вызывать всё что находится в том скрипте в котором определена эта функция))))))) Оказывается я был не прав. Оказывается можно реализовывать всё что угодно. Nickolya, расскажи для чего тебе нужен был данный функционал? ![]() |
Nickolya | ||
16.1.2010, 23:02 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.0.8 lua plugin v 1.8 Изменения: Fixed: Исправлен баг с выскакиванием части команды при регистрации в оп листе (спасибо fixx-у за обнаружение бага) Fixed: Исправлены мелкие баги с логированием некоторых событий как ошибок. Fixed: Исправлены lua api функции Core.RestartScripts, Core.RestartScript, Core.StopScript, Core.StartScript. Теперь функции Core.GetScripts и Core.GetScript нормально отображают скрипты, даже если перезагружается текущий скрипт или все скрипты. Fixed: Исправлены баги в функциях перезагрузки и остановки скриптов для случая удалённого скрипта (спасибо fixx-у за обнаружение бага). Added: Добавлена полная поддержка характеристики UserIP2. Added: Добавлен 13-й бит для функции Core.GetUser и 6-ой тип для функции Core.SetUser. |
Nickolya, Invisible, Артём, Otshelnik-Fm, ExC0tiC | ||
13.1.2010, 16:25 |
Репорты об ошибках старых версий архив темы ошибок текущей версии хаба |
Что хочется видеть в апи: - совсем не ясный параметр iByte в функции Core.GetUser(UID/sNick, iByte), либо объяснений по этому параметру, либо нормальной функции - изменение настроек хаба через луа, хотя бы имени хаба и топика - совместить функции Core.SendToNick(sTo, sData, sNick, sFrom) и Core.SendToUID(UID, sData, sNick, sFrom) - может будет удобней если будет парситься майинфо юзеров - и конечно же расширения апи ![]() Готов реализовать парсинг MyINFO, действительно наверное это было бы удобнее. Тут вопрос: парсить ли тэг, или парсить всё кроме тэга? Парсинг MyINFO строки скорее всего не будет реализован в хабе. Главная причина: способность изменять команды налету (при помощи функции Core.SetCmd). Хотя может и наоборот стоит парсить даже после использования функции Core.SetCmd. Тут стоит подумать как будет эффективнее. По поводу остальных пунктов из цитаты, то вроде всё ясно и реализовано. На очереди реализация возможности отправки всех ip адресов "избранным" и функция регистрации ботов. Спасибо за внимание ![]() |
Nickolya | ||
12.1.2010, 21:22 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.0.7 Fixed: Пофиксил небольшой баг на хабе перехода в скрытый режим. Обнаружил при написании скрипта hideme Выложил исходники хаба и lua плагина Для сборки хаба используем vs2005 или vs2008. Отвечу на все интересующие вопросы по поводу сборки хаба |
Nickolya, Invisible, Otshelnik-Fm, PomanoB, ExC0tiC, KamoK | ||
12.1.2010, 20:17 |
Hideme скрипт скрытия в юзер-листе |
Название скрипта: Hideme Версия скрипта: 1.3 Автор: Setuper Описание: Скрипт позволяет скрываться в юзер-листе. Очень продвинутый функционал. В отличие от птохи, скрытые пользователи никак не могут быть обнаружены (даже при помощи CDM отладчика). Однако, скрытый пользователь может писать в чате и использовать все возможности. Он вообще может считать сябя не скрытым))). Сам скрытый видит свой ник в юзер-листе. Скрытый режим сохраняется даже после переподключения к хабу и даже после перезапуска хаба. Предупреждение о том, что пользователь находится в скрытом режиме поступает непосредственно при входе на хаб. Таблица tProfiles содержит профили, которым разрешено переходить в скрытый режим. Внимание! Для работы скрипта необходим модуль files.lua, который нужно положить в папку libs. Модуль можно скачать ТУТ Для корректной работы скрипта лучше установить хаб не ниже v 2.0.7, так как был устранён небольшой баг в функции скрытия. [attachment=5323:hideme.lua] |
Invisible, fixx, Sekretchik, Saymon21, AltSide, мамин_парень | ||
12.1.2010, 17:43 |
lfs RusHub | Библиотека LuaFileSystem |
Название: LuaFileSystem (lfs) Версия: 1.4.2 Хаб: RusHub Описание: Библиотека для работы с файловой системой. Использование: Помещаем файл lfs.dll в папку libs. Для подключения библиотеки используем функцию require"lfs" Библиотека win32: [attachment=3884:lfs_1.4.2.rar] Библиотека win64: [attachment=5818:lfs_1.4.2_win64.rar] Проект для сборки на vs2008 (win32): [attachment=6415:lfs_1.4.2_src_vs9.zip] Исходники для сборки (*nix): [attachment=5198:lua_file....4.2.tar.gz] |
Nickolya, Invisible, Saymon21, TiGRpp, DEN 007 | ||
12.1.2010, 17:10 |
mysql RusHub | Библиотека базы данных mysql |
Название: mysql Версия библиотеки: 2.1.1 Хаб: RusHub Версия БД: 5.0 Описание: Библиотека для подключения базы данных mysql Использование: Содержимое архива mysql_2.1.1.rar распаковываем в папку libs. Подключается библиотека так: require"luasql.mysql". Примечание: Если не работает, то попробуйте библиотеку libmysql.dll закинуть в корень (папку с rushub.exe) или же в system32 (syswow64 для x64). Библиотека win32: [attachment=3882:mysql_2.1.1.rar] Библиотека win64: [attachment=5814:mysql_2.1.1_win64.rar] Проект для сборки на vs2008: [attachment=6418:mysql_2...._src_vs9.zip] Скрипт примера работы с MySQL в LUA: [attachment=5868:mysql_test.lua] Основные функции для работы Основные функции для работы с mysql в lua Код luasql._COPYRIGHT = "Copyright (C) 2003-2007 Kepler Project" luasql._DESCRIPTION = "LuaSQL is a simple interface from Lua to a DBMS" luasql._VERSION = "LuaSQL 2.1.1" luasql._MYSQLVERSION = "5.0.18"
Объект - соединение (conn)
Объект - курсор (cur)
|
Invisible, Accelerator, PomanoB, Alexey, Saymon21 | ||
12.1.2010, 15:07 |
luasocket RusHub | Библиотека сокетов |
Название: luasocket Версия: 2.0.2 Хаб: RusHub Описание: Библиотека сокетов Использование: Кладём содержимое архива luasocket_2.0.2.rar в папку libs. Подключается библиотека сокетов так: require"socket" Библиотека win32: [attachment=5433:luasocket_2.0.2.rar] Библиотека win64: [attachment=5819:luasocke....2_win64.rar] Проект для сборки на vs2008: [attachment=6416:luasocke..._src_vs9.zip] |
Nickolya, Invisible, Maximum, Sekretchik, Saymon21, Asbar, AfLc | ||
11.1.2010, 22:15 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.0.6 lua plugin v 1.7 Изменения: Added: Добавлена настройка установки локали. Корректное восприятие русских букв или букв других языков (в зависимости от локали). Теперь lua функции string.lower и string.upper корректно работают с русскими буквами. Если на хабе есть пользователь Вася, то с ником ВАСЯ уже нельзя войти на хаб. Added: Добавлена функции сокрытия ника из списка пользователей (12-ый бит функции Core.GetUser и функция Core.SetUser(UID, 5, bool)). Added: Добавлено событие OnKick(UID, sData) Added: Добавлено событие OnOpForceMove(UID, sData) Added: Добавлено событие OnGetINFO(UID, sData) |
Nickolya, BIMMER71, Invisible, Serx, ExC0tiC, Sekretchik, X-Sky | ||
9.1.2010, 21:22 |
Модули для скриптов RusHub |
Файл не найден, поэтому функция Files.LoadText не смогла его открыть и вернула nil. Вот правильный код: Код local sBot = "Security" local sPath = Core.sMainDir.."texts/" require "files" -- для Files.LoadText function OnChat(UID, sData) local sCmd = sData:match"%b<>%s+[!+*](%S+)" if sCmd then local sText = Files.LoadText(sPath..sCmd..".txt") if sText then Core.SendToUser(UID, sText, sBot, sBot) return true end end end |
Invisible, Accelerator | ||
9.1.2010, 20:27 |
Модули для скриптов RusHub |
Модули кладутся в папку libs. Давайте сделаем некое правила написания модулей: файлы модулей будем писать строчными буквами, а модули объявлять тем же словом, но начинающемся с заглавной буквы. Так будет проще отличать название файла с модулем, от названия самого модуля (для того чтобы вникнуть в их суть). Пример использования функций модуля: Код require"files" -- подключение модуля Files.SaveTable("myfile.txt", tTable, "tTable") -- Вызов функции модуля Модуль для работы с файлами: [attachment=3901:files.lua] Модуль различных утилит: [attachment=5424:utils.lua] Давайте в этой теме обсуждать те функции, которые часто используются скриптами, и запихивать их в модули |
Invisible, Ksan, Alexey, Sekretchik, Saymon21, AfLc, мамин_парень | ||
9.1.2010, 19:44 |
Объявления (Announcements) версия 1.1 |
Код local tUser = Core.GetUser(UID, 2047) local sUser = Core.GetUser(UID, 8) Первая строка уже содержит почти все биты, поэтому вторую строку незачем писать. Цитата 2^0 - ник (sNick) 2^1 - ip (sIP) 2^2 - UID (UID) 2^3 - профиль (iProfile) 2^4 - MyINFO строка (sMyINFO) 2^5 - пользовательские данные (sData) 2^6 - пользователь в оп-лите (bInOpList) 2^7 - пользователь полностью вошёл и добавлен в список пользователей (bInUserList) 2^8 - реальный порт (iPort) 2^9 - порт коннекта (iPortConn) 2^10 - мак адрес (sMacAddress) 2^11 - версия протокола (sVersion) В двоичной системе: 000000000001 - ник (sNick) 000000000010 - ip (sIP) 000000000100 - UID (UID) 000000001000 - профиль (iProfile) 000000010000 - MyINFO строка (sMyINFO) 000000100000 - пользовательские данные (sData) 000001000000 - пользователь в оп-лите (bInOpList) 000010000000 - пользователь полностью вошёл и добавлен в список пользователей (bInUserList) 000100000000 - реальный порт (iPort) 001000000000 - порт коннекта (iPortConn) 010000000000 - мак адрес (sMacAddress) 100000000000 - версия протокола (sVersion) Теперь, как перейти из двоичной системы в десятичную? Всё очень просто: отсчитываем справа позицию, на которой стоит единица и возводим двойку в эту степень (отсчёт позиции происходит с 0, а не с 1). То есть для поля ника нулевая позиция, 2^0 = 1. Код local tUser = Core.GetUser(UID, 1) Для профиля: третья позиция, следовательно для профиля 2^3 = 8 Код local tUser = Core.GetUser(UID, 8) А что если 1 не в одном поле, а в нескольких полях? Пример: 101010101010. Каждая позиция отвечает за добавление какого-то поля. Вот и смотрим по позициям какие поля добавятся. Для этих полей будет число (считаем справа на лева): 0*2^0 + 1*2^1 + 0*2^2 + 1*2^3 + 0*2^4 + 1*2^5 + 0*2^6 + 1*2^7 + 0*2^8 + 1*2^9 + 0*2^10 + 1*2^11 = 2730 То есть для того, чтобы в таблицу tUser поместить поля sIP, iProfile, sData, bInUserList, iPortConn и sVersion (именно на позициях этих полей стоит 1 в нашем бинарном числе), нужно в функции написать число 2730: Код local tUser = Core.GetUser(UID, 2730) Давай те теперь разберёмся чему же отвечает число 2047, которое используется в скрипте? Оно отвечает следующей бинарной строке: 011111111111. То есть это число добавит в таблицу tUser все поля, кроме поля sVersion. Каждому десятичному числу отвечает двоичное число. Например, мы рассматривали двоичное число 101010101010 и выяснили, что ему отвечает десятичное число 2730. А каком двоичному числу отвечает следующее десятичное число 2731? Естественно ему соответствует двоичное число 101010101011, то есть для числа 2731 в таблицу tUser добавятся теже самые поля, что и для числа 2730, но плюс ещё поле sNick. 1 = 000000000001 2 = 000000000010 3 = 000000000011 4 = 000000000100 5 = 000000000101 ... 2730 = 101010101010 2731 = 101010101011 2732 = 101010101100 2733 = 101010101101 2734 = 101010101110 2735 = 101010101111 и тд. Надеюсь, что я понятно объяснил работу с бинарными числами. Функция Core.GetUser достаточно хорошо оптимизирует код, если правильно ею распоряжаться и вносить в таблицу tUser только те поля, которые мы собираемся использовать в данной области видимости. У тебя в функции OnChat используется только 2 поля: поле sNick и поле iProfile, поэтому самый оптимальный код будет выглядеть так: Код local tUser = Core.GetUser(UID, 9) таблица tUser будет содержать только эти 2 поля (sNick и iProfile). В функции OnUserEnter всё оптимально, и там ничего менять не нужно.И ещё раз повторю, что не нужно к каждому скрипту делать свой модуль. Модуль должен быть один для всех скриптов, и называться он должен в соответствии с теми функциями, которые он содержит. |
Invisible, Accelerator, Saymon21 | ||
7.1.2010, 18:29 |
Скрипт банов для RusHub тестим и комменьтруем |
хехе ты читаешь всю базу зарегистрированных пользователей, для того чтобы сделать доступ только определённым. А нужно чтобы скрипты работали отдельно, то есть не привязывать скрипт банов к скрипту регистрации. Скрипт регистрации устанавливает пользователям профиль, и этот профиль можно использовать в любом скрипте. Это делается с помощью занесения в таблицу пользователя поля профиля: Код local tUser = Core.GetUser(UID, 8) if tUser.iProfile == 0 or tUser.iProfile == 1 then -- если админ или оператор ... end Это так сказать пояснения...)))) |
Accelerator | ||
6.1.2010, 23:45 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.0.5 lua plugin v 1.6 Изменения: Fixed: Теперь в настройку sHubIP можно записывать не только ip адрес, но и хост. Fixed: В целях оптимизации были убраны lua функции Core.GetMainDir(), Core.GetScriptsDir() и Core.GetHubInfo(). Вместо них теперь поля: Core.sMainDir, Core.sScriptsDir, Core.sHubVersion и Core.sLuaPluginVersion соответственно. В связи с этим, некоторые скрипты откажутся работать! Added: Добавлены lua функции: Core.GetConfig(sName), Core.SetConfig(sName, sValue), Core.GetLang(sName), Core.SetLang(sName, sValue). Функции позволяют управлять конфигурацией и языковыми настройками хаба. Однако, для функции Core.SetConfig исключения составляют настройки: sHubIP, iMainPort, sSubPorts. При изменении настройки sHubName или sTopic отправляется соответствующая команда. После изменения, настройки сохраняются. |
Nickolya, Invisible, ExC0tiC | ||
6.1.2010, 13:57 |
Предложения для развития |
в русхабе намного продвинутый аналог этой функции содержится в функции Core.SendToUser(UID/sToNick, sData, sNick, sFrom) UID/sToNick - UID или ник пользователя, которому хотим отослать сообщение sData - само сообщение Если указан параметр sNick, то сообщение будет отсылаться в чат от этого ника Если кроме параметра sNick указан параметр sFrom, то сообщение будет отсылаться в приват от пользователя sFrom, с ником в сообщении sNick. Для того, чтобы отсылающий и ник в сообщении совпадали, нужно чтобы совпадали параметры sNick и sFrom. Пример: Код Core.SendToUser("Вася", "Тест", "Петя", "Бот") эта строка отошлёт приватное сообщение "Тест" пользователю с ником "Вася", причём на закладке приватного окна будет указано, что сообщение пришло от "Бот", а в самом сообщении будет так: <Петя> Тест Надеюсь понятно разъяснил)))) В общем пробуем)) Хм, вопрос не по хабу а по форуму. может стоит разделить скрипты и модули? т.е. отдельно ветка скриптов отдельно ветка модулей? Модули, я думаю, можно обсуждать в разделе "Разработчикам". |
Accelerator | ||
6.1.2010, 13:53 |
AntiAdv антиреклам |
Кстати, по поводу всяких антиреклам и антиматов, обратите внимание на мощь функции Core.SetCmd(sData) ![]() |
Sekretchik, Saymon21 | ||
6.1.2010, 2:12 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.0.4 lua plugin v 1.5 Обновление хаба было связано с расширением возможностей установки ключика операторов в любое время, а не только при входе на хаб. Список изменений: Added: Добавлена функция Core.GetUpTime() Added: Добавлена функция Core.GetHubInfo() информация о хабе и о плагине. Added: Добавлена новая функция Core.SendToNicks(tNicks, sData, sNick, sFrom). Функция отправляет сообщение всем никам, которые находятся в таблице tNicks. Added: Добавлена функция Core.DisconnectIP(sIP). Разъединяет всех пользователей с указанным IP. Fixed: Исправлена функция Core.SetUser. Теперь пользователь может быть когда угодно занесён и извлечён из списка операторов, а не только при входе на хаб. Ставим/убираем ключик одним движением руки. Код написан оптимально и исключает повторных действий при вызове. Fixed: Исправлен баг в функции Core.GetUsers Fixed: Модифицирована функция Core.GetUsers(sIP, iByte). Core.GetUsers() - таблица с UID'ми всех пользователей хаба Core.GetUsers(iByte) - таблица с таблицами пользователей, которые содержат данные битов параметра iByte Core.GetUsers(sIP) - таблица с UID'ми пользователей с указанным IP Core.GetUsers(sIP, iByte) - таблица с таблицами пользователей с указанным IP, которые содержат данные битов параметра iByte |
Nickolya, Invisible, ExC0tiC, Sekretchik | ||
5.1.2010, 13:42 |
Скрипт для пингеров |
Я убрал из хаба практически всё. Оставил только самое нужное. Остальное оставил на скрипты. Чем же данные не очень корректны? На хабе отсутствуют настройки минимальной шары, минимальных слотов и тд., которые используются в этой команде. Предполагается, что тем, кому нужны эти настройки, те установят себе соответствующие скрипты. Я могу нагромоздить это всё в хабе, однако, разве это нужно? |
Nickolya, dj_crazy_joker | ||
4.1.2010, 23:56 |
Вопросы по RusHub Технические вопросы |
Пользовательские данные - это поле для хранения любой информации для данного пользователя, то есть туда можно записать всё, что угодно - своего рода блокнот пользователя. Можно сделать, чтобы админы туда что-то писали и просматривали эти данные, можно чтобы сами юзеры могли что-то туда заносить, а можно использовать это поле для передачи какой-то информации между скриптами. Core.SetUser(UID, 4, true) до входа (после получения пароля) вносит пользователя в лист операторов (устанавливает ключик). Пример из скрипта регистрации: Код function OnMyPass(UID, sData) local sPass = sData:match"^.- (%S+)$" -- "$MyPass <pass>" local tRegInfo = tRegUsers[Core.GetUser(UID, 1).sNick] -- Получаем регистрационные данные if not sPass or sPass ~= tRegInfo.sPass then -- Проверяем правильность пароля Core.SendToUser(UID, ("<%s> "):format(sBot)..sBadPassMsg.."|$BadPass") -- Отсылаем сообщение о неверном пароле Core.Disconnect(UID) -- Разъединяем пользователя else Core.SetUser(UID, 1, tRegInfo.iProfile) -- Устанавливаем профиль пользователю Core.SetUser(UID, 4, true) -- Добавляем пользователя в оплист end end Хотя действительно нужно сделать эту возможность не только при входе (не только до добавления пользователя в списки). В следующем релизе сделаю. |
Nickolya | ||
4.1.2010, 20:31 |
Скрипт банов для RusHub тестим и комменьтруем |
Название скрипта: модуль банов + менеджер банов Скрипт для: RusHub Автор: Wariner (немного доработал: Setuper) Описание: Модуль банов позволяет использовать функции бана в скриптах. Менеджер банов позволяет забанить, используя команды. Модуль банов не может работать отдельно от менеджера банов, так как менеждер банов содержит основную таблицу с банами. Внимание. Этот скрипт будет работает только с lua плагином, который равен или выше, чем версия v1.4, так как в плагине был устранён баг в функции Core.SetGVal. Теперь расскажу чего я добился. Теперь, подключая модуль Ban в любом скрипте можно будет забанить того или иного пользователя и при этом не нужно будет читать из файла базу забаненных или использовать таблицу с забаненными, - всё это скрыто в модуле Ban. Очень удобно банить с помощью модуля. [attachment=5403:Ban.lua][attachment=5407:BanManager.rar] |
FallenAngel, Invisible, Артём, Infinity_Love, Kingston, Sekretchik, CrazyKiller, Saymon21, Dimon21, X-Sky, Sorrow, AltSide, AfLc | ||
4.1.2010, 20:23 |
RusHub Кроссплатформенный консольный DC хаб |
lua plugin v 1.4 Fixed: Исправлена несколько некорректная работа функции Core.SetGVal с таблицами. |
Nickolya, Invisible, ExC0tiC | ||
4.1.2010, 4:00 |
RusHub Кроссплатформенный консольный DC хаб |
lua plugin v 1.3 Added: Функции Core.GetGVal и Core.SetGVal теперь позволяют оперировать с таблицами и с lightuserdata данными. |
Nickolya, Invisible | ||
3.1.2010, 1:34 |
Репорты об ошибках старых версий архив темы ошибок текущей версии хаба |
вместо функций Core.SendToUID и Core.SendToNick теперь функция Core.SendToUser Просто заменяем эти функции на Core.SendToUser и всё будет работать. Core.SendToUser теперь общая функция отсылки данных пользователю как по нику так и по идентификатору UID. |
Invisible, Saymon21 | ||
3.1.2010, 1:19 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.0.3 lua plugin v 1.2 Изменения коснулись не только плагина, но и хаба (это для того, чтобы исправить некоторые баги). Added: вместо функций Core.SendToUID и Core.SendToNick теперь функция Core.SendToUser(UID/sToNick, sData, sNick, sFrom) Fixed: исправлен баг вылета в функции Core.GetScript при обращении к отключенному скрипту. Fixed: исправлен баг, который не позволял создать лог ошибок скриптов, в случае, если в названии директории присутствовала кириллица. Fixed: исправлен баг функции Core.Disconnect для случая разъединения пользователя по нику. |
Nickolya, Invisible, ExC0tiC, Sekretchik, Saymon21 | ||
2.1.2010, 20:27 |
Скрипт для пингеров |
Название скрипта: pinger Скрипт для: RusHub Версия скрипта: 1.0 Описание: Скрипт для пингеров. Отправляет пингерам, которые заходят на хаб, команду, содержащую информацию о хабе. Автор: Setuper [attachment=5669:pinger.lua] |
Invisible, KT315, Sekretchik, Saymon21, stone, AfLc | ||
2.1.2010, 18:41 |
Репорты об ошибках старых версий архив темы ошибок текущей версии хаба |
alex82, спасибо за скрипт. Я почти не сомневался, что хаб сможет цеплять практически все стандартные библиотеки lua. Что касается названия lua51.dll, то для удобства могу изменить его на lua.dll. Просто для подключения стандартной библиотеки для работы с mysql ( Nickolya, спасибо за обнаружение багов. По поводу функции Core.SendToUID, то про этот баг я знал, в ближайшее время исправлю. По поводу бага с функцией перезагрузки, можно по-подробнее? Пример скрипта? По поводу бага с функцией Core.GetScript, - исправлю в ближайшее время. Объяснения по параметру iByte функции Core.GetUser: С помощью данного параметра мы указываем какие поля мы хотим видеть в таблице, которую вернёт эта функция. Параметр является числом, в котором зашифрованы биты полей. Например: мы хотим в таблице пользователя видеть следующие поля: sNick, sIP, iProfile, sMyINFO. Для этого мы смотрим какие биты отвечают за эти поля: Цитата 2^0 - ник (sNick) 2^1 - ip (sIP) 2^3 - профиль (iProfile) 2^4 - MyINFO строка (sMyINFO) За эти поля отвечают биты: 0, 1, 3 и 4. Складываем: 2^0 + 2^1 + 2^3 + 2^4 = 27 Пишем код: Код local tUser = Core.GetUser(UID, 27) Таблица tUser будет содержать нужные нам поля (sNick, sIP, iProfile, sMyINFO). Теперь для чего это нужно? Это является оптимальным вариантом подачи данных в lua. То есть, заносим в таблицу только то, что мы собираемся использовать, ни больше и не меньше. Сравнение с птохой: в птохе всегда определены 4 поля в таблице пользователя (sNick, sIP, uptr и iProfile), а остальные поля можно занести в таблицу используя либо функцию Core.GetUserAllData, которая занесёт в таблицу все поля, либо функцию Core.GetUserData(tUser, nValueId), которая за один вызов будет заносит один параметр. Поэтому в птохе не оптимальная реализация, так как либо все параметры заноси в таблицу, либо делай несколько вызовов функции Core.GetUserData для занесения необходимых параметров, при этом 4 первоначальных поля в таблице также могут бестолку каждый раз заноситься в таблицу на каждом вызове того или иного события. В русхабе всё это реализовано функций Core.GetUser, которая является самым оптимальным вариантом, при сохранении всей возложенной не неё функциональности. Изменение настроек хаба через lua, также попытаюсь реализовать в ближайшее время. Совместить функции Core.SendToNick и Core.SendToUID - замечательная идея, так и сделаю. Наверное тогда стоит назвать функцию Core.SendToUser ? Готов реализовать парсинг MyINFO, действительно наверное это было бы удобнее. Тут вопрос: парсить ли тэг, или парсить всё кроме тэга? апи постепенно расширяется. Жду дельных идей. |
Nickolya, Invisible | ||
30.12.2009, 4:35 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.0.2 Fixed: Устранены причины падения при ошибках в скриптах и в некоторых api функция. Параметр iMaxLevel - уровень лога событий. Для тестирования: 6 (логировать всё) |
Nickolya, Invisible, ExC0tiC | ||
29.12.2009, 22:44 |
Идея скрипта по отлову двойников |
Во-первых, не кикает а разъединяет. Во-вторых, естественно при совпадении только обоих параметров. В-третьих, куда хочешь, туда и встраивай этот код. |
TranceFM | ||
28.12.2009, 22:58 |
RusHub Кроссплатформенный консольный DC хаб |
rushub v 2.0.0 Added: Реализован lua плагин (минимальный для работы lua функционал реализован). По средствам lua можно реализовать: регистрацию, баны и тд. Для подключения lua плагина кладём файл lua.dll в папку plugins. Lua библиотеки сторонних разработчиков (luasql и тд.) должны подключаться без каких либо перекомпиляций (ограничение только на формат COFF, то есть от птохи библиотеки не подходят, нужно качать отсюда: Работа продолжается... Простенький скрипт приветствия: [attachment=3757:hello.lua] Простенькая регистрация: [attachment=6513:registration.lua] |
Nickolya, Invisible, ExC0tiC, Sekretchik, Saymon21, Mustik | ||
27.12.2009, 14:22 |
Готовый Хаб |
knuckles | |||
23.12.2009, 17:29 |
Chathistory By Mutor API2 | Переведен мною =) |
За такую кривизну даже браться не хочется. Не стал исправлять кривизну скрипта, однако подправил пару вещей: Раскрывающийся текст botname = "Последние 10 сообщений в чате" -- Имя бота BadChars = {".","?","!","+","-",} --На какие префиксы скрипт не будет реагировать maxhistory = 20 -- Максимум линий для чата в кеше chatfile = "chathistory.dat"-- куда будут записываться логи чата GetChat = "+история" -- Команда для показа последних сообщений; Например, +история 10 покажет последние 10 сообщений -- Выбираем, для каких профилей будет доступна команда: -- индекс профиля, история чата [0=нет 1=да], "Название профиля" HistoryProfiles = { [-1] = {0,"Незарегистрированные пользователи"}, [0] = {1,"Мастер"}, [1] = {1,"Оп"}, [2] = {1,"Вип"}, [3] = {1,"Зарегистрированные пользователи"}, } -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- function OnStartup() if loadfile(chatfile) == nil then chathistory = {} local when = os.date(" %B %d %Y в: %X") local chat = "Файл лога главного чата создан: " table.insert(chathistory,when..chat) local f,e = io.open( chatfile, "w+" ) f:write( "return {\n"..string.format("%q",chat..when)..",\n}" ) f:close() end chathistory = dofile(chatfile) --frmHub:RegBot(botname) end function OnExit() savehistory() end function UserConnected(user) Core.GetUserAllData(user) if HistoryProfiles[user.iProfile] and HistoryProfiles[user.iProfile][1] == 1 then local n = #chathistory local str = "" for i = 1, n do str = str.."\r\n"..chathistory[i] end Core.SendToNick(user.sNick,"<"..botname.."> "..str.."\r\n") end end OpConnected = UserConnected function ChatArrival(user,data) Core.GetUserAllData(user) local s,e,pre = string.find(data, "^%b<> (.)") local s,e,cmd,lines = string.find(data, "^%b<>%s+(%S+)%s+(%d+)|$") local when = os.date("[%H:%M] ") local chat = string.sub(data, 1, -2) if cmd and cmd == GetChat then if lines ~= e then GetChatLines(user, lines) return true else Core.SendToNick(user.sNick,"<".."Пожалуйста.."> ".. укажите, сколько сообщений из лога главного чата вы хотите увидеть. Максимальное значение: "..maxhistory..".") return true end else for k,v in ipairs(BadChars) do if pre == v then return end end table.insert(chathistory,when..chat) if #chathistory > maxhistory then table.remove(chathistory, 1) end savehistory() end end function GetChatLines(user, linecount) local n1 = #chathistory local n2 = linecount local n3 = n1 - (n2-1) local str = "" for i =n3,n1 do str = str.."\r\n"..chathistory[i] end Core.SendPmToNick(user.sNick,botname,str.."\r\n") end function savehistory() local f,e = io.open( chatfile, "w+" ) if f then f:write("return {\n") for i = 1, #chathistory do f:write( "\t"..string.format("%q", chathistory[i])..",\r\n" ) end f:write("}" ) f:close() return 1 else return nil end end RegConnected = UserConnected |
|||
21.12.2009, 23:27 |
История чата помогите |
Под желания конкретного человека переделывать никто скрипты не станет. Так всем не угодишь. Не нравится то, что есть, - либо не используй, либо учись корректировать скрипт под себя. |
X-Sky | ||
19.12.2009, 18:31 |
TimeToNewYear API2 | Время до нового года |
Кстати, что касается милисекунд, то меньше 100 мс бестолку ставить. Минимум это 100 мс именно такой минимальный интервал обработки таймеров в птохе |
Nickolya, Invisible | ||
16.12.2009, 15:29 |
С Новым Годом! см название темы |
Написано же с наступающим! |
Uncle_Dif | ||
15.12.2009, 23:23 |
RegmeEmail API2 | Регистрация через e-mail |
Сделал. Пофиксил регулярное выражение для определения формата e-mail адреса (раньше не пропускало e-mail со знаком подчёркивания). Для фикса качаем обновлённый файл email.lua |
Saymon21 | ||
15.12.2009, 18:46 |
RegmeEmail API2 | Регистрация через e-mail |
luxemat: local sFrom = "kirser@bk.ru" -- Адрес отправителя local sServer = "smtp.bk.ru" -- Адрес сервера local sUser = "kirser" -- Имя пользователя local sPass = "*****" -- Пароль local sHubAddress = "94.243.55.201:450" -- Адрес вашего хаба Хабыч: Для того, чтобы добавить команду, нужно в функцию OnStartup() добавить ещё одну функцию cmd.Add, вот так: Код function OnStartup() sBot = SetMan.GetString(21) sSubject = sSubject:gsub("%[HUBNAME%]", SetMan.GetString(0)) email.SetValues(sFrom, sServer, sUser, sPass) cmd.Add("[Rr][Ee][Gg][Mm][Ee]", Regme, Protect) cmd.Add("[Рр][Ее][Гг][Ии][Сс][Тт][Рр][Аа][Цц][Ии][Яя]", Regme, Protect) if loadfile(sFile) then dofile(sFile) end end После этого регистрироваться можно будет как по команде !regme, так и по команде !регистрация Собственно для этого и создавался модуль cmd. Если не нужен верхний регистр, то можно просто добавить cmd.Add("регистрация", Regme, Protect), тогда регистрация будет срабатывать по команде !регистрация, но не будет срабатывать, например, по команде !РЕГИСРАЦИЯ или !рЕгИсТрАцИя Короче говоря можно добавлять команды как регулярные выражения. |
Wan, Saymon21, pol_91 | ||
15.12.2009, 16:21 |
RegmeEmail API2 | Регистрация через e-mail |
Код function RegConnected(tUser) if tNoActivate[tUser.sNick] then tNoActivate[tUser.sNick] = nil end Core.SendToUser(tUser, "$UserCommand 1 3 Регистрация\\Сменить пароль$<%[mynick]> !passwd %[line:Введите новый пароль]|") end OpConnected = RegConnected function UserConnected(tUser) Core.SendToUser(tUser, "$UserCommand 1 3 Регистрация\\Зарегистрироваться$<%[mynick]> !regme %[line:Введите Ваш e-mail]|") end |
Wan, Saymon21 | ||
15.12.2009, 14:36 |
RegmeEmail API2 | Регистрация через e-mail |
Название скрипта: RegmeEmail Версия API: 2 Версия скрипта: 1.0 Автор: Setuper Описание: Простенькая регистрация через e-mail. Команда для регистрации: !regme email@email.com После отправки команды, у пользователя есть 10 минут для того, чтобы зайти в почту, посмотреть там пароль и зайти на хаб. В противном случае авторизация не произойдёт, и спустя 10 минут аккаунт удалится с хаба. ВНИМАНИЕ! Для работы скрипта необходимы модули: cmd и email, а также необходима библиотека сокетов: http://mydc.ru/topic43.html Модули и библиотеку сокетов следует поместить в папку libs. Обо всех ошибках и просьбах писать сюда. Необходимые модули: [attachment=3615:cmd.lua][attachment=3626:email.lua] Непосредственно сам скрипт: [attachment=3625:regme_email.lua] |
Nickolya, Goblin, Tsd, Invisible, valdis73, Saymon21, Stok, GULAM33 | ||
10.12.2009, 13:36 |
С Днюхой Тебя! поздравления |
Поздравляю!)) |
Invisible | ||
9.12.2009, 17:00 |
Помогите скрипты |
ссылку кинул в лс. Тему закрываю ![]() |
Nickolya | ||
9.12.2009, 0:43 |
Нужен Скрип Регистрации С запросом |
Код function ChatArrival(tUser) if tUser.iProfile == -1 then Core.SendToUser(tUser, "*Вы не можете писать в чат пока не зарегистрируетесь* Регистрация осуществляется администратором хаба ежедневно с 20:00 до 00:00") return true end end |
Master-Grow | ||
8.12.2009, 1:55 |
Помогите со скриптом Pinger =) |
У меня всё работает и пинг, и трассировка. Кодировка OEM. Если бы использовалась английская версия винды, то всё нормально бы отображалось))) Пользователи могут долго трассироваться, тем более, что трассировка может содержать до 30 шагов Скрипт с перекодировкой OEM в ANSI: [attachment=3575:ping.lua] |
Invisible, TiGRpp | ||
7.12.2009, 21:11 |
Помогите со скриптом Pinger =) |
см. файл ниже |
Invisible | ||
7.12.2009, 17:53 |
Предложения для развития |
Ага. Реализация функционала операторов не будет привязываться к ключикам))) То есть все настройки зависят только от профиля, но никак не от какого-то атрибута профиля. |
FallenAngel | ||
6.12.2009, 1:00 |
Нужен скрипт скрывающий ботов Бот скрывающий ботов |
Это просто немыслимо использовать такой-то скрипт, который скрывает ботов скриптов))))) Просто в скриптах нужно найти и удалить функцию Core.RegBot |
PRIZrak, Pro009 | ||
3.12.2009, 19:27 |
Вопросы Разработчикам Скриптов вопросы по скриптам (мелкие вопросы) |
Найди отличия между твоим кодом и вот этим: Код function UserConnected(tUser) Core.SendToUser(tUser,"$UserCommand 1 3 »»» Информация\\Правила хаба$<%[mynick]> !rules||".. "$UserCommand 1 3 »»» Информация\\Друзья хаба$<%[mynick]> !friends||".. "$UserCommand 1 3 »»» Информация\\Адреса хаба$<%[mynick]> !adress||".. "$UserCommand 1 3 »»» Информация\\инфа тут например$<%[mynick]> !команда||") end RegConnected,OpConnected=UserConnected,UserConnected Смотри очень внимательно. И слово адрес по английски пишется с удвоенной буквой d: address |
random name | ||
30.11.2009, 22:49 |
Сброс соединения если много Core.Send* PtokaX 0.4.1.1 \ Debian 5 |
В плане кода, я посмотрел, там вот как: если размер буфера отправки начинает превышать некое пороговое значение, и при этом отключена настройка "Keep slow users online", тогда хаб отключает пользователя с переполненным буфером отправки. Если же при данном переполнении включена указанная настройка, то хаб отделяет от буфера несколько первых команд и отсылает пользователю только их, а остальные команды оставляет в буфере и отправляет в следующей партии. |
Nickolya | ||
27.11.2009, 3:04 |
Вопросы Разработчикам Скриптов вопросы по скриптам (мелкие вопросы) |
Выходов из данной ситуации 2: 1) Код local sss = "%%%%%%%%'\"" sss = (sss:gsub("%%", "%%%%").."%s%s"):dbformat("1%%", "2%%%%") Core.SendToAll("sss:dbformat = "..sss.." len = "..sss:len()) 2) Код local sss = "%%%%%%%%%%%%%%%%'\"%s%s" sss = sss:dbformat("1%%", "2%%%%") Core.SendToAll("sss:dbformat = "..sss.." len = "..sss:len()) То есть либо до вставки строки в метод формат удваивать проценты, либо самому формировать строку с удвоенными процентами. Лучше наверное второй способ. Ведь как правило запросы мы сами определяем в программе, и они как правило постоянные. Если же запросы определяются только в процессе (динамически), то первый способ спасёт)) Как правило в запросах у нас вообще нету процентов: Код ("INSERT INTO `table` VALUES ('%s', '%s', '%s')"):dbformat(a, b, c) Вообще-то, написанный пример не очень подходит для использования метода dbformat. Думаю для примера нужно так написать: Код local sss = "qwerty%s%s" Ведь мы экранируем символы в параметрах (a, b), а не в самом запросе. В запросе нам всё известно, поэтому мы там пишем всегда всё корректно, а вот в параметрах может быть всё, что угодно.local a, b = "\\%%%", "\"\\'" sss = sss:dbformat(a, b) Core.SendToAll("sss:dbformat = "..sss.." len = "..sss:len()) Возможно я до конца не понял суть проблемы, но на данный момент (после написания поста) у меня сложилось впечатление, что проблемы как таковой и нету. Или всё же есть? Давайте расставим все точки над и ![]() |
Nickolya | ||
26.11.2009, 23:50 |
Mysql win32 - API 2 | Самая распространённая база данных |
В очередной раз затрагиваю тему экранирования в mysql. Символы, которые обязательно должны экранироваться: ' " \ Символы, которые могут экранироваться в LIKE запросе: % _ \ (при этом символ \ должен экранироваться так: \\\\) Прочие экранированные символы в sql формате: \0 - символ 0 (NUL) в ASCII коде; \b - возврат на один символ; \n - символ новой строки (перевода строки); \r - символ перевода каретки; \t - символ табуляции; \z - символ (Control-Z) таблицы ASCII(26). Данный символ можно закодировать, чтобы обойти проблему, заключающуюся в том, что под Windows ASCII(26) означает конец файла (проблемы возникают при использовании ASCII(26) в выражении mysql database < filename). Дабы скрипты никогда не падали из-за случайно некорректных запросов, модифицируем ранее описанный мною метод dbformat: Код string.dbformat = function(self, ...) local t = {...} for k, v in ipairs(t) do t[k] = tostring(v):gsub("(['\\\"])", "\\%1") end return self:format(unpack(t)) end Кроме этого, для запросов типа LIKE, кроме метода dbformat, нужно будет применить ещё один метод: Код string.dblikeformat = function(self, ...) local t = {...} for k, v in ipairs(t) do t[k] = tostring(v):gsub("([%%\\_])", "\\%1") end return self:format(unpack(t)) end |
Nickolya, Serx, Accelerator, Saymon21 | ||
22.11.2009, 21:38 |
Hub's Big Ass Bot API2 | HUBBABOT v.2.28 |
Контекстное меню хаба))) |
NeRvIk | ||
22.11.2009, 1:34 |
Проблема с запрещенными символами. |
Это никак нельзя исправить. Некоторые из запрещённых символов в нике запрещены протоколом, другие запрещены по другим соображениям, например из-за хранения ников в xml файле, или для возможности создать файл или папку с именем того или иного пользователя. Конечно, можно использовать всякие там эскейп последовательности для экранирования того или иного символа, или использовать коды символов для их отображения, однако, как сделано, так сделано, и это наиболее простой и оптимальный выход из ситуации, который нельзя никак изменить, разве что залезть в исходные коды. Запрещённые символы в нике для PtokaX: $|<>:?*"/\ и пробел. |
TYF | ||
19.11.2009, 14:41 |
Сжатие Zlib Сжатие с помощью zlib после команды $ZOn |
Enyby | |||
16.11.2009, 14:09 |
Ptokax Win Gui Руководство по установке и настройке |
Настройки - Дополнительно - Моя информация Строка описания, строка тэга, строка соединения строка e-mail. Всем юзерам. |
thehawk | ||
15.11.2009, 18:49 |
Luasocket win32 | Работа с сокетами |
Интересно что и куда ты переписываешь? Выложенные тут библиотеки работают только под виндой. Под юниксы нужно самому собирать сошки из исходников:[attachment=3505:luasocket_2.0.2.tar.gz] |
dj_crazy_joker | ||
13.11.2009, 13:05 |
ShowTopic API2 | Показ топика в чате |
Условие Код if cmd and (cmd == cmdTop) then было написано правильно. Оно предостерегает от попытки сравнить cmdTop с nil, так как пользователь может отправить, например, пустую строку в чат, и тогда регулярное выражение ничего не захватит.Что касается установки топика, то нужно писать SetMan.GetString(10, "новый топик"). Код: Код Core.SendToAll(Data) Core.SendToAll("<"..Bot.."> Топик хаба: "..SetMan.GetString(10).."") лучше писать в одну функцию: Код Core.SendToAll(Data.."|<"..Bot.."> Топик хаба: "..SetMan.GetString(10)) И конечно же нужно избавляться от очень дурной привычки добавлять конкатенацию с пустой строкой! Не знаю от кого она пошла, но она очень вредная. |
X-Sky | ||
6.11.2009, 20:19 |
Вопросы Разработчикам Скриптов вопросы по скриптам (мелкие вопросы) |
Код function OnStartup() Core.SendToAll(ScriptMan.GetScript().sName) end Нельзя вызывать функцию, которая возвращает информацию о самом скрипте, до выполнения функции, инициализирующей этот самый скрипт !!! |
Jaska | ||
1.11.2009, 12:44 |
Перевод Hexhub 5.03a Нужны тестеры |
По протоколу NMDC результаты поиска при пассивном поиске проходят через хаб, при активном поиске не через хаб, а напрямую. |
valdis73 | ||
30.10.2009, 14:55 |
Как зашитится от спам бота помогите спамят |
как вариант: http://mydc.ru/topic1898.html |
KamoK | ||
29.10.2009, 23:55 |
PingerWatch API2 |
вместо условия Код if x then напиши условие Код if x and Pingers[x] then |
Артём, мамин_парень | ||
27.10.2009, 16:23 |
Защита от DDoS атак Защита в первую очередь |
DDOS атаки бывают разными. Никогда нет 100% защиты от них. На уровне скриптов вообще практически ничего сделать нельзя. Единственная защита на уровне скриптов - это антифлуд. Методы борьбы с DDOS:
|
Nickolya, shur49 | ||
23.10.2009, 17:10 |
Скачивание файл-листа, nmdc Последовательность команд |
Последовательность такая: Активное соединение: Код Клиент1 -> Хаб: $ConnectToMe Ник2 ip1:port1| Хаб -> Клиент2: $ConnectToMe Ник2 ip1:port1| Клиент2 -> Клиент1: $MyNick Ник2| Клиент1 -> Клиент2: $MyNick Ник1|$Lock ...| Клиент2 -> Клиент1: $Lock ...| Клиент1 -> Клиент2: $Supports ...|$Direction Download Number1|$Key ...| Клиент2 -> Клиент1: $Supports ...|$Direction Upload Number2|$Key ...| Клиент1 -> Клиент2: $ADCGET ...| Клиент2 -> Клиент1: $ADCSND ...| Пассивное соединение: Код Клиент1 -> Хаб: $RevConnectToMe Ник1 Ник2| Хаб -> Клиент2: $RevConnectToMe Ник1 Ник2| Клиент2 -> Хаб: $ConnectToMe Ник1 ip2:port2| Хаб -> Клиент1: $ConnectToMe Ник1 ip2:port2| Клиент1 -> Клиент2: $MyNick Ник1| Клиент2 -> Клиент1: $MyNick Ник2|$Lock ...| Клиент1 -> Клиент2: $Lock ...| Клиент2 -> Клиент1: $Supports ...|$Direction Download Number2|$Key ...| Клиент1 -> Клиент2: $Supports ...|$Direction Upload Number1|$Key ...|$ADCGET ...| Клиент2 -> Клиент1: $ADCSND ...| Номерами помечены параметры, которые относятся к соответствующим клиентам. Вместо команд $ADCGET и $ADCSND могут использоваться команды $Get и $Send. Всё зависит от поддерживаемых клиентами характеристик, которыми они обмениваются при помощи команды $Supports. Подробнее о каждой команде читай тут: http://mydc.ru/index.html?showtopic=915 |
Saymon21 | ||
19.10.2009, 18:22 |
Скрипт смены группы пользователей |
1. Закрываешь хаб. 2. Открываешь файл cfg/RegistredUsers.xml 3. Жмёшь Ctrl-H. 4. Заменяешь <Profile>2</Profile> на <Profile>3</Profile> 5. Запускаешь хаб. |
|||
19.10.2009, 12:13 |
Вопросы Разработчикам Скриптов вопросы по скриптам (мелкие вопросы) |
Нет. Не так. В простых случаях нужно использовать конкатенацию: Код local s = "блабла"..MoreBla() В сложных случаях - метод format. Рассмотрим случай: Код local s = "блабла"..MoreBla() Итак, как работает конкатенация? Память выделяется под строку "блабла" и под результат функции MoreBla(). Эти значения будут занимать 2 ячейки в lua стеке. После конкатенации по адресу "блабла" запишется результат конкатенации, по во второй же ячейке стека останется мусор. Если же к этому случаю мы применим метод формат: local s = ("блабла%s"):format(MoreBla()), то произойдёт следующее: сначала в стек отправится сам метод format, потом отправится первый его аргумент, то есть строка "блабла%s", потом отправится второй аргумент, то есть MoreBla(). После выполнения метода, результат выполнения запишется на верх стека. То есть стек будет выглядеть так: 1: "блаблаBLABLABLA", 2: "блабла%s", 3: "BLABLABLA". Получили, что глубина стека равна 3. В случае конкатенации глубина стека у нас была равна 2. (1: "блаблаBLABLABLA", 2: "BLABLABLA"). Поэтому при простой конкатенации метод формат проигрывает, так как выделяет больше памяти. Рассмотрим случай: Код local a = 123 local b = 456 local s1 = "блабла"..a..b local s2 = ("блабла%s%s"):format(a, b) 1) Содержимое стека при конкатенации: 1: "блабла", 2: "123", 3: "456" 2) Содержимое стека при формате: 1: FUNC, 2: "блабла%s%s", 3: "123", 4: "456" Опять имеем проигрыш. Случай: Код local a = 123 local b = 456 local s1 = "блабла"..a.."hihi"..b local s2 = ("блабла%shihi%s"):format(a, b) Тут я выписывать содержимое стека не буду, но скажу, что тут конкатенация и метод формат идентичны. Однако, дабы не делать лишний вызов, использовать лучше конкатенацию. Ещё один пример: Код local a = 123 local b = 456 local s1 = "блабла"..a.."hihi"..b.."qwerty" local s2 = ("блабла%shihi%sqwerty"):format(a, b) Тут уже выигрывает метод формат. Делаем вывод: метод формат выгодно использовать при конкатенации трёх и более временных строк (Временные строки: "блабла", "hihi", "qwerty")! Вообще говоря, метод format - это урезанный аналог сишной функции sprintf ( |
district | ||
18.10.2009, 19:48 |
Вопросы Разработчикам Скриптов вопросы по скриптам (мелкие вопросы) |
Можно. Это называется оптимизацией глобальных переменных. Почему переменных? Потому что в lua функция - это тип переменной. То есть переменной мы можем присвоить как строку или таблицу так и функцию. Например: Код local p = "str" -- инициализация переменной с присвоением ей строки p = {} -- присвоение таблицы p = 5 -- присвоение числа p = function() return "fff" end -- присвоение функции Например, у нас есть глобальная функция MyFunc, которая объявлена в файле 1.lua. Мы её вызываем из файла 2.lua. В самом начале файла 2.lua мы прописываем строку Код local _G = _G после этого вызываем нашу функцию, которая уже будет локальной:Код _G.MyFunc Тут код local _G = _G означает создание локальный ссылки на глобальную таблицу глобального окружения. Переменная является локальной ссылкой на уже существующие данные.Вообще говоря таким способом следует оптимизировать и такие функции: Код local tbl_maxn = table.maxn local tbl_insert = table.insert local math_sin = math.sin local os_date = os.date local os_execute = os.execute и так далее... И вызываем уже, например, функцию tbl_insert(tTable, 5), а не table.insert(tTable, 5), как мы это обычно делаем. Однако, например string.find таким образом оптимизировать не стоит, так как можно просто воспользоваться уже локальным методом: ("строка"):find(...). Метод уже локален. Единственную функцию из таблицы string, которую нужно оптимизировать это функцию string.char, так как к ней нельзя применить локальный метод. Кстати говоря, функцию MyFunc можно оптимизировать и так: Код local MyFunc = _G.MyFunc и именно эта оптимизация является максимальной, а не та, что рассмотрена в начале поста. Однако, оптимизировать таким образом каждую глобальную функцию слишком нудно, да и код сильно возрастает при большом количестве функций, поэтому обычно делают так как я описал в начале поста. |
district | ||
![]() |
Сейчас: 22.2.2025, 11:40 |