Скрипту доступны данные аккаунта Rockstar, под которым запущен клиент: ник, номер, роль, срок подписки и аватарка. Это то же самое, что показывает профиль в меню клиента, поэтому своя карточка игрока, приветствие по имени или счётчик дней подписки собираются без единого запроса на сайт.
Всё лежит в глобале profile (он же account, user и client.profile). Это не ник в Minecraft: игровое имя по-прежнему берут у игрока, например mc.getSession().getUsername().
Это свойства, а не методы: скобки после них не нужны. Значения живые, их читают там, где они нужны, а не запоминают при загрузке скрипта.
@command("whoami")
def whoami(ctx):
"""Кто я в клиенте"""
ctx.msg("%s, uid %d" % (profile.username, profile.uid))
ctx.msg("Роль: %s" % profile.role)
ctx.msg("Подписка: %s" % profile.subscription)| Свойство | Что внутри |
|---|---|
profile.username | Ник аккаунта на сайте (он же profile.name). Пустая строка, пока ответ не пришёл |
profile.uid | Номер аккаунта, целое число |
profile.role | Роль строкой: default, user, beta, media, support, moderator, alpha, admin, owner |
profile.staff | True у персонала клиента: админ, модератор или владелец |
profile.admin | True только у админа и владельца |
profile.loaded | Ответ сайта уже пришёл: до этого ник пустой, а роль у всех default |
profile.subscription | Срок подписки строкой ровно так, как его показывает клиент: 05-05-2026 или Навсегда |
profile.subscription_end | Конец подписки в секундах эпохи (как time.time()); None если срок бессрочный или неизвестен |
profile.subscription_left | Сколько осталось в секундах; None если бессрочно или неизвестно |
profile.days_left | Дней до конца: число, inf у бессрочной подписки, None если срок неизвестен |
profile.forever | True у бессрочной подписки |
profile.expired | True если срок подписки уже вышел |
profile.avatar | Аватарка готовой картинкой, её сразу можно рисовать |
profile.avatar_url | Ссылка на аватарку на сайте |
profile.client | Имя клиента: Rockstar |
profile.version | Версия клиента, например 2.1 |
Ещё два метода: profile.has_role("admin", "owner") отвечает, совпала ли роль хотя бы с одним из имён, а profile.all() отдаёт всё сразу обычным словарём Python (удобно распечатать при отладке).
Профиль запрашивается у сайта уже после запуска клиента, а скрипты грузятся раньше. Поэтому в теле скрипта ник обычно ещё пустой, а роль у всех default. Проверяй profile.loaded и читай значения в момент, когда они нужны.
greeted = False
@events.tick
def tick(e):
global greeted
if greeted or not profile.loaded:
return
greeted = True
client.msg("Привет, %s" % profile.username)profile.avatar отдаёт готовую картинку, такую же, как assets.image(...): её принимают d.image(...) на HUD и ui.image(...) в меню. Пока картинка качается, показывается заглушка клиента, а настоящая появится сама, когда дойдёт: ждать загрузку не нужно.
el = Hud("Профиль", width=150, height=44)
@el.render
def draw(d):
d.rounded_rect(0, 0, d.w, d.h, 8, Color(0, 0, 0, 150))
d.image(profile.avatar, 7, 7, 30, 30, radius=15)
d.text(profile.username or "не вошёл", 44, 10, size=8, weight="semibold")
d.text("Подписка: %s" % profile.subscription, 44, 24, size=7, color=theme.text())Аватарку другого пользователя клиента берут по нику: profile.avatar_of("ConeTin"). У кого её нет, получит ту же заглушку.
Строка profile.subscription годится, чтобы показать срок как есть. Разбирать её не надо: для расчётов есть числа.
import time
@command("sub")
def sub(ctx):
"""Сколько осталось подписки"""
if profile.forever:
ctx.msg("Подписка навсегда")
return
if profile.days_left is None:
ctx.warn("Срок неизвестен: клиент ещё не получил профиль")
return
if profile.expired:
ctx.error("Подписка кончилась")
return
ctx.msg("Осталось дней: %d" % profile.days_left)
ctx.msg("Кончится: %s" % time.strftime("%d.%m.%Y %H:%M", time.localtime(profile.subscription_end)))Роль это уровень аккаунта в клиенте, а не права на игровом сервере. По ней удобно прятать служебные части своего скрипта или показывать значок в интерфейсе.
el = Hud("Роль", width=70, height=18)
COLORS = {
"owner": Color(255, 90, 90),
"admin": Color(255, 140, 60),
"moderator": Color(90, 160, 255),
"media": Color(200, 120, 255),
}
@el.render
def draw(d):
color = COLORS.get(profile.role, theme.accent())
d.rounded_rect(0, 0, d.w, d.h, 6, color.withAlpha(40))
d.text(profile.role.upper(), 8, 6, size=7, color=color)
if profile.has_role("admin", "owner"):
client.msg("Отладочные команды скрипта включены")