---
url: /commands/arguments.md
description: >-
Как читать аргументы пользовательской команды — слова после команды,
упомянутого участника, срок и причину.
---
# Аргументы команды
Аргументы — это все, что участник написал после команды. В !выдать @anna 100 за турнир аргументы — это @anna, 100, за и турнир. Шаблон получает их в переменной arguments.
## Слова по номерам { #get }
Бот делит текст после команды на слова по пробелам и нумерует их с единицы.
Пусть участник написал:
```text
!выдать @anna 100 за турнир
```
| Запись | Результат | Что это |
|---|---|---|
| `arguments.get(1)` | `@anna` | Первое слово |
| `arguments.get(2)` | `100` | Второе слово |
| `arguments.get(5)` | пусто | Такого слова нет |
| `arguments.after(3)` | `за турнир` | Все, начиная с третьего слова |
| `arguments.before(2)` | `@anna 100` | Все до второго слова включительно |
| `arguments.range(2, 3)` | `100 за` | Со второго по третье |
| `arguments.value` | `@anna 100 за турнир` | Все одной строкой |
| `arguments.args` | `[@anna, 100, за, турнир]` | Список слов |
| `arguments.args \| length` | `4` | Сколько слов |
::: tip Числа приходят текстом
`arguments.get(2)` — это текст «100», но бот сам превратит его в число, когда вы будете сравнивать или считать: `arguments.get(2) > 50` сработает правильно. Проверить, что написали именно число, можно так: `arguments.get(2) is number`.
:::
## Кому адресована команда { #target }
`arguments.targetMember` — участник, к которому обращена команда. Бот ищет его в таком порядке:
1. **Ответ на сообщение** — участник, на чье сообщение ответили командой. Самый надежный способ.
2. **Упоминание по имени** — когда вы выбираете человека из списка при вводе `@` и Telegram вставляет ссылку на него.
3. **Числовой ID** первым аргументом: `!профиль 123456789`.
4. **@username** — если бот уже видел этого участника в чате.
```template
{% set target = arguments.targetMember %}
{% require target returning 'Ответь командой на сообщение участника или упомяни его' %}
Профиль {{ target }}: уровень {{ target.rank.level }}
```
::: warning Почему @username не всегда находится
Telegram не дает ботам находить пользователей по username. Бот узнает username, только когда человек пишет в чат при боте. Поэтому надежнее отвечать командой на сообщение нужного участника.
:::
## Срок и причина { #duration }
Для команд в духе модерации есть готовый разбор срока и причины — как у встроенных `/mute` и `/ban`:
| Запись | Что вернет |
|---|---|
| `arguments.duration` | Срок из аргументов в миллисекундах: первое слово, похожее на срок |
| `arguments.reason` | Остаток текста — причина |
Сроки пишутся так: `30s`, `10m`, `2h`, `1d`, `1w`, `1mo`, `1y` или по-русски `10м`, `2ч`, `1д`, `1нед`, `1мес`, а также составные: `1ч30м`.
```template
{% set target = arguments.targetMember %}
{% require target returning 'Кого наказываем?' %}
{% set ms = arguments.duration ?: 3600000 %}
{{ target }} отправлен подумать на {{ duration(ms) }}.
Причина: {{ arguments.reason ?: 'не указана' }}
```
Функция `duration(ms)` превращает миллисекунды в понятный текст: «1 ч.», «30 мин.».
## Проверяем аргументы { #validate }
Всегда проверяйте, что участник написал нужное, — иначе команда выдаст непонятный результат. Удобнее всего тег `require`: если условие не выполнено, бот остановится и ответит вашим текстом.
```template
{% set target = arguments.targetMember %}
{% set amount = arguments.get(2) %}
{% require target returning 'Укажи участника: !выдать @anna 100' %}
{% require amount is number returning 'Укажи сумму числом: !выдать @anna 100' %}
{% require amount > 0 returning 'Сумма должна быть больше нуля' %}
{% set balance = target.getAttribute('coins').increment(amount) %}
{{ target }} получил {{ amount }} 🪙. Баланс: {{ balance }}
```
## Что не поддерживается { #unsupported }
В Telegram нет параметров slash-команд, поэтому `getOption` и `getOptionsByType` всегда возвращают пустое значение. Вместо них есть `duration` и `reason`.
Полный список — в справочнике [Arguments](/reference/arguments).