퍼센트 인코딩된 긴 한글 URL(%EC%BA%90...)을 Gemini가 도구 호출 시
잘못 복사해 fetch가 실패('URL 불일치')하고 no_event로 기록되던 문제
(캐리비안 베이 글 누락 원인). 스크래퍼가 URL을 한글로 디코딩해 전달하고
source_url 매칭도 디코딩 기준으로 정규화. 기존 크롤로그 24건 디코딩
마이그레이션 + 캐리비안 베이 재처리 → 7/4 일정 생성 확인.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
축제봇이 대학+일반 행사를 통합 수집하게 되면서 연중 실행이 필요해
활성 월 제한 기능 제거. 스케줄러 게이트/라우트/유틸/DB 컬럼/다이얼로그
월 선택 UI/'대기 중' 상태 표시 모두 정리. 동기화 간격만 유지.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Gemini 프롬프트를 확장해 한 번의 호출로 대학 축제 + 일반 행사를 함께
추출(type 필드로 구분). 일반 행사는 행사명을 제목으로, venue로 카카오맵
검색, subtype 'general'(상세 페이지는 기존 '행사' 배지로 표시), 중복은
날짜+행사명(공백 무시 포함관계)으로 체크. 실제 게시글 2건으로 추출 검증.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
사용자 환경에서 커서가 가리키는 지점과 실제 클릭 좌표가 수 px 어긋나
(maplestory에서도 동일 확인), 세로 8px 핸들을 조준해도 클릭이 핸들 밖
트랙에 떨어져 드래그가 간헐적으로 안 잡히던 문제. 'instant' 모드는
스크롤바 띠(14px) 어디를 눌러도 핸들이 그 위치로 즉시 점프하고 그대로
드래그가 이어져 정밀 조준이 불필요. ClickScrollPlugin은 불필요해져 제거.
헤드리스로 트랙 press→점프→연속 드래그 검증 완료.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
defer는 초기화를 idle 콜백으로 미루고 그 사이를 CSS로 가리는데, 이때
스크롤바가 보이고 호버 색도 바뀌지만 드래그 리스너는 아직 없는 구간이
생김(React StrictMode 재마운트와 레이스 가능). 핸들을 잡아도 간헐적으로
안 끌리던 원인으로 추정. maplestory와 동일하게 동기 초기화로 변경.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
핸들이 7px로 얇고 트랙 클릭(clickScroll)이 기본 꺼져 있어, 핸들을
2~3px 빗나가게 클릭하면 아무 반응이 없어 드래그가 안 되는 것처럼
느껴지던 문제. 스크롤바 14px/핸들 8px로 키우고 ClickScrollPlugin 등록 +
clickScroll 활성화로 트랙 클릭 시에도 스크롤되도록 변경.
헤드리스 브라우저로 핸들 드래그·트랙 클릭 동작 검증 완료.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
min-width를 main 콘텐츠로 옮기면서 헤더만 뷰포트 너비가 돼 메뉴가
줄바꿈되던 문제 수정. 헤더+본문을 하나의 OS 컨테이너(min-w-1440)로 묶어
1440 미만이면 헤더까지 함께 가로 스크롤되고, 헤더는 sticky top-0으로
세로 스크롤 시 고정. 일정 페이지는 가로 스크롤만(세로는 내부 처리).
공개/관리자 레이아웃 동일 적용.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
기존엔 '다음 주 요일'만 가능해 격주 콘텐츠(한화 이단장 등)에 못 썼는데,
weeksAhead(1~4주)를 추가해 N주 뒤 날짜로 예정 일정을 생성. getNextWeekday에
weeksAhead 반영, auto_schedule_config JSON에 필드 추가, 다이얼로그에 생성 주기
드롭다운 추가. DB/라우트 변경 없음.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
knob을 mt-0.5 margin 방식 대신 absolute top-0.5 left-0.5로 위치 지정,
트랙에 relative 추가. 위아래가 잘려 보이던 문제 해결, 4개 토글 모두
X봇 다이얼로그와 동일한 비율로 통일.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
translate-x-5.5(유효하지 않은 Tailwind 클래스)로 예정 일정/고정 멤버
토글의 knob이 움직이지 않고 색만 바뀌던 문제 수정. 모든 토글을
translate-x-5(오른쪽=활성화)로 통일.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
예정 일정 자동 생성 시 봇의 고정 멤버(default_member_ids)를 함께
추가하는 옵션(auto_schedule_config.includeDefaultMembers). 워크돌처럼
멤버가 고정인 채널의 다음 주 예정 일정에 멤버가 자동으로 붙음.
DB/라우트 변경 없이 auto_schedule_config JSON에 플래그 추가 +
관리자 다이얼로그에 토글.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
#root의 min-width(1440)를 스크롤 컨테이너(main) 내부 콘텐츠로 옮기고
main에 OverlayScrollbars 적용. 1440 미만으로 줄여도 세로 스크롤바가
뷰포트 끝에 항상 보이고 가로 스크롤이 생김(maplestory 방식). 헤더 고정
모델 유지, 일정 페이지는 기존 내부 스크롤 유지. 공개/관리자 레이아웃 동일 적용.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
캘린더(최다 호출 공개 엔드포인트) getMonthlySchedules를 getOrSet으로
캐시(TTL 60s). 무효화는 모든 쓰기가 수렴하는 3개 meili 동기화 함수
(addOrUpdateSchedule/syncScheduleById/deleteSchedule)에 redis 전달 시
schedule:monthly:* 무효화. 관리자 라우트·봇 경로에서 redis 전달(즉시
반영), festival/누락 경로는 60s TTL로 자동 치유.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
카드가 onClick(schedule)을 호출하도록 변경(기존 호출부는 인자 무시라
호환), 페이지는 useCallback 안정 핸들러를 전달. 매 렌더 새 인라인
함수로 memo가 깨져 필터/스크롤마다 전체 카드가 리렌더되던 문제 해결.
검색 결과 가상화 카드는 범위에서 제외(이미 최적화됨).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
storedSelectedDate가 없을 때 매 렌더 new Date()가 생성돼 다수
useMemo/useEffect가 재실행되고 날짜 스트립이 반복 scrollIntoView되던
문제를, useMemo로 참조를 안정화(값 의미는 동일).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
업스트림 행 시 봇 동기화/요청 핸들러가 무한 대기하던 문제 방지.
fetchWithTimeout(AbortController, 10s)으로 7개 fetch 호출 일괄 래핑.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
깨진 JSON 값 하나가 getAllBots 전체를 throw시켜 startAll(전체 봇 기동)을
막던 위험 제거. weekly_schedule_config/title_filters/default_member_ids/
auto_schedule_config/text_filters를 safeParse(fallback)로 처리.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
무인증 공개 엔드포인트가 봇 설정(채널/계정/필터)과 에러 내부정보
(errorMessage 등)를 그대로 노출하던 것을 상태 요약 필드만 반환하도록
화이트리스트. getBots() await 누락(잠재 버그)도 함께 수정.
관리자 화면은 인증된 /api/admin/bots 사용(영향 없음).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
POST body 스키마/구조분해에 exclude_managed_channels(default true,
컬럼 기본값과 일치)를 추가. 누락으로 INSERT 시 ReferenceError 크래시.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
TikTok은 OG 이미지를 막지만 oEmbed는 thumbnail_url 제공. 단 서명·만료
URL이라 저장하지 않고, /api/schedules/x-card-thumb/:postId 엔드포인트가
요청 시 oEmbed로 현재 썸네일을 받아 302 리다이렉트(Redis 6h 캐시).
resolveCard는 TikTok 카드 이미지를 이 프록시 경로로 설정.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Nitter가 주는 pbs.twimg.com/card_img 이미지는 시간이 지나면 404로
만료됨. resolveCard에서 카드 이미지가 없거나 해당 만료성 URL이면
원본 URL의 OG 이미지(i.ytimg 등 안정적)로 대체.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 스크래퍼가 Nitter HTML 엔티티(/ & 등)를 디코딩하지 않아
본문/카드 제목에 [JP/EN]처럼 노출되던 문제 수정 (extractCard,
extractTextFromHtml에 decodeEntities 적용)
- resolveCard가 Nitter 카드에 제목만 있고 이미지가 없을 때 OG로 이미지를
보강하도록 변경 (YouTube 카드 이미지 누락 복구)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
축제 봇 추가/수정 다이얼로그에 1~12월 토글 그리드 + 전체 선택/해제
추가. 신규 봇은 전체 월(항상 실행) 기본. 전체 선택은 active_months
null로 저장.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- botMonths 유틸(parse/serialize) 추가, 빈배열·전체선택은 NULL 정규화
- 축제 봇 라우트 조회/생성/수정에 active_months 반영 (수정 시 봇 재시작으로 즉시 적용)
- 봇별 설정이 이미 분리돼 있어 x/youtube에는 미적용 — DB 컬럼/스케줄러 매퍼에서 제외
- 스케줄러 isActiveMonth 게이트는 범용 유지(미설정 봇은 항상 실행)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
봇 매퍼에 activeMonths 파싱 추가. cron 콜백·즉시 실행 시 현재 KST
월이 활성 월에 포함될 때만 동기화 실행(매 실행 시점 재평가). NULL/
빈배열/12개 전체는 항상 실행. date.js에 monthKST() 헬퍼 추가.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
bot_festival/bot_x/bot_youtube에 active_months JSON 컬럼 추가.
NULL=전체 월(항상 실행), 정수 배열이면 해당 월에만 동기화.
대학 축제 봇처럼 시즌에만 도는 봇의 불필요한 API 호출 절약.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
모바일 일정 페이지에 date_precision='month' 일정을 점선 "N월 중"
카드(UndatedScheduleListCard)로 표시. 선택 날짜와 무관하게 해당
달이면 확정 일정 아래 "날짜 미정" 구분선과 함께 배치.
캘린더/날짜 점은 1일에 찍지 않도록 PC·모바일 dot 목록에서 제외.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
date_precision='month' 일정을 점선 "N월 중" 카드(UndatedScheduleCard)로
표시. 선택 날짜와 무관하게 해당 월이면 확정 일정 아래에 배치하고
사이에 "날짜 미정" 구분선 추가. 카운트에도 포함.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
월만 확정된 일정을 위해 schedules에 date_precision ENUM('day','month')
추가. 기본값 'day'로 기존 일정/쿼리에 영향 없음. month인 경우
date는 해당 월 1일로 저장하고 확정 시 수정에서 정확한 날짜 입력.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
스크롤 방향 감지 자동 숨김이 sticky 바의 transform 전환과
충돌해 리스트 상단에서 위로 스크롤 시 떨림 발생.
항상 보이는 단순 sticky 칩 바로 변경.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 멤버를 화면 폭 전체 화보 카드로 (한글명 + 생일/나이 + 인스타)
- 스티키 스택: 스크롤 시 다음 카드가 이전 카드를 덮으며 흐려짐/축소
- 스크롤 멈추면 가장 가까운 카드를 상단에 자석처럼 스냅
- 마지막 카드도 상단까지 올라오도록 동적 하단 여유 공간
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 일정 리스트 위에 카테고리 필터 칩 추가 (해당 달 전체 카테고리)
- 스크롤 방향 감지 자동 숨김 (내리면 숨고 올리면 보임), 상단 여백 일관
- 카테고리 선택 시 일정 목록 + 날짜 점 필터링 (공개 PC와 store 공유)
- 일정 리스트 카드: 그림자 제거, 1.5px 테두리로 플랫하게
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>