Контекст¶
Context¶
Context
dataclass
¶
Контекст, в котором вызывается команда.
Этот класс предоставляет удобный доступ к часто используемым атрибутам и методам при обработке команд.
Атрибуты
message: Экземпляр NewMessage, вызвавший команду bot: Экземпляр Bot app: Экземпляр App command: Вызываемая команда (Command) prefix: Префикс, использованный для вызова команды invoked_with: Имя/алиас, использованный для вызова команды
Пример
@commands.command() async def hello(ctx: commands.Context): await ctx.send(f"Hello, {ctx.author}!")
@commands.command() async def userinfo(ctx: commands.Context): user = await ctx.fetch_sender(User) await ctx.send(f"User: {user.first_name}")
me
property
¶
Экземпляр Bot (алиас для ctx.bot).
Возвращает
Bot: Экземпляр Bot
Пример
@commands.command() async def info(ctx: commands.Context): mention = await ctx.me.mention() await ctx.send(f"I am {mention}")
chat_id
property
¶
ID чата (локальный, без смещения 2000000000). Возвращает None, если сообщение не из чата.
Пример
if ctx.chat_id: print(f"Сообщение из чата {ctx.chat_id}")
chat
property
¶
Chat обёртка для управления чатом. Возвращает None, если сообщение не из чата. Результат кешируется для повторных обращений.
Пример
if ctx.chat: members = await ctx.chat.get_members() await ctx.chat.kick(user_id=123)
valid
property
¶
Валиден ли контекст для вызова команды.
Возвращает
True, если команда может быть вызвана
extra
property
¶
Дополнительные данные, прикреплённые к команде.
Возвращает
Словарь дополнительных данных команды
clean_prefix
property
¶
Префикс без упоминания.
Если было использовано упоминание (например, [club123|@bot]),
возвращает пустую строку. Иначе возвращает префикс как есть.
Возвращает
str: Чистый префикс или пустая строка для упоминания
invoked_parents
property
¶
Список родительских групп, через которые была вызвана эта команда.
Возвращает
list[Group]: Список групп от ближайшего родителя к корню
Пример
@config.group() async def settings(ctx: Context): pass
@settings.command() async def show(ctx: Context): for parent in ctx.invoked_parents: print(f"Родитель: {parent.name}")
from_message
classmethod
¶
Создать Context из NewMessage.
Аргументы
message: Экземпляр NewMessage command: Вызываемая команда (Command) prefix: Использованный префикс invoked_with: Использованный алиас/имя
Возвращает
Экземпляр Context
Source code in vkflow\commands\context.py
is_on_cooldown
¶
Проверить, находится ли текущая команда на кулдауне для этого контекста.
Возвращает
True если на кулдауне, False иначе
Пример
if ctx.is_on_cooldown(): remaining = ctx.get_cooldown_retry_after() await ctx.send(f"Подожди {remaining:.1f}с")
Source code in vkflow\commands\context.py
get_cooldown_retry_after
¶
Получить максимальное оставшееся время кулдауна (в секундах).
Возвращает
Секунды до окончания кулдауна (0.0 если не на кулдауне)
Пример
remaining = ctx.get_cooldown_retry_after() if remaining > 0: await ctx.send(f"Команда доступна через {remaining:.1f}с")
Source code in vkflow\commands\context.py
send
async
¶
send(
message=None,
*,
attachment=None,
attachments=None,
file=None,
files=None,
keyboard=None,
payload=None,
view=None,
delete_after=None,
**kwargs
)
Отправить сообщение в тот же чат.
Аргументы
message: Текст сообщения attachment: Одно вложение attachments: Список вложений file: Одно вложение (алиас для attachment) files: Список вложений (алиас для attachments) keyboard: Клавиатура payload: Payload сообщения view: Интерактивный View с кнопками delete_after: Удалить сообщение через указанное количество секунд **kwargs: Дополнительные параметры для messages.send
Пример
msg = await ctx.send("Привет!") await msg.edit("Привет, мир!")
await ctx.send("Фото", file=File("photo.jpg"))
await ctx.send("Исчезну!", delete_after=5)
Source code in vkflow\commands\context.py
reply
async
¶
reply(
message=None,
*,
attachment=None,
attachments=None,
file=None,
files=None,
keyboard=None,
payload=None,
view=None,
delete_after=None,
**kwargs
)
Ответить на сообщение.
Аргументы
message: Текст сообщения attachment: Одно вложение attachments: Список вложений file: Одно вложение (алиас для attachment) files: Список вложений (алиас для attachments) keyboard: Клавиатура payload: Payload сообщения view: Интерактивный View с кнопками delete_after: Удалить сообщение через указанное количество секунд **kwargs: Дополнительные параметры для messages.send
Пример
msg = await ctx.reply("Привет!") await msg.edit("Обновлённый привет!")
await ctx.reply("Исчезну!", delete_after=5)
Source code in vkflow\commands\context.py
forward
async
¶
forward(
peer_id,
message=None,
*,
attachment=None,
attachments=None,
file=None,
files=None,
keyboard=None,
payload=None,
view=None,
delete_after=None,
**kwargs
)
Переслать текущее сообщение в другой чат.
Аргументы
peer_id: ID чата-получателя message: Текст для пересылки attachment: Одно вложение attachments: Список вложений file: Одно вложение (алиас для attachment) files: Список вложений (алиас для attachments) keyboard: Клавиатура payload: Payload сообщения view: Интерактивный View с кнопками delete_after: Удалить сообщение через указанное количество секунд **kwargs: Дополнительные параметры для messages.send
Пример
await ctx.forward(peer_id=123456789) await ctx.forward(peer_id=123456789, message="Смотри!")
Source code in vkflow\commands\context.py
fetch_sender
async
¶
Получить отправителя сообщения.
Аргументы
typevar: Тип отправителя (User, Group или Page) fields: Дополнительные поля для получения name_case: Падеж имени
Возвращает
Объект отправителя
Source code in vkflow\commands\context.py
fetch_author
async
¶
Получить автора сообщения с кешированием.
Повторные вызовы с теми же параметрами возвращают закешированный результат без дополнительных API-запросов.
Аргументы
fields: Дополнительные поля для получения (bdate, city и т.д.) name_case: Падеж для склонения: - "nom" - именительный (кто? что?) - "gen" - родительный (кого? чего?) - "dat" - дательный (кому? чему?) - "acc" - винительный (кого? что?) - "ins" - творительный (кем? чем?) - "abl" - предложный (о ком? о чём?)
Возвращает
User или Group в зависимости от from_id
Пример
author = await ctx.fetch_author(name_case="acc") await ctx.reply(f"Погладил {author.mention()}")
Source code in vkflow\commands\context.py
fetch_photos
async
¶
fetch_docs
async
¶
download_photos
async
¶
invoke
async
¶
Вызвать команду в этом контексте.
Проходит через ВСЕ проверки (кулдауны, чеки, фильтры, max_concurrency).
Аргументы
command: Команда для вызова. Если None, вызывает self.command args: Позиционные аргументы для handler команды *kwargs: Именованные аргументы для handler команды
Возвращает
Возвращаемое значение handler команды
Исключения
ValueError: Если нет команды для вызова OnCooldownError: Если команда на кулдауне CheckFailureError: Если проверка не пройдена MaxConcurrencyReachedError: Если превышен лимит max_concurrency
Пример
@commands.command() async def parent(ctx: commands.Context): await ctx.invoke(other_command, arg1="value")
@commands.command() async def chain(ctx: commands.Context): await ctx.invoke(ctx.command.commands["sub"])
Source code in vkflow\commands\context.py
reinvoke
async
¶
Повторно вызвать команду, пропуская ВСЕ проверки.
Пропускает ВСЕ проверки: кулдауны, чеки, фильтры, max_concurrency. Напрямую вызывает handler команды.
Аргументы
command: Команда для вызова. Если None, вызывает self.command args: Позиционные аргументы для handler команды *kwargs: Именованные аргументы для handler команды
Возвращает
Возвращаемое значение handler команды
Исключения
ValueError: Если нет команды для вызова
Пример
@commands.command() async def admin_retry(ctx: commands.Context, cmd_name: str): '''Админ-команда для повтора без проверок''' cmd = ctx.app.get_command(cmd_name)
if cmd:
await ctx.reinvoke(cmd)
@commands.command() async def retry(ctx: commands.Context): '''Повторить текущую команду''' await ctx.reinvoke()
Source code in vkflow\commands\context.py
wait_for
async
¶
Ожидание события. Делегирует в App.wait_for().
Аргументы
event_name: Тип события для ожидания (например, "message_new") timeout: Таймаут в секундах. None -ждать бесконечно check: Предикат для фильтрации событий
Возвращает
NewEvent или tuple в зависимости от события
Исключения
EventTimeoutError: Если таймаут превышен
Source code in vkflow\commands\context.py
wait_for_message
async
¶
Ожидание нового сообщения с опциональной фильтрацией по peer_id и автору.
По умолчанию фильтрует по тому же peer_id и from_id, что и текущий контекст. Используйте filter_peer=False / filter_author=False для отключения.
Аргументы
timeout: Таймаут в секундах. None -ждать бесконечно check: Дополнительный предикат после встроенных фильтров filter_peer: Фильтровать по peer_id == ctx.peer_id filter_author: Фильтровать по from_id == ctx.author
Возвращает
Экземпляр NewMessage
Исключения
EventTimeoutError: Если таймаут превышен
Пример
@commands.command() async def ask_name(ctx: commands.Context): await ctx.send("Как тебя зовут?") reply = await ctx.wait_for_message(timeout=30) await ctx.send(f"Привет, {reply.msg.text}!")
Source code in vkflow\commands\context.py
NewMessage¶
NewMessage
dataclass
¶
NewMessage(
api,
truncated_message,
event,
bot,
payload_factory=None,
argument_processing_payload=ArgumentPayload(),
)
Bases: NewEvent[NewEventPayloadFieldTypevar, BotPayloadFieldTypevar, AppPayloadFieldTypevar], SentMessage
fetch_author
async
¶
Получает автора сообщения с кэшированием.
Повторные вызовы с теми же параметрами возвращают закэшированный результат без дополнительных API запросов.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
fields
|
list[str] | None
|
Дополнительные поля для запроса (bdate, city, etc.) |
None
|
name_case
|
str | None
|
Падеж для склонения имени: - "nom" - именительный (кто? что?) - "gen" - родительный (кого? чего?) - "dat" - дательный (кому? чему?) - "acc" - винительный (кого? что?) - "ins" - творительный (кем? чем?) - "abl" - предложный (о ком? о чём?) |
None
|
Returns:
| Type | Description |
|---|---|
User | Group
|
User или Group в зависимости от from_id |
Example
author = await ctx.fetch_author(name_case="acc") await ctx.reply(f"Погладил {author.mention()}")
Source code in vkflow\app\storages.py
CallbackButtonPressed¶
NewEvent¶
NewEvent
dataclass
¶
Bases: Generic[AppPayloadFieldTypevar, BotPayloadFieldTypevar, NewEventPayloadFieldTypevar]