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

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

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


Библиотеку надеюсь найдете big_smile.gif

Автор: 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+);", "&#38;#%1;")
    sMsg = sMsg:gsub("|", "&#124;")
    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, прошу прощения за дублирование...показалось, что на этот пост не обратили внимания... after_boom.gif

Setuper, благодарю за ответ, к функции "function ChatArrival", как я понял, нужно дописать сохранение таблицы tCounts, а затем весь фрагмент поместить в менюху, которая оперирует командами вывода текстовых файлов.
Я выбрал у себя небольшой скриптик Chase_Cmd_v.1.0.lua и посмотрел function OpenTextFile(sFileWay)...как мне представляется, именно об этом идет речь. Однако без понимания сути я вряд ли справлюсь с этим. К сожалению я на том этапе, когда самостоятельно могу только написать менюху, сделать разметку текстового сообщения и поправить путь - чисто потребительские задачи для обеспечения работы скриптов на хабе...Потому нуждаюсь не только в полном коде скрипта, но и в пошаговом разъяснении его использования. Сделай, если не сложно... Может быть найдутся админы, которым это будет интересно...тешу себя мыслью, что чайник не я один...big_smile.gif

В части function LoadText(sFile) неясностей еще больше.
Кажется я не четко выразил мысль. Если по порядку, то:
- текстовый файл по команде !файл.txt отправляется в личку,
- чтобы в окне чата возникло сообщение для юзера, который вызвал этот файл, что "Файл отправлен в личку бота", в самом TXT-файле, в конце, я добавляю строку:

Код
|<Information> *** Файл отправлен в личку бота.

В этой связи непонятен источник уязвимости, если '|' используется не как команда, а как служебный символ в txt-файле, перенаправляющий последующий за ним текст в окно чата. В любом случае мне не понятно как и где использовать function LoadText(sFile) взамен символа '|'
Просто прикрепляю пример текстового файла для иллюстрации.


 072010.txt ( 469 байт ) : 18
 

Автор: Nickolya 29.5.2010, 13:42

Добавил нужную тебе фишку в скрипт, надеюсь все как надо, плюс совместил апи 1 и 2 в одном скрипте и профиксил один глюк там.

 Textfiles_Manager_And_Updater_api1_2_v2.lua ( 3.44 килобайт ) : 44
 

Автор: Rasim 22.10.2010, 20:44

Nickolya, Setuper,

Привет confuse.gif
я ниче не понял можеш обьяснит где библиотека, где папка с текстом куда ставит? что делать нефига не понял ну скрипт нужен очень big_smile1.gif

Автор: Nickolya 22.10.2010, 22:54

Для 2 апи библиотека http://mydc.ru/topic1970.html. Папка указывается относительно корневой папки хаба, по умолчанию в скрипте

Код
sTextFilesPath = "texts"    -- папка с текстовыми файлами
т.е. стандартная папка текстовых файлов. Вроде ничего сложного. Если так нужен скрипт - изучи конфиг и тему повнимательней. А что не получилось и какие ошибки были желательно бы описывать!