Участник:TalkArchivistBot (Rcgvmunt&TalkArchivistBot)

Перейти к навигации Перейти к поиску

TalkArchivistBot — это новый бот, который архивирует темы на страницах обсуждений.

Использование

[править | править код]

Представим, что вам надо настроить архивацию тем на странице Обсуждение участника:Кто-то.

1. Создайте отдельную страницу с настройками архивации.

Лучше всего для этого подойдёт подстраница архивируемой страницы, например:

Обсуждение участника:Кто-то/Настройки архивации

На выбранную страницу добавьте теги <syntaxhighlight lang="json"> и </syntaxhighlight>, между ними укажите настройки, например:

<syntaxhighlight lang="json">
{
    "defaultPath": "год",
    "conditions": {
        "daysAfterUpdate": 30
    }
}
</syntaxhighlight>

За пределами тегов можно добавить любой текст, например комментарий к настройкам. Этот текст будет проигнорирован ботом.

Настройки задаются в виде объекта в формате JSON. Описание настроек читайте ниже. Готовые примеры вы можете найти в разделе «Примеры настроек».

2. Поместите шаблон бота на архивируемую страницу.

Добавьте шаблон {{У:TalkArchivistBot/Архивация}} в шапку страницы Обсуждение участника:Кто-то, желательно как можно ближе к началу. В параметре шаблона укажите путь к странице с настройками архивации.

Если настройки находятся на подстранице, укажите относительный путь (с косой чертой в начале):

{{У:TalkArchivistBot/Архивация|/Настройки архивации}}

В ином случае укажите абсолютный путь:

{{У:TalkArchivistBot/Архивация|Обсуждение участника:Кто-то/Настройки архивации}}

3. Удалите шаблон другого бота-архивиста.

Если страница уже архивируется ботом BotDR, удалите шаблон {{User:ClaymoreBot/Архивация}}, чтобы отключить эту архивацию. TalkArchivistBot и BotDR могут нарушить работу друг друга, поэтому TalkArchivistBot проигнорирует страницу, если на ней есть шаблон другого бота.

4. Готово!

Архивация настроена.

Бот автоматически создаёт архивные страницы, вам их создавать не нужно. Однако ссылки на архив со страницы обсуждения вам потребуется добавлять вручную. В этом вам помогут шаблоны: {{Архив-А/2}}, {{Архив-П}}, {{Архивы}}, {{Archive box}}.

Настройки архивации задаются на отдельной странице в виде объекта в формате JSON. Далее описываются возможные свойства объекта.

Свойства проиллюстрированы примерами их использования. Многие из этих примеров довольно искусственные. Реальные примеры можно найти в разделе «Примеры настроек».

Свойство path задаёт произвольный путь к архивным страницам. На данный момент архив обязан располагаться на подстраницах архивируемой страницы, поэтому путь может быть только относительным и должен начинаться с косой черты.

Внутри пути используйте переменные, заключив их в фигурные скобки:

  • {год} — четырёхзначный номер года;
  • {полугодие} — номер полугодия (1 или 2);
  • {квартал} — номер квартала (от 1 до 4);
  • {месяц} — двузначный номер месяца (от 01 до 12).

Бот заархивирует тему по пути, который соответствует дате её создания. Например, если тема создана 12 июля 2023 года и задан путь /Архив/{год}/{месяц}, то тема попадёт на страницу /Архив/2023/07.

Путь обязан содержать переменную {год}. Остальные три переменные добавляются по желанию, при этом можно указать только одну из них (например, нельзя добавить одновременно и {полугодие}, и {месяц}).

Вместо пути, задаваемого свойством path, вы можете воспользоваться предустановленным путём с помощью свойства defaultPath. Настройки обязаны содержать одно из этих свойств.

Пример:

{
    "path": "/Архив/{год}-{месяц}",
    "conditions": {
        "daysAfterUpdate": 30
    }
}

Свойство defaultPath задаёт предустановленный путь к архивным страницам.

Укажите одно из значений:

  • год — преобразуется в путь /Архив/{год};
  • полугодие — /Архив/{год}/{полугодие}-е полугодие;
  • квартал — /Архив/{год}/{квартал}-й квартал;
  • месяц — /Архив/{год}/{месяц}.

Если вас не устраивает предустановленный путь, вместо свойства defaultPath используйте свойство path. Настройки обязаны содержать одно из этих свойств.

Пример:

{
    "defaultPath": "месяц",
    "conditions": {
        "daysAfterUpdate": 30
    }
}

Свойство reverse со значением true задаёт обратный порядок тем на архивных страницах (новые сверху). Если нужен прямой порядок, просто не указывайте это свойство.

Пример:

{
    "defaultPath": "год",
    "reverse": true,
    "conditions": {
        "daysAfterUpdate": 30
    }
}

Свойство header задаёт текст, который будет добавлен в шапку каждой архивной страницы. Если свойство отсутствует, в шапку будет добавлен шаблон {{закрыто}}.

Если на странице уже присутствует какая-либо шапка, бот оставит её без изменений, то есть проигнорирует свойство header и не станет добавлять шаблон {{закрыто}}.

Между шапкой и первым заголовком страницы бот добавит пустую строку.

Пример 1 — Произвольная шапка:

{
    "defaultPath": "год",
    "header": "{{своя шапка}}",
    "conditions": {
        "daysAfterUpdate": 30
    }
}

Пример 2 — Пустая шапка:

{
    "defaultPath": "год",
    "header": "",
    "conditions": {
        "daysAfterUpdate": 30
    }
}

Свойство conditions задаёт условия архивации. Условия — это логическое высказывание, которое вычисляется отдельно для каждой темы. Если высказывание истинно, тема будет заархивирована.

Значение свойства conditions — объект, каждое свойство которого задаёт условие архивации.

Свойство daysAfterUpdate проверяет, что с момента обновления темы, то есть после публикации последнего сообщения, прошло заданное количество дней. Хотя это свойство не обязательное, скорее всего, вам потребуется добавить его в условия, иначе тема (при срабатывании прочих условий) будет заархивирована, даже если менее одного дня назад появилось новое сообщение.

Пример — Заархивировать тему, если с момента обновления темы прошло 30 дней:

{
    "defaultPath": "год",
    "conditions": {
        "daysAfterUpdate": 30
    }
}

Свойство hasSection проверяет, что в теме есть раздел с заданным заголовком. Регистр всех букв в заголовке учитывается: hasSection: "Заголовок" не сработает для раздела «заголовок» или «ЗАГОЛОВОК».

Проверить отсутствие раздела можно с помощью свойства not. Указать несколько разделов позволяют свойства and и or.

Условия для некоторых часто используемых заголовков можно задать короче — смотрите далее.

Пример — Заархивировать тему, если с момента обновления темы прошло 3 дня и в теме есть раздел «Готово»:

{
    "defaultPath": "год",
    "conditions": {
        "daysAfterUpdate": 3,
        "hasSection": "Готово"
    }
}

hasPreliminaryResult

[править | править код]

Свойство hasPreliminaryResult со значением true проверяет, что в теме есть раздел с заголовком «Предварительный итог»; это же свойство со значением false проверяет отсутствие раздела. Регистр всех букв в заголовке учитывается.

Пример — Заархивировать тему, если с момента обновления темы прошло 60 дней и в теме есть раздел «Предварительный итог»:

{
    "defaultPath": "год",
    "conditions": {
        "daysAfterUpdate": 60,
        "hasPreliminaryResult": true
    }
}

Свойство hasResult со значением true проверяет, что в теме есть раздел с заголовком «Итог»; это же свойство со значением false проверяет отсутствие раздела. Регистр всех букв в заголовке учитывается.

Пример — Заархивировать тему, если с момента обновления темы прошло 7 дней и в теме есть раздел «Итог»:

{
    "defaultPath": "год",
    "conditions": {
        "daysAfterUpdate": 7,
        "hasResult": true
    }
}

Свойство hasContestedResult со значением true проверяет, что в теме есть раздел с заголовком «Оспоренный итог»; это же свойство со значением false проверяет отсутствие раздела. Регистр всех букв в заголовке учитывается.

Пример — Заархивировать тему, если с момента обновления темы прошло 90 дней и в теме есть раздел «Оспоренный итог»:

{
    "defaultPath": "год",
    "conditions": {
        "daysAfterUpdate": 90,
        "hasContestedResult": true
    }
}

Свойство hasTemplate проверяет, что в теме есть шаблон с заданным именем. Имя указывается без фигурных скобок. Учитывается регистр всех букв в имени шаблона, кроме первой: вы можете указать либо hasTemplate: "шаблон", либо hasTemplate: "Шаблон" — оба варианта сработают и для {{шаблон}}, и для {{Шаблон}}, но не сработают для {{ШАБЛОН}}.

Проверить отсутствие шаблона можно с помощью свойства not. Указать несколько шаблонов позволяют свойства and и or.

Пример — Заархивировать тему, если с момента обновления темы прошло 3 дня и в теме есть шаблон {{готово}} / {{Готово}}:

{
    "defaultPath": "год",
    "conditions": {
        "daysAfterUpdate": 3,
        "hasTemplate": "готово"
    }
}

На шаблон могут вести перенаправления. Бот не получает список перенаправлений, поэтому их следует явно указать с помощью свойства or.

Так как задавать шаблоны со всеми их перенаправлениями неудобно, у бота есть внутренний список шаблонов, которые, вероятно, могут быть указаны в настройках для разных страниц. На данный момент в этом списке находится только шаблон {{сделано}}. Если в условиях указать hasTemplate: "сделано" или указать любое перенаправление (например, hasTemplate: "done"), то бот воспримет это так, будто в условиях заданы как целевой шаблон, так и все его перенаправления. Чтобы добавить в список другие шаблоны, напишите на странице обсуждения бота.

Свойство not задаёт объект с условиями, к которым применяется логическая операция «не», то есть результат проверки условий меняется на обратный.

Пример — Заархивировать тему, если с момента обновления темы прошло 14 дней и в теме нет раздела «К итогу»:

{
    "defaultPath": "год",
    "conditions": {
        "daysAfterUpdate": 14,
        "not": {
            "hasSection": "К итогу"
        }
    }
}

Свойство and задаёт массив объектов с условиями, к которым применяется логическая операция «и». Если все объекты после проверки дают истину, то свойство and даст истину; в ином случае свойство даст ложь.

Пример — Заархивировать тему, если с момента обновления темы прошло 7 дней и (в теме есть раздел «Первый» и в теме есть раздел «Второй»):

{
    "defaultPath": "год",
    "conditions": {
        "daysAfterUpdate": 7,
        "and": [
            {
                "hasSection": "Первый"
            },
            {
                "hasSection": "Второй"
            }
        ]
    }
}

Свойство or задаёт массив объектов с условиями, к которым применяется логическая операция «или». Если хотя бы один объект после проверки даёт истину, то свойство or даст истину; в ином случае свойство даст ложь.

Пример — Заархивировать тему, если с момента обновления темы прошло 30 дней или (в теме есть раздел «Итог» и с момента обновления темы прошло 7 дней):

{
    "defaultPath": "год",
    "conditions": {
        "or": [
            {
                "daysAfterUpdate": 30
            },
            {
                "hasResult": true,
                "daysAfterUpdate": 7
            }
        ]
    }
}

Примеры настроек

[править | править код]

Возможно, эти примеры станут для вас хорошей отправной точкой при составлении собственных настроек архивации.

  • Заархивировать тему, если с момента обновления темы прошло 30 дней.
  • Архивные темы сложить по пути /Архив/{год}.
  • Темы на архивной странице отсортировать в прямом порядке (новые снизу).
  • В шапку архивной страницы добавить шаблон {{закрыто}}.
{
    "defaultPath": "год",
    "conditions": {
        "daysAfterUpdate": 30
    }
}
  • Заархивировать тему, если с момента обновления темы прошло 30 дней или (в теме есть раздел «Итог» и с момента обновления темы прошло 7 дней).
  • Архивные темы сложить по пути /Архив/{год}.
  • Темы на архивной странице отсортировать в прямом порядке (новые снизу).
  • В шапку архивной страницы добавить шаблон {{закрыто}}.
{
    "defaultPath": "год",
    "conditions": {
        "or": [
            {
                "daysAfterUpdate": 30
            },
            {
                "hasResult": true,
                "daysAfterUpdate": 7
            }
        ]
    }
}
  • Заархивировать тему, если с момента обновления темы прошло 14 дней или [(в теме есть раздел «Итог» или в теме есть шаблон {{сделано}}) и с момента обновления темы прошло 3 дня].
  • Архивные темы сложить по пути /Архив/{год}/{месяц}.
  • Темы на архивной странице отсортировать в обратном порядке (новые сверху).
  • В шапку архивной страницы добавить шаблон {{архив}}.
{
    "defaultPath": "месяц",
    "reverse": true,
    "header": "{{архив}}",
    "conditions": {
        "or": [
            {
                "daysAfterUpdate": 14
            },
            {
                "or": [
                    {
                        "hasResult": true
                    },
                    {
                        "hasTemplate": "сделано"
                    }
                ],
                "daysAfterUpdate": 3
            }
        ]
    }
}
  • Заархивировать тему, если [((в теме нет раздела «Предварительный итог» и с момента обновления темы прошло 30 дней) или (в теме есть раздел «Предварительный итог» и с момента обновления темы прошло 60 дней)) и в теме нет раздела «Оспоренный итог»] или [в теме есть раздел «Итог» и с момента обновления темы прошло 7 дней].
    • Если в теме нет предварительного итога, то она будет заархивирована через 30 дней; если предварительный итог есть, то через 60 дней. Дополнительное время даётся на подведение окончательного итога.
    • Если в теме есть оспоренный итог, но нет окончательного, то она не будет заархивирована никогда. Неограниченное время даётся на обсуждение оспаривания и на подведение окончательного итога.
    • Если в теме есть окончательный итог, то она будет заархивирована через 7 дней.
  • Архивные темы сложить по пути /Архив/{год}-{квартал}.
  • Темы на архивной странице отсортировать в прямом порядке (новые снизу).
  • В шапку архивной страницы добавить шаблон {{архив}}.
{
    "path": "/Архив/{год}-{квартал}",
    "header": "{{архив}}",
    "conditions": {
        "or": [
            {
                "or": [
                    {
                        "hasPreliminaryResult": false,
                        "daysAfterUpdate": 30
                    },
                    {
                        "hasPreliminaryResult": true,
                        "daysAfterUpdate": 60
                    }
                ],
                "hasContestedResult": false
            },
            {
                "hasResult": true,
                "daysAfterUpdate": 7
            }
        ]
    }
}

Технологии

[править | править код]
  • Бот написан на языке TypeScript и работает в среде Node.js.
  • Код бота закрыт (но может стать открытым в будущем).