Passed
Push — master ( 175e2e...724686 )
by Daniil
01:42
created

keyboard.Keyboards.generate_call_prompt()   A

Complexity

Conditions 1

Size

Total Lines 10
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 9
dl 0
loc 10
rs 9.95
c 0
b 0
f 0
cc 1
nop 1
1
import os
2
3
from vk_api.keyboard import VkKeyboard
4
5
from database import Database
6
7
8
class Keyboards:
9
    """
10
    Класс с генераторами пользовательских клавиатур
11
    """
12
13
    def __init__(self):
14
        self.db = Database(os.environ["DATABASE_URL"])
15
16
    @staticmethod
17
    def generate_main_menu(is_admin: bool):
18
        """
19
        Генерирует клавиатуру с главным меню
20
        """
21
        kb = VkKeyboard()
22
        if is_admin:
23
            kb.add_button(label="Призыв", payload={"button": "call"})
24
            kb.add_line()
25
        kb.add_button(label="Расписание", payload={"button": "schedule"})
26
        kb.add_line()
27
        kb.add_button(
28
            label="Управление рассылками", payload={"button": "mailings"},
29
        )
30
        if is_admin:
31
            kb.add_line()
32
            kb.add_button(label="Настройки", payload={"button": "prefs"})
33
        return kb.get_keyboard()
34
35
    @staticmethod
36
    def generate_schedule_keyboard():
37
        """
38
        Возвращает клавиатуру с выбором даты получения расписания
39
        """
40
        kb = VkKeyboard()
41
        kb.add_button(label="На сегодня", color="default", payload={"button": "today"})
42
        kb.add_button(
43
            label="На завтра", color="default", payload={"button": "tomorrow"}
44
        )
45
        kb.add_line()
46
        kb.add_button(
47
            label="На послезавтра",
48
            color="default",
49
            payload={"button": "day_after_tomorrow"},
50
        )
51
        kb.add_button(
52
            label="Выбрать дату", color="default", payload={"button": "arbitrary"},
53
        )
54
        kb.add_line()
55
        kb.add_button(
56
            label="Назад", color="primary", payload={"button": "home"},
57
        )
58
        return kb.get_keyboard()
59
60
    @staticmethod
61
    def empty():
62
        """
63
        Возвращает пустую клавиатуру
64
        """
65
        kb = VkKeyboard()
66
        return kb.get_empty_keyboard()
67
68
    @staticmethod
69
    def skip():
70
        """
71
        Возвращает клавиатуру с кнопкой "Пропустить"
72
        """
73
        kb = VkKeyboard()
74
        kb.add_button(label="Пропустить", payload={"button": "skip"})
75
        return kb.get_keyboard()
76
77
    @staticmethod
78
    def cancel():
79
        """
80
        Возвращает клавиатуру с кнопкой "Отмена"
81
        """
82
        kb = VkKeyboard()
83
        kb.add_button(label="Отмена", color="negative", payload={"button": "cancel"})
84
        return kb.get_keyboard()
85
86
    @staticmethod
87
    def generate_prefs_keyboard():
88
        """
89
        Возвращает клавиатуру с настройками бота
90
        """
91
        kb = VkKeyboard()
92
        kb.add_button(label="Сменить беседу", payload={"button": "chconv"})
93
        kb.add_line()
94
        kb.add_button(label="Использование имён в призыве", payload={"button": "names"})
95
        kb.add_line()
96
        kb.add_button(
97
            label="Назад", color="primary", payload={"button": "home"},
98
        )
99
        return kb.get_keyboard()
100
101
    @staticmethod
102
    def generate_conv_selector(chat: int):
103
        """
104
        Возвращает клавиатуру-селектор бесед
105
        """
106
        kb = VkKeyboard()
107
        if chat == 2000000001:
108
            kb.add_button(
109
                label="Переключиться на основную беседу",
110
                payload={"button": "select_main_conv"},
111
            )
112
        elif chat == 2000000002:
113
            kb.add_button(
114
                label="Переключиться на тестовую беседу",
115
                payload={"button": "select_test_conv"},
116
            )
117
        kb.add_line()
118
        kb.add_button(
119
            label="Назад", color="primary", payload={"button": "prefs"},
120
        )
121
        return kb.get_keyboard()
122
123
    @staticmethod
124
    def generate_names_selector(status: bool):
125
        kb = VkKeyboard()
126
        if status:
127
            kb.add_button(label="Выключить", payload={"button": "off_using_names"})
128
        else:
129
            kb.add_button(label="Включить", payload={"button": "on_using_names"})
130
        kb.add_line()
131
        kb.add_button(
132
            label="Назад", color="primary", payload={"button": "prefs"},
133
        )
134
        return kb.get_keyboard()
135
136
    def generate_call_prompt(self):
137
        kb = self.generate_alphabet_keyboard()
138
        kb.add_line()
139
        kb.add_button(label="Отмена", color="negative", payload={"button": "cancel"})
140
        kb.add_button(label="Сохранить", color="positive", payload={"button": "save"})
141
        kb.add_line()
142
        kb.add_button(
143
            label="Отправить всем", color="primary", payload={"button": "send_to_all"}
144
        )
145
        return kb.get_keyboard()
146
147
    def generate_alphabet_keyboard(self):
148
        """
149
        Генерирует клавиатуру с алфавитными кнопками
150
        """
151
        kb = VkKeyboard()
152
        letters = self.db.get_last_names_letters()
153
        for i, v in enumerate(letters):
154
            if len(kb.lines[-1]) < 4:
155
                kb.add_button(label=v, payload={"button": "letter", "letter": v})
156
            else:
157
                kb.add_line()
158
159
        return kb
160
161
    def generate_names_keyboard(self, letter):
162
        """
163
        Генерирует клавиатуру с фамилиями, начинающимися на букву (аргумент)
164
        """
165
        names = self.db.get_list_of_names(letter=letter)
166
        kb = VkKeyboard()
167
        for i, v in enumerate(names):
168
            label = f"{v[2]} {v[1][0]}."
169
            kb.add_button(
170
                label=label, payload={"button": "student", "name": label, "id": v[0]},
171
            )
172
            if len(kb.lines[-1]) == 2:
173
                kb.add_line()
174
        if kb.lines[-1]:
175
            kb.add_line()
176
        kb.add_button(
177
            label="Назад", color="primary", payload={"button": "back"},
178
        )
179
        return kb.get_keyboard()
180
181
    def generate_mailings_keyboard(self):
182
        """
183
        Генерация клавиатуры со списком доступных рассылок
184
        """
185
        mailings = self.db.get_mailings_list()
186
        kb = VkKeyboard()
187
        for i, v in enumerate(mailings):
188
            kb.add_button(
189
                label=v[1], payload={"button": "mailing", "name": v[1], "slug": v[2]},
190
            )
191
            if len(kb.lines[-1]) == 2:
192
                kb.add_line()
193
        if kb.lines[-1]:
194
            kb.add_line()
195
        kb.add_button(
196
            label="Назад", color="primary", payload={"button": "home"},
197
        )
198
        return kb.get_keyboard()
199
200
    def generate_mailing_mgmt(self, user_id: int, is_admin: bool, slug: str):
201
        uid = self.db.get_user_id(vk_id=user_id)
202
        status = self.db.get_subscription_status(slug=slug, user_id=uid)
203
204
        kb = VkKeyboard()
205
        if is_admin:
206
            kb.add_button(
207
                label="Отправить рассылку",
208
                color="default",
209
                payload={"button": "send_mailing", "mailing": slug},
210
            )
211
        kb.add_button(
212
            label=f"{'Отписаться' if status else 'Подписаться'}",
213
            payload={
214
                "button": f"{'unsubscribe' if status else 'subscribe'}",
215
                "slug": slug,
216
                "user_id": uid,
217
            },
218
        )
219
        kb.add_line()
220
        kb.add_button(
221
            label="Назад", color="primary", payload={"button": "mailings"},
222
        )
223
        return kb.get_keyboard()
224
225
    def prompt(self, user_id: int = None):
226
        """
227
        Возвращает клавиатуру с подтверждением действия
228
        """
229
        kb = VkKeyboard()
230
        kb.add_button(
231
            label="Подтвердить", color="positive", payload={"button": "confirm"}
232
        )
233
        kb.add_button(label="Отмена", color="negative", payload={"button": "deny"})
234
        if (
235
            user_id is not None
236
            and self.db.get_session_state(user_id) == "call_configuring"
237
        ):
238
            kb.add_line()
239
            kb.add_button(
240
                label="Сменить беседу",
241
                color="primary",
242
                payload={"button": "chconv_call"},
243
            )
244
            kb.add_line()
245
            kb.add_button(
246
                label="Переключить использование имён",
247
                color="primary",
248
                payload={"button": "chnames_call"},
249
            )
250
        return kb.get_keyboard()
251