9월 15일에 벙개벙개로 베일스트라이크 초대를 받는 기능을 붙였습니다. 채팅에서 링크를 보내는 쪽과, 다른 앱에서 넘어온 초대를 받는 쪽을 같이 다룹니다.
작업을 시작할 때는 카드에 게임 이름 한 줄 더 넣는 일인 줄 알았습니다. 실제로 손이 많이 간 곳은 다른 데였습니다. 어떤 게임의 방 코드인지를 끝까지 들고 가는 것이었습니다.
초대는 주소 문자열에서 시작합니다
게임에서 모임 앱으로 넘어오는 링크에는 게임 경로와 방 코드, 제목 같은 값이 실려 옵니다. 앱은 그걸 읽어서 "어떤 판에 초대받았는지"를 보여 줍니다.
여기서 잊기 쉬운 점이 하나 있습니다. 이건 바깥에서 들어오는 문자열입니다. 정상적인 게임이 만들어 보냈을 거라고 가정하면 안 됩니다. 손으로 고쳐서 보낼 수도 있고, 옛 버전이 만든 형식일 수도 있습니다.
그래서 초대 결과에 게임 종류를 나타내는 값을 따로 넣고, 경로별 검증 규칙을 표로 갈라 두었습니다. 기존 물방울 대전 초대와 새 베일스트라이크 초대를 같은 코드 형식으로 처리하지 않습니다.
숫자 여섯 자리와 소문자 여섯 글자는 다릅니다
물방울 대전은 숫자 여섯 자리, 베일스트라이크는 소문자 여섯 글자를 씁니다.
처음에는 "둘 다 여섯 글자니까 길이만 보면 되겠네" 하고 넘어갈 뻔했습니다. 그렇게 묶으면 베일스트라이크 코드가 물방울 대전 초대로 올라오고, 사용자는 멀쩡해 보이는 카드를 눌렀다가 없는 방으로 들어갑니다. 화면에는 아무 이상이 없습니다.
| 단계 | 확인할 내용 |
|---|---|
| URL 파싱 | 주소로 해석 가능한 문자열인가 |
| 경로 선택 | 지원하는 게임의 초대 경로인가 |
| 코드 검증 | 해당 게임의 길이와 문자 규칙에 맞는가 |
| 카드 구성 | 검증한 게임 종류가 카드와 이동 주소에 유지되는가 |
마지막 줄이 핵심입니다. 앞에서 제대로 갈라 놓고도 카드를 만들 때 게임 종류를 흘리면 아무 소용이 없습니다.
맞지 않는 경로나 코드면 초대 객체를 아예 만들지 않습니다. 반쯤 만들어 두고 나중에 거르는 쪽보다 확실합니다. 제목 길이도 자릅니다 — 링크에 적힌 제목을 시스템 안내처럼 길게 띄우면, 그 자리가 남의 글을 내 앱 말투로 보여 주는 자리가 됩니다.
보내기와 받기를 따로 검사해야 합니다
채팅에서 초대 카드가 만들어진다고 해서 앱이 닫혀 있을 때 받은 링크도 처리된다는 보장은 없습니다. 반대로 수신이 되더라도 그룹 채팅과 1:1 채팅에서 카드가 다르게 보일 수 있습니다.
그래서 링크 만들기, 파싱, 카드 표시, 게임 입장을 네 토막으로 나눠 봅니다. 한 덩어리로 보면 "초대가 안 돼요"에서 더 못 내려갑니다.
이번 기록에서 확인한 것은 링크 파서와 채팅 쪽 변경까지입니다. 휴대폰 두 대로 초대부터 게임 입장까지 실제로 해 보지는 않았습니다. 그리고 파서의 형식 검사로는 그 방이 게임 서버에 실제로 있는지까지 알 수 없습니다. 형식이 맞아도 없는 방일 수 있습니다.
커밋 이름만 보고 출시 버전을 쓰지 않습니다
같은 날 기록에는 릴리스 자동화를 넣은 커밋과 그걸 되돌린 커밋이 같이 있습니다. 그래서 커밋 제목에 버전이 보인다고 그 버전이 나갔다고 적지 않았습니다.
사용자에게 실제로 간 버전은 Play 배포 상태로 따로 확인해야 합니다. 저장소 기록은 무엇을 시도했는지를 말해 주지, 무엇이 나갔는지를 말해 주지 않습니다.
확인 근거는 9c90056, eafe3eb 의 초대 기능 변경과 0e859e9 의 되돌림입니다.
링크를 받는 기능을 만드신다면 정상 주소만 넣어 보지 마십시오. 게임 종류가 섞인 코드, 지원하지 않는 경로, 지나치게 긴 제목을 일부러 넣어 보는 쪽에서 더 많이 나옵니다.
이어서 읽을 것
앱 기능 전반은 벙개벙개 소개에 있습니다. 같은 앱에서 봇이 오류도 없이 조용하던 이야기는 봇이 조용했습니다인데, 그쪽도 바깥에서 온 응답을 믿은 게 원인이었습니다. 저장된 값을 외부 입력으로 다루는 쪽은 저장 파일을 외부 입력으로 취급합니다에 적었습니다.