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

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

MyDC.ru _ Скрипты для RusHub'а _ CollectorMagnets

Автор: STRELOK_IS74 18.2.2010, 17:08

Название: CollectorMagnets
Автор: Serx
Перевод под RusHub: STRELOK
Описание:
Сохраняет магнет ссылки. Выводит их по категориям, от ника, за дату.

Для работы скрипта необходимо скачать модуль files http://mydc.ru/index.html?showtopic=2937&view=findpost&p=25266

 CollMag.rar ( 4.56 килобайт ) : 67
 

Автор: STRELOK_IS74 23.2.2010, 11:57

Добавлена Версия 2.0:


Автор: STRELOK_IS74 3.3.2010, 18:05

Добавил новую версию скрипта.


Автор: Otshelnik-Fm 7.3.2010, 1:54

Пожелания: сортировка по расширению файла и возможность удалить одну магнет ссылку введя ее id. При сохранении магнет ссылки чтобы сохранялось все сообщение (хороший ужасик magnet:..... - стоит смотреть) - а то получаем просто сбор магнетов, а сообщение несло дополнительную информацию.

И вопрос - как переделать в скрипте чтобы сохраняло и http ссылки?

Код
    for sMagnet in sData:gmatch"(http://%S+)" do
вот так

Как сделать чтоб сохранял и ссылки веб и магнет?

Автор: STRELOK_IS74 7.3.2010, 8:12

Должно быть что то типо такого

Код
for sMagnet in sData:gmatch"([magnet][http]:%S+)" do
Но захватывает только 2 последних символа:
Код
tp://ya.ru
. Не могу понять, что нужно поставить, чтобы захватило полностью все символы :(

Автор: Setuper 7.3.2010, 12:04

как вариант:

Код
for sMagnet in sData:gmatch"([mh][at][gt][np]e?t?:%S+)" do

хотя в таком варианте может захватываться и кое-что лишнее.

Для 100% уверенности, что захватиться то, что нам нужно надо делать 2 цикла:
Код
for sMagnet in sData:gmatch"(magnet:%S+)" do
  ...
end
for sMagnet in sData:gmatch"(http:%S+)" do
  ...
end

Автор: Otshelnik-Fm 27.7.2010, 18:22

Отличный скрипт.

Хотелось чтобы сохранял полностью предложение сообщение содержащее ссылку (можно не более 200-400 символов). При просмотре не понятно что это за магнет ссылка или http. А с комментарием - было бы понятней.

Автор: Accelerator 27.7.2010, 18:30

После

Код
            local sNick = sData:match"(%b<>)"
добавляем
Код
            local sMsg = sData:match"%b<>%s+(.*)"




Код
                table.insert(tMagnet,{sMagnet, sNick, os.time()+iTime*3600})

меняем на
Код
                table.insert(tMagnet,{sMsg, sNick, os.time()+iTime*3600})

Автор: Otshelnik-Fm 27.7.2010, 19:05

спасибо . Работает. подскажи еще как сделать вместо

Код
local ClearTmr = 240                                        -- Через сколько часов очищать базу


установить ограничение - хранить последние 200 ссылок. у меня сейчас 270 выводятся в течении 10 секунд.

Это нужно из-за того что не всегда кидаются ссылки. бывает неделю тишина, а иногда за час по 30 ссылок

Автор: Setuper 27.7.2010, 19:22

Лучше переделать скрипт под использование с бд, и не удалять ссылки, а просто дать возможность пользователю ввести 2 параметра: 1 - количество ссылок, которые показывать, 2 - место откуда показывать, а также сделать системный параметр: максимальное количество для показа.

Если не указано место откуда показывать, то по умолчанию брать как последняя ссылка, количество ссылок - это количество ссылок, которое будет показано (вплоть до последней ссылки, если не указано до какой во втором параметре). И первый параметр нельзя вводить больше чем системная настройка, в противном случае показывать количество ссылок в соответствии с системной настройкой. Сисмемную настройку можно взять, допустим 20 для быстроты показа.

Теперь пример. В базе 270 ссылок. Системная настройка: 20.
Пользователь вводит команду: +show 20 - показываем 20 последних ссылок
+show 20 200 - показываем 20 ссылок начиная с 200, то есть с 200 до 220
+show 200 200 - покажет опять же с 200 по 220, так как первый параметр больше системной настройки, и значит вместо него берётся системная настройка.

Таким образом можно будет просмотреть или найти любую ссылку и при этом ничего долго загружаться не будет

Автор: Accelerator 27.7.2010, 19:22

После

Код
table.insert(tMagnet,{sMsg, sNick, os.time()+iTime*3600})
добавь
Код
                    if #tMagnet > 200 then
                    table.remove(tMagnet,1)
                    end

Думаю перед этим нужно будет предварительно почистить таблицу.


2Setuper: Пока времени переделывать скрипт нет. Если будет время и желание - переделаем big_smile.gif

Автор: Otshelnik-Fm 28.7.2010, 19:01

пока крашить не буду. пусть сколько есть выводит.

А скрипт не цепляет иногда ссылки. Почему не разобрался. Специально экспериментировал с описанием. Вроде бы как если после адреса идет: пробел, тире, пробел, а потом текст - не ловит. Если тире убрать - то выведет ссылку с описанием. Но не всегда так. Почему - разбираюсь.

Автор: Accelerator 26.8.2010, 15:00

Как и просили ранее перевёл скрипт от http://mydc.ru/topic2772.html. Скрипт в первом посту.

P.S.: Позже, возможно, займусь модернизацией, если будет время и желание big_smile.gif

Автор: alcorp 20.11.2010, 20:50

Вы конечно, извините меня, но скрипт не запускается вообще!

Автор: Артём 20.11.2010, 21:23

alcorp, Вы конечно, извините меня, но вы уверены что вы в ту ветку влезли? bad_smile.gif Это скрипт под русхаб

Автор: Otshelnik-Fm 18.12.2010, 17:25

Ошибка:

Цитата
[Fri Dec 17 21:37:36 2010] Y:\Soft\rushub_2.2.0\libs\files.lua:32: bad argument #1 to 'open' (string expected, got nil)


работает со скриптом http://mydc.ru/topic3102.html .

Незнаю может быть в ветку CollectorMagnets надо было писать. Если не тут - перенесите.

Автор: Accelerator 18.12.2010, 18:38

Скрипт перезалил. Пробуйте.

Автор: shadow3c 19.11.2012, 12:57

Все завилось с пол тычка. Но возник вопрос как часто сохраняет скрипт магниты в базу. Что-то не нашел в настройках.

Сделал чтобы сохраняло сразу после того как ктото вбросит магнит в чат. Добавив две строчки.

Код
Files.SaveTable(MagnetFile, tMagnet, "tMagnet")
Files.SaveTable(NicksFile, tNicks, "tNicks")

Получилось так
Код
                                table.insert(tMagnet,{Time*86400+os.time(), Hash, form, os.date("%d.%m.%Y @ %H:%M:%S"), tUser.sNick, sMsg})
                        end
                        Files.SaveTable(MagnetFile, tMagnet, "tMagnet")
                        Files.SaveTable(NicksFile, tNicks, "tNicks")

                end


Таймера сохранения не нашел. Можете подсказать как добавить или задать интервал если он там есть.
Спасибо.

Автор: Saymon21 19.11.2012, 15:02

Код не смотрел.
В функцию OnStartup, если такая есть (если нет, дописать)

Код
Core.AddTimer(1,1*60000, "savedb")

И допиши функцию:
Код
function savedb()
Files.SaveTable(MagnetFile, tMagnet, "tMagnet")
Files.SaveTable(NicksFile, tNicks, "tNicks")
end

Автор: Accelerator 20.12.2012, 20:05

Скрипт сохраняет все ссылки после остановки хаба.

Код
function OnExit()
    Files.SaveTable(MagnetFile, tMagnet, "tMagnet")
    Files.SaveTable(NicksFile, tNicks, "tNicks")
end

На сохранении по таймеру не заморачивался, ибо проблем не возникало.

Автор: mod 20.3.2013, 17:16

Ещеб дать возможность самому юзеру включать отображение последних магнет при входе, при настройке "local ShowConnected = nil "

Автор: shadow3c 9.11.2013, 18:47

Ребята у меня проблема . Может кто знает как решить
Если юзер скидывает несколько магнитов в одном сообщении то это сообщение вноситься в базу токое количество раз сколько там магнитов.
Вот парсящий кусок.

Код
function OnChat(UID, sData)
        local sCmd = sData:match"%b<>%s+[!+*](%S+)"
        local tUser = Core.GetUser(UID, 8)
        for Magnet in sData:gmatch"(magnet:%S+)" do
                if Magnet then
                        local Hash = Magnet:match"urn:tree:tiger:(%w+)&xl="
                        local bRepeat = true
                        local sMsg = sData:match"%b<>%s+(.*)"
                        local form = Magnet:match"&dn=(%S+)"
                        if form then
                                local bType = true
                                form = string.lower(form:sub(-3))
                                for i,v in pairs(TypeFile) do
                                        for j,k in ipairs(v) do
                                                if k == form then
                                                        bType = nil
                                                        form = i
                                                end
                                        end
                                end
                                if bType then
                                form = other
                                end
                        end
                        for i,v in ipairs(tMagnet) do
                                if v[2] == Hash then
                                        bRepeat = nil
                                        break
                                end
                        end
                        if bRepeat then
                                table.insert(tMagnet,{Time*86400+os.time(), Hash, form, os.date("%d.%m.%Y @ %H:%M:%S"), tUser.sNick, sMsg})
                        end
                        Files.SaveTable(MagnetFile, tMagnet, "tMagnet")
                        Files.SaveTable(NicksFile, tNicks, "tNicks")

                end
        end

вот пример глючащего магнита
Код
magnet:?xt=urn:tree:tiger:PG3OP5MHIMSJKJGVNHXMSELQWVKDPGQP6B2T6OA&xl=247819&dn=nastroyka_6str.rar
magnet:?xt=urn:tree:tiger:CF7C3SOYIZ5CXJXDKGBNGYVRMX7JBG7OBH6OHSQ&xl=157911&dn=PitchPerfect_Tuner_setup.rar

а вот как это выводит программа
Код
№926 : [ [3c]_server ] : [ Архивы: ap_guitar.rar (829,70 кБ)
AP_Guitar_Tuner_v1_02.rar (735,64 кБ) ] добавлено: [ 09.11.2013 @ 19:13:14 ]
№927 : [ [3c]_server ] : [ Архивы: ap_guitar.rar (829,70 кБ)
AP_Guitar_Tuner_v1_02.rar (735,64 кБ) ] добавлено: [ 09.11.2013 @ 19:13:14 ]

Автор: shadow3c 19.11.2013, 4:28

Кому надо криволапое решение проблемы не учитывающее все нюансы вот оно )

Код
function OnChat(UID, sData)
        local sCmd = sData:match"%b<>%s+[!+*](%S+)"
        local tUser = Core.GetUser(UID, 8)
        for Magnet in sData:gmatch"(magnet:%S+)" do
                if Magnet then
                        local Hash = Magnet:match"urn:tree:tiger:(%w+)&xl="
                        local bRepeat = true
                        local sMsg = sData:match"%b<>%s+(.*)"
                        local form = Magnet:match"&dn=(%S+)"
                        if form then
                                local bType = true
                                form = string.lower(form:sub(-3))
                                for i,v in pairs(TypeFile) do
                                        for j,k in ipairs(v) do
                                                if k == form then
                                                        bType = nil
                                                        form = i
                                                end
                                        end
                                end
                                if bType then
                                form = other
                                end
                        end
                        for i,v in ipairs(tMagnet) do
                                if v[2] == Hash then
                                        bRepeat = nil
                                        break
                                end
                        end
                        if bRepeat then
                                table.insert(tMagnet,{Time*86400+os.time(), Hash, form, os.date("%d.%m.%Y @ %H:%M:%S"), tUser.sNick, sMsg})
                        end
                        Files.SaveTable(MagnetFile, tMagnet, "tMagnet")
                        Files.SaveTable(NicksFile, tNicks, "tNicks")
                        break

                end
        end