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

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

MyDC.ru _ Помощь по скриптам для PtokaX _ Confirmer

Автор: ВАСЯ 22.12.2009, 20:36

Друзья, этот скрипт работал на PtokaX 0.3.6.0. Конвертировал его для PtokaX 0.4.1.1. Скрипт функционирует не полностью - пропускает фразы юзера (до конвертации на старой птоке ничего не пропускал пока не согласишься с правилами). Выглядит это так: заходим, пытаемся написать "каля-маля" в чате, выскакивает сообщение о знакомстве с правилами и написании согласия в ответ и ниже всего этого наше "каля-маля", пишем ещё раз, всё повторяется. Пишем "...согласен..." - всё работает как надо: напоминание отключается, мой IP заносится в список.
Подскажите, где конвертор ошибся или лишнего присобачил, мож отрезал чего?

Код
-- Этот скрипт конвертирован программой PtokaX LUA API Конвертор v0.9. Русская версия 12/22/09 20:05:00
BOT = SetMan.GetString(21)
SET = "sIP" -- определение по IP, "sName" -- по нику
Mode = 1 -- 1 - в общий, 2 - в приват. 0 - не отсылать

IConfirm = "я соглашаюсь с правилами"

Confirm = { }
data_file = "scripts/Rules/data.txt"
dofile(data_file)

function UserConnected(user)
    Core.GetUserAllData(user)
    if Confirm[user[SET]] == nil then
        SendTo(user, BOT, SendConfirm)
    end
end
OpConnected = UserConnected

function ChatArrival(user,data)
    Core.GetUserAllData(user)
    local _,_, Message = string.find(data, "%b<>%s+("..IConfirm..")")
    IConfirmPars(user, Message)
    if Confirm[user[SET]] == nil then
        return SendTo(user, BOT, SendConfirm)
    end
end

function SendTo(user, BOT, SendConfirm)
    if Mode == 1 then
        Core.SendToNick(user.sNick,"<"..BOT.."> ".. SendConfirm)
    elseif Mode == 2 then
        Core.SendPmToNick(user.sNick,BOT, SendConfirm)
    elseif Mode == 0 then
    end
return 1
end

function ToArrival(user,data)
    Core.GetUserAllData(user)
local _,_,To,From,Message = string.find(data,"$To:%s+(%S+)%s+From:%s+%S+%s+$<(%S+)>%s+(.*)|")
    if To == BOT then
        IConfirmPars(user, Message )
    end
end

function IConfirmPars(user, Message )
    if Message == IConfirm then
        Confirm[user[SET]] = 1
        SendTo(user, BOT,"Теперь вы полноправный участник чата!")
        SaveToFile(data_file, Confirm, "Confirm")
    end
end

function ReadFile(file)
    local f = io.open(file, "r")
    return f:read("*all")
end; rules_txt = ReadFile("scripts/Rules/info.txt")
SendConfirm = "Перед тем, как начать общение, ознакомьтесь с информацией хаба и правилами поведения в чате. \n" .. rules_txt .. "\n" .. "Если вы согласны с правилами - напишите фразу:     " .. IConfirm .."     и отправьте в чат."

function SaveToFile(file , table , tablename)
    local handle = io.open(file,"w+")
    handle:write(Serialize(table, tablename))
    handle:flush()
    handle:close()
    collectgarbage(collect)
end

function Serialize(tTable, sTableName, sTab)
    sTab = sTab or "";
    sTmp = ""
    sTmp = sTmp..sTab..sTableName.." = {\n"
    for key, value in pairs(tTable) do
        local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);
        if(type(value) == "table") then
            sTmp = sTmp..Serialize(value, sKey, sTab.."\t");
        else
            local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value);
            sTmp = sTmp..sTab.."\t"..sKey.." = "..sValue
        end
        sTmp = sTmp..",\n"
    end
    sTmp = sTmp..sTab.."}"
    return sTmp
end
RegConnected = UserConnected

Автор: Артём 22.12.2009, 20:57

http://mydc.ru/index.html?showtopic=1118&view=findpost&p=19064
сам скрипт не выкладываю ибо дядька Николя ругает меня)) victory.gif

Автор: ВАСЯ 22.12.2009, 21:49

Дружище, я форум уже часов 9 читаю, собираю хаб на PtokaX 0.4.1.1 с такими же скриптами, какие у меня были. И там был (по вашей ссылке) - 3 раза перечитывал, но моя проблема там не решается. Я качал все возможные варианты (например в вашем сообщения идут в личку, а мне надо в общий), пытался сравнить ваш и мой, как это переделать я не знаю. Тема там называется "одноразовая рассылка". У меня не рассылка, у меня согласие с правилами с функцией запрета чата без согласия.
Я наскреб на форуме почти все нужные скрипты, теперь добиваюсь сходства по функциям, т.к. они сильно расходятся со своими предшественниками.

Автор: Артём 22.12.2009, 22:03

anger.gif
 Confirmer_API2_.zip ( 2.48 килобайт ) : 68
hell_boy.gif
Я Дал ссыль на тот скрипт что в первом посте, но только уже под API2 !!!

Автор: X-Sky 22.12.2009, 22:14

ВАСЯ, достаточно было изменить return 1 на return true
Лови:

Нажмите СЮДА для открытия просмотра кода скрипта
BOT = SetMan.GetString(21)
SET = "sIP" -- определение по IP, "sName" -- по нику
Mode = 1 -- 1 - в общий, 2 - в приват. 0 - не отсылать

IConfirm = "я соглашаюсь с правилами"

Confirm = { }
data_file = Core.GetPtokaXPath().."scripts/1/data.txt"
dofile(data_file)

function UserConnected(user)
Core.GetUserAllData(user)
if Confirm[user[SET]] == nil then
SendTo(user, BOT, SendConfirm)
end
end
OpConnected = UserConnected

function ChatArrival(user,data)
Core.GetUserAllData(user)
local _,_, Message = string.find(data, "%b<>%s+("..IConfirm..")")
IConfirmPars(user, Message)
if Confirm[user[SET]] == nil then
return SendTo(user, BOT, SendConfirm)
end
end

function SendTo(user, BOT, SendConfirm)
if Mode == 1 then
Core.SendToNick(user.sNick,"<"..BOT.."> ".. SendConfirm)
elseif Mode == 2 then
Core.SendPmToNick(user.sNick,BOT, SendConfirm)
elseif Mode == 0 then
end
return true
end

function ToArrival(user,data)
Core.GetUserAllData(user)
local _,_,To,From,Message = string.find(data,"$To:%s+(%S+)%s+From:%s+%S+%s+$<(%S+)>%s+(.*)|")
if To == BOT then
IConfirmPars(user, Message )
end
end

function IConfirmPars(user, Message )
if Message == IConfirm then
Confirm[user[SET]] = 1
SendTo(user, BOT,"Теперь вы полноправный участник чата!")
SaveToFile(data_file, Confirm, "Confirm")
end
end

function ReadFile(file)
local f = io.open(file, "r")
return f:read("*all")
end; rules_txt = ReadFile(Core.GetPtokaXPath().."scripts/1/info.txt")
SendConfirm = "Перед тем, как начать общение, ознакомьтесь с информацией хаба и правилами поведения в чате. \n" .. rules_txt .. "\n" .. "Если вы согласны с правилами - напишите фразу: " .. IConfirm .." и отправьте в чат."

function SaveToFile(file , table , tablename)
local handle = io.open(file,"w+")
handle:write(Serialize(table, tablename))
handle:flush()
handle:close()
collectgarbage(collect)
end

function Serialize(tTable, sTableName, sTab)
sTab = sTab or "";
sTmp = ""
sTmp = sTmp..sTab..sTableName.." = {\n"
for key, value in pairs(tTable) do
local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);
if(type(value) == "table") then
sTmp = sTmp..Serialize(value, sKey, sTab.."\t");
else
local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value);
sTmp = sTmp..sTab.."\t"..sKey.." = "..sValue
end
sTmp = sTmp..",\n"
end
sTmp = sTmp..sTab.."}"
return sTmp
end
RegConnected = UserConnected

Автор: Alexey 22.12.2009, 22:17

Замени return 1 на return true, а return 0 на просто return.

Автор: ВАСЯ 22.12.2009, 22:20

Огромное всем спасибо за помощь! Теперь думаю это правило (1 на true, 0 на false) мне поможет в дальнейшей конвертации своего старья.

Автор: X-Sky 22.12.2009, 22:35

Пожалуйста, обращайся, если что big_smile.gif

Автор: ddss 16.2.2011, 10:19

А как сделать чтоб сам бот сообщения не в ЛС кидал а в общем чате выводил ?

Автор: Артём 16.2.2011, 13:17

ddss, заменить

Код
Core.SendPmToUser(user,BOT, SendConfirm)
на
Код
Core.SendToUser(user, SendConfirm)

Автор: ddss 17.2.2011, 1:50

Цитата(Артём @ 16.2.2011, 14:17) *
ddss, заменить
Код
Core.SendPmToUser(user,BOT, SendConfirm)
на
Код
Core.SendToUser(user, SendConfirm)

Там три таких значения

Код
function UserConnected(user)
    if Confirm[user[SET]] == nil then
        Core.SendPmToUser(user,BOT, SendConfirm)
    end
end


два таких

и одно такое:
Код
    if To == BOT then
        if Message == IConfirm then
            Confirm[user[SET]] = 1
            Core.SendPmToUser(user,BOT,"Теперь вы полноправный участник чата!")

Автор: Marc 17.2.2011, 3:36

Воспользовался скриптом Артёма из 4-го сообщения!
Скрипт хороший и главное работает.
Но в нём только пути к текстам надо немного поправить и добавить "scripts/" перед двумя "Rules".
И главное нужный скрипт, так как теперь пользователи не скажут, что не знакомы с Правилами Хаба!
Но! Кроме этого скрипта, неплохо, чтобы сами Правила были всегда востребованы пользователями Хаба, то есть, чтобы они могли всеглда их запросить.
Я у себя так и сделал, советую и другим.

Автор: Артём 17.2.2011, 15:25

ddss, меняй там где тебе нужно bad_smile.gif

Автор: Saymon 17.2.2011, 19:38

давно пора изучить http://mydc.ru/topic118.html

Автор: STIVAN 24.6.2011, 12:28

Цитата(Артём @ 22.12.2009, 21:03) *
anger.gif
 Confirmer_API2_.zip ( 2.48 килобайт ) : 68
hell_boy.gif
Я Дал ссыль на тот скрипт что в первом посте, но только уже под API2 !!!


Ошибка: Синтаксис: cannot open Rules/data.txt: No soch file or directory

Автор: Saymon21 24.6.2011, 12:47

А перевести ошибку? No soch file or directory - Нет файла или каталога. А почему бы его не создать руками?

Автор: STIVAN 24.6.2011, 13:00

Цитата(Saymon21 @ 24.6.2011, 11:47) *
А перевести ошибку? No soch file or directory - Нет файла или каталога. А почему бы его не создать руками?

Я вот не пойму какой нужно создать.

Автор: Saymon21 24.6.2011, 13:03

как тут не понять? Что тут не понять? Rules/data.txt

Даже посмотри код:

Код
data_file = "scripts/Rules/data.txt"