Перейти к содержимому

UserRegistry

UserRegistry — высокоуровневая обёртка для хранения данных пользователей в KV. Автоматически проставляет created_at / updated_at.

from edgebot import UserRegistry
users = UserRegistry(env.USERS)
UserRegistry(kv: Any, *, prefix: str = "user:")
ПараметрОписание
kvKV-биндинг из env или готовый KVStore
prefixПрефикс ключей в неймспейсе (по умолчанию "user:")

Ключ в KV: {prefix}{user_id}, например "user:123456".

Прочитать запись пользователя.

await users.get(user_id: int) -> dict | None

Проверить наличие записи.

await users.exists(user_id: int) -> bool

Создать новую запись. Автоматически добавляет created_at и updated_at.

await users.create(
user_id: int,
data: dict,
*,
ttl: int | None = None,
metadata: dict | None = None,
) -> dict
RaisesУсловие
UserAlreadyExistsЗапись с таким user_id уже есть

Создать или полностью заменить запись. Сохраняет прежний created_at, обновляет updated_at.

await users.upsert(
user_id: int,
data: dict,
*,
ttl: int | None = None,
metadata: dict | None = None,
) -> dict

Частично обновить поля (merge верхнего уровня). Обновляет updated_at.

await users.update(
user_id: int,
data: dict,
*,
ttl: int | None = None,
metadata: dict | None = None,
) -> dict | None

Возвращает None, если записи нет.

Удалить запись. Идемпотентно.

await users.delete(user_id: int) -> None

Асинхронно итерировать user_id всех записей без чтения значений.

async for uid in users.iter_ids():
print(uid)

Итерировать пары (user_id, data) с чтением значения каждого ключа.

async for uid, data in users.items():
print(uid, data["username"])

UserRegistry автоматически добавляет к записям:

ПолеФорматОписание
created_atISO-8601 UTC ("2026-04-20T12:34:56Z")Время создания
updated_atISO-8601 UTCВремя последнего обновления
from edgebot import UserAlreadyExists, UsersError
try:
await users.create(123, {"name": "John"})
except UserAlreadyExists:
print("Пользователь уже существует")
from edgebot import UserRegistry, Context
users = UserRegistry(env.USERS)
@bot.on_command("/start")
async def start(ctx: Context):
user_id = ctx.from_user["id"]
if await users.exists(user_id):
user = await users.get(user_id)
await ctx.send(f"С возвращением, {user['name']}!")
else:
user = await users.create(user_id, {
"name": ctx.from_user.get("first_name", ""),
"username": ctx.from_user.get("username"),
"is_active": True,
})
await ctx.send(f"Добро пожаловать, {user['name']}!")