
Например, модератору (или комодератору, в зависимости от распределения их обязанностей) приходится
Если узел (или пойнт) работает беспрерывно на одном и том же компьютере, то такая публикация автоматизируется простым, бесхитростным способом: публикацию файла вписывают в список задач
Если же фидонетовская система работает не на одном и том же компьютере (есть ведь фидошники, которые с одного рабочего места на другое таскали с собою комплект фидонетовского софта некогда на дискете, а в новейшее время таскают на флэшке) или хотя бы работает не беспрерывно (а запускается фидошником время от времени, когда в нём рождается желание отправить, получить и почитать фидопочту), то регулярность публикаций обеспечивается иначе — не сервисом (демоном), а простой программою, которая проверяет, не прошло ли ещё столько дней со времени последней публикации файла, сколько необходимо для того, чтобы настало время вдругорядь опубликовать его.
Сегодня мы рассмотрим, каким подспорьем может
Прежде всего отметим, что значительная часть этой задачи ужé решена.
Для того, чтобы опубликовать файл, достаточно подать команду hpt post
Для того, чтобы сохранить (запомнить) дату и время такой публикации, достаточно подать команду touch по отношению к некоторому файлу, обновив дату его последнего изменения.
Стало быть, остаётся сочинить только такую команду, которая выполняла бы противоположную задачу — позволяла бы из командной строки считать возраст указанного файла, выраженный в днях, а также сравнить его с некоторым указанным возрастом. И для этой цели нам послужит вот какой JavaScript
var fs = require('fs');
var clog = console.log;
if (process.argv.length < 3) {
clog('Usage:');
clog(' node agedays "filename" [N]');
clog('');
clog('Parameters:');
clog(' filename -- name of the file which age (in days) is checked');
clog(' N (optional) -- if file is N days old (or older),');
clog(' errorlevel 1 is set');
} else if (process.argv.length == 3) {
try {
var msec = (new Date()).getTime() -
fs.statSync(process.argv[2]).mtime.getTime();
var days = msec / 1000 / 60 / 60 / 24;
clog('File "' + process.argv[2] + '" is ' + days + ' days old.');
} catch(e) {
clog('File "' + process.argv[2] + '" cannot be opened.');
}
} else {
try {
var msec = (new Date()).getTime() -
fs.statSync(process.argv[2]).mtime.getTime();
var days = msec / 1000 / 60 / 60 / 24;
if( days > (+process.argv[3]) ) {
process.exit(1);
} else {
process.exit(0);
}
} catch(e) {
clog('File "' + process.argv[2] + '" cannot be opened.');
process.exit(2);
}
}
Сохранив этот скрипт и назвав его agedays.js, мы получаем возможность запускать его для выяснения возраста файла и для сравнения этого возраста с заранее заданным числом. Вот пример таких действий в Windows
![[скриншот agedays]](https://habrastorage.org/r/w1560/storage2/4db/d95/7ba/4dbd957ba9e9497b0e40ac4f0064eb2b.png)
Прибавив такое средство к двум ранее имевшимся (к эхопроцессору
@echo off
:checkmonth
node agedays NodePost\monthly._flag 30
if errorlevel 1 goto monthly
goto checkweek
:monthly
\utils\unxutils\touch NodePost\monthly._flag
hpt post -nf "Mithgol's Wishlist Robot" -s "Список желаемых функций Голдеда" -e "Ru.GoldEd" -z "Mithgol's NodePost" -o "FGHI Global Headlight Ignited" -f loc NodePost\GED_Wish.txt
goto checkweek
:checkweek
node agedays NodePost\weekly._flag 7
if errorlevel 1 goto weekly
goto end
:weekly
\utils\unxutils\touch NodePost\weekly._flag
hpt post -nf "Moderator of Ru.Fidonet.Yo" -s "*** Rules" -e "Ru.Fidonet.Yo" -z "Mithgol's NodePost" -o "FGHI Global Headlight Ignited" -f loc NodePost\YoRulez.txt
hpt post -nf "Moderator of Ru.Russophobia" -s "*** Rules" -e "Ru.Russophobia" -z "Mithgol's NodePost" -o "FGHI Global Headlight Ignited" -f loc NodePost\PhobRule.txt
hpt post -nf "Moderator of Ru.Russian.1916" -s "*** Rules" -e "Ru.Russian.1916" -z "Mithgol's NodePost" -o "FGHI Global Headlight Ignited" -f loc NodePost\rule1916.txt
goto end
:end
Такой батник (в моём примере он называется
Вы можете видеть в исходном коде, что этим батником обеспечивается ежемесячная (раз в тридцать дней) публикация одного файла в Ru.GoldED, а также еженедельная (раз в семь дней) рассылка трёх файлов с правилами по трём эхоконференциям Фидонета от официального имени модератора
Строки-команды, начинающиеся со слов «hpt post», достаточно длинны и будут наверняка подвергнуты автоматическому переносу при показе их на Хабрахабре, но в действительности каждая такая команда записывается в одну строку. (Чтобы они не сливались с соседними командами после такого переноса, я для наглядности добавил по одной пустой строке сверху и снизу от каждой команды
(Если вместо популярного HPT вы пользуетесь в Фидонете другим эхопроцессором, то все эти сведения позволят вам легко заменить
Большинство элементов вышеизложенного решения (движок Node.js, скрипт agedays, команда touch, эхопроцессор HPT) являются к тому же полисистемными (кросс-платформенными), так что при переносе его с Windows на другую операционную систему вам придётся переписать только батник.
Скрипт agedays.js я выложил на Гитхабе под свободной лицензией MIT, и на этом рассказ мой окончен.