본문 바로가기
Algorithm Trading/ComDon 프로그램 개발이야기

10. 디스코드 알림

by 컴돈AI 2024. 2. 4.

목차

    디스코드 알림 메시지 보내기

    • https://github.com/kyb3r/dhooks 를 사용하였습니다.
    • dhooks에는 비동기 코드도 구현되어져 있기 때문에 메시지를 보내는 동안의 프로그램이 멈추는 것을 방지해줄 수 있습니다.

    디스코드 웹후크 URL 발급 과정

    • dhooks를 사용하기 위해서는 디스코드 채널의 webhook url이 필요합니다.
    • webhook url 발급 과정
      • 서버추가하기를 통해 알림 채널 생성
      • 생성된 채팅 채널의 설정(채널 편집)
      • 연동 클릭 후 웹후크 만들기 클릭
      • 생성된 웹후크에서 웹후크 URL 복사를 통해 해당 URL을 가져올 수 있습니다.

    동기 VS 비동기

    • 동기 방식으로 코드를 작성할 경우, 메시지를 보내는 시간동안 잠깐동안 프로그램이 중지할 수 있습니다. 이 메시지를 보내는 작업 또한 IO작업이므로 비동기 방식으로 코드를 작성할 경우 프로그램이 최대한 멈추지 않고 작동할 수 있습니다.
    • 자동매매의 경우 데이터를 실시간으로 계속 받아오는 것이 중요하므로 최대한 프로그램을 멈추지 않게 하는 것이 중요합니다. 따라서 비동기 방식으로 코드를 작성해야합니다.
    • 아래 두 코드를 비교해보면 아주 약간이지만, 두 채널에서 메시지가 도착하는 시간에서 차이가 존재하는 것을 확인할 수 있습니다.

    동기 방식

    • 예시 코드
      • import dhooks
        
        price_url = "웹후크URL1"
        buy_sell_url = "웹후크URL2"
        
        price_hook = dhooks.Webhook(price_url)
        buy_sell_hook = dhooks.Webhook(buy_sell_url)
        
        
        def price_send_message(message):
            price_hook.send(message)
        
        
        def buy_sell_message(message):
            buy_sell_hook.send(message)
        
        
        def main():
            price_send_message("hi")
            buy_sell_message("hi")
        
        
        main()

    비동기 코드

    • 예시 코드
      • import dhooks
        import asyncio
        
        price_url = "웹후크URL1"
        buy_sell_url = "웹후크URL2"
        
        
        async def price_send_message(message):
            async with dhooks.Webhook.Async(price_url) as hook:
                await hook.send(message)
        
        
        async def buy_sell_message(message):
            async with dhooks.Webhook.Async(buy_sell_url) as hook:
                await hook.send(message)
        
        
        async def main():
            await asyncio.gather(
                price_send_message("hi"),
                buy_sell_message("hi"),
            )
        
        
        asyncio.run(main())