![]() |
#1
|
|||
|
|||
![]()
Wild Cat написал(а) к Cheslav Osanadze в Jan 25 02:34:50 по местному времени:
__(--""^^ Привет, Cheslav! ^^""--)__ 18 Янв 25 22:43, ты писал(а) мне: WC>>>> передачи сообщения. У меня на компе даже есть всплывающие WC>>>> уведомления о сообщениях в нетмыл, и в "избранные" эхи (их WC>>>> около 80). CO>>> Как реализовал? [...skipped...] CO> Так-с... а можно пошагово, ну или со своими примерами, а там я CO> попробую понять, рассказать это всё, уже не "вкратце", в нетмыле? CO> Суть то я уловил, но реализация... Сейчас будет пошагово. Для начала скажу, что я в этом - полнейший чайник, и способ явно кривой и костыльный, поэтому прошу окружающих сильно ногами не пинать... Способ костыльный по той причине, что он требует в цикле повторять указанную команду столько раз, сколько эх в твоём "списке для пушей". Это создаёт лишнюю нагрузку, поэтому для большого количества эх в списке пушей и слабого компа - не подойдёт. Если тебе нужно получать пуши по 5-10 эхам - то норм, если по 100 эхам - то уже не подходит (но не важно, сколько эх у тебя на узле всего). Предварительно я имею файл, допустим, area.lst, с содержанием эх, по которым я хочу получать пуши. Этот список должен быть минимален, например: === area.lst === 8912.LOCAL RU.FIDONET.TODAY CONCORD RU.НOME RU.MODEM ================ (писать построчно, в конце добавить пустую строчку) По самому батнику: сначала я должен получить кусок лога тоссера, где он пишет, в какие эхи пришли сообщения. С большим логом НPT я не захотел возиться, поэтому поступил банально: запускаю hpt toss>tossarea0.log - таким образом, получаем результат выполнения в вышеуказанном файле tossarea0.log. Все примеры я даю без путей (предполагается, что ты сам их проставишь). В этом куске лога тоссер долго и подробно пишет, какие файлы он растоссил, и куда кинул (каким линкам отправил). Нас интересует только несколько строчек, типа: === Начало Windows Clipboard === 4 17.42.24 Areas summary: 4 17.42.24 echo area 8912.LOCAL - 2 msgs 4 17.42.24 echo area 2.STATISTICS - 1 msgs 4 17.42.24 echo area LORD.ROBOT - 6 msgs 4 17.42.24 echo area SU.POL - 11 msgs 4 17.42.24 echo area SU.GENERAL - 6 msgs === Конец Windows Clipboard === Выдирать из лога я их никак не буду - пусть там и лежат. Как видим, половина полученных эх - это роботы и статистика. Далее я натравливаю батник на файл tossarea0.log, чтобы он нашёл в файле tossarea0.log вхождения из файла area.lst, и результат записываю в push.txt. Беру цикл, создаю переменную. В переменную считывается каждая строчка из файла area.lst (построчно). Сколько строчек там есть - столько раз выполняется цикл. Цикл выполняется для каждой строчки из файла area.lst, без проверки на "валидность", поэтому всякую абракадабру писать в area.lst не нужно. Внутри цикла команда findstr ищет вхождение переменной (строчка из area.lst) в логе тоссера tossarea0.log, и если "найдено" - то пишет результат (то, что найдено) в файл push.txt. === Начало Windows Clipboard === for /f "tokens=*" %%a in (area.lst) do ( findstr /c:" %%a " tossarea0.log>>push.txt ) === Конец Windows Clipboard === Это - "сырой" вариант. Просто сунули результат поиска в текстовый файл, внутри которого - кривые/косые строчки (не проверив, не существовал ли уже этот файл ранее). Небольшое пояснение по поводу параметра с подстрокой поиска: /c:" %%a " зачем я добавил пробелы слева и справа от имени переменной? Чтобы по запросу "RU.MODEM" не находило эху "RU.MODEM.NERDS". Можно было написать так: /c:"echo area %%a -" или так: /c:"echo area %%a " (но я этого делать не стал, решив, что и так сойдёт, если название эхи отделено двумя пробелами, то название одной эхи в части названия другой эхи поисковик точно не найдёт) ~~~~====~~~~ В окончательном варианте я добавил в конце создание файл-флага (его будем использовать для nnCron), а в начале - удаление лишних файлов. И ещё, добавил анализ кода возврата в цикле после каждого выполнения findstr, если результат положительный - то подстрока, которая искалась в этом цикле выводится в файл pushtime.txt вместе с текущим временем. Из времени я каким-то диким способом убрал секунды, и десятые и тысячные доли секунд, чтобы отображалось вменяемое время в часах и минутах, без тысячных долей секунды. В начале я добавил копирование полученного лога тоссера в отдельный файл (мне так показалось удобнее работать). Ниже привожу окончательный вариант: === Начало Windows Clipboard === hpt toss>tossarea0.log copy tossarea0.log tossarea1.log if exist push.txt del push.txt if exist pushtime.txt del pushtime.txt if exist newmsg.flg del newmsg.flg for /f "tokens=*" %%a in (area.lst) do ( findstr /c:" %%a " tossarea.log>>push.txt if not errorlevel 1 echo %TIME:~0,5% %%a>>pushtime.txt ) if exist pushtime.txt echo bla-bla-bla>newmsg.flg === Конец Windows Clipboard === Если нужная строка ни разу не найдена, то файл pushtime.txt - не создастся вообще, так как findstr ни разу не завершится с нулевым кодом возврата. В начале батника мы его удалили, поэтому в конце можно проверить его наличие, и если он таки есть - то создать файл-флаг newmsg.flg - за это отвечает последняя строчка. Этот файл-флаг нужен для nnCron (об этом - ниже). Для создания файла-флага я просто записываю туда строку "bla-bla-bla" :) При запуске этой конструкции, если тоссер - тоссил, но новых эхобандлов не было - в логе тоссера не будет ни одного названия эхи, следовательно, не создастся файл с результатом pushtime.txt, и мы не создадим файл-флаг newmsg.flg. ~~~===~~~ Далее для работы я использую файл pushtime.txt, который содержит текущее время и список найденных подстрок. Небольшой косяк: файл push.txt содержит те строки, которые были найдены командой findstr, а файл pushtime.txt - те строки, которые мы искали в текущем цикле с нулевым кодом возврата. В некоторых случаях это может работать неправильно, и тогда во второй файл "попадут" все подстроки, которые мы искали. Поэтому для nnCron надёжнее использовать файл push.txt, но я использую pushtime.txt, потому что там есть текущее время, которое я туда добавил :-) Далее перехожу к описанию работы nnCron. В винде есть стандартный способ появления пушей, типа таких: http://pics.rsh.ru/img/rНWdd_pf8kouci.png Они называются BALLOON, и в nnCron вызываются так: BALLOON: "balloontitle" "balloontext" Мне это не понравилось, и я воспользовался способом НINT, а именно TНINTW, который отображает пуш на экране с приостановкой задачи, и имеет таймер. Ты можешь почитать хелп к nnCron и отображать всё в "баллуне" BALLOON, считав из текстового файла pushtime.txt. Задачу запускать по WatchFile: "E:\FIDO\newmsg.flg". А что сделал я: В nnCron я создал задачу, которая выполняется по появлению файла-флага newmsg.flg, затем считывает данные из файла pushtime.txt (пришлось создать массив), и выводит их по TНINTW. Со счётчиком 1800 в секундах (полчаса), и звуковым писком. После чего, TНINTW со списом эх закрывается, и выводится простой НINT (задача завершается). Пока без комментариев: (это сунуть в nnCron.tab) === Начало Windows Clipboard === #( newmsgs WatchFile: "E:\FIDO\newmsg.flg" CREATE file_contentsz 512 ALLOT Action: PAD 512 S" E:\FIDO\pushtime.txt" FREAD file_contentsz PLACE НINT-POS: 130 990 НINT-SIZE: 185 60 0x00FF00 0x000000 НINT-COLOR S" Arial" 12 НINT-FONT BEEP: 100 500 BEEP: 100 800 BEEP: 100 1100 BEEP: 100 1400 TНINTW: "%file_contentsz COUNT%" 1800 НINT-POS: 129 0 НINT-SIZE: 50 15 0x00FF00 0x000000 НINT-COLOR S" Arial" 8 НINT-FONT НINT: "ECНOMAIL" )# === Конец Windows Clipboard === Координаты обоих хинтов и цвет, размер хинтов и шрифта в них - настроить на свой вкус. Хинт должен быть такого размера, чтобы там поместилось всё содержимое (nnCron не умеет автоматически расширять хинты! можно было обсчитать его размер по размеру файлика, но мне было лениво это делать). Время 1800 - настроить на свой вкус, а последнюю строчку (постфактумный НINT без списка эх) - можно вообще убрать, если она тебе не нужна. Максимум туда помещается 256 байт. Если полученный список эх окажется больше - то он не влезет. У меня написано 512, но это ошибка. Для закрытия всех открытых хинтов (если меня долго не было у компа) - я использую задачу в nnCron, где в цикле несколько раз запускается НINT-OFF. Как это сделать красивее - я пока не знаю. Задачу запускаю просто кнопкой-ярлычком в один клик. Простой, но грубый способ: в начало батника с запуском Голдед добавляешь создание файла-флага. По этому файлу-флагу запускается задача nnCron, которая прибивает все хинты, повторив несколько раз в цикле команду НINT-OFF. Тогда при запуске Голдеда - все хинты исчезнут) Как понять, сколько раз её надо повторить - я пока не придумал. Может быть, с помощью глобальных переменных в nnCron, которые при создании каждого нового хинта - увеличивать на единицу. Если лень мучаться с закрытием хинтов - используй BALLOON :) Ещё раз повторюсь, что я - чайник, и делал для себя, так что, прошу сильно не пинать :-) * Оpигинал в 8912.LOCAL * Также послано в RU.FIDONET.TODAY ... /WBR, Wild Cat/ | Modem CM lines: 8-800-333-9706, 8-495-597-0106 --- /New points and links are welcome, modem only/ |
#2
|
|||
|
|||
![]()
Cheslav Osanadze написал(а) к Wild Cat в Jan 25 09:48:28 по местному времени:
Привет Wild! 19 Янв 25 02:34, Wild Cat -> Cheslav Osanadze: CO>> Так-с... а можно пошагово, ну или со своими примерами, а там я CO>> попробую понять, рассказать это всё, уже не "вкратце", в нетмыле? CO>> Суть то я уловил, но реализация... WC> Сейчас будет пошагово. Спасибо! Попробую... Cheslav. ... Пассивный некрофил. --- |