vkquick icon indicating copy to clipboard operation
vkquick copied to clipboard

Group- и User-каттеры (1.0)

Open deknowny opened this issue 3 years ago • 0 comments

В 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, но возвращает исключительно их. Сущность в таком случае можно передать через:

  1. Упоминание
  2. Ссылку
  3. Сырой ID
  4. Screen name
  5. Пользователь из пересланного сообщения (!)
  6. Имя пользователя (требует проработки и обсуждения)
  • 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-враппером -- т.е. как группой, так и пользователем. Соотвествующий функционал с провайдерами

Пишите свое мнение об этом. Возможно у вас будут какие-то идеи, и мы обязательно их рассмотрим 😃

deknowny avatar Apr 13 '21 21:04 deknowny