myDC.ru

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

 
История благодарностей участнику Setuper. Спасибо сказали: 1708
Дата поста: В теме: За сообщение: Спасибо сказали:
4.3.2011, 10:14 DDD++ – лёгкий и быстрый DC++ клиент
Преднастроенный клиент с готовыми списками хабов
Думаю автору следует указать, что данный клиент - это очередной мод клиента GreyLink, чтобы не было не было подобных вопросов про баги и тд.

Invisible, по поводу багов следует обращаться к разработчикам GreyLink.
Invisible
1.3.2011, 18:22 От: Small DC HubList (Хаблист)
От темы с ID: 4709
EvilNico (91.206.126.125) == Mellon (91.206.126.125)

Отсюда и весь холивар.

Видимо сюда пришёл спамить.

Почитав на dchublist.ru, становится понятно, что всё наоборот, и это на http://dc.nicosoft.ru/ левотня стыренная big_smile.gif
Артём
27.2.2011, 11:01 ChatRanks
топ сообщений в чате
Поправил и перезалил скрипт
Otshelnik-Fm
25.2.2011, 17:05 Antisearch
API 2
Подправил некоторые баги с временем, плюс добавил глобальные функции в локальные таблицы (оптимизация).

Заменил хранимую функцию as_get_random_tth запросом. Сделал для того, чтобы, не имея доступ к хранимым функциям, можно было делать select запросы в бд (ограничения, позволяющие только получать данные из бд, но не добавлять/обновлять/удалять).

Для оптимизации ввёл кеширование (актуально при завале хаба результатами поиска).
Saymon21, ramzes
24.2.2011, 22:30 Antisearch
API 2
Название скрипта: Antisearch
Версия скрипта: 1.4
Версия API: 2
Автор: Setuper
Требования: Для работы скрипта требуется библиотека MySQL
Описание: Скрипт антипоиска. Скрипт хранит в mysql базе TTH запрещённых файлов.
Скрипт автоматически ищет у пользователей запрещённые TTH и даёт наказания за них.
Наказания могут быть следующих типов:

0 - без действий;
1 - дроп;
2 - кик;
3 - временный бан ника;
4 - временный бан IP;
5 - временный бан ника и IP;
6 - постоянной бан ника;
7 - постоянной бан IP;
8 - постоянной бан ника и IP.

Скрипт имеет меню в поиске и в файл-листах, то есть вводим и ищем в поиске то, что нужно запретить, и через меню одним щелчком добавляем TTH найденного в базу с одновременным наказание пользователя, у которого это нашли. Возможно даже выделить сразу несколько найденных файлов и одним щелчком добавить в бд big_smile.gif

Для того чтобы добавлять TTH в базу нужно чтобы было создано хотя бы одно наказание.
В настройках iDefaultPenaltyId - это id наказания по умолчанию (для менюшки "Быстрое добавление TTH", то есть для добавления в базу TTH с наказанием по умолчанию).


Прежде чем запускать скрипт нужно предварительно настроить базу данных на работу со скриптом:
1) Прописать в скрипте настройки коннекта к базе данных.
2) Создать базу
3) Выполнить запросы, которые находятся в файле Antisearch.sql

Также необходимо в настройках PtokaX указать какой-нибудь не нулевой UDP порт.


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

Из менюшек думаю будут понятны прочие детали скрипта)))
Настраиваем правильно, юзаем и боремся с порнографией big_smile.gif


[attachment=5651:Antisearch.rar]
Nickolya, KauH™, Invisible, Артём, PomanoB, KT315, Kingston, MaxFox, Saymon21, DEN 007, ramzes, GULAM33
22.2.2011, 20:25 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
На lua.ru плохо написано.


"r" - открыть файл для чтения. Файл должен существовать.
"w" - создать пустой файл для записи. Если файл с таким именем уже существует, то его содержание будет удалено, а файл будет рассматриваться как новый пустой файл.
"a" - добавить в файл. Дописывает данные в конец файла. Файл создается, если он не существует.
"r+" - открыть файл как для чтения, так и для записи. Файл должен существовать.
"w+" - создать пустой файл для чтения и записи. Если файл с таким именем уже существует, то его содержание будет удалено, а файл будет рассматриваться как новый пустой файл.
"a+" - открыть файл для чтения и добавления. Все операции записи выполняются в конец файла. Файл создается, если он не существует.

Кроме этого, для работы с бинарными файлами существуют моды: "rb", "wb", "ab", "r+b", "w+b", "a+b", то есть теже самые моды но с буквой b на конце.
Буква b может также находится и в середине: "rb+", "wb+", "ab+".
MIKHAIL
24.1.2011, 18:05 Люди помогите!
помогите с компом
Очень часто так делают вирусы.
Поставь антивирус и проверь им комп
Something_Wild
18.1.2011, 14:46 Surdo_Isolation
Почти универсальный скрипт заглушек с богатым меню и возможностями
В русхабе на такой случай существует функция изменения протокольной команды Core.SetCmd(sData), таким образом, во все скрипты, которые находятся ниже данного, поступит уже изменённая команда big_smile.gif
Nickolya, Invisible
17.1.2011, 10:02 Функции Для Разработчиков
склад полезных функций
Вместо tprint наверное table.print ?
И если функция print стандартная lua функция, то наверное лучше в ней тоже не использовать конкатенацию, а сделать как в Serialize.
То есть, вместо
Код
print(a..b..c..d)
юзать
Код
print(a, b, c, d)
а на вставку табов между аргументами я думаю можно забить, хотя возможно будет кривовато отображаться big_smile.gif
Nickolya, Invisible, Sekretchik
16.1.2011, 23:00 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.2.14
lua plugin v 1.33


Added: Реализован стектрейс lua-ошибок: _TRACEBACK = debug.traceback.

Fixed: Устранен баг с уборкой мусора от UID.
Fixed: Устранен баг в функции закрытия соединения (poll функционал в select случае).
Fixed: Объединены функции Core.SendToNicks и Core.SendToUser (функция Core.SendToNicks осталась, но считается устаревшей)
Fixed: Усовершенствована функция Core.GetUsers. Разделились возвращаемые пользователи на группы: все и все вошедшие (Core.GetUsers(bAll), Core.GetUsers(sIP, bAll)).
Core.GetUsers() - вернёт только уже полностью вошедшие на хаб пользователей
Core.GetUsers(true) - вернёт всех пользователей
Аналогично и для случая возврата по ip: Core.GetUsers(sIP) и Core.GetUsers(sIP, true)

Fixed: Изменена кодировка в файле scripts.xml с windows-1252 на windows-1251.
Fixed: Подправлен путь до файла lua.hpp (lua/lua.hpp).
Fixed: Файл luaerr.log переменён в папку logs.
Nickolya, Jackson, Otshelnik-Fm, ExC0tiC, KT315, Sekretchik, Saymon21, Dimon21, LEXSOR
15.1.2011, 10:53 Ошибки текущей версии хаба
Обнаруженные ошибки публикуются в этой теме
Спасибо. Исправлю этот баг.
Что касается параметров WebID, то можно получать параметры: UID, sIP, sIPConn, iPort, iPortConn, iEnterTime
Nickolya
11.1.2011, 20:21 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
хехе.
Да да, я не клавишей ошибся, я языком ошибся. Написал как в с++ big_smile.gif
Sekretchik
11.1.2011, 15:51 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
У меня всё правильно написано. Если
Код
if #sMsg != 0 then
то отправляй, иначе пиши, что "не отправляю пустые сообщения"
Sekretchik
11.1.2011, 10:24 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Ещё один момент. Чтобы каждый раз не формировать строку с командами, лучше вынести её за предел функции:
Код
local sUserCommand = "$UserCommand 1 1 "..sMenu..UID.sNick.."  •  :::\\::: Сообщения  •  "..sHubName.."  •  :::\\::: Для Администрации :::$<%[mynick]> +opmess %[line:Введите текст сообщения]&#124;|"..
"$UserCommand 1 1 "..sMenu..UID.sNick.."  •  :::\\::: Сообщения  •  "..sHubName.."  •  :::\\::: Для Всех Юзеров :::$<%[mynick]> +massmes %[line:Введите текст сообщения]&#124;|"..
"$UserCommand 1 1 "..sMenu..UID.sNick.."  •  :::\\::: Сообщения  •  "..sHubName.."  •  :::\\::: Для Юзера от Бота :::$<%[mynick]> +frombot %[line:Ник] %[line:Введите текст сообщения]&#124;|"..
"$UserCommand 1 2 "..sMenu..UID.sNick.."  •  :::\\::: Сообщить этому Юзеру :::$<%[mynick]> +frombot %[nick] %[line:Введите текст сообщения]&#124;"

function OnUserEnter(UID)
    if tAccess[UID.iProfile] == 1 then
        Core.SendToUser(UID, sUserCommand)
    end
end


А функция OnChat опять написана плохо. Зачем опять второе регулярное выражение?
Код
local fbm = sData:match"^%b<>%s+%p%S+%s+(.+)"

Да и первое регулярное выражение немного по-другому должны быть написано:

Код
function OnChat(UID, sData)
  local sCmd, sArg = sData:match"^%b<> [%+!/](%S+)%s*(.*)$"
  if sCmd then
    if sCmd == "massmes" then
      if tAccess[UID.iProfile] == 1 then
        if #sArg == 0 then
          Core.SendToUser(UID, " *** Извините, пустые сообщения не отправляю. Попробуйте ещё раз.", sBot)
        else
          Core.SendToProfile({0, 1, 2, 3, -1}, "\r\n\r\n\t *** СООБЩЕНИЕ ДЛЯ ВСЕХ ***\r\n\r\n\t •  "..sArg.."  •\r\n", sBot, sBot)
          Core.SendToUser(UID, " *** Ваше сообщение  •  ДЛЯ ВСЕХ  •  успешно отправлено.", sBot)
        end
      else
        Core.SendToUser(UID, " *** У вас недостаточно прав для выполнения этой команды!", sBot)
      end
      return true
    elseif sCmd == "opmess" then
      if tAccess[UID.iProfile] == 1 then
        if #sArg == 0 then
          Core.SendToUser(UID, " *** Извините, пустые сообщения не отправляю. Попробуйте ещё раз.", sBot)
        else
          Core.SendToProfile({0,1}, "\r\n\r\n\t *** СООБЩЕНИЕ ДЛЯ АДМИНИСТРАЦИИ ***\r\n\r\n\t •  "..sArg.."  •\r\n", sBot, sBot)
          Core.SendToUser(UID, " *** Ваше сообщение  •  ДЛЯ АДМИНИСТРАЦИИ  •  успешно отправлено.", sBot)
        end
      else
        Core.SendToUser(UID, " *** У вас недостаточно прав для выполнения этой команды!", sBot)
      end
      return true
    elseif sCmd == "frombot" then
      if tAccess[UID.iProfile] == 1 then
        local sNick, sMsg = sArg:match"^(%S+)%s*(.*)"
        if sNick then
          if #sMsg ~= 0 then
            local tUser = Core.GetUser(sNick)
            if tUser then
              Core.SendToUser(tUser, "\r\n\r\n\t *** ВАМ ПЕРСОНАЛЬНОЕ СООБЩЕНИЕ ***\r\n\r\n\t •  "..sMsg.."  •\r\n", sBot, sBot)
              Core.SendToUser(UID,
                " *** Ваше сообщение для  •  "..sNick.."  •  от имени  •  "..sBot.."  •  успешно отправлено.", sBot
              )
            else
              Core.SendToUser(UID, " *** Ошибка: Юзер  •  "..sNick.."  •  на хабе не найден!", sBot)
            end
          else
            Core.SendToUser(UID, " *** Извините, пустые сообщения не отправляю. Попробуйте ещё раз.", sBot)
          end
        else
          Core.SendToUser(UID, " *** Не введён ник. Попробуйте ещё раз.", sBot)
        end
      else
        Core.SendToUser(UID, " *** У вас недостаточно прав для выполнения этой команды!", sBot)
      end
      return true
    end
  end
end
Sekretchik, Saymon21
10.1.2011, 18:38 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Код
local sBot = Config.sHubBot
local sNick = "ник"
Core.SendToUser(sNick, "Привет", sBot)
Sekretchik, мамин_парень
9.1.2011, 18:11 Несколько Слов О Захватах И Регулярных Выражениях
исключительно для разработчиков
Дело в том, что в регулярке lua, в отличие от перловской регулярки, нету знака "или", который обозначается в перле пайпом - "|".

Что касается указанного примера:
Код
"лож[е]?[ч]?ка"
то тут можно обойтись и без символьных классов:
Код
"ложе?ч?ка"
Ksan, Serx
9.1.2011, 17:57 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Лучше не вызывать функцию Core.SendToUser несколько раз, а сформировать строку полностью (разделяя команды знаком | ) и вызвать её 1 раз.
Код
function OnUserEnter(UID)
    if tAccess[UID.iProfile] == 1 then
        Core.SendToUser(UID, "$UserCommand 1 1 "..sMenu..UID.sNick.."  •  :::\\::: Сообщения  •  "..sHubName.."  •  :::\\::: Для Администрации :::$<%[mynick]> "..sPreff.."opmess %[line:Введите текст сообщения]&#124;|"..
        "$UserCommand 1 1 "..sMenu..UID.sNick.."  •  :::\\::: Сообщения  •  "..sHubName.."  •  :::\\::: Для Всех Юзеров :::$<%[mynick]> "..sPreff.."massmes %[line:Введите текст сообщения]&#124;")
        --Core.SendToUser(UID,"$UserCommand 1 2 "..sMenu..UID.sNick.."  •  :::\\::: Сообщение от имени бота :::$<%[mynick]> "..sPreff.."frombot %[nick] %[line:Введите текст сообщения]&#124;")
    end
end



Смысл конструкции ("%s"):format(sMsg) не понятен.
А вот это:
Код
    local _,_, sCmd = sData:find"^%b<>%s+%p(%S+)" -- ищем команду
    local _,_, sMsg = sData:find"%b<>%s+%S+%s+(.+)"
можно объединить в одну конструкцию.
Возвращаемым значением return true лучше тоже не загромождать код, а написать его в конце логического выражения.
В итоге получаем:

Код
function OnChat(UID, sData) -- сообщение в чат
    local sCmd, sMsg = sData:match"^%b<>%s+%p(%S+)%s*(.*)" -- ищем команду
    if sCmd then
        if sCmd == "massmes" then
            if tAccess[UID.iProfile] == 1 then
                if #sMsg == 0 then
                    Core.SendToUser(UID, "*** Извините, пустые сообщения не отправляю. Попробуйте ещё раз.", sBot)
                else
                    Core.SendToProfile({0, 1, 2, 3, -1}, "\r\n\r\n\t *** СООБЩЕНИЕ ДЛЯ ВСЕХ ***\r\n\r\n\t •  "..sMsg.."  •\r\n", sBot, sBot)
                    Core.SendToUser(UID, "*** Ваше сообщение  •  ДЛЯ ВСЕХ  •  успешно отправлено.", sBot)
                end
            else
                Core.SendToUser(UID, " *** У вас недостаточно прав для выполнения этой команды!", sBot)
            end
            return true
        elseif sCmd == "opmess" then
            if tAccess[UID.iProfile] == 1 then
                if #sMsg == 0 then
                    Core.SendToUser(UID, "*** Извините, пустые сообщения не отправляю. Попробуйте ещё раз.", sBot)
                else
                    Core.SendToProfile({0,1}, "\r\n\r\n\t *** СООБЩЕНИЕ ДЛЯ АДМИНИСТРАЦИИ ***\r\n\r\n\t •  "..sMsg.."  •\r\n", sBot, sBot)
                    Core.SendToUser(UID, "*** Ваше сообщение  •  ДЛЯ АДМИНИСТРАЦИИ  •  успешно отправлено.", sBot)
                end
            else
                Core.SendToUser(UID, "*** У вас недостаточно прав для выполнения этой команды!", sBot)
            end
            return true
        end
    end
end
Sekretchik, Saymon21
9.1.2011, 13:58 Несколько Слов О Захватах И Регулярных Выражениях
исключительно для разработчиков
Квадратные скобки обозначают так называемые символьные класса. Это означает, что на данном месте может стоять любой из символом, который указан в символьном классе.
В символьном классе возможно задать диапазоны символов: [А-Яа-я]. Так выглядит диапазон всех русских букв за исключением Ё и ё.
Что касается плюсика, то к символьному классу можно его применять.

Код
local s="baaabbbababbbaaaaab bababbbababbabbabbab"
print(s:match"([ab]+)") -- Результат: baaabbbababbbaaaaab
Nickolya, Serx
7.1.2011, 12:21 Несколько Слов О Захватах И Регулярных Выражениях
исключительно для разработчиков
Код
local sDescription, sTag = sDesc:match'^(.*)(<.*>)$'
if not sDescription then
  sDescription = sDesc
  sTag = ''
end
Sekretchik
7.1.2011, 1:48 Несколько Слов О Захватах И Регулярных Выражениях
исключительно для разработчиков
Не знаю зачем парсить это руками, когда обычно хаб парсит это дело, однако вот решение:

Код
local sNick, sDesc, sSpeed, sEmail, iShare = tUser.sMyINFO:match"%$MyINFO %$ALL (%S+)%s+(.-)%$ %$(.-)%$(.-)%$(%d+)%$"
Sekretchik
6.1.2011, 23:14 AntiPornoSearch
Блокирует поиск по прописанным в скрипте словам
Вместо функции SearchArrival нужно написать функцию OnSearch вот так:
Код
function OnSearch(tUser, sData)
  if tProfiles[tUser.iProfile] ~= 1 then
    local seach = sData:match"$Search .-%s%u%p%u%p%d%p%d+%p(%S+)"
    if seach and (tExceptions[String2Lower(seach)] == 1) then
      return true
    end    
  end    
end
Nickolya, Otshelnik-Fm, ramzes
6.1.2011, 15:32 Ошибки текущей версии хаба
Обнаруженные ошибки публикуются в этой теме
Всё правильно. Вот в чём загвоздка...
При поиске ты указал ник бота, следовательно результаты поиска будут приходить на ник бота, а хаб пытается найти по нику пользователя, а бот не является пользователем.
Nickolya
6.1.2011, 13:25 Вопросы по RusHub
Технические вопросы
Если хаб онлайн, а хаб лист показывает его как оффлайн, то это проблемы в хаблисте а не в хабе
по поводу отключения проверок смотри двумя постами выше

Список всех настроек написан тут: http://mydc.ru/topic2378.html
Список всех настроек можно также получить скриптом:
Код
for _, v in ipairs(Config.table()) do
  Core.SendToAll(v.." = "..Config[v])
end
Invisible, Sekretchik
6.1.2011, 12:18 ChatHistorySQL
История чата (MySQL)
функция lua_getfield будет в луа плагине только при статической линковке либы lua.a с луа плагином при сборке, а я так полагаю, что у вас lua линкуется как shared lib, поэтому не может идти речи о том чтобы луа плагин содержал функцию lua_getfield.

Поэтому нужно либо собирать луа плагин со статической линковкой lua, либо пересобирать либу mysql.so, подстраивая её под shared lib
Nickolya
2.1.2011, 19:16 С Новым Годом!
см название темы
С новым годом!!! feel_good.gif
Nickolya, Sekretchik
2.1.2011, 19:11 От: luasocket
От темы с ID: 2951
Эм... это наверное мои тестовые записи написаны.
Пардон

Перезалил
Nickolya, Invisible, Saymon21
2.1.2011, 18:53 Вопросы по RusHub
Технические вопросы
Настройки (1 - проверять, 0 - не проверять):
bCheckSRNick - проверять ник в $SR команде
bCheckRctmNick - проверять ли ник в RCTM команде
bCheckCTMIp - проверять ip в CTM команде
bCheckSearchIp - проверять ip при активном поиске
Nickolya, Infinity_Love
31.12.2010, 13:42 Ошибки текущей версии хаба
Обнаруженные ошибки публикуются в этой теме
В общем буду разбираться
Saymon21
31.12.2010, 13:15 Ошибки текущей версии хаба
Обнаруженные ошибки публикуются в этой теме
Вот из-за чего падает хаб: http://www.lua.ru/doc/2.10.html

Цитата
Сборщик мусора обрабатывает все объекты Lua: таблицы, данные типа userdata, функции, потоки и строки.


Lua пытается сборщиком мусора удалить объект userdata. Подозреваю, что происходит это при использовании скрипта банов (функции GetGVal / SetGVal).

В новом году буду разбираться как это обойти
Nickolya, Saymon21
29.12.2010, 18:03 Ошибки текущей версии хаба
Обнаруженные ошибки публикуются в этой теме
Повторяю, что баг в луа, а не в хабе. Хаб падает потому, что луа интерпретатор работает из-под процесса хаба.
Баг возникает при попытке убрать мусор при закрытии луа состояния (остановка скрипта).

Возможное решение - это переход на lua 5.2
Nickolya
29.12.2010, 15:08 Ошибки текущей версии хаба
Обнаруженные ошибки публикуются в этой теме
Баг ни хаба, и ни плагина. Это баг в lua.
По всей видимости в версии lua 5.1.4 он пофикшен (я уже не говорю о версии 5.2): http://lua-users.org/lists/lua-l/2008-05/msg00363.html
Saymon21
27.12.2010, 23:11 Ошибки текущей версии хаба
Обнаруженные ошибки публикуются в этой теме
Перезалил хаб, увеличив глубину стека.
Nickolya, Saymon21
27.12.2010, 22:49 Модули для скриптов RusHub
Спасибо. Исправил и перезалил
Sekretchik
27.12.2010, 8:07 Ошибки текущей версии хаба
Обнаруженные ошибки публикуются в этой теме
О ужас. Я думал 30 строк стека будет достаточно. Оказалось это слишком мало.
В данном стеке вызовов только функции lua интерпретатора, и я не могу сказать из-за чего был крах. Нужно будет увеличить чисто строк стека на порядки.
Nickolya, Saymon21
26.12.2010, 21:58 Скрипт банов для RusHub
тестим и комменьтруем
Как это не вылетает?
У меня все вылетают. Даже по несколько человек (если бан по ip).
Артём
26.12.2010, 21:53 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.2.13
lua plugin v 1.32


Added: В windows добавлен отлов всех исключений с трейсом. Теперь после "падения хаба" (хаб теперь не падает, а программа просто закрывается) создаётся файл exception.txt, который содержит информацию о проблеме. Для полноценной информации нужно чтобы файлы с символами rushub.pdb и lua.pdb лежали рядом с rushub.exe. Возможно этого не всегда будет достаточно, и могут потребоваться символы системных либ, однако хотя бы так.

Fixed: Исправлен баг в метатаблице UID (рекурсивный вызов).
Nickolya, mariner, ShadoWx, Infinity_Love, ExC0tiC, KT315, Sekretchik, Saymon21
26.12.2010, 12:48 Скрипт банов для RusHub
тестим и комменьтруем
Привёл к человеческому виду скрипт.
Все остальные скрипты в теме удалил.
Nickolya, Артём, Herurg, Accelerator, Sekretchik, Saymon21
25.12.2010, 11:21 Перебор файлов в каталоге
Ну тут скорее не в изменённости lua дело.
1. Lua интерпретатор птохи находится в файле pxlua.dll, соответственно, библиотека lfs должна быть статически прилинкована к pxlua.dll.
Библиотеки, взятые с luaforge, линкуются к lua51.dll. Поэтому первый фактор - это разные имена либ с интерпретаторами lua.
2. Птоха собрана компиляором borland, а либы с luaforge компилятором vs (visual studio).
Либы borland не совместимы с либами vs, ибо либы borland имеют формат omf, а либы vs формат coff.
Nickolya
22.12.2010, 23:25 Фильтр чата. ChatFilter
Версия 1.0 | Замена мата или рекламы на разные фразы.
перевод делается изменением 2 строк:

ChatArrival - заменить на OnChat
Core.GetUserAllData(curUser) - удалить
Infinity_Love
19.12.2010, 20:09 Hideme
скрипт скрытия в юзер-листе
Подправил скрипт. Вроде теперь работает всё как часы
Saymon21, мамин_парень
19.12.2010, 20:08 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.2.12
lua plugin v 1.31


Fixed: Починен параметр bHide (сломался после введения общего кэша).
Fixed: Поправлены права на создание папок в линуксе.
Fixed: Исправлены пути lua модулей для линукса.
Fixed: Починены метатаблицы объектов Config и UID.
Added: Введено дополнительное логирование и отлов исключений в windows
Nickolya, mariner, Otshelnik-Fm, PomanoB, Infinity_Love, ExC0tiC, KT315, Sekretchik, Saymon21
19.12.2010, 15:22 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Вообще-то оператор '#' соответствует функции table.getn, а не table.maxn.
Поэтому такая замена возможна, но далеко не во всех случаях.

В данном конкретном случае конечно же лучше использовать оператор '#', а не функцию table.maxn.
Nickolya, Sekretchik, Saymon21
19.12.2010, 11:08 Ошибки текущей версии хаба
Обнаруженные ошибки публикуются в этой теме
С lua плагином идут файлы lua, из которых нужно взять файл luaconf.h и с ним собирать lua, в противном случае, используются стандартные пути

Есть некоторая идея как заставить это работать без каких-либо манипуляций. Но это может быть будет сделано в очередной версии lua плагина
Kingston
18.12.2010, 18:01 Мелкие вопросы
да
Sekretchik
17.12.2010, 17:36 'Действия' для RusHub
Скрипт 'Действия' с большим набором ситуаций
Ужасный код.

Вот подредактировал:
Код
function OnChat(UID, sData) -- сообщение в чат
    local sCmd, sMsg = sData:match"%b<>%s(%S+)%s(.+)" -- ищем команду
    if sCmd == "!me" then
        if tProfiles[UID.iProfile] == 0 then
            local sRep = ("="):rep(54)
            local sMsg = "\r\n\r\n"..
            "\t"..sRep.."\r\n"..
            "\tУ вас недостаточно прав для выполнения этой команды.\r\n"..
            "\t"..sRep.."\r\n"
            Core.SendToUser(UID.sNick, sMsg, sBot)
        else
            Core.SendToAll("**** "..UID.sNick.."  -  "..sMsg.." ****", sBot)
        end
        return true
    end
end


А выражение
Цитата
sMsg = string.sub(sMsg, 1, string.len(sMsg) - 0)
просто убило. Мало того, что оно из строки sMsg выбирает саму себя так ещё и необязательный аргумент со взятием длины написан и зачем-то вычитается 0.
Sekretchik
12.12.2010, 21:58 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.2.11
lua plugin v 1.30


Added: Добавлено логирование в веб сервере
Added: Некоторый рефакторинг.
Added: Сделана папка под логи
Fixed: Починено взаимодействие между хабом и плагинами (передача векторов между хабом и плагинами)
Nickolya, mariner, Infinity_Love, ExC0tiC, KT315, Saymon21, X-Sky
11.12.2010, 15:39 Статистика файлобмена
Нужен скрипт
Скачка не идёт, однако, современные клиенты при скачивании активно ищут альтернативные источники, и на этом уже можно определить время скачивания того или иного файла (время между поисками альтернатив), а если иметь базу TTH, то узная размер скачиваемого, можно в принципе вычислить скорость.
Однако, данный способ определения является достаточно приближенным и для конкретного хаба такая статистика может не отражать суть ситуации на хабе, ибо скачивающий пользователь может использовать мульти-скачку и тянуть этот файл сразу с нескольких хабов.
™Wizard™, мамин_парень
9.12.2010, 9:47 От: Scripts
От темы с ID: 3767
А для чего сохранение по таймеру? Ведь это не птоха, которая не сохраняет.
Файл scripts.xml сохраняется при запуске или остановке скрипта, причём если в каком-то событии запускается, останавливается или перезапускается несколько скриптов, то сохранение выполнится 1 раз, а не столько раз, сколько действий. То есть своеобразный внутренний таймер, но намного круче.

Поэтому использовать в скриптах сохранение по таймеру - это лишнее действие в русхабе.
Saymon21, X-Sky
7.12.2010, 13:44 Вопросы по RusHub
Технические вопросы
philoum, i corrected my script. Try

Saymon, всё правильно ведь хаб слушает 0.0.0.0 и не знает какие там у тебя внешние ip адреса
На какой прослушиваемый ip адрес поступит пользователь, такой ip и будет в параметре sIPConn. В данном случае слушается 0.0.0.0, поэтому он и записан в параметр.
Saymon21
5.12.2010, 23:32 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.2.10
lua plugin v 1.29



Added: Добавлена возможность логирования в syslog.
Added: Добавлены в пинг стандартные функции антифлуда.
Added: Добавлена шара в приветственное сообщение.
Added: Введены причины дисконнекта.
Added: Сделана возможность показа ip (хоста) сервера, к которому коннектился пользователь (UID.sIPConn).
Added: Добавлена функция Core.Redirect(UID/sNick, sAddress[, sReason]). Причину указывать не обязательно.
Added: Дабавлен параметр юзера UID.bKick. Установка этого параметра в true даёт право ОПератору кикать других юзеров
Added: Дабавлен параметр юзера UID.bRedirect. Установка этого параметра в true даёт право ОПератору перенаправлять других юзеров
Fixed: Исправлен баг удаления открытых соединений при использовании poll в линуксе.
Fixed: Починен входящий пинг.
Fixed: Оптимизирована работа парсера.
Fixed: Оптимизировано приветственное сообщение, сделан его кеш и убраны секунды.
Fixed: Загнан интерфейсы для плагинов в один файл для удобства использования сторонними разработчиками.

P.S. В случае обновления хаба рекомендуется удалить старый файл lang.xml для того чтобы изменилось приветственное сообщение
Nickolya, mariner, PomanoB, ExC0tiC, KT315, Alexey, Saymon21, X-Sky
4.12.2010, 16:13 RusRC
Графический интерфейс для управления RusHub'ом
Был косяк в бета версии хаба, а именно в том, что в версии был пробел "2.2.10 [beta]"
А версия входит в $Lock команду. Получалось, что в аргументе $Lock команды был пробел, а это уже не по протоколу.
Мой косяк. В будущем таких ошибок не будет (даже в бета версиях).
big_smile.gif
Nickolya, KT315, Saymon21
4.12.2010, 10:58 Ошибки текущей версии хаба
Обнаруженные ошибки публикуются в этой теме
Да действительно есть такой баг. Однако он встречается достаточно редко. Возникает он когда клиент отсылает с командой пинга ещё какую-нибудь команду.

Починю в следующей версии.
Nickolya, Saymon21
2.12.2010, 9:50 Вопросы по RusHub
Технические вопросы
New rushub has a new setting "sAddresses".

Example of the use:
Код
<Item Name="sAddresses">0.0.0.0:411 0.0.0.0:413 192.168.0.1:4111 dc.hub.com:412</Item>


Now you can specify different listening ports and different ip addresses (hosts) big_smile.gif
DEN 007
28.11.2010, 22:50 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.2.9
lua plugin v 1.28


Added: Сделан параметр настроек для дополнительных ip:port. Вместо настроек: sHubIP, iMainPort и sSubPorts теперь одна настройка sAddresses, в которой можно через пробел писать ip адреса (или хост-адреса) и через двоеточие различные порты. Если порт не указан явно, то берётся порт по умолчанию 411. Пример:
Код
<Item Name="sAddresses">dc.hub.ru:413 127.0.0.1 192.168.0.1:4111</Item>

Added: В lua плагине сделана функция, возвращающая список всех возможных настроек хаба: Config.table() - функция возвращает таблицу с названиями настроек. Таким образом, теперь можно написать простейший обход настроек хаба:
Код
for _, v in ipairs(Config.table()) do
  print(v, Config[v])
end

Added: Сделана поддержка команды $MCTo. В lua плагине за эту команду отвечает событие OnMCTo.
Added: Сделана возможность остановки windows сервиса (подробности в команде -h).
Added: Сделано формирование логов по дате запуска хаба.
Fixed: Пересмотрена политика занятости ника (была актуальная проблема для unix систем - висели "мёртвые" соединения).
Fixed: Сделан рефакторинг кода.
Fixed: Сделана проверка внутренней версии плагина и запись в лог сообщения о не поддерживаемой версии плагина.
Nickolya, mariner, PomanoB, ExC0tiC, KT315, Saymon21
22.11.2010, 23:20 RusRC
Графический интерфейс для управления RusHub'ом
нужно проверить на новой версии, если будет тоже самое, будем разбираться
KT315
22.11.2010, 22:55 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.2.8
lua plugin v 1.27


Added: Сделан пинг при проверке занятого ника
Fixed: Устранен баг в функции Core.RegBot (появился в версии 2.2.7 из-за добавления параметров логирования)
Fixed: Поправлен luaconf.h (не работал луа плагин в линуксе из-за некорректности этого файла, если сборка была с этим (модифицированным) файлом)
Fixed: Поправлен путь к папке libs (смена корневой директории для линукса)
Fixed: Поправлен путь для файла luaerr.log в lua плагине (сделать абсолютный путь вместо относительного)
Nickolya, mariner, PomanoB, ExC0tiC, Saymon21, Sorrow
21.11.2010, 19:06 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.2.7

Added: Сделан таймерный кэш для массовой рассылки (оптимизация обходов списка, актуальная на больших хабах).
Added: Сделан параметр настроек "глобальное ограничение общего числа пользователей".
Added: Наконец-то добавлена возможность установки сервиса/демона (проблема с установкой директории для конфигурационных файлов в windows решена). Для показа помощи по доступным командам вводим в консоли: rushub.exe -h (набор команд для window и для linux несколько различается).
Added: Добавлено логирование изменения уровня нагрузки на хаб.
Fixed: Изменена кодировка по умолчанию для файла настроек с windows-1252 на windows-1251.
Fixed: Оптимизирована аллокация при конкатенации протокольных команд.
Fixed: Закрыта незначительная утечка в памяти (проявлялась при удалении бота).
Nickolya, PomanoB, Infinity_Love, ExC0tiC, Alexey, Saymon21
19.11.2010, 13:26 Несколько Слов О Захватах И Регулярных Выражениях
исключительно для разработчиков
Может на реальном примере поймёшь, раз на словах не понимаешь:

Код
local s = "123/456/789/0"
print(s:match"/(.*)/") --> "456/789"
print(s:match"/(.-)/") --> "456"
Ksan, dimajak
12.11.2010, 13:48 Action
RusHub
А зачем там вообще бот? Переменная sBot нигде не используется в скрипте, спрашивается зачем оно нам нужно?)))

--------------------

Кстати небольшая особенность: событие OnConfigChange работает только при изменении настроек при помощи Config объекта. Отсюда получаем, что если нам не нужно чтобы настройка попала в событие OnConfigChange, то юзаем Core.SetConfig, иначе юзаем объект Config.
Saymon21
27.10.2010, 22:02 Easy OPChat
Скрипт реализующий простой ОП чат
Все функции отсылки добавляют. Поэтому про разделитель в принципе можно забыть. Разделитель нужен только если отсылать за раз несколько команд, то есть пихать в функцию отсылки строку из нескольких команд
Saymon21
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, "Юзер не был забанен."

Это должно исправить ошибку.
Честно говоря мне и самому не очень нравится данный модуль банов big_smile.gif
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) big_smile.gif
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: http://forum.nmp4.ru/index.php?showtopic=138597
Я у себя на ipb 2.3.5 попробовал, и действительно работает big_smile.gif
Однако, там только для тэга codebox, но думаю, что для тэга code это также легко делается big_smile.gif
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 Предложения для развития
Цитата(Nickolya @ 31.8.2010, 4:25) *
Реквестую аналог параметра птоки
Код
iLoginTime    - User login time in seconds from 1.1.1970
Сделаю.

Цитата(Ksan @ 31.8.2010, 5:38) *
Тогда уж и пусть запоминает и выдаёт даты максимальной шары (вместе с самой шарой) и максимального количества юзеров (вместе с самим количеством) за всё время работы РусХаба с первого включения и всё то же самое - за текущую сессию.
Этого так сильно не хватало в Птоке.
Это планируется реализовать в пункте "Функция статистики и информации о сервере" 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 С Днюхой Тебя!
поздравления
Присоединяюсь.
Креативности креативному админу big_smile.gif
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
Скрипт показывающий ваш текст в строке состояния
ну так замени | на &#124;
сколько раз уже натыкались на эти грабли?)))

Код
Core.SendToUser(UID,"$UserCommand 1 3 "..tCfg.Menu.."\\Установить тему$<%[mynick]> !хабтопик %[line:Введите тему чата]&#124;")
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 дня (до четверга) big_smile.gif

Кстати, сразу же заметил что также не работает функция удаления таймера при выполнении другого таймера (уже исправил в след. версии).
Отсюда сразу же видны ограничения которые нужно будет ввести для случая намеренного увеличения таймеров. На данный момент таймеры можно добавлять пока не кончится оперативная память - это потенциальная уязвимость хаба. Будет введено ограничение: максимум 100 таймеров на скрипт.
Saymon21
26.7.2010, 15:01 ChatHistorySQL
История чата (MySQL)
Каких таблиц? Написано же, что нужно создать базу, а не таблицы. Таблицы скрипт в базе создаёт сам big_smile.gif
Otshelnik-Fm
24.7.2010, 14:13 Есть ли такой скрипт или программа?
Есть?
Nickolya
22.7.2010, 14:08 Конвертер рег из YnHub в PtokaX 0.4.1.1
Помогите найти
В нике запрещены символы: $ | и пробел
В пароле запрещен символ |

Символ | понятно почему запрещён, так как он является разделителем команд в протоколе. Символ $ запрещён в нике из-за того, что это символ является разделителем параметров в команде $MyINFO, а ник, как нам известно, как раз таки входит в состав MyINFO. Пробел запрещён в нике по той же причине, так как он тоже является разделителем параметров в MyINFO, в частности пробел отделает ник от описания.

Про символ | в пароле также понятно, - разделитель команд. Символ $ в пароле вообще говоря может поломать некоторые хабы, поэтому обычно его также запрещают big_smile.gif
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 строки big_smile.gif

Код
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.
Кстати, автозапуск новых скриптов по твоему же реквесту я убрал big_smile.gif Авто запуск на самом деле был сделан для автоматического старта при первом запуске хаба, когда скриптов ещё нету и нету файла scripts.xml для того чтобы, например, можно было сразу управлять хабом через функционал запущенных скриптов и через скрипты уже подгружать новый скрипты. Теперь после первого запуска хаба нужно будет залезть в файл scripts.xml и включить нужные скрипты для управления уже в будущем через них (имеется ввиду в главным образом скрипт FirstRusHubBot) big_smile.gif
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 в этом списке нету. Функция будет падать при любом отсутствующем в этом списке параметре если его ставить после процента

Тогда возникает вопрос почему же в птохе не падает? Видимо РРК там что-то подкрутил, так как даже на чистом луа падает big_smile.gif
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 строки big_smile.gif

В-третьих, вернув в событии 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
Сделай под русхаб.
Большая функциональность - это всегда плюс, если только эта функциональность не приводит к тормозам big_smile.gif
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 big_smile.gif


Архив с бибиотекой: [attachment=4533:sqlite3.rar]

Пример для проверки: [attachment=4532:test_sqlite3.lua]

Для просмотра содержимого базы данных можно использовать http://www.sqliteexpert.com/download.html Sqlite менеджер, поддерживающий кириллицу (ANSI).


Описание функций библиотеки

Описание функций библиотеки:


Методы объекта среды разработки (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"
и получаем другой результат big_smile.gif
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 big_smile.gif (на ваше усмотрение)). Подключается библиотека так: require"ssl". Примеры работы с библиотекой можно найти в архиве samples.


[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. Сделано это специально для безопасности и от возможных атак на хаб.

Скрипт перезалит в первом посту.

Качаем и пробуем. Проблем не должно быть big_smile.gif
Если по-прежнему будут проблемы с рекордами, то будем дальше разбираться в чём ещё проблемы.
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-функций русхаба. В следующей версии плагина это уже исправлено, и вместо этого будет выдаваться реальная ошибка скрипта, а не сообщение о какой-либо ошибке big_smile.gif
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 big_smile.gif


Библиотека win32: [attachment=4380:sqlite3.rar]
Библиотека win64: [attachment=5820:sqlite3_win64.rar]

Пример для проверки: [attachment=4381:test.lua](раньше в PtokaX нельзя было создать больше одной таблицы, тут всё создаётся)

Для просмотра содержимого базы данных можно использовать http://www.sqliteexpert.com/download.html Sqlite менеджер, поддерживающий кириллицу (ANSI).


Описание функций библиотеки

Описание функций библиотеки:


Методы объекта среды разработки (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 отвечает за ту кодировку, в которую необходимо перевести.

Список доступных библиотеке кодировок:

  • Европейские кодировки: ASCII, ISO-8859-{1,2,3,4,5,7,9,10,13,14,15,16}, KOI8-R, KOI8-U, KOI8-RU, CP{1250,1251,1252,1253,1254,1257}, CP{850,866}, CP{437,737,775,852,853,855,857,858,860,861,863,865,869,1125}, Mac{Roman,CentralEurope,Iceland,Croatian,Romania}, Mac{Cyrillic,Ukraine,Greek,Turkish}, Macintosh

  • Юникодные кодировки: UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE, UTF-7, UCS-2, UCS-2BE, UCS-2LE, UCS-4, UCS-4BE, UCS-4LE, C99, JAVA, UCS-2-INTERNAL, UCS-4-INTERNAL

  • Semitic кодировки: ISO-8859-{6,8}, CP{1255,1256}, CP862, CP864, Mac{Hebrew,Arabic}
  • Специфически платформенные кодировки: HP-ROMAN8, NEXTSTEP
  • Армянские кодировки: ARMSCII-8
  • Вьетнамские кодировки: VISCII, TCVN, CP1258
  • Грузинские кодировки: Georgian-Academy, Georgian-PS
  • Китайские кодировки: EUC-CN, HZ, GBK, GB18030, EUC-TW, BIG5, CP950, BIG5-HKSCS, ISO-2022-CN, ISO-2022-CN-EXT
  • Корейские кодировки: EUC-KR, CP949, ISO-2022-KR, JOHAB
  • Лаосские кодировки: MuleLao-1, CP1133
  • Таджикские кодировки: KOI8-T
  • Тайские кодировки: TIS-620, CP874, MacThai
  • Японские кодировки: EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP, ISO-2022-JP-1, ISO-2022-JP-2



Пример перевода текста из 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 как обычный строковый метод (только нужно не забыть подключить библиотеку big_smile.gif ).
Nickolya, Invisible, Saymon21
18.3.2010, 13:32 Hub 3000 Online 100% Загрузки
да да. В сетевухе может быть проблема.
У меня было так: на компе 2 сетевухи, через одну качаю из дц со скоростью 50 Кб/c, переподключаюсь через вторую и начинаю качать со скоростью 25 Мб/c. big_smile.gif Первая - обычная 100 Мбит/c, вторая - гигабитная))))
Unians
18.3.2010, 12:03 Вопросы по RusHub
Технические вопросы
За флуд пингами отвечает параметр miMinClientPingInt. По умолчанию он равен 30 сек. Уменьши его, допустим, до 15 сек. Однако, что это за клиенты такие, которые пингуют чаще чем раз в 30 сек? Не попытки ли это атак? big_smile.gif
Пинг - это отсылка со стороны клиента пустой команды, то есть отсылка просто пайпа |. Эта отсылка служит для проверки состояния сервера, - жив ли он ещё?

Хотя возможно что это просто пустая команда, прицепленная к обычной команде. В таком случае параметр miMinClientPingInt пока можно уменьшить до 0. В следующей версии исправлю это big_smile.gif
Accelerator
17.3.2010, 20:28 Официальная страничка RusHUB
Внимание - вопрос
Хехе.
В FF для тестирования не обязательно выносить всё в один файл, ради того чтобы браузер не сохранял в кеш. Ведь в Лисичке для этих целей есть комбинация клавиш Ctrl-F5, при использовании которой, хеш использоваться не будет и всё будет загружено заново big_smile.gif

Кстати, в опере загрузка без использования хеша - это просто клавиша F5 big_smile.gif

Поэтому можно писать всё как обычно, - с файлами big_smile.gif
bot9ra
12.3.2010, 12:13 Модули для скриптов RusHub
Тут дело такое... Если определить таблицу вне функции, то это безусловно будет быстрее, так как при вызове функции каждый раз не будет создаваться таблица, с другой стороны, эта таблица будет постоянно занимать некоторое место в памяти, в отличие от таблицы внутри функции, которая будет удаляться из памяти сразу же после отработки функции.

Можно и так и так, однако, не думаю, что данная функция так уж часто используется, чтобы задумываться о быстродействии, тем более если данный модуль будет использоваться в нескольких скриптах, то занимаемая этой таблицей память будет прямо пропорциональна числу скриптов, использующих этот модуль, даже если скрипт и не использует функцию DoShareUnits !!!

Насчёт расширения этой таблицы, то 1024 ПБ - это очень много. И я думаю, что в ближайшие лет 20 мы ещё не доберёмся до таких размеров big_smile.gif
Nickolya
11.3.2010, 19:58 Модули для скриптов RusHub
Добавил, немного оптимизировав big_smile.gif
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 библиотеки, данная библиотека не работает с преобразованием кодировок. Все преобразования лежат на плечах веб-сервера.
Для ознакомления с технологией взаимодействия см.: http://dklab.ru/lib/JsHttpRequest/

[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 обмен данными по технологии аякс!!! big_smile.gif
С мозиллой и 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

23 страниц V  « < 3 4 5 6 7 > » 
RSS Сейчас: 26.4.2024, 7:08