myDC.ru

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

 

> Модули для скриптов RusHub

Setuper
сообщение 9.1.2010, 21:27
Сообщение #1


Lua-master
**************

Группа: Модераторы
Сообщений: 4 064
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1389 раз




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

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


Модуль для работы с файлами: Прикрепленный файл  files.lua ( 1.34 килобайт ) Кол-во скачиваний: 357

Модуль различных утилит: Прикрепленный файл  utils.lua ( 1.77 килобайт ) Кол-во скачиваний: 133




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


Спасибо сказали:
Go to the top of the page
+Quote Post
2 страниц V   1 2 >  
Начать новую тему
Ответов
Accelerator
сообщение 9.1.2010, 21:31
Сообщение #2


Developer
******

Группа: Модераторы
Сообщений: 542
Регистрация: 11.11.2008
Из: Челябинск
Пользователь №: 1 075
Спасибо сказали: 216 раз




Цитата(Setuper @ 9.1.2010, 22:27) *
local function Serialize(tTable, sTableName, hFile, sTab)
sTab = sTab or ''
hFile:write(sTab..sTableName.." = {\n")
for k, v in base.pairs(tTable) do
if base.type(v) ~= "function" then
local sKey = base.type(k) == "string" and ("[%q]"):format(k) or ("[%d]"):format(k)
if base.type(v) == "table" then
Serialize(v, sKey, hFile, sTab..'\t')
else
local sValue = base.type(v) == "string" and ("%q"):format(v) or base.tostring(v)
hFile:write(sTab..'\t'..sKey.." = "..sValue)
end
hFile:write(",\n")
end
end
hFile:write(sTab.."}")
end

big_smile.gif
Go to the top of the page
+Quote Post
Setuper
сообщение 9.1.2010, 21:34
Сообщение #3


Lua-master
**************

Группа: Модераторы
Сообщений: 4 064
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1389 раз




Локальные функции не выходят за модуль, то есть они могут быть вызваны только внутри модуля, и не могут быть вызваны из скрипта

Для того чтобы было более понятно как использовать модули в скриптах, приведу простой пример на примере функции SaveTable:
Код
require"files" -- подключение модуля
Files.SaveTable(sFile, tTable, sTableName) -- Вызов функции модуля


Обратите внимание, что файл модуля у нас называется files.lua, а сам модуль имеет название Files (module"Files"). поэтому подключается модуль так: require"files", а вызываются функции модуля по таблице Files. (Files.SaveTable(sFile, tTable, sTableName)).
Go to the top of the page
+Quote Post
Accelerator
сообщение 9.1.2010, 21:35
Сообщение #4


Developer
******

Группа: Модераторы
Сообщений: 542
Регистрация: 11.11.2008
Из: Челябинск
Пользователь №: 1 075
Спасибо сказали: 216 раз




Цитата(Setuper @ 9.1.2010, 22:32) *
Локальные функции не выходят за модуль, то есть они могут быть вызваны только внутри модуля, и не могут быть вызваны из скрипта

В прикреплённом модуле ошибка big_smile.gif
Код
local function Serialize(tTable, sTableName, hFile, sTab)

а должно быть
Код
function Serialize(tTable, sTableName, hFile, sTab)

big_smile.gif
Go to the top of the page
+Quote Post
Setuper
сообщение 9.1.2010, 21:44
Сообщение #5


Lua-master
**************

Группа: Модераторы
Сообщений: 4 064
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1389 раз




Нет никакой ошибки. Я просто таким образом закрыл доступ к этой функции из вне модуля.
Это своего рода инкапсуляция.

Разве тебе пишет ошибку?
Смело используй функцию Files.SaveTable(sFile, tTable, sTableName)
Я конечно понимаю, что для тебя это немного по-новому, однако поверь, что тут всё грамотно написано.
Go to the top of the page
+Quote Post
Accelerator
сообщение 9.1.2010, 21:46
Сообщение #6


Developer
******

Группа: Модераторы
Сообщений: 542
Регистрация: 11.11.2008
Из: Челябинск
Пользователь №: 1 075
Спасибо сказали: 216 раз




Тогда извиняюсь...(
Go to the top of the page
+Quote Post
Setuper
сообщение 9.1.2010, 21:49
Сообщение #7


Lua-master
**************

Группа: Модераторы
Сообщений: 4 064
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1389 раз




Не нужно извиняться, лучше больше спрашивай что непонятно.
Go to the top of the page
+Quote Post
Accelerator
сообщение 9.1.2010, 21:56
Сообщение #8


Developer
******

Группа: Модераторы
Сообщений: 542
Регистрация: 11.11.2008
Из: Челябинск
Пользователь №: 1 075
Спасибо сказали: 216 раз




Тогда вот первый вопрос:
Цитата
.../Hub/scripts/texts.lua:20: attempt to call global 'LoadText' (a nil value)
Go to the top of the page
+Quote Post
Setuper
сообщение 9.1.2010, 22:04
Сообщение #9


Lua-master
**************

Группа: Модераторы
Сообщений: 4 064
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1389 раз




Files.LoadText

Теперь функции принадлежат определённым модулям и не являются глобальными, что ускоряет их вызов.
Go to the top of the page
+Quote Post
Accelerator
сообщение 9.1.2010, 22:17
Сообщение #10


Developer
******

Группа: Модераторы
Сообщений: 542
Регистрация: 11.11.2008
Из: Челябинск
Пользователь №: 1 075
Спасибо сказали: 216 раз




Цитата
.../Hub/scripts/texts.lua:21: bad argument #2 to 'SendToUser' (string expected, got nil)

Код
        Core.SendToUser(UID, Files.LoadText(sPath..sCmd..".txt"), sBot, sBot)

Что же теперь не так? :(
Go to the top of the page
+Quote Post
Setuper
сообщение 9.1.2010, 22:22
Сообщение #11


Lua-master
**************

Группа: Модераторы
Сообщений: 4 064
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1389 раз




Файл не найден, поэтому функция 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


Спасибо сказали:
Go to the top of the page
+Quote Post
Accelerator
сообщение 9.1.2010, 22:24
Сообщение #12


Developer
******

Группа: Модераторы
Сообщений: 542
Регистрация: 11.11.2008
Из: Челябинск
Пользователь №: 1 075
Спасибо сказали: 216 раз




Сейчас попробую

UPD: Работает! Спасибо.
Go to the top of the page
+Quote Post
Setuper
сообщение 13.1.2010, 16:54
Сообщение #13


Lua-master
**************

Группа: Модераторы
Сообщений: 4 064
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1389 раз




В функции LoadText модуля files.lua добавлена замена
Код
sMsg = sMsg:gsub("|", "&#124;")
для того, чтобы в сообщениях отображался символ вертикальной черты, и для того чтобы этот символ не служил разделителем команд.
Go to the top of the page
+Quote Post
Accelerator
сообщение 3.3.2010, 21:10
Сообщение #14


Developer
******

Группа: Модераторы
Сообщений: 542
Регистрация: 11.11.2008
Из: Челябинск
Пользователь №: 1 075
Спасибо сказали: 216 раз




Прикрепляю модуль киков. При использовании команды $kick юзера не отключало от хаба.
Прикрепленный файл  kick.lua ( 119 байт ) Кол-во скачиваний: 24

Установка:
1. Модуль кладём в папку libs
2. В любом скрипте(я добавил в BanManager.lua) добавляем в самом начале require "kick"


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 3.3.2010, 21:20
Сообщение #15


Lua-master
**************

Группа: Модераторы
Сообщений: 4 064
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1389 раз




Нет защиты от дурака.
То есть данную команду сможет применить любой пользователь против любого (даже самого админа), используя соответствующую RAW команду в своём клиенте.

Рекомендую все же в функции сделать проверку профиля.
Go to the top of the page
+Quote Post
Accelerator
сообщение 3.3.2010, 21:38
Сообщение #16


Developer
******

Группа: Модераторы
Сообщений: 542
Регистрация: 11.11.2008
Из: Челябинск
Пользователь №: 1 075
Спасибо сказали: 216 раз




Добавил.
Go to the top of the page
+Quote Post
Setuper
сообщение 3.3.2010, 22:11
Сообщение #17


Lua-master
**************

Группа: Модераторы
Сообщений: 4 064
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1389 раз




Не доступна только менюшка. Сама команда $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


Спасибо сказали:
Go to the top of the page
+Quote Post
Accelerator
сообщение 11.3.2010, 18:05
Сообщение #18


Developer
******

Группа: Модераторы
Сообщений: 542
Регистрация: 11.11.2008
Из: Челябинск
Пользователь №: 1 075
Спасибо сказали: 216 раз




Цитата(Setuper @ 9.1.2010, 22:27) *
Модуль различных утилит

Предлагаю добавить функцию преобразования шары.
Код
function DoShareUnits(iSize)
    local tShareUnits = {"Б", "КБ", "МБ", "ГБ", "ТБ", "ПБ"}
    local iTableSize = table.maxn(tShareUnits)
    local iSize = tonumber(iSize)
    local sUnits = ""
    for iTablePos = 1, iTableSize do
        if iSize < 1024 or iTablePos == iTableSize then
            sUnits = tShareUnits[iTablePos]
            break
        else
            iSize = iSize / 1024
        end
    end
    local sSize = string.format("%0.2f %s", iSize, sUnits)
    local sSize = string.gsub(sSize, "%.", ",")
    local _,_, s1stChar, s2ndChar = string.find(sSize, "%d+,(%d)(%d)")
    local s1stChar, s2ndChar = tonumber(s1stChar), tonumber(s2ndChar)
    if s2ndChar == 0 then
        sSize = string.gsub(sSize, ","..s1stChar..s2ndChar, ","..s1stChar)
        if s1stChar == 0 then
            sSize = string.gsub(sSize, ","..s1stChar, "")
        end
    end
    return sSize
end
Go to the top of the page
+Quote Post
Setuper
сообщение 11.3.2010, 20:58
Сообщение #19


Lua-master
**************

Группа: Модераторы
Сообщений: 4 064
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1389 раз




Добавил, немного оптимизировав big_smile.gif


Спасибо сказали:
Go to the top of the page
+Quote Post
Nickolya
сообщение 12.3.2010, 12:19
Сообщение #20


Главный ра******й тут...
*********

Группа: Главные администраторы
Сообщений: 1 784
Регистрация: 18.5.2008
Из: RF, 2la
Пользователь №: 1
Спасибо сказали: 682 раза




Пользуясь случаем задам вопрос, как будет лучше, определить вот эту таблицу в функции:
Код
  local tUnits = {"Б", "КБ", "МБ", "ГБ", "ТБ", "ПБ"}
или же в глобальном окружении самого модуля дабы потом только ссылаться на нее? И тогда бы уже на будущее сразу бы добавили остальные единицы измерения:
Код
  local tUnits = {"Б", "КБ", "МБ", "ГБ", "ТБ", "ПБ", "ЭБ", "ЗБ", "ЙБ"}
Go to the top of the page
+Quote Post

2 страниц V   1 2 >
Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No new Topic has attachmentsВопросы по RusHub
Технические вопросы
293 Jaska 29 224 Вчера, 16:26 Посл. сообщение: Axiator
No New Posts Панель управления типа pradmin на Verlihub и RusHub
4 po fenshyj' 216 20.5.2012, 12:56 Посл. сообщение: Saymon21
No New Posts ВАЖНО: Topic has attachmentsВопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
1 052 Wariner 135 947 15.5.2012, 18:19 Посл. сообщение: MIKHAIL
No new Topic has attachmentsRusHub. Пакеты для Ubuntu 10.04
42 KT315 9 793 26.3.2012, 20:01 Посл. сообщение: KT315
No new ВАЖНО: Topic has attachmentsСкрипт банов для RusHub
тестим и комменьтруем
78 Wariner 15 778 15.3.2012, 22:19 Посл. сообщение: ShadoWx
No New Posts Topic has attachmentsDefend Hub, RusHub edition
Полностью автоматическая защита хаба от активности ботов
6 Enyby 597 5.3.2012, 9:35 Посл. сообщение: Enyby
Closed ВАЖНО: Topic has attachmentsRusHub
Кроссплатформенный консольный DC хаб
57 Setuper 139 948 3.3.2012, 14:37 Посл. сообщение: Setuper
No New Posts Topic has attachmentsDefend Chat, RusHub edition
Полностью автоматическая защита чата от спама
1 Enyby 299 2.3.2012, 7:29 Посл. сообщение: ShadoWx
No New Posts Topic has attachmentsDefend PM, RusHub edition
Полностью автоматическая защита ЛС от спама
4 Enyby 478 1.3.2012, 10:17 Посл. сообщение: ShadoWx
No New Posts Сборка Rushub 2.3.8 на FreeBSD 9.0 x64
7 LEXSOR 693 24.2.2012, 21:57 Посл. сообщение: KT315
No New Posts От: Вопросы Разработчикам Скриптов
От темы с ID: 173
0 AirKobra45 159 21.2.2012, 13:32 Посл. сообщение: AirKobra45
No New Posts От: Вопросы Разработчикам Скриптов
От темы с ID: 173
0 AirKobra45 143 19.2.2012, 11:11 Посл. сообщение: AirKobra45
No New Posts ВАЖНО: Topic has attachmentsХаблист RusHub
11 ShadoWx 945 17.2.2012, 18:52 Посл. сообщение: ShadoWx
No new Ipv6 Test Hub RusHub
40 CrazyKiller 2 046 8.2.2012, 1:08 Посл. сообщение: CrazyKiller
No New Posts Topic has attachmentsСборка Rushub на платформе SUN (Oracle). OpenSolaris, Nexenta для x86
Патч для Rushub 2.3.8
6 KT315 721 4.2.2012, 15:48 Посл. сообщение: KT315

 



RSS Сейчас: 23.5.2012, 10:39