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

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

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

Автор: THE STRELOK 9.3.2009, 7:29

Помгите разобраться с текстовыми файлами, которые содержатся в папке /texts. Вообщем я хочу сделать так, чтобы каждый текстовый файл выводился от определённого бота, и либо в main чат либо в PM. Вот мои наброски:

Код
rulesbot = "RULES"
rulesfile = "rules.txt"

motdbot = "MOTD"
motdfile = "motd.txt"

rules = function(sNick, cmd, sData)
        local _,_,sData = string.find(Core.GetPtokaXPath().."texts/"..rulesfile.."")
    local _,_,cmd = string.find(sData, "%b<>%s+(%S*)")
Core.SendPmToNick(sNick, "<"..rulesbot.."> "..sData)
end

motd = function(sNick, cmd, sData)
        local _,_,sData = string.find(Core.GetPtokaXPath().."texts/"..motdfile.."")
    local _,_,cmd = string.find(sData, "%b<>%s+(%S*)")
Core.SendToNick(sNick, "<"..motdbot.."> "..sData)
end

не работает :(

Автор: alex82 9.3.2009, 10:18

Цитата(THE STRELOK @ 9.3.2009, 6:29) *
не работает :(

Естественно. В API птоки нету функций rules и motd, зато есть функция ChatArrival.

Автор: THE STRELOK 9.3.2009, 10:21

И с этой функцией пробывал, не получается :(

Автор: Wariner 9.3.2009, 10:25

Ты понимаешь что ты пишешь? Все команды отлавливаются в функции ChatArrival
вот это чушь

Код
local _,_,sData = string.find(Core.GetPtokaXPath().."texts/"..rulesfile.."")

и дальше ты вводишь переменную для нахождения команды а проверку не вводишь.
в общем не понятно

Автор: alex82 9.3.2009, 10:35

Код
function ChatArrival(user, data)
    data = string.sub(data,1,-2)    --Удаляем из data символ окончания команды (|)
    local _,_,pre,cmd = string.find(data, "^%b<>%s+(%p)(%S+)")    --Пытаемся найти в data префикс команды и саму команду
    --Догадайся сам, что писать дальше
end

Автор: THE STRELOK 9.3.2009, 10:36

К сожелению я пробывал и с функцией ChatArrival, всё ранво не работает. Если эта строка неправильна

Код
local _,_,sData = string.find(Core.GetPtokaXPath().."texts/"..rulesfile.."")

то скажите, пожалуйста, как нужно сделать, и как сделать так, чтобы при вводе команды текст файла rules.txt например выводился в гл. чат, и как минимум с 2 префиксами ( + и ! ) команда работала

Автор: Wariner 9.3.2009, 10:48

http://mydc.ru/ipb.html?s=&showtopic=1164&view=findpost&p=11209

а для чтения текстового файла нужна функция

Код
function loadtextfiles(filename)
    local message = ""
    local f = io.open( filename, "r" )
    if f then
        message=f:read("*all")
        message=string.gsub(message,"|","")
        f:close()
    end
    return message
end

Автор: THE STRELOK 9.3.2009, 10:49

Вот, получилось, но содержание файла rules.txt не выводится:

Код
rulesbot = "RULES"
rulesfile = Core.GetPtokaXPath().."texts/rules.txt"

function ChatArrival(user, data)
    data = string.sub(data,1,-2)
    local _,_,pre,cmd = string.find(data, "^%b<>%s+(%p)(%S+)")
    if cmd == "rules" then
    Core.SendToUser(user, "<"..rulesbot.."> "..rulesfile)
end
return true
end

вместо этого в чат поступает следующие:
Цитата
[12:47:35] <RULES> D:/DELETA HUB/PtokaX_0.4.1.1/texts/rules.txt

Автор: alex82 9.3.2009, 10:55

Код
return true
end

Поздравляю, ты сделал глобальную заглушку на чат )


Код
    if pre and (pre == "+" or pre == "!") then    --Если префикс найден, и он такой как нам нужен, то...
        if cmd == "rules" then    --Если команда rules, то...
            --Здесь обработка команды rules
            return true
        elseif cmd == "motd" then    --Ну а если motd, то...
            --Здесь обработка команды motd
            return true
        end
    end    --Конец :)

Автор: THE STRELOK 9.3.2009, 11:04

насчёт ниже приведённого кода я знаю, в некоторых скриптах это видел. Я не могу понять, как сделать так, чтобы содержанием файла rules.txt выводилось юзеру. Вставлял код код, который написал выше Wariner, не работает.

Код
rulesbot = "RULES"
rulesfile = "rules.txt"

function loadtextfiles(filename)
    local message = "rules"
    local f = io.open( filename, "..rulesfile.." )
    if f then
        message=f:read("*all")
        message=string.gsub(message,"|","")
        f:close()
    end
    return message
end
function ChatArrival(user, data)
    data = string.sub(data,1,-2)
    local _,_,pre,cmd = string.find(data, "^%b<>%s+(%p)(%S+)")
    if cmd == "rules" then
    Core.SendToUser(user, "<"..rulesbot.."> "..message)
end
return true
end

Автор: alex82 9.3.2009, 11:10

Мало вставить код, надо ещё вызвать функцию:

Код
message = loadtextfiles(Core.GetPtokaXPath().."texts/"..rulesfile)


PS. В функции чтения файла лучше ничего не меняй.

Автор: Wariner 9.3.2009, 11:12

Код
rulesbot = "RULES"
rulesfile = Core.GetPtokaXPath().."/text/rules.txt"

function ChatArrival(tUser, sData)
    sData = string.sub(sData,1,-2)
    local _,_,cmd = string.find(sData, "%b<>%s+(%S+)")
    if cmd == "!rules" then
         Core.SendToUser(tUser, "<"..rulesbot.."> "..loadtextfiles(rulesfile))
         return true
    end    
end

function loadtextfiles(filename)
    local message = ""
    local f = io.open( filename, "r" )
    if f then
        message=f:read("*all")
        message=string.gsub(message,"|","")
        f:close()
    end
    return message
end



Если функция ретурнит(return) какую нибудь информацию то её надо получать по имени функции с параметрами!

Автор: THE STRELOK 9.3.2009, 11:22

Не работает :(

Цитата
texts.lua:15:bad argument #1 to 'open' (string expected, got nil)

Автор: Sephiroth_Lukaw 9.3.2009, 11:27

fix

Код
Core.SendToUser(tUser, "<"..rulesbot.."> "..loadtextfiles(rulesfile))

Автор: THE STRELOK 9.3.2009, 12:23

Скрипт работает, но содержание файла rules.txt не выводится, в чат поступает пустое сообщение от бота

Спасибо, заработало! big_smile.gif

Есть ещё одна правда проблема. Команда !motd у меня на хабе теперь выводится в main чат, команда !rules должна выводиться в PM юзеру от бота с именем '<RULES>', вместо этого при наборе команды !rules высылается содержанием текст файла в PM юзеру, но от гл. бота хаба, а не от 'RULES'.

Цитата
bad argument count to 'SendPmToUser' (3 expected, got 2)


Помогите исправить:
Код
    if cmd == "!rules" then
         Core.SendPmToUser(tUser, "<"..rulesbot.."> "..loadtextfiles(rulesfile))
         return true
    end

Автор: Wariner 9.3.2009, 12:32

Код
    if cmd == "!rules" then
         Core.SendPmToUser(tUser, rulesbot, loadtextfiles(rulesfile))
         return true
    end

Автор: THE STRELOK 9.3.2009, 12:44

спасибо!

Автор: SlavaX 12.3.2009, 23:00

Кинь, что в итоге получилось, ато я запутался...

Автор: THE STRELOK 13.3.2009, 6:26

Прошу ;)

 texts.rar ( 880 байт ) : 22
 

Автор: SlavaX 13.3.2009, 17:07

За такие вещи вынужден поблагодарить)