Skip to content

API UO Messenger

Codex edited this page Oct 3, 2026 · 1 revision

UO.Messenger

Русский · English · Українська · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

ClassicUO • Runtime API

Создаёт объект для текстовых уведомлений и приёма сообщений Telegram, Discord или Viber. Например, скрипт может сообщить об окончании сбора ресурсов или проверить запрос остановки от заранее указанного пользователя. Создание объекта ещё не подключает бота и ничего не отправляет.

Точный синтаксис

UO.Messenger(provider:String) -> Object

Параметры

  • provider — String: "telegram", "discord" или "viber"; регистр не важен. Другие значения вызывают ошибку.

Возвращает

Object Messenger. Это не Boolean и не ID. ID сообщений, отправителей и чатов в этом объекте всегда String: сравнивайте их со строками, не преобразуйте через CInt/CDbl.

Поведение

  • Provider() → String; Connected() → 1/0 (True/False): поставщик и результат последней проверки авторизации. Connected не гарантирует доступность Интернета в эту секунду.
  • Connect(token) → Unit: проверяет токен бота; ConnectFromFile(path) → Unit: читает токен UTF-8 из файла до 1024 байт. Относительный путь считается от папки текущего скрипта. Повторное подключение требует Disconnect. Ошибки можно перехватить Try/Catch.
  • Disconnect() → Unit: прекращает локальный приём, очищает токен и курсоры; объект можно подключить снова. Dispose() → Unit: закрывает объект окончательно.
  • SendMessage(text, recipient) → String: ID принятого сообщения. Параметры — текст и строковый chat ID Telegram, channel ID Discord либо ID подписчика Viber. Лимиты длины: 4096/2000/7000 соответственно; также Viber JSON ≤30000 байт. Пустой текст запрещён. Discord не создаёт упоминания everyone/ролей.
  • WatchChannel(channelId) → Unit: Discord, запоминает текущее последнее сообщение и читает только последующие. WatchChannel(channelId, afterMessageId) → Unit: начинает после заданного строкового ID; "0" включает историю. До 32 каналов на объект.
  • Receive(timeoutSeconds) → Array; Receive(): таймаут 0. Диапазон 0..20 секунд; пустой массив означает отсутствие доступных текстовых сообщений. Telegram использует long polling, Discord опрашивает выбранные каналы, Viber читает очередь webhook. Сетевой запрос может занять до 30 секунд.
  • Каждый MessengerMessage: Id(), SenderId(), SenderName(), ChatId(), Text() → String. У поста Telegram от канала может не быть SenderId. Вложения, нетекстовые события и сообщения Discord от ботов не возвращаются.
  • RetryAfter() → Integer: сколько секунд ещё ждать после ограничения сервиса. До истечения этого срока новые HTTP-запросы не выполняются. Отправка после сбоя не повторяется автоматически: сервер мог уже принять сообщение.
  • StartReceiver(localPort, publicHttpsUrl) → Integer: только Viber; порт 1..65535, возвращает занятый локальный порт. Публичный HTTPS-адрес должен оканчиваться /viber/ и заранее пересылать POST на 127.0.0.1:порт/viber/ с исходным телом и заголовком подписи. Метод регистрирует webhook у Viber.
  • Нужен токен бота, не пароль личного аккаунта. Telegram с существующим webhook отклоняется без его удаления. Discord требует прав чтения/отправки канала и MESSAGE_CONTENT для доступного текста; Viber отправляет подписавшимся пользователям.
  • Receive сохраняет курсор только после разбора всей пачки. Telegram/Discord возвращают до 100 записей за запрос; вызывайте Receive снова для следующих пачек. Discord без второго аргумента WatchChannel пропускает старую историю.
  • Viber проверяет HMAC-SHA256 исходного тела. Очередь — 100 сообщений, повторные ID хранятся для последних 2048 доставок; переполнение даёт HTTP 503 для повтора сервисом. Нужен HTTPS-прокси с Content-Length; chunked-запросы на локальном входе отклоняются.
  • Токен не записывается в профиль, текст ошибок и историю аргументов Connect. Используйте ConnectFromFile, чтобы не хранить его в переменных скрипта, видимых отладчику. Не публикуйте файлы токенов.
  • Создавайте объект внутри процедуры. Не более 32 одновременно; Using/Dispose освобождает его раньше. При завершении, ошибке или остановке скрипта все его messenger-объекты закрываются. Закрытие Viber-приёмника не удаляет webhook у сервиса.
  • Это текстовый интерфейс: он не выполняет полученный текст как код и не подключает игровые аккаунты. Условия доверия к отправителю задаёт сам скрипт.

Внутренние функции: от вызова до результата

CreateMessenger создаёт объект без сетевого обмена и привязывает его ресурсы к текущему выполнению скрипта.

1. CreateMessenger

CreateMessenger создаёт объект без сетевого обмена и привязывает его ресурсы к текущему выполнению скрипта.

Object Messenger. Это не Boolean и не ID. ID сообщений, отправителей и чатов в этом объекте всегда String: сравнивайте их со строками, не преобразуйте через CInt/CDbl.

Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionRuntime.cs; функция CreateMessenger.

2. RequestAsync

RequestAsync формирует JSON и заголовки конкретного сервиса; проверяет HTTP и внутренний результат. Лимит ответа 2 МиБ, общая граница ожидания 30 секунд, отмена скрипта прерывает ожидание.

При ошибке — исключение для Try/Catch; Stop остаётся отменой выполнения. Ошибка отправки не доказывает, что сообщение не было доставлено.

Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/Messaging/MessengerClient.cs; функция RequestAsync.

3. Accept

Accept проверяет подпись Viber, разбирает UTF-8 и добавляет текст в ограниченную очередь. Receive выдаёт сообщения скрипту; обработчик скрипта в сетевом потоке не вызывается.

При ошибке — исключение для Try/Catch; Stop остаётся отменой выполнения. Ошибка отправки не доказывает, что сообщение не было доставлено.

Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/Messaging/ViberReceiver.cs; функция Accept.

Ресурсы освобождаются при окончании процедуры входа, включая ошибку и Stop.

Примеры

Telegram: уведомление после завершения работы

# Telegram: уведомление после завершения работы
#
# Создаёт объект для текстовых уведомлений и приёма сообщений Telegram, Discord или Viber.
# Например, скрипт может сообщить об окончании сбора ресурсов или проверить запрос остановки от
# заранее указанного пользователя. Создание объекта ещё не подключает бота и ничего не
# отправляет.
#
# Object Messenger. Это не Boolean и не ID. ID сообщений, отправителей и чатов в этом объекте
# всегда String: сравнивайте их со строками, не преобразуйте через CInt/CDbl.

SUB Main()
    # Положите telegram-token.txt рядом со скриптом, замените 12345678 на свой chat ID. Пример
    # отправляет одно уведомление и возвращает строковый ID; получение ответа сервера не
    # подтверждает прочтение человеком.
    # Нужны собственные настройки бота. Примеры проверены с локальными тестовыми ответами; они не
    # отправлялись реальным пользователям.

    Dim bot = UO.Messenger("telegram")
    Using bot
        bot.ConnectFromFile("telegram-token.txt")
        Dim messageId = bot.SendMessage("Harvest finished", "12345678")
        Return messageId
    End Using
END SUB

Разбор параметров и выполнения:

  • Положите telegram-token.txt рядом со скриптом, замените 12345678 на свой chat ID. Пример отправляет одно уведомление и возвращает строковый ID; получение ответа сервера не подтверждает прочтение человеком.
  • Нужны собственные настройки бота. Примеры проверены с локальными тестовыми ответами; они не отправлялись реальным пользователям.

Discord: запрос остановки от выбранного пользователя

# Discord: запрос остановки от выбранного пользователя
#
# Создаёт объект для текстовых уведомлений и приёма сообщений Telegram, Discord или Viber.
# Например, скрипт может сообщить об окончании сбора ресурсов или проверить запрос остановки от
# заранее указанного пользователя. Создание объекта ещё не подключает бота и ничего не
# отправляет.
#
# Object Messenger. Это не Boolean и не ID. ID сообщений, отправителей и чатов в этом объекте
# всегда String: сравнивайте их со строками, не преобразуйте через CInt/CDbl.

SUB Main()
    # Укажите свой канал и ID разрешённого отправителя. True означает, что за эту проверку пришёл
    # текст stop от него; сам пример не останавливает движение. Этот результат можно использовать в
    # условии собственного рабочего цикла.
    # Нужны собственные настройки бота. Примеры проверены с локальными тестовыми ответами; они не
    # отправлялись реальным пользователям.

    Dim bot = UO.Messenger("discord")
    Using bot
        bot.ConnectFromFile("discord-token.txt")
        bot.WatchChannel("123456789012345678")
        Dim messages = bot.Receive(5)
        For Each message In messages
            If message.SenderId() = "987654321098765432" AndAlso LCase(Trim(message.Text())) = "stop" Then
                Return True
            End If
        Next
        Return False
    End Using
END SUB

Разбор параметров и выполнения:

  • Укажите свой канал и ID разрешённого отправителя. True означает, что за эту проверку пришёл текст stop от него; сам пример не останавливает движение. Этот результат можно использовать в условии собственного рабочего цикла.
  • Нужны собственные настройки бота. Примеры проверены с локальными тестовыми ответами; они не отправлялись реальным пользователям.

Viber: подписанный входящий текст

# Viber: подписанный входящий текст
#
# Создаёт объект для текстовых уведомлений и приёма сообщений Telegram, Discord или Viber.
# Например, скрипт может сообщить об окончании сбора ресурсов или проверить запрос остановки от
# заранее указанного пользователя. Создание объекта ещё не подключает бота и ничего не
# отправляет.
#
# Object Messenger. Это не Boolean и не ID. ID сообщений, отправителей и чатов в этом объекте
# всегда String: сравнивайте их со строками, не преобразуйте через CInt/CDbl.

SUB Main()
    # Создайте рядом viber-settings.json: {"port":8787,"publicUrl":"https://YOUR-HOST/viber/"},
    # настройте HTTPS-прокси и viber-token.txt. Замените trusted-subscriber-id. Пример возвращает
    # текст выбранного отправителя либо пустую строку.
    # Нужны собственные настройки бота. Примеры проверены с локальными тестовыми ответами; они не
    # отправлялись реальным пользователям.

    Dim settings = JsonLoad("viber-settings.json")
    Dim bot = UO.Messenger("viber")
    Using bot
        bot.ConnectFromFile("viber-token.txt")
        bot.StartReceiver(settings["port"], settings["publicUrl"])
        Dim messages = bot.Receive(5)
        For Each message In messages
            If message.SenderId() = "trusted-subscriber-id" Then
                Return message.Text()
            End If
        Next
        Return ""
    End Using
END SUB

Разбор параметров и выполнения:

  • Создайте рядом viber-settings.json: {"port":8787,"publicUrl":"https://YOUR-HOST/viber/"}, настройте HTTPS-прокси и viber-token.txt. Замените trusted-subscriber-id. Пример возвращает текст выбранного отправителя либо пустую строку.
  • Нужны собственные настройки бота. Примеры проверены с локальными тестовыми ответами; они не отправлялись реальным пользователям.

Clone this wiki locally