아리아 날다

[Discord/Python] Discord 봇으로 스레드 생성하기 본문

카테고리 없음

[Discord/Python] Discord 봇으로 스레드 생성하기

Aria Park 2023. 8. 12. 02:27

함께 공부하는 팀원과 매일 To-Do List를 공유하기로 해놓고 까먹거나 슬쩍 넘긴 적이 몇 번 있다. 각자 할 일을 입력하는 시간도 제각각이면 아무래도 불필요한 알림을 많이 받기 때문에 여러 불편한 점을 해소하고자 Discord Bot을 만들었다. 

내가 만들고 싶은 봇은 매일 오전 9시 투두리스트 채널에 스레드를 생성하는 봇이다.

일단 봇을 생성하는 과정은  "discord 봇 생성" 이 블로그를 참고했다. 어렵지 않으니 순서대로 따라하면 금방 할 수 있다.

 

봇을 생성하고 발급받은 토큰은 스레드를 생성할 때 꼭 필요하다.

봇 관리자 사이트 에서 봇 이미지나 이름 등 여러 설정을 할 수 있고, 토큰을 확인할 수 있다. 

 

토큰을 발급 받았다면 파이썬 환경에서 discord 라이브러리를 다운 받고 스레드를 생성하면 된다.

pip install discord

나는 중간에 Privileged Gateway Intents설정이 제대로 되지 않아서 에러가 몇 번 났었는데 이와 관련된 에러는 위에서 언급한 봇 관리자 사이트에서 권한 설정을 통해 해결할 수 있다.

 

스레드가 정해진 시간에 제대로 생성되는지 확인하기 위해서 target time을 2분 뒤로 설정해서 실행시켰는데 해당 채널에 알림만 뜨고 아무런 메시지가 뜨지 않았다. 알림이 뜬다는 건 제대로 동작한다는 뜻인데 스레드는 왜 보이지 않지???

알고보니 스레드 생성은 제대로 되고 있었고, 메시지 보내기는 스레드 생성과 별개였다!

 

열심히 스레드 생성한 알림봇, 알아주지 못해 미안하다

내가 원하는 건 정해진 채널매일 정해진 시간에 메시지로 스레드 알림이 오는거다.

 

채널에 메시지가 안오고 저렇게 스레드만 생성되면 확인하기가 불편하기 때문이다.

        thread_link = thread.jump_url  # 생성된 쓰레드의 링크

        await channel.send(f"Good Morning!  {thread_link}")
        await thread.send(f"기분 좋은 {now.strftime('%m')} 월 {now.strftime('%d')}입니다. \n오늘 할 일을 입력해주세요 :)")

 

위와 같이 생성된 스레드 링크를 메시지에 추가해서 보낼 수 있도록 수정했다.
그 결과,

투두리스트 채널에 올라온 Good Morning 메시지

위에 블럭 처리되어있는 스레드를 클릭해서 들어가면 해당 스레드를 확인할 수 있다.

이제 스레드에 댓글을 달아서 팀원과 투두리스트를 작성하면 된다.

 

전체 소스코드

import discord
import asyncio
from discord.ext import commands, tasks
from datetime import datetime, time, timedelta

intents = discord.Intents.default()
bot = commands.Bot(command_prefix='!', intents=intents)

token = "토큰 입력"
channel_id = 채널ID  # 스레드를 생성할 채널 ID

@bot.event
async def on_ready():
    print("봇이 온라인으로 전환되었습니다.")
    create_thread.start()  # 봇이 준비되었을 때 작업 시작

@tasks.loop(hours=24)  # 매일 24시간마다 작업 실행
async def create_thread():
    now = datetime.now()
    target_time = time(9, 0, 0)  # 오전 9시

    # 매일 오전 9시에 스레드 생성
    if now.time() >= target_time:
        next_target = datetime.combine(now.date() + timedelta(days=1), target_time)
    else:
        next_target = datetime.combine(now.date(), target_time)

    time_until_next = (next_target - now).total_seconds()
    await asyncio.sleep(time_until_next)  # 다음 실행 시간까지 대기

    channel = bot.get_channel(channel_id)
    if channel:
        thread_name = now.strftime('%m/%d') + " To-Do List"
        thread = await channel.create_thread(
            name=thread_name,
            auto_archive_duration=1440  # 24시간
        )

        thread_link = thread.jump_url  # 생성된 쓰레드의 링크

        await channel.send(f"Good Morning!  {thread_link}")
        await thread.send(f"기분 좋은 {now.strftime('%m')} 월 {now.strftime('%d')}입니다. \n오늘 할 일을 입력해주세요 :)")

bot.run(token)

 

Comments