서버리스 기능이 있는 웹후크

이 블로그 게시물에서는 원래 Habitica의 채팅에 게시된 메시지를 Discord 채널에 다시 게시하는 Cloudflare Workers에서 서버리스 기능을 설정하는 방법을 보여드리겠습니다.

소개



Habitica는 좋은 습관을 기르고 생산성을 높일 수 있는 훌륭한 플랫폼입니다. 그것의 사회적 측면은 또한 그것의 주요 특징 중 하나입니다. 사용자는 서로에게 책임을 묻기 위해 당사자를 구성할 수 있습니다. 모든 파티에는 사용자가 토론할 수 있고 시스템 메시지(사용된 기술, 처리된 손상, 시작된 퀘스트 등)가 게시되는 간단한 채팅 페이지가 있습니다. 그러나 채팅과 대화를 위한 소셜 공간을 만드는 데 있어 Discord는 현재 최고의 무료 솔루션입니다. 그래서 저희 일행과 저는 Discord 서버로 옮겼습니다. 문제는 시스템 메시지가 여전히 Habitica에 게시된다는 것입니다.

그래서 해당 메시지를 전용 Discord 채널에 자동으로 다시 게시하는 방법을 찾았습니다. 그리고 Discord와 Habitica 모두에서 제공하는 유연한 웹후크 덕분에 설정이 매우 쉽다는 것이 밝혀졌습니다.

1단계: Discord 봇 만들기



발신자 Discord's official instructions:
  • 서버 설정을 열고 통합 탭으로 이동합니다.
  • 새 웹후크를 만들려면 "웹후크 생성"버튼을 클릭하십시오!
  • 웹후크의 아바타와 이름을 편집할 수 있습니다
  • .
  • Webhook이 게시할 채널을 선택합니다.
  • Webhook URL을 복사할 수 있습니다
  • .



    2단계: 서버리스 함수 만들기



    Habitica는 Discord에 직접 게시할 수 없습니다. 우리는 중간자가 필요합니다. Zapier와 같은 코드 없는 솔루션은 깔끔하지만 여기서는 원하는 방식으로 메시지 형식을 지정하기 위해 요청에 대한 보다 세분화된 제어가 필요하며 서버리스 기능은 이 사용 사례에 이상적입니다.

    다양한 클라우드 기능 제공업체가 있지만 이 프로젝트에서는 Cloudflare Workers을 사용해 보고 싶었습니다. Cloudflare Workers는 다른 공급자에 비해 두 가지 중요한 이점이 있습니다. 매우 저렴하고 시작 시간(콜드 스타트)이 거의 즉각적이므로 현재 프로젝트에 이러한 기능이 필요하지 않습니다.

    Cloudflare는 서버리스 기능을 코딩할 수 있는 간단하면서도 편리한 온라인 코드 편집기도 제공합니다. 코드가 복잡하지 않기 때문에 온라인 편집기 내에서 직접 함수를 작성할 것입니다. 전체 코드는 다음과 같습니다.

    async function handleRequest(request) {
      try {
        // See below the structure of the data object
        const data = await request.json()
    
        // Only repost system messages
        if(data.chat.uuid === "system") {
    
          // Discord expects a JSON payload that looks like this { content: 'hello world'}
          const content = { "content": data.chat.text }
          await fetch(DISCORD_WEBHOOK_URL, {
            body: JSON.stringify(content),
            method: "POST",
            headers: { "Content-Type": "application/json" },
          })
        }
        return new Response('OK')
      } catch(error) {
        console.error(error)
    
            // Habitica always expects a 200 response, otherwise it will disable the webhook
        return new Response('OK')
      }
    }
    


    Habitica webhook에서 오는 게시물 요청의 본문은 다음과 같습니다.

    {
      "group": {
        "id": "XXXXX-c888-4dbf-aa0e-fc317c9c8f8c",
        "name": "super_squad "
      },
      "chat": {
        "flagCount": 0,
        "flags": {},
        "_id": "03e9b0d6-XXX-442a-9659-fde24aec2842",
        "id": "03e4b0d6-XXX-442a-9659-fde24aec2841",
        "text": "mornir casts Earthquake for the party.",
        "unformattedText": "mornir casts Earthquake for the party.",
        "info": {
          "type": "spell_cast_party",
          "user": "mornir",
          "class": "wizard",
          "spell": "earth"
        },
        "timestamp": "2021-03-10T17:00:40.141Z",
        "likes": {},
        "uuid": "system",
        "groupId": "5f38dbe06649-555-aa0e-fc317c9cbf8c"
      },
      "webhookType": "groupChatReceived",
      "user": { "_id": "5454544ea-134d-4e37-XXX-310351b35729" }
    }
    

    DISCORD_WEBHOOK_URL는 1단계에서 얻은 Webhook URL이며 여기에 환경 변수로 저장됩니다.



    3단계: Habitica 웹후크 생성



    webhook 생성을 위한 공식 UI인 on the settings pagewhat is available on the Habitica API 에 비해 약간 부족합니다. URL 추가 및 삭제만 가능하지만 우리의 경우 특정 대화방에서 발생하는 특정 이벤트를 듣고 싶습니다. 그렇기 때문에 Habitica 웹후크용 대체 편집기를 사용했는데, 여기에는 메인 사이트에 없는 모든 웹후크 옵션이 포함되어 있습니다.
    웹사이트: https://robwhitaker.com/habitica-webhook-editor/
    문서: https://habitica.fandom.com/wiki/Habitica_Webhook_Editor



    그러면 새로 생성된 후크가 우리의 Habitica account settings page에 나타납니다.



    결과



    짜잔! 이제 시스템 메시지를 다시 게시하는 작동하는 Habitica 봇이 있습니다!



    물론 우리가 할 수 있는 일은 훨씬 더 많습니다! 다음은 몇 가지 아이디어입니다.
  • 능력과 보스를 해당 위키 페이지 또는 보스에 연결합니다
  • .
  • 구성원이 파티에 너무 많은 피해를 입히면 경고를 보냄

  • Cloudflare Workers를 사용하면 store data inside a database . 함수 호출 사이에 지속되는 정보가 있으면 새롭고 흥미로운 가능성이 열립니다!

    좋은 웹페이지 즐겨찾기