Альфа-тест! Внимание! Attention! Achtung! Atención Attention 注意 انتباه Atenção Attenzione
Саблицензии - это ключи доступа к конкретному паку или мини-приложению, которое сделал автор этого пака.
Это может быть кликер, бот, тул, helper, готовая мини-аппка под конкретную задачу - неважно. Смысл в том, что вы делаете свой продукт на базе EyeAuras и сами решаете:
С технической точки зрения EyeAuras уже позволяет очень глубоко кастомизировать такие продукты. По сути вы можете собрать почти отдельную программу, в которой уже есть готовые механизмы автоматизации, обновления, защиты, лицензирования и т.п.
Пример такого подхода: мини-аппка на базе EyeAuras
Отдельная лицензия на сам EyeAuras для использования саблицензий не нужна.
Платформа теперь распространяется бесплатно, а саблицензии нужны именно для ваших паков и мини-приложений.
Чтобы пользователю было проще начать работу, в EyeAuras есть вход по ключу без отдельной регистрации.
Пользователь просто нажимает I have a key, вставляет ключ, и программа автоматически создает для него аккаунт. Дальше он может пользоваться паком как обычный пользователь.

На странице пака у автора теперь есть отдельный блок, связанный с лицензированием.
Саблицензии предполагают, что ключи распространяете вы, автор пака, через любые удобные площадки.
EyeAuras сейчас отвечает за инфраструктуру лицензий, но не предоставляет встроенную покупку ключей. Возможно это появится позже, но пока здесь есть и технические, и юридические вопросы.
На практике варианты такие:
Пока идет альфа, выпуск ключей все еще через меня. Проще всего связаться через контакты, обычно быстрее всего через Discord.
После альфы выпуск ключей станет автоматическим. Базовая идея такая:
15%, то есть 85% остается авторуИтог простой: пока вы ничего не заработали, вы ничего не теряете.
Здесь настраивается, как именно будет работать лицензирование вашего пака.
Важно: изменения не ретроактивны. Если вы уже выпустили ключи с определенными условиями, они такими и останутся. Пользователь должен быть уверен, что купленный ключ не изменится задним числом.

Определяет, как тратится время лицензии.
Calendar - классическая модель. Ключ выдается на срок вроде недели или месяца, и время идет само по себе. Закрыли программу - время все равно идет.
Consumed - считается только время, когда пользователь реально пользуется программой. Закрыли EyeAuras - время не идет.
Автор может временно заморозить лицензии и остановить расход времени.
Это удобно, если после обновления что-то сломалось и нужно спокойно все починить. В такой ситуации можно заморозить ключи, исправить проблему и потом разморозить их обратно. Пользователи не потеряют время в простое.
Важно: для Calendar этот режим пока еще дописывается. Для Consumed он уже должен работать нормально.
У каждого ключа есть определенное количество сессий. По умолчанию обычно это 1.
Что именно считается "сессией", определяете вы, автор пака:
EyeAuras сам не придумывает, что такое сессия именно для вашего продукта - он только считает и обслуживает эти сессии.
Можно выпускать ключи, которые при первом использовании привязываются к конкретному компьютеру.
Если пользователь захочет использовать пак на другом ПК, для этого можно:
Пока это в первую очередь список выпущенных лицензий и их текущего статуса.
Позже здесь появятся более удобные инструменты поиска, фильтрации и статистики.
Это нужно для отслеживания онлайна и понимания, используется ли ваш продукт прямо сейчас.
Список анонимизирован. Видно только сам факт подключения и техническое состояние лицензии, но не видно, кто именно это делает.
Позже здесь появится больше статистики по росту и активности пользователей.
Ключ пользователь получает не у EyeAuras, а у автора пака.
То есть схема простая:
Есть два обычных сценария.
Если у пользователя уже есть аккаунт EyeAuras, он может просто зайти в профиль и активировать ключ там.

Если аккаунта еще нет, можно просто нажать I have a key и войти только по ключу.

Оба варианта рабочие. Разница только в том, есть ли у пользователя уже аккаунт или EyeAuras создаст его автоматически в момент входа.
На странице My Account и прямо в окне логина теперь есть таймлайн активированных саблицензий.
Там видно:

Пользователь тоже может заморозить свою лицензию на неопределенный срок.
Пока лицензия заморожена, время не расходуется.
Количество таких заморозок ограничено. Точное число настраивает автор пака, а по умолчанию сейчас обычно стоит 1.
С точки зрения саблицензий у авторов обычно есть два очень разных сценария.
Это самый простой вариант.
В таком случае ничего отдельного придумывать с логином обычно не нужно:
То есть вы просто добавляете в пак логику аренды и проверки лицензии, а весь пользовательский сценарий входа остается на стороне самого EyeAuras.
Это уже сценарий mini-app или почти отдельной программы.
Именно этот подход обычно и является рекомендуемым, если вы делаете коммерческий продукт: так вы лучше контролируете пользовательский опыт, а сама логика пакета и лицензирования глубже спрятана.
Здесь есть два подварианта:
Самый безопасный формат в итоге - именно полностью кастомный UI.
Если у вас свой UI, есть два основных варианта.
LoginWidgetЭто самый быстрый способ, если у вас Blazor-окно и вы не хотите писать форму логина самостоятельно.
Достаточно вставить в свое окно:
<LoginWidget/>
Так пользователь сможет открыть стандартное окно логина EyeAuras прямо из вашего интерфейса.
Если у вас свой ImGui / Blazor / WPF / любой другой интерфейс, вы можете работать напрямую через IEyeHubService.
На практике вам обычно нужны такие операции:
PerformLogin(username, password) - обычный логин по имени пользователя и паролюPerformLogin(licenseKey, licenseKey) - вход по ключу без отдельной регистрацииActivateLicenseKey(licenseKey) - привязка дополнительного ключа к уже залогиненному аккаунтуActiveLicense - текущее состояние лицензииConnectionState, ConnectedFor, DisconnectedFor - состояние соединенияМинимальная схема выглядит так:
var eyeHub = GetService<IEyeHubService>();
var userLicense = await eyeHub.PerformLogin(username, password);
var keyLicense = await eyeHub.PerformLogin(licenseKey, licenseKey); // key login
var updatedLicense = await eyeHub.ActivateLicenseKey(extraLicenseKey); // only for already logged-in user
Log.Info($"Current user: {eyeHub.ActiveLicense.Username}");
Log.Info($"Connection state: {eyeHub.ConnectionState}");
Практически это позволяет собрать полностью свой экран логина, свой профиль, свои статусы подключения и вообще не выводить стандартный UI EyeAuras пользователю напрямую.
Если у вас уже есть пак с саблицензиями, обязательно прочитайте этот блок.
Механизм проверки саблицензий сильно изменился.
Раньше можно было просто читать список саблицензий из текущей лицензии, например через ILicenseAccessor.ShareSublicenses.
Теперь для новых версий EyeAuras правильная модель другая:
lease, который меняет состояние со временемleaseЕсли оставить старую пассивную проверку и не перейти на новый API, поведение будет таким:
9298 это еще может работать в режиме совместимости9298 саблицензия больше не подхватывается автоматическиКоротко: для новых паков и новых версий клиента старый способ больше не подходит.
Если вы собираетесь публиковать или обновлять пак под новую версию EyeAuras, миграция на ISublicenseManager обязательна.
Теперь нужно использовать ISublicenseManager и запрашивать lease.
Минимальный пример:
using var lease = GetService<ISublicenseManager>()
.Rent(new AuraShareId("S20260209165639iiQZB0NCruAb"));
lease.WhenChanged()
.Subscribe(x => Log.Info($"Lease changed: {new { x.IsGranted, x.Status, x.Message, x.LastUpdatedAt }}"));
Рекомендуемый вариант для реактивной подписки - привязать подписку к ExecutionAnchors:
var lease = GetService<ISublicenseManager>()
.Rent(new AuraShareId("S20260209165639iiQZB0NCruAb"));
lease.WhenChanged()
.Subscribe(x =>
{
if (!x.IsGranted)
{
Log.Warn($"Sublicense is not granted yet: {x.Status} / {x.Message}");
return;
}
Log.Info("Sublicense granted, pack can continue working");
})
.AddTo(ExecutionAnchors);
Что здесь важно:
Rent(...) не блокирует выполнение и возвращает объект сразуPendingWhenChanged()lease.IsGranted == truelease EyeAuras уже привязывает к жизненному циклу скрипта, а .AddTo(ExecutionAnchors) выше нужен именно для вашей подпискиОдин lease = одна логическая сессия.
Если вы освободили lease, то сессия считается завершенной. Когда скрипт или пак завершается, EyeAuras тоже освободит такие сессии автоматически.
Rent(...)Сам по себе вызов Rent(...) еще не означает, что доступ уже получен.
Правильная проверка - это lease.IsGranted и, при необходимости, lease.Status / lease.Message.
Каждый вызов Rent(...) - это отдельная сессия.
ILicenseAccessor.ShareSublicenses больше не используйте как основной способЕго можно считать только как старый совместимый путь, но не как нормальную проверку для новых паков.
Текущая модель лицензирования старается быть максимально дружелюбной к пользователю.
EyeAuras не требует, чтобы пользователь терял доступ к паку при каждом кратком дисконнекте, реконнекте или перезапуске клиента.
Как это работает на практике:
lease выдается не "навсегда", а на ограниченное времяОтдельно важный случай - краш.
Если приложение или скрипт упали, локальный lease может не успеть освободиться, и сервер какое-то время будет считать эту сессию занятой. Но для пользователя это не должно превращаться в ситуацию "все умерло и больше не работает".
За счет Semi-Offline режима и кэшированной подписанной лицензии EyeAuras старается восстановить уже выданный доступ после перезапуска и продолжать работу, пока эта оффлайн-лицензия еще валидна.
То есть ожидаемое поведение такое:
leaseВажно понимать границы этого режима:
Для саблицензий маленький скрипт с арендой и проверкой лицензии по сути обязателен. А значит, если продукт платный, этот код желательно прятать как можно глубже.
Рекомендуемый набор настроек такой:
PackDistributionPolicy = PackedOnlyPackScriptCompilationMode = BinariesOnlyPackScriptProtectionMode = PerformanceFirst или SecurityFirstЧто это дает:
PackedOnly - пользователю отдается только запакованная версия пакаBinariesOnly - текст скриптов не распространяется, остаются только бинарникиPerformanceFirst / SecurityFirst - поверх этого добавляется защита и обфускацияВ сумме это делает код с проверкой лицензий заметно менее доступным для изучения и вмешательства.
Подробности есть в статье Защита C# скриптов.
Важно: на текущий момент эта защита все еще тестируется. Чтобы включить ее сейчас, нужно запросить доступ в альфа-группу в личных сообщениях. Когда функционал стабилизируется, он станет доступен всем.
И все же стоит помнить: даже при хорошем паковании и защите самый безопасный вариант - это полностью кастомный UI и mini-app подход.
Не каждый платный продукт обязан быть полноценным mini-app с большим количеством кода.
Бывает и так, что основной функционал почти полностью собран из:
В таком случае саблицензии все равно обычно реализуются через маленький C# скрипт, который запускается вместе с паком, оформляет аренду и дальше уже передает результат остальной логике.
Есть два практичных варианта.
IsAuthenticatedСамый простой путь - завести отдельную ауру, например IsAuthenticated, и держать в ней Fixed Value Trigger.
Дальше ваш скрипт отслеживает состояние lease и при изменениях просто включает или выключает эту ауру.
После этого весь остальной пак можно завязать на обычные механизмы EyeAuras:
AuraIsActiveEnabling ConditionТо есть лицензирование остается в одном маленьком скрипте, а вся остальная автоматизация по сути работает как раньше.
Если нужно найти нужную ауру из кода, используйте подход отсюда: Как найти ауру
Если вам удобнее, состояние авторизации можно хранить не в отдельной ауре, а в переменной.
Идея та же самая:
lease обновляет переменную вроде isAuthenticatedПодробнее про этот подход здесь: Переменные
Если логика лицензирования находится прямо внутри вашего скрипта, имеет смысл повесить на него permission Private, чтобы пользователь не видел и не редактировал этот код.
Сейчас ничего отдельно "включать" не нужно.
Пока идет альфа, выпуск ключей все еще через меня, так что просто пишите мне.
Дальше ключи можно будет выпускать прямо на сайте без ручной настройки через чат.
Желательно, чтобы у вас уже был готовый пак или мини-аппка и было понятно, что именно вы распространяете. Если продукт приватный - это не проблема, можно и без публичной страницы.
Где угодно. EyeAuras не ограничивает вас в канале продаж.
Самые частые варианты:
Нет. EyeAuras теперь бесплатен.
Пользователь оплачивает только ваш продукт, если вы решили продавать доступ к нему через саблицензии.
Нет, не задним числом.
Новые настройки влияют только на новые ключи. Уже выпущенные должны оставаться такими, какими были в момент покупки.
PendingЭто значит, что EyeAuras уже запросил доступ, но фоновое обновление лицензии еще не завершилось.
Обычно это нормальное промежуточное состояние при старте.
Обычно текущая модель старается сохранить уже выданный доступ и не дергать пользователя по мелочам.
Если произошел краткий дисконнект, EyeAuras постарается продолжить работу на уже полученной подписанной лицензии и потом пересинхронизироваться с сервером.
Если произошел краш, после перезапуска пак обычно тоже должен продолжить работать, если у клиента еще есть валидная кэшированная оффлайн-лицензия для этого доступа.
Но важно: это Semi-Offline, а не полный offline. Если подходящего кэша нет, новый доступ придется дождаться от сервера.
Да, если вы хотите, чтобы они надежно работали на новых версиях EyeAuras.
Если пак продолжает проверять доступ старым способом и никогда не вызывает ISublicenseManager.Rent(...), пользователь с купленным ключом может не получить доступ на новых клиентах.