Skip to content

API UO Messenger ko

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". 대소문자를 구분하지 않으며 다른 값은 오류입니다.

반환값

Messenger Object입니다. 메시지, 발신자, 채팅 ID는 항상 String이며 CInt/CDbl로 변환하지 마세요.

동작

  • Provider() → String; Connected() → 1/0 (True/False): 서비스와 마지막 인증 상태입니다. 현재 인터넷 연결을 보장하지 않습니다.
  • Connect(token) → Unit: 봇을 인증합니다. ConnectFromFile(path) → Unit: 최대 1024바이트의 UTF-8 토큰 파일을 읽습니다. 상대 경로는 현재 스크립트 폴더 기준입니다. 재연결 전에 Disconnect를 호출하세요.
  • Disconnect() → Unit: 로컬 수신을 중지하고 토큰과 커서를 지우며 재연결이 가능합니다. Dispose() → Unit: 객체를 영구적으로 닫습니다.
  • SendMessage(text, recipient) → String: 접수된 메시지 ID입니다. recipient는 문자열 Telegram chat ID, Discord channel ID 또는 Viber 구독자 ID입니다. 글자 수는 각각 1..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은 롱 폴링, 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 URL은 /viber/로 끝나야 하며 본문과 서명 헤더를 유지한 POST를 127.0.0.1:포트/viber/로 미리 전달하도록 설정해야 합니다. webhook을 등록합니다.
  • 봇 토큰이 필요합니다. 기존 Telegram webhook은 삭제하지 않고 연결을 거절합니다. Discord는 채널 읽기/전송 권한과 MESSAGE_CONTENT가 필요하며 Viber는 구독자에게 보냅니다.
  • 전체 배치를 해석한 후 커서를 갱신합니다. Telegram/Discord는 요청당 최대 100개이며 다음 배치는 Receive를 다시 호출합니다. Viber는 HMAC-SHA256, 100개 큐, 최근 2048개 ID의 중복 제거를 사용합니다. 큐가 차면 HTTP 503입니다. 프록시는 Content-Length를 제공해야 하며 로컬 chunked 요청은 거절됩니다.
  • 토큰을 프로필, 오류 내용, Connect 인수 기록에 저장하지 않습니다. ConnectFromFile은 디버거에서 보이는 토큰 변수도 만들지 않습니다. 토큰 파일을 공개하지 마세요.
  • 프로시저 안에서 만들며 동시에 최대 32개입니다. Using/Dispose, 완료, 오류, Stop이 자원을 해제합니다. Viber 수신기를 닫아도 원격 webhook은 삭제하지 않습니다. 수신 텍스트를 코드로 실행하지 않으며 신뢰할 발신자는 스크립트가 결정합니다.

내부 함수: 호출부터 결과까지

CreateMessenger는 통신 없이 생성하고 현재 스크립트 실행에 자원을 연결합니다.

1. CreateMessenger

CreateMessenger는 통신 없이 생성하고 현재 스크립트 실행에 자원을 연결합니다.

Messenger Object입니다. 메시지, 발신자, 채팅 ID는 항상 String이며 CInt/CDbl로 변환하지 마세요.

프로젝트 소스: external/InjectionScript/src/InjectionScript/Runtime/InjectionRuntime.cs; 함수 CreateMessenger.

2. RequestAsync

RequestAsync는 서비스별 JSON/헤더와 결과를 확인합니다. 응답은 2 MiB, 요청은 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 텍스트 메시지 객체를 만듭니다. 채집 완료 알림을 보내거나 허용한 발신자의 중지 요청을 확인할 수 있습니다. 객체
# 생성만으로 봇을 연결하거나 메시지를 보내지는 않습니다.
#
# Messenger Object입니다. 메시지, 발신자, 채팅 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 텍스트 메시지 객체를 만듭니다. 채집 완료 알림을 보내거나 허용한 발신자의 중지 요청을 확인할 수 있습니다. 객체
# 생성만으로 봇을 연결하거나 메시지를 보내지는 않습니다.
#
# Messenger Object입니다. 메시지, 발신자, 채팅 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 텍스트 메시지 객체를 만듭니다. 채집 완료 알림을 보내거나 허용한 발신자의 중지 요청을 확인할 수 있습니다. 객체
# 생성만으로 봇을 연결하거나 메시지를 보내지는 않습니다.
#
# Messenger Object입니다. 메시지, 발신자, 채팅 ID는 항상 String이며 CInt/CDbl로 변환하지 마세요.

SUB Main()
    # 스크립트 옆에 viber-token.txt와 viber-settings.json을 둡니다:
    # {"port":8787,"publicUrl":"https://YOUR-HOST/viber/"}. HTTPS 전달을 설정하고 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-token.txt와 viber-settings.json을 둡니다: {"port":8787,"publicUrl":"https://YOUR-HOST/viber/"}. HTTPS 전달을 설정하고 trusted-subscriber-id를 바꾸세요. 텍스트 또는 빈 문자열을 반환합니다.
  • 자신의 봇을 설정하세요. 예제는 로컬 테스트 응답으로 실행했으며 실제 수신자에게 연락하지 않았습니다.

Clone this wiki locally