dublib 0.5.2__tar.gz → 0.6.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dublib-0.5.2/src/dublib.egg-info → dublib-0.6.0}/PKG-INFO +4 -1
- {dublib-0.5.2 → dublib-0.6.0}/README.md +1 -0
- {dublib-0.5.2 → dublib-0.6.0}/pyproject.toml +6 -1
- dublib-0.6.0/src/dublib/Exceptions/TelebotUtils.py +13 -0
- {dublib-0.5.2 → dublib-0.6.0}/src/dublib/Methods.py +35 -0
- dublib-0.6.0/src/dublib/TelebotUtils.py +379 -0
- {dublib-0.5.2 → dublib-0.6.0/src/dublib.egg-info}/PKG-INFO +4 -1
- {dublib-0.5.2 → dublib-0.6.0}/src/dublib.egg-info/SOURCES.txt +2 -0
- {dublib-0.5.2 → dublib-0.6.0}/src/dublib.egg-info/requires.txt +3 -0
- {dublib-0.5.2 → dublib-0.6.0}/LICENSE +0 -0
- {dublib-0.5.2 → dublib-0.6.0}/setup.cfg +0 -0
- {dublib-0.5.2 → dublib-0.6.0}/src/dublib/Exceptions/StyledPrinter.py +0 -0
- {dublib-0.5.2 → dublib-0.6.0}/src/dublib/Exceptions/Terminalyzer.py +0 -0
- {dublib-0.5.2 → dublib-0.6.0}/src/dublib/Exceptions/WebRequestor.py +0 -0
- {dublib-0.5.2 → dublib-0.6.0}/src/dublib/Exceptions/__init__.py +0 -0
- {dublib-0.5.2 → dublib-0.6.0}/src/dublib/Polyglot.py +0 -0
- {dublib-0.5.2 → dublib-0.6.0}/src/dublib/StyledPrinter.py +0 -0
- {dublib-0.5.2 → dublib-0.6.0}/src/dublib/Terminalyzer.py +0 -0
- {dublib-0.5.2 → dublib-0.6.0}/src/dublib/WebRequestor.py +0 -0
- {dublib-0.5.2 → dublib-0.6.0}/src/dublib/__init__.py +0 -0
- {dublib-0.5.2 → dublib-0.6.0}/src/dublib.egg-info/dependency_links.txt +0 -0
- {dublib-0.5.2 → dublib-0.6.0}/src/dublib.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dublib
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.0
|
|
4
4
|
Summary: Коллекция модулей от DUB1401.
|
|
5
5
|
Author-email: DUB1401 <vlad.milosta@outlook.com>
|
|
6
6
|
License: This is free and unencumbered software released into the public domain.
|
|
@@ -49,6 +49,8 @@ Requires-Dist: fake_useragent
|
|
|
49
49
|
Requires-Dist: httpx
|
|
50
50
|
Requires-Dist: httpx[http2]
|
|
51
51
|
Requires-Dist: requests
|
|
52
|
+
Provides-Extra: telebot
|
|
53
|
+
Requires-Dist: pyTelegramBotAPI; extra == "telebot"
|
|
52
54
|
|
|
53
55
|
# dublib
|
|
54
56
|
**dublib** – это библиотека, поставляющая компоненты, требующиеся в проектах [@DUB1401](https://github.com/DUB1401), написанных на Python.
|
|
@@ -58,6 +60,7 @@ Requires-Dist: requests
|
|
|
58
60
|
* [Methods](https://github.com/DUB1401/dublib/blob/main/docs/Methods.md)
|
|
59
61
|
* [Polyglot](https://github.com/DUB1401/dublib/blob/main/docs/Polyglot.md)
|
|
60
62
|
* [StyledPrinter](https://github.com/DUB1401/dublib/blob/main/docs/StyledPrinter.md)
|
|
63
|
+
* [TelebotUtils](https://github.com/DUB1401/dublib/blob/main/docs/Terminalyzer.md)
|
|
61
64
|
* [Terminalyzer](https://github.com/DUB1401/dublib/blob/main/docs/Terminalyzer.md)
|
|
62
65
|
* [WebRequestor](https://github.com/DUB1401/dublib/blob/main/docs/WebRequestor.md)
|
|
63
66
|
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* [Methods](https://github.com/DUB1401/dublib/blob/main/docs/Methods.md)
|
|
7
7
|
* [Polyglot](https://github.com/DUB1401/dublib/blob/main/docs/Polyglot.md)
|
|
8
8
|
* [StyledPrinter](https://github.com/DUB1401/dublib/blob/main/docs/StyledPrinter.md)
|
|
9
|
+
* [TelebotUtils](https://github.com/DUB1401/dublib/blob/main/docs/Terminalyzer.md)
|
|
9
10
|
* [Terminalyzer](https://github.com/DUB1401/dublib/blob/main/docs/Terminalyzer.md)
|
|
10
11
|
* [WebRequestor](https://github.com/DUB1401/dublib/blob/main/docs/WebRequestor.md)
|
|
11
12
|
|
|
@@ -3,7 +3,7 @@ requires = ["setuptools", "cython"]
|
|
|
3
3
|
|
|
4
4
|
[project]
|
|
5
5
|
name = "dublib"
|
|
6
|
-
version = "0.
|
|
6
|
+
version = "0.6.0"
|
|
7
7
|
description = "Коллекция модулей от DUB1401."
|
|
8
8
|
authors = [
|
|
9
9
|
{name = "DUB1401", email = "vlad.milosta@outlook.com"}
|
|
@@ -30,6 +30,11 @@ classifiers = [
|
|
|
30
30
|
"Programming Language :: Python :: 3.13"
|
|
31
31
|
]
|
|
32
32
|
|
|
33
|
+
[project.optional-dependencies]
|
|
34
|
+
telebot = [
|
|
35
|
+
"pyTelegramBotAPI"
|
|
36
|
+
]
|
|
37
|
+
|
|
33
38
|
[project.urls]
|
|
34
39
|
Documentation = "https://github.com/DUB1401/dublib/tree/main/docs"
|
|
35
40
|
"Source Code" = "https://github.com/DUB1401/dublib"
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class UpdateByOtherUser(Exception):
|
|
2
|
+
"""Исключение: использование данных другого пользователя для обновления."""
|
|
3
|
+
|
|
4
|
+
def __init__(self):
|
|
5
|
+
"""Исключение: использование данных другого пользователя для обновления."""
|
|
6
|
+
|
|
7
|
+
# Добавление данных в сообщение об ошибке.
|
|
8
|
+
self.__Message = "Current user ID and ID in updating method differ."
|
|
9
|
+
# Обеспечение доступа к оригиналу наследованного свойства.
|
|
10
|
+
super().__init__(self.__Message)
|
|
11
|
+
|
|
12
|
+
def __str__(self):
|
|
13
|
+
return self.__Message
|
|
@@ -96,6 +96,41 @@ def CheckForCyrillicPresence(text: str) -> bool:
|
|
|
96
96
|
|
|
97
97
|
return IsTextContainsCyrillicCharacters
|
|
98
98
|
|
|
99
|
+
def ChunkList(value: list, length: int) -> list[list]:
|
|
100
|
+
"""
|
|
101
|
+
Разделяет список на фрагменты фиксированной длинны.
|
|
102
|
+
value – обрабатываемое значение;
|
|
103
|
+
length – длина фрагментов.
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
# Список списков.
|
|
107
|
+
Result = list()
|
|
108
|
+
# Индекс обрезки.
|
|
109
|
+
CutIndex = 1
|
|
110
|
+
# Буфер обрезки.
|
|
111
|
+
Buffer = list()
|
|
112
|
+
|
|
113
|
+
# Для каждого элемента.
|
|
114
|
+
for Index in range(len(value)):
|
|
115
|
+
|
|
116
|
+
# Если индекс обрезки совпадает с длиной.
|
|
117
|
+
if CutIndex == length:
|
|
118
|
+
# Запись и обнуление буфера.
|
|
119
|
+
Result.append(Buffer)
|
|
120
|
+
Buffer = list()
|
|
121
|
+
|
|
122
|
+
else:
|
|
123
|
+
# Запись элемента в буфер.
|
|
124
|
+
Buffer.append(value[Index])
|
|
125
|
+
|
|
126
|
+
# Инкремент индекса обрезки.
|
|
127
|
+
CutIndex += 1
|
|
128
|
+
|
|
129
|
+
# Если в буфере что-то осталось, записать отдельной строкой.
|
|
130
|
+
if len(Buffer) > 0: Result.append(Buffer)
|
|
131
|
+
|
|
132
|
+
return Result
|
|
133
|
+
|
|
99
134
|
def IsNotAlpha(text: str) -> bool:
|
|
100
135
|
"""
|
|
101
136
|
Проверяет, состоит ли строка целиком из небуквенных символов.
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
from .Methods import ReadJSON, WriteJSON
|
|
2
|
+
from .Exceptions.TelebotUtils import *
|
|
3
|
+
|
|
4
|
+
from telebot.types import Message, User
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
#==========================================================================================#
|
|
9
|
+
# >>>>> УПРАВЛЕНИЕ ПОЛЬЗОВАТЕЛЯМИ <<<<< #
|
|
10
|
+
#==========================================================================================#
|
|
11
|
+
|
|
12
|
+
class UserData:
|
|
13
|
+
"""Объектное представление данных пользователя."""
|
|
14
|
+
|
|
15
|
+
#==========================================================================================#
|
|
16
|
+
# >>>>> СВОЙСТВА ТОЛЬКО ДЛЯ ЧТЕНИЯ <<<<< #
|
|
17
|
+
#==========================================================================================#
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def id(self) -> int:
|
|
21
|
+
"""ID пользователя."""
|
|
22
|
+
|
|
23
|
+
return self.__ID
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def is_premium(self) -> bool:
|
|
27
|
+
"""Состояние: есть ли Premium-подписка у пользователя."""
|
|
28
|
+
|
|
29
|
+
return self.__Data["premium"]
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def language(self) -> str:
|
|
33
|
+
"""Код используемого клиентом языка по стандарту ISO 639-1."""
|
|
34
|
+
|
|
35
|
+
return self.__Data["language"]
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def permissions(self) -> list:
|
|
39
|
+
"""Список прав доступа пользователя."""
|
|
40
|
+
|
|
41
|
+
return self.__Data["permissions"]
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def username(self) -> str:
|
|
45
|
+
"""Ник пользователя."""
|
|
46
|
+
|
|
47
|
+
return self.__Data["username"]
|
|
48
|
+
|
|
49
|
+
#==========================================================================================#
|
|
50
|
+
# >>>>> ПРИВАТНЫЕ МЕТОДЫ <<<<< #
|
|
51
|
+
#==========================================================================================#
|
|
52
|
+
|
|
53
|
+
def __SaveData(self):
|
|
54
|
+
"""Записывает данные в локальный файл."""
|
|
55
|
+
|
|
56
|
+
# Запись локального файла.
|
|
57
|
+
WriteJSON(self.__StorageDirectory + f"/{self.__ID}.json", self.__Data)
|
|
58
|
+
|
|
59
|
+
#==========================================================================================#
|
|
60
|
+
# >>>>> ПУБЛИЧНЫЕ МЕТОДЫ <<<<< #
|
|
61
|
+
#==========================================================================================#
|
|
62
|
+
|
|
63
|
+
def __init__(self, dir: str, user_id: int, data: dict | None = None):
|
|
64
|
+
"""
|
|
65
|
+
Объектное представление данных пользователя.
|
|
66
|
+
dir – путь к директории хранения данных;
|
|
67
|
+
user_id – ID пользователя;
|
|
68
|
+
data – словарь с описанием данных пользователя для инициализации (если не передан, данные будут загружены из файла).
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
#---> Генерация динамических свойств.
|
|
72
|
+
#==========================================================================================#
|
|
73
|
+
# ID пользователя.
|
|
74
|
+
self.__ID = user_id
|
|
75
|
+
# Директория хранилища.
|
|
76
|
+
self.__StorageDirectory = dir.replace("\\", "/").rstrip("/")
|
|
77
|
+
# Словарное представление данных пользователя.
|
|
78
|
+
self.__Data = {
|
|
79
|
+
"username": None,
|
|
80
|
+
"language": None,
|
|
81
|
+
"is_premium": None,
|
|
82
|
+
"permissions": [],
|
|
83
|
+
"data": {}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
# Если переданы данные в виде словаря.
|
|
87
|
+
if type(data) == dict:
|
|
88
|
+
# Копирование данных.
|
|
89
|
+
self.__Data = data
|
|
90
|
+
|
|
91
|
+
# Если переданы данные в виде объекта.
|
|
92
|
+
elif type(data) == User:
|
|
93
|
+
# Обновление данных.
|
|
94
|
+
self.update(data)
|
|
95
|
+
|
|
96
|
+
# Если существует локальный файл.
|
|
97
|
+
elif os.path.exists(self.__StorageDirectory + f"/{user_id}.json"):
|
|
98
|
+
# Чтение файла.
|
|
99
|
+
self.__Data = ReadJSON(self.__StorageDirectory + f"/{user_id}.json")
|
|
100
|
+
|
|
101
|
+
# Создание файла.
|
|
102
|
+
else:
|
|
103
|
+
# Сохранение данных.
|
|
104
|
+
WriteJSON(self.__StorageDirectory + f"/{user_id}.json", self.__Data)
|
|
105
|
+
|
|
106
|
+
def add_permissions(self, permissions: list[str] | str):
|
|
107
|
+
"""
|
|
108
|
+
Задаёт разрешения.
|
|
109
|
+
permissions – разрешения.
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
# Если указано одно разрешение, преобразовать в список.
|
|
113
|
+
if type(permissions) == str: permissions = [permissions]
|
|
114
|
+
# Состояние: изменялся ли список разрешений.
|
|
115
|
+
IsChanged = False
|
|
116
|
+
|
|
117
|
+
# Для каждого разрешения.
|
|
118
|
+
for Permission in permissions:
|
|
119
|
+
|
|
120
|
+
# Если разрешение не определено.
|
|
121
|
+
if Permission not in self.__Data["permissions"]:
|
|
122
|
+
# Добавление разрешения.
|
|
123
|
+
self.__Data["permissions"].append(Permission)
|
|
124
|
+
# Переключение состояния.
|
|
125
|
+
IsChanged = True
|
|
126
|
+
|
|
127
|
+
# Если список разрешений изменён, отсортировать его.
|
|
128
|
+
if IsChanged: self.__Data["permissions"] = sorted(self.__Data["permissions"])
|
|
129
|
+
# Сохранение данных.
|
|
130
|
+
self.__SaveData()
|
|
131
|
+
|
|
132
|
+
def get_property(self, key: str) -> any:
|
|
133
|
+
"""
|
|
134
|
+
Возвращает значение свойства пользователя.
|
|
135
|
+
key – ключ свойства.
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
return self.__Data["data"][key]
|
|
139
|
+
|
|
140
|
+
def has_permissions(self, permissions: list[str] | str) -> bool:
|
|
141
|
+
"""
|
|
142
|
+
Проверяет, имеет ли пользователь все перечисленные разрешения.
|
|
143
|
+
permissions – разрешения.
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
# Если указано одно разрешение, преобразовать в список.
|
|
147
|
+
if type(permissions) == str: permissions = [permissions]
|
|
148
|
+
# Состояние: имеет ли пользователь все указанные разрешения.
|
|
149
|
+
IsOwned = True
|
|
150
|
+
|
|
151
|
+
# Для каждого разрешения.
|
|
152
|
+
for Permission in permissions:
|
|
153
|
+
|
|
154
|
+
# Если разрешение не определено, переключить состояние.
|
|
155
|
+
if Permission not in self.__Data["permissions"]: IsOwned = False
|
|
156
|
+
|
|
157
|
+
return IsOwned
|
|
158
|
+
|
|
159
|
+
def remove(self):
|
|
160
|
+
"""Удаляет локальный файл пользователя."""
|
|
161
|
+
|
|
162
|
+
# Удаление локального файла.
|
|
163
|
+
os.remove(self.__StorageDirectory + f"/{self.__ID}.json")
|
|
164
|
+
|
|
165
|
+
def remove_permissions(self, permissions: list[str] | str):
|
|
166
|
+
"""
|
|
167
|
+
Удаляет разрешения.
|
|
168
|
+
permissions – разрешения.
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
# Если указано одно разрешение, преобразовать в список.
|
|
172
|
+
if type(permissions) == str: permissions = [permissions]
|
|
173
|
+
|
|
174
|
+
# Для каждого разрешения.
|
|
175
|
+
for Permission in permissions:
|
|
176
|
+
|
|
177
|
+
# Если разрешение определено.
|
|
178
|
+
if Permission in self.__Data["permissions"]:
|
|
179
|
+
# Удаление разрешения.
|
|
180
|
+
self.__Data["permissions"].remove(Permission)
|
|
181
|
+
|
|
182
|
+
# Сохранение данных.
|
|
183
|
+
self.__SaveData()
|
|
184
|
+
|
|
185
|
+
def set_property(self, key: str, value: any):
|
|
186
|
+
"""
|
|
187
|
+
Обновляет значение свойства пользователя.
|
|
188
|
+
key – ключ свойства;
|
|
189
|
+
value – значение.
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
# Если ключа данных не существует, создать его.
|
|
193
|
+
if "data" not in self.__Data.keys(): self.__Data["data"] = dict()
|
|
194
|
+
# Помещение данных.
|
|
195
|
+
self.__Data["data"][key] = value
|
|
196
|
+
# Сохранение данных.
|
|
197
|
+
self.__SaveData()
|
|
198
|
+
|
|
199
|
+
def update(self, user: User):
|
|
200
|
+
"""
|
|
201
|
+
Обновляет данные пользователя из параметров, содержащихся в сообщении.
|
|
202
|
+
user – объект представления пользователя.
|
|
203
|
+
"""
|
|
204
|
+
|
|
205
|
+
# Если ID соответствует.
|
|
206
|
+
if user.id == self.__ID:
|
|
207
|
+
# Обновление данных.
|
|
208
|
+
self.__Data["is_premium"] = bool(user.is_premium)
|
|
209
|
+
self.__Data["language"] = user.language_code
|
|
210
|
+
self.__Data["username"] = user.username
|
|
211
|
+
# Сохранение файла.
|
|
212
|
+
self.__SaveData()
|
|
213
|
+
|
|
214
|
+
else: raise UpdateByOtherUser()
|
|
215
|
+
|
|
216
|
+
class UsersManager:
|
|
217
|
+
"""Менеджер пользователей."""
|
|
218
|
+
|
|
219
|
+
#==========================================================================================#
|
|
220
|
+
# >>>>> СВОЙСТВА ТОЛЬКО ДЛЯ ЧТЕНИЯ <<<<< #
|
|
221
|
+
#==========================================================================================#
|
|
222
|
+
|
|
223
|
+
@property
|
|
224
|
+
def admins(self) -> list[UserData]:
|
|
225
|
+
"""Список пользователей с правами администратора."""
|
|
226
|
+
|
|
227
|
+
# Список администраторов.
|
|
228
|
+
Admins = list()
|
|
229
|
+
|
|
230
|
+
# Для каждого пользователя.
|
|
231
|
+
for UserID in self.__Users.keys():
|
|
232
|
+
# Добавление пользователя в список.
|
|
233
|
+
if self.__Users[UserID].is_admin: Admins.append(self.__Users[UserID])
|
|
234
|
+
|
|
235
|
+
return Admins
|
|
236
|
+
|
|
237
|
+
@property
|
|
238
|
+
def premium_users(self) -> list[UserData]:
|
|
239
|
+
"""Список пользователей с Premium подпиской."""
|
|
240
|
+
|
|
241
|
+
# Список подписчиков.
|
|
242
|
+
PremiumUsers = list()
|
|
243
|
+
|
|
244
|
+
# Для каждого пользователя.
|
|
245
|
+
for UserID in self.__Users:
|
|
246
|
+
# Добавление пользователя в список.
|
|
247
|
+
if self.__Users[UserID].is_premium: PremiumUsers.append(self.__Users[UserID])
|
|
248
|
+
|
|
249
|
+
return PremiumUsers
|
|
250
|
+
|
|
251
|
+
@property
|
|
252
|
+
def users(self) -> list[UserData]:
|
|
253
|
+
"""Список пользователей."""
|
|
254
|
+
|
|
255
|
+
# Список пользователей.
|
|
256
|
+
Users = list()
|
|
257
|
+
# Для каждого пользователя записать значение в список.
|
|
258
|
+
for UserID in self.__Users.keys(): Users.append(self.__Users[UserID])
|
|
259
|
+
|
|
260
|
+
return Users
|
|
261
|
+
|
|
262
|
+
#==========================================================================================#
|
|
263
|
+
# >>>>> МЕТОДЫ <<<<< #
|
|
264
|
+
#==========================================================================================#
|
|
265
|
+
|
|
266
|
+
def __LoadUsers(self):
|
|
267
|
+
"""Загружает данные пользователей."""
|
|
268
|
+
|
|
269
|
+
# Получение списка файлов в директории пользователей.
|
|
270
|
+
Files = os.listdir(self.__StorageDirectory)
|
|
271
|
+
# Фильтрация только файлов формата JSON.
|
|
272
|
+
Files = list(filter(lambda List: List.endswith(".json"), Files))
|
|
273
|
+
|
|
274
|
+
# Для каждого файла.
|
|
275
|
+
for File in Files:
|
|
276
|
+
# Чтение файла.
|
|
277
|
+
Buffer = ReadJSON(self.__StorageDirectory + f"/{File}")
|
|
278
|
+
# ID пользователя.
|
|
279
|
+
UserID = int(File.replace(".json", ""))
|
|
280
|
+
# Запись пользовательских данных.
|
|
281
|
+
self.__Users[UserID] = UserData(self.__StorageDirectory, UserID, Buffer)
|
|
282
|
+
|
|
283
|
+
def __init__(self, dir: str):
|
|
284
|
+
"""
|
|
285
|
+
Менеджер пользователей.
|
|
286
|
+
dir – путь к директории хранения данных.
|
|
287
|
+
"""
|
|
288
|
+
|
|
289
|
+
#---> Генерация динамических свойств.
|
|
290
|
+
#==========================================================================================#
|
|
291
|
+
# Словарь пользователей.
|
|
292
|
+
self.__Users = dict()
|
|
293
|
+
# Директория хранилища.
|
|
294
|
+
self.__StorageDirectory = dir.replace("\\", "/").rstrip("/")
|
|
295
|
+
|
|
296
|
+
# Если директория пользователей не существует, создать её.
|
|
297
|
+
if not os.path.exists(self.__StorageDirectory): os.makedirs(self.__StorageDirectory)
|
|
298
|
+
# Загрузка данных пользователей.
|
|
299
|
+
self.__LoadUsers()
|
|
300
|
+
|
|
301
|
+
def auth(self, message: Message) -> UserData:
|
|
302
|
+
"""
|
|
303
|
+
Выполняет идентификацию и обновление данных существующего пользователя или создаёт локальный файл для нового.
|
|
304
|
+
message – структура описания сообщения.
|
|
305
|
+
"""
|
|
306
|
+
|
|
307
|
+
# Текущий пользователь.
|
|
308
|
+
User = None
|
|
309
|
+
|
|
310
|
+
# Если пользователь ещё не существует.
|
|
311
|
+
if message.from_user.id not in self.__Users.keys():
|
|
312
|
+
# Создание нового пользователя.
|
|
313
|
+
self.__Users[message.from_user.id] = UserData(self.__StorageDirectory, message.from_user.id, message.from_user)
|
|
314
|
+
|
|
315
|
+
# Обновление данных пользователя.
|
|
316
|
+
self.__Users[message.from_user.id].update(message.from_user)
|
|
317
|
+
# Установка текущего пользователя.
|
|
318
|
+
User = self.__Users[message.from_user.id]
|
|
319
|
+
|
|
320
|
+
return User
|
|
321
|
+
|
|
322
|
+
def get_user(self, user_id: int | str) -> UserData:
|
|
323
|
+
"""
|
|
324
|
+
Возвращает объект данных пользователя.
|
|
325
|
+
user_id – ID пользователя.
|
|
326
|
+
"""
|
|
327
|
+
|
|
328
|
+
return self.__Users[int(user_id)]
|
|
329
|
+
|
|
330
|
+
def get_users(self, include_permissions: list[str] | str | None = None, exclude_permissions: list[str] | str | None = None) -> list[UserData]:
|
|
331
|
+
"""
|
|
332
|
+
Возвращает список пользователей, подходящих под переданные фильтры. По умолчанию возвращает список всех пользователей.
|
|
333
|
+
include_permissions – разрешения, которыми должен обладать пользователь;
|
|
334
|
+
exclude_permissions – разрешения, которых у пользователя быть не должно.
|
|
335
|
+
"""
|
|
336
|
+
|
|
337
|
+
# Копирование списка пользователей.
|
|
338
|
+
Users = self.users
|
|
339
|
+
|
|
340
|
+
# Если переданы включения разрешений для фильтрации.
|
|
341
|
+
if include_permissions:
|
|
342
|
+
# Буфер фильтрации.
|
|
343
|
+
Buffer = list()
|
|
344
|
+
|
|
345
|
+
# Для каждого пользователя.
|
|
346
|
+
for User in Users:
|
|
347
|
+
# Если пользователь имеет все указанные разрешения, записать его.
|
|
348
|
+
if User.has_permissions(include_permissions): Buffer.append(User)
|
|
349
|
+
|
|
350
|
+
# Перезапись списка пользователей буфером.
|
|
351
|
+
Users = Buffer
|
|
352
|
+
|
|
353
|
+
# Если переданы исключения разрешений для фильтрации.
|
|
354
|
+
if exclude_permissions:
|
|
355
|
+
# Буфер фильтрации.
|
|
356
|
+
Buffer = list()
|
|
357
|
+
|
|
358
|
+
# Для каждого пользователя.
|
|
359
|
+
for User in Users:
|
|
360
|
+
# Если пользователь не имеет все указанные разрешения, записать его.
|
|
361
|
+
if not User.has_permissions(exclude_permissions): Buffer.append(User)
|
|
362
|
+
|
|
363
|
+
# Перезапись списка пользователей буфером.
|
|
364
|
+
Users = Buffer
|
|
365
|
+
|
|
366
|
+
return Users
|
|
367
|
+
|
|
368
|
+
def remove_user(self, user_id: int | str):
|
|
369
|
+
"""
|
|
370
|
+
Удаляет пользователя из системы.
|
|
371
|
+
user_id – ID пользователя.
|
|
372
|
+
"""
|
|
373
|
+
|
|
374
|
+
# Приведение ID пользователя к целочисленному.
|
|
375
|
+
user_id = int(user_id)
|
|
376
|
+
# Удаление локального файла.
|
|
377
|
+
self.__Users[user_id].remove()
|
|
378
|
+
# Удаление объекта.
|
|
379
|
+
del self.__Users[user_id]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dublib
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.0
|
|
4
4
|
Summary: Коллекция модулей от DUB1401.
|
|
5
5
|
Author-email: DUB1401 <vlad.milosta@outlook.com>
|
|
6
6
|
License: This is free and unencumbered software released into the public domain.
|
|
@@ -49,6 +49,8 @@ Requires-Dist: fake_useragent
|
|
|
49
49
|
Requires-Dist: httpx
|
|
50
50
|
Requires-Dist: httpx[http2]
|
|
51
51
|
Requires-Dist: requests
|
|
52
|
+
Provides-Extra: telebot
|
|
53
|
+
Requires-Dist: pyTelegramBotAPI; extra == "telebot"
|
|
52
54
|
|
|
53
55
|
# dublib
|
|
54
56
|
**dublib** – это библиотека, поставляющая компоненты, требующиеся в проектах [@DUB1401](https://github.com/DUB1401), написанных на Python.
|
|
@@ -58,6 +60,7 @@ Requires-Dist: requests
|
|
|
58
60
|
* [Methods](https://github.com/DUB1401/dublib/blob/main/docs/Methods.md)
|
|
59
61
|
* [Polyglot](https://github.com/DUB1401/dublib/blob/main/docs/Polyglot.md)
|
|
60
62
|
* [StyledPrinter](https://github.com/DUB1401/dublib/blob/main/docs/StyledPrinter.md)
|
|
63
|
+
* [TelebotUtils](https://github.com/DUB1401/dublib/blob/main/docs/Terminalyzer.md)
|
|
61
64
|
* [Terminalyzer](https://github.com/DUB1401/dublib/blob/main/docs/Terminalyzer.md)
|
|
62
65
|
* [WebRequestor](https://github.com/DUB1401/dublib/blob/main/docs/WebRequestor.md)
|
|
63
66
|
|
|
@@ -4,6 +4,7 @@ pyproject.toml
|
|
|
4
4
|
src/dublib/Methods.py
|
|
5
5
|
src/dublib/Polyglot.py
|
|
6
6
|
src/dublib/StyledPrinter.py
|
|
7
|
+
src/dublib/TelebotUtils.py
|
|
7
8
|
src/dublib/Terminalyzer.py
|
|
8
9
|
src/dublib/WebRequestor.py
|
|
9
10
|
src/dublib/__init__.py
|
|
@@ -13,6 +14,7 @@ src/dublib.egg-info/dependency_links.txt
|
|
|
13
14
|
src/dublib.egg-info/requires.txt
|
|
14
15
|
src/dublib.egg-info/top_level.txt
|
|
15
16
|
src/dublib/Exceptions/StyledPrinter.py
|
|
17
|
+
src/dublib/Exceptions/TelebotUtils.py
|
|
16
18
|
src/dublib/Exceptions/Terminalyzer.py
|
|
17
19
|
src/dublib/Exceptions/WebRequestor.py
|
|
18
20
|
src/dublib/Exceptions/__init__.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|