Версия для печати темы
MyDC.ru _ Служебные скрипты [PtokaX] _ Textfiles_manager_and_updater
Автор: Setuper 27.1.2009, 13:40
Название: Textfiles_Manager_And_Updater
Версия API: API 1, 2
Автор: Nickolya
Описание: Скрипт обновляет файлы по интервалу (только с расширением txt), можно поменять папку с которой работает скрипт (путь указан от главной папки хаба), указывается куда отсылаются данные: в приват или общий чат. Библиотеку кладем в папку с PtokaX.exe
textfilesmanagerandupdater_api1.lua ( 1.8 килобайт )
: 84
PXLFS.rar ( 53.84 килобайт )
: 72
Автор: MEXAHuK 4.2.2009, 22:20
можно под Api2? только не отсылай к переводчику.
Автор: Nickolya 5.2.2009, 13:04
На скорую руку перевел под 2 апи:
CODE
sTextFilesPath = "texts" -- папка с текстовыми файлами
iTime = 60 -- время в секундах на обновление файлов
bPm = false -- отсылать сообщение в приват (true) или нет (false)
function OnStartup()
sBot = SetMan.GetString(21)--frmHub:GetHubBotName()
require("pxlfs")
tFiles = {}
sHubPath = Core.GetPtokaXPath()--frmHub:GetPtokaXLocation():g("/", "\\")
sFilesPath = sHubPath..sTextFilesPath
--SetTimer(1000 * iTime)
--StartTimer()
TmrMan.AddTimer(1000 * iTime, "LoadFiles")
LoadFiles()
end
function string.g(sData, s1, s2)
return sData:gsub(s1, Return(s2))
end
function Return(sData)
if type(sData) == "function" then
return sData
end
return function()
return sData
end
end
--[[
function OnTimer()
LoadFiles()
end
]]--
function ChatArrival(tUser, sData)
sData = sData:sub(1, -2)
local _,_, sCmd = sData:find("^%b<>%s+%p(%S+)")
if not sCmd then
return
end
local sText = tFiles[sCmd]
if sText then
if bPm then
--tUser:SendPM(sBot, sText.data)
Core.SendPmToUser(tUser, sBot, sText.data)
else
Core.SendToUser(tUser, "<"..sBot.."> "..sText.data)
--tUser:SendData(sBot, sText.data)
end
return true
end
end
function LoadFiles()
tFiles = attrdir(sFilesPath)
end
function attrdir(path)
local tData = {}
for file in lfs.dir(path) do
if file ~= "." and file ~= ".." then
local _,_, sFileName, sExt = file:find("(.+)(%.txt)$")
if sExt then
local f = path.."/"..file
local attr = lfs.attributes(f)
assert (type(attr) == "table")
if attr.mode ~= "directory" then
tData[sFileName] = {
modification = attr.modification,
data = OpenTextFile(f),
}
end
end
end
end
return tData
end
function OpenTextFile(sFileWay)
local sMessage = "[ can not open file ]"
local sFile = io.open(sFileWay, "r")
if sFile then
sMessage = sFile:read("*all")
sMessage = sMessage:g("\n", "\r\n")
sFile:close()
end
if sMessage then
sMessage = "[ no data in file ]"
end
return sMessage
end
Библиотеку надеюсь найдете
Автор: TiGRpp 26.5.2010, 22:16
Приветствую.
Подскажите как в текстовых файлах учесть количество просмотров?
Код
...
№12. Чужая 17.06.2010
№13. Двойной КОПец 17.06.2010
№14. Стервозные штучки 01.07.2010
Скоро в нашем меню будет Огромный список Всех новинок за год.
Количество просмотров: 97
[23:07:54] *** Юзер ушёл [Hub-Security]
Например известно, что для отправки сообщения в окно чата, в текстовом файле помещают текст со знаком "|"
Код
|<Information> *** Список МАГНЕТ-ссылок был отправлен в личку бота.
Благодарю.
Автор: Setuper 28.5.2010, 9:32
Вообще говоря, знак | нужно заменять его кодовым html аналогом. В противном случае это потенциальная уязвимость, котором можно воспользоваться для отсылки любой команды, а не только команды чата.
Код
function LoadText(sFile)
local hFile = base.io.open(sFile, "r")
if hFile then
local sMsg = hFile:read"*a"
sMsg = sMsg:gsub("&#(%d+);", "&#%1;")
sMsg = sMsg:gsub("|", "|")
hFile:flush()
hFile:close()
return sMsg
end
return nil, "Не удалось открыть файл "..sFile
end
Подсчёт количества просмотров нужно производить в функции загрузки файла и хранить в lua, и выводить текст, к которому приклеивать сообщение с количеством просмотров.
Код
tCounts = {}
sBot = "Бот"
function ChatArrival(tUser, sData)
local sCmd = sData:match"^[!/+](%S+)"
if sCmd then
local sMsg = LoadText(Core.GetPtokaXPath().."texts/"..sCmd..".txt")
if sMsg then
tCounts[sCmd] = (tCounts[sCmd] or 0) + 1
Core.SendToUser(tUser, ("<%s> %s\n\nКоличество просмотров: %d"):format(sBot, sMsg, tCounts[sCmd]))
return true
end
end
end
Сохранение таблицы tCounts в файл и загрузка из файла при старте скрипта, для того чтобы статистика не сбивалась при перезагрузке скрипта, я надеюсь сам реализуешь.
Автор: TiGRpp 28.5.2010, 22:23
Nickolya, прошу прощения за дублирование...показалось, что на этот пост не обратили внимания...
Setuper, благодарю за ответ, к функции "function ChatArrival", как я понял, нужно дописать сохранение таблицы tCounts, а затем весь фрагмент поместить в менюху, которая оперирует командами вывода текстовых файлов.
Я выбрал у себя небольшой скриптик Chase_Cmd_v.1.0.lua и посмотрел function OpenTextFile(sFileWay)...как мне представляется, именно об этом идет речь. Однако без понимания сути я вряд ли справлюсь с этим. К сожалению я на том этапе, когда самостоятельно могу только написать менюху, сделать разметку текстового сообщения и поправить путь - чисто потребительские задачи для обеспечения работы скриптов на хабе...Потому нуждаюсь не только в полном коде скрипта, но и в пошаговом разъяснении его использования. Сделай, если не сложно... Может быть найдутся админы, которым это будет интересно...тешу себя мыслью, что чайник не я один...
В части function LoadText(sFile) неясностей еще больше.
Кажется я не четко выразил мысль. Если по порядку, то:
- текстовый файл по команде !файл.txt отправляется в личку,
- чтобы в окне чата возникло сообщение для юзера, который вызвал этот файл, что "Файл отправлен в личку бота", в самом TXT-файле, в конце, я добавляю строку:
Код
|<Information> *** Файл отправлен в личку бота.
В этой связи непонятен источник уязвимости, если '|' используется не как команда, а как служебный символ в txt-файле, перенаправляющий последующий за ним текст в окно чата. В любом случае мне не понятно как и где использовать function LoadText(sFile) взамен символа '|'
Просто прикрепляю пример текстового файла для иллюстрации.
Автор: Nickolya 29.5.2010, 13:42
Добавил нужную тебе фишку в скрипт, надеюсь все как надо, плюс совместил апи 1 и 2 в одном скрипте и профиксил один глюк там.
Автор: Rasim 22.10.2010, 20:44
Nickolya, Setuper,
Привет
я ниче не понял можеш обьяснит где библиотека, где папка с текстом куда ставит? что делать нефига не понял ну скрипт нужен очень
Автор: Nickolya 22.10.2010, 22:54
Для 2 апи библиотека http://mydc.ru/topic1970.html. Папка указывается относительно корневой папки хаба, по умолчанию в скрипте
Код
sTextFilesPath = "texts" -- папка с текстовыми файлами
т.е. стандартная папка текстовых файлов. Вроде ничего сложного. Если так нужен скрипт - изучи конфиг и тему повнимательней. А что не получилось и какие ошибки были желательно бы описывать!