myDC.ru

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

 
История благодарностей участнику Setuper. Спасибо сказали: 1708
Дата поста: В теме: За сообщение: Спасибо сказали:
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
5.3.2010, 17:05 Бомба
развлекательный скрипт
Название скрипта: Bomb
Версия скрипта: 1.6
Хаб: RusHub
Автор: Setuper
Описание: Всем известный скрипт бомбы теперь и под RusHub.
Закладываем бомбы под пользователей и наблюдаем за их удачными или не удачными действиями.
В сообщениях о том что вас заминировали появились подсказки. На самом деле они рандомные и в большинстве случаев не правильно подсказывают цвет провода, однако так веселее big_smile.gif

Скрип рекомендуется использовать совместно со скриптом ContextMenu.lua (для быстродействия и экономии трафика surrender.gif ). Если же вы не хотите использовать совместно со скриптом ContextMenu.lua, то раскомментируйте в функции OnUserEnter строчку
Код
--ContextMenu(UID)


[attachment=4173:Bomb.lua]
Invisible, fixx, ShadoWx, Otshelnik-Fm, PomanoB, Saymon21, ™Wizard™, hipimps71
5.3.2010, 13:03 md5
RusHub | Библиотека криптографии
Название: md5
Версия: 1.1.2
Хаб: RusHub
Автор библиотеки: Roberto Ierusalimschy
Описание: Библиотека для получения md5 хеша.
Использование: Содержимое архива md5_1.1.2.rar распаковываем в папку libs. В скриптах библиотека подключается так: require"md5"



Мануал по функциям библиотеки

Все функции, зарегистрированные в таблице md5

  • Код
    md5.sum(message)
    Вычисляет MD5 хеши для указанного сообщения. Эта функция берёт входящее сообщение, которое может быть произвольной длины и произвольного содержания, и выводит 128-битный отпечаток (дайджест строки). Входящая строка преобразуется в 16-байтную строку. Предполагается, что это вычисление не может привести к одинаковым хешам от двух различных сообщений.


  • Код
    md5.sumhexa(message)
    Данная функция на подобии функции md5.sum, но возвращает величину из 32-х шестнадцатиричных значений.


  • Код
    md5.crypt(message, key [,seed])
    Кодирует строку, используя MD5, в CFB (Cipher-feedback mode). message - произвольная строка, которая должна быть закодирована. key - произвольная строка, которая используется в качестве ключа для кодирования. seed - необязательный параметр.
    Если необязательный параметр не задан, то вместо него для кодирования используется значение функции os.time(). Рекомендуется использовать различные значения параметра seed для каждого сообщения. Параметр seed не является приватным параметром, которые следует прятать, так как этот параметр передеётся в начале закодированного сообщения.
    Длина закодированного сообщения равна длине сообщения, плюс длина параметра seed, плюс один.


  • Код
    md5.decrypt(message, key)
    Функция декодирует сообщение, закодированное функцией md5.crypt. Для любого сообщения, ключа и параметра seed выполнимо следующее тождество: md5.decrypt(md5.crypt(msg, key, seed), key) == msg


  • Код
    md5.exor(s1, s2)
    Функция возвращает строку в виде побитовой разницы между строками s1 и s2. Строки s1 и s2 должны иметь одинаковую длину, и эта длина равна длине возвращаемой строки.


Библиотека win32: [attachment=4169:md5_1.1.2.rar]
Библиотека win64: [attachment=5817:md5_1.1.2_win64.rar]

Скрипт для тестирования и обучения работе с функциями: [attachment=4170:test_md5.lua]
Проект для сборки на vs2008: [attachment=6417:md5_1.1.2_src_vs9.zip]
Nickolya, Invisible
4.3.2010, 17:31 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.1.5
lua plugin v 1.16


Основные изменения:

Added: Добавлено новое событие OnScriptStart(sScriptName), вызываемое при запуске скрипта sScriptName.
Added: Добавлено новое событие OnScriptStop(sScriptName), вызываемое при остановке скрипта sScriptName.
Fixed: Исправлена работа веб-сервера. Предотвращена двойная отсылка.
Fixed: Исправлена ошибка отсутствия тела сообщения в POST запросах. Не заморачиваясь насчёт парсера, оставлено это дело на плечах Lua. Если клиентом было отправлено тело запроса, то оно всегда прибавляется к заголовку, даже в случае, например GET запроса, а не POST запроса, поэтому это должен отфильтровывать парсер в Lua, дабы придерживаться http протокола и не позволять отправлять левые запросы.
Fixed: WebID полностью совмещён с UID, и к нему применимы все функции, применимые к UID. Например, отключение веб-пользователя Core.Disconnect(UID/WebID). Хотя специфические функции типа GetUser могут возвращать не все нужные результаты из-за их отсутствия для данного соединения, или функция DisconnectIP не может разъединить веб-пользователя с указанным ip.
Nickolya, Jaska, Invisible, fixx, Otshelnik-Fm, alex82, ExC0tiC
4.3.2010, 3:35 Вопросы по скриптам
Мелкие вопросы
Это никак не исправить. На стадии валидации ника определён только ip адрес и ник, больше ничего не определено, так как пользователь ещё не отослал на хаб MyINFO строку.
Saymon21
3.3.2010, 21:11 Модули для скриптов RusHub
Не доступна только менюшка. Сама команда $Kick доступна.
Для защиты от дурака нужно проверить условие:
Код
if Core.GetUser(UID, 64) then -- проверка что киком воспользовался пользователь с ключиком
  Core.Disconnect(sNick)
end


Кстати, по протоколу ( http://mydc.ru/index.html?showtopic=915&am...post&p=6718 ) команда $Kick не содержит причины кика, а содержит только ник, поэтому бестолку извлекать из этой команды причину. В итоге получаем:
Код
function OnKick(UID, sData)
  if Core.GetUser(UID, 64) then
    Core.Disconnect(sData:match"$Kick (%S+)")
  end
end
Accelerator, Sekretchik, Saymon21
2.3.2010, 12:34 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.1.4
lua plugin v 1.15


Fixed: Удалена функция Core.SendToWeb. Вместо неё для отсылки данных веб пользователю нужно использовать функцию Core.SendToUser(WebID, sData).
Added: Для получения ip адреса и других параметров веб-пользователя можно использовать ту же функцию, что и для обычного dc-пользователя: Core.GetUser(WebID, iByte).

Свожу все функции к единому интерфейсу.
Nickolya, Jaska, Invisible, Otshelnik-Fm, ExC0tiC
28.2.2010, 17:49 WebModule
RusHub | Модуль для встроенного web-сервера
Хорошая работа.
Поясню как этим пользоваться. Пишем и запускаем скрипт:

Код
require"web"

function OnWebData(WebID, sData)
  return Web.OnWebData(WebID, Web.GetEnv(sData))
end


После этого уже можно браузером входит.
fixx
28.2.2010, 16:38 Вопросы по RusHub
Технические вопросы
Открываем скрипт FirstRusHubBot и изменяем функцию OnValidateNick:
Код
function OnValidateNick(UID, sData)
  local sNick = Core.GetUser(UID, 1).sNick
  local tRegInfo = tRegUsers[sNick] -- Получаем регистрационные данные
  local iProfile = -1
  if tRegInfo then
    iProfile = tRegInfo.iProfile
  end
  if tProfiles[iProfile].bHaveKey then
    Core.SetUser(UID, 4, true) -- КЛЮЧИК
    Core.SetUser(UID, 6, true) -- ПОЛУЧЕНИЕ IP АДРЕСОВ ВСЕХ ПОЛЬЗОВАТЕЛЕЙ
  end
  if tRegInfo then -- Проверяем зарегистрированность ника
    return true -- Возвращаем true для того, чтобы запросить пароль
  end
end
Accelerator
27.2.2010, 18:47 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.1.3
lua plugin v 1.14


Fixed: Исправлены некоторые достаточно серьёзные ошибки старых версий.
Added: Добавлен веб-сервер (по умолчанию отключен).
Веб-сервер предназначен только для использования его в Lua.

Некоторые новые настройки:

bWebServer - включить веб-сервер (по умолчанию отключен).
sWebServerIP - адрес веб-сервера.
iWebServerPort - порт веб-сервера (по умолчанию 81).
iWebTimeout - тайм-аут соединения с веб сервером (в сек.). Время бездействия, по истечению которого веб-сервер закрывает соединение с клиентом.
iWebStrSizeMax - максимальный размер сообщения, которое может отослать на сервер клиент.

Новое событие: OnWebData(WebID, sData)
Новая api функция: Core.SendToWeb(WebID, sData)

Пример скрипта для проверки работы веб сервера:
Код
function OnWebData(WebID, sData)
  Core.SendToAll(sData)
  Core.SendToWeb(WebID, "test")
end
Так как в событии OnWebData не возвращается true, то клиент будет автоматически отключен после отправки ему всех данных.
Функция Core.SendToWeb автоматически добавляет разделитель ("\r\n\r\n") в конец, если он отсутствует на конце сообщения.
Nickolya, Jaska, Invisible, PomanoB, ExC0tiC, Saymon21
26.2.2010, 0:35 Функции Для Разработчиков
склад полезных функций
Всё достаточно просто.
Переводим текст в UTF8 и каждый "нужный" байт представляем в 16-ричном виде big_smile.gif

Функцию AnsiToUtf8 берём из первого поста.

Код
function URICoding(sText)
  local function Check(i)
    if i < 33 or 126 < i then return nil end
    if i == 33 then return true
    elseif 38 < i and i < 43 then return true
    elseif 44 < i and i < 47 then return true
    elseif 47 < i and i < 58 then return true
    elseif 64 < i and i < 91 then return true
    elseif 96 < i and i < 123 then return true
    elseif i == 126 then return true end
  end
  local s, r = AnsiToUtf8(sText), ''
  for i = 1, #s do
    local b = s:byte(i)
    if Check(b) then
      r = r..string.char(b)
    else
      r = r..("%%%X"):format(b)
    end
  end
  return r
end
Serx
23.2.2010, 16:22 Анализ ответа от PtokaX
Вопрос по сокетам
Sergey2009
23.2.2010, 16:08 Скрипт запрета в никах заглавных букв
Код
Core.SendToUser(sUser, "*** Ваш ник не должен быть в КАПСовом виде!")
Nickolya, thehawk
23.2.2010, 13:49 Анализ ответа от PtokaX
Вопрос по сокетам
А при чём тут вообще ADC?
Хаб PtokaX работает на NMDC протоколе. Это разные протоколы.
А TCP - это сетевой протокол, который нужен для передачи данных по сети. А уже эти данные содержат в себе NMDC протокол.

Вообще, как так можно что-то писать, не разобравшись даже для чего нужен TCP протокол?))))
Sergey2009
23.2.2010, 12:43 Предложения для развития
Saymon, так профиль итак устанавливается в одном скрипте, а потом используется во всех скриптах. То есть в роли плагина тут выступает скрипт.

По поводу установки топика, то можно написать скрипт:
Код
local tAllow = {
  [0] = true,
  [1] = true
}

function OnChat(UID, sData)
  local sTopic = sData:match"%b<> [!%+]settopic (.+)"
  if sTopic then
    local tUser = Core.GetUser(UID, 9)
    if tAllow[tUser.iProfile] then
      Core.SendToAll("*** "..tUser.sNick.." установил новый топик.")
      Core.SetConfig("sTopic", sTopic)
    else
      Core.SendToUser(UID, "У вас нет прав на использование этой команды")
    end
    return true
  end
end
Accelerator, Saymon21
22.2.2010, 17:58 Запрет символов в никах и цифровых ников
Запрет символов в никах и цифровых ников
Тогда уж без квадратных скобок и с использованием find, а не match
Код
local sNick = tUser.sNick
if sNick:find"^%-+$" or sNick:find"^%.+$" or sNick:find"^z+$" then
DrakonSP
22.2.2010, 17:52 Вопросы по скриптам
Мелкие вопросы
вместо этого:
Код
local sData = string.sub(sData,1,-2)
local sCmd = sData:match"%b<>%s+[!+*](%S+)"

лучше писать так:
Код
local sCmd = sData:match"%b<>%s+[!+*](%S+)|$"
Accelerator, Saymon21
21.2.2010, 23:49 Запрет символов в никах и цифровых ников
Запрет символов в никах и цифровых ников
Потому что такое регулярное выражение ловит только один символ -, то есть ник, состоящий только из одного этого символа.
Нужно чтобы ловился один и более, для этого нужно поставить плюсик:
Код
if tUser.sNick:find"^%-+$" then


Ведь если бы мы в предыдущем примере не поставили плюсик:
Код
if tUser.sNick:find"^%d$" then
то ловилась бы тоже одна цифра, а не любое число.
DrakonSP
21.2.2010, 14:04 Hub's Big Ass Bot
API2 | HUBBABOT v.2.28
Баги птохи))

http://mydc.ru/index.html?showtopic=915&am...post&p=6692
Цитата
Обратите внимание, что в скриптовую функцию PtokaX данная команда передаётся без символа вертикальной черты '|' на конце.


Поэтому наверное нужно так:
Код
function ConnectToMeArrival(sUser,sData)
    Core.GetUserAllData(sUser)
    local _,_,towho = string.find(sData, "^%p%S+%s+(%S+).*")
Nickolya, thehawk, mastersweet
21.2.2010, 13:50 WebServer
скрипт создающий веб-интерфейс для хаба
Пустая строка - это \r\n
То есть по своей сути нужно ловить \r\n\r\n. Предыдущий перенос и перенос текущей пустой строки.
Сейчас проверю действительно ли это так

Да, действительно, клиент в конце своего запроса ставит пустую строку.
Разделитель определён. Осталось реализовать big_smile.gif
Nickolya
21.2.2010, 0:40 замена стандартной команде !stat
вообще говоря команды 2.
!stat и !stats
Поэтому если сделать замену одной команды, то можно использовать другую.
Поэтому замени команду !stat, а !stats оставь, и таким образом можешь смотреть.
Saymon21
21.2.2010, 0:26 замена стандартной команде !stat
Ну так если знаешь как делается действие по команде, ну так вперёд. Что мешает сделать действие на команду !stat ? Не понятна суть проблемы.
Код
function ChatArrival(tUser, sData)
  if sData:find"!stat" then
    Core.SendToUser(tUser, "Наша инфа к команде !stat")
    return true
  end
end
Saymon21
20.2.2010, 18:01 Вопросы по скриптам
Мелкие вопросы
Пардон.
Вот так нужно:
Код
SaveTable(sFile, tCounts, "tCounts")


Второй параметр в кавычки big_smile.gif

Перезалил
DrakonSP
20.2.2010, 16:20 WebServer
скрипт создающий веб-интерфейс для хаба
Дела обстоят так...

Взвесив все за и против, решил написать веб сервер в дополнении к уже имеющемуся dc серверу (встроить веб сервер). Точнее вот как:
На хабе существует обычный сервер, который принимает соединения. Этот сервер наследуется dc сервером.
Так вот... Можно точно также сделать надстройку веб сервера. При этом все соединения, будь они dc соединениями или соединениями веб сервера, будут обрабатываться одним единым сервером, а после обработки парситься уже своими серверами. Данная система "многосерверности" была заложена изначально, и является гениальным конструктивным решением. Общая обработка и, разные парсеры и дальнейшее поведение.

При всём сказанном пока имеем вот что: прослушиваем порт 411 для dc сервера и, например, порт 8080 для веб-сервера.
При коннекте на порт веб сервера, начинаем получать данные от клиента. После получения данных в lua вызывается событие, которое будет отвечать за полученные данные. Из функции этого события можно будет с помощью api функции отправить клиенту ответ, при этом сервер будет держать некоторое время соединение.

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

Теперь, почему нельзя сделать так: принять соединение клиента, получить данные от клиента, отправить ответ клиенту и разорвать соединение? Так нельзя сделать по причине существования на сервере неблокирующих сокетов, из-за того, что за один раз данные сервер может получить от клиента не все, а только часть. Отсюда возникает ещё один вопрос: какой разделитель команд в протоколе http ?
Для NMDC протокола всё прозрачно: получаем данные из неблокирующего сокета и записываем их в буфер до тех пор, пока не встретим разделитель протокола (а именно знак |). После того, как встретили разделитель протокола, извлекаем из буфера команду до этого разделителя и отсылаем это команду парсеру на обработку. В http протоколе не понятно когда обрабатывать и вызывать lua событие, ведь для вызова lua события нужно получить все данные, ну или хотя бы 1 команду, а из-за неблокирующих сокетов за 1 раз мы не можем гарантировать что получим все данные от клиента, поэтому не можем вызывать lua событие.

Вот такие трудности по написанию веб-сервера, которые я надеюсь вы мне поможете решить big_smile.gif
Nickolya, Invisible
20.2.2010, 11:49 Вопросы по скриптам
Мелкие вопросы
Можно.
Можно сделать показ количества просмотров за время непрерывной работы скрипта, тогда можно просто завести переменную-счётчик, в противном случае (в общем случае) нужно будет сохранение счётчика в файл.

[attachment=4095:TextBot.lua]
DrakonSP, Saymon21, TiGRpp
20.2.2010, 1:27 Помогите Пересести Скрипт с АР1 на АР2
Код
local sBot = SetMan.GetString(21)
local tCmds = {    
  ["!ban"] = 1,
  ["!banip"] = 1,
  ["!fullban"] = 1,
  ["!fullbanip"] = 1,
  ["!nickban"] = 1,
  ["!tempban"] = 1,
  ["!tempbanip"] = 1,
  ["!fulltempban"] = 1,
  ["!fulltempbanip"] = 1,
  ["!nicktempban"] = 1,
}
function ChatArrival(tUser, sData)
  local sCmd = sData:match"%b<>%s+(%S+).*|$"
  if tCmds[sCmd] and tCmds[sCmd] == 1 and GetUserValue(tUser, 11) then
    local sNick = sData:match"%b<>%s+%S+%s+(%S+)"
    if sNick and not sNick:find"%d+%.%d+%.%d+%.%d+" then
      local tProfile = ProfMan.GetProfile(tUser.iProfile)
      if RegMan.GetReg(sNick) ~= nil then
        Core.SendToOps("<"..sBot.."> *** Регистрация пользователя "..sNick.." была удалена. Удалил: "..ProfMan.GetProfile(tUser.iProfile).sProfileName.." "..tUser.sNick..".")
        RegMan.DelReg(sNick)
      else
        Core.SendToOps("<"..sBot.."> *** Пользователь "..sNick.." не зарегистрирован.")
      end
    end
  end
end


Только совсем не понятно зачем при бане по нику удалять регистрацию пользователя?
Mc-JuNiOr
19.2.2010, 22:42 Скрипт банов для RusHub
тестим и комменьтруем
Код
local tUser = Core.GetUser(UID, 1)
local sUser = Core.GetUser(UID, 8)

это можно объединить в одну таблицу
Код
local tUser = Core.GetUser(UID, 9)
Saymon21
18.2.2010, 11:32 Вопросы по скриптам
Мелкие вопросы
Пардон. В строке:
Код
sMsg = sMsg:gsub("^%$", "&#36;")
знак $ нужно заэкранировать.

Твой скрипт тоже работает. Однако, особенности протокола заставляют нас обходить некоторые знаки.
Например, в твоём скрипте:
1) пользователям не отсылались бы сообщения, начинающиеся со знака $;
2) знак | в сообщении служил бы разделителем команд и не отображался бы в чате, а всё что шло после этого знака отсылалось бы в следующей команде;
3) любые цифры от 1 до 255, перед которыми стояли бы символы &#, и после которых стоял бы символ ;, преобразовывались бы из кодов в некоторые символы перед тем как поступить в чат пользователя.
Nickolya, DrakonSP
18.2.2010, 2:22 Вопросы по скриптам
Мелкие вопросы
Я бы вот так написал big_smile.gif :
Код
local sPath = Core.GetPtokaXPath().."scripts/TextBot/"

function ChatArrival(tUser, sData)
  local sCmd = sData:match"^%b<>%s+%p(%S+).*|$"
  if sCmd then
    local sMsg = LoadText(sPath..sCmd..".txt")
    if sMsg then
      Core.SendToUser(tUser, sMsg)
      return true
    end
  end
end

function LoadText(sFile)
  local hFile = io.open(sFile)
  if hFile then
    local sMsg = hFile:read"*a"
    sMsg = sMsg:gsub("&#(%d+);", "&#38;#%1;")
    sMsg = sMsg:gsub("|", "&#124;")
    sMsg = sMsg:gsub("^%$", "&#36;")
    hFile:flush()
    hFile:close()
    return sMsg
  end
  return nil, "Не удалось открыть файл "..sFile
end
DrakonSP
17.2.2010, 0:29 Запрет символов в никах и цифровых ников
Запрет символов в никах и цифровых ников
Код
if tUser.sNick:find(""..sbansymbol.."") then

это очень дурная привычка так писать!!! Вы даже не представляете насколько это вредно. Нужно всеми способами избавляться от лишних конкатенаций, а тут наоборот делают.
Почему не написать так:
Код
if tUser.sNick:find(sbansymbol) then
зачем делать лишнюю конкатенацию? Эту привычку надо искоренять! Не пойму, кто вас научил делать эту лишнюю конкатенацию? Ведь никто из скриптописателей данного форума так не пишет.
DrakonSP
17.2.2010, 0:02 Запрет символов в никах и цифровых ников
Запрет символов в никах и цифровых ников
Цитата(Nickolya @ 16.2.2010, 23:03) *
В функцию можно передавать текстовый параметр целиком, без конкатенация, записывая его без скобок, во всех иных случаях скобки нужны (я предпочитаю их использовать всегда):


естественно
Код
if tUser.sNick:find("[!@]") then
и
Код
if tUser.sNick:find"([!@])" then
различия очевидны. В первом случае скобки являются скобками метода find, во втором случае, скобки - это захват символа. Естественно их надо различать.

Как уже было сказано, если строка является постоянным строковым литералом, то скобки можно опускать. Я предпочитаю опускать скобки почти везде, где это можно делать и не только у функции, но и просто по приоритету операций. Можно написать так:
Код
if ((a and b) or (c and d)) then
А можно тоже самое писать без скобок, зная приоритеты выполнения операций.

То же самое касается и конструкторов таблиц. Пример:
Код
function F(tab)
  for i,v in pairs(tab) do
    ...
  end
end


Вызов этой функции может быть такой:
Код
F({1,2,3,4,5})
Но можно и по-другому вызвать (без скобок):
Код
F{1,2,3,4,5}

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

Пример эффектной функции:
Код
function prnt(x)
  if x then
    Core.SendToAll(x)
    return prnt
  end
end
prnt "one" "two" "three"
Напишите в птохе и проверьте, что этот код действительно работает. Согласитесь, что если бы мы написали prnt("one")("two")("three"), то было бы тоже забавно, но не так, как 3 строковых литерала подряд big_smile.gif)))
DrakonSP, Saymon21
16.2.2010, 22:41 Запрет символов в никах и цифровых ников
Запрет символов в никах и цифровых ников
Во-первых, символ ! не нуждается в экранировании.
Во-вторых, скобочки не нужно писать (если мы используем условие):
Код
if tUser.sNick:find"[!@]" then ...
DrakonSP
15.2.2010, 20:01 ContextMenu
скрипт отсылки контекстного меню по запросу
Всё зависит от количества менюшек.
А вообще тут не только экономия трафика, но и ускорение входа на хаб, особенно на больших хабах big_smile.gif
На маленьких хабах можно сказать: а что ещё хабу делать? он итак не нагружен.
На больших хабах идёт борьба за быстродействие и отсылка пары лишних команд каждую секунду иногда сильно сказывается на работе хаба
Saymon21
15.2.2010, 16:31 ContextMenu
скрипт отсылки контекстного меню по запросу
Название: ContextMenu
Версия: 1.0
Описание: Скрипт предназначен для экономии трафика при отсылке контекстного меню. То есть отсылать меню не каждый раз при входе, а по запросу. При этом, скриптописателям предлагается в скриптах контекстные меню отправлять в специальной глобальной функции ContextMenu.

Пример меню в скрипте test.lua:
Код
local sMenu = "$UserCommand 1 3 Меню1$<%[mynick]> !cmd1&#124;|"..
  "$UserCommand 1 3 Меню2$<%[mynick]> !cmd2&#124;|"..
  "$UserCommand 1 3 Меню3$<%[mynick]> !cmd3|"

function ContextMenu(UID)
  Core.SendToUser(UID, sMenu)
end


Таким образом, по запросу из скрипта ContextMenu.lua выполнится функция ContextMenu скрипта test.lua, а также прочих скриптов, которые запущены на данный момент. Если в скрипте отсутствует функция ContextMenu, то будет выполняться функция OnUserEnter, если таковая имеется. Однако всё же лучше договориться и выносить во всех скриптах отсылку контекстных менюшек в функцию ContextMenu, так как в функции OnUserEnter могут выполняться вещи, которые необходимо выполнять только 1 раз за вход. Если нужно принудительно отослать менюшку какого-то скрипта при входе, то всегда можно вызвать функцию ContextMenu внутри функции OnUserEnter big_smile.gif

[attachment=4077:ContextMenu.lua]
Nickolya, Invisible, fixx, Otshelnik-Fm, Alexey, Saymon21, TiGRpp, AfLc
14.2.2010, 18:52 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.1.2
lua plugin v 1.13


Основные изменения:

Fixed: Исправлен баг в работе события OnScriptError.
Fixed: Исправлен баг, который не позволял в некоторых случаях при медленной скорости соединения получить полностью команду.
Fixed: Исправлен баг в изменении команды события.
Added: Добавлена функция Core.SendToIP(sIP, sData, sNick, sFrom, iProfile/tProfiles) отсылки сообщения ip адресу.
Added: Добавлена функция Core.SendToAllExceptIps(tExcept, sData, sNick, sFrom) отсылки сообщения всем, кроме ip адресов таблицы tExcept.
Added: Добавлена функция Core.RegBot(sNick, bKey, sMyINFO, sIP) регистрации бота на хабе (sMyINFO - это не полное MyINFO, а только всё то что после ника).
Added: Добавлена функция Core.UnregBot(sNick) удаления регистрации бота.
Added: Модифицирована функция Core.DisconnectIP(sIP, iProfile/tProfiles). Добавлен необязательный параметр.
Nickolya, BIMMER71, Jaska, Invisible, Otshelnik-Fm, Accelerator, ExC0tiC, Saymon21
14.2.2010, 17:33 Запрет символов в никах и цифровых ников
Запрет символов в никах и цифровых ников
Лучше вот так:
Код
function ValidateNickArrival(tUser)
    if tUser.sNick:find"^%d+$" then
        Core.SendToUser(tUser, "Ники состоящие только из цифр запрещены")
        Core.Disconnect(tUser)
    end
end


Захват (%d+) лучше не делать, так как это лишние действия, и вместо match в условии использовать find. Так как интерпретатору проще сравнить число, которое возвращает find, со значением boolean, чем сравнивать строку, которую возвращает match. Ведь строка - это массив символов. Намного проще работать с числами, чем с массивами. Не делая захваты, строк вообще не будет, а метод find вернёт только 2 числа (начало и конец регулярного выражения, если таковое было обнаружено).
Nickolya, DrakonSP, Saymon21
12.2.2010, 11:01 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
DrakonSP
10.2.2010, 15:30 AscIIArtBot
API2 | хы, может быть кто то и захочет вопользоваться =)
Поскольку таблица tSettings не передаётся в качестве аргументов какой-либо функции, то затрат на копирование при передачи аргументов в стек вызова нету, поэтому в данном случае без разницы как хранить настройки в таблице или без.

Для разъяснения приведу 2 фрагмента, которые делают одно и тоже:
Код
function F(s1)
  return s1.." world"
end

local s = "hello"
Core.SendToAll(s)

s = F(s)    -- тут 2 копирования. Сначала создаётся параметр s1 функции F, и в него копируется содержимое переменной s,
            -- потом, после завершения работы функции, грубо говоря, параметр s1 копируется опять в s.

Core.SendToAll(s)


Код
function F(t1)
  t1[1] = t1[1].." world"
end

local t = {"hello"}
Core.SendToAll(t[1])

F(t)    -- тут нет копирования. Таблица t передаётся в функцию по ссылке,
        -- а не по значению, поэтому t и t1 - это одна и та же таблица в памяти.

Core.SendToAll(t[1])

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

Строка - это массив букв, поэтому нужно тщательнее подходить к вопросам копирования именно строк, дабы не копировать по нескольку раз большое количество символов.
Заметьте, что оба фрагмента делают одно и тоже, но второй это делает значительно оптимальнее.
Jaska, Wariner, che_guevara
8.2.2010, 13:45 Репорты об ошибках старых версий
архив темы ошибок текущей версии хаба
Цитата(Otshelnik-Fm @ 30.1.2010, 14:24) *
(error)[Fri Jan 29 21:39:47 2010] (1) cDCConn: (sock 252) Error in sending: Attempt send more than 10, closing


Причина ошибки найдена. Будет исправлена в следующей версии (2.1.2) хаба. Из-за данной ошибки могли не полностью отправляться менюшки и MOTD, как было кем-то замечено.
Nickolya
5.2.2010, 13:24 Вопросы по RusHub
Технические вопросы
Фактически да.
Nickolya
4.2.2010, 20:39 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.1.1
lua plugin v 1.12


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

Основные изменения:

Added: Установленные типы защиты:
  1. Защита от флуда
  2. Защита от длинных команд
  3. Защита от пинг-флуда
  4. Защита от команд, не принадлежащих NMDC протоколу (отключение (по умолчанию) при неизвестных командах)
  5. Защита от флуд-входа
  6. Защита от длинных ников

Работа над защитой ещё не окончена.

Added: Новое событие: OnScriptError(sScriptName, sErrMsg, bStoped)
Функция выполняется при возникновении ошибки в скрипте sScriptName. sErrMsg - сообщение с ошибкой. Флаг bStoped равен true если скрипт, в котором возникла ошибка, был остановлен, в противном случае флаг bStoped равен false.
Функция не вызывается для текущего скрипта. Для отслеживания ошибок в текущем скрипте нужно использовать функцию OnError(sErrMsg).
Напомню, что по умолчанию скрипт отключается при ошибке, отключение скрипта можно предотвратить возвратом true в функции OnError этого скрипта.

Added: Новое событие: OnFlood(UID, iType, iNum)
Функция выполняется при обнаружении флуда со стороны пользователя. Может служить для установки бана за флуд или для разрешения флуда ОПераторам хаба. Параметр iType указывает тип флуда (0 - чат-флуд, 1 - флуд в личке, 2 - MyINFO-флуд, 3 - флуд получения списка, 4 - поисковый-флуд, 5 - SR-флуд, 6 - CTM-флуд, 7 - RCTM-флуд, 8 - флуд неизвестными командами). Параметр iNum указывает номер срабатываемого флуда 1 или 2 (см. настройки флуда).
Возвращаемое значение: true или 1 - не отключать пользователя.

Updated: Обновлена функция Core.RestartScripts(iType) (в функцию добавлен не обязательный параметр)
Функция перезапускает все скрипты. Если параметр iType отсутствует, равен nil или равен 0, то перезагружаются все скрипты без исключения. Если параметр iType равен 1, то перезагружаются все скрипты, кроме работающих на данный момент. Если параметр iType равен 2, то перезагружаются все скрипты, кроме текущего скрипта (из которого была вызвана данная функция).


Плагин с поддержкой Lua 5.2 (чисто испробовать что за зверь big_smile.gif ) : [attachment=4018:lua_plug...2_lua5.2.rar]
Nickolya, Jaska, Invisible, alex82, ExC0tiC
28.1.2010, 21:31 Lua 5.2
тестовый вариант
http://www.lua.org/news.html

Изменения в lua.

  • По умолчанию не загружается debug библиотека. Для загрузки нужно использовать require"debug".
  • Функций setfenv и getfenv больше нету. Вместо этого используйте функцию loadin или используйте соответствующие функции из debug библиотеки.
  • Функции math.log10 больше нету. Используйте math.log с десяткой во втором аргументе.
  • Функции table.maxn больше нету. Если вам она необходима, напишите её на lua.
  • Функция unpack внесена в таблицу table. Теперь эта функция вызывается так: table.unpack



Изменения в api.

  • Псевдоиндекс LUA_GLOBALSINDEX был удалён. Вместо этого нужно использовать псевдоиндекс LUA_ENVIRONINDEX, если C функция не изменяет своего стандартного окружения. В противном случае вы должны получить глобальное окружение из реестра.
  • Макросы lua_getglobal, lua_setglobal и lua_register теперь действуют в окружении функции вместо глобального окружения.
  • Функция luaL_typerror была переименована в функцию luaL_typeerror, для корректности.
  • Функция lua_cpcall была удалена. Вместо ней используйте функцию cpcall из реестра.
  • Функции lua_equal и lua_lessthan были удалены. Вместо них используйте функцию lua_compare с соответствующей опцией.
  • Функция lua_objlen была переименована в функцию lua_rawlen.
  • Окончательно удалены макросы lua_open(), lua_getregistry(L), lua_getgccount(L), lua_Chunkreader и lua_Chunkwriter.
Nickolya, Invisible, Saymon21
27.1.2010, 16:40 Support
API2 | Комната техподдержки
ошибка "attempt to call global 'SendToRoom' (a nil value)" исправляется заменой строки
Код
function Core.SendToRoom(name,msg)
на
Код
function SendToRoom(name,msg)


ошибка "attempt to call global 'GetOnlineOps' (a nil value)" исправляется заменой строки
Код
for _,user in pairs(GetOnlineOps()) do
на
Код
for _,user in pairs(Core.GetOnlineOps() or {}) do


На всякий случай прикладываю файл: [attachment=3986:support.lua]
Invisible, morn, мамин_парень
25.1.2010, 1:15 Клиент FGlink DC++ NEW
Впервые представлен пользователям
Если разработчик своего клиента использует исходный код любого DC клиента, который распространяется под лицензией GPL, то это обязывает разработчика наследовать для своего клиента эту лицензию GPL, в противном случае разработчик должен писать весь код клиента сам (ни чего не заимствуя из других DC клиентов с лицензией GPL).
Nickolya
24.1.2010, 15:07 WebServer
скрипт создающий веб-интерфейс для хаба
В коде скрипта так:
Код
function OnError(sErrorMsg)
    Core.SendToAll("*** Произошла ошибка в скрипте: "..sErrorMsg)
    return true
end

поэтому сообщение об ошибке отправляется всем. Чтобы отправлялось только админу нужно исправить:
Код
function OnError(sErrorMsg)
    Core.SendToProfile(0, "*** Произошла ошибка в скрипте: "..sErrorMsg)
    return true
end
(при условии, что профиль 0 - это профиль админа big_smile.gif )
Otshelnik-Fm
23.1.2010, 19:03 RusHub
Кроссплатформенный консольный DC хаб
Незапланированные версии хаба и lua плагина с фиксами в функциях Core.GetConfig(sName) и Core.GetLang(sName)
Nickolya, Invisible, ExC0tiC
23.1.2010, 18:43 Репорты об ошибках старых версий
архив темы ошибок текущей версии хаба
Багу нашёл. Всё исправлю в ближайшее время.

Цитата(Nickolya @ 23.1.2010, 16:25) *
сейчас я пока только приметил еще что iMaxErrLevel и iMaxLevel меняются в любом диапазоне, а не в рабочем, меняется при чем даже на отрицательное значение. А изменение настройки на неправильное значение, к примеру ввод в настройку числового типа букв сбрасывает настройку в 0.

Другие значения параметров iMaxErrLevel и iMaxLevel зарезервированы так сказать на будущее. Например, любое отрицательное значение на данный момент отвечает отключению лога вообще, а любое значение, которое больше максимального, будет логировать всё то, что логирует максимальное значение. А любое неправильное значение действительно превращается в ноль, - так уж работает сишная функция atoi big_smile.gif
Nickolya
23.1.2010, 1:23 Клиент FGlink DC++ NEW
Впервые представлен пользователям
Ресторатором менять всякие ресурсы программы. Ресурсы менять не сложно (модифицировать или удалять имеющиеся).
Saymon21
22.1.2010, 16:15 RusHub
Кроссплатформенный консольный DC хаб
lua plugin v 1.11

Изменения:

Fixed: Исправлены баг в работе функции Core.GetGVal. (Баг появился из-за модернизации кода в плагине v 1.10)

Fixed: Исправлен баг в работе функции Core.RestartScripts. (спасибо fixx-у за очередной репорт).
Nickolya, Invisible, Артём, ExC0tiC
22.1.2010, 13:11 Вопросы по RusHub
Технические вопросы
На больших хабах вполне естественно что всё упирается в производительность системы.

При использовании стека протоколов TCP/IP пользователь идентифицируется сервером по своему ip-адресу, порту на клиентской машине и ip-адресу с портом на серверной машине. Обычно, на серверной машине выделяется по одному порту на каждого из клиентов в текущий момент, следовательно работать с ними можно пользуясь номерами портов и используемым ip-адресом. Вся эта информация скрывается внутри сокетов, которыми можно оперировать как обычными файлами.

Можно создавать для каждого пользователя отдельный процесс с копией сервера. Если это делать каждый раз при коннекте пользователя и потом процесс уничтожать, то такой подход становится чрезвычайно расточительным, в связи с тем, что вызов для создания процессов, является очень дорогостоящим: происходит создание копии процесса-родителя (который вызвал этот процесс), что приводит к перемещениям больших объемов данных из одного места оперативной памяти в другое. Можно сразу же создать некоторое количество серверов в отдельных процессах и передавать им управление при поступлении новых запросов. Этот способ значительно лучше, тем не менее он хорошо подходит для процессов, в которых время обработки запросов само по себе значительно, а в данный момент мы рассматриваем обработку данных, когда большую часть затраченного времени составляет именно работа с сетью.

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

Остается действовать в пределах одного процесса и организовывать цикл обработки сообщений от сетевого окружения операционной системы. Чаще всего используются системные вызовы poll() или select().

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

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

Если на каждую запись или чтение выполняется какая-то своя длительная операция, со своими внутренними циклами, ветвлениями и прочим, то все это не особенно важно. Но если обработка полученных дескрипторов сводится к копированию данных из внутренних буферов в дескрипторы и обратно, то выполнение бесконечного цикла обработки select(), копирования данных при вызове, а так же пробежка по битовым массивам становится, по сути, единственными действиями, которые выполняет сервер. На самом деле, именно эти операции ограничивают его производительность.
Nickolya
22.1.2010, 1:23 Предложения для развития
1 - зачем задержка? Когда сетевые службы загрузятся тогда и войдёшь на хаб.
2 - выход - запуск хаба как службу.
3 - обновляться модули, библиотеки и хаб могут независимо друг от друга.

Для возможности перезагрузит все скрипты используй скрипт FirstRusHubBot
Otshelnik-Fm
22.1.2010, 0:49 Вопросы по RusHub
Технические вопросы
Для lua нет разницы, можете называть просто userdata (даже неверное так и следует делать чтобы не сбивать с толку).
Разница есть только для си.
big_smile.gif
Nickolya, alex82
21.1.2010, 23:26 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.0.9
lua plugin v 1.10


Изменения:

Added: Добавлена lua функция отправки данных профилю/профилям: Core.SendToProfile(iProfile/tProfiles, sData, sNick, sFrom). Если первый аргумент - число, то сообщение отправляется профилю, если первый аргумент таблица, то отправляется профилям, указанным в этой таблице.
Пример:
Код
Core.SendToProfile({0, 1}, "Hello", "Bot") -- отправка от бота сообщения Hello профилям 0 и 1


Fixed: Исправлены некоторые мелкие и не значительные баги, а также оптимизированы некоторые процессы.
Nickolya, Invisible, fixx, Артём, ExC0tiC, Sekretchik, Saymon21
20.1.2010, 0:07 RusHub
Кроссплатформенный консольный DC хаб
lua plugin v 1.9

Изменения:

Added: Добавлена api функция Core.Call(sScriptName, sFunc, ...), при помощи которой можно вызывать функции других скриптов.
Параметры функции и возвращаемые значения функции могут быть только следующих типов: string, number, boolean, table и userlightdata.
Nickolya, Invisible, Артём, ExC0tiC
18.1.2010, 19:20 Предложения для развития
Список пока не реализованных идей и запросов ( todo / future request / change request / improvement ).

ToDo:

  • Сделать возможность запрета перенаправления по возвращаемому значению из функции OnOpForceMove
  • Сделать возможность смены директорий на лету (сейчас могут быть с этим проблемы).
  • Реализовать хранение информации в бд. По умолчанию в SQLite3 с возможностью подключения драйверов других баз данных (в частности, в первую очередь MySQL).
  • Встроенный бан менеджер с перегружаемыми из lua событиями.
  • Сделать параметр настроек "ограничение количества поисковых запросов".
  • Функция статистики и информации о сервере.
  • Реализовать функцию получения пользователей по профилю/профилям.
  • Добавить возможность в функции Core.SendToIP отсылать данные таблице ip адресов, а не только одному ip.
  • Сделать возможность смены настройки sAddresses на лету.
  • Сделать поддержку характеристики QuickList.


    Оптимизация:
  • Кеширование поисковых запросов и отвечающих им результатов поиска
  • Умный кэш (кэш для рассылки всем, кроме...).
  • Сделать хвостовой кэш для массовой рассылки: рассылка по окончанию шага цикла (кэш по умолчанию для массовой рассылки).
  • Сделать отложенный выход для того чтобы не совершать бесполезные массовые рассылки.
  • Сделать событие OnReEnter при условии реализации отложенного выхода.


    На потом:
  • Оптимальная линковка хабов (встроенный в хаб функционал линковки).
  • Авторегистрация хаба в хаблистах (процесс регистрации в отдельном потоке).
  • Доработать анти-спам.
  • Сделать потоки в Lua.
Nickolya, Invisible, Infinity_Love, KT315, Saymon21, DEN 007
17.1.2010, 17:50 Предложения для развития
Отсылку по таблице с профилями тоже реализую.


Значение возвращается в том окружении, где вызвана функция.
Nickolya
17.1.2010, 15:36 Предложения для развития
API функция Core.SendToProfile будет конечно работать быстрее, но пока её нету, можешь использовать lua аналог:

Код
Core.SendToProfile = function(iProfile, sData, sNick, sFrom)
  for i, v in ipairs(Core.GetUsers(12)) do
    if v.iProfile == iProfile then
      Core.SendToUser(v.UID, sData, sNick, sFrom)
    end
  end
end


После того как я сделаю api функцию Core.SendToProfile, эту lua функцию можно будет удалить, при этом вызовы этой функции не пострадают big_smile.gif
Nickolya
17.1.2010, 14:49 Предложения для развития
Сделал.

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

Оказывается я был не прав. Оказывается можно реализовывать всё что угодно.

Nickolya, расскажи для чего тебе нужен был данный функционал? big_smile.gif (Хотя понятно, что этот функционал действительно очень мощный)
Nickolya
16.1.2010, 23:02 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.0.8
lua plugin v 1.8


Изменения:

Fixed: Исправлен баг с выскакиванием части команды при регистрации в оп листе (спасибо fixx-у за обнаружение бага)

Fixed: Исправлены мелкие баги с логированием некоторых событий как ошибок.

Fixed: Исправлены lua api функции Core.RestartScripts, Core.RestartScript, Core.StopScript, Core.StartScript. Теперь функции Core.GetScripts и Core.GetScript нормально отображают скрипты, даже если перезагружается текущий скрипт или все скрипты.

Fixed: Исправлены баги в функциях перезагрузки и остановки скриптов для случая удалённого скрипта (спасибо fixx-у за обнаружение бага).

Added: Добавлена полная поддержка характеристики UserIP2.

Added: Добавлен 13-й бит для функции Core.GetUser и 6-ой тип для функции Core.SetUser.
Nickolya, Invisible, Артём, Otshelnik-Fm, ExC0tiC
13.1.2010, 16:25 Репорты об ошибках старых версий
архив темы ошибок текущей версии хаба
Цитата(Nickolya @ 2.1.2010, 4:39) *
Что хочется видеть в апи:
- совсем не ясный параметр iByte в функции Core.GetUser(UID/sNick, iByte), либо объяснений по этому параметру, либо нормальной функции
- изменение настроек хаба через луа, хотя бы имени хаба и топика
- совместить функции Core.SendToNick(sTo, sData, sNick, sFrom) и Core.SendToUID(UID, sData, sNick, sFrom)
- может будет удобней если будет парситься майинфо юзеров
- и конечно же расширения апи big_smile.gif



Цитата(Setuper @ 2.1.2010, 18:41) *
Готов реализовать парсинг MyINFO, действительно наверное это было бы удобнее. Тут вопрос: парсить ли тэг, или парсить всё кроме тэга?


Парсинг MyINFO строки скорее всего не будет реализован в хабе. Главная причина: способность изменять команды налету (при помощи функции Core.SetCmd). Хотя может и наоборот стоит парсить даже после использования функции Core.SetCmd. Тут стоит подумать как будет эффективнее.


По поводу остальных пунктов из цитаты, то вроде всё ясно и реализовано.

На очереди реализация возможности отправки всех ip адресов "избранным" и функция регистрации ботов.

Спасибо за внимание big_smile.gif
Nickolya
12.1.2010, 21:22 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.0.7

Fixed: Пофиксил небольшой баг на хабе перехода в скрытый режим. Обнаружил при написании скрипта hideme

Выложил исходники хаба и lua плагина
Для сборки хаба используем vs2005 или vs2008. Отвечу на все интересующие вопросы по поводу сборки хаба
Nickolya, Invisible, Otshelnik-Fm, PomanoB, ExC0tiC, KamoK
12.1.2010, 20:17 Hideme
скрипт скрытия в юзер-листе
Название скрипта: Hideme
Версия скрипта: 1.3
Автор: Setuper
Описание: Скрипт позволяет скрываться в юзер-листе. Очень продвинутый функционал. В отличие от птохи, скрытые пользователи никак не могут быть обнаружены (даже при помощи CDM отладчика). Однако, скрытый пользователь может писать в чате и использовать все возможности. Он вообще может считать сябя не скрытым))). Сам скрытый видит свой ник в юзер-листе.
Скрытый режим сохраняется даже после переподключения к хабу и даже после перезапуска хаба. Предупреждение о том, что пользователь находится в скрытом режиме поступает непосредственно при входе на хаб. Таблица tProfiles содержит профили, которым разрешено переходить в скрытый режим.

Внимание! Для работы скрипта необходим модуль files.lua, который нужно положить в папку libs. Модуль можно скачать ТУТ

Для корректной работы скрипта лучше установить хаб не ниже v 2.0.7, так как был устранён небольшой баг в функции скрытия.

[attachment=5323:hideme.lua]
Invisible, fixx, Sekretchik, Saymon21, AltSide, мамин_парень
12.1.2010, 17:43 lfs
RusHub | Библиотека LuaFileSystem
Название: LuaFileSystem (lfs)
Версия: 1.4.2
Хаб: RusHub
Описание: Библиотека для работы с файловой системой.
Использование: Помещаем файл lfs.dll в папку libs. Для подключения библиотеки используем функцию require"lfs"

Библиотека win32: [attachment=3884:lfs_1.4.2.rar]
Библиотека win64: [attachment=5818:lfs_1.4.2_win64.rar]

Проект для сборки на vs2008 (win32): [attachment=6415:lfs_1.4.2_src_vs9.zip]
Исходники для сборки (*nix): [attachment=5198:lua_file....4.2.tar.gz]
Nickolya, Invisible, Saymon21, TiGRpp, DEN 007
12.1.2010, 17:10 mysql
RusHub | Библиотека базы данных mysql
Название: mysql
Версия библиотеки: 2.1.1
Хаб: RusHub
Версия БД: 5.0
Описание: Библиотека для подключения базы данных mysql
Использование: Содержимое архива mysql_2.1.1.rar распаковываем в папку libs. Подключается библиотека так: require"luasql.mysql".
Примечание: Если не работает, то попробуйте библиотеку libmysql.dll закинуть в корень (папку с rushub.exe) или же в system32 (syswow64 для x64).

Библиотека win32: [attachment=3882:mysql_2.1.1.rar]
Библиотека win64: [attachment=5814:mysql_2.1.1_win64.rar]

Проект для сборки на vs2008: [attachment=6418:mysql_2...._src_vs9.zip]

Скрипт примера работы с MySQL в LUA: [attachment=5868:mysql_test.lua]

Основные функции для работы
Основные функции для работы с mysql в lua


Код
luasql._COPYRIGHT = "Copyright (C) 2003-2007 Kepler Project"
luasql._DESCRIPTION = "LuaSQL is a simple interface from Lua to a DBMS"
luasql._VERSION = "LuaSQL 2.1.1"
luasql._MYSQLVERSION = "5.0.18"


  • Подключение драйвера (библиотеки):
    Код
    require"luasql.mysql"

  • Инициализация драйвера (библиотеки):
    Код
    env = luasql.mysql()

  • Деинициализация драйвера (библиотеки):
    Код
    env:close()
    Возвращает true в случае успешного закрытия, false в случае, если закрытие уже было сделано до этого, и порождает ошибку скрипта: "LuaSQL: environment expected", если в метод был подсунут неверный объект.




Объект - соединение (conn)

  • Метод вызова соединения с базой данных:
    Код
    conn = env:connect([имя_базы], [имя_пользователя], [пароль], [хост], [порт])
    Обязательным является только первый параметр, остальные параметры в случае отсутствия берутся по умолчанию: [имя_пользователя] = "root", [пароль] = "", [хост] = "localhost", [порт] = 3306.
    В случае нехватки памяти возвращается nil и сообщение об ошибке: "LuaSQL: Error connecting: Out of memory."
    В случае неудачного коннекта к базе данных возвращается nil и сообщение об ошибке: "LuaSQL: Error connecting to database. MySQL: [reason]"

  • Метод закрытия соединения с базой данных:
    Код
    conn:close()
    Закрытие может быть успешным только в случае если все курсоры закрыты. Возвращает true в случае успешного закрытия, false в случае, если закрытие уже было сделано до этого, и порождает ошибку скрипта: "LuaSQL: connection expected", если в метод был подсунут неверный объект.

  • Метод выполнения SQL запроса к базе данных:
    Код
    conn:execute("запрос")
    В случае правильности запроса, для запросов типа SELECT возвращает курсор, для остальных запросов возвращает число столбцов или строк, успешно обработанных запросом. В случае неверного синтаксиса, или несуществующих таблиц, или несуществующих полей, или прочих ошибок возвращается два значения: первое - nil, второе - сообщение с содержанием ошибки.

  • Метод выполнения (завершения, совершения) текущей транзакции:
    Код
    conn:commit()
    Возвращает true в случае успеха, false - в случае, когда транзакция не может быть завершина или база данных не поддерживает транзакции (поддержка транзакции в mysql осуществляется с версии 4.0).

  • Метод отката на предыдущую транзакцию:
    Код
    conn:rollback()
    Возвращает true в случае успеха, false - в случае, когда операция не может быть выполнена или база данных не поддерживает транзакции (поддержка транзакции в mysql осуществляется с версии 4.0).

  • Метод включения/отключения автоматических транзакций:
    Код
    conn:setautocommit(boolean)
    Эта функция не может работать на базах, на которых не осуществляются транзакции. На базах данных, на которых нет понятия режима автоматических транзакций, этот механизм осуществляется драйвером. Метод возвращает true в случае успеха, и false - в случае невыполнимости или неосуществимости (поддержка транзакции в mysql осуществляется с версии 4.0).



Объект - курсор (cur)

  • Метод закрытия курсора:
    Код
    cur:close()
    Возвращает true в случае успешного закрытия, false в случае, если закрытие уже было сделано до этого, и порождает ошибку скрипта: "LuaSQL: cursor expected", если в метод был подсунут неверный объект.

  • Метод извлечения результатов:
    Код
    cur:fetch([table[,modestring]])
    Извлекает следующий столбец с результатами. Если метод вызывается без параметров, то результаты возвращаются непосредственно вызывающему оператору. Если в первом параметре метода указана таблица, то результаты помещаются в эту таблицу, и методом возвращается эта таблица, при этом может быть использован второй параметр. Второй параметр - это строка, которая указывает на то, как создавать результирующую таблицу:
    "n" - результирующая таблица будет содержать целочисленные индексы (это значение по умолчанию);
    "a" - результирующая таблица будет содержать словесные индексы.
    Целочисленные индексы являются номерами полей в SELECT запросе. Словесные индексы являются названиями полей в SELECT запросе. Дополнительный табличный параметр является таблицей, которую нужно использовать для сохранения следующей строки запроса. В частности, это допускает использование одной уникальной таблицы для всех выборок, и такой механизм может улучшить общее выполнение выборки в целом. Нет гарантии того, что извлечённые результаты будут преобразовываться в нужные в lua типы (в зависимости от содержания), то есть это говорит о том, что возвращаемые результаты всегда представляются в виде строковых значений будь это строка или число. Метод возвращает результирующую таблицу или nil, в случае если достигнута конечная строка. Здесь нужно отметить, что этот метод может возвращать nil, но тем не менее запрос будет выполнен правильно.
    В случае, если у данного метода не указаны параметры, то выбранные из базы значения сливаются в стек, а так как стек не резиновый, то в случае переполнения стека может возникнуть ошибка скрипта: "LuaSQL: too many columns", поэтому в случае большого количества данных рекомендуется сливать данные в таблицу, указывая её в первом аргументе данного метода.

  • Метод, возвращающий таблицу с именами столбцов для данного курсора:
    Код
    cur:getcolnames()
    Метод порождает ошибку скрипта: "LuaSQL: cursor expected", если в метод был подсунут неверный объект.
    Метод порождает ошибку скрипта: "LuaSQL: cursor is closed", если курсор был закрыт.

  • Метод, возвращающий таблицу с типами столбцов для данного курсора:
    Код
    cur:getcoltypes()
    Метод порождает ошибку скрипта: "LuaSQL: cursor expected", если в метод был подсунут неверный объект.
    Метод порождает ошибку скрипта: "LuaSQL: cursor is closed", если курсор был закрыт.

  • Метод, возвращающий число строк, полученных в результате запроса:
    Код
    cur:numrows()
    Метод порождает ошибку скрипта: "LuaSQL: cursor expected", если в метод был подсунут неверный объект.
    Метод порождает ошибку скрипта: "LuaSQL: cursor is closed", если курсор был закрыт.
Invisible, Accelerator, PomanoB, Alexey, Saymon21
12.1.2010, 15:07 luasocket
RusHub | Библиотека сокетов
Название: luasocket
Версия: 2.0.2
Хаб: RusHub
Описание: Библиотека сокетов
Использование: Кладём содержимое архива luasocket_2.0.2.rar в папку libs. Подключается библиотека сокетов так: require"socket"

Библиотека win32: [attachment=5433:luasocket_2.0.2.rar]
Библиотека win64: [attachment=5819:luasocke....2_win64.rar]

Проект для сборки на vs2008: [attachment=6416:luasocke..._src_vs9.zip]
Nickolya, Invisible, Maximum, Sekretchik, Saymon21, Asbar, AfLc
11.1.2010, 22:15 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.0.6
lua plugin v 1.7


Изменения:

Added: Добавлена настройка установки локали. Корректное восприятие русских букв или букв других языков (в зависимости от локали). Теперь lua функции string.lower и string.upper корректно работают с русскими буквами. Если на хабе есть пользователь Вася, то с ником ВАСЯ уже нельзя войти на хаб.

Added: Добавлена функции сокрытия ника из списка пользователей (12-ый бит функции Core.GetUser и функция Core.SetUser(UID, 5, bool)).

Added: Добавлено событие OnKick(UID, sData)

Added: Добавлено событие OnOpForceMove(UID, sData)

Added: Добавлено событие OnGetINFO(UID, sData)
Nickolya, BIMMER71, Invisible, Serx, ExC0tiC, Sekretchik, X-Sky
9.1.2010, 21:22 Модули для скриптов RusHub
Файл не найден, поэтому функция Files.LoadText не смогла его открыть и вернула nil.

Вот правильный код:
Код
local sBot = "Security"
local sPath = Core.sMainDir.."texts/"
require "files" -- для Files.LoadText

function OnChat(UID, sData)
  local sCmd = sData:match"%b<>%s+[!+*](%S+)"
  if sCmd then
    local sText = Files.LoadText(sPath..sCmd..".txt")
    if sText then
      Core.SendToUser(UID, sText, sBot, sBot)
      return true
    end
  end
end
Invisible, Accelerator
9.1.2010, 20:27 Модули для скриптов RusHub
Модули кладутся в папку libs.
Давайте сделаем некое правила написания модулей: файлы модулей будем писать строчными буквами, а модули объявлять тем же словом, но начинающемся с заглавной буквы. Так будет проще отличать название файла с модулем, от названия самого модуля (для того чтобы вникнуть в их суть).

Пример использования функций модуля:
Код
require"files" -- подключение модуля
Files.SaveTable("myfile.txt", tTable, "tTable") -- Вызов функции модуля


Модуль для работы с файлами: [attachment=3901:files.lua]
Модуль различных утилит: [attachment=5424:utils.lua]



Давайте в этой теме обсуждать те функции, которые часто используются скриптами, и запихивать их в модули
Invisible, Ksan, Alexey, Sekretchik, Saymon21, AfLc, мамин_парень
9.1.2010, 19:44 Объявления (Announcements)
версия 1.1
Код
local tUser = Core.GetUser(UID, 2047)
local sUser = Core.GetUser(UID, 8)


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

Цитата
2^0 - ник (sNick)
2^1 - ip (sIP)
2^2 - UID (UID)
2^3 - профиль (iProfile)
2^4 - MyINFO строка (sMyINFO)
2^5 - пользовательские данные (sData)
2^6 - пользователь в оп-лите (bInOpList)
2^7 - пользователь полностью вошёл и добавлен в список пользователей (bInUserList)
2^8 - реальный порт (iPort)
2^9 - порт коннекта (iPortConn)
2^10 - мак адрес (sMacAddress)
2^11 - версия протокола (sVersion)


В двоичной системе:
000000000001 - ник (sNick)
000000000010 - ip (sIP)
000000000100 - UID (UID)
000000001000 - профиль (iProfile)
000000010000 - MyINFO строка (sMyINFO)
000000100000 - пользовательские данные (sData)
000001000000 - пользователь в оп-лите (bInOpList)
000010000000 - пользователь полностью вошёл и добавлен в список пользователей (bInUserList)
000100000000 - реальный порт (iPort)
001000000000 - порт коннекта (iPortConn)
010000000000 - мак адрес (sMacAddress)
100000000000 - версия протокола (sVersion)

Теперь, как перейти из двоичной системы в десятичную?
Всё очень просто: отсчитываем справа позицию, на которой стоит единица и возводим двойку в эту степень (отсчёт позиции происходит с 0, а не с 1). То есть для поля ника нулевая позиция, 2^0 = 1.
Код
local tUser = Core.GetUser(UID, 1)



Для профиля: третья позиция, следовательно для профиля 2^3 = 8
Код
local tUser = Core.GetUser(UID, 8)


А что если 1 не в одном поле, а в нескольких полях?
Пример: 101010101010.
Каждая позиция отвечает за добавление какого-то поля. Вот и смотрим по позициям какие поля добавятся. Для этих полей будет число (считаем справа на лева): 0*2^0 + 1*2^1 + 0*2^2 + 1*2^3 + 0*2^4 + 1*2^5 + 0*2^6 + 1*2^7 + 0*2^8 + 1*2^9 + 0*2^10 + 1*2^11 = 2730
То есть для того, чтобы в таблицу tUser поместить поля sIP, iProfile, sData, bInUserList, iPortConn и sVersion (именно на позициях этих полей стоит 1 в нашем бинарном числе), нужно в функции написать число 2730:
Код
local tUser = Core.GetUser(UID, 2730)


Давай те теперь разберёмся чему же отвечает число 2047, которое используется в скрипте?
Оно отвечает следующей бинарной строке: 011111111111. То есть это число добавит в таблицу tUser все поля, кроме поля sVersion.


Каждому десятичному числу отвечает двоичное число. Например, мы рассматривали двоичное число 101010101010 и выяснили, что ему отвечает десятичное число 2730. А каком двоичному числу отвечает следующее десятичное число 2731? Естественно ему соответствует двоичное число 101010101011, то есть для числа 2731 в таблицу tUser добавятся теже самые поля, что и для числа 2730, но плюс ещё поле sNick.

1 = 000000000001
2 = 000000000010
3 = 000000000011
4 = 000000000100
5 = 000000000101

...

2730 = 101010101010
2731 = 101010101011
2732 = 101010101100
2733 = 101010101101
2734 = 101010101110
2735 = 101010101111

и тд.


Надеюсь, что я понятно объяснил работу с бинарными числами.
Функция Core.GetUser достаточно хорошо оптимизирует код, если правильно ею распоряжаться и вносить в таблицу tUser только те поля, которые мы собираемся использовать в данной области видимости.

У тебя в функции OnChat используется только 2 поля: поле sNick и поле iProfile, поэтому самый оптимальный код будет выглядеть так:
Код
local tUser = Core.GetUser(UID, 9)
таблица tUser будет содержать только эти 2 поля (sNick и iProfile). В функции OnUserEnter всё оптимально, и там ничего менять не нужно.



И ещё раз повторю, что не нужно к каждому скрипту делать свой модуль. Модуль должен быть один для всех скриптов, и называться он должен в соответствии с теми функциями, которые он содержит.
Invisible, Accelerator, Saymon21
7.1.2010, 18:29 Скрипт банов для RusHub
тестим и комменьтруем
хехе ты читаешь всю базу зарегистрированных пользователей, для того чтобы сделать доступ только определённым.
А нужно чтобы скрипты работали отдельно, то есть не привязывать скрипт банов к скрипту регистрации.
Скрипт регистрации устанавливает пользователям профиль, и этот профиль можно использовать в любом скрипте. Это делается с помощью занесения в таблицу пользователя поля профиля:
Код
local tUser = Core.GetUser(UID, 8)
if tUser.iProfile == 0 or tUser.iProfile == 1 then -- если админ или оператор
  ...
end

Это так сказать пояснения...))))
Accelerator
6.1.2010, 23:45 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.0.5
lua plugin v 1.6

Изменения:

Fixed: Теперь в настройку sHubIP можно записывать не только ip адрес, но и хост.

Fixed: В целях оптимизации были убраны lua функции Core.GetMainDir(), Core.GetScriptsDir() и Core.GetHubInfo(). Вместо них теперь поля: Core.sMainDir, Core.sScriptsDir, Core.sHubVersion и Core.sLuaPluginVersion соответственно.
В связи с этим, некоторые скрипты откажутся работать!

Added: Добавлены lua функции: Core.GetConfig(sName), Core.SetConfig(sName, sValue), Core.GetLang(sName), Core.SetLang(sName, sValue).
Функции позволяют управлять конфигурацией и языковыми настройками хаба. Однако, для функции Core.SetConfig исключения составляют настройки: sHubIP, iMainPort, sSubPorts.
При изменении настройки sHubName или sTopic отправляется соответствующая команда. После изменения, настройки сохраняются.
Nickolya, Invisible, ExC0tiC
6.1.2010, 13:57 Предложения для развития
в русхабе намного продвинутый аналог этой функции содержится в функции Core.SendToUser(UID/sToNick, sData, sNick, sFrom)

UID/sToNick - UID или ник пользователя, которому хотим отослать сообщение
sData - само сообщение

Если указан параметр sNick, то сообщение будет отсылаться в чат от этого ника

Если кроме параметра sNick указан параметр sFrom, то сообщение будет отсылаться в приват от пользователя sFrom, с ником в сообщении sNick.
Для того, чтобы отсылающий и ник в сообщении совпадали, нужно чтобы совпадали параметры sNick и sFrom.

Пример:

Код
Core.SendToUser("Вася", "Тест", "Петя", "Бот")

эта строка отошлёт приватное сообщение "Тест" пользователю с ником "Вася", причём на закладке приватного окна будет указано, что сообщение пришло от "Бот", а в самом сообщении будет так: <Петя> Тест

Надеюсь понятно разъяснил))))
В общем пробуем))

Цитата(Wariner @ 6.1.2010, 10:33) *
Хм, вопрос не по хабу а по форуму. может стоит разделить скрипты и модули? т.е. отдельно ветка скриптов отдельно ветка модулей?

Модули, я думаю, можно обсуждать в разделе "Разработчикам".
Accelerator
6.1.2010, 13:53 AntiAdv
антиреклам
Кстати, по поводу всяких антиреклам и антиматов, обратите внимание на мощь функции Core.SetCmd(sData) big_smile.gif
Sekretchik, Saymon21
6.1.2010, 2:12 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.0.4
lua plugin v 1.5


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


Список изменений:

Added: Добавлена функция Core.GetUpTime()

Added: Добавлена функция Core.GetHubInfo() информация о хабе и о плагине.

Added: Добавлена новая функция Core.SendToNicks(tNicks, sData, sNick, sFrom). Функция отправляет сообщение всем никам, которые находятся в таблице tNicks.

Added: Добавлена функция Core.DisconnectIP(sIP). Разъединяет всех пользователей с указанным IP.

Fixed: Исправлена функция Core.SetUser. Теперь пользователь может быть когда угодно занесён и извлечён из списка операторов, а не только при входе на хаб. Ставим/убираем ключик одним движением руки. Код написан оптимально и исключает повторных действий при вызове.

Fixed: Исправлен баг в функции Core.GetUsers

Fixed: Модифицирована функция Core.GetUsers(sIP, iByte).
Core.GetUsers() - таблица с UID'ми всех пользователей хаба
Core.GetUsers(iByte) - таблица с таблицами пользователей, которые содержат данные битов параметра iByte
Core.GetUsers(sIP) - таблица с UID'ми пользователей с указанным IP
Core.GetUsers(sIP, iByte) - таблица с таблицами пользователей с указанным IP, которые содержат данные битов параметра iByte
Nickolya, Invisible, ExC0tiC, Sekretchik
5.1.2010, 13:42 Скрипт для пингеров
Я убрал из хаба практически всё. Оставил только самое нужное. Остальное оставил на скрипты.

Чем же данные не очень корректны? На хабе отсутствуют настройки минимальной шары, минимальных слотов и тд., которые используются в этой команде. Предполагается, что тем, кому нужны эти настройки, те установят себе соответствующие скрипты.

Я могу нагромоздить это всё в хабе, однако, разве это нужно?
Nickolya, dj_crazy_joker
4.1.2010, 23:56 Вопросы по RusHub
Технические вопросы
Пользовательские данные - это поле для хранения любой информации для данного пользователя, то есть туда можно записать всё, что угодно - своего рода блокнот пользователя. Можно сделать, чтобы админы туда что-то писали и просматривали эти данные, можно чтобы сами юзеры могли что-то туда заносить, а можно использовать это поле для передачи какой-то информации между скриптами.

Core.SetUser(UID, 4, true) до входа (после получения пароля) вносит пользователя в лист операторов (устанавливает ключик).


Пример из скрипта регистрации:
Код
function OnMyPass(UID, sData)
  local sPass = sData:match"^.- (%S+)$" -- "$MyPass <pass>"
  local tRegInfo = tRegUsers[Core.GetUser(UID, 1).sNick] -- Получаем регистрационные данные
  if not sPass or sPass ~= tRegInfo.sPass then -- Проверяем правильность пароля
    Core.SendToUser(UID, ("<%s> "):format(sBot)..sBadPassMsg.."|$BadPass") -- Отсылаем сообщение о неверном пароле
    Core.Disconnect(UID) -- Разъединяем пользователя
  else
    Core.SetUser(UID, 1, tRegInfo.iProfile) -- Устанавливаем профиль пользователю
    Core.SetUser(UID, 4, true) -- Добавляем пользователя в оплист
  end
end

Хотя действительно нужно сделать эту возможность не только при входе (не только до добавления пользователя в списки). В следующем релизе сделаю.
Nickolya
4.1.2010, 20:31 Скрипт банов для RusHub
тестим и комменьтруем
Название скрипта: модуль банов + менеджер банов
Скрипт для: RusHub
Автор: Wariner (немного доработал: Setuper)
Описание: Модуль банов позволяет использовать функции бана в скриптах. Менеджер банов позволяет забанить, используя команды.
Модуль банов не может работать отдельно от менеджера банов, так как менеждер банов содержит основную таблицу с банами.

Внимание. Этот скрипт будет работает только с lua плагином, который равен или выше, чем версия v1.4, так как в плагине был устранён баг в функции Core.SetGVal.

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


[attachment=5403:Ban.lua][attachment=5407:BanManager.rar]
FallenAngel, Invisible, Артём, Infinity_Love, Kingston, Sekretchik, CrazyKiller, Saymon21, Dimon21, X-Sky, Sorrow, AltSide, AfLc
4.1.2010, 20:23 RusHub
Кроссплатформенный консольный DC хаб
lua plugin v 1.4

Fixed: Исправлена несколько некорректная работа функции Core.SetGVal с таблицами.
Nickolya, Invisible, ExC0tiC
4.1.2010, 4:00 RusHub
Кроссплатформенный консольный DC хаб
lua plugin v 1.3

Added: Функции Core.GetGVal и Core.SetGVal теперь позволяют оперировать с таблицами и с lightuserdata данными.
Nickolya, Invisible
3.1.2010, 1:34 Репорты об ошибках старых версий
архив темы ошибок текущей версии хаба
вместо функций Core.SendToUID и Core.SendToNick теперь функция Core.SendToUser

Просто заменяем эти функции на Core.SendToUser и всё будет работать.
Core.SendToUser теперь общая функция отсылки данных пользователю как по нику так и по идентификатору UID.
Invisible, Saymon21
3.1.2010, 1:19 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.0.3
lua plugin v 1.2


Изменения коснулись не только плагина, но и хаба (это для того, чтобы исправить некоторые баги).

Added: вместо функций Core.SendToUID и Core.SendToNick теперь функция Core.SendToUser(UID/sToNick, sData, sNick, sFrom)
Fixed: исправлен баг вылета в функции Core.GetScript при обращении к отключенному скрипту.
Fixed: исправлен баг, который не позволял создать лог ошибок скриптов, в случае, если в названии директории присутствовала кириллица.
Fixed: исправлен баг функции Core.Disconnect для случая разъединения пользователя по нику.
Nickolya, Invisible, ExC0tiC, Sekretchik, Saymon21
2.1.2010, 20:27 Скрипт для пингеров
Название скрипта: pinger
Скрипт для: RusHub
Версия скрипта: 1.0
Описание: Скрипт для пингеров. Отправляет пингерам, которые заходят на хаб, команду, содержащую информацию о хабе.
Автор: Setuper

[attachment=5669:pinger.lua]
Invisible, KT315, Sekretchik, Saymon21, stone, AfLc
2.1.2010, 18:41 Репорты об ошибках старых версий
архив темы ошибок текущей версии хаба
alex82, спасибо за скрипт. Я почти не сомневался, что хаб сможет цеплять практически все стандартные библиотеки lua. Что касается названия lua51.dll, то для удобства могу изменить его на lua.dll. Просто для подключения стандартной библиотеки для работы с mysql (http://luaforge.net/frs/?group_id=12&release_id=847) нужно имя lua51.dll, однако, её можно пересобрать под работу с lua.dll.


Nickolya, спасибо за обнаружение багов. По поводу функции Core.SendToUID, то про этот баг я знал, в ближайшее время исправлю.
По поводу бага с функцией перезагрузки, можно по-подробнее? Пример скрипта?
По поводу бага с функцией Core.GetScript, - исправлю в ближайшее время.

Объяснения по параметру iByte функции Core.GetUser:
С помощью данного параметра мы указываем какие поля мы хотим видеть в таблице, которую вернёт эта функция.
Параметр является числом, в котором зашифрованы биты полей.
Например:
мы хотим в таблице пользователя видеть следующие поля: sNick, sIP, iProfile, sMyINFO.
Для этого мы смотрим какие биты отвечают за эти поля:

Цитата
2^0 - ник (sNick)
2^1 - ip (sIP)
2^3 - профиль (iProfile)
2^4 - MyINFO строка (sMyINFO)

За эти поля отвечают биты: 0, 1, 3 и 4.
Складываем: 2^0 + 2^1 + 2^3 + 2^4 = 27
Пишем код:
Код
local tUser = Core.GetUser(UID, 27)

Таблица tUser будет содержать нужные нам поля (sNick, sIP, iProfile, sMyINFO).
Теперь для чего это нужно? Это является оптимальным вариантом подачи данных в lua. То есть, заносим в таблицу только то, что мы собираемся использовать, ни больше и не меньше.

Сравнение с птохой: в птохе всегда определены 4 поля в таблице пользователя (sNick, sIP, uptr и iProfile), а остальные поля можно занести в таблицу используя либо функцию Core.GetUserAllData, которая занесёт в таблицу все поля, либо функцию Core.GetUserData(tUser, nValueId), которая за один вызов будет заносит один параметр. Поэтому в птохе не оптимальная реализация, так как либо все параметры заноси в таблицу, либо делай несколько вызовов функции Core.GetUserData для занесения необходимых параметров, при этом 4 первоначальных поля в таблице также могут бестолку каждый раз заноситься в таблицу на каждом вызове того или иного события. В русхабе всё это реализовано функций Core.GetUser, которая является самым оптимальным вариантом, при сохранении всей возложенной не неё функциональности.


Изменение настроек хаба через lua, также попытаюсь реализовать в ближайшее время.

Совместить функции Core.SendToNick и Core.SendToUID - замечательная идея, так и сделаю. Наверное тогда стоит назвать функцию Core.SendToUser ?

Готов реализовать парсинг MyINFO, действительно наверное это было бы удобнее. Тут вопрос: парсить ли тэг, или парсить всё кроме тэга?

апи постепенно расширяется. Жду дельных идей.
Nickolya, Invisible
30.12.2009, 4:35 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.0.2

Fixed: Устранены причины падения при ошибках в скриптах и в некоторых api функция.

Параметр iMaxLevel - уровень лога событий. Для тестирования: 6 (логировать всё)
Nickolya, Invisible, ExC0tiC
29.12.2009, 22:44 Идея скрипта по отлову двойников
Во-первых, не кикает а разъединяет. Во-вторых, естественно при совпадении только обоих параметров. В-третьих, куда хочешь, туда и встраивай этот код.
TranceFM
28.12.2009, 22:58 RusHub
Кроссплатформенный консольный DC хаб
rushub v 2.0.0

Added: Реализован lua плагин (минимальный для работы lua функционал реализован). По средствам lua можно реализовать: регистрацию, баны и тд.
Для подключения lua плагина кладём файл lua.dll в папку plugins.

Lua библиотеки сторонних разработчиков (luasql и тд.) должны подключаться без каких либо перекомпиляций (ограничение только на формат COFF, то есть от птохи библиотеки не подходят, нужно качать отсюда: http://luaforge.net/projects/luasql/ ).

Работа продолжается...

Простенький скрипт приветствия: [attachment=3757:hello.lua]
Простенькая регистрация: [attachment=6513:registration.lua]
Nickolya, Invisible, ExC0tiC, Sekretchik, Saymon21, Mustik
27.12.2009, 14:22 Готовый Хаб
knuckles
23.12.2009, 17:29 Chathistory By Mutor
API2 | Переведен мною =)
За такую кривизну даже браться не хочется.


Не стал исправлять кривизну скрипта, однако подправил пару вещей:
Раскрывающийся текст
botname = "Последние 10 сообщений в чате" -- Имя бота
BadChars = {".","?","!","+","-",} --На какие префиксы скрипт не будет реагировать
maxhistory = 20 -- Максимум линий для чата в кеше
chatfile = "chathistory.dat"-- куда будут записываться логи чата

GetChat = "+история" -- Команда для показа последних сообщений; Например, +история 10 покажет последние 10 сообщений

-- Выбираем, для каких профилей будет доступна команда:
-- индекс профиля, история чата [0=нет 1=да], "Название профиля"
HistoryProfiles = {
[-1] = {0,"Незарегистрированные пользователи"},
[0] = {1,"Мастер"},
[1] = {1,"Оп"},
[2] = {1,"Вип"},
[3] = {1,"Зарегистрированные пользователи"},
}

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

function OnStartup()
if loadfile(chatfile) == nil then
chathistory = {}
local when = os.date(" %B %d %Y в: %X")
local chat = "Файл лога главного чата создан: "
table.insert(chathistory,when..chat)
local f,e = io.open( chatfile, "w+" )
f:write( "return {\n"..string.format("%q",chat..when)..",\n}" )
f:close()
end
chathistory = dofile(chatfile)
--frmHub:RegBot(botname)
end

function OnExit()
savehistory()
end

function UserConnected(user)
Core.GetUserAllData(user)
if HistoryProfiles[user.iProfile] and HistoryProfiles[user.iProfile][1] == 1 then
local n = #chathistory
local str = ""
for i = 1, n do str = str.."\r\n"..chathistory[i] end
Core.SendToNick(user.sNick,"<"..botname.."> "..str.."\r\n")
end
end

OpConnected = UserConnected

function ChatArrival(user,data)
Core.GetUserAllData(user)
local s,e,pre = string.find(data, "^%b<> (.)")
local s,e,cmd,lines = string.find(data, "^%b<>%s+(%S+)%s+(%d+)|$")
local when = os.date("[%H:%M] ")
local chat = string.sub(data, 1, -2)
if cmd and cmd == GetChat then
if lines ~= e then
GetChatLines(user, lines)
return true
else
Core.SendToNick(user.sNick,"<".."Пожалуйста.."> ".. укажите, сколько сообщений из лога главного чата вы хотите увидеть. Максимальное значение: "..maxhistory..".")
return true
end
else
for k,v in ipairs(BadChars) do
if pre == v then
return
end
end
table.insert(chathistory,when..chat)
if #chathistory > maxhistory then table.remove(chathistory, 1) end
savehistory()
end
end

function GetChatLines(user, linecount)
local n1 = #chathistory
local n2 = linecount
local n3 = n1 - (n2-1)
local str = ""
for i =n3,n1 do str = str.."\r\n"..chathistory[i] end
Core.SendPmToNick(user.sNick,botname,str.."\r\n")
end

function savehistory()
local f,e = io.open( chatfile, "w+" )
if f then
f:write("return {\n")
for i = 1, #chathistory do
f:write( "\t"..string.format("%q", chathistory[i])..",\r\n" )
end
f:write("}" )
f:close()
return 1
else
return nil
end
end
RegConnected = UserConnected
21.12.2009, 23:27 История чата
помогите
Под желания конкретного человека переделывать никто скрипты не станет. Так всем не угодишь.
Не нравится то, что есть, - либо не используй, либо учись корректировать скрипт под себя.
X-Sky
19.12.2009, 18:31 TimeToNewYear
API2 | Время до нового года
Кстати, что касается милисекунд, то меньше 100 мс бестолку ставить. Минимум это 100 мс именно такой минимальный интервал обработки таймеров в птохе
Nickolya, Invisible
16.12.2009, 15:29 С Новым Годом!
см название темы
Написано же с наступающим!
Uncle_Dif
15.12.2009, 23:23 RegmeEmail
API2 | Регистрация через e-mail
Сделал.

Пофиксил регулярное выражение для определения формата e-mail адреса (раньше не пропускало e-mail со знаком подчёркивания).
Для фикса качаем обновлённый файл email.lua
Saymon21
15.12.2009, 18:46 RegmeEmail
API2 | Регистрация через e-mail
luxemat:

local sFrom = "kirser@bk.ru" -- Адрес отправителя
local sServer = "smtp.bk.ru" -- Адрес сервера
local sUser = "kirser" -- Имя пользователя
local sPass = "*****" -- Пароль
local sHubAddress = "94.243.55.201:450" -- Адрес вашего хаба

Хабыч:
Для того, чтобы добавить команду, нужно в функцию OnStartup() добавить ещё одну функцию cmd.Add, вот так:

Код
function OnStartup()
  sBot = SetMan.GetString(21)
  sSubject = sSubject:gsub("%[HUBNAME%]", SetMan.GetString(0))
  email.SetValues(sFrom, sServer, sUser, sPass)
  cmd.Add("[Rr][Ee][Gg][Mm][Ee]", Regme, Protect)
  cmd.Add("[Рр][Ее][Гг][Ии][Сс][Тт][Рр][Аа][Цц][Ии][Яя]", Regme, Protect)
  if loadfile(sFile) then
    dofile(sFile)
  end
end


После этого регистрироваться можно будет как по команде !regme, так и по команде !регистрация
Собственно для этого и создавался модуль cmd.

Если не нужен верхний регистр, то можно просто добавить cmd.Add("регистрация", Regme, Protect), тогда регистрация будет срабатывать по команде !регистрация, но не будет срабатывать, например, по команде !РЕГИСРАЦИЯ или !рЕгИсТрАцИя
Короче говоря можно добавлять команды как регулярные выражения.
Wan, Saymon21, pol_91
15.12.2009, 16:21 RegmeEmail
API2 | Регистрация через e-mail
Код
function RegConnected(tUser)
  if tNoActivate[tUser.sNick] then
    tNoActivate[tUser.sNick] = nil
  end
  Core.SendToUser(tUser, "$UserCommand 1 3 Регистрация\\Сменить пароль$<%[mynick]> !passwd %[line:Введите новый пароль]&#124;")
end
OpConnected = RegConnected

function UserConnected(tUser)
  Core.SendToUser(tUser, "$UserCommand 1 3 Регистрация\\Зарегистрироваться$<%[mynick]> !regme %[line:Введите Ваш e-mail]&#124;")
end
Wan, Saymon21
15.12.2009, 14:36 RegmeEmail
API2 | Регистрация через e-mail
Название скрипта: RegmeEmail
Версия API: 2
Версия скрипта: 1.0
Автор: Setuper
Описание: Простенькая регистрация через e-mail. Команда для регистрации: !regme email@email.com
После отправки команды, у пользователя есть 10 минут для того, чтобы зайти в почту, посмотреть там пароль и зайти на хаб. В противном случае авторизация не произойдёт, и спустя 10 минут аккаунт удалится с хаба.

ВНИМАНИЕ! Для работы скрипта необходимы модули: cmd и email, а также необходима библиотека сокетов: http://mydc.ru/topic43.html
Модули и библиотеку сокетов следует поместить в папку libs.

Обо всех ошибках и просьбах писать сюда.

Необходимые модули:
[attachment=3615:cmd.lua][attachment=3626:email.lua]


Непосредственно сам скрипт:
[attachment=3625:regme_email.lua]
Nickolya, Goblin, Tsd, Invisible, valdis73, Saymon21, Stok, GULAM33
10.12.2009, 13:36 С Днюхой Тебя!
поздравления
Поздравляю!))
Invisible
9.12.2009, 17:00 Помогите
скрипты
ссылку кинул в лс.
Тему закрываю big_smile.gif
Nickolya
9.12.2009, 0:43 Нужен Скрип Регистрации
С запросом
Код
function ChatArrival(tUser)
  if tUser.iProfile == -1 then
    Core.SendToUser(tUser, "*Вы не можете писать в чат пока не зарегистрируетесь* Регистрация осуществляется администратором хаба ежедневно с 20:00 до 00:00")
    return true
  end
end
Master-Grow
8.12.2009, 1:55 Помогите со скриптом Pinger =)
У меня всё работает и пинг, и трассировка.

Кодировка OEM. Если бы использовалась английская версия винды, то всё нормально бы отображалось)))

Пользователи могут долго трассироваться, тем более, что трассировка может содержать до 30 шагов

Скрипт с перекодировкой OEM в ANSI: [attachment=3575:ping.lua]
Invisible, TiGRpp
7.12.2009, 21:11 Помогите со скриптом Pinger =)
см. файл ниже
Invisible
7.12.2009, 17:53 Предложения для развития
Ага. Реализация функционала операторов не будет привязываться к ключикам))) То есть все настройки зависят только от профиля, но никак не от какого-то атрибута профиля.
FallenAngel
6.12.2009, 1:00 Нужен скрипт скрывающий ботов
Бот скрывающий ботов
Это просто немыслимо использовать такой-то скрипт, который скрывает ботов скриптов)))))

Просто в скриптах нужно найти и удалить функцию Core.RegBot
PRIZrak, Pro009
3.12.2009, 19:27 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Найди отличия между твоим кодом и вот этим:
Код
function UserConnected(tUser)
  Core.SendToUser(tUser,"$UserCommand 1 3 »»» Информация\\Правила хаба$<%[mynick]> !rules&#124;|"..
  "$UserCommand 1 3 »»» Информация\\Друзья хаба$<%[mynick]> !friends&#124;|"..
  "$UserCommand 1 3 »»» Информация\\Адреса хаба$<%[mynick]> !adress&#124;|"..
  "$UserCommand 1 3 »»» Информация\\инфа тут например$<%[mynick]> !команда&#124;|")
end
RegConnected,OpConnected=UserConnected,UserConnected

Смотри очень внимательно.

И слово адрес по английски пишется с удвоенной буквой d: address
random name
30.11.2009, 22:49 Сброс соединения если много Core.Send*
PtokaX 0.4.1.1 \ Debian 5
В плане кода, я посмотрел, там вот как:
если размер буфера отправки начинает превышать некое пороговое значение, и при этом отключена настройка "Keep slow users online", тогда хаб отключает пользователя с переполненным буфером отправки. Если же при данном переполнении включена указанная настройка, то хаб отделяет от буфера несколько первых команд и отсылает пользователю только их, а остальные команды оставляет в буфере и отправляет в следующей партии.
Nickolya
27.11.2009, 3:04 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Выходов из данной ситуации 2:
1)
Код
local sss = "%%%%%%%%'\""
sss = (sss:gsub("%%", "%%%%").."%s%s"):dbformat("1%%", "2%%%%")
Core.SendToAll("sss:dbformat = "..sss.."    len = "..sss:len())


2)
Код
local sss = "%%%%%%%%%%%%%%%%'\"%s%s"
sss = sss:dbformat("1%%", "2%%%%")
Core.SendToAll("sss:dbformat = "..sss.."    len = "..sss:len())


То есть либо до вставки строки в метод формат удваивать проценты, либо самому формировать строку с удвоенными процентами.

Лучше наверное второй способ. Ведь как правило запросы мы сами определяем в программе, и они как правило постоянные.
Если же запросы определяются только в процессе (динамически), то первый способ спасёт))

Как правило в запросах у нас вообще нету процентов:
Код
("INSERT INTO `table` VALUES ('%s', '%s', '%s')"):dbformat(a, b, c)


Вообще-то, написанный пример не очень подходит для использования метода dbformat. Думаю для примера нужно так написать:
Код
local sss = "qwerty%s%s"
local a, b = "\\%%%", "\"\\'"
sss = sss:dbformat(a, b)
Core.SendToAll("sss:dbformat = "..sss.."    len = "..sss:len())
Ведь мы экранируем символы в параметрах (a, b), а не в самом запросе. В запросе нам всё известно, поэтому мы там пишем всегда всё корректно, а вот в параметрах может быть всё, что угодно.

Возможно я до конца не понял суть проблемы, но на данный момент (после написания поста) у меня сложилось впечатление, что проблемы как таковой и нету. Или всё же есть? Давайте расставим все точки над и big_smile.gif
Nickolya
26.11.2009, 23:50 Mysql
win32 - API 2 | Самая распространённая база данных
В очередной раз затрагиваю тему экранирования в mysql.

Символы, которые обязательно должны экранироваться: ' " \
Символы, которые могут экранироваться в LIKE запросе: % _ \ (при этом символ \ должен экранироваться так: \\\\)
Прочие экранированные символы в sql формате:
\0 - символ 0 (NUL) в ASCII коде;
\b - возврат на один символ;
\n - символ новой строки (перевода строки);
\r - символ перевода каретки;
\t - символ табуляции;
\z - символ (Control-Z) таблицы ASCII(26). Данный символ можно закодировать, чтобы обойти проблему, заключающуюся в том, что под Windows ASCII(26) означает конец файла (проблемы возникают при использовании ASCII(26) в выражении mysql database < filename).


Дабы скрипты никогда не падали из-за случайно некорректных запросов, модифицируем ранее описанный мною метод dbformat:
Код
string.dbformat = function(self, ...)
  local t = {...}
  for k, v in ipairs(t) do
    t[k] = tostring(v):gsub("(['\\\"])", "\\%1")
  end
  return self:format(unpack(t))
end



Кроме этого, для запросов типа LIKE, кроме метода dbformat, нужно будет применить ещё один метод:
Код
string.dblikeformat = function(self, ...)
  local t = {...}
  for k, v in ipairs(t) do
    t[k] = tostring(v):gsub("([%%\\_])", "\\%1")
  end
  return self:format(unpack(t))
end
Nickolya, Serx, Accelerator, Saymon21
22.11.2009, 21:38 Hub's Big Ass Bot
API2 | HUBBABOT v.2.28
Контекстное меню хаба)))
NeRvIk
22.11.2009, 1:34 Проблема с запрещенными символами.
Это никак нельзя исправить. Некоторые из запрещённых символов в нике запрещены протоколом, другие запрещены по другим соображениям, например из-за хранения ников в xml файле, или для возможности создать файл или папку с именем того или иного пользователя. Конечно, можно использовать всякие там эскейп последовательности для экранирования того или иного символа, или использовать коды символов для их отображения, однако, как сделано, так сделано, и это наиболее простой и оптимальный выход из ситуации, который нельзя никак изменить, разве что залезть в исходные коды.

Запрещённые символы в нике для PtokaX: $|<>:?*"/\ и пробел.
TYF
19.11.2009, 14:41 Сжатие Zlib
Сжатие с помощью zlib после команды $ZOn
Enyby
16.11.2009, 14:09 Ptokax Win Gui
Руководство по установке и настройке
Настройки - Дополнительно - Моя информация
Строка описания, строка тэга, строка соединения строка e-mail. Всем юзерам.
thehawk
15.11.2009, 18:49 Luasocket
win32 | Работа с сокетами
Интересно что и куда ты переписываешь?

Выложенные тут библиотеки работают только под виндой.
Под юниксы нужно самому собирать сошки из исходников:[attachment=3505:luasocket_2.0.2.tar.gz]
dj_crazy_joker
13.11.2009, 13:05 ShowTopic
API2 | Показ топика в чате
Условие
Код
if cmd and (cmd == cmdTop) then
было написано правильно. Оно предостерегает от попытки сравнить cmdTop с nil, так как пользователь может отправить, например, пустую строку в чат, и тогда регулярное выражение ничего не захватит.

Что касается установки топика, то нужно писать SetMan.GetString(10, "новый топик").

Код:
Код
Core.SendToAll(Data)
Core.SendToAll("<"..Bot.."> Топик хаба: "..SetMan.GetString(10).."")

лучше писать в одну функцию:
Код
Core.SendToAll(Data.."|<"..Bot.."> Топик хаба: "..SetMan.GetString(10))


И конечно же нужно избавляться от очень дурной привычки добавлять конкатенацию с пустой строкой! Не знаю от кого она пошла, но она очень вредная.
X-Sky
6.11.2009, 20:19 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Код
function OnStartup()
  Core.SendToAll(ScriptMan.GetScript().sName)
end


Нельзя вызывать функцию, которая возвращает информацию о самом скрипте, до выполнения функции, инициализирующей этот самый скрипт !!!
Jaska
1.11.2009, 12:44 Перевод Hexhub 5.03a
Нужны тестеры
По протоколу NMDC результаты поиска при пассивном поиске проходят через хаб, при активном поиске не через хаб, а напрямую.
valdis73
30.10.2009, 14:55 Как зашитится от спам бота
помогите спамят
как вариант: http://mydc.ru/topic1898.html
KamoK
29.10.2009, 23:55 PingerWatch
API2
вместо условия
Код
if x then

напиши условие
Код
if x and Pingers[x] then
Артём, мамин_парень
27.10.2009, 16:23 Защита от DDoS атак
Защита в первую очередь
DDOS атаки бывают разными. Никогда нет 100% защиты от них.

На уровне скриптов вообще практически ничего сделать нельзя. Единственная защита на уровне скриптов - это антифлуд.

Методы борьбы с DDOS:
  1. Отключение ответов на ICMP запросы (пинги). Реализуется, например, при помощи файрвола.
  2. Увеличение очереди "полуоткрытых" TCP-соединений.
  3. Уменьшение времени удержания "полуоткрытых" соединений.
  4. Включение механизма TCP syncookies.
  5. Ограничение максимального числа "полуоткрытых" соединений с одного IP к конкретному порту.
  6. Установка лимита на количество соединений в единицу времени к DNS-серверу на стороне шлюза.


Nickolya, shur49
23.10.2009, 17:10 Скачивание файл-листа, nmdc
Последовательность команд
Последовательность такая:

Активное соединение:
Код
Клиент1 -> Хаб: $ConnectToMe Ник2 ip1:port1|
Хаб -> Клиент2: $ConnectToMe Ник2 ip1:port1|
Клиент2 -> Клиент1: $MyNick Ник2|
Клиент1 -> Клиент2: $MyNick Ник1|$Lock ...|
Клиент2 -> Клиент1: $Lock ...|
Клиент1 -> Клиент2: $Supports ...|$Direction Download Number1|$Key ...|
Клиент2 -> Клиент1: $Supports ...|$Direction Upload Number2|$Key ...|
Клиент1 -> Клиент2: $ADCGET ...|
Клиент2 -> Клиент1: $ADCSND ...|


Пассивное соединение:
Код
Клиент1 -> Хаб: $RevConnectToMe Ник1 Ник2|
Хаб -> Клиент2: $RevConnectToMe Ник1 Ник2|
Клиент2 -> Хаб: $ConnectToMe Ник1 ip2:port2|
Хаб -> Клиент1: $ConnectToMe Ник1 ip2:port2|
Клиент1 -> Клиент2: $MyNick Ник1|
Клиент2 -> Клиент1: $MyNick Ник2|$Lock ...|
Клиент1 -> Клиент2: $Lock ...|
Клиент2 -> Клиент1: $Supports ...|$Direction Download Number2|$Key ...|
Клиент1 -> Клиент2: $Supports ...|$Direction Upload Number1|$Key ...|$ADCGET ...|
Клиент2 -> Клиент1: $ADCSND ...|


Номерами помечены параметры, которые относятся к соответствующим клиентам.
Вместо команд $ADCGET и $ADCSND могут использоваться команды $Get и $Send. Всё зависит от поддерживаемых клиентами характеристик, которыми они обмениваются при помощи команды $Supports.

Подробнее о каждой команде читай тут: http://mydc.ru/index.html?showtopic=915
Saymon21
19.10.2009, 18:22 Скрипт смены группы пользователей
1. Закрываешь хаб.
2. Открываешь файл cfg/RegistredUsers.xml
3. Жмёшь Ctrl-H.
4. Заменяешь <Profile>2</Profile> на <Profile>3</Profile>
5. Запускаешь хаб.
19.10.2009, 12:13 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Нет. Не так. В простых случаях нужно использовать конкатенацию:
Код
local s = "блабла"..MoreBla()

В сложных случаях - метод format.

Рассмотрим случай:
Код
local s = "блабла"..MoreBla()

Итак, как работает конкатенация? Память выделяется под строку "блабла" и под результат функции MoreBla(). Эти значения будут занимать 2 ячейки в lua стеке. После конкатенации по адресу "блабла" запишется результат конкатенации, по во второй же ячейке стека останется мусор.
Если же к этому случаю мы применим метод формат: local s = ("блабла%s"):format(MoreBla()), то произойдёт следующее: сначала в стек отправится сам метод format, потом отправится первый его аргумент, то есть строка "блабла%s", потом отправится второй аргумент, то есть MoreBla(). После выполнения метода, результат выполнения запишется на верх стека. То есть стек будет выглядеть так: 1: "блаблаBLABLABLA", 2: "блабла%s", 3: "BLABLABLA". Получили, что глубина стека равна 3. В случае конкатенации глубина стека у нас была равна 2. (1: "блаблаBLABLABLA", 2: "BLABLABLA"). Поэтому при простой конкатенации метод формат проигрывает, так как выделяет больше памяти.

Рассмотрим случай:
Код
local a = 123
local b = 456
local s1 = "блабла"..a..b
local s2 = ("блабла%s%s"):format(a, b)


1) Содержимое стека при конкатенации: 1: "блабла", 2: "123", 3: "456"
2) Содержимое стека при формате: 1: FUNC, 2: "блабла%s%s", 3: "123", 4: "456"

Опять имеем проигрыш.

Случай:
Код
local a = 123
local b = 456
local s1 = "блабла"..a.."hihi"..b
local s2 = ("блабла%shihi%s"):format(a, b)


Тут я выписывать содержимое стека не буду, но скажу, что тут конкатенация и метод формат идентичны. Однако, дабы не делать лишний вызов, использовать лучше конкатенацию.

Ещё один пример:
Код
local a = 123
local b = 456
local s1 = "блабла"..a.."hihi"..b.."qwerty"
local s2 = ("блабла%shihi%sqwerty"):format(a, b)


Тут уже выигрывает метод формат.

Делаем вывод: метод формат выгодно использовать при конкатенации трёх и более временных строк (Временные строки: "блабла", "hihi", "qwerty")!


Вообще говоря, метод format - это урезанный аналог сишной функции sprintf (http://ru.wikipedia.org/wiki/Printf). Почему урезанный? Да потому, что форматы данных в lua не столь разнообразны как в СИ.
district
18.10.2009, 19:48 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Можно.
Это называется оптимизацией глобальных переменных. Почему переменных? Потому что в lua функция - это тип переменной. То есть переменной мы можем присвоить как строку или таблицу так и функцию. Например:
Код
local p = "str" -- инициализация переменной с присвоением ей строки
p = {} -- присвоение таблицы
p = 5 -- присвоение числа
p = function() return "fff" end -- присвоение функции


Например, у нас есть глобальная функция MyFunc, которая объявлена в файле 1.lua. Мы её вызываем из файла 2.lua.
В самом начале файла 2.lua мы прописываем строку
Код
local _G = _G
после этого вызываем нашу функцию, которая уже будет локальной:
Код
_G.MyFunc
Тут код local _G = _G означает создание локальный ссылки на глобальную таблицу глобального окружения. Переменная является локальной ссылкой на уже существующие данные.

Вообще говоря таким способом следует оптимизировать и такие функции:

Код
local tbl_maxn = table.maxn
local tbl_insert = table.insert
local math_sin = math.sin
local os_date = os.date
local os_execute = os.execute


и так далее... И вызываем уже, например, функцию tbl_insert(tTable, 5), а не table.insert(tTable, 5), как мы это обычно делаем.

Однако, например string.find таким образом оптимизировать не стоит, так как можно просто воспользоваться уже локальным методом: ("строка"):find(...). Метод уже локален. Единственную функцию из таблицы string, которую нужно оптимизировать это функцию string.char, так как к ней нельзя применить локальный метод.

Кстати говоря, функцию MyFunc можно оптимизировать и так:
Код
local MyFunc = _G.MyFunc
и именно эта оптимизация является максимальной, а не та, что рассмотрена в начале поста. Однако, оптимизировать таким образом каждую глобальную функцию слишком нудно, да и код сильно возрастает при большом количестве функций, поэтому обычно делают так как я описал в начале поста.
district
18.10.2009, 17:56 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Локальные функции и переменные используются для экономии памяти. Память освобождается после использования.
Говорить о том эффективно ли использовать локальную функцию, вообще говоря не корректно. Под разные задачи разное использование. Однако именно в языке lua обращение к локальным переменным и функциям происходит быстрее, чем к глобальным. Поэтому там, где это возможно, следует использовать локальные переменные.

Использовать оператор вместо функции всегда преимущественно. Поэтому ответ на второй вопрос: x%y.
district
16.10.2009, 18:12 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Код
Действия \\

лишний пробел!
Код
Действия\\
Gate001
14.10.2009, 11:29 У вас нет прав на просмотр этой темы
У вас нет прав на просмотр этого сообщения
district
8.10.2009, 20:28 Greeting_in_OpChat
API2 | Пришёл/ушёл для администрации в ОпЧате
Функцию Core.GetUserAllData(tUser) так и не убрал.

Могу сказать одно, разработчики хаба пытались снизить затраты на выполнения скриптов, однако, на мой взгляд, до конца не снизили их, и оставили в таблице часто используемые поля: sNick, sIP, iProfile, хотя для наилучшей оптимизации программист в скрипте сам должен выбирать какие необходимые поля должна содержать таблица.

Думаю должно быть так:
Код
local sOpChat = "[Chat]OpChat"
local tInMessages = {
  [0] = "Пришёл админ",
  [1] = "Пришёл оператор",
}

function UserConnected(tUser)
  if tInMessages[tUser.iProfile] then
    Core.SendPmToOps(sOpChat, ("%s %s;)"):format(tInMessages[tUser.iProfile], tUser.sNick))
  end
end

local tOutMessages = {
  [0] = "Ушёл админ",
  [1] = "Ушёл оператор",
}

function UserDisconnected(tUser)
  if tOutMessages[tUser.iProfile] then
    Core.SendPmToOps(sOpChat, ("%s %s;)"):format(tOutMessages[tUser.iProfile], tUser.sNick))
  end
end

OpConnected, RegConnected = UserConnected, UserConnected
OpDisconnected, RegDisconnected = UserDisconnected, UserDisconnected
X-Sky
8.10.2009, 18:53 Greeting_in_OpChat
API2 | Пришёл/ушёл для администрации в ОпЧате
Если придерживаешься Венгерской нотации, то переменные нужно писать соответствующим образом: sOpChat, tInMessages, tOutMessages

Интересно из какого скрипта пошла такая петрушка с обрамлением переменной пустыми строками: ""..OpChat.."" ?
Ведь тут не только 2 лишние конкатенации, но и пустые строки "" будут каждый раз выделять под себя память.
X-Sky
8.10.2009, 18:52 Greeting_in_OpChat
API2 | Пришёл/ушёл для администрации в ОпЧате
Когда пишешь скрипт, нужно понимать за что отвечает каждая функция. Нужно писать скрипты как можно более оптимизированными.
Функция Core.GetUserAllData(tUser) бестолку вызывается, при этом нагружая хаб не столько из-за вызова, сколько из-за занесения данных в таблицу tUser.

Переменные sInMes и sOutMes следует сделать локальными, а не глобальными.

Переменные OpChat, sInMessages и sOutMessages также следует снабдить словом local, так как локальные переменные вызываются быстрее, чем глобальные.
X-Sky, Unique
2.10.2009, 16:44 Репорты об ошибках старых версий
архив темы ошибок текущей версии хаба
Нет. Просто хаб скидывал часть народу big_smile.gif
Это исправлено и теперь я надеюсь будет всё ок и без вылетов.

Если вылетов не будет, то вплотную займусь доделыванием lua плагина big_smile.gif
zip2002
1.10.2009, 18:37 RusHub
Кроссплатформенный консольный DC хаб
rushub v 1.0.5c [beta]

Fixed: Исправлены падения, однако они ещё не исключены.
Nickolya, Invisible, ExC0tiC
26.9.2009, 20:08 RusHub
Кроссплатформенный консольный DC хаб
rushub v 1.0.5

Fixed: Увеличено максимальное число сокетов.
Nickolya, Invisible
25.9.2009, 23:18 Женюсь
Мои поздравления big_smile.gif
Дерево ещё не сажал?))
Otshelnik-Fm
16.9.2009, 20:06 RusHub
Кроссплатформенный консольный DC хаб
rushub v 1.0.4

Added: Включены логи действий хаба.
Added: Добавлена характеристика UserIP2.
Nickolya, Invisible, ExC0tiC
14.9.2009, 16:18 TEST
Тут скорее тестирование тэгов. Страницы не при чём big_smile.gif
LaLa
12.9.2009, 23:16 Не пускает другие версии DC++
Конечно есть. Но для этого нужно в файле ClientTags.xml перечислить клиенты, которые разрешены и в настройках установить запрет входа без тэга (если хаб не находит такой тэг в файле ClientTags.xml, то тэг не отделяется от описания и получается что клиент без тэга)
Delion
11.9.2009, 15:57 RusHub
Кроссплатформенный консольный DC хаб
rushub v 1.0.3 [beta]

Fixed: Исправлен баг с удалением пользователя с хаба, и добавлены следующие настройки:

sUnregNickPrefix - обязательный префикс для незарегистрированных
sNickChars - символы, которые разрешается использовать в нике
bHubTopicAfterMotd - посылать хаб-топик после MOTD
bCheckSRNick - проверять ник в $SR команде
iMinLimitSlotsRatio - минимально доступное отношение лимит/слоты
iMaxHubsSlotsRatio - максимально доступное отношение хабы/слоты
iMinDLLimit - минимально доступное ограничение скорости
iMaxSlots - максимальное число слотов
iMinSlots - минимальное число слотов
iMaxHubs - максимальное число хабов
iMinNickLen - минимальная длина ника
iMaxNickLen - максимальная длина ника

Для появления новых настроек нужно удалить старые файлы hub_config и lang_config
Nickolya, Invisible, ExC0tiC
8.9.2009, 17:01 SetMan.GetString
В мануалах есть абсолютно всё что нужно, и то, что ты написал в том числе.


Выдержка из scripting-interface.txt:
Цитата
Setting string IDs for SetMan.(G/S)etString (| is not allowed in all strings, if max length is not specified then is max 4096)
-------------------
0 - Hub name. Min length 1, max 256.
1 - Admin nick. Min length 1, max 64, $ is not allowed.
2 - Hub address. Min length 1, max 256.
3 - TCP ports. Min length 1, max 64.
4 - UDP port. Min length 1, max 5.
5 - Hub description. Max length 256.
6 - Main redirect address. Max length 256.
7 - Hublist register servers. Max length 1024.
8 - Registered users only message. Min length 1, max 256.
9 - Registered users only redirect address. Max length 256.
10 - Hub topic. Max length 256.
11 - Share limit message. Min length 1, max 256. Use %[min] for min share size and %[max] for max share size.
12 - Share limit redirect address. Max length 256.
13 - Slot limit message. Min length 1, max 256. Use %[min] for min slots and %[max] for max slots.
14 - Slot limit redirect address. Max length 256.
15 - Hub/slot ratio limit message. Min length 1, max 256. Use %[hubs] for hubs and %[slots] for slots.
16 - Hub/slot ratio limit redirect address. Max length 256.
17 - Max hubs limit message. Min length 1, max 256. Use %[hubs] for max hubs.
18 - Max hubs limit redirect address. Max length 256.
19 - No tag rule message. Min length 1, max 256.
20 - No tag rule redirect address. Max length 256.
21 - Hub bot nick. Min length 1, max 64, $ and space is not allowed.
22 - Hub bot description. Max length 64, $ is not allowed.
23 - Hub bot email. Max length 64, $ is not allowed.
24 - OpChat bot nick. Min length 1, max 64, $ and space is not allowed.
25 - OpChat bot description. Max length 64, $ is not allowed.
26 - OpChat bot email. Max length 64, $ is not allowed.
27 - Temp ban redirect address. Max length 256.
28 - Perm ban redirect address. Max length 256.
29 - Chat commands prefixes. Min length 1, max 5.
30 - Hub owner email. Max length 64.
31 - Nick limit message. Min length 1, max 256. Use %[min] for min length and %[max] for max length.
32 - Nick limit redirect address. Max length 256.
33 - Additional message to ban message. Max lenght 256.
34 - Language. When language is default then return nil.
Invisible
8.9.2009, 12:31 SetMan.GetString
Invisible
8.9.2009, 10:39 Предложения для развития
Цитата(Alexey @ 8.9.2009, 4:43) *
Хотелось-бы отправлять хабтопик после мотд, а не до.

А есть большая разница? Конечно можно сделать настройку.


Баны сейчас первостепенная задача, и в то же время большая, так как для того, чтобы сделать баны, нужно сделать права пользователям, то есть профили пользователей, и, соответственно, отсюда и регистрацию нужно реализовать. Я буду на этим работать big_smile.gif
Drakula, Sekretchik
7.9.2009, 20:57 RusHub
Кроссплатформенный консольный DC хаб
rushub v 1.0.2

Added: Сделаны основные настройки хаба. Они хранятся в файле.
Файлы настроек появляются после первого запуска хаба
Nickolya, Jaska, Invisible, mariner, ExC0tiC
6.9.2009, 22:12 Метод Быстрого Перевода Скриптов Под API_1
Самостоятельный быстрый перевод из API_2 ---> в API_1
Я добавил проверку и перезалил файл old_api.
Попробуй.
Invisible, thehawk
6.9.2009, 1:41 RusHub
Кроссплатформенный консольный DC хаб
rushub v 1.0.1

Added: Сделан поиск и некоторые проверки.
Nickolya, Invisible, ExC0tiC
3.9.2009, 16:40 Leviathan
API2
Если вы ничего не меняли в скрипте, то делаем следующее:
Открываем файл: LV_4.1FINAL/LV_DataBase/lua/Commands.lua

И ищем строку:
Код
disp = disp.."\tМинимальная шара: "..FriendlyTable[v][1]..""..FriendlyTable[v][2].."\tАдресс: "..FriendlyTable[v][3].."\tИмя Хаба: "..v.."\r\n"


У меня эта строка № 3023.

И меняем эту строку на:
Код
disp = disp.."\tМинимальная шара: "..FriendlyTable[v][1]..""..FriendlyTable[v][2].."\tАдресс: "..FriendlyTable[v][3].." \tИмя Хаба: "..v.."\r\n"
то есть добавляем пробел после адреса.
EdeN, nikolos
31.8.2009, 19:28 Скрипты
Ну это всё зависит от того, какие скрипты, и что они делают или не делают при входе.
А вообще, любой скрипт грузит хаб, и чем их больше, тем больше загружен хаб, и это может также аукнуться при входе.
ozonek
31.8.2009, 12:17 Leviathan
API2
Пробел впаять после порта
DriverZX-10
30.8.2009, 23:57 LFS
win32 - API 2 | Библиотека файловой системы
Данную библиотеку нужно скопировать либо в папку с ptokax.exe, либо в папку libs
А вставлять нужно в начале скрипта, который нуждается в этой библиотеке.

По поводу PXControl следует задавать вопросы в соответствующей теме!
Invisible, DriverZX-10
28.8.2009, 21:12 Соедиенение Пользователей Инет + Локальная Сеть
Как соединить с лок. адреса с включ. VPN с юзерами из инета?
Ищи на форуме скрипт разделения сетей
Noal
28.8.2009, 13:37 RusHub
Кроссплатформенный консольный DC хаб
Название: RusHub
Текущая версия: 2.3.10
Платформы: Windows (XP/Vista/7), GNU Linux, FreeBSD, Mac OS X, Solaris
Разрядность: 32, 64
Лицензия: GPL v3
Основан на: verlihub
SourceForge: RusHub Source Forge Page
GoogleCode: RusHub Google Code Page
Официальный сайт: RusHub.org

Полная поддержка и использование протокола NMDC.
Хаб поддерживает работу с ipv6.
Хаб поддерживает ADC протокол (тестирование).
Хаб постоянно совершенствуется и развивается.


Описание настроек хаба
sAddresses - адреса хаба (указываются через пробел)
bAdcOn - включить режим работы хаба по протоколу ADC
sHubName - имя хаба
sTopic - топик хаба (приписка к имени хаба)
sHubBot - ник основного бота хаба.
sLocale - языковая локаль. По умолчанию устанавливается локаль системы (для России устанавливаем Russian_Russia.1251)
bSendUserIp - отсылать ip адреса пользователей, то есть использовать ли характеристики UserIP и UserIP2 (1 - да, 0 - нет).
bDelayedMyINFO - отсылать команды $MyINFO и $Quit с задержкой. Из-за отсутствия пока задержки входа рекомендуется установить этот параметр в 0.
bCheckSRNick - проверять ник в $SR команде.
bCheckRctmNick - проверять ли ник в RCTM команде (1 - проверять, 0 - не проверять).
bCheckCTMIp - проверять ip в CTM команде
bCheckSearchIp - проверять ip при активном поиске
bDelayedLogin - записывать пользователя только после полной отсылки ему списка всех пользователей (на больших хабах список всех пользователей может не отправиться за один раз, поэтому для таких хабов рекомендуется включить эту опцию).
bNicklistOnLogin - при входе на хаб отправлять список всех пользователей во время записи пользователя, а не по команде $GetNickList.
iTimeoutAny - время на получение от пользователя какой-либо команды (таймаут соединения)
iTimeoutLogon - максимальное время входа на хаб (в сек.).
iMaxPassiveRes - количество возвращаемых хабом результатов при пассивном поиске.
iTimerConnPeriod - период таймера соединения в мсек. (системная настройка, не рекомендуется изменять).
iTimerServPeriod - период таймера сервера в мсек. (системная настройка, не рекомендуется изменять).
iStepDelay - задержка в мсек на каждом цикле (системная настройка, не рекомендуется изменять).
iStrSizeMax - максимальная длина команды, отправленной на хаб пользователем.
iStartPing - время начала пинга пользователя в сек (отсчитывается от момента входа на хаб).
iPingInterval - период, через который пингуется пользователь.
iMaxLevel - уровень логирования событий хаба (от 0 до 6). По умолчанию 0 - не логировать события.
iMaxErrLevel - уровень логирования ошибок хаба (от 0 до 2). По умолчанию 2 - логировать все ошибки.
iSysLoading - коэффициент загруженности системы (системная настройка, не рекомендуется изменять).
iMaxNickLen - максимальная длина ника (проверяется только у пользователей с профилем -1).
iMinNickLen - минимальная длина ника (проверяется только у пользователей с профилем -1).
bDisableNoDCCmd - запретить использование команд, которые не относятся к NMDC командам (не начинаются со знака $, за исключением команды пинга и команды чата).
iFloodTime... и iFloodCount... - параметры флуда (количество iFloodCount за время iFloodTime (в сек.))
bRegMainBot - регистрировать основного бота.
bMainBotKey - ключ у основного бота.
sMainBotMyINFO - MyINFO основного бота.
sMainBotIP - ip основного бота.
bWebServer - включить веб-сервер (по умолчанию отключен).
sWebAddresses - адреса веб сервера (указываются через пробел). Через ; можно указывать порт.
iWebTimeout - тайм-аут соединения с веб сервером (в сек.). Время бездействия, по истечению которого веб-сервер закрывает соединение с клиентом.
iWebStrSizeMax - максимальный размер сообщения отсылаемого клиентом.
bMAC - включить определение MAC адреса (по умолчанию отключено).
iUsersLimit - глобальное ограничение числа пользователей (по умолчанию -1 - проверка отключена)
bUDPServer - включить udp сервер (1 - включить, 0 - отключить)
sUDPAddresses - udp адреса хаба
sMainPath - основная директория хаба
sPluginPath - директория плагинов
sLogPath - директория логов
sLangPath - директория языковых настроек
sLang - текущая языковая настройка (имя файла без расширения)
iMaxSendSize - настройка, отвечающая за максимальный размер буфера отсылки (по умолчанию 2818047). При превышении этого размера пользователь отключается от хаба.

Lua plugin:
LUA API события

UID - идентификатор пользователя, который отослал команду.
UID представляет из себя указатель на реальную структуру соединения пользователя (type(UID) = "userdata"). Введён с целью оптимизации выбора пользователя без нагрузки lua стека.

OnStartup()
Описание: Функция выполняется при старте скрипта.
Возвращаемое значение: любое



OnExit()
Описание: Функция выполняется при остановке скрипта
Возвращаемое значение: любое



OnError(sErrMsg)
Описание: Функция выполняется при ошибке в скрипте
Возвращаемое значение: true или 1 - не останавливать скрипт при ошибке во время выполнения
Исключения составляют таймерные функции, которые останавливают скрипт при ошибке, дабы не загружать систему и не прийти к переполнению лога



OnScriptError(sScriptName, sErrMsg, bStoped)
Описание: Функция выполняется при возникновении ошибки в скрипте sScriptName. sErrMsg - сообщение с ошибкой. Флаг bStoped равен true если скрипт, в котором возникла ошибка, был остановлен, в противном случае флаг bStoped равен false.
Функция не вызывается для текущего скрипта. Для отслеживания ошибок в текущем скрипте нужно использовать функцию OnError(sErrMsg).
Напомню, что по умолчанию скрипт отключается при ошибке, отключение скрипта можно предотвратить возвратом true в функции OnError этого скрипта.
Возвращаемое значение: true или 1 - не вызывать это событие в ниже стоящих скриптах (т.е. прекращение действия события).



OnScriptStart(sScriptName)
Описание: Функция выполняется при старте скрипта sScriptName.
Возвращаемое значение: true или 1 - не вызывать это событие в ниже стоящих скриптах (т.е. прекращение действия события).



OnScriptStop(sScriptName)
Описание: Функция выполняется при остановке скрипта sScriptName.
Возвращаемое значение: true или 1 - не вызывать это событие в ниже стоящих скриптах (т.е. прекращение действия события).



OnUserConnected(UID)
Описание: Функция выполняется при входе пользователя.
Функция выполняется после отправки пользователю первичной команды $Lock и до любого другого действия на хабе.
На данном этапе определён только IP адрес, порт и мак пользователя.
Возвращаемое значение: true или 1 - не отправлять при входе надпись: "Этот хаб работает под управлением..."



OnUserDisconnected(UID)
Описание: Функция выполняется после закрытия соедиения с пользователем.
Функция является последней функцией перед окончательным удалением соединения.
На данном этапе определён только IP адрес, порт и мак пользователя, все остальные данные уже удалены.
Возвращаемое значение: любое



OnUserEnter(UID)
Описание: Функция выполняется при окончательном входе пользователя, после добавления пользователя в списки.
Функция является последним этапом входа на хаб.
Возвращаемое значение: любое


OnUserExit(UID)
Описание: Функция выполняется при выходе пользователя, перед удаление пользователя из списков.
Функция является первым этапом выхода.
Возвращаемое значение: любое



OnSupports(UID, sData)
Описание: Функция выполняется при обмене характеристиками между клиентом и сервером.
Функция не будет выполняться, если клиент не поддерживает никаких дополнений и характеристик.
Возвращаемое значение: true или 1 - не отправлять характеристики хаба клиенту.



OnKey(UID, sData)
Описание: Функция выполняется при получении ключа от клиента.
Возвращаемое значение: true или 1 - проверять ключ.



OnValidateNick(UID, sData)
Описание: Функция выполняется после проверки ника и до проверки необходимости пароля. Ник пользователя уже определён.
Возвращаемое значение: true или 1 - отправить запрос на получение пароля.
Позволяет проводить регистрацию по средствам скриптов.



OnMyPass(UID, sData)
Описание: Функция выполняется после поступления на хаб пароля от пользователя.
Возвращаемое значение: true или 1 - вход оператора (отправка команды $LogedIn).



OnVersion(UID, sData)
Описание: Функция выполняется после поступления на хаб версии протокола.
Возвращаемое значение: true или 1 - проверять равенство версии 1,0091.



OnGetNickList(UID, sData)
Описание: Функция выполняется до отсылки списка пользователей.
Возвращаемое значение: true или 1 - не отсылать список.



OnMyINFO(UID, sData)
Описание: Функция выполняется при отправке на хаб MyINFO строки.
Функция выполняется после всех проверок параметров и до рассылки всем пользователям.
Возвращаемое значение (игнорируется при первой отправке, а работает только при последующих):
1) return false, return nil, return 0 - безусловное выполнение события
2) return true, return 1 - блокировка события
3) return 2 - выполнеие события и блокировка после обхода всех скриптов
4) return 3 - выполнение публичного события для всех соединений, кроме соединения, породившего это событие
5) return 4 - выполнение публичного события для всех соединений, кроме соединений, имеющих такой же ip адрес, что и соединение, породившее это событие
Примечание: Возвращаемое значение игнорируется при первой отправке на хаб MyINFO строки, так как в случае блокировки события пользователь будет скрыт (возможно эту политику следует пересмотреть (опустить) в дальнейшем).


OnChat(UID, sData)
Описание: Функция выполняется при отправке в чат сообщения пользователем.
Функция выполняется после всех проверок и до отправки.
Возвращаемое значение:
1) return false, return nil, return 0 - безусловное выполнение события
2) return true, return 1 - блокировка события
3) return 2 - выполнеие события и блокировка после обхода всех скриптов
4) return 3 - выполнение публичного события для всех соединений, кроме соединения, породившего это событие
5) return 4 - выполнение публичного события для всех соединений, кроме соединений, имеющих такой же ip адрес, что и соединение, породившее это событие



OnTo(UID, sData)
Описание: Функция выполняется при отправке в сообщения приват.
Функция выполняется после всех проверок и до отправки.
Возвращаемое значение: true или 1 - не отсылать сообщение.



OnConnectToMe(UID, sData)
Описание: Функция выполняется при попытке активного соединения.
Функция выполняется после всех проверок и до отправки.
Возвращаемое значение: true или 1 - не соединять пользователей.



OnRevConnectToMe(UID, sData)
Описание: Функция выполняется при попытке пассивного соединения.
Функция выполняется после всех проверок и до отправки.
Возвращаемое значение: true или 1 - не соединять пользователей.



OnSearch(UID, sData)
Описание: Функция выполняется при поиске.
Функция выполняется после всех проверок и до отправки.
Возвращаемое значение:
1) return false, return nil, return 0 - безусловное выполнение события
2) return true, return 1 - блокировка события
3) return 2 - выполнеие события и блокировка после обхода всех скриптов
4) return 3 - выполнение публичного события для всех соединений, кроме соединения, породившего это событие
5) return 4 - выполнение публичного события для всех соединений, кроме соединений, имеющих такой же ip адрес, что и соединение, породившее это событие



OnSR(UID, sData)
Описание: Функция выполняется при поступлении на хаб результатов пассивного поиска.
Функция выполняется после всех проверок и до отправки.
Возвращаемое значение: true или 1 - блокировать результаты поиска.



OnAny(UID, sData, iType)
Описание: Функция выполняется при поступлении на хаб любой команды.
Возвращаемое значение: true или 1 - блокировать команду.



OnUnknown(UID, sData)
Описание: Функция выполняется при поступлении на хаб любой не известной команды.
Возвращаемое значение: true или 1 - не блокировать команду.



OnKick(UID, sData)
Описание: Функция выполняется при поступлении на хаб команды кика.
Возвращаемое значение: любое.



OnOpForceMove(UID, sData)
Описание: Функция выполняется при поступлении на хаб команды перенаправления.
Возвращаемое значение: любое.



OnGetINFO(UID, sData)
Описание: Функция выполняется при поступлении на хаб команды $GetINFO.
Возвращаемое значение: true или 1 - не отсылать пользователю MyINFO запрошенного пользователя.



OnFlood(UID, iType, iNum)
Описание: Функция выполняется при обнаружении флуда со стороны пользователя. Может служить для устаноки бана за флуд или для разрешения флуда ОПераторам хаба. Параметр iType указывает тип команды, которой флудили. Параметр iNum указывает номер срабатываемого флуда 1 или 2 (см. настройки флуда).
Возвращаемое значение: true или 1 - не отключать пользователя.



OnWebData(WebID, sData)
Описание: Функция выполняется при поступлении данных на веб-сервер.
Возвращаемое значение: true или 1 - не разъединять пользователя по окончанию работы данного события.



OnConfigChange(sName, sValue)
Описание: Функция выполняется при изменении настройки. Параметр sName - название измененной настройки, sValue - новое значение настройки
Возвращаемое значение: любое.
Событие срабатывает только после изменения настройки при помощи объекта Config.



OnMCTo(UID, sData)
Описание: Функция выполняется при отправке приватного сообщения в чат.
Функция выполняется после всех проверок и до отправки.
Возвращаемое значение: true или 1 - не отсылать сообщение.
LUA API функции

Core.SendToAll(sData, sNick, sFrom)
Описание: Функция отправляет данные sData всем пользователям, которые находятся на хабе.
Если указан параметр sNick, то сообщение sData отправляется в чат от ника sNick.
Если указаны параметры sNick и sFrom, то сообщение sData отправляется в приват от отправителя sFrom с ником sNick.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.SendToUser(UID/sToNick/tNicks, sData, sNick, sFrom)
Описание: Функция отправляет данные sData пользователю с идентификатором UID (User ID) или с ником sToNick или таблице ников tNicks.
Если указан параметр sNick, то сообщение sData отправляется в чат от ника sNick.
Если указаны параметры sNick и sFrom, то сообщение sData отправляется в приват от отправителя sFrom с ником sNick.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.SendToAllExceptNicks(tExcept, sData, sNick, sFrom)
Описание: Функция отправляет данные sData всем пользователям, которые находятся на хабе, кроме пользователей, ники которых указаны в таблице tExcept, если таковые находится на хабе.
Если указан параметр sNick, то сообщение sData отправляется в чат от ника sNick.
Если указаны параметры sNick и sFrom, то сообщение sData отправляется в приват от отправителя sFrom с ником sNick.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.SendToProfile(iProfile/tProfiles, sData, sNick, sFrom)
Описание: Функция отправляет данные sData профилю/профилям. Если в первом аргументе функции указано число, то данные отправляются указанному профилю, если в первом аргументе указана таблица, то данные отправляются профилям, которые указаны в этой таблице.
Если указан параметр sNick, то сообщение sData отправляется в чат от ника sNick.
Если указаны параметры sNick и sFrom, то сообщение sData отправляется в приват от отправителя sFrom с ником sNick.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.SendToNicks(tNicks, sData, sNick, sFrom)
Описание: Функция отправляет данные sData всем пользователям, ники которых указаны в таблице tNicks, если таковые находится на хабе.
Если указан параметр sNick, то сообщение sData отправляется в чат от ника sNick.
Если указаны параметры sNick и sFrom, то сообщение sData отправляется в приват от отправителя sFrom с ником sNick.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.
Функция устарела. Используйте вместо неё функцию Core.SendToUser(tNicks, sData, sNick, sFrom)


Core.GetUser(UID/sNick, iByte)
Описание: Функция возвращает UID пользователя по нику sNick.


Core.SetUser(UID/sNick, iType, Value)
Описание: Функция устанавливает значение Value для данных типа iType для пользователя с ником sNick.
Описание типов данных iType:
1 - профиль (iProfile)
2 - MyINFO строка (sMyINFO)
3 - пользовательские данные (sData)
4 - пользователь в оп-листе, то есть имеет ключик (bInOpList)
5 - пользователь скрыт в ник-листе (bHide)
6 - пользователь в ip-листе, то есть ему отсылаются ip адреса всх пользователей (bInIpList)

Функция устарела. Используйте вместо неё прямую установку параметров: UID[sName] = Value или Core.GetUser(sNick)[sName] = Value, где sName - это одна из строк: "iProfile", "sMyINFO", "sData" и тд.


Core.GetUsersCount()
Описание: Функция возвращает текущее количество онлайн пользователей.


Core.GetTotalShare()
Описание: Функция возвращает текущую суммарную шару всех пользователей хаба.


Core.Disconnect(UID/sNick)
Описание: Функция отключает пользователя по идентификатору UID, или по нику sNick.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.DisconnectIP(sIP, iProfile/tProfiles)
Описание: Функция отключает всех пользователей с указанным IP.
Если указан профиль/таблица с профилями iProfile/tProfiles, то отключаются только пользователи с указанным профилем/профилями.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.RestartScripts(iType)
Описание: Функция перезапускает все скрипты. Если параметр iType отсутствует, равен nil или равен 0, то перезагружаются все скрипты без исключения. Если параметр iType равен 1, то перезагружаются все скрипты, кроме работающих на данный момент. Если параметр iType равен 2, то перезагружаются все скрипты, кроме текущего скрипта (из которого была вызвана данная функция).
Возвращает true.


Core.RestartScript(sScriptName)
Описание: Функция перезапускает скрипт с именем sScriptName. Если параметр sScriptName отсутствует или равен nil, то функция перезапускает текущий скрипт.
Возвращает true в случае успеха, nil в случае неудачи, nil и сообщение об ошибке в случае синтаксической ошибки.


Core.StopScript(sScriptName)
Описание: Функция останавливает скрипт с именем sScriptName. Если параметр sScriptName отсутствует или равен nil, то функция останавливает текущий скрипт.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.StartScript(sScriptName)
Описание: Функция запускает скрипт с именем sScriptName.
Возвращает true в случае успеха, nil в случае неудачи, nil и сообщение об ошибке в случае синтаксической ошибки.


Core.MoveUpScript(sScriptName)
Описание: Функция поднимает скрипт с именем sScriptName в дереве выполнения.
Если параметр не указан, то поднимается текущий скрипт.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.MoveDownScript(sScriptName)
Описание: Функция опускает скрипт с именем sScriptName в дереве выполнения.
Если параметр не указан, то опускается текущий скрипт.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.GetScripts()
Описание: Функция возвращает таблицу со скриптами как таблицы с полями sName, bEnabled, iMemUsage.


Core.GetScript(sScriptName)
Описание: Функция возвращает таблицу со скриптом таблицу с полями sName, bEnabled, iMemUsage.
Если имя не указано, то возвращается таблица текущего скрипта.


Core.GetGVal(sScriptName, sParam)
Описание: Функция возвращает значение глобальной переменной с именем sParam скрипта sScriptName.
Функция работает только с переменными типов: string, number, boolean, lightuserdata и table, для остальных типов будет возвращать nil.
Возвращает значение в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.SetGVal(sScriptName, sParam, Value)
Описание: Функция устанавливает значение глобальной переменной с именем sParam скрипта sScriptName.
Функция работает только с переменными типов: string, number, boolean, lightuserdata и table.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.SetCmd(sData)
Описание: Функция устанавливает новую команду для функций последующих скриптов.
Устанавливаемая команда должна быть синтаксически правильной, то есть соответствовать по синтаксису команде текущего события (API функции события). В противном случае функция не изменит команду и вернёт nil и соответствующее сообщение.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.GetUsers(sIP, bAll)
Описание: При отсутствии аргументов функция возвращает таблицу со всеми уже полностью вошедшими на хаб пользователями (с UID-ми всех вошедших пользователей хаба).
Core.GetUsers(true) - таблица со всеми пользователями хаба, даже которые только входят и ещё не вошли.
Core.GetUsers(sIP) - таблица с UID'ми вошедших пользователей с указанным IP
Core.GetUsers(sIP, true) - таблица со всеми пользователями с указанным IP.


Core.AddTimer(iId, iInterval, sFunc)
Описание: Функция добавляет таймер с идентификатором iId и интервалом срабатывания iInterval (в мсек). Если указано имя глобальной функции sFunc, то эта функция и будет выполняться, если имя функции не указано, то скрипт ищет глобальную функцию OnTimer (в параметр функции передаётся идентификатор). Идентификатор может повторяться.
Возвращает количество зарегистрированных таймеров с таким iId в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.DelTimer(iId)
Описание: Функция удаляет таймер по идентификатору iId.
Идентификатор может повторяться, однако, удаляется таймер по идентификатору, поэтому удалятся все таймеры с указанным идентификатором. Удаляются таймеры только текущего скрипта! Таймеры с таким же идентификатором других скриптов не удаляются!
Возвращает количество удалённых таймеров в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.GetUpTime()
Описание: Функция возвращает время работы хаба (в сек.)


Core.GetConfig(sName)
Описание: Функция возвращает настройку хаба sName. Какого бы типа не была настройка, всегда возвращается строковый тип.
В случае неудачи возвращает nil и сообщение об ошибке.
Функция устарела. Используйте вместо неё объект: Config[sName]


Core.SetConfig(sName, sValue)
Описание: Функция устанавливает настройку хаба sName в значение sValue.
Однако, исключения составляют настройки sHubIP, iMainPort, sSubPorts, которые нельзя изменить.
При изменении настройки sHubName или sTopic отправляется соответствующая команда. После изменения, настройки сохраняются.
При изменении sHubBot и/или bRegMainBot - автоматически перерегистрируется бот.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.
Функция устарела. Используйте вместо неё прямую установку параметров: Config[sName] = sValue


Core.GetLang(sName)
Описание: Функция возвращает "языковую" настройку sName.
В случае неудачи возвращает nil и сообщение об ошибке.


Core.SetLang(sName, sValue)
Описание: Функция устанавливает "языковую" настройку хаба sName в значение sValue.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.Call(sScriptName, sFunc, ...)
Описание: Функция вызывает функцию sFunc другого скрипта sScriptName с параметрами, которые указываются в аргументе 3, 4 и тд.
Параметры функции и возвращаемые значения функции могут быть только следующих типов: string, number, boolean, table и userlightdata.
Функция Core.Call возвращает все те значения, которые возвращает функция sFunc скрипта sScriptName.
В случае ошибки функция возвращает nil и сообщение об ошибке.


Core.SendToAllExceptIPs(tExcept, sData, sNick, sFrom)
Описание: Функция отправляет сообщение всем пользователям, за исключением пользователей с ip адресами, которые указаны в таблице tExcept.
Если указан параметр sNick, то сообщение sData отправляется в чат от ника sNick.
Если указаны параметры sNick и sFrom, то сообщение sData отправляется в приват от отправителя sFrom с ником sNick.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.SendToIP(sIP, sData, sNick, sFrom, iProfile/tProfiles)
Описание: Функция отправляет сообщение sData всем пользователям с указанным IP адресом sIP.
Если указан параметр sNick, то сообщение sData отправляется в чат от ника sNick.
Если указаны параметры sNick и sFrom, то сообщение sData отправляется в приват от отправителя sFrom с ником sNick.
Если указан профиль/таблица с профилями iProfile/tProfiles, то сообщение отправляется только указанным профилям с данным IP адресом.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.RegBot(sNick, bKey, sMyINFO, sIP)
Описание: Функция регистрирует бота с ником sNick. Если bKey равен true, то бот регистрируется с ключиком. sMyINFO - это часть MyINFO строки (часть после ника, начиная с описания и до конца MyINFO). sIP - возможный ip адрес для бота. Обязательным параметром является только первый параметр - sNick.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.UnregBot(sNick)
Описание: Функция удаляет регистрацию бота с ником sNick из списка.
Возвращает true в случае успеха, nil и сообщение об ошибке в случае неудачи.


Core.SetHubState(iNum)
Описание: Функция устанавливает состояние хаба.
iNum = nil или iNum = 0 - остановка хаба. iNum = 1 - рестарт хаба. Остальные значения заразервированы на будущее


Core.Redirect(UID/sNick, sAddress[, sReason])
Описание: Перенаправляет пользователя на адрес sAddress с причиной sReason. Причину указывать не обязательно.
Возвращает true в случае успеха, nil и сообщение с ошибкой - в случае неудачи


Config - объект конфигурационных настроек хаба
Config.table() - таблица с названиями всех возможных настроек хаба
Core.sMainDir - основной путь, по которому располагается хаб
Core.sScriptsDir - абсолютный путь, по которому располагается директория скриптов
Core.sHubVersion - название и версия хаба
Core.sLuaPluginVersion - название и версия плагина
Core.sSystem - название и версия ОС
_TRACEBACK = debug.traceback - способ включить stack trace для скрипта
Параметры пользователя
UID.sNick - ник
UID.sIP - ip
UID.iProfile - профиль
UID.bInOpList - пользователь в оп-листе, то есть имеет ключик
UID.bInIpList - пользователь в ip-листе, то есть ему отсылаются 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.iEnterTime - время входа на хаб (время отсылки на хаб команды $Key)
UID.sIPConn - ip адрес (хост) хаба, на который был принят пользователь
UID.bKick - способность ОПератора к кику
UID.bRedirect - способность ОПератора к перенаправлению




Текущая версия:
[attachment=6486:rushub_2...10_win32.rar][attachment=6485:rushub_2...10_win64.rar]

Lua плагин:
[attachment=6490:lua_plug....9_win32.rar][attachment=6489:lua_plug....9_win64.rar]

Pdb файлы:
[attachment=6488:rushub_2...db_win32.rar][attachment=6487:rushub_2...db_win64.rar]
[attachment=6492:lua_plug...db_win32.rar][attachment=6491:lua_plug...db_win64.rar]

Исходники можно скачать с: SourceForge
SVN: https://rushub.svn.sourceforge.net/svnroot/rushub/trunk/
Nickolya, BIMMER71, Jaska, intlive, Wariner, DEL, FallenAngel, Invisible, mariner, fixx, Ksan, Serx, Артём, serrrios, ShadoWx, Maximum, Otshelnik-Fm, Vizunchik, Accelerator, Karumo, PomanoB, -=Alexandr=-, Infinity_Love, alex82, ExC0tiC, rival, KT315, Drakula, Alexey, Phazeus, Andrew Frost, BeN, Kingston, Sekretchik, CrazyKiller, Saymon21, hondas, Dimon21, X-Sky, TiGRpp, KamoK, ART8150, lewonchik, LOPD, andromed, Alexey5176, -=FugeN=- 2, SKIFI, stone, Egerj1, ke(x)one, AltSide, Jarkrait, arktik, Mangust, kma21
27.8.2009, 1:07 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Во-первых, переменные, которые возвращаются функцией string.find, либо все равны nil, либо все не равны nil. Поэтому нет смысла делать лишние проверки.

Во-вторых, на конце каждого сообщения присутствует символ |, который в NMDC протоколе разделяет команды друг от друга. Поэтому в переменную nNik запишется ник + символ |, соответственно такой изменённый ник запишется в таблицу nicker и при отсылке в чат будет работать как разделитель команд, то есть разобьёт нашу команду чата на две команды чата))

После всего сказанного получаем:
Код
message = message:sub(1, -2)
s,e,cmd,oNik,nNik= string.find(message,"%b<>%s(.+)%s(.+)%s(.+)")
if cmd == "!nickchange" then
  nicker[oNik]=nNik
end

s,e,mes = string.find(message, "%b<>%s(.*)")
if nicker[curUser.sNick] ~= nil then
  Core.SendToAll("<"..nicker[curUser.sNick].."> "..mes)
  return true
end
Akafellas
26.8.2009, 20:07 Реализация NMDC команды $MCTo
дабы не затерялось
Да, действительно. Про галочку в клиенте я совсем забыл упомянуть.

Скрипты равносильны и никто не проигрывает и не выигрывает.
Выигрыш будет, если данная команда реализована в протоколе, а не при помощи скрипта.

В отличии от указанного скрипта (сказать шёпотом), данная команда устроена так, что жертва не знает о том, что именно ему пришло сообщение, а считает, что это общее сообщение чата. Поэтому всем окружающим будет казаться, что он разговаривает сам с собой. Очень весело получается)))
Serx
26.8.2009, 17:19 Реализация NMDC команды $MCTo
дабы не затерялось
Расширяем протокол. А именно, добавляем дополнительные возможности: http://mydc.ru/index.html?showtopic=915&am...post&p=6917
Данная команда NMDC протокола работает как встроенная характеристика на YnHub-е.
На поддержку хабом этой команды указывает характеристика MCTo в команде $Supports.

Скриптовая реализация этой NMDC команды в PtokaX:

Код
function UnknownArrival(tUser, sData)
  local to, n, m = sData:match"%$MCTo: (%S+) %$(%S+) (.+)|$"
  if to and n == tUser.sNick then
    Core.SendToNick(to, "<"..n.."> "..m)
    Core.SendToUser(tUser, "<"..n.."> "..m)
    return true
  end
end


Для использования команды в настройках клиента нужно создать менюшку.
Заходим Файл > Настройки > Команды юзера > Добавить
Тип команды: RAW
Контекст: Меню юзера
Название: Сообщение этому юзеру в чат
Команда: $MCTo: %[userNI] $%[myNI] %[line:Сообщение]|

Или же менюшку можно создать средствами хаба:
Код
function UserConnected(tUser)
  Core.SendToUser(tUser, "$UserCommand 1 2 Сообщение этому юзеру в чат$$MCTo: %[nick] $%[mynick] %[line:Сообщение]&#124;")
end
RegConnected, OpConnected = UserConnected, UserConnected
Delion
26.8.2009, 12:49 Informer
API1, API2 | Скрипт рассылки сообщений
Просто человек впервые работает с ptokax и мало ещё что знает.

Скрипты - это файлы с расширениями .lua
Для запуска, файлы с таким расширением должны быть помещены в папку scripts.

scripts/InformEr_1.02/InformEr.lua ---> это неправильно!
scripts/InformEr.lua ---> это правильно!
DriverZX-10
17.8.2009, 11:16 состояние хабов
удалённое отображение информации
Ты что же предлагаешь изменить протокол? Ведь пингером нельзя вытащить такую инфу, которую ты хочешь. И вообще зачем переделывать какой-то клиент, когда нужно просто взять (или написать) пингер.

Пингер максимум может вытащить следующую инфу:
  • Имя хаба
  • Адрес хаба
  • Описание хаба
  • Макс. юзеров
  • Мин. шара при входе
  • Мин. слотов при входе
  • Макс. хабов при входе
  • Тип хаба
  • Владелец хаба


А то, что ты предлагаешь нуждается в дополнительных протокольных командах, кроме этого хаб должен будет сам отслеживать предлагаемую статистику.

В общем разговор на пустом месте. Как говориться мечтать не вредно)))
степашка
16.8.2009, 23:11 Sau_script
хелп-исправить ошибку...
Только без оффтопа плз!
Uncle_Dif
14.8.2009, 17:01 NoDescAdv
API2 | Удаление рекламы из описания юзеров
Ошибка не так переводится. А возникает ошибка из-за того, что нельзя бездумно вписывать антирекламные фразы. Некоторые символы нуждаются в экранировании:
Код
d%]c%]h%]u%]b


Подробнее о символах, нуждающихся в экранировании: http://mydc.ru/topic266.html
Sunshine-hub
14.8.2009, 16:45 Описание Протокола NMDC
NeoModus Direct Connect Protocol
ZLine

Описание:

Характеристика хаба/клиента.
Характеристика указывает на поддержку команды сжатия $Z.
14.8.2009, 16:37 Описание Протокола NMDC
NeoModus Direct Connect Protocol
UserIP2

Описание:

Характеристика хаба/клиента.
Указывает на то, что хабом (клиентом) поддерживается вторая версия команды $UserIP.
Вторая версия отличается от первой тем, что входящему на хаб пользователю всегда отсылается команда $UserIP с его ником и ip адресом. Ip адреса остальных же пользователей отсылаются в зависимости от статуса пользователя на хабе.

Характеристика поддерживается DC++ клиентами, начиная с версии 0.305.
14.8.2009, 16:21 Описание Протокола NMDC
NeoModus Direct Connect Protocol
UserCommand

Описание:

Характеристика хаба/клиента.
Данная характеристика указывает на поддержку со стороны хаба или клиента команды $UserCommand, которая позволяет клиенту создавать контекстные менюшки. Наличие этой характеристики в команде $Supports является не обязательным из-за большой распространённости команды.

Характеристика поддерживается клиентами DC++, начиная с версии 0.300.
14.8.2009, 16:09 Описание Протокола NMDC
NeoModus Direct Connect Protocol
TTHSearch

Описание:

Характеристика клиента.
Эта характеристика указывает на то, что клиент поддерживает поиск файлов по уникальному идентификатору TTH. Поиск по TTH является наиболее эффективным. Для получения большей информации по поиску смотрите описание команды $Search.

Характеристика поддерживается клиентами DC++, начиная с версии 0.307.
14.8.2009, 16:06 Описание Протокола NMDC
NeoModus Direct Connect Protocol
QuickList

Описание:

Характеристика хаба/клиента.
Позволяет быстро входить на хаб, экономя трафик и снижая нагрузку на сервер при входе.


Сравнение последовательностей входов с и без характеристики QuickList:

Обозначения:
H - хаб
C - клиент

С характеристикой QuickList
Код
H: $Lock EXTENDEDPROTOCOL[Код] Pk=[PrimaryKey]|
C: $Supports NoHello QuickList|
C: $Key [Рассчитанный_ключ]|
H: $Supports NoHello QuickList|
C: $MyINFO [Строка]|
C: $GetNickList|
H: Отсылает список пользователей.


Без характеристики QuickList
Код
H: $Lock EXTENDEDPROTOCOL[Код] Pk=[PrimaryKey]|
C: $Supports NoHello|
C: $Key [Рассчитанный_ключ]|
H: $Supports NoHello|
C: $ValidateNick [Ник]|
H: $Hello [Ник]|
C: $Version [Версия]|
C: $GetNickList|
C: $MyINFO [Строка]|
H: Отсылает список пользователей.


Поддержка характеристики:

Полноценно данную характеристику поддерживает хаб PtokaX.
Со стороны клиентов, данную характеристику поддерживают следующие клиенты: CZDC, BCDC

Внимание! Так как в данной характеристике отсутствуют шаги валидации ника и проверки версии, то при поддержке со стороны клиента данной характеристики на хабе PtokaX скриптовые функции ValidateNickArrival и VersionArrival для этого клиента выполняться не будут!
Saymon21, RAND(i)M
14.8.2009, 15:47 Описание Протокола NMDC
NeoModus Direct Connect Protocol
OpPlus

Описание:

Характеристика хаба. Указывает на то, что на хабе используются дополнительные команды для операторов. Например: $Ban, $TempBan, $UnBan, $GetBanList, $WhoIP, $Banned, $GetTopic, $SetTopic и тд.

На данный момент команду поддерживает хаб VerliHub.
14.8.2009, 15:35 Описание Протокола NMDC
NeoModus Direct Connect Protocol
NoHello

Описание:

Характеристика хаба/клиента.
Характеристика говорит о том, что при входе нового юзера на хаб, клиенту, уже находящемуся на хабе, не нужно отсылать оповещение о входе юзера в виде команды $Hello. Кроме этого, данная характеристика указывает на то, что хаб не должен отсылать клиенту при коннекте команду $NickList, которая отвечает за получение клиентом ников всех пользователей хаба, а клиент не должен отсылать на хаб команду $GetINFO для получения списка пользователей хаба. Для заполнения списка пользователей хаб должен отослать команду $MyINFO. Клиент отсылает команду $GetNickList для указания того, что он заинтересован в получении списка пользователей, однако, хаб не обязан ждать эту команду и должен отослать список пользователей в любом случае.

Важное замечание!
При наличии у клиента этой характеристики хаб при входе этого клиента будет отсылать клиенту список пользователей командами $MyINFO. Так как команда $MyINFO содержит ники пользователей, то получение ников командой $NickList является лишним действием. Поэтому данная характеристика является самым информативным и оптимальным вариантом.

Характеристика поддерживается клиентами DC++, начиная с версии 0.305.
14.8.2009, 15:13 Описание Протокола NMDC
NeoModus Direct Connect Protocol
NoGetINFO

Описание:

Характеристика хаба/клиента.
Характеристика указывает на то, что хабу не нужно получать от клиента команды $GetINFO для того, чтобы отсылать ему команды $MyINFO и $NickList. Это некое подобие характеристики QuickList, которая позволяет осуществлять быстрые получения списков пользователей.

Важное замечание!
При отсутствии у клиента характеристики NoHello и при наличии характеристики NoGetINFO хаб должен отсылать клиенту список пользователей при помощи команд $MyINFO и $NickList одновременно. При отсутствии обеих характеристик список пользователей отсылается по средствам команды $NickList, а список пользователей с участием команд $MyINFO можно будет получить только после отсылки на хаб команды $GetINFO.

Характеристика поддерживается клиентами DC++, начиная с версии 0.302.
14.8.2009, 15:06 Описание Протокола NMDC
NeoModus Direct Connect Protocol
MCTo

Описание:

Характеристика хаба.
Данная характеристика указывает на поддержку команды $MCTo.
На данный момент характеристику поддерживает хаб YnHub.
14.8.2009, 14:57 Описание Протокола NMDC
NeoModus Direct Connect Protocol
HubTopic

Описание:

Характеристика хаба. Указывает на поддержку команды $HubTopic. Данная характеристика является не обязательной, то есть хаб может поддерживать данную команду и без указания данной характеристики.
14.8.2009, 14:37 Описание Протокола NMDC
NeoModus Direct Connect Protocol
Feed

Описание:

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

На данный момент характеристику Feed поддерживает YnHub.
14.8.2009, 14:27 Описание Протокола NMDC
NeoModus Direct Connect Protocol
ClientID

Описание:

Характеристика клиента. Данная характеристика указывает на поддержку команды $ClientID.
Характеристику поддерживают следующие клиенты: BlackDC, iDC++, dDC++, Zion++
14.8.2009, 14:13 Описание Протокола NMDC
NeoModus Direct Connect Protocol
BotList

Описание:

Характеристика хаба/клиента. Данная характеристика указывает на поддержку команды $BotList.

Для полного понимания, данная характеристика должна присутствовать в команде $Supports как хаба, так и клиента.
12.8.2009, 21:43 Как включать скрипты в PtokaX 0.4.1.1
В сотый раз говорю, что не надо цитировать предыдущий пост! Итак ясно о чём речь!
pleomax
12.8.2009, 18:13 Как включать скрипты в PtokaX 0.4.1.1
В проге с GUI есть кнопка Скрипты. Там надо поставить галочки напротив нужных скриптов
pleomax
11.8.2009, 0:08 Описание Протокола NMDC
NeoModus Direct Connect Protocol
Lock2Key

Описание:

Реализация в различных языках функции lock2key для нахождения ключа по параметру команды $Lock.


Язык С/C++:

CODE
char *lock2key(char *lock)
{
int len = strlen(lock);
char *key = (char *)calloc(1, len + 1);

int i;
for(i = 1; i < len; ++i)
key[i] = lock[i] ^ lock[i-1];
key[0] = lock[0] ^ lock[len-1] ^ lock[len-2] ^ 5;

for(i = 0; i < len; ++i)
key[i] = ((key[i]<<4) & 0xF0) | ((key[i]>>4) & 0x0F);

char *newkey = (char *)calloc(1, len + 100);
char *newkey_p = newkey;
for(i = 0; i < len; ++i)
{
switch(key[i])
{
case 0:
case 5:
case 36:
case 96:
case 124:
case 126:
sprintf(newkey_p, "/%%DCN%03d%%/", key[i]);
newkey_p += 10;
break;
default:
*newkey_p = key[i];
++newkey_p;
}
}
*newkey_p = '\0';
return newkey;
}



Язык C++:

CODE
/// DCN экранирование
void DCN_Escape(const char *sBuf, int iLen, string &sDest)
{
sDest.clear();
unsigned char c;
char buf[11];
while(iLen-- > 0) {
c = *(sBuf++);
switch© {
case 0:
case 5:
case 36:
case 96:
case 124:
case 126:
sprintf(buf, "/%%DCN%03d%%/", c);
sDest += buf;
break;
default:
sDest += c;
break;
}
}
}

/// DCN разэкранирование
void DCN_UnEscape(const string &sSrc, char *sDest, int &iLen)
{
string sStart = "/%DCN", sEnd = "%/";
unsigned char c;
size_t iPos = sSrc.find(sStart), iPos2 = 0;
iLen = 0;
while((iPos != sSrc.npos) && (iLen < sSrc.size())) {
if(iPos > iPos2) {
memcpy(sDest + iLen, sSrc.c_str() + iPos2, iPos - iPos2);
iLen += iPos - iPos2;
}
iPos2 = sSrc.find(sEnd, iPos);
if((iPos2 != sSrc.npos) &&
(iPos2 - iPos <= sStart.size() + 3)) {
c = atoi(sSrc.substr(iPos + sStart.size(), 3).c_str());
sDest[iLen++] = c;
iPos2 += sEnd.size();
}
iPos = sSrc.find(sStart, iPos + 1);
}
if (iPos2 < sSrc.size()) {
memcpy(sDest + iLen, sSrc.c_str() + iPos2, sSrc.size() - iPos2 + 1);
iLen += sSrc.size() - iPos2;
}
}

/// Функция кодирования
void lock2key(const string &sLock, string &sKey)
{
int iCount = 0, iLen = sLock.size();
char *key = 0, *lock = new char[iLen + 1];
DCN_UnEscape(sLock, lock, iLen);

key = new char[iLen + 1];

key[0] = lock[0] ^ lock[iLen - 1] ^ lock[iLen - 2] ^ 5;
while(++iCount < iLen) key[iCount] = lock[iCount] ^ lock[iCount - 1];
key[iLen] = 0;

iCount = -1;
while(++iCount < iLen) key[iCount] = ((key[iCount] << 4)) | ((key[iCount] >> 4));

DCN_Escape(key, iLen, sKey);
delete [] key;
delete [] lock;
}



Язык C#:

CODE
private static string lock2key(string Lock)
{
int i, len = Lock.Length;
byte[] key = new byte[len];
for(i = 1; i < len; ++i)
key[i] = (byte)(Lock[i] ^ Lock[i - 1]);
key[0] = (byte)(Lock[0] ^ Lock[len - 1] ^ Lock[len - 2] ^ 5);

for(i = 0; i < len; ++i)
key[i] = (byte)(((key[i] << 4) & 0xF0) | ((key[i] >> 4) & 0x0F));

string Buf = "", Key = Encoding.Default.GetString(key);
for(i = 0; i < len; ++i)
switch((int)Key[i]) {
case 0:
case 5:
case 36:
case 96:
case 124:
case 126:
Buf += String.Format("/%DCN{0:000}%/", (int)Key[i]);
break;
default:
Buf += Key[i];
break;
}
return Buf;
}



Язык Lua (5.1):

CODE
function lock2key(lock)
local function bitwise(x, y, bw)
local c, p = 0, 1
local function bODD(x)
return x ~= math.floor(x / 2) * 2
end
while x > 0 or y > 0 do
if bw == "xor" then
if (bODD(x) and not bODD(y)) or
(bODD(y) and not bODD(x)) then
c = c + p
end
elseif bw == "and" then
if bODD(x) and bODD(y) then
c = c + p
end
elseif bw == "or" then
if bODD(x) or bODD(y) then
c = c + p
end
end
x = math.floor(x / 2)
y = math.floor(y / 2)
p = p * 2
end
return c
end

local key = {}
table.insert(key,
bitwise(bitwise(bitwise(string.byte(lock, 1),
string.byte(lock, -1),
"xor"),
string.byte(lock, -2),
"xor"),
5,
"xor"))
for i=2, string.len(lock),1 do
table.insert(key, bitwise(string.byte(lock, i), string.byte(lock, i - 1), "xor"))
end

local function nibbleswap(bits)
return bitwise(bitwise(bits * (2 ^ 4), 240, "and"),
bitwise(math.floor(bits / (2 ^ 4)), 15, "and"), "or")
end

local g = {["5"] = 1, ["0"] = 1, ["36"] = 1, ["96"] = 1, ["124"] = 1, ["126"] = 1}
for i=1, #key do
local b = nibbleswap(rawget(key, i))
rawset(key, i, (g[tostring(b)] and
string.format("/%%DCN%03d%%/", b) or string.char(b)))
end

return table.concat(key)
end



Язык PHP:

CODE
function lock2key($_LOCK, $port) {
$lockLength = strlen($_LOCK);
$LockToKey = '';

for ($j = 0; $j < strlen($_LOCK); $j++) {
if($j == 0) {
$h = ord($_LOCK{0}) ^ ord( $_LOCK{ $lockLength - 1} ) ^ ord( $_LOCK{ $lockLength - 2} ) ^ 5;
} else {
$h = ord($_LOCK{$j}) ^ ord($_LOCK{$j-1});
}

$h = $h % 256;
$a = (($h<<4) & 240) | (($h>>4) & 15);

if($a == '126' or $a == '124' or $a == '96' or $a == '36' or $a == '5' or $a == '0') {
$LockToKey .= "/%DCN";

if ($a < 100) $LockToKey .= "0";
if ($a < 10) $LockToKey .= "0";

$LockToKey .= $a;
$LockToKey .= "%/";
} else {
$LockToKey .= chr($a);
}
}
return $LockToKey;
}



Язык Perl:

CODE
sub lock2key($)
{
my @lock = split(//, shift);
my $i;
my @key = ();
# convert to ordinal
map {$_=ord} @lock;
# calc key[0] with some xor-ing magic
push(@key,$lock[0]^5);
# calc rest of key with some other xor-ing magic
for ($i=1;$i<@lock;$i++)
{
push(@key, ($lock[$i]^$lock[$i-1]));
}
# nibble swapping
for ($i=0;$i<@key;$i++)
{
$key[$i] = ((($key[$i] << 4) & 240) | (($key[$i] >> 4) & 15)) & 0xff;
}
$key[0] = $key[0] ^ $key[ @key - 1 ];
# escape some
foreach (@key)
{
$_ = ( $_ == 0 || $_ == 5 || $_ == 36 ||
$_ == 96 || $_ == 124 || $_ ==
126 ) ? sprintf('/%%DCN%03i%%/', $_) : chr;
}
# done
return join('', @key);
}



Язык Delphi / Pascal:

CODE
function lock2key(StrLock : string) : string;

// The follow function converts "1" (byte) to "001" (string), "10" to "010" and so on
function ByteToThreeCharStr (Value : byte) : string;
begin
if value < 10 then
result := '00'+inttostr(value)
else
if value < 100 then
result := '0'+inttostr(value)
else
result := inttostr(value);
end;

var i : byte;
Temp : string;
TempChar : byte;

begin
result := '';
if length (StrLock) < 3 then
begin
result := 'BROKENCLIENT';
setlength (result,length(strlock));
exit;
end;

// First char
temp := chr (ord (StrLock[1]) xor ord (StrLock[length(StrLock)])
xor ord (StrLock[length(strLock)-1]) xor 5);

for i := 2 to length (StrLock) do
temp := temp + chr (ord(StrLock[i]) xor ord (StrLock[i-1]));

for i := 1 to length (temp) do
begin
TempChar := ord (temp[i]);

// I now used assembler. In the visual basic code the same was done with ugly math
asm // <- Nibble swap! We swap the last four
// bits with the first four: 00101111 -> 11110010
ror TempChar, 4
end;

// Some chars need to be replaced with a string like "/%DCN005%/"
If (TempChar = 0) or (TempChar = 5) or (TempChar = 36) or (TempChar = 96)
or (TempChar = 124) or (TempChar = 126)
then
result := result + '/%DCN' + ByteToThreeCharStr(TempChar) + '%/'
else
result := result + chr (TempChar);
end;
end;



Язык Java:

CODE
private static final String CHARENCODING = "windows-1252";

public static String generateKey(String lockstr) throws UnsupportedEncodingException {
byte[] lock = lockstr.split(" ", 3)[1].getBytes(CHARENCODING);
byte[] key = new byte[lock.length];
for (int i = 1; i < lock.length; i++) {
key[i] = (byte) ((lock[i] ^ lock[i - 1]) & 0xFF);
}
key[0] = (byte) ((((lock[0] ^ lock[lock.length - 1]) ^ lock[lock.length - 2]) ^ 5) & 0xFF);
for (int i = 0; i < key.length; i++) {
key[i] = (byte) ((((key[i] << 4) & 0xF0) | ((key[i] >> 4) & 0x0F)) & 0xFF);
}
String modifiedLock = new String(key,CHARENCODING);
return dcnEncode(modifiedLock);
}

private static String dcnEncode(String lockstring) {
for (int i: new int[]{0,5,36,96,124,126}) {
String paddedDecimal = String.format("%03d", i);
String paddedHex = String.format("%02x", i);
lockstring = lockstring.replaceAll("\\x"+paddedHex, "/%DCN"+paddedDecimal+"%/");
}
return "$Key "+lockstring+"|";
}



Язык Visual Basic:

CODE
Public Function Lock2Key(StrLock As String) As String
Dim TLock2Key As String, TChar As Integer
If Len(StrLock) < 3 Then
Lock2Key = Left$("BROKENCLIENT", Len(StrLock))
Exit Function
End If
TLock2Key = Chr$(Asc(Left$(StrLock, 1)) Xor
Asc(Right$(StrLock, 1)) Xor
Asc(Mid$(StrLock, Len(StrLock) - 1, 1)) Xor 5)
For i = 2 To Len(StrLock)
TLock2Key = TLock2Key &
Chr$(Asc(Mid$(StrLock, i, 1)) Xor
Asc(Mid$(StrLock, i - 1, 1)))
Next i
For i = 1 To Len(TLock2Key)
TChar = Asc(Mid$(TLock2Key, i, 1))
TChar = TChar * 16 + TChar \ 16 'Swap bits 11110000 -> 00001111
TChar = TChar Mod 256
If TChar = 0 Or TChar = 5 Or TChar = 36 Or
TChar = 96 Or TChar = 124 Or TChar = 126 Then
Lock2Key = Lock2Key & "/%DCN" & Right$("000" & TChar, 3) & "%/"
Else
Lock2Key = Lock2Key & Chr$(TChar)
End If
Next i
End Function

Case "$LOCK"
'You've recived $LOCK, convert it to $KEY
Dim sLock2 As String
sLock2 = Split(Mid(sData2, 7), " Pk=")(0)
sLock2 = Lock2Key(sLock2)



Язык Python:

CODE
lock = self.sock.recv(1024)
lock = re.findall('\$Lock[\s](.*?)[\s]', lock)[0]

key = {}

for i in xrange(1, len(lock)):
key[i] = ord(lock[i]) ^ ord(lock[i-1])

key[0] = ord(lock[0]) ^ ord(lock[len(lock)-1]) ^ ord(lock[len(lock)-2]) ^ 5
for i in xrange(0, len(lock)):
key[i] = ((key[i]<<4) & 240) | ((key[i]>>4) & 15)

out = ""
for i in xrange(0, len(lock)):
out += unichr(key[i])

out = out.replace(u'\0', u'/%DCN000%/').replace(u'\5',
u'/%DCN005%/').replace(u'\44', u'/%DCN036%/')
out = out.replace(u'\140', u'/%DCN096%/').replace(u'\174',
u'/%DCN124%/').replace(u'\176', u'/%DCN126%/')



Язык Python 2.5.2 (Ubuntu 8.10):

CODE
# "lock" must be the exact lock character sequence, not the whole command.
# i.e. if the command is $Lock blah pk=bleh|, lock should be "blah"
def lock_to_key(lock):
"Decrypts lock to key."
key = {}
for i in xrange(1, len(lock)):
key[i] = ord(lock[i]) ^ ord(lock[i-1])
key[0] = ord(lock[0]) ^ ord(lock[len(lock)-1]) ^ ord(lock[len(lock)-2]) ^ 5
for i in xrange(0, len(lock)):
key[i] = ((key[i]<<4) & 240) | ((key[i]>>4) & 15)
out = ""
for i in xrange(0, len(key)):
if key[i] in (0, 5, 36, 96, 124, 126):
out += "/%%DCN%03d%%/" % (key[i],)
else:
out += chr(key[i])
return out
Nickolya, PomanoB, Кто-то_из_вне..., Saymon21, Enyby, Markiz
10.8.2009, 23:52 Описание Протокола NMDC
NeoModus Direct Connect Protocol
TTH (Tiger Tree Hashing)

Описание:

Тип хэш-кода. Служит для однозначной идентификации файлов в p2p сетях. Впервые появился в клиенте DC++ 0.400.

Пример TTH для 0б:

Код
LWPNACQDBZRYXW3VHJVCJ64QBZNGHOHHHZWCLNQ



Вычисления TTH:

Сначала данные делим на блоки не более 1024 байта на блок. Далее к каждому получившемуся блоку спереди добавляется байт 00 - эта какт называемый Leaf Tiger Hash. Затем для каждой пары хешей вычисляется так называемый Internal Tiger Hash - это хеш от пары хешей Internal Tiger Hash или Leaf Tiger Hash с добавлением в начале байта 01. После хеширования всех пар получается один хеш, который называется Tiger Tree Root, и который является хешем всего дерева. Именно его используют для однозначной идентификации файла и указывают в различных P2P ссылках.

Схема хеширования:

  • деление на блоки по 1024 байта;
  • получение Leaf Tiger Hash (LTH) - это Tiger Hash от блока данных с добавленным в начале байтом 00 (Байт 00 + Блок данных);
  • получение Internal Tiger Hash (ITH) - это Tiger Hash от двух других Tiger Hash (Internal Tiger Hash или Leaf Tiger Hash) с добавленным в начале байтом 01 (Байт 01 + Hash1 + Hash2);
  • получение Tiger Tree Root (TTR) - это хеш всего дерева или единственный оставшийся хеш, полученный из пары уровнем ниже.



Вычисление количества хешей на уровне:

Количество хешей на уровне можно посчитать циклически от нижнего до верхнего уровня следующим образом:

  1. Округлённое до большего целого количество хешей самого нижнего уровня (Количество байт данных \ 1024);
  2. Округлённое до большего целого количество хешей выше (Количество хешей ниже \ 2);
  3. Повторяем пункт 2 для нового уровня, пока не будет найдено количество хешей нужного уровня.



Поиск ($Search):

На данный момент в DC клиентах за поиск по TTH отвечает девятый тип поиска. Строка поиска девятого типа обязательно должна содержать TTH:[base32_encoded_tth_hash]


Результаты поиска ($SR):

Когда клиенту известен корневой хеш файла, клиент в команде $SR не должен отсылать имя хаба. Вместо имени хаба должен стоять TTH:[base32_encoded_tth_hash]. См. описание команды $SR.
10.8.2009, 23:04 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$ZOn

Синтаксис:

Код
$ZOn|[Блок_данных]


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

Хаб -> Клиент

Описание:

Команда сжатия данных с использованием библиотеки zlib. Используется в хабе PtokaX.
Данная команда указывает на то, что после неё идёт блок данных, который сжат при помощи библиотеки zlib. Сжатый блок распаковывается на стороне клиента, после получения. Библиотека сжатия zlib использует алгоритм сжатия LZ77.

Для использования данной команды необходимо, чтобы в команде $Supports присутствовала характеристика ZPipe0.
Нолик на конце характеристики указывает на тестирование данной характеристики. В конечной реализации (не тестовой) данная характеристика имеет вид: ZPipe. Окончание блока сжатых данных трактуется символом EOF (End-Of-File).

См. также команду $Z
10.8.2009, 22:54 Registration_1_.v2
API1, API2 | Скрипт регистрации
все \r\n заменить на \n
Herurg, Dialog
10.8.2009, 1:18 Нужен скрипт
Код
function ChatArrival(tUser, sData)
  if sData:find"бот топик" then
    Core.SendToAll(sData.."<Bot> Топик хаба: "..SetMan.GetString(10))
    return true
  end
end
CrazyBoyTula
10.8.2009, 0:21 Нужен скрипт
Код
function ChatArrival(tUser, sData)
  if sData:find"бот топик" then
    for k,v in pairs(Core.GetOnlineUsers()) do
      Core.SendToUser(v, sData)
    end
    Core.SendToUser(tUser, "<Bot> Топик хаба: "..SetMan.GetString(10))
    return true
  end
end


или так:

Код
function ChatArrival(tUser, sData)
  if sData:find"бот топик" then
    Core.SendToUser(tUser, sData)
    Core.SendToUser(tUser, "<Bot> Топик хаба: "..SetMan.GetString(10))
    return true
  end
end


всё зависит от того, что именно нужно)
CrazyBoyTula
9.8.2009, 14:15 Описание Протокола NMDC
NeoModus Direct Connect Protocol
$Z / ZLine

Синтаксис:

Код
$Z [Блок]|


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

Хаб -> Клиент

Описание:

Команда $Z используется расширением ZLine протокола NMDC.

Данная команда была предложена Jove и обсуждается в основном на DCDev хабе.
Команда предназначена для сжатия блоков команд.

Команда $Z [Блок]| будет развёрнута в строку: $Search ... |$MyINFO...|...

Используется простое zlib сжатие и дополнительное экранирование. Символ "\" экранируется так: "\\", а символ "|" так: "\P". Этого достаточно чтобы использовать взамен bzip.

Данную команду следует использовать только в одном направлении хаб -> клиент. В любом другом направлении она только создаст лишнюю нагрузку.

Клиент должен поддерживать эту команду. Он сообщает об этом хабу путём отсылки в команде $Supports флага ZLine

Оценка:
Проводились тесты для оценки эффективности данного дополнения.

Программа тестирования работала следующим образом: сначала пользователи соединялись, потом пользователи генерировали события:

  • $MyINFO
  • Сообщение чата
  • $Search
  • разъединение/соединение


Задержки между соединениями и событиями могут варьироваться. Настройки по умолчанию были выбраны следующими:
100 мсек между входами (10 соединений/сек) и 50 мсек между событиями (20 событий/сек).



Короткий тест (приблизительно 700 сек) со 100 пользователями.

Без ZLine
Общий трафик: Входящий 1986998, Исходящий 58506319
Среднее за 718 секунд: Входящий 16.140272 кб/с, Исходящий 475.764798 кб/с


С ZLine
Общий трафик: Входящий 1549938, Исходящий 15913487
Среднее за 719 секунд: Входящий 16.159448 кб/с, Исходящий 165.737719 кб/с




Тест с 1000 пользователями на хабе. Продолжительность теста примерно 22000 секунд (чуть больше 6 часов) в обоих случаях.

Без ZLine
Общий трафик: Входящий 58562006, Исходящий 18932614671
Среднее за 28078 секунд: Входящий 16.682808 кб/с, Исходящий 5393.331647 кб/с


С ZLine
Общий трафик: Входящий 48040395, Исходящий 3987767021
Среднее за 22318 секунд: Входящий 16.989433 кб/с, Исходящий 1410.093335 кб/с



Тест с 4000 пользователями на хабе. Продолжительность теста примерно 5000 секунд в обоих случаях.

Без ZLine
Общий трафик: Входящий 11675512, Исходящий 14732322239
Среднее за 5472 секунд: Входящий 16.910506 кб/с, Исходящий 21337.779879 кб/с


С ZLine
Общий трафик: Входящий 11102441, Исходящий 2805387234
Среднее за 5042 секунд: Входящий 17.197069 кб/с, Исходящий 4343.892306 кб/с



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

1000 пользователей:


Без ZLine
Общий трафик: Входящий 26426307, Исходящий 8802244496
Среднее за 9358 секунд: Входящий 22.585492 кб/с, Исходящий 7522.500261 кб/с


С ZLine
Общий трафик: Входящий 27070505, Исходящий 4003114560
Среднее за 9359 секунд: Входящий 22.837603 кб/с, Исходящий 3376.263386 кб/с




Выводы:
Эффективность сжатия варьируется от 50% до 80% и зависит от количества пользователей и типа трафика. Данную команду нельзя применять для того, чтобы сжимать всё подряд. Хаб должен находить баланс между шириной полосы пропускания и ресурсностью процессора и памяти. В сущности, сжимаются только блоки команд, посылаемые клиентам. Поэтому нагрузка на процессор и память почти незаметна.


Хабы, поддерживающие данное дополнение:

Aquila
BDCH (планируется)
DDCH
tkhub
YnHub (планируется)
NitroHub (> 0.7)

Клиенты, поддерживающие данное дополнение:

DCDM++
iDC++
McDC++
Z++
9.8.2009, 13:30 ! Часто Задаваемые Вопросы !
Обязательно прочитать всем!!!
Как сделать оповещение в ОпЧат о слишком большой шаре пользователя?

Код
local iShareLimit = 15 * 0x100000 * 0x100000 -- 15 ТБ
local sReport = "Подозрительно большая шара у пользователя: "

function MyINFOArrival(tUser, sData)
  Core.GetUserData(tUser, 16)
  if tUser.iShareSize >= iShareLimit then
    Core.SendToOpChat(sReport..tUser.sNick.." ["..tUser.sIP.."]. Шара: "..tUser.iShareSize)
  end
end
Invisible
8.8.2009, 16:41 Словить 3ий аргумент в lua...
Помогите дописать...
Учись работать с описаниями функций.

Выдержка из файла scripting-interface.txt:
Цитата
Ban(tUser, sReason, sBy, bFull) - Perm ban user. Return nil when failed, true if success.
BanIP(sIP, sReason, sBy, bFull) - Perm ban given ip. Return nil when failed, true if success.


Поэтому должно быть так:
Код
BanMan.BanIP(sIP, sReason, tUser.sNick, 0)


В случае же использования функции Ban нужно ставить не ip, а таблицу пользователя!


P.S.
bad argument #1 to 'Ban' (table expected, got string) - переводится так: в первом аргументе функции 'Ban' ожидается таблица, а туда подставляется строка.
Win32
8.8.2009, 15:28 Фильмы/Сериалы
Кому что нравится..
Какие ещё скрипты? Смотри на название раздела))))
Uncle_Dif
8.8.2009, 10:15 Словить 3ий аргумент в lua...
Помогите дописать...
Ты всё правильно написал.
Код
local sCmd, sIP, sNick, sReason = sData:match"%b<>%s+(%S+)%s+(%S+)%s+(%S+)%s+(.+)


Данное регулярное выражение в методе будет действовать следующим образом:

%b<> - поиск в строке символов <> (не обязательно подряд идущих) - обрезание ника
%s+ - 1 или более пробельных символов
(%S+) - захват одного или более не пробельных символа и запись в переменную sCmd
%s+ - опять 1 или более пробельных символов
(%S+) - захват одного или более не пробельных символа и запись в переменную sIP
%s+ - опять 1 или более пробельных символов
(%S+) - захват одного или более не пробельных символа и запись в переменную sNick
%s+ - опять 1 или более пробельных символов
(.+) - захват всего оставшегося, то есть захват любого символа или символов (минимум 1 символ)


Однако, чтобы пользователь наверняка вводил ip адрес, лучше написать так:
Код
local sCmd, sIP, sNick, sReason = sData:match"%b<>%s+(%S+)%s+(%d+%.%d+%.%d+%.%d+)%s+(%S+)%s+(.+)
Win32
6.8.2009, 11:19 Несколько Слов О Захватах И Регулярных Выражениях
исключительно для разработчиков
Это конечно же не относится к регулярным выражениям, однако очень часто используется до захвата данных.

Речь идёт о методе sub (или функции string.sub). Данный метод (функция) служит для обрезания строк или для выделения подстрок.
Код
sData = sData:sub(s, e)

В переменную sData будет возвращена подстрока строки sData начиная с позиции s и заканчивая позицией e. s и e могут быть также отрицательными. В случае когда они положительные, всё понятно, например sData:sub(3, 6). Тут этот метод возьмёт из sData с третьего до шестого символа включительно. Если же sData:sub(-5, -2), то метод возьмёт из sData со второго до пятого символа включительно, но уже отсчёт позиций будет идти с конца строки. В этой функции последний параметр является необязательным, т.е. можно написать sData:sub(2), в этом случае последний параметр берётся по умолчанию -1. Если последний параметр равен -1 - это означает, что строка берётся до конца, в данном примере со второго символа и до конца.

Пример строки:
Код
<НИК> Пример.|

Составим таблицу для большей наглядности:
Код
'символ', 'позиция от начала', 'позиция от конца'
'<',    '1',    '-14'
'Н',    '2',    '-13'
'И',    '3',    '-12'
'К',    '4',    '-11'
'>',    '5',    '-10'
'пробел',    '6',    '-9'
'П',    '7',    '-8'
'р',    '8',    '-7'
'и',    '9',    '-6'
'м',    '10',    '-5'
'е',    '11',    '-4'
'р',    '12',    '-3'
'.',    '13',    '-2'
'|',    '14',    '-1'


Последний символ | мы не видим, но он есть, этот символ не выводится в чат, но позволяет скрипту определять конец строки, поэтому в случае использования кода sData:sub(1, -2) как раз таки мы избавляемся от этого символа, т.е. берём строку начиная с первого символа и, заканчивая вторым с конца, так как первый с конца это символ |.

А вообще, применяют чаще всего этот метод чтобы отсечь ник и символ | и оставить только данные, посылаемые в чат, вот так:
Код
sData = sData:sub(tUser.sNick:len() + 4, -2)
Nickolya, Tsd, Invisible, BeN
6.8.2009, 10:45 Словить 3ий аргумент в lua...
Помогите дописать...
2Win32: Почитай тему: http://mydc.ru/topic266.html
Win32
5.8.2009, 20:18 Словить 3ий аргумент в lua...
Помогите дописать...
Код
BanMan.Ban(sNick, sReason, tUser.sNick, true)
Win32
5.8.2009, 17:53 Словить 3ий аргумент в lua...
Помогите дописать...
Код
function ChatArrival(tUser, sData)
  sData = sData:sub(1, -2)
  local sCmd, sNick, sReason = sData:match"%b<>%s+(%S+)%s+(%S+)%s+(.+)"
  if sCmd and sCmd == "!ban" then
    Core.SendToAll("<"..BotName.."> Пользователь "..sNick.." навсегда лишен права доступа на хаб по причине: "..sReason..". Наказал: "..tUser.sNick)
  end
end
Win32
5.8.2009, 15:23 Точное Время
Помогите, скачал скрип а он не пашет.
Не стал глубоко разбираться в кривом скрипте, однако немного подправил

[attachment=3015:tochnoe_vremya.lua]

Дальше сам подправляй.
Очень кривой скрипт! Легче заново было написать, чем править эту кривизну.
Men
5.8.2009, 14:43 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Код
local tRanks = {
  {"10.0.0.0", "10.255.255.255"},
  {"192.168.0.0", "192.168.255.255"}
}

function Ip2Num(sIP)
  local a, b, c, d = sIP:match"^(%d+)%.(%d+)%.(%d+)%.(%d+)$"
  return a * 16777216 + b * 65536 + c * 256 + d
end

function OnStartup()
  for k, v in ipairs(tRanks) do
    tRanks[k][1], tRanks[k][2] = Ip2Num(v[1]), Ip2Num(v[2])
  end
end

function UserConnected(tUser)
  local iIP = Ip2Num(tUser.sIP)
  for _, v in ipairs(tRanks) do
    if iIP > v[1] and iIP < v[2] then
      return
    end
  end
  Core.Disconnect(tUser)
end

RegConnected, OpConnected = UserConnected, UserConnected
Syndicate
4.8.2009, 16:11 Антипрокси под API2
Прежде чем постить, нужно юзать поиск!
мамин_парень
15.7.2009, 18:57 Anekbot
API2 | Анекдоты из Интернета
не не не
Наоборот:

Код
TimerID = TmrMan.AddTimer(tCfg.Time*60*1000,"OnTimer")


и

Код
function OnTimer()
...
end
engineer
11.7.2009, 22:54 Вопрос по скрипту регистрации
API2
Ага. Я немного неверно написал. Пардон. Действительно оба должны быть истинными при конъюнкции.

Да да, ты верно расписал правила двоичной логики big_smile.gif
fixx
11.7.2009, 12:48 Вопрос по скрипту регистрации
API2
2district: Всё очень хорошо изложил, но вот по пункту 2 как раз таки наоборот.
Цитата(district @ 11.7.2009, 3:14) *
2.Не хватает общих скобок для всего выражения
Это самое явное. Т.е. должно быть так:
Код
local _,_,ip1,ip2 = e:find("(%d+%p%d+%p%d+%p%d+)%-(%d+%p%d+%p%d+%p%d+)")


Если у функции (или метода) всего лишь один аргумент, и этот аргумент является строкой без конкатенаций, то скобки можно и даже нужно опускать:
Код
local _,_,ip1,ip2 = e:find"(%d+%p%d+%p%d+%p%d+)%-(%d+%p%d+%p%d+%p%d+)"


Так как нагромождение скобками ухудшает читабельность кода, и скобки увеличивают размер кода big_smile.gif

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

Приведу пару примеров функций без скобок:
Код
MyFunc1"Всем пивет"
MyFunc2{[1] = 1, [2] = 1}
district
8.7.2009, 15:23 жалобная книга + MySQL
Юзеры могут пожаловаться на админов =)
метод dbformat экранирует одиночную кавычку для внесения данных в бд.
fixx
6.7.2009, 19:37 Cleanreg
API2 | Скрипт чистки регистраций
строка 141:
Код
Вас небыло на хабе "..td.." дней


Код
Вас небыло на хабе "..string.format("%.0f", td).." дней


Если конечно это та самая строка. Ту фразу, которая была написана я в скрипте не нашёл)))) В скрипте фраза:
Код
"<"..Bot.."> Hey "..user.sNick..
", we've missed you for the last "..td.." days.|"
fixx
3.7.2009, 15:50 Ищу разработчиков ADC Хабов
обменяться мнениями.
Хаб кроссплатформенный?

Я начал описывать протокол в разделе для разработчиков.
Steep
3.7.2009, 14:42 Ждущий режим
Будет ли нормально функционировать хаб?
В ждущем режиме оперативная память остаётся не тронутой, однако, любое функционирование будет отсутствовать, так как процессор в ждущем режиме отключается.

Поэтому, скорее всего, после выхода из длительного ждущего режима хаб сразу же сбросит всех пользователей.
Со стороны клиентов думаю, что будет следующее: клиент отправляет сообщение или команду на хаб, но не получает с хаба ответа и в скором времени клиент закроет соединение с таким хабом.
NikseR
29.6.2009, 14:21 идея, которая позволит избавиться от пассивных юзеров в DC :)
ИМХО дурная идея.
Перекраивать протокол никто не собирается!

Если данная идея и будет реализована, то я как актив сделаю следующее: по средствам файрвола заблокирую все входящие соединения, а разрешу только исходящие. Таким образом я буду качать, но никогда я не буду в роли медиатора)))
степашка
27.6.2009, 23:45 Checker
API2 | Детектор чата и привата
Данный скрипт нельзя переделать. Если ты знаешь как это сделать, то ты сможешь обойтись и без этого скрипта.

И не надо больше оффтопить))
мамин_парень
26.6.2009, 14:34 StatisticsMySQL
API2 | Скрипт сбора статистики
При написании скриптов с базой данных, нужно аккуратно подходить к их написанию.
Утечка памяти в скрипте может сильно сказаться в будущем и привести к падению скрипта через некоторое время стабильной работы.
В данном скрипте существует утечка. Думаю, что во всех скриптах этой ветки есть эта утечка. Автор просто игнорирует курсоры как объекты, и считает их за обычные lua переменные.
mariner
24.6.2009, 2:25 zK++ for Op's
Клиент для ОПераторов.
А что так сложно перевести?
Вот я накатал русик под zK++:

[attachment=2717:russian.xml]
мамин_парень
21.6.2009, 15:12 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
self - это и есть tTable, но в неявном виде.
Только вместо функции надо вызывать метод. Вот так будет работать:
Код
tTable = {
  bWork = true,
  Func = function(self)
    if self.bWork then
      SendToNick("[INT]district", "РАБОТАЕТ")
    end
  end
}

function Main()
  tTable:Func()
end


Когда мы пишем tTable:Func(), то это равносильно записи tTable.Func(tTable). Теперь должно быть понятно, что в качестве параметра self в методе выступает таблица.

Можно пойти намного дальше и реализовать так называемый "принцип полиморфизма":
Код
tTable = {
  bWork = true,
  Func = function(self)
    if self.bWork then
      SendToNick("[INT]district", "РАБОТАЕТ")
    else
      SendToNick("[INT]district", "НЕ РАБОТАЕТ")
    end
  end
}

tTable2 = {
  bWork = false,
}

function Main()
  tTable.Func(tTable2)
end

Вот последний пример это уже некое подобие полиморфизма в ООП.
district
20.6.2009, 12:20 Anekbot
API2 | Анекдоты из Интернета
Ошибка, на самом деле, переводится так: в строке 270 у функции 'random' плохой второй аргумент (пустой интервал). Другими словами второй аргумент TotalAneks равен значению nil. Смотрим далее, где у нас определяется переменная TotalAneks. Она определяется в строке 68: TotalAneks = GetTotalAneks(). Ищем функцию GetTotalAneks(), строка 251. Видим, что эта функция читает данные из файла localbase. Ищем переменную localbase. Находим её в строке 14. Теперь нам должно быть понятно, что дело в путях.

Это означает что в данном скрипте не правильно прописаны пути.
замени
Код
path = "scripts/"
на
Код
path = Core.GetPtokaXPath().."scripts/"
Sekretchik
19.6.2009, 20:35 От: Комнаты (чатрумы) Rooms
От темы с ID: 1443
Не путай темы.
Tarantul13
19.6.2009, 20:23 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Изменения именно в файле - вот что имелось ввиду. То есть за всё время работы скрипта функция require загрузить в память код только 1 раз, при последующих обращениях во время работы скрипта к данной функции она будет брать уже загруженный код.
district
17.6.2009, 14:02 Создание Контекстных Менюшек Средствами Клиента
Со стороны клиента - нельзя, клиент работает исключительно по протоколу. Отослав на хаб неизвестную команду, хаб в праве закрыть соединение с таким клиентом.
Uncle_Dif
15.6.2009, 19:24 Релизы с phpbb3 форума/трекера..
1. Прежде чем работать с курсором нужно проверить открыт ли он?
2. Курсоры лучше делать не глобальными, а локальными переменными.
3. Курсоры нужно всегда закрывать после работы с ними!
Nickolya, Jaska
13.6.2009, 15:41 Описание Протокола ADC
Advanced Direct Connect Protocol
5.3. Команды
Основные команды протокола ADC

SdimS, Invisible
13.6.2009, 15:33 Описание Протокола ADC
Advanced Direct Connect Protocol
5.2. Клиент – Клиент взаимодействие

Клиент - клиент соединение использует ту же самую последовательность входа, что и клиент - хаб соединение, исключая стадию VERIFY и команды GPA/PAS.
Поддержка VERIFY/GPA/PAS должны объявляться дополнениями.
Клиент, который первый отослал команду CTM/RCM, будет контролировать соединение, после достижения между клиентами стадии NORMAL.
SdimS, Invisible
13.6.2009, 15:31 Описание Протокола ADC
Advanced Direct Connect Protocol
5.1. Клиент – Хаб взаимодействие

Вход на хаб имеет определённую последовательность.
Непосредственно сам вход осуществляется на стадии под названием NORMAL.

Последовательность входа на хаб (стадии):
  1. PROTOCOL - отсылка поддерживаемых характеристик
  2. IDENTIFY - идентификация пользователя, статические проверки
  3. VERIFY - проверка пароля
  4. NORMAL - нормальная операция
  5. DATA - для двоичных передач



Последовательность входа на хаб:

Код
Клиент -> Хаб: HSUP ADBASE ADTIGR ...
Хаб -> Клиент: ISUP ADBASE ADTIGR ...
Хаб -> Клиент: ISID <Client-SID> ...
Хаб -> Клиент: IINF HU1 HI1 ...
Клиент -> Хаб: BINF <My-SID> ID... PD...
Хаб -> Клиент: IGPA ...
Клиент -> Хаб: HPAS ...
Хаб -> Клиент: BINF <To All Clients>
Хаб -> Клиент: BINF <Client-SID>


В отличие от NMDC протокола, в ADC протоколе первая команда следует со стороны клиента, а не со стороны хаба.
Invisible
13.6.2009, 15:11 Описание Протокола ADC
Advanced Direct Connect Protocol
5. Команды характеристики BASE

ADC клиенты/хабы, которые поддерживают основные команды должны отсылать характеристику "BASE" на стадии PROTOCOL.

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

Направления передачи определяет то, каким образом команда может быть получена/послана. Хабы и клиенты могут поддерживать в дополнениях и другие направления передачи, однако, для характеристики BASE определены следующие направления:

  • F (From)
    От хаба (хаб-клиент TCP)
  • T (To)
    К хабу (хаб-клиент TCP)
  • C (Client)
    Между клиентами (клиент-клиент TCP)
  • U (UDP Client)
    Между клиентами (клиент-клиент UDP)


Далее, в описаниях команд, первый символ, который отвечает за направление, будет опускаться.
Invisible
11.6.2009, 17:37 Алгоритм работы поиска в DC
Как работает поиск
1) Сортировка источников одного файла идет по мере поступления результатов поиска. Это наиболее оптимальный вариант, так как клиент просто дописывает в конец вновь поступившие источники.
2) Сортировку по разным файлам выбирает сам пользователь. Обычно, по умолчанию, установлена сортировка по количеству источников.
3) Каждый клиент отсылает максимум 5 результатов поиска для пассивных пользователей и 10 для активных.
4) Результаты активного поиска передаются непосредственно между клиентами (без участия хаба). Результаты пассивного поиска проходят через посредника, в роли которого выступает хаб. Хаб, в свою очередь, дабы снять нагрузку по пересылке пользователям этих данных, может ограничить количество результатов поиска. Ограничение результатов пассивного поиска - это значительная оптимизация работы хаба. Например, у меня в настройках хаба установлено - возвращать пользователю при пассивном поиске всего 3 результата, то есть я придерживаюсь простой логике: хочешь хороший поиск - юзай активный режим. Те, кто вынуждены находиться в пассиве, ограничены в возможностях поиска, однако таких меньшинство, и для них действую правила: пиши запрос конкретнее, дабы он попал в 3 результата big_smile.gif
bestnokia
10.6.2009, 15:55 Объектно-Ориентированное Программирование в Lua
Создание и использование классов
Глобальные функции и переменные модуля class.lua

Глобальные переменные:

class - "конструктор" класса. Переменная, отвечающая за создание класса.

Два эквивалентных метода создания простого класса:
1)
Код
class.MyClass{}

2)
Код
MyClass = class("MyClass", {})


Глобальные функции:

virtual(class) - функция, превращающая обычного класса в виртуальный класс.

typeof(value) - расширенная функция определения типа переменной. Возвращает "class", если переменная является классом, "virtual_class" - если переменная представляет из себя виртуальный класс, "object" - если переменная является объектом какого-то класса, а во всех остальных случаях возвращает lua тип переменной, то есть работает как обычная lua функция type().

classof(value) - функция возвращает переменную, если она является классам, в противном случае возвращает nil.

classname(value) - функция возвращает имя класса, если переменная является именованым классом, иначе возвращает nil.

implements(value, class) - функция проверяет, что объект или класс (value) поддерживает интерфейс целевого класса (class). Это означает, что объект или класс может быть подставлен в качестве аргумента в функцию, которая ожидает целевой класс. Мы рассматриваем только элементы класса, которые могут вызываться из класса, то есть вызываемые элементы (функции и таблицы).

is_a(value, class) - функция проверяет содержится ли указанный объект или класс (value), в целевом классе (class). Проверка начинается с самого объекта (или класса), и идёт по цепочке наследования вглубь до целевого класса. Если целевой класс найден, то происходит проверка поддержки интерфейсов (данная функция может вернуть false в механизме множественного наследования, из-за неоднозначностей).
Saymon21, serg_58
7.6.2009, 18:40 Объектно-Ориентированное Программирование в Lua
Создание и использование классов
Примеры использования классов:
(Быстро накатал - не судите строго)

Код
class.cutility {
  SomeFunction = function(self)
  end;
}

class.cbase {
}

class.cplagin (cutility, cbase, {
  name;
  desc;
  __init = function(self, sName, sDesc)
    self.name = sName
    self.desc = sDesc
  end;
})

--создание объектов класса

mPlagin = cplagin("myFirstPlagin", "ForTest") -- вызов конструктора __init


Существую классы, в которых мы можем описывать то, что нам нужно и существуют объекты, которые строятся на основании классов.

Свой класс можно создать двумя способами:

1)

Код
class.NameOfClass ([<наследуемый_класс>, <наследуемый_класс>, ..., ]{таблица с элементами класса})

в [скобках] - необязательные параметры

2)

Код
NameOfClass = class(["NameOfClass", ][<наследуемый_класс>, <наследуемый_класс>, ... , ]{таблица с элементами класса})


в данном примере класс cplagin наследует классы cutility и cbase. Поэтому в классе cplagin мы можем вызывать функции классов cutility и cbase.

Да, совсем забыл сказать, что для использования классов нужно подключить файл class.lua, который выложен в топике: http://mydc.ru/index.html?showtopic=1429&a...ost&p=15699
Файл кладётся в папку libs (либо в папку с ptokax.exe). Подключается так:
Код
require"class"


Такое подключение файла в lua аналогично подключению заголовочный файлов в с++
Saymon21
4.6.2009, 23:41 Отсылка в ЛС скачивающим у меня
Ну это само собой.
У хаба нет возможности отследить скачивание каждого файла. Есть только возможность отследить установку соединения между пользователями, и пока это соединение будет установлено будут качаться файлы. А для скачки ли устанавливалось соединение, или просто так посмотреть, хаба вовсе не заботит, его дело направить пользователей для их соединения между собой. Скачка не производится через хаб, а происходит между пользователями напрямую!!!


Код
local sMsg = "*** Connecting: [NICK]"
local sBot = "Bot"

function ConnectToMeArrival(tUser, sData)
  local sNick = sData:match"(%S+) %S+$"
  if sNick then
    Core.SendPmToNick(sNick, sBot, tostring(sMsg:gsub("%[NICK%]", tUser.sNick)))
  end
end
Uncle_Dif, мамин_парень
2.6.2009, 23:01 Описание Протокола ADC
Advanced Direct Connect Protocol
4.2. Файл-лист

files.xml - список файлов, предназначенных для просмотра. Этот список должен удовлетворять следующей XML схеме:

HTML
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="base32Binary">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Za-z2-7]+"></xs:pattern>
</xs:restriction>
</xs:simpleType>

<xs:simpleType name="zeroOne">
<xs:restriction base="xs:int">
<xs:enumeration value="0"></xs:enumeration>
<xs:enumeration value="1"></xs:enumeration>
</xs:restriction>
</xs:simpleType>

<xs:complexType name="ContainerType">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:element ref="Directory"></xs:element>
<xs:element ref="File"></xs:element>
<xs:any processContents="lax"></xs:any>
</xs:choice>
</xs:sequence>
</xs:complexType>

<xs:attribute name="Base" type="xs:string"></xs:attribute>
<xs:attribute name="CID" type="base32Binary"></xs:attribute>
<xs:attribute name="Generator" type="xs:string"></xs:attribute>
<xs:attribute name="Incomplete" type="zeroOne" default="0"></xs:attribute>
<xs:attribute name="Name" type="xs:string"></xs:attribute>
<xs:attribute name="Size" type="xs:int"></xs:attribute>
<xs:attribute name="Version" type="xs:int"></xs:attribute>

<xs:element name="FileListing">
<xs:complexType>
<xs:complexContent>
<xs:extension base="ContainerType">
<xs:attribute ref="CID" use="required"></xs:attribute>
<xs:attribute ref="Version" use="required"></xs:attribute>
<xs:attribute ref="Generator" use="optional"></xs:attribute>
<xs:attribute ref="Base" use="required"></xs:attribute>
<xs:anyAttribute processContents="lax"></xs:anyAttribute>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>

<xs:element name="Directory">
<xs:complexType>
<xs:complexContent>
<xs:extension base="ContainerType">
<xs:attribute ref="Name" use="required"></xs:attribute>
<xs:anyAttribute processContents="lax"></xs:anyAttribute>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>

<xs:element name="File">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded"></xs:any>
</xs:sequence>
<xs:attribute ref="Name" use="required"></xs:attribute>
<xs:attribute ref="Size" use="required"></xs:attribute>
<xs:anyAttribute processContents="lax"></xs:anyAttribute>
</xs:complexType>
</xs:element>

</xs:schema>


Пример файл-листа:

HTML
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<FileListing Version="1" CID="mycid" Generator="DC++ 0.701" Base="/">
<Directory Name="share">
<Directory Name="DC++ Prerelease">
<File Name="DCPlusPlus.pdb" Size="17648640" TTH="xxx" />
<File Name="DCPlusPlus.exe" Size="946176" TTH="yyy" />
</Directory>
<File Name="ADC.txt" Size="154112" TTH="zzz" />
</Directory>
<!-- Только при использовании частичного файл-листа -->
<Directory Name="share2" Incomplete="1"/>
</FileListing>


"encoding" должен быть всегда установлен в UTF-8. Клиенты должны иметь возможность оперировать с XML фалами как с BOM (byte order mark) так и без такового.

"Version" не изменяется, если не изменяется структура файла.

"CID" - это CID клиента, который генерирует файл-лист.

"Generator" - это опция для информативной цели.

"Base" - используется в частичных файл-листах, но также должно присутствовать и в простых файл-листах.

"Incomplete" - сигнализирует о том, что в частичном файл-листе содержатся не включённые в список пункты. "1" - означает, что директория содержит не включённые в список пункты, "0" - не содержит таковых. Incomplete="0" - по умолчанию и таким образом может быть опущено.

Дополнительная информация может быть добавлена в файл расширениями/дополнениями, но не гарантировано, что эта информация будет прочитана другими клиентами.
Invisible, Saymon21
2.6.2009, 22:44 Описание Протокола ADC
Advanced Direct Connect Protocol
4. Файлы

4.1. Имена файлов и структура

Имена файлов отсчитываются от относительного (вымышленного) корня в шаре пользователя. "/" - разделитель директорий; каждый файл или имя директории должно быть уникальным в регистро-независимом контексте. Все печатные символы, включая пробел, допустимы в имени файла, символы "/" и "\" экранируются символом "\". Клиенты должны использовать фильтры для имён под свои файловые системы, имена файлов, полученные от других клиентов, должны также подчиняться этим правилам. Специальные имена "." и ".." не могут содержаться в директории или имени файла; любой полученный файл-лист, содержащий эти имена должен быть проигнорирован. Все имена директорий должны оканчиваться на "/".

Расшаренные файлы идентифицируются относительно безымянного корня "/" ("/dir/subdir/filename.ext"), тогда как дополнения могут добавить имя корня. Например, "TTH/…" для TIGR дополнения используют имя корня "TTH" для идентификации файлов по их "Tiger Tree Hash". Это недопустимо для имён из безымянного корня, которые попали в шару с идентификатором по контрольной сумме.

Без корневое имя файла "files.xml" определяет полный файл-лист, в формате XML в кодировке UTF-8. Клиентам рекомендуется использовать дополнения чтобы сжимать данный файл-лист.

Дополнения могут добавлять к имени файла свои расширения, обычно это делается для того, чтобы избежать повторения имён.

Специальный тип "list" используется для просмотра списков файлов. Частичный файловый список имеет ту же структуру, что и нормальный список, но директории могут быть теговыми с атрибутом Incomplete="1", который показывает на частичность. Только директории без корневых файлов могут начинаться с символа "/". Содержимое такой директории в последствии будет послано просящему клиенту на глубину, выбранную им (это нужно для отправки только того уровня, который требуется пользователю). Атрибут "Base" для поля "FileListing" определяет к какой конкретной директории принадлежит данный файл.
Invisible, Saymon21
2.6.2009, 22:39 Описание Протокола ADC
Advanced Direct Connect Protocol
3.5.3. CID

Идентификатор клиента глобально и публично идентифицирует уникальные клиенты и лежит в основе связи между клиентами. Он генерируется по PID по определённому алгоритму. Хаб должен регистрировать клиентов по CID-у. CID должен оставаться неизменным в течении сессии. Клиенты должны уметь оперировать с CID-ми переменной длины.
Saymon21
2.6.2009, 22:35 Описание Протокола ADC
Advanced Direct Connect Protocol
3.5.2. PID

Приватный идентификатор глобально идентифицирует уникальных клиентов. Он используется при коннекте для генерации CID и не виден другим клиентам. PID генерируется для того, чтобы избежать конфузов. При генерации PID (при первом запуске клиента) используется текущее время и MAC адрес сетевой карты. Хабы и клиенты не должны раскрывать приватные идентификаторы другим клиентам, так как это нарушает безопасность ADC сетей. Клиенты должны иметь один и тот же PID в течение всей сессии на хабе.

Клиент отсылает на хаб данный идентификатор в команде INF. Хаб удаляет из команды INF этот идентификатор перед тем как отослать команду INF всем пользователям хаба.
Invisible, Saymon21
2.6.2009, 22:33 Описание Протокола ADC
Advanced Direct Connect Protocol
3.5.1. SID

Идентификатор сессии даётся клиенту на сессию, в течение которой он находится на хабе. Это идентификатор уникального пользователя на хабе, который назначается при входе на хаб. SID - 20-битный код, закодированный 4-байтной base32 строкой.
Invisible, Saymon21
2.6.2009, 22:29 Описание Протокола ADC
Advanced Direct Connect Protocol
3.5. Идентификация клиента

Каждый клиент идентифицируется по трём различным идентификаторам: идентификатор сессии - Session ID (SID), личный идентификатор - Private ID (PID) и идентификатор клиента - Client ID (CID).
Invisible, Saymon21
2.6.2009, 22:27 Описание Протокола ADC
Advanced Direct Connect Protocol
3.4. Хеш-функции

Некоторые команды используются для определяния хеш-функций. При установке каждого нового соединения по команде SUP происходит обмен хеш-функциями. При коннекте клиент передаёт серверу несколько хеш-функций посредствам параметров команды SUP. Сервер вбирает одну из них и передаёт её клиенту, поставив её до любой другой хеш-функции в команде SUP, которая отправится с сервера. Клиент и хаб должны иметь по крайней мере одну одинаковую хеш-функцию, которая будет использоваться в протоколе и в файловой идентификации.
Invisible
2.6.2009, 22:23 Описание Протокола ADC
Advanced Direct Connect Protocol
3.3. Типы команд

Тип команды (определяющий символ, находящийся в начале команды) определяет то, каким образом отсылать эту команду. Клиенты, как получатели, используют ограниченный набор типов для рассылки. Клиенты должны использовать типы только для того, чтобы помочь себе распарсить команду, иначе команда должна игнорироваться. Итак, определены следующие типы (префиксы) команд:

B (Broadcast)
Хаб должен отослать команду всем подключенным клиентам, включая и самого отправителя.

C (Client message)
Клиенты должны использовать эту команду только для прямого соединения по протоколу TCP.

D (Direct message)
Хаб должен отправить эту команду для пользователя с указанным sid.

E (Echo message)
Хаб должен отправить команду для пользователей с sid и my_sid.

F (Feature broadcast)
Хаб должен отослать эту команду всем клиентам, которые поддерживают(+)/не поддерживают(-) данную характеристику. Поддержка клиентом той или иной характеристики определяется из поля SU, которое содержится в команде INF, отсылаемой клиентом.

H (Hub message)
Клиенты должны использовать данный тип для отсылки команды, которая предназначена только хабу.

I (Info message)
Хабы должны использовать данный тип для отсылки команды, которая не была отослана другим клиентом.

U (UDP message)
Клиенты должны использовать эту команду только для прямого соединения по протоколу UDP.
Invisible
2.6.2009, 22:17 Описание Протокола ADC
Advanced Direct Connect Protocol
3.2. Синтаксис команд

Код
message               ::= message_body? eol
message_body          ::= (b_message_header | cih_message_header | de_message_header | f_message_header | u_message_header | message_header)
                          (separator positional_parameter)* (separator named_parameter)*
b_message_header      ::= 'B' command_name separator my_sid
cih_message_header    ::= ('C' | 'I' | 'H') command_name
de_message_header     ::= ('D' | 'E') command_name separator my_sid separator target_sid
f_message_header      ::= 'F' command_name separator my_sid separator (('+'|'-') feature_name)+
u_message_header      ::= 'U' command_name separator my_cid
command_name          ::= simple_alpha simple_alphanum simple_alphanum
positional_parameter  ::= parameter_value
named_parameter       ::= parameter_name parameter_value?
parameter_name        ::= simple_alpha simple_alphanum
parameter_value       ::= escaped_letter+
target_sid            ::= encoded_sid
my_sid                ::= encoded_sid
encoded_sid           ::= base32_character{4}
my_cid                ::= encoded_cid
encoded_cid           ::= base32_character+
base32_character      ::= simple_alpha | [2-7]
feature_name          ::= simple_alpha simple_alphanum{3}
escaped_letter        ::= [^ \#x0a] | escape 's' | escape 'n' | escape escape
escape                ::= '\'
simple_alpha          ::= [A-Z]
simple_alphanum       ::= [A-Z0-9]
eol                   ::= #x0a
separator             ::= ' '
Invisible
2.6.2009, 22:11 Описание Протокола ADC
Advanced Direct Connect Protocol
3. Структура протокола

3.1. Основное

  • Все команды протокола начинаются с четырёх букв. Первая буква определяет то, как команда должна быть послана, следующие три показывают что должно быть выполнено.

  • Параметры разделяются пробелами, а каждая команда заканчивается символом переноса строки (код 0x0a). Экранируются элементы: "\s" - пробел, "\n" - новая строка и "\\" - обратный слеш. Данная версия протокола резервирует все остальные экранированные символы для возможного дальнейшего использования; любые команды, содержащие неизвестные экранированные символы, должны игнорироваться.

  • Все отсылаемые команды должны отправляться в кодировке UTF-8 - закодированный Юникод в С нормализации.

  • Клиенты должны игнорировать неизвестные/неправильные команды. Хабы должны игнорировать неправильные команды, и должны отсылать неизвестные команды, согласно их типу (префиксу).

  • Адреса клиентов должны быть определены в виде десятичных чисел, разделённых точками ("x.x.x.x") для IPv4 или в формате RFC (1884) для IPv6. Адреса хабов должны быть определены ссылкой с добавкой "adc" спереди, которая показывает специфику данного протокола ("adc://server:port/").

  • Числа отсылаются как строки в соответствии со стандартом плавающей точки, в качестве разделителя между целой дробной частью используется точка "." . Целыми являются числа без дробной части и без экспоненциальной добавки. Приложения должны иметь возможность оперировать с 64-битными положительными числами и с 64-битными числами с плавающей точкой. Префиксом отрицания является знак "-".

  • SID, PID, CID и короткие бинарные данные отсылаются как закодированные base32 строки. Длинные бинарные данные должны передаваться, используя файловый механизм передачи.

  • Имена расширений, протокольные имена и другой текст, не входящий в сообщения пользователя, могут включать только видимые символы, которые кодируются одним байтом в кодировке UTF-8 (Юникодные символы с номера 33 до 127). ADC - регистрозависим, и требует, чтобы имена команд были только в верхнем регистре.

  • Некоторые команды и функциональные зависимости требуют использования хешей. Хеш генерируется в процессе установки сессии и остаётся постоянной на протяжении всей этой сессии (SID).
Invisible, Saymon21
2.6.2009, 22:07 Описание Протокола ADC
Advanced Direct Connect Protocol
2. История версий

Последующие версии этого документа, а также промежуточные и более старые версии могут быть получены по адресу: https://dcplusplus.svn.sourceforge.net/svnr...s/trunk/ADC.txt. Эта версия представляется к ревизии: 923.
Данная версия: 1.0, 2007-12-01 (Первый релиз)
Invisible
2.6.2009, 22:04 Описание Протокола ADC
Advanced Direct Connect Protocol
1. Введение

ADC - это протокол для клиент-серверных сетей, на подобии Neo-Modus' Direct Connect (NMDC). Целью является создание простого протокола, который не нагружает ни клиент, ни сервер, и который можно расширять. В нём исправлены некоторые неудачные решения протокола NMDC, но не все.

Рассматриваются те же самые взаимодействия: клиент-клиент и клиент-сервер. Данная документация разделена на две части; первая часть описывает структуру протокола, вторая - специфичность системы протокола для использования этой структуры. Advanced Direct Connect - это первая версия, которая будет постепенно улучшаться.

Большинство идей для протокола пришли из проекта DCTNG (Jan Vidar Krey's). Основные участники разработки: Dustin Brody, Walter Doekes, Timmo Stange, Fredrik Ullner, Fredrik Stenberg и другие. Jon Hess посодействовал как создатель протокола NMDC.

Преимущества протокола:
  • SID, а также названия команд протокола, состоят из четырёх латинских символов в верхнем регистре. Протокол достаточно хорошо подходит для реализации на языке СИ. По стандарту языка СИ sizeof(char) == 1, то есть 4 символа будут занимать 4 байта, или могут быть представлены в виде четырёхбайтового целого числа. Преобразование строки в число и обратно значительно упрощает и оптимизирует работу с командами и даёт возможность хранить команду в виде объединения.


Недостатки протокола:
  • Разделителями протокола являются очень распространённые символы (пробел и перенос), которые нужно заменять на \s и \n. Так как эти символы очень распространены в сообщениях, то число замен будет всегда большим, чего не было в протоколе NMDC.
  • По сравнению с протоколом NMDC, в протоколе ADC есть возможность в UserCommand удалить определённое меню. Однако, по-прежнему отсутствует возможность удаления определённого меню в определённом контексте.
Invisible, Saymon21
2.6.2009, 22:01 Описание Протокола ADC
Advanced Direct Connect Protocol
Структурированное описание протокола Advanced Direct Connect (ADC), под управлением которого уже работают некоторые хабы.
Ссылка на оригинальное описание: http://adc.sourceforge.net/ADC.html

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


1. Введение
2. История версий
3. Структура протокола
3.1. Основное
3.2. Синтаксис команд
3.3. Типы команд
3.4. Хеш-функции
3.5. Идентификация клиента
3.5.1. SID
3.5.2. PID
3.5.3. CID

4. Файлы
4.1. Имена файлов и структура
4.2. Файл-лист

5. Команды характеристики BASE
5.1. Клиент – Хаб взаимодействие
5.2. Клиент – Клиент взаимодействие
5.3. Команды
STA
SUP
SID
INF
MSG
SCH
RES
CTM
RCM
GPA
PAS
QUI
GET
GFI
SND

6. Примеры
6.1. Связь Клиент – Хаб
6.2. Связь Клиент – Клиент

7. Стандартные дополнения/расширения
7.1. TIGR - поддержка TTH (Tiger Tree Hash)
7.2. BZIP – сжатие файл-листа пи помощи библиотеки bzip2
7.3. ZLIB - сжатие связи
7.3.1. ZLIB-FULL
7.3.2. ZLIB-GET
Nickolya, SdimS, Invisible, Saymon21
25.5.2009, 17:05 Скрипт бана читеров
использование greylink против читов
Вот накатал скрипт для бана читеров.
Используем грейлинк, для того, чтобы банить читеров big_smile.gif

Название скрипта: cheats-detector
Версия: 1.1
Автор: Setuper
Описание: Ловит несоответствия в размере шары. В действиях можно указать бан пользователя.
Команды:
/checkshare nick - проверка пользовтеля с указанным ником
/checkshare - проверка всех пользователей данного хаба
/luafile startup.lua - команда запуска скрипта
/lua dcpp = nil - команда остановки скрипта

Для работы скрипта в папке lua должны находиться библиотеки lua32.dll и dcutil32.dll (или соответствующие 64 разрядные)
Сам скрипт кидаем в папку scripts. Скрипт будет запускаться автоматически при старте клиента.

Открываем файл Settings/CustomMessages.ini и дописываем туда:
Код
/lua dcpp = nil
/luafile startup.lua
/checkshare
После этого можно будет не запоминать команды, а юзать меню "пользовательские сообщения".


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

Юзаем и отписываем сюда если что не так big_smile.gif


[attachment=2522:startup.lua]
мамин_парень
23.5.2009, 1:59 LFS
win32 - API 2 | Библиотека файловой системы
Библиотека работы с файловой системой.

Название: LuaFileSystem (LFS)
Версия API: 2
Версия библиотеки: 1.4.2
Версия LUA: 5.1
Авторы: Roberto Ierusalimschy, André Carregal, Tomás Guisasola

Подключение библиотеки:
Код
require"pxlfs"
Все функции библиотеки после подключения будут находиться в глобальной таблице lfs.

[attachment=2473:PXLFS.rar]
Invisible, Saymon21, DriverZX-10, MIKHAIL
20.5.2009, 17:41 Объектно-Ориентированное Программирование в Lua
Создание и использование классов
Доработки:

1) Добавлена возможность для описания функций и членов класса "внутри" самого класса.

Идентичные примеры:
Код
class.Account()

function Account:__init(initial)
    self.balance = initial or 0
end

function Account:deposit(amount)
    self.balance = self.balance + amount
end

function Account:withdraw(amount)
    self.balance = self.balance - amount
end

function Account:getbalance()
    return self.balance
end


Код
class.Account {

  __init = function(self, initial)
    self.balance = initial or 0
  end;

  deposit = function(self, amount)
    self.balance = self.balance + amount
  end;

  withdraw = function(self, amount)
    self.balance = self.balance - amount
  end;

  getbalance = function(self)
    return self.balance
  end;
}


Правила для объявления классов:
Код
class.MyClass([inherited,] [{members}])

Код
[local] MyClass = class(["MyClass",] [inherited,] [{members}])


2) Изменено название функции shared. Новое название: virtual. Думаю, что новое название более логично, а старое может только запутать. Данная функция служит для построения виртуальных классов, и она в точности реализует механизм виртуального наследования классов, как это происходит в языке С++.

3) Для того, чтобы таблица class приобрела свойства зарезервированного слова, запрещена запись в эту таблицу. Данная таблица используется исключительно для построения классов.

4) Исправлены все внутренние поля и локальные переменные с shared на is_virtual, дабы не вносить непонятности.

[attachment=2451:class.lua]
Saymon21
20.5.2009, 14:05 Объектно-Ориентированное Программирование в Lua
Создание и использование классов
Для того чтобы проследить работу с библиотекой классов и понять как всё это работает, предлагаю продебажить следующий простой пример. Дебажить можно с помощью средств LuaEdit.

Код
class.Account()

function Account:__init(initial)
    self.balance = initial or 0
end
function Account:deposit(amount)
    self.balance = self.balance + amount
end
function Account:withdraw(amount)
    self.balance = self.balance - amount
end
function Account:getbalance()
    return self.balance
end

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

class.NamedAccount(shared(Account))    -- shared Account base

function NamedAccount:__init(name, initial)
    self.Account:__init(initial) -- 10.00
    self.name = name or 'anonymous' -- 'John'
end

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

class.LimitedAccount(shared(Account))  -- shared Account base

function LimitedAccount:__init(limit, initial)
    self.Account:__init(initial) -- 10.00
    self.limit = limit or 0 -- 0.00
end

function LimitedAccount:withdraw(amount)
    if self:getbalance() - amount < self.limit then
       error 'Limit exceeded'
    else
       self.Account:withdraw(amount)
    end
end

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

class.NamedLimitedAccount(shared(NamedAccount), shared(LimitedAccount))

function NamedLimitedAccount:__init(name, limit, initial)
    self.NamedAccount:__init(name, initial) -- 'John', 10.00
    self.LimitedAccount:__init(limit, initial) -- 0.00, 10.00
end

-- widthdraw() disambiguated to the limit-checking version
function NamedLimitedAccount:withdraw(amount)
    return self.LimitedAccount:withdraw(amount)
end

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

myNLAccount = NamedLimitedAccount('John', 0.00, 10.00)
myNLAccount:deposit(2.00)
print('balance now', myNLAccount:getbalance())   --> 12.00
myNLAccount:withdraw(1.00)
print('balance now', myNLAccount:getbalance())   --> 11.00
--myNLAccount:withdraw(15.00)                    --> error, limit exceeded


[attachment=2675:screen.jpg]
Saymon21
17.5.2009, 23:02 Объектно-Ориентированное Программирование в Lua
Создание и использование классов
Библиотека построения именованых классов от разработчика lua.
Самая продвинутая реализация классов и практически всех принципов ООП, включая виртуальные классы!
[attachment=2423:classlib.lua]

Упрощённая библиотека построения безымянных классов от разработчика lua.
[attachment=2425:unclasslib.lua]

В дальнейшем мною будут выложены подкорректированные варианты, так как в данных вариантах мною были найдены мелкие недочёты.
Saymon21, xnt, dj--alex
11.5.2009, 11:38 У вас нет прав на просмотр этой темы
У вас нет прав на просмотр этого сообщения
степашка
6.5.2009, 15:02 Antibot
API2 | Скрипт против ботов
Название скрипта: Antibot
Версия API: 2
Автор: Setuper
Описание: Скрипт запрещает писать в чат или в приват незарегистрированному, пока пользователь не ответит на вопрос.


[attachment=2319:antibot.lua]
Invisible, Accelerator, Master-Grow, Pro009, shur49, Booth
3.5.2009, 18:20 От: Объектно-ориентированные Принципы В Lua
От темы с ID: 1429
Простой пример скрипта RegCmd на использование классов.

Содержит наглядные примеры использования в lua:
  • классов
  • объектов
  • модулей
  • передачи параметров по ссылке и по значению
  • инкапсуляции


Не содержит наглядных примеров на использование аппаратов наследования и полиморфизма (рассмотрено ранее).


[attachment=2304:example.rar]
MIKHAIL
27.4.2009, 14:32 ===> Прочитать перед использованием скриптов <===
ЧТО НЕОБХОДИМО ДЛЯ РАБОТЫ СКРИПТОВ
Все скрипты данной ветки форума работают с базой данных MySQL.

Поэтому, прежде чем качать скрипт, установите себе mysql сервер и соответствующие библиотеки.

Если у вас нету mysql сервера, то качаем его, например отсюда: http://www.mysql.ru/download/ (файл mysql-5.0.67-win32.zip)
Для удобного администрирования можно скачать утилиту mysql-gui-tools

Качаем архив http://mydc.ru/ipb.html?act=attach&type=post&id=1785
В архиве находится dll файл libmysql.dll и папка luasql с dll файлом mysql.dll. Обе эти дллелки нужны для работы бд.
Распаковываем архив в папку, где лежит файл ptokax.exe, и ничего никуда не перемещаем.
Для того, чтобы не засорять основную папку и для возможности более гибкого подключения модулей, в PtokaX предусмотрено создание папки libs, в которую и помещаются все DLL файлы. Поэтому можно создать папку libs (если она не была создана ранее) и распаковать архив с библиотеками в эту папку libs, а не в основную папку, где находится файл ptokax.exe.


И ещё. Все скрипты работают только на хабах с API 2, то есть на хабах PtokaX версии 0.4.0.0 и новее.



Более подробно в теме: http://mydc.ru/topic1508.html
Invisible, Kingston, Saymon21, shullz
23.4.2009, 11:18 У вас нет прав на просмотр этой темы
У вас нет прав на просмотр этого сообщения
степашка
22.4.2009, 22:40 У вас нет прав на просмотр этой темы
У вас нет прав на просмотр этого сообщения
степашка
22.4.2009, 10:38 У вас нет прав на просмотр этой темы
У вас нет прав на просмотр этого сообщения
степашка
21.4.2009, 19:23 Mysql
win32 - API 2 | Самая распространённая база данных
Экранирование в MySQL.

Для начала - немного о кавычках.
Если мы подставляем в запрос какие-либо данные, то, чтобы отличить эти данные от команд SQL, их надо брать в кавычки.
К примеру, если написать
Код
SELECT * FROM mytable WHERE name = Nick
то база решит, что Nick - это имя другого поля, не найдёт его, и выдаст ошибку. Поэтому подставляемые данные (в данном случае имя Nick) надо заключать в кавычки - тогда база сочтет его строкой, значение которой надо присвоить полю name:
Код
SELECT * FROM mytable WHERE name = 'Nick'
Однако, и в самих данных могут тоже встречаться кавычки. К примеру,
Код
SELECT * FROM mytable WHERE name = 'Д'Артаньян'
Здесь база данных решит, что 'Д' - это данные, а Артаньян - команда, которую она не знает, и тоже выдаст ошибку. Поэтому и надо прослешивать все данные, чтобы объяснить базе, что встречающиеся в них кавычки (и некоторые другие спецсимволы) относятся к данным.
В результате мы получим правильный запрос, который ошибок не вызовет:
Код
SELECT * FROM mytable WHERE name = 'Д\'Артаньян'


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


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

На самом деле, всё вышесказанное относится к данным строкового типа и датам. Числа можно вставлять не прослешивая и не окружaя кавычками. Если вы так делаете, то ОБЯЗАТЕЛЬНО! насильно приводите данные к нужному типу перед вставкой в запрос, например:
Код
id = tonumber(id)
Однако для простоты (и надёжности) можно и с числами работать, как со строками (проскольку mysql всё равно преобразует их к нужному типу). Соответственно, мы будем любые данные, вставляемые в запрос, прослешивать и заключать в кавычки.

Так же, есть ещё одно правило - необязательное, но его следует придерживаться во избежание появления ошибок:
Имена полей и таблиц следует заключать в обратные одинарные кавычки - `поле` (клавиша с этим символом находится на стандартной клавиатуре слева от клавиши "1") Ведь имя поля может совпадать с ключевыми словами mysql, но если мы используем обратную кавычку, то MySQL поймёт всё правильно:
Код
SELECT * FROM `WHERE` WHERE `DATE` = '2009-04-21'


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


Наиболее эффективное экранирование.

Для наиболее эффективного экранирования кавычек следует использовать функцию:
Код
_G.string.dbformat = function(self, ...)
  local t = {...}
  for k, v in _G.ipairs(t) do
    t[k] = _G.tostring(v):gsub("'", "\\'")
  end
  return self:format(_G.unpack(t))
end

Рассмотрим пример использования данной функции на примере вставки в таблицу данных:
Код
con:execute(("INSERT INTO `mytable` (`nick`, `ip`, `client`, `share`) VALUES
('%s', '%s', '%s', '%s')"):dbformat("Д'Артаньян", "192.168.0.1", "StrgDC++", 27635467))
Что мы сделали? Мы просто, так сказать, переопределили всем известный метод format, написав в качестве его аналога, метод dbformat, который выполняет тоже самое, что и метод format, но дополнительно к этому, он экранирует одинарные кавычки.
Invisible, Saymon21, Win32
13.4.2009, 14:43 Actions
Всем известный скрипт действий
Название скрипта: Actions
Версия: 1.1
Хаб: HeXHub
Автор: Setuper
Описание: Скрипт действий. Название говорит само за себя. Придумывайте и добавляйте свои действия.


[attachment=2547:actions.lua]
ANDRBEST, shur49
12.4.2009, 23:06 У вас нет прав на просмотр этой темы
У вас нет прав на просмотр этого сообщения
степашка
10.4.2009, 13:33 У вас нет прав на просмотр этой темы
У вас нет прав на просмотр этого сообщения
степашка

23 страниц V  « < 7 8 9 10 11 > » 
RSS Сейчас: 19.5.2024, 14:46