Начало работы

Краткое руководство по началу работы.

Привет, мир!

Если хотите сразу перейти к практике, начните с живого примера — он особенно полезен, если вы только знакомитесь с миром C#.

А этот пример уже немного сложнее и ближе к тому, как всё устроено внутри EyeAuras.

Первый запуск — сообщение в журнале

Добавьте действие C# Script в ауру и вставьте в тело скрипта:

Log.Info("Привет, мир!");

Запустите скрипт кнопкой Run в его редакторе. В журнале скрипта должна появиться строка Привет, мир!. Дополнительный пакет или свой логгер здесь не нужен: Log предоставляет песочница. Для запуска действием ауры настройте триггер и список actions, как описано ниже.

Если вынесете код в обычный .cs-класс, передайте логгер явно — члены песочницы не становятся глобальными функциями C#. Законченный пример такого переноса есть в карте runtime.

Что такое скрипты?

С самого начала в программе была возможность писать собственный код на C#. В ранних версиях (примерно весной 2021 года) это было неудобно и местами болезненно, но всё же работало. Весной 2023 года вышла вторая версия, где появились такие возможности, как использование внешней IDE для написания кода, а сам скриптинг стал заметно мощнее. Например, стало возможно создавать полноценный пользовательский интерфейс на Blazor. По сути, это открыло путь к действительно сильным скриптам, хотя ограничений и «особенностей» всё ещё хватало.

В третьем поколении скриптов можно подключать внешние NuGet-пакеты и использовать API работающей программы. Runtime помогает с отменой и диагностикой, но не защищает произвольный код от любых сбоев.

Порог входа тоже стал заметно ниже: появились новые API, улучшилась диагностика и не только.

Что под капотом

Программа построена на платформе .NET. Это быстро развивающаяся платформа с высокой гибкостью и производительностью. Возможности языка определяются версией Roslyn в host и настройками проекта; сгенерированный экспорт помогает увидеть фактические зависимости вашей версии.

Каждый написанный вами скрипт компилируется через Roslyn. Большая часть головной боли, связанной с тем, как подключать файлы, что можно делать, а что нельзя, уже решена внутри самой программы. Поэтому вы можете сосредоточиться именно на логике скрипта.

С чего начать

Ниже — три основных поверхности запуска кода. Они используют песочницу.

1. C# Action

Самый простой вариант. Достаточно добавить действие "C# Script". Оно подчиняется тем же правилам, что и любые другие действия, поэтому для запуска нужно добавить триггер. Например, можно использовать Hotkey Is Active, назначить его на кнопку и запускать скрипт по нажатию или удержанию.

2. C# Trigger

Более сложный вариант — ваш скрипт будет выполняться через определённые интервалы времени. Предполагается, что где-то в коде вы будете возвращать true/false или null, чтобы активировать или деактивировать триггер. После этого к триггеру можно привязать действия, в том числе и скриптовые.

Сложность здесь в том, что такой скрипт работает постоянно и управляется только через Enabling Conditions. Поэтому код нужно писать аккуратнее: иначе легко получить ситуацию, когда ошибка в скрипте постоянно перехватывает управление мышью/клавиатурой или съедает всю доступную память на компьютере.

3. C# Overlay и WebUI

Поверхность скриптинга для своего UI. Помимо всего, что доступно в actions/triggers, WebUI позволяет создавать собственный пользовательский интерфейс: кнопки, переключатели, поля ввода и другие элементы.

Для отрисовки интерфейса используется технология Blazor, — это компонентная модель интерфейса в .NET. У самой технологии, конечно, есть свои минусы — идеальных решений не бывает, — но EyeAuras предоставляет инструменты, которые сглаживают эти проблемы. В итоге ваши возможности ограничены в основном только фантазией.

Ниже — несколько примеров различных форм, собранных на WebUI.

Сервисы

И сама программа, и её API построены вокруг подхода под названием Dependency Injection. Проще говоря, программа разделена на небольшие части, каждая из которых отвечает за свою задачу. Как в большом доме: кто-то варит кашу, кто-то штопает носки, а кто-то ничего не умеет, но всё равно существует.


У каждой такой сущности в этом доме есть имя. Например, если вы хотите двигать мышь, нужно обратиться к ISendInputUnstableScriptingApi и вызвать MouseMoveTo. Если нужно воспроизвести звук, используйте IPlaySoundScriptingApi.

Обязанности у сервисов разные, и, как и в жизни, знание правильных названий критично для успеха. В этой документации будут перечислены основные и самые полезные сервисы, но приводить вообще всё не имеет смысла — пакет NuGet EyeAuras.SDK помогает исследовать контракты. Доступность живых сервисов зависит от host и подключённых модулей; опциональные SDK могут требовать отдельных пакетов и регистрации.

Внешние зависимости

Если бы каждый программист каждый раз начинал с нуля, человечество до сих пор коллективно изобретало бы колесо. Поэтому скрипты полностью поддерживают внешние пакеты. В инфраструктуре .NET почти всё хранится в NuGet — и официальные, и неофициальные библиотеки.

Существует множество подборок полезных пакетов; начать можно, например, с этой. В скриптах можно подключить почти любой из них. Сейчас ещё есть некоторые исключения, но работа над этим продолжается.

Версию пакета указывайте явно. Например, в начале Script.csx:

csharp
#r "nuget: Newtonsoft.Json, 13.0.3"
using Newtonsoft.Json;

Log.Info(JsonConvert.SerializeObject(new { Hello = "World" }));

При доступном и совместимом пакете результат — JSON в журнале. Не каждый пакет совместим с host; ссылка даёт типы, но не регистрацию сервиса. Подробнее о зависимостях.

Основные контракты этой страницы сверены со срезом EyeAuras 20fd3d4, PoeEye 0e02c98. Точные API проверяйте по SDK/XML своей версии: пакет EyeAuras.SDK предоставляет контракты, а живые сервисы — работающий host.