vkquick
vkquick copied to clipboard
Group- и User-каттеры (1.0)
В 1.0 каттеры имеют возможность использовать возможности API и в целом методы контекста, что значительно упрощает процесс получения пользователя через упоминания, ссылки и прочее. К тому же, новая система с провайдерами и возможностью использовать typing
модуль в качестве типизатора позволяют максимально тонко настроить то, каким образом должен будет передан пользователь
Типы пользователей и групп
Итак, есть несколько основных типов пользователей и групп, которыми можно будет оборудовать внутри команды вообще
Эти объекты являются базисами работы с пользователями как в каттерах, так и, например, при получении сендера
-
User
: Враппер над API-объектом пользователя. Реализует некоторые поля и удобный format-syntax. -
UserProvider
: Провайдер пользователя, который совмещает некоторые API методы с враппером, т.е. позволяет манипулировать с враппером пользователя, используя возможности API
Точно такие же объекты сделаны и для группы. Помимо прочего есть общий тип Page
, который позволяется обобщить объекты пользователя и группы в один тип
Контейнер-типы для каттеров
-
Mention[T]
, гдеT
один из вышеперечисленных типов, либоUserID
/GroupID
(NewType инстансыint
, содержащие исключительно ID), либоPage
, т.е. любое упоминание -- как группы, так пользователя. Mention -- датакласс, содержащий полеalias
с алиасом, которым было обозначено упоминание и полеobject
(над именем стоит подумать с соотвествующим инстансом типа, переданным в контейнер -
Entity[T]
: ГдеT
принимает такие же типы, какMention
, но возвращает исключительно их. Сущность в таком случае можно передать через:
- Упоминание
- Ссылку
- Сырой ID
- Screen name
- Пользователь из пересланного сообщения (!)
- Имя пользователя (требует проработки и обсуждения)
-
Member[T]
: ГдеT
один из двух вышеперечисленных контейнеров. Обязывает, чтобы группа/пользователь были участниками чата
Примеры
@bot.add_command(names={"foo"})
async def foo(user: Mention[User]):
return f"{user:<fn> <ln>}"
foo @id1
-> Павел Дуров
@bot.add_command(names={"foo"})
async def foo(user: Entity[User]):
return f"{user:<fn> <ln>}"
foo @id1
-> Павел Дуров
foo vk.com/id1
-> Павел Дуров
foo durov
-> Павел Дуров
foo <переслано сообщение Павла Дурова>
-> Павел Дуров
@bot.add_command(names={"foo"})
async def foo(user: Entity[UserID]):
return str(user)
foo durov
-> 1
Эта команда сработает, только если был передан участник чата
@bot.add_command(names={"foo"})
async def foo(user: Member[Entity[User]]):
return f"{user:<fn> <ln>}"
Аналогичное можно сделать как с Group
-враппером, т.е. работать с группами, так и с Page
-враппером -- т.е. как группой, так и пользователем. Соотвествующий функционал с провайдерами
Пишите свое мнение об этом. Возможно у вас будут какие-то идеи, и мы обязательно их рассмотрим 😃