MyDC.ru _ Запросы скриптов для PtokaX _ При появлении нового ника
Автор: Perspect 7.10.2009, 22:28
Нужен скрипт (или подскажите как сделать).
При появлении нового ника определённого IP-диапазона ему в приват отправляется заготовленный текст.
Автор: FallenAngel 12.10.2009, 14:34
Прям-таки определенного диапазона? А то тут где-то лежал скрипт, который отсылает собщения новому нику-не важно какого диапазона...
Автор: Perspect 12.10.2009, 15:50
В данной ситуации важны пользователи местной сети. И к тому же нужен скрипт не приветствий, а который бы отправлял сообщение именно в приват.
Автор: simxsim 13.10.2009, 12:23
Тоже необходимо подобное.
Автор: Alexey 13.10.2009, 12:37
Держи:
Раскрывающийся текст
Код
local sDiap = "10.31.%d+.%d+" -- шаблон диапазона local sBot = nil -- ник бота или nil для использования ника главного бота local sMsg = [[ Здесь пишем текст сообщения, отсылаемый в приват пользователям из диапазона ]]
function OnStartup() if not sBot then sBot = SetMan.GetString(21) end end
function UserConnected(tUser) if tUser.sIP:find(sDiap) then Core.SendPmToUser(tUser, sBot, sMsg) end end
Если это не то или не совсем то - нужно чётче формулировать пожелания.
Автор: simxsim 13.10.2009, 12:53
Alexey Огромное спасибо заработало просто идеально и какраз то что нужно!!!
Автор: Perspect 13.10.2009, 12:56
Спасибо, работает.
Но как бы сделать, чтобы текст отправлялся новому пользователю только 1 раз. Такой скрипт был бы идеальным.
Автор: Alexey 13.10.2009, 13:10
Так?
Раскрывающийся текст
Код
local sDiap = "10.31.%d+.%d+" -- шаблон диапазона local sBot = nil -- ник бота или nil для использования ника главного бота local tSeen = {} local sMsg = [[ Здесь пишем текст сообщения, отсылаемый в приват пользователям из диапазона ]]
function OnStartup() if not sBot then sBot = SetMan.GetString(21) end end
function UserConnected(tUser) if tUser.sIP:find(sDiap) then if not IsPresent(tUser.sNick) then table.insert(tSeen, tUser.sNick) Core.SendPmToUser(tUser, sBot, sMsg) end end end
function UserConnected(tUser) if InDiap(tUser.sIP) then if not tSeen[tUser.sNick] then tSeen[tUser.sNick] = 1 Core.SendPmToUser(tUser, sBot, sMsg) end end end
Кстати да... При каждом вызове функции, она запихивается в стек вызовов, кроме этого, под параметры функции также создаётся стек. Поэтому при многочисленных вызовах различных функций в скором времени можно задуматься о затратах на вызовы функций. К сожалению, в отличии от с++, в lua отсутствует понятие встраиваемой функции, поэтому задумываться о лишних вызовах стоит!
Автор: Perspect 14.10.2009, 20:33
Кто подскажет? После перегрузки скрипта или компа сообщения снова будут отправляться пользователям. Что можно сделать, чтобы избежать этого. Мало-ли сколько раз придётся перегружаться. Может скопировать, а потом снова закинуть информацию в стек о пользователях, которые уже получали сообщение?
Автор: Wariner 14.10.2009, 20:47
ну про стек это конечно же лихо))) простое сохранение в таблицу)))
Автор: Perspect 14.10.2009, 20:57
Цитата(Wariner @ 14.10.2009, 19:47)
ну про стек это конечно же лихо))) простое сохранение в таблицу)))
Как бы это сделать? Вообще, возможно-ли это? Может есть альтернативы? Этот скрипт использую для привлечения голосов в пользу хаба. Не хотелось бы доставать пользователей однообразной информацией, которая уже для многих не актуальна.
Автор: Wariner 15.10.2009, 7:21
найди любой скрипт который работает с таблицами в файле и посмотри как там сделано!
Автор: district 15.10.2009, 15:10
... а начать героическую борьбу за бюрократическое складирование ников в таблицу можно вот с чего :
Код
-------------------------- Стандартная функция сохранения таблицы ------------------------------------------------------ function SaveToFile(sFileWay, tTable, sTableName) local sHandle = io.open(sFileWay,"w+") Serialize(tTable, sTableName, sHandle) sHandle:flush() sHandle:close() end
function Serialize(tTable, sTableName, sHandle, sTab) local sTab = sTab or '' if sTableName ~= '' then sHandle:write(sTab..sTableName.." = {\n") else sHandle:write(sTab.."return {\n"); end for key, value in pairs(tTable) do local sKey = (type(key) == "string") and ("[%q]"):format(key) or ("[%d]"):format(key) if type(value) == "table" then Serialize(value, sKey, sHandle, sTab.."\t") else local sValue = (type(value) == "string") and ("%q"):format(value) or tostring(value) sHandle:write(sTab.."\t"..sKey.." = "..sValue) end sHandle:write(",\n") end sHandle:write(sTab.."}") end
При вызове SaveToFile(sFileWay, tTable, sTableName) нужно указать соответственно путь к файлу-таблице, саму переменную-таблицу, которую будем сохранять, и имя, с которым таблица будет сохранена в файл. Если вместо имени указать пустую строку
Код
''
то таблица сохранится как
Код
return { ... }
а имя ей будет присваиваться при подключении, которое ( если не нужна доп. проверка существования и синтаксиса таблицы) может выглядеть так :
Код
tTable = dofile(sFileWay)
Если нужна такая проверка, то перед подключением нужно делать вызов loadfile:
Код
if loadfile(sFileWay) then tTable = dofile(sFileWay) ...
Функция Serialize формирует внутритабличные данные и записывает их в строки файла в удобном для глаза виде, с учетом типа данных, которые могут быть числами, строками, или опять же таблицами.
Но вообще говоря, думаю, рано или поздно встанет проблема оценки актуальности данных в таблице и автоочистки таблицы от данных, утративших актуальность. Т.к. до бесконечности раздувать таблицу, наверное, неразумно.
Автор: Perspect 15.10.2009, 20:29
Спасибо конечно... Если бы ещё кто на русский язык перевёл. А нельзя ли из этого сделать готовый скрипт? Я например, не знаю как это складывать.
Автор: simxsim 19.10.2009, 14:41
Добрый день, тут нужна помощь по данному скрипту а собственно можно ли сюда както добавить ип адреса исключения которые попадают в диапазон но сообщение им не отправляется.
local sDiap = "10.31.%d+.%d+" -- шаблон диапазона local sBot = nil -- ник бота или nil для использования ника главного бота local sMsg = [[ Здесь пишем текст сообщения, отсылаемый в приват пользователям из диапазона ]]
function OnStartup() if not sBot then sBot = SetMan.GetString(21) end end
function UserConnected(tUser) if tUser.sIP:find(sDiap) then Core.SendPmToUser(tUser, sBot, sMsg) end end
function UserConnected(tUser) if tUser.sIP:find(sDiap) and not tExcept[tUser.sIP] then Core.SendPmToUser(tUser, sBot, sMsg) end end
Автор: simxsim 20.10.2009, 10:52
Код
local sDiap = "10.5.%d+.%d+" -- шаблон диапазона local tExcept = { "10.5.1.253" = true, "10.5.1.252" = true } local sBot = nil -- ник бота или nil для использования ника главного бота local sMsg = [[ Текст ]]
function OnStartup() if not sBot then sBot = SetMan.GetString(21) end end
function UserConnected(tUser) if tUser.sIP:find(sDiap) and not tExcept[tUser.sIP] then Core.SendPmToUser(tUser, sBot, sMsg) end end
Есть еще одна ошибка. Строку сообщения нужно заключить в кавычки : ... А квадратные скобки в сообщении может быть как раз таки и не нужны.
И давно http://mydc.ru/r/?http://www.lua.org/manual/5.1/manual.html#2.1 причислены к ошибкам?
Автор: district 20.10.2009, 16:24
Виноват, не знал такой фишки. Пост поправлен.
P.S. А какой именно смысл в использовании
Код
[[ text ]]
вместо
Код
"text"
?
Автор: Wariner 20.10.2009, 16:50
многострочная надпись в квадратных скобках будет представлена пользователю в том виде в котором она занесена в скрипт, а "" придётся вносить \t \r \n и т.д.