-
Notifications
You must be signed in to change notification settings - Fork 27
Expand file tree
/
Copy pathcommands_builder.py
More file actions
265 lines (245 loc) · 11.2 KB
/
Copy pathcommands_builder.py
File metadata and controls
265 lines (245 loc) · 11.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# -*- coding: utf-8 -*-
from typing import List, Optional, Tuple
from social_ethosa import BetterUser
from .data_service import BetterBotBaseDataService
from .data_builder import DataBuilder
class CommandsBuilder:
@staticmethod
def build_help_message(
peer_id: int,
karma: bool
) -> str:
"""Builds help message.
Arguments:
- {peer_id} - chat ID;
- {karma} - is karma enabled in chat.
"""
documentation_link = "vk.cc/c9TNs3"
if 0 < peer_id < 2e9:
return ("Вы находитесь в личных сообщениях бота.\n"
f"Документация — {documentation_link}")
elif peer_id > 2e9:
if karma:
return ("Вы находитесь в беседе с включённой кармой.\n"
"Доступные команды для локальной кармы:\n"
"• 'local karma' / 'локальная карма' - показать локальную карму\n"
"• 'local +/-' - изменить локальную карму пользователя\n"
"• 'local top' / 'локальный топ' - топ по локальной карме\n"
"• 'local bottom' / 'локальный низ' - низ по локальной карме\n"
f"Документация — {documentation_link}")
else:
return (f"Вы находитесь в беседе (#{peer_id}) с выключенной кармой.\n"
f"Документация — {documentation_link}")
@staticmethod
def build_info_message(
user: BetterUser,
data: BetterBotBaseDataService,
from_id: int,
karma: bool
) -> str:
"""Builds info message.
Arguments:
- {user} - selected user;
- {data} - data service;
- {peer_id} - chat ID;
- {karma} - is karma enabled in chat.
"""
programming_languages_string = DataBuilder.build_programming_languages(user, data)
profile = DataBuilder.build_github_profile(user, data, default="отсутствует")
mention = f"[id{data.get_user_property(user, 'uid')}|{data.get_user_property(user, 'name')}]"
is_self = data.get_user_property(user, 'uid') == from_id
karma_str: str = ""
if karma:
if is_self:
karma_str = f"{mention}, Ваша карма - {DataBuilder.build_karma(user, data)}.\n"
else:
karma_str = f"Карма {mention} - {DataBuilder.build_karma(user, data)}.\n"
else:
karma_str = f"{mention}.\n"
return (f"{karma_str}"
f"Языки программирования: {programming_languages_string}\n"
f"Страничка на GitHub: {profile}.")
@staticmethod
def build_change_programming_languages(
user: BetterUser,
data: BetterBotBaseDataService
) -> str:
"""Builds changing programming languages.
"""
programming_languages_string = DataBuilder.build_programming_languages(user, data)
if not programming_languages_string:
return (f"[id{data.get_user_property(user, 'uid')}|{data.get_user_property(user, 'name')}]"
f", у Вас не указано языков программирования.")
else:
return (f"[id{data.get_user_property(user, 'uid')}|{data.get_user_property(user, 'name')}]"
f", Ваши языки программирования: {programming_languages_string}.")
@staticmethod
def build_github_profile(
user: BetterUser,
data: BetterBotBaseDataService
) -> str:
"""Builds changing github profile.
"""
profile = DataBuilder.build_github_profile(user, data, default="отсутствует")
if not profile:
return (f"[id{data.get_user_property(user, 'uid')}|{data.get_user_property(user, 'name')}], "
f"у Вас не указана страничка на GitHub.")
else:
return (f"[id{data.get_user_property(user, 'uid')}|{data.get_user_property(user, 'name')}], "
f"Ваша страничка на GitHub — {profile}.")
@staticmethod
def build_karma(
user: BetterUser,
data: BetterBotBaseDataService,
is_self: bool
) -> str:
"""Sends user karma amount.
"""
if is_self:
return (f"[id{data.get_user_property(user, 'uid')}|"
f"{data.get_user_property(user, 'name')}], "
f"Ваша карма — {DataBuilder.build_karma(user, data)}.")
else:
return (f"Карма [id{data.get_user_property(user, 'uid')}|"
f"{data.get_user_property(user, 'name')}] — "
f"{DataBuilder.build_karma(user, data)}.")
@staticmethod
def build_not_enough_karma(
user: BetterUser,
data: BetterBotBaseDataService
) -> str:
return (f"Извините, [id{data.get_user_property(user, 'uid')}|"
f"{data.get_user_property(user, 'name')}], "
f"но Вашей кармы [{data.get_user_property(user, 'karma')}] "
f"недостаточно :(")
@staticmethod
def build_not_in_whitelist(
user: BetterUser,
data: BetterBotBaseDataService,
peer_id: int
) -> str:
return (f"Извините, [id{data.get_user_property(user, 'uid')}|"
f"{data.get_user_property(user, 'name')}], "
f"но Ваша беседа [{peer_id}] отсутствует в белом списке для начисления кармы.")
@staticmethod
def build_not_enough_hours(
user: BetterUser,
data: BetterBotBaseDataService,
hours_limit: int,
difference_minutes: int
) -> str:
return (f"Извините, [id{data.get_user_property(user, 'uid')}|"
f"{data.get_user_property(user, 'name')}], "
f"но с момента вашего последнего голоса ещё не прошло {hours_limit} ч. "
f":( До следующего голоса осталось {int(hours_limit * 60 - difference_minutes)} м.")
@staticmethod
def build_top_users(
users: List[BetterUser],
data: BetterBotBaseDataService,
reverse: bool = False,
has_karma: bool = True,
maximum_users: int = -1
) -> Optional[str]:
if not users:
return None
if reverse:
users = reversed(users)
user_strings = [(f"{DataBuilder.build_karma(user, data) if has_karma else ''} "
f"[id{data.get_user_property(user, 'uid')}|{data.get_user_property(user, 'name')}]"
f"{DataBuilder.build_github_profile(user, data, prefix=' - ')} "
f"{DataBuilder.build_programming_languages(user, data, '')}") for user in users]
total_symbols = 0
i = 0
for user_string in user_strings:
user_string_length = len(user_string)
if (total_symbols + user_string_length + 2) >= 4096: # Maximum message size for VK API (messages.send)
user_strings = user_strings[:i]
else:
total_symbols += user_string_length + 2
i += 1
if maximum_users > 0:
return '\n'.join(user_strings[:maximum_users])
return '\n'.join(user_strings)
@staticmethod
def build_karma_change(
user_karma_change: Optional[Tuple[int, str, int, int]],
selected_user_karma_change: Optional[Tuple[int, str, int, int]],
voters: List[int]
) -> Optional[str]:
"""Builds karma changing
"""
if selected_user_karma_change:
if user_karma_change:
return ("Карма изменена: [id%s|%s] [%s]->[%s], [id%s|%s] [%s]->[%s]." %
(user_karma_change + selected_user_karma_change))
return ("Карма изменена: [id%s|%s] [%s]->[%s]. Голосовали: (%s)" %
(selected_user_karma_change + (", ".join([f"@id{voter}" for voter in voters]),)))
return None
@staticmethod
def build_local_karma(
user: BetterUser,
data: BetterBotBaseDataService,
is_self: bool,
chat_id: int
) -> str:
"""Sends user local karma amount for specific chat.
"""
if is_self:
return (f"Ваша локальная карма в этом чате — "
f"{DataBuilder.build_local_karma(user, data, chat_id)}.")
else:
mention = f"[id{user.uid}|{user.name}]"
return (f"Локальная карма {mention} в этом чате — "
f"{DataBuilder.build_local_karma(user, data, chat_id)}.")
@staticmethod
def build_not_enough_local_karma(
user: BetterUser,
data: BetterBotBaseDataService,
chat_id: int
) -> str:
"""Builds message about insufficient local karma."""
return (f"Вы не можете минусовать карму, "
f"но Вашей локальной кармы [{data.get_local_karma(user, chat_id)}] "
f"в этом чате недостаточно.")
@staticmethod
def build_local_karma_change(
local_karma_change: Tuple[int, str, int, int],
chat_id: int
) -> str:
"""Builds local karma changing message."""
return ("Локальная карма в этом чате изменена: [id%s|%s] [%s]->[%s]." %
local_karma_change)
@staticmethod
def build_local_top_users(
users: List[Dict[str, Any]],
data: BetterBotBaseDataService,
reverse: bool = False,
has_karma: bool = True,
maximum_users: int = -1
) -> Optional[str]:
"""Builds local karma top users list."""
if not users:
return None
if reverse:
users = list(reversed(users))
user_strings = []
for user in users:
karma_str = f"[{user['local_karma']}]" if has_karma else ""
user_string = (f"{karma_str} "
f"[id{user['uid']}|{user['name']}]"
f"{DataBuilder.build_github_profile_from_dict(user, ' - ')}"
f"{DataBuilder.build_programming_languages_from_dict(user, '')}")
user_strings.append(user_string)
total_symbols = 0
i = 0
for user_string in user_strings:
user_string_length = len(user_string)
if (total_symbols + user_string_length + 2) >= 4096: # Maximum message size for VK API (messages.send)
user_strings = user_strings[:i]
break
else:
total_symbols += user_string_length + 2
i += 1
if maximum_users > 0:
return '\n'.join(user_strings[:maximum_users])
return '\n'.join(user_strings)