|
Здравствуйте, гость ( Вход | Регистрация )
|
![]()
Сообщение
#1
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Модули кладутся в папку libs.
Давайте сделаем некое правила написания модулей: файлы модулей будем писать строчными буквами, а модули объявлять тем же словом, но начинающемся с заглавной буквы. Так будет проще отличать название файла с модулем, от названия самого модуля (для того чтобы вникнуть в их суть). Пример использования функций модуля: Код require"files" -- подключение модуля Files.SaveTable("myfile.txt", tTable, "tTable") -- Вызов функции модуля Модуль для работы с файлами: ![]() Модуль различных утилит: ![]() Давайте в этой теме обсуждать те функции, которые часто используются скриптами, и запихивать их в модули |
|
|
![]() |
![]()
Сообщение
#2
|
|
![]() Developer ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 541 Регистрация: 11.11.2008 Пользователь №: 1 075 Спасибо сказали: 244 раза ![]() |
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 ![]() |
|
|
![]()
Сообщение
#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)). |
|
|
![]()
Сообщение
#4
|
|
![]() Developer ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 541 Регистрация: 11.11.2008 Пользователь №: 1 075 Спасибо сказали: 244 раза ![]() |
Локальные функции не выходят за модуль, то есть они могут быть вызваны только внутри модуля, и не могут быть вызваны из скрипта В прикреплённом модуле ошибка ![]() Код local function Serialize(tTable, sTableName, hFile, sTab) а должно быть Код function Serialize(tTable, sTableName, hFile, sTab) ![]() |
|
|
![]()
Сообщение
#5
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Нет никакой ошибки. Я просто таким образом закрыл доступ к этой функции из вне модуля.
Это своего рода инкапсуляция. Разве тебе пишет ошибку? Смело используй функцию Files.SaveTable(sFile, tTable, sTableName) Я конечно понимаю, что для тебя это немного по-новому, однако поверь, что тут всё грамотно написано. |
|
|
![]()
Сообщение
#6
|
|
![]() Developer ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 541 Регистрация: 11.11.2008 Пользователь №: 1 075 Спасибо сказали: 244 раза ![]() |
Тогда извиняюсь...(
|
|
|
![]()
Сообщение
#7
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Не нужно извиняться, лучше больше спрашивай что непонятно.
|
|
|
![]()
Сообщение
#8
|
|
![]() Developer ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 541 Регистрация: 11.11.2008 Пользователь №: 1 075 Спасибо сказали: 244 раза ![]() |
Тогда вот первый вопрос:
Цитата .../Hub/scripts/texts.lua:20: attempt to call global 'LoadText' (a nil value)
|
|
|
![]()
Сообщение
#9
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Files.LoadText
Теперь функции принадлежат определённым модулям и не являются глобальными, что ускоряет их вызов. |
|
|
![]()
Сообщение
#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) Что же теперь не так? :( |
|
|
![]()
Сообщение
#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 |
|
|
![]()
Сообщение
#12
|
|
![]() Developer ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 541 Регистрация: 11.11.2008 Пользователь №: 1 075 Спасибо сказали: 244 раза ![]() |
Сейчас попробую
UPD: Работает! Спасибо. |
|
|
![]()
Сообщение
#13
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
В функции LoadText модуля files.lua добавлена замена
Код sMsg = sMsg:gsub("|", "|") для того, чтобы в сообщениях отображался символ вертикальной черты, и для того чтобы этот символ не служил разделителем команд.
|
|
|
![]()
Сообщение
#14
|
|
![]() Developer ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 541 Регистрация: 11.11.2008 Пользователь №: 1 075 Спасибо сказали: 244 раза ![]() |
Прикрепляю модуль киков. При использовании команды $kick юзера не отключало от хаба.
![]() Установка: 1. Модуль кладём в папку libs 2. В любом скрипте(я добавил в BanManager.lua) добавляем в самом начале require "kick" |
|
|
![]()
Сообщение
#15
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Нет защиты от дурака.
То есть данную команду сможет применить любой пользователь против любого (даже самого админа), используя соответствующую RAW команду в своём клиенте. Рекомендую все же в функции сделать проверку профиля. |
|
|
![]()
Сообщение
#16
|
|
![]() Developer ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 541 Регистрация: 11.11.2008 Пользователь №: 1 075 Спасибо сказали: 244 раза ![]() |
Добавил.
|
|
|
![]()
Сообщение
#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 |
|
|
![]()
Сообщение
#18
|
|
![]() Developer ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 541 Регистрация: 11.11.2008 Пользователь №: 1 075 Спасибо сказали: 244 раза ![]() |
Модуль различных утилит Предлагаю добавить функцию преобразования шары. Код 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 |
|
|
![]()
Сообщение
#19
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Добавил, немного оптимизировав
![]() |
|
|
![]()
Сообщение
#20
|
|
![]() Главный ра******й тут... ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз ![]() |
Пользуясь случаем задам вопрос, как будет лучше, определить вот эту таблицу в функции:
Код local tUnits = {"Б", "КБ", "МБ", "ГБ", "ТБ", "ПБ"} или же в глобальном окружении самого модуля дабы потом только ссылаться на нее? И тогда бы уже на будущее сразу бы добавили остальные единицы измерения:Код local tUnits = {"Б", "КБ", "МБ", "ГБ", "ТБ", "ПБ", "ЭБ", "ЗБ", "ЙБ"}
|
|
|
![]() ![]() |
Похожие темы
![]() |
Сейчас: 8.9.2024, 2:31 |