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
3247class 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