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
1312from .utils import sjson_dumps
1413
1514
15+
16+
17+
1618class VkKeyboardColor (Enum ):
1719 """ Возможные цвета кнопок """
1820
@@ -28,10 +30,25 @@ class VkKeyboardColor(Enum):
2830 #: Зелёная
2931 POSITIVE = 'positive'
3032
33+ class VkKeyboardButton (Enum ):
34+ """ Возможные типы кнопки """
35+
36+ #: Кнопка с текстом
37+ TEXT = "text"
38+
39+ #: Кнопка с местоположением
40+ LOCATION = "location"
41+
42+ #: Кнопка с оплатой через VKPay
43+ VKPAY = "vkpay"
44+
45+ #: Кнопка с приложением VK Apps
46+ VKAPPS = "open_app"
47+
48+
3149
3250class VkKeyboard (object ):
3351 """ Класс для создания клавиатуры для бота (https://vk.com/dev/bots_docs_3)
34-
3552 :param one_time: Если True, клавиатура исчезнет после нажатия на кнопку
3653 :type one_time: bool
3754 """
@@ -61,14 +78,13 @@ def get_empty_keyboard(cls):
6178 return keyboard .get_keyboard ()
6279
6380 def add_button (self , label , color = VkKeyboardColor .DEFAULT , payload = None ):
64- """ Добавить кнопку. Максимальное количество кнопок на строке - 4
81+ """ Добавить кнопку с текстом.
82+ Максимальное количество кнопок на строке - 4
6583
6684 :param label: Надпись на кнопке и текст, отправляющийся при её нажатии.
6785 :type label: str
68-
6986 :param color: цвет кнопки.
7087 :type color: VkKeyboardColor or str
71-
7288 :param payload: Параметр для callback api
7389 :type payload: str or list or dict
7490 """
@@ -86,17 +102,118 @@ def add_button(self, label, color=VkKeyboardColor.DEFAULT, payload=None):
86102 if payload is not None and not isinstance (payload , six .string_types ):
87103 payload = sjson_dumps (payload )
88104
105+ button_type = VkKeyboardButton .TEXT .value
106+
89107 current_line .append ({
90108 'color' : color_value ,
91109 'action' : {
92- 'type' : 'text' ,
110+ 'type' : button_type ,
93111 'payload' : payload ,
94112 'label' : label ,
95113 }
96114 })
97115
116+ def add_location_button (self , payload = None ):
117+ """ Добавить кнопку с местоположением.
118+ Всегда занимает всю ширину линии.
119+
120+ :param payload: Параметр для callback api
121+ :type payload: str or list or dict
122+ """
123+
124+ current_line = self .lines [- 1 ]
125+
126+ if len (current_line ) != 0 :
127+ raise ValueError (
128+ 'This type of button takes the entire width of the line'
129+ )
130+
131+ if payload is not None and not isinstance (payload , six .string_types ):
132+ payload = sjson_dumps (payload )
133+
134+ button_type = VkKeyboardButton .LOCATION .value
135+
136+ current_line .append ({
137+ 'action' : {
138+ 'type' : button_type ,
139+ 'payload' : payload
140+ }
141+ })
142+
143+ def add_vkpay_button (self , hash , payload = None ):
144+ """ Добавить кнопку с оплатой с помощью VKPay.
145+ Всегда занимает всю ширину линии.
146+
147+ :param hash: Параметры платежа VKPay и ID приложения
148+ (в поле aid) разделённые &
149+ :type hash: str
150+ :param payload: Параметр для совместимости со старыми клиентами
151+ :type payload: str or list or dict
152+ """
153+
154+ current_line = self .lines [- 1 ]
155+
156+ if len (current_line ) != 0 :
157+ raise ValueError (
158+ 'This type of button takes the entire width of the line'
159+ )
160+
161+ if payload is not None and not isinstance (payload , six .string_types ):
162+ payload = sjson_dumps (payload )
163+
164+ button_type = VkKeyboardButton .VKPAY .value
165+
166+ current_line .append ({
167+ 'action' : {
168+ 'type' : button_type ,
169+ 'payload' : payload ,
170+ 'hash' : hash
171+ }
172+ })
173+
174+ def add_vkapps_button (self , app_id , owner_id , label , hash , payload = None ):
175+ """ Добавить кнопку с приложением VK Apps.
176+ Всегда занимает всю ширину линии.
177+
178+ :param app_id: Идентификатор вызываемого приложения с типом VK Apps
179+ :type app_id: int
180+ :param owner_id: Идентификатор сообщества, в котором установлено
181+ приложение, если требуется открыть в контексте сообщества
182+ :type owner_id: int
183+ :param label: Название приложения, указанное на кнопке
184+ :type label: str
185+ :param hash: хэш для навигации в приложении, будет передан в строке
186+ параметров запуска после символа #
187+ :type hash: str
188+ :param payload: Параметр для совместимости со старыми клиентами
189+ :type payload: str or list or dict
190+ """
191+
192+ current_line = self .lines [- 1 ]
193+
194+ if len (current_line ) != 0 :
195+ raise ValueError (
196+ 'This type of button takes the entire width of the line'
197+ )
198+
199+ if payload is not None and not isinstance (payload , six .string_types ):
200+ payload = sjson_dumps (payload )
201+
202+ button_type = VkKeyboardButton .VKAPPS .value
203+
204+ current_line .append ({
205+ 'action' : {
206+ 'type' : button_type ,
207+ 'app_id' : app_id ,
208+ 'owner_id' : owner_id ,
209+ 'label' : label ,
210+ 'payload' : payload ,
211+ 'hash' : hash
212+ }
213+ })
214+
98215 def add_line (self ):
99- """ Создаёт новую строчку , на которой можно размещать кнопки.
216+ """ Создаёт новую строку , на которой можно размещать кнопки.
100217 Максимальное количество строк - 10.
101218 """
102219
0 commit comments