9월 15일에 벙개벙개로 베일스트라이크 초대를 받는 기능을 붙였습니다. 채팅에서 링크를 보내는 쪽과, 다른 앱에서 넘어온 초대를 받는 쪽을 같이 다룹니다.

작업을 시작할 때는 카드에 게임 이름 한 줄 더 넣는 일인 줄 알았습니다. 실제로 손이 많이 간 곳은 다른 데였습니다. 어떤 게임의 방 코드인지를 끝까지 들고 가는 것이었습니다.

초대는 주소 문자열에서 시작합니다

게임에서 모임 앱으로 넘어오는 링크에는 게임 경로와 방 코드, 제목 같은 값이 실려 옵니다. 앱은 그걸 읽어서 "어떤 판에 초대받았는지"를 보여 줍니다.

여기서 잊기 쉬운 점이 하나 있습니다. 이건 바깥에서 들어오는 문자열입니다. 정상적인 게임이 만들어 보냈을 거라고 가정하면 안 됩니다. 손으로 고쳐서 보낼 수도 있고, 옛 버전이 만든 형식일 수도 있습니다.

그래서 초대 결과에 게임 종류를 나타내는 값을 따로 넣고, 경로별 검증 규칙을 표로 갈라 두었습니다. 기존 물방울 대전 초대와 새 베일스트라이크 초대를 같은 코드 형식으로 처리하지 않습니다.

숫자 여섯 자리와 소문자 여섯 글자는 다릅니다

물방울 대전은 숫자 여섯 자리, 베일스트라이크는 소문자 여섯 글자를 씁니다.

처음에는 "둘 다 여섯 글자니까 길이만 보면 되겠네" 하고 넘어갈 뻔했습니다. 그렇게 묶으면 베일스트라이크 코드가 물방울 대전 초대로 올라오고, 사용자는 멀쩡해 보이는 카드를 눌렀다가 없는 방으로 들어갑니다. 화면에는 아무 이상이 없습니다.

단계확인할 내용
URL 파싱주소로 해석 가능한 문자열인가
경로 선택지원하는 게임의 초대 경로인가
코드 검증해당 게임의 길이와 문자 규칙에 맞는가
카드 구성검증한 게임 종류가 카드와 이동 주소에 유지되는가

마지막 줄이 핵심입니다. 앞에서 제대로 갈라 놓고도 카드를 만들 때 게임 종류를 흘리면 아무 소용이 없습니다.

맞지 않는 경로나 코드면 초대 객체를 아예 만들지 않습니다. 반쯤 만들어 두고 나중에 거르는 쪽보다 확실합니다. 제목 길이도 자릅니다 — 링크에 적힌 제목을 시스템 안내처럼 길게 띄우면, 그 자리가 남의 글을 내 앱 말투로 보여 주는 자리가 됩니다.

보내기와 받기를 따로 검사해야 합니다

채팅에서 초대 카드가 만들어진다고 해서 앱이 닫혀 있을 때 받은 링크도 처리된다는 보장은 없습니다. 반대로 수신이 되더라도 그룹 채팅과 1:1 채팅에서 카드가 다르게 보일 수 있습니다.

그래서 링크 만들기, 파싱, 카드 표시, 게임 입장을 네 토막으로 나눠 봅니다. 한 덩어리로 보면 "초대가 안 돼요"에서 더 못 내려갑니다.

이번 기록에서 확인한 것은 링크 파서와 채팅 쪽 변경까지입니다. 휴대폰 두 대로 초대부터 게임 입장까지 실제로 해 보지는 않았습니다. 그리고 파서의 형식 검사로는 그 방이 게임 서버에 실제로 있는지까지 알 수 없습니다. 형식이 맞아도 없는 방일 수 있습니다.

커밋 이름만 보고 출시 버전을 쓰지 않습니다

같은 날 기록에는 릴리스 자동화를 넣은 커밋과 그걸 되돌린 커밋이 같이 있습니다. 그래서 커밋 제목에 버전이 보인다고 그 버전이 나갔다고 적지 않았습니다.

사용자에게 실제로 간 버전은 Play 배포 상태로 따로 확인해야 합니다. 저장소 기록은 무엇을 시도했는지를 말해 주지, 무엇이 나갔는지를 말해 주지 않습니다.

확인 근거는 9c90056, eafe3eb 의 초대 기능 변경과 0e859e9 의 되돌림입니다.

링크를 받는 기능을 만드신다면 정상 주소만 넣어 보지 마십시오. 게임 종류가 섞인 코드, 지원하지 않는 경로, 지나치게 긴 제목을 일부러 넣어 보는 쪽에서 더 많이 나옵니다.

이어서 읽을 것

앱 기능 전반은 벙개벙개 소개에 있습니다. 같은 앱에서 봇이 오류도 없이 조용하던 이야기는 봇이 조용했습니다인데, 그쪽도 바깥에서 온 응답을 믿은 게 원인이었습니다. 저장된 값을 외부 입력으로 다루는 쪽은 저장 파일을 외부 입력으로 취급합니다에 적었습니다.