Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

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

RegConnected    = UserConnected
OpConnected    = UserConnected

Если это не то или не совсем то - нужно чётче формулировать пожелания.

Автор: simxsim 13.10.2009, 12:53

Alexey Огромное спасибо заработало просто идеально и какраз то что нужно!!! feel_good.gif

Автор: 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

RegConnected    = UserConnected
OpConnected    = UserConnected

function IsPresent(sNick)
    for key, vNick in pairs(tSeen) do
        if sNick == vNick then
            return true
        end
    end
    return false
end

Автор: simxsim 13.10.2009, 13:20

А что в данном скрипте доработано, а то чтото не разобрался?
local tSeen = {} я так понял запоминает кому отправлялось, а где это хранится?

Автор: Alexey 13.10.2009, 13:24

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

Автор: Perspect 13.10.2009, 13:33

Alexey:

Меня вполне устраивает этот скрипт, то, что нужно! Но, добавь пожалуйста возможность действовать в нескольких диапазонах.

Автор: simxsim 13.10.2009, 13:50

Ещё раз спасибо за скрипт!

Автор: Alexey 13.10.2009, 14:07

Цитата(simxsim @ 13.10.2009, 14:50) *
Ещё раз спасибо за скрипт!

Пожалуйста!

Perspect:
Третья редакция:  a_diapPM3.lua ( 902 байт ) : 25

Автор: Wariner 13.10.2009, 14:51

мне кажется оптимальнее было бы так:

Код
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

RegConnected    = UserConnected
OpConnected    = UserConnected

и выкинуть функцию IsPresent(sNick)

Автор: Alexey 13.10.2009, 15:36

Пожалуй, соглашусь... изврат какой-то набыдлокодил.
Исправление принято, спасибо.
 a_diapPM4.lua ( 782 байт ) : 18

Автор: Setuper 13.10.2009, 17:00

Кстати да... При каждом вызове функции, она запихивается в стек вызовов, кроме этого, под параметры функции также создаётся стек. Поэтому при многочисленных вызовах различных функций в скором времени можно задуматься о затратах на вызовы функций. К сожалению, в отличии от с++, в lua отсутствует понятие встраиваемой функции, поэтому задумываться о лишних вызовах стоит! big_smile.gif

Автор: Perspect 14.10.2009, 20:33

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

Автор: Wariner 14.10.2009, 20:47

ну про стек это конечно же лихо))) простое сохранение в таблицу)))

Автор: Perspect 14.10.2009, 20:57

Цитата(Wariner @ 14.10.2009, 19:47) *
ну про стек это конечно же лихо))) простое сохранение в таблицу)))

Как бы это сделать? Вообще, возможно-ли это? Может есть альтернативы? exciting.gif
Этот скрипт использую для привлечения голосов в пользу хаба. Не хотелось бы доставать пользователей однообразной информацией, которая уже для многих не актуальна.

Автор: 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

RegConnected = UserConnected
OpConnected = UserConnected

Автор: district 19.10.2009, 15:03

Нужно добавить таблицу исключений :

Код
local tExcept = {
["10.31.255.255"] = true,
...
}

И изменить функцию :
Код
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

RegConnected    = UserConnected
OpConnected    = UserConnected

Не работает, говорит такое [10:50] Синтаксис C:\Program Files\PtokaX4\scripts\PM.lua:3: '}' expected (to close '{' at line 2) near '='

Автор: district 20.10.2009, 12:12

Пардон, умудрился я забыть квадратные скобки ))))
Вот так надо :

Код
local tExcept = {
["10.5.1.253"] = true,
["10.5.1.252"] = true,
}


Автор: Alexey 20.10.2009, 16:10

Цитата(district @ 20.10.2009, 13:12) *
Есть еще одна ошибка. Строку сообщения нужно заключить в кавычки :
...
А квадратные скобки в сообщении может быть как раз таки и не нужны.

И давно 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 и т.д.

Автор: district 20.10.2009, 16:54

О! Вот это - классная фишка.