Версия для печати темы
MyDC.ru _ Помощь по скриптам для PtokaX _ Вопросы по скриптам
Автор: DrakonSP 18.2.2010, 1:24
Код
local sPath = Core.GetPtokaXPath().."scripts/TextBot/"
function ChatArrival(tUser, sData)
local sCmd = sData:match"%b<>%s+%p(%S+).*|"
if sCmd then
Core.SendToUser(tUser, OpenTextFile(sCmd))
return true
end
end
function OpenTextFile(sCmd)
local sMessage = ""
local bBinary = bBinary or false
local sFile = io.open(sPath..sCmd..".txt", "r")
if sFile then
sMessage = sFile:read("*all")
sFile:close()
end
return sMessage
end
Всё ли правильно в этом скрипте?
Написал. Работает. Но не уверен, что тут всё верно. Гляньте плиз
Автор: Setuper 18.2.2010, 2:22
Я бы вот так написал :
Код
local sPath = Core.GetPtokaXPath().."scripts/TextBot/"
function ChatArrival(tUser, sData)
local sCmd = sData:match"^%b<>%s+%p(%S+).*|$"
if sCmd then
local sMsg = LoadText(sPath..sCmd..".txt")
if sMsg then
Core.SendToUser(tUser, sMsg)
return true
end
end
end
function LoadText(sFile)
local hFile = io.open(sFile)
if hFile then
local sMsg = hFile:read"*a"
sMsg = sMsg:gsub("&#(%d+);", "&#%1;")
sMsg = sMsg:gsub("|", "|")
sMsg = sMsg:gsub("^%$", "$")
hFile:flush()
hFile:close()
return sMsg
end
return nil, "Не удалось открыть файл "..sFile
end
Автор: DrakonSP 18.2.2010, 6:19
При отображении в клиенте на конце текста прописываеться $
Автор: Setuper 18.2.2010, 11:32
Пардон. В строке:
Код
sMsg = sMsg:gsub("^%$", "$")
знак $ нужно заэкранировать.
Твой скрипт тоже работает. Однако, особенности протокола заставляют нас обходить некоторые знаки.
Например, в твоём скрипте:
1) пользователям не отсылались бы сообщения, начинающиеся со знака $;
2) знак | в сообщении служил бы разделителем команд и не отображался бы в чате, а всё что шло после этого знака отсылалось бы в следующей команде;
3) любые цифры от 1 до 255, перед которыми стояли бы символы &#, и после которых стоял бы символ ;, преобразовывались бы из кодов в некоторые символы перед тем как поступить в чат пользователя.
Автор: DrakonSP 20.2.2010, 10:38
А возможно ли для этого скрипта
TextBot.lua ( 657 байт )
: 10
Сделать следующую фичу:
Чтобы в текством файле указывать например [views]
А пользователю отображалось количество просмотров данной темы (текстового файла)
Что то вроде как в MOTD в скрипте StatPX, только вместо всяких рекордов пользователей было количество просмотров.
Автор: Setuper 20.2.2010, 11:49
Можно.
Можно сделать показ количества просмотров за время непрерывной работы скрипта, тогда можно просто завести переменную-счётчик, в противном случае (в общем случае) нужно будет сохранение счётчика в файл.
TextBot.lua ( 1.61 килобайт )
: 22
Автор: DrakonSP 20.2.2010, 12:13
Лучше в файл Если не затруднит + ошибка
Цитата
TextBot.lua:10: bad argument count to 'SendToUser' (2 expected, got 3)
Автор: Saymon 20.2.2010, 12:26
У меня тоже маленький вопросик будет
Как реализовать запись юзеров онлайн и общий объём шары хаба на изображение?
Знаю только что для этого нужна библиотека luagd.
Автор: Setuper 20.2.2010, 15:33
Исправил. Залил.
Автор: DrakonSP 20.2.2010, 17:02
Плиз плиз сделайте что бы он количество просмотров в файл сохранял.
Автор: Setuper 20.2.2010, 17:15
Минутное дело)) Перезалил.
Автор: DrakonSP 20.2.2010, 17:54
Цитата(Setuper @ 20.2.2010, 17:15)
Минутное дело)) Перезалил.
Цитата
TextBot2.lua:38: attempt to concatenate local 'sTableName' (a table value)
Автор: Setuper 20.2.2010, 18:01
Пардон.
Вот так нужно:
Код
SaveTable(sFile, tCounts, "tCounts")
Второй параметр в кавычки
Перезалил
Автор: Saymon 22.2.2010, 13:31
Есть код
Код
function OnStartup()
sFile = Core.GetPtokaXPath().."scripts/HelpFiles/help.txt"
if loadfile(sFile) then dofile(sFile) end
function ChatArrival(user, sData)
local cmd = sData:match"%b<>%s+(%S+).*|"
if cmd == "!help" or cmd == "!хелп" or cmd == "+help" then
Core.SendToUser(user, " ")
return true
end
end
end
Как правильно сделать что бы функция Core.SendToUser(user, " ") выводила содержимое файла help.txt ?
Автор: STRELOK_IS74 22.2.2010, 14:12
Код
sBot = SetMan.GetString(21)
sFile = Core.GetPtokaXPath().."scripts/HelpFiles/help.txt"
function ChatArrival(tUser, sData)
sData = string.sub(sData,1,-2)
local sCmd = sData:match"%b<>%s+[!+*](%S+)"
if sCmd == "help" or sCmd == "хелп" then
Core.SendToUser(tUser, "<"..sBot.."> "..LoadText(sFile))
return true
end
end
function LoadText(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
Автор: Saymon 22.2.2010, 16:20
Что не так тут не пойму?
Код
local sCmd = sData:match"%b<>%s+[!+](%S+)"
if sCmd == "команда" or cmd == "команда2" or cmd == "команда3" then
Как правильней будет сделать?
Автор: STRELOK_IS74 22.2.2010, 16:23
Код
if sCmd == "команда" or sCmd == "команда2" or sCmd == "команда3" then
Автор: Saymon 22.2.2010, 16:29
Хм, всё равно не работает
Код
local sCmd = sData:match"%b<>%s+[!+](%S+)"
if sCmd == "команда" or sCmd == "команда2" or sCmd == "команда3" then
Автор: STRELOK_IS74 22.2.2010, 16:39
Может дело в латинских символах?
Код
if sCmd == "command" or sCmd == "command2" or sCmd == "command3" then
Автор: Saymon 22.2.2010, 16:45
да нет, вообще что то только так идёт.
Код
local sCmd = sData:match"%b<>%s+(%S+).*|"
-- if cmd == "!command" or cmd == "!команда" or cmd == "!command2" then
Не могу понять почему... И ошибок в птоке нет.
Автор: STRELOK_IS74 22.2.2010, 16:49
Код
local sCmd = sData:match"%b<>%s+[!+*](%S+)"
if sCmd == "команда" or sCmd == "команда2" or sCmd == "команда3" then
Ошибка была в регулярном выражении.
Автор: Saymon 22.2.2010, 17:13
И так тоже никак.
Автор: STRELOK_IS74 22.2.2010, 17:23
Код
function ChatArrival(user, sData)
local sData = string.sub(sData,1,-2)
local sCmd = sData:match"%b<>%s+[!+*](%S+)"
if sCmd == "test" or sCmd == "stats" or sCmd == "команда3" then
...
return true
end
end
Автор: Setuper 22.2.2010, 17:52
вместо этого:
Код
local sData = string.sub(sData,1,-2)
local sCmd = sData:match"%b<>%s+[!+*](%S+)"
лучше писать так:
Код
local sCmd = sData:match"%b<>%s+[!+*](%S+)|$"
Автор: Saymon 25.2.2010, 14:32
Вопрос таковой, как сделать сохранение данных - юзеров, шары в txt файл что бы потом вывести на сайт???
Автор: Saymon 28.2.2010, 0:13
Предыдущий вопрос решёл. Спасибо Nickolya.
Сейчас вопрос такой:
В некоторых скриптах видел подобную функцию. Пример. "Отсылать ли сообщение в приват или в главный чат? пишем true Отсылается сообщение в чат
Пишем false - отсылается сообщение в приват."
"Дублировать ли важные сообщения? (Отсылать в лс и в чат) Пишем true - Отсылается и в приват и в гл чат
Пишем false Сообщение идёт только в приват."
Попробовал выдернуть из других скриптов не получилось. Скажите пожалуйста как написать такую функцию.
Зарание спасибо.
Автор: Serx 28.2.2010, 0:32
Код
If bFlag == true then
Core.SendToAll("сообщение всем")
elseif bFlag == false then
Core.SendPmToNick(tUser.sNick, sBot,"сообщение в приват")
end
Ну и аналогично второе...
bFlag - параметр который будет настраиваться и проверяться.
tUser.sNick - адресат (юзер с ником в параметре sNick)
sBot - отправитель
Автор: Saymon 28.2.2010, 1:56
Код
if sCmd == sCmd.MainStat then
Core.SendToUser(user,""..sLine.."\r\n\t\t\tИнформация о вас\r\n\n"..
"\t[::] Ваш ник: "..user.sNick.."\t [::] Ваш IP: "..user.sIP.."\t \r\n"..
"\t[::] Ваша шара: "..GetNormalShare(Core.GetUserValue(user,16)).."\t [::] Ваш режим: "..ModeRec(user).."\r\n"..
"\t[::] Местоположение: "..tostring(IP2Country.GetCountryName(user)).." \r\n"..
"\t"..sLine.."\r\n")
return true
end
sPrefix = "+"
sCmd = {
MainStat = "mystat",
}
Вот как бы сижу рисую, пробую всё и понемногу
Не пойму в чём у меня тут ошибка?
В птоке ошибка: attempt to index global 'sCmd' (a nil value)
Автор: Serx 28.2.2010, 10:20
А как может таблица быть равна одному из полей таблицы?
По-моему тебе надо изменить название переменной для захвата команды или имя таблицы с набором возможных команд.
Автор: Saymon 28.2.2010, 18:20
что то не то, и не могу понять что... не работают так команды
Код
if sCmd == "..sCmd.MainStat.." then
Core.SendToUser(user,""..sLine.."\r\n\t\t\tИнформация о вас\r\n\n"..
"\t[::] Ваш ник: "..user.sNick.."\t [::] Ваш IP: "..user.sIP.."\t \r\n"..
"\t[::] Ваша шара: "..GetNormalShare(Core.GetUserValue(user,16)).."\t [::] Ваш режим: "..ModeRec(user).."\r\n"..
"\t[::] Местоположение: "..tostring(IP2Country.GetCountryName(user)).." \r\n"..
"\t"..sLine.."\r\n")
return true
end
if sCmd == "..sCmd.Hub.." then
Core.SendToUser(user,""..sLine.."\r\n"..
"\t\t\tО хабе\r\n\n"..
"\t[::] Местоположение хаба:\r\n\t[::] Страна: "..Country..",\t Регион: "..Republic..",\tГород: "..City..".\r\n"..
"\t[::] Главный бот хаба: "..sBot..", E-Mail: "..BotMail.."\r\n"..
"\t[::] Топик хаба: "..sTopic.."\r\n"..
"\t[::] Описание хаба: "..HubDescription.."\r\n"..
"\t[::] Время непрерывной работы хаба: "..GetNormalTime(Core.GetUpTime()).."\r\n"..
"\t"..sLine.."")
return true
end
sPrefix = "+" --Префикс команд
sCmd = {
MainStat = "mystat",
Hub = "hub",
}
Автор: Serx 28.2.2010, 19:49
не видно функции ChatArrival в которой производился бы захват какой-либо команды.
Ну и ещё перечитай мой предыдущий пост. Ты все ещё пытаешься сравнить таблицу с одним из её полей.
Автор: Saymon 4.3.2010, 0:10
В скрипте написан код
Код
function UserConnected(tUser)
Core.SendToUser(tUser, "\r\n"..
"\t\t\tДобро пожаловать, "..tUser.sNick..", на "..HubName.." г. "..City..".\r\n"..
"\t\t\t\t "..HubDescription.."\r\n"..
"\t\t\t\t"..DecText.."\r\n"..
"\t\t\t"..sLine.."\r\n"..
"\t\t\tВаш ник: "..tUser.sNick..", IP-Адрес: "..tUser.sIP..", Ваша шара: "..GetNormalShare(Core.GetUserValue(tUser,16)).."")
end
OpConnected = UserConnected
RegConnected = UserConnected
function GetNormalShare(s)
s=tonumber(s) or 0
if s>=1099511627776 then return string.format("%.2f",(math.floor(1000*s/1099511627776)/1000)).." TБ"
elseif s>=1073741824 then return string.format("%.3f",(math.floor(1000*s/1073741824)/1000)).." ГБ"
elseif s>=1048576 then return (math.floor(1000*s/1048576)/1000).." МБ"
elseif s>=1024 then return (math.floor(1000*s/1024)/1000).." КБ"
else return s.." Б"
end
end
Шара юзера отображается нормально.
а если заменить function UserConnected(tUser)
на function ValidateNickArrival(tUser, sData)
то шара юзера отображается 0Б. В чём может быть причина и как можно исправить?
Автор: Setuper 4.3.2010, 3:35
Это никак не исправить. На стадии валидации ника определён только ip адрес и ник, больше ничего не определено, так как пользователь ещё не отослал на хаб MyINFO строку.
Автор: Saymon 15.3.2010, 22:27
Подскажите пожалуйста что не так в коде? Ошибка attempt to call global 'Send' (a nil value)
Код
function ChatArrival(user, sData)
local cmd = sData:match"%b<>%s+(%S+).*|"
if cmd == "+dcmagnet" then
Send(sData)
if SendMsg == Pm then
Core.SendPmToUser(user, sData, "<"..Bot.."> "..msg)
elseif SendMsg == Main then
Core.SendToUser(user, sData, "<"..Bot.."> "..msg)
end
end
return true
end
SendMsg = Pm --Куда отсылать сообщение
Автор: Wariner 15.3.2010, 22:32
вот в этой строчке
Код
Send(sData)
скрипт пытается вызвать глобальную функцию
Send которая видимо не определена в скрипте...
Автор: Saymon 15.3.2010, 22:34
А как сделать надо будет?
Автор: Wariner 15.3.2010, 22:36
ты понимаешь что такое функция?
чтобы ошибка пропала достаточно написать
Код
function Send(sData)
end
а вот что делать должна эта функция хз.... думаю надо скрипт приложить тогда можно будет посмотреть)))
Автор: Saymon 15.3.2010, 22:41
А всё сделал, Спасибо Wariner
щас ещё кое что поправлю
Автор: Saymon 20.3.2010, 12:28
Вот на некоторых хабах видел такую функцию
\\история чата\\посылать при входе (да или нет)
Меню сделать не проблема,
вот как написать функцию которая позволит чтобы юзер сам мог выбирать посылать ли ему сообщение при входе или нет?
Автор: Wariner 20.3.2010, 12:35
1) пишешь меню с командой.
2) отлавливаешь эту команду в чате + ник писавшего и его решение ( типо 1 - посыдать; 0 - не посылать)
3) записываешь в таблицу ник = решение (можно и не в таблицу но я вот как то к ним не ровно дышу)
4) при входе проверяешь условие если 1 посылаешь если нет то нет)))
Автор: Saymon 20.3.2010, 12:38
Wariner, будь добор пожалуйста, приведи пример кода.
Попробовал вчера это сделать, не получилось ничего.
Автор: Wariner 20.3.2010, 12:46
какой именно пункт тебе не понятен?
Автор: Saymon 20.3.2010, 12:50
Цитата
ник писавшего и его решение ( типо 1 - посыдать; 0 - не посылать)
тут вот что то я сомневаюсь
3) записываешь в таблицу ник = решение (можно и не в таблицу но я вот как то к ним не ровно дышу)
4) при входе проверяешь условие если 1 посылаешь если нет то нет)))
с этим можно сказать я вот не разу не работал
Автор: Wariner 20.3.2010, 12:55
ну таблицу объявляешь в самом начале скрипта
Код
tShow = {}
запись будет в таком виде:
Код
tShow["nick"] = 1 --или 0
проверка осуществляется условием
Код
if tShow["nick"] == 1 then
-- посылаем
end
PS: так же не забывай сохранять файл в таблицу стандартными функциями!
PPS: естественно вместо ника и цифры должны быть именно нужные значения!
Автор: Saymon 20.3.2010, 12:58
а с сохранением в файл как? Ужас, что я совсем уже втупике.
Автор: Wariner 20.3.2010, 13:06
мда... вот открыл первый попавшийся свой скрипт:
Пути
Код
local sPath = Core.GetPtokaXPath().."scripts/TopicManager/" -- Папка скрипта
local sSettings = sPath.."Settings.tbl" -- Файл с настройками
объявление таблицы
Код
tSettings = {}
загрузка таблицы и сохранение её по тай
Код
function OnStartup()
if loadfile(sSettings) then
dofile(sSettings)
end
TmrMan.AddTimer(iTime*60000, "OnExit")
end
function OnExit()
WriteTable(tSettings, "tSettings", sSettings)
end
функции для сохранения
Код
function WriteTable(tTable, tablename, file)
local handle = io.open(file, "w")
Serialize(tTable, tablename, handle)
handle:close()
end
function Serialize(tTable, sTableName, hFile, sTab)
sTab = sTab or "";
hFile:write(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
Serialize(value, sKey, hFile, sTab.."\t");
else
local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value);
hFile:write(sTab.."\t"..sKey.." = "..sValue);
end
hFile:write(",\n");
end
hFile:write(sTab.."}");
end
Автор: Serx 20.3.2010, 23:14
Если записывать в таблице ник юзера вместе с решением, то там может быть раза в 2 больше чем нужно, которые запишутся от того что юзеры просто "опробуют" функцию.
Недавно допиливал такое... сделал по подобию истории чата: в таблицу сохраняется только ники которым отсылать ничего не нужно - получается таблица исключений. Ну и просто проверяется наличие ника в этой таблице...
Автор: Saymon 20.3.2010, 23:18
Вот сейчас сижу ковыряю что то ничего всё равно не получается
Автор: Saymon 21.3.2010, 15:13
Вот рабочий пример функции которая позволяет юзеру выбирать отсылать ли ему сообщение при входе или нет.
Автор Nickolya
Example.lua ( 2.8 килобайт )
: 14
От себя выражаю огромное спасибо Nickolya.
Автор: Димон1111 22.3.2010, 19:08
А зачем скрипты располагать в каком то определённом порядке? И в каком порядке они должны быть? И почему при включении некоторых скриптов не работают другие? Например при включении весёлого чата не работает регистратор.
Автор: FallenAngel 23.3.2010, 9:13
Цитата(Димон1111 @ 22.3.2010, 19:08)
А зачем скрипты располагать в каком то определённом порядке? И в каком порядке они должны быть?
Никто не зставляет ставить в определенном порядке. Как получится-так и будет. у меня когда хаб пару раз слетел, все скрипты по имени упорядочились. Красота
Но сейчас они более упорядочены по времени добавления.
Цитата
И почему при включении некоторых скриптов не работают другие? Например при включении весёлого чата не работает регистратор.
Поставь веселый чат в саааамый низ. Или же просто пониже самого регистратора. Но лучше 1ый вариант..
И да, можно в веселом чате дописать команды, которые не будет он затрагивать.
Автор: DrakonSP 24.3.2010, 17:55
Поиогите пожалуйста в 2-х вопросах:
1) Скрипт http://mydc.ru/index.html?showtopic=1648&view=findpost&p=27071
Немного переделал отправку сообщения "*** Послана команда хабу...."
В оригинальном скрипте это сообщение отправляеться тому нику, который указан в переменой "sAdminNick"
и сам код отправки выглядит так:
Код
if tUser.sNick~=sAdminNick then
Core.SendToNick(sAdminNick, "<"..sBot.."> *** Послана команда хабу: "..sData)
end
При этом на команды отправляемые с этого ника скрипт не реагирует, т.е. команды вводимые админом не отображаються ему в чат
Я же сделал так:
Код
if tUser.sNick~=sAdminNick then
Core.SendToOps("<"..sBot.."> *** Послана команда хабу: "..sData)
end
И проблема в том, что операторам ну и мне (Главному админу) отправляеться отчёт, о том что я или же мои операторы воспользовались такой то такой то командой.
Например:
Цитата
[17:48:52] <Hub-Bot> *** Вы уже зарегистрированы!
[17:48:52] <Hub-Bot> *** Послана команда хабу: <DrakonSP> +regme
Предполагаю что дело в строчке:
Код
if tUser.sNick~=sAdminNick then
Но незнаю, чего прописать в место sAdminNick, что бы админам (опам) не приходил отчёт об отправленных ими же команд.
2) Скрипт http://mydc.ru/index.html?showtopic=1413&view=findpost&p=10214
Тут проблема заключаеться в том, что админы (опы) сидят и дропают сами себя =))
Надо вообщем сделать так, что бы эта команда не распространялась на админов (опов)
Например:
Цитата
[17:48:52] <Hub-Bot> *** Данная команда на этого пользователя не может быть распространена!
Автор: Nickolya 25.3.2010, 12:08
1. Да, дело в этой строке
Код
if tUser.sNick~=sAdminNick then
замени ее на
Код
if not Core.GetUserValue(tUser, 11) then
2. По поводу этого скрипта могу лишь сказать что это скрипт создающий меню в соответствии с правами пользователя, а уже ранговая система это совсем другая область. Так что либо писать скрипт чтобы опы не могли применять команды друг на друга, либо же поговорить с этими раздолбаями и сказать что так делать нельзя.
Автор: Ksan 14.5.2010, 11:12
Цитата(Saymon @ 21.3.2010, 18:13)
Вот рабочий пример функции которая позволяет юзеру выбирать отсылать ли ему сообщение при входе или нет.
Автор Nickolya
Example.lua ( 2.8 килобайт )
: 14От себя выражаю огромное спасибо
Nickolya.
Скрипт работает только до первой перезагрузки (скрипта). Вот более правильный код (сравни со своим):
Код
sOurFileWay = Core.GetPtokaXPath().."scripts/somefile.txt" -- путь к файлу
tTableData = {}
function OnStartup()
if loadfile(sOurFileWay) then
dofile(sOurFileWay)
end
end
function OnExit()
SaveToFile(sOurFileWay, tTableData, "tTableData") -- сохраняем при выходе
end
function UserConnected(user)
-- меню:
Core.SendToUser(user, "$UserCommand 1 3 Информация\\получать$<%[mynick]> +ИзменитьСтатус on|")
Core.SendToUser(user, "$UserCommand 1 3 Информация\\не получать$<%[mynick]> +ИзменитьСтатус off|")
if not tTableData[user.sNick] then -- проверяем на отсутствие ника в таблице и если его там нет то отсылаем ему информацию
Core.SendToUser(user, "..........")
end
end
OpConnected = UserConnected
RegConnected = UserConnected
function ChatArrival(user, sData)
local sCmd, sOption = sData:match"%b<>%s+[!%+%*](%S+)%s*(%S*).*|$" -- отлавливаем команду и аругмент после нее
if sCmd == "ИзменитьСтатус" then -- если наша команда
if not sOption then -- если вдруг отсутствует статус в команде
Core.SendToUser(user, "*** Вы не ввели статус команды!")
elseif sOption == "on" then -- если опция после команды on то
if not tTableData[user.sNick] then -- если ника нет в таблице то он получает инфу
Core.SendToUser(user, "*** Вы и так получаете информацию при входе!")
else
tTableData[user.sNick] = nil -- иначе удаляем ник из таблицы
SaveToFile(sOurFileWay, tTableData, "tTableData")
Core.SendToUser(user, "*** Теперь вы получаете информацию при входе!")
end
elseif sOption == "off" then -- если опция после команды off то
if tTableData[user.sNick] then -- если ник в таблице
Core.SendToUser(user, "*** Вы и так ничего не получаете при входе!")
else
tTableData[user.sNick] = true -- иначе добавляем ник в таблицу
SaveToFile(sOurFileWay, tTableData, "tTableData")
Core.SendToUser(user, "*** Теперь вы не получаете информацию при входе!")
end
else -- если опции нет или она какая-то странная
Core.SendToUser(user, "*** Неверный статус команды!")
end
return true
end
end