Skip to content

Commit b015ee5

Browse files
author
markeloff
authored
add new button types
1 parent 106101f commit b015ee5

1 file changed

Lines changed: 102 additions & 9 deletions

File tree

vk_api/keyboard.py

Lines changed: 102 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
# -*- coding: utf-8 -*-
22
"""
3-
:authors: python273, Helow19274
3+
:authors: python273, Helow19274, klassik2k16
44
:license: Apache License, Version 2.0, see LICENSE file
5-
65
:copyright: (c) 2019 python273
76
"""
87

@@ -28,10 +27,25 @@ class VkKeyboardColor(Enum):
2827
#: Зелёная
2928
POSITIVE = 'positive'
3029

30+
class VkKeyboardButton(Enum):
31+
""" Возможные типы кнопки """
32+
33+
#: Кнопка с текстом
34+
TEXT = "text"
35+
36+
#: Кнопка с местоположением
37+
LOCATION = "location"
38+
39+
#: Кнопка с оплатой через VKPay
40+
VKPAY = "vkpay"
41+
42+
#: Кнопка с приложением VK Apps
43+
VKAPPS = "open_app"
44+
45+
3146

3247
class VkKeyboard(object):
3348
""" Класс для создания клавиатуры для бота (https://vk.com/dev/bots_docs_3)
34-
3549
:param one_time: Если True, клавиатура исчезнет после нажатия на кнопку
3650
:type one_time: bool
3751
"""
@@ -60,15 +74,13 @@ def get_empty_keyboard(cls):
6074
keyboard.keyboard['buttons'] = []
6175
return keyboard.get_keyboard()
6276

63-
def add_button(self, label, color=VkKeyboardColor.DEFAULT, payload=None):
64-
""" Добавить кнопку. Максимальное количество кнопок на строке - 4
77+
def add_text_button(self, label, color=VkKeyboardColor.DEFAULT, payload=None):
78+
""" Добавить кнопку с текстом. Максимальное количество кнопок на строке - 4
6579
6680
:param label: Надпись на кнопке и текст, отправляющийся при её нажатии.
6781
:type label: str
68-
6982
:param color: цвет кнопки.
7083
:type color: VkKeyboardColor or str
71-
7284
:param payload: Параметр для callback api
7385
:type payload: str or list or dict
7486
"""
@@ -95,12 +107,93 @@ def add_button(self, label, color=VkKeyboardColor.DEFAULT, payload=None):
95107
}
96108
})
97109

110+
def add_location_button(self, payload=None):
111+
""" Добавить кнопку с местоположением. Всегда занимает всю ширину линии.
112+
113+
:param payload: Параметр для callback api
114+
:type payload: str or list or dict
115+
"""
116+
117+
current_line = self.lines[-1]
118+
119+
if len(current_line) != 0:
120+
raise ValueError('A button of type Location occupies the entire line of the keyboard, besides it on the line of buttons cannot be.')
121+
122+
if payload is not None and not isinstance(payload, six.string_types):
123+
payload = sjson_dumps(payload)
124+
125+
current_line.append({
126+
'action': {
127+
'type': VkKeyboardButton.LOCATION,
128+
'payload': payload
129+
}
130+
})
131+
132+
def add_vkpay_button(self, hash, payload=None):
133+
""" Добавить кнопку с оплатой с помощью VKPay. Всегда занимает всю ширину линии.
134+
135+
:param hash: Параметры платежа VKPay и ID приложения (в поле aid) разделённые &
136+
:type hash: str
137+
:param payload: Параметр для совместимости со старыми клиентами
138+
:type payload: str or list or dict
139+
"""
140+
141+
current_line = self.lines[-1]
142+
143+
if len(current_line) != 0:
144+
raise ValueError('A button of type VKPay occupies the entire line of the keyboard, besides it on the line of buttons cannot be.')
145+
146+
if payload is not None and not isinstance(payload, six.string_types):
147+
payload = sjson_dumps(payload)
148+
149+
current_line.append({
150+
'action': {
151+
'type': VkKeyboardButton.VKPAY,
152+
'payload': payload,
153+
'hash': hash
154+
}
155+
})
156+
157+
def add_vkapps_button(self, app_id, owner_id, label, hash, payload=None):
158+
""" Добавить кнопку с приложением VK Apps. Всегда занимает всю ширину линии.
159+
160+
:param app_id: Идентификатор вызываемого приложения с типом VK Apps
161+
:type app_id: int
162+
:param owner_id: Идентификатор сообщества, в котором установлено приложение, если требуется открыть в контексте сообщества
163+
:type owner_id: int
164+
:param label: Название приложения, указанное на кнопке
165+
:type label: str
166+
:param hash: хэш для навигации в приложении, будет передан в строке параметров запуска после символа #
167+
:type hash: str
168+
:param payload: Параметр для совместимости со старыми клиентами
169+
:type payload: str or list or dict
170+
"""
171+
172+
current_line = self.lines[-1]
173+
174+
if len(current_line) != 0:
175+
raise ValueError('A button of type VKApps occupies the entire line of the keyboard, besides it on the line of buttons cannot be.')
176+
177+
if payload is not None and not isinstance(payload, six.string_types):
178+
payload = sjson_dumps(payload)
179+
180+
current_line.append({
181+
'action': {
182+
'type': VkKeyboardButton.VKAPPS,
183+
'app_id': app_id,
184+
'owner_id': owner_id,
185+
'label': label,
186+
'payload': payload,
187+
'hash': hash
188+
}
189+
})
190+
98191
def add_line(self):
99-
""" Создаёт новую строчку, на которой можно размещать кнопки.
192+
""" Создаёт новую строку, на которой можно размещать кнопки.
100193
Максимальное количество строк - 10.
101194
"""
102195

103196
if len(self.lines) >= 10:
104197
raise ValueError('Max 10 lines')
105198

106-
self.lines.append([])
199+
self.lines.append([])

0 commit comments

Comments
 (0)