myDC.ru

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

 

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

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


RusHub team lead
**************

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




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

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


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

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




Давайте в этой теме обсуждать те функции, которые часто используются скриптами, и запихивать их в модули
Go to the top of the page
+Quote Post
2 страниц V   1 2 >  
Начать новую тему
Ответов
Accelerator
сообщение 9.1.2010, 20:31
Сообщение #2


Developer
******

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




Цитата(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, 20:34
Сообщение #3


RusHub team lead
**************

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




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

Для того чтобы было более понятно как использовать модули в скриптах, приведу простой пример на примере функции 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, 20:35
Сообщение #4


Developer
******

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




Цитата(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, 20:44
Сообщение #5


RusHub team lead
**************

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




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

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


Developer
******

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




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


RusHub team lead
**************

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




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


Developer
******

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




Тогда вот первый вопрос:
Цитата
.../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, 21:04
Сообщение #9


RusHub team lead
**************

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




Files.LoadText

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


Developer
******

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




Цитата
.../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, 21:22
Сообщение #11


RusHub team lead
**************

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




Файл не найден, поэтому функция 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, 21:24
Сообщение #12


Developer
******

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




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

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


RusHub team lead
**************

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




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


Developer
******

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




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

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


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


RusHub team lead
**************

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




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

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


Developer
******

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




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


RusHub team lead
**************

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




Не доступна только менюшка. Сама команда $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, 17:05
Сообщение #18


Developer
******

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




Цитата(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, 19:58
Сообщение #19


RusHub team lead
**************

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




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


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


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

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




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

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

Collapse

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

  Тема Ответов Автор Просмотров Последнее сообщение
No New Posts ВАЖНО: Topic has attachmentsВопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
1 049 Wariner 988 185 3.2.2019, 12:51 Посл. сообщение: MIKHAIL
No New Posts RusHub.org
Решаем судьбу домена
12 Nickolya 21 236 19.5.2016, 4:58 Посл. сообщение: DEN 007
No New Posts Перенос базы пользователей с RusHub на PtokaX
3 Angel_D 8 871 5.12.2015, 2:11 Посл. сообщение: Saymon21
No new ВАЖНО: Topic has attachmentsСкрипт банов для RusHub
тестим и комменьтруем
79 Wariner 104 251 28.9.2015, 13:34 Посл. сообщение: NeirRon
No new Topic has attachmentsRusHub. Пакеты для Debian/Ubuntu
47 KT315 61 986 24.5.2015, 23:14 Посл. сообщение: KT315
No New Posts От: Вопросы Разработчикам Скриптов
От темы с ID: 173
0 MIKHAIL 4 317 23.1.2015, 0:56 Посл. сообщение: MIKHAIL
No New Posts ВАЖНО: Topic has attachmentsХаблист RusHub
13 ShadoWx 25 306 7.10.2014, 8:08 Посл. сообщение: mod
No new Topic has attachmentsУстановка rushub на ubuntu 12.04
для домохозяек и пенсионеров
43 hjet 48 147 2.10.2014, 12:16 Посл. сообщение: kotuk
No New Posts RusHub Сжатие
Не работает
1 ShadoWx 7 077 23.9.2014, 10:48 Посл. сообщение: PPA
No New Posts От: Установка скриптов
От темы с ID: 5657
0 MIKHAIL 4 784 29.7.2014, 23:37 Посл. сообщение: MIKHAIL
No New Posts Установка скриптов
Нужна помощь по установке
2 _wRz_ 7 283 29.7.2014, 16:11 Посл. сообщение: Артём
No new От: Вопросы Разработчикам Скриптов
От темы с ID: 173
29 Wariner 25 906 28.1.2014, 13:11 Посл. сообщение: Alexey
No new ВАЖНО: Topic has attachmentsМодули Lua В Linux
приветы те многие
45 mariner 66 687 13.1.2014, 22:53 Посл. сообщение: Saymon21
No new Topic has attachmentsВопросы по RusHub
Технические вопросы
316 Jaska 268 113 19.12.2013, 13:59 Посл. сообщение: mod
No New Posts Модули в lua
Модули в lua
2 daslex 8 301 17.11.2013, 19:30 Посл. сообщение: daslex

 



RSS Сейчас: 23.11.2024, 1:06