503 lines
20 KiB
Python
503 lines
20 KiB
Python
# Generated by `node scripts/gen-bot-api.mjs` from docs/bot-api/openapi.json — DO NOT EDIT.
|
||
# CI (`gen-bot-api.mjs --check`) fails when this file is out of date.
|
||
# SPDX-License-Identifier: MIT
|
||
"""Types and method wrappers of the GusVoice Bot API, generated from the OpenAPI document."""
|
||
from __future__ import annotations
|
||
|
||
from typing import Any, Dict, List, Literal, Optional, Sequence, TypedDict, Union
|
||
|
||
SCHEMA_VERSION = "1.4.0"
|
||
"""Version of the OpenAPI document this module was generated from."""
|
||
API_VERSION = 4
|
||
"""Bot API level (`getMe.api_version`) the wrappers below know about."""
|
||
|
||
METHODS: Dict[str, int] = {
|
||
"getMe": 1,
|
||
"getUpdates": 1,
|
||
"setWebhook": 1,
|
||
"deleteWebhook": 1,
|
||
"getWebhookInfo": 1,
|
||
"sendMessage": 1,
|
||
"editMessageText": 1,
|
||
"deleteMessage": 1,
|
||
"sendChatAction": 1,
|
||
"getChat": 1,
|
||
"editMessageReplyMarkup": 2,
|
||
"answerCallbackQuery": 2,
|
||
"setMyCommands": 2,
|
||
"getMyCommands": 2,
|
||
"deleteMyCommands": 2,
|
||
"setMessageReaction": 3,
|
||
"pinChatMessage": 3,
|
||
"unpinChatMessage": 3,
|
||
"getChatHistory": 3,
|
||
"getChatMember": 3,
|
||
"getChatMemberCount": 3,
|
||
"getChatMembers": 3,
|
||
"getMyServers": 3,
|
||
"getServer": 3,
|
||
"addChatMemberRole": 3,
|
||
"removeChatMemberRole": 3,
|
||
"banChatMember": 3,
|
||
"unbanChatMember": 3,
|
||
"kickChatMember": 3,
|
||
"leaveChat": 3,
|
||
"joinVoice": 4,
|
||
"leaveVoice": 4,
|
||
"getVoiceChatMembers": 4,
|
||
}
|
||
"""Every Bot API method → the API level it appeared in (`getMe.api_version`)."""
|
||
|
||
UPDATE_TYPES = (
|
||
"message",
|
||
"edited_message",
|
||
"message_deleted",
|
||
"my_chat_member",
|
||
"callback_query",
|
||
"message_reaction",
|
||
"chat_member",
|
||
"voice_state",
|
||
)
|
||
"""Update kinds (one key besides `update_id` in every `Update`); unknown kinds may appear — ignore them."""
|
||
|
||
|
||
# required: url, file_name, mime_type, file_size
|
||
Attachment = TypedDict("Attachment", {
|
||
"url": "str",
|
||
"file_name": "str",
|
||
"mime_type": "str",
|
||
"file_size": "float",
|
||
}, total=False)
|
||
|
||
# required: command, description
|
||
BotCommand = TypedDict("BotCommand", {
|
||
"command": "str",
|
||
"description": "str",
|
||
}, total=False)
|
||
|
||
# Supported `type`: default, all_private_chats, all_group_chats; other types are rejected with 400.
|
||
# required: type
|
||
BotCommandScope = TypedDict("BotCommandScope", {
|
||
"type": "str",
|
||
}, total=False)
|
||
|
||
# required: id, username, display_name, bot, description, about, public
|
||
BotUser = TypedDict("BotUser", {
|
||
"id": "str",
|
||
"username": "str",
|
||
"display_name": "str",
|
||
"bot": "bool",
|
||
"instance_domain": "str",
|
||
"description": "str",
|
||
"about": "str",
|
||
"public": "bool",
|
||
"api_version": "float",
|
||
"features": "List[str]",
|
||
"dropped_update_count": "float",
|
||
}, total=False)
|
||
|
||
# required: id, from, message, data, date
|
||
CallbackQuery = TypedDict("CallbackQuery", {
|
||
"id": "str",
|
||
"from": "User",
|
||
"message": "Message",
|
||
"data": "str",
|
||
"date": "float",
|
||
}, total=False)
|
||
|
||
# required: id, type
|
||
Chat = TypedDict("Chat", {
|
||
"id": "str",
|
||
"type": "Literal[\"dm\", \"channel\", \"server\", \"voice\"]",
|
||
"server_id": "str",
|
||
"title": "str",
|
||
}, total=False)
|
||
|
||
# required: id, type
|
||
ChatFullInfo = TypedDict("ChatFullInfo", {
|
||
"id": "str",
|
||
"type": "Literal[\"dm\", \"channel\", \"server\", \"voice\"]",
|
||
"server_id": "str",
|
||
"title": "str",
|
||
"user": "User",
|
||
"member_count": "float",
|
||
}, total=False)
|
||
|
||
# required: user, status, role_ids
|
||
ChatMember = TypedDict("ChatMember", {
|
||
"user": "User",
|
||
"status": "Literal[\"creator\", \"member\", \"left\", \"kicked\"]",
|
||
"nickname": "str",
|
||
"role_ids": "List[str]",
|
||
"joined_date": "float",
|
||
}, total=False)
|
||
|
||
# required: chat, from, date, old_status, new_status
|
||
ChatMemberUpdated = TypedDict("ChatMemberUpdated", {
|
||
"chat": "Chat",
|
||
"from": "User",
|
||
"date": "float",
|
||
"old_status": "Literal[\"creator\", \"member\", \"left\", \"kicked\"]",
|
||
"new_status": "Literal[\"creator\", \"member\", \"left\", \"kicked\"]",
|
||
}, total=False)
|
||
|
||
# required: members
|
||
ChatMembersPage = TypedDict("ChatMembersPage", {
|
||
"members": "List[ChatMember]",
|
||
"next_offset": "str",
|
||
}, total=False)
|
||
|
||
# required: ok, error_code, description
|
||
Error = TypedDict("Error", {
|
||
"ok": "bool",
|
||
"error_code": "float",
|
||
"description": "str",
|
||
"retry_after": "float",
|
||
}, total=False)
|
||
|
||
# Exactly one of `callback_data` (1–64 BYTES of UTF-8, not characters) and `url` (http(s) only, no credentials in the address).
|
||
# required: text
|
||
InlineKeyboardButton = TypedDict("InlineKeyboardButton", {
|
||
"text": "str",
|
||
"callback_data": "str",
|
||
"url": "str",
|
||
}, total=False)
|
||
|
||
# At least one row, 1–8 buttons in a row, at most 100 buttons in total.
|
||
# required: inline_keyboard
|
||
InlineKeyboardMarkup = TypedDict("InlineKeyboardMarkup", {
|
||
"inline_keyboard": "List[List[InlineKeyboardButton]]",
|
||
}, total=False)
|
||
|
||
# required: —
|
||
InputEmbed = TypedDict("InputEmbed", {
|
||
"title": "Optional[str]",
|
||
"description": "Optional[str]",
|
||
"url": "Optional[str]",
|
||
"color": "Optional[int]",
|
||
"timestamp": "Optional[str]",
|
||
"fields": "Optional[List[Dict[str, Any]]]",
|
||
"author": "Optional[Dict[str, Any]]",
|
||
"footer": "Optional[Dict[str, Any]]",
|
||
"image": "Optional[Dict[str, Any]]",
|
||
"thumbnail": "Optional[Dict[str, Any]]",
|
||
}, total=False)
|
||
|
||
# required: message_id, chat, from, date, text
|
||
Message = TypedDict("Message", {
|
||
"message_id": "str",
|
||
"chat": "Chat",
|
||
"from": "User",
|
||
"date": "float",
|
||
"edit_date": "float",
|
||
"text": "str",
|
||
"reply_to_message_id": "str",
|
||
"attachments": "List[Attachment]",
|
||
"embeds": "List[MessageEmbed]",
|
||
"reply_markup": "InlineKeyboardMarkup",
|
||
}, total=False)
|
||
|
||
# required: message_id, chat, date
|
||
MessageDeleted = TypedDict("MessageDeleted", {
|
||
"message_id": "str",
|
||
"chat": "Chat",
|
||
"date": "float",
|
||
}, total=False)
|
||
|
||
# required: —
|
||
MessageEmbed = TypedDict("MessageEmbed", {
|
||
"title": "str",
|
||
"url": "str",
|
||
"description": "str",
|
||
"color": "float",
|
||
"timestamp": "str",
|
||
"author": "Dict[str, Any]",
|
||
"footer": "Dict[str, Any]",
|
||
"fields": "List[Dict[str, Any]]",
|
||
"image": "Dict[str, Any]",
|
||
"thumbnail": "Dict[str, Any]",
|
||
"imageLink": "str",
|
||
"thumbnailLink": "str",
|
||
}, total=False)
|
||
|
||
# required: chat, message_id, user, date, old_reaction, new_reaction
|
||
MessageReactionUpdated = TypedDict("MessageReactionUpdated", {
|
||
"chat": "Chat",
|
||
"message_id": "str",
|
||
"user": "User",
|
||
"date": "float",
|
||
"old_reaction": "List[ReactionType]",
|
||
"new_reaction": "List[ReactionType]",
|
||
}, total=False)
|
||
|
||
# required: type, emoji
|
||
ReactionType = TypedDict("ReactionType", {
|
||
"type": "Literal[\"emoji\"]",
|
||
"emoji": "str",
|
||
}, total=False)
|
||
|
||
# required: id, title
|
||
ServerBrief = TypedDict("ServerBrief", {
|
||
"id": "str",
|
||
"title": "str",
|
||
}, total=False)
|
||
|
||
# required: id, title, channels, roles
|
||
ServerInfo = TypedDict("ServerInfo", {
|
||
"id": "str",
|
||
"title": "str",
|
||
"channels": "List[Dict[str, Any]]",
|
||
"roles": "List[Dict[str, Any]]",
|
||
}, total=False)
|
||
|
||
# required: chat, from, user, date, old_status, new_status
|
||
ServerMemberUpdated = TypedDict("ServerMemberUpdated", {
|
||
"chat": "Chat",
|
||
"from": "User",
|
||
"user": "User",
|
||
"date": "float",
|
||
"old_status": "Literal[\"creator\", \"member\", \"left\", \"kicked\"]",
|
||
"new_status": "Literal[\"creator\", \"member\", \"left\", \"kicked\"]",
|
||
}, total=False)
|
||
|
||
# required: update_id
|
||
Update = TypedDict("Update", {
|
||
"update_id": "float",
|
||
"message": "Message",
|
||
"edited_message": "Message",
|
||
"message_deleted": "MessageDeleted",
|
||
"my_chat_member": "ChatMemberUpdated",
|
||
"callback_query": "CallbackQuery",
|
||
"message_reaction": "MessageReactionUpdated",
|
||
"chat_member": "ServerMemberUpdated",
|
||
"voice_state": "VoiceStateUpdated",
|
||
}, total=False)
|
||
|
||
# required: id, username, display_name, bot
|
||
User = TypedDict("User", {
|
||
"id": "str",
|
||
"username": "str",
|
||
"display_name": "str",
|
||
"bot": "bool",
|
||
"instance_domain": "str",
|
||
}, total=False)
|
||
|
||
# required: user, muted, deafened, server_muted, is_bot
|
||
VoiceChatMember = TypedDict("VoiceChatMember", {
|
||
"user": "User",
|
||
"muted": "bool",
|
||
"deafened": "bool",
|
||
"server_muted": "bool",
|
||
"is_bot": "bool",
|
||
}, total=False)
|
||
|
||
# required: url, token, room, chat, server_muted, expires_in, audio
|
||
VoiceJoinResult = TypedDict("VoiceJoinResult", {
|
||
"url": "str",
|
||
"token": "str",
|
||
"room": "str",
|
||
"chat": "Chat",
|
||
"server_muted": "bool",
|
||
"expires_in": "float",
|
||
"audio": "Dict[str, Any]",
|
||
}, total=False)
|
||
|
||
# required: chat, user, action, date
|
||
VoiceStateUpdated = TypedDict("VoiceStateUpdated", {
|
||
"chat": "Chat",
|
||
"user": "User",
|
||
"action": "Literal[\"joined\", \"left\"]",
|
||
"date": "float",
|
||
"move_to": "Chat",
|
||
}, total=False)
|
||
|
||
# required: url, pending_update_count, failures
|
||
WebhookInfo = TypedDict("WebhookInfo", {
|
||
"url": "str",
|
||
"pending_update_count": "float",
|
||
"failures": "float",
|
||
"last_error_date": "float",
|
||
"last_error_message": "str",
|
||
"disabled_date": "float",
|
||
"batch": "bool",
|
||
"dropped_update_count": "float",
|
||
}, total=False)
|
||
|
||
|
||
def _params(params: Dict[str, Any], extra: Dict[str, Any]) -> Dict[str, Any]:
|
||
out = {k: v for k, v in params.items() if v is not None}
|
||
out.update(extra)
|
||
return out
|
||
|
||
|
||
class GeneratedMethods:
|
||
"""One wrapper per Bot API method; `None` arguments are not sent. `**extra` passes parameters newer than this SDK."""
|
||
|
||
def call(self, method: str, params: Optional[Dict[str, Any]] = None, *, files: Optional[Sequence[Any]] = None) -> Any:
|
||
raise NotImplementedError
|
||
|
||
def get_me(self, **extra: Any) -> BotUser:
|
||
"""`getMe` (API 1+)."""
|
||
params: Dict[str, Any] = {}
|
||
return self.call("getMe", _params(params, extra))
|
||
|
||
def get_updates(self, *, offset: Optional[int] = None, limit: Optional[int] = None, timeout: Optional[int] = None, allowed_updates: Optional[List[str]] = None, **extra: Any) -> List[Update]:
|
||
"""`getUpdates` (API 1+). Long polling: the request is held up to `timeout` seconds (at most 50)."""
|
||
params: Dict[str, Any] = {"offset": offset, "limit": limit, "timeout": timeout, "allowed_updates": allowed_updates}
|
||
return self.call("getUpdates", _params(params, extra))
|
||
|
||
def set_webhook(self, url: str, secret_token: str, *, drop_pending_updates: Optional[bool] = None, batch: Optional[bool] = None, **extra: Any) -> bool:
|
||
"""`setWebhook` (API 1+)."""
|
||
params: Dict[str, Any] = {"url": url, "secret_token": secret_token, "drop_pending_updates": drop_pending_updates, "batch": batch}
|
||
return self.call("setWebhook", _params(params, extra))
|
||
|
||
def delete_webhook(self, *, drop_pending_updates: Optional[bool] = None, **extra: Any) -> bool:
|
||
"""`deleteWebhook` (API 1+)."""
|
||
params: Dict[str, Any] = {"drop_pending_updates": drop_pending_updates}
|
||
return self.call("deleteWebhook", _params(params, extra))
|
||
|
||
def get_webhook_info(self, **extra: Any) -> WebhookInfo:
|
||
"""`getWebhookInfo` (API 1+)."""
|
||
params: Dict[str, Any] = {}
|
||
return self.call("getWebhookInfo", _params(params, extra))
|
||
|
||
def send_message(self, chat_id: str, text: Optional[str] = None, *, reply_to_message_id: Optional[str] = None, embeds: Optional[List[InputEmbed]] = None, disable_notification: Optional[bool] = None, disable_link_preview: Optional[bool] = None, reply_markup: Optional[InlineKeyboardMarkup] = None, client_id: Optional[str] = None, parse_mode: Optional[str] = None, files: Optional[Sequence[Any]] = None, **extra: Any) -> Message:
|
||
"""`sendMessage` (API 1+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "text": text, "reply_to_message_id": reply_to_message_id, "embeds": embeds, "disable_notification": disable_notification, "disable_link_preview": disable_link_preview, "reply_markup": reply_markup, "client_id": client_id, "parse_mode": parse_mode}
|
||
return self.call("sendMessage", _params(params, extra), files=files)
|
||
|
||
def edit_message_text(self, chat_id: str, message_id: str, text: str, *, reply_markup: Optional[InlineKeyboardMarkup] = None, parse_mode: Optional[str] = None, **extra: Any) -> Message:
|
||
"""`editMessageText` (API 1+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "message_id": message_id, "text": text, "reply_markup": reply_markup, "parse_mode": parse_mode}
|
||
return self.call("editMessageText", _params(params, extra))
|
||
|
||
def delete_message(self, chat_id: str, message_id: str, **extra: Any) -> bool:
|
||
"""`deleteMessage` (API 1+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "message_id": message_id}
|
||
return self.call("deleteMessage", _params(params, extra))
|
||
|
||
def send_chat_action(self, chat_id: str, action: Literal["typing"], **extra: Any) -> bool:
|
||
"""`sendChatAction` (API 1+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "action": action}
|
||
return self.call("sendChatAction", _params(params, extra))
|
||
|
||
def get_chat(self, chat_id: str, **extra: Any) -> ChatFullInfo:
|
||
"""`getChat` (API 1+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id}
|
||
return self.call("getChat", _params(params, extra))
|
||
|
||
def edit_message_reply_markup(self, chat_id: str, message_id: str, *, reply_markup: Optional[InlineKeyboardMarkup] = None, **extra: Any) -> Message:
|
||
"""`editMessageReplyMarkup` (API 2+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "message_id": message_id, "reply_markup": reply_markup}
|
||
return self.call("editMessageReplyMarkup", _params(params, extra))
|
||
|
||
def answer_callback_query(self, callback_query_id: str, text: Optional[str] = None, *, show_alert: Optional[bool] = None, **extra: Any) -> bool:
|
||
"""`answerCallbackQuery` (API 2+)."""
|
||
params: Dict[str, Any] = {"callback_query_id": callback_query_id, "text": text, "show_alert": show_alert}
|
||
return self.call("answerCallbackQuery", _params(params, extra))
|
||
|
||
def set_my_commands(self, commands: List[BotCommand], *, scope: Optional[BotCommandScope] = None, **extra: Any) -> bool:
|
||
"""`setMyCommands` (API 2+)."""
|
||
params: Dict[str, Any] = {"commands": commands, "scope": scope}
|
||
return self.call("setMyCommands", _params(params, extra))
|
||
|
||
def get_my_commands(self, *, scope: Optional[BotCommandScope] = None, **extra: Any) -> List[BotCommand]:
|
||
"""`getMyCommands` (API 2+)."""
|
||
params: Dict[str, Any] = {"scope": scope}
|
||
return self.call("getMyCommands", _params(params, extra))
|
||
|
||
def delete_my_commands(self, *, scope: Optional[BotCommandScope] = None, **extra: Any) -> bool:
|
||
"""`deleteMyCommands` (API 2+)."""
|
||
params: Dict[str, Any] = {"scope": scope}
|
||
return self.call("deleteMyCommands", _params(params, extra))
|
||
|
||
def set_message_reaction(self, chat_id: str, message_id: str, *, reaction: Optional[List[ReactionType]] = None, **extra: Any) -> bool:
|
||
"""`setMessageReaction` (API 3+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "message_id": message_id, "reaction": reaction}
|
||
return self.call("setMessageReaction", _params(params, extra))
|
||
|
||
def pin_chat_message(self, chat_id: str, message_id: str, *, disable_notification: Optional[bool] = None, **extra: Any) -> bool:
|
||
"""`pinChatMessage` (API 3+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "message_id": message_id, "disable_notification": disable_notification}
|
||
return self.call("pinChatMessage", _params(params, extra))
|
||
|
||
def unpin_chat_message(self, chat_id: str, message_id: str, **extra: Any) -> bool:
|
||
"""`unpinChatMessage` (API 3+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "message_id": message_id}
|
||
return self.call("unpinChatMessage", _params(params, extra))
|
||
|
||
def get_chat_history(self, chat_id: str, *, before_message_id: Optional[str] = None, limit: Optional[int] = None, **extra: Any) -> List[Message]:
|
||
"""`getChatHistory` (API 3+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "before_message_id": before_message_id, "limit": limit}
|
||
return self.call("getChatHistory", _params(params, extra))
|
||
|
||
def get_chat_member(self, chat_id: str, user_id: str, **extra: Any) -> ChatMember:
|
||
"""`getChatMember` (API 3+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "user_id": user_id}
|
||
return self.call("getChatMember", _params(params, extra))
|
||
|
||
def get_chat_member_count(self, chat_id: str, **extra: Any) -> int:
|
||
"""`getChatMemberCount` (API 3+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id}
|
||
return self.call("getChatMemberCount", _params(params, extra))
|
||
|
||
def get_chat_members(self, chat_id: str, *, offset: Optional[str] = None, limit: Optional[int] = None, **extra: Any) -> ChatMembersPage:
|
||
"""`getChatMembers` (API 3+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "offset": offset, "limit": limit}
|
||
return self.call("getChatMembers", _params(params, extra))
|
||
|
||
def get_my_servers(self, **extra: Any) -> List[ServerBrief]:
|
||
"""`getMyServers` (API 3+)."""
|
||
params: Dict[str, Any] = {}
|
||
return self.call("getMyServers", _params(params, extra))
|
||
|
||
def get_server(self, server_id: str, **extra: Any) -> ServerInfo:
|
||
"""`getServer` (API 3+)."""
|
||
params: Dict[str, Any] = {"server_id": server_id}
|
||
return self.call("getServer", _params(params, extra))
|
||
|
||
def add_chat_member_role(self, chat_id: str, user_id: str, role_id: str, **extra: Any) -> bool:
|
||
"""`addChatMemberRole` (API 3+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "user_id": user_id, "role_id": role_id}
|
||
return self.call("addChatMemberRole", _params(params, extra))
|
||
|
||
def remove_chat_member_role(self, chat_id: str, user_id: str, role_id: str, **extra: Any) -> bool:
|
||
"""`removeChatMemberRole` (API 3+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "user_id": user_id, "role_id": role_id}
|
||
return self.call("removeChatMemberRole", _params(params, extra))
|
||
|
||
def ban_chat_member(self, chat_id: str, user_id: str, *, reason: Optional[str] = None, **extra: Any) -> bool:
|
||
"""`banChatMember` (API 3+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "user_id": user_id, "reason": reason}
|
||
return self.call("banChatMember", _params(params, extra))
|
||
|
||
def unban_chat_member(self, chat_id: str, user_id: str, **extra: Any) -> bool:
|
||
"""`unbanChatMember` (API 3+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "user_id": user_id}
|
||
return self.call("unbanChatMember", _params(params, extra))
|
||
|
||
def kick_chat_member(self, chat_id: str, user_id: str, **extra: Any) -> bool:
|
||
"""`kickChatMember` (API 3+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "user_id": user_id}
|
||
return self.call("kickChatMember", _params(params, extra))
|
||
|
||
def leave_chat(self, chat_id: str, **extra: Any) -> bool:
|
||
"""`leaveChat` (API 3+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id}
|
||
return self.call("leaveChat", _params(params, extra))
|
||
|
||
def join_voice(self, chat_id: str, *, bitrate: Optional[int] = None, **extra: Any) -> VoiceJoinResult:
|
||
"""`joinVoice` (API 4+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id, "bitrate": bitrate}
|
||
return self.call("joinVoice", _params(params, extra))
|
||
|
||
def leave_voice(self, *, chat_id: Optional[str] = None, **extra: Any) -> bool:
|
||
"""`leaveVoice` (API 4+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id}
|
||
return self.call("leaveVoice", _params(params, extra))
|
||
|
||
def get_voice_chat_members(self, chat_id: str, **extra: Any) -> List[VoiceChatMember]:
|
||
"""`getVoiceChatMembers` (API 4+)."""
|
||
params: Dict[str, Any] = {"chat_id": chat_id}
|
||
return self.call("getVoiceChatMembers", _params(params, extra))
|