개요
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
개요
Discord 포럼 채널에 올라오는 가입 신청 포스트를 20분마다 자동으로 감지하여 검증하고, 결과를 댓글로 알려주는 자동화 기능 구현. 구현 과정에서 여러 파싱 관련 버그를 트러블슈팅하며 수정.
작업 내용
자동화 구현
scheduled이벤트로 20분마다 cron 실행getForumPosts: 포럼 채널의 활성 스레드 목록 조회 후 미처리 포스트 필터링processVerify호출 → 성공/실패 결과를 reply로 전송 + reaction 추가 (✅/❌)트러블슈팅 과정
문제 1: 메시지 content가 항상 빈 값
messages/{thread.id}API 호출 시 starter message의content가 빈 문자열로 반환됨thread.name(제목)을 fallback으로 추가하여 본문과 제목 모두에서 파싱 시도문제 2: 제목 필드에서 줄바꿈 제거로 인한 파싱 실패
"github: usernameteam: teamrole: role"형태로 연결됨\n으로 split 후 key-value 추출 → 한 줄로 합쳐지면 파싱 불가github: username team: teamname role: rolename문제 3: messages API 엔드포인트 변경
messages/{thread.id}방식이 실제 사용자 메시지를 가져오지 못하는 케이스 발생messages?limit=10으로 변경 후 oldest non-bot 메시지를 find하는 방식으로 개선최종 사용 포맷
포스트 **제목(title)**에 한 줄로 입력:
관련 PR