Skip to content

Discord 포럼 신청 자동화 구현 및 파싱 버그 수정 #29

@SamTheKorean

Description

@SamTheKorean

개요

Discord 포럼 채널에 올라오는 가입 신청 포스트를 20분마다 자동으로 감지하여 검증하고, 결과를 댓글로 알려주는 자동화 기능 구현. 구현 과정에서 여러 파싱 관련 버그를 트러블슈팅하며 수정.

작업 내용

자동화 구현

  • Cloudflare Workers scheduled 이벤트로 20분마다 cron 실행
  • getForumPosts: 포럼 채널의 활성 스레드 목록 조회 후 미처리 포스트 필터링
    • 이미 reaction이 달린 포스트는 스킵 (중복 처리 방지)
    • 봇 메시지 제외
  • 파싱 성공 시 processVerify 호출 → 성공/실패 결과를 reply로 전송 + reaction 추가 (✅/❌)

트러블슈팅 과정

문제 1: 메시지 content가 항상 빈 값

  • 원인: Discord 포럼 포스트에서 messages/{thread.id} API 호출 시 starter message의 content가 빈 문자열로 반환됨
  • 원인 분석: 사용자가 포스트 본문(body)이 아닌 제목(title) 필드에 내용을 입력하고 있었음
  • 해결: thread.name(제목)을 fallback으로 추가하여 본문과 제목 모두에서 파싱 시도

문제 2: 제목 필드에서 줄바꿈 제거로 인한 파싱 실패

  • 원인: Discord 포럼 포스트 제목은 단일 라인 필드로, 줄바꿈 입력 시 모두 제거되어 "github: usernameteam: teamrole: role" 형태로 연결됨
  • 기존 파서: \n으로 split 후 key-value 추출 → 한 줄로 합쳐지면 파싱 불가
  • 해결: 정규식 기반 파서로 교체
    const githubMatch = normalized.match(/\bgithub\s*:\s*([^\s:]+)/i);
    const teamMatch   = normalized.match(/\bteam\s*:\s*([^\s:]+)/i);
    const roleMatch   = normalized.match(/\brole\s*:\s*([^\s:]+)/i);
    • 공백 구분 단일 라인 포맷 지원: github: username team: teamname role: rolename
    • 멀티라인 본문 포맷도 동일하게 처리 가능
    • 전각 콜론(:) 정규화 추가 (한국어 입력기 대응)

문제 3: messages API 엔드포인트 변경

  • 원인: messages/{thread.id} 방식이 실제 사용자 메시지를 가져오지 못하는 케이스 발생
  • 해결: messages?limit=10 으로 변경 후 oldest non-bot 메시지를 find하는 방식으로 개선

최종 사용 포맷

포스트 **제목(title)**에 한 줄로 입력:

github: username team: teamname role: rolename

관련 PR

Metadata

Metadata

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions