취준생 때 만든 팰월드 디스코드 봇 개량기
팰월드 서버를 다시 파면서 옛날 코드를 꺼냈다. 취준생 때 만들었던 디스코드 봇인데, 디스코드에서 !!열기, !!닫기, !!상태 같은 명령으로 팰월드 서버를 원격 조종하는 물건이다. AI 없이 discord.py 문서 뒤져가며 만들었던 거라 고생한 기억이 생생함.
2년 전의 나는 이렇게 짰다
당시엔 팰월드 서버에 외부 제어 수단이라는 게 없었다. 그래서 전부 몸으로 때웠다.
- 서버 실행: screen 세션을 파고
screen -X stuff로 실행 명령을 밀어넣는다 - 서버 상태:
ps -ax | grep으로 프로세스를 찾아서 PID를 텍스트 파일에 적어두고, 그걸 읽어서 살았는지 판단 - 서버 종료: 그 PID한테 Ctrl+C를 밀어넣고 죽을 때까지 폴링
- 접속자가 몇 명인지 같은 건 알 방법 자체가 없었음
지금 보면 눈물나는 구조지만 그때는 이게 최선이었다. 그리고 어쨌든 굴러갔다.
그동안 세상이 좋아졌다
다시 보니 두 가지가 바뀌어 있었다. 팰월드에 공식 REST API가 생겼고, 내 서버는 도커 컨테이너로 돌아간다.
그래서 제어 계층을 통째로 갈았다. screen과 PID 파일이 하던 일을 클래스 하나로 모았는데
- 서버 켜기/끄기/재시작은
docker start/stop/restart. 프로세스 추적이니 종료 폴링이니 할 게 없다 - 상태 조회는 REST API.
/v1/api/metrics한 방이면 서버 FPS, 접속자 수, 업타임이 다 나온다. 2년 전엔 존재 여부도 알 수 없던 정보들이 그냥 JSON으로 옴 - 인게임 공지(
/v1/api/announce), 월드 저장(/v1/api/save)도 API로
봇 명령도 그에 맞춰 늘었다. !!상태는 게임 버전, FPS, 접속자 명단까지 보여주고, !!접속자, !!저장, !!공지가 새로 생겼다. !!닫기는 접속자가 있으면 거부하고, !!재시작은 인게임에 1분 예고 공지를 쏘고 저장부터 하고 내려간다. 2년 전 봇은 누가 접속해 있든 그냥 껐다... 미안했다 친구들아.
내친김에 60초마다 서버를 감시하는 워처도 넣었다. 서버가 죽거나 살아나면, 누가 접속하거나 나가면 디스코드 채널에 알림이 온다.
뺀 기능이 하나 있다
옛날 봇에는 /종료, /재부팅이라는 슬래시 명령이 있었다. 서버 컴퓨터 자체를 끄고 재부팅하는 기능이다. 그때는 팰월드 전용 컴퓨터였으니 게임 끝나면 디스코드에서 컴퓨터까지 끄는 게 편했다.
지금은 사정이 다르다. 이 서버에는 마크 두 대에 모니터링에 블로그까지 같이 돌아간다. 디스코드 봇 토큰이 털리면 집 서버 전체가 꺼질 수 있는 구조인 거다. 이건 기능이 아니라 리스크라서 뺐다. 편의는 컨테이너 재시작까지만.
자잘한 것들
- 엠베드에 쓰던 썸네일 이미지가 전부 디스코드 CDN 링크였는데, 죄다 만료돼서 깨져 있었다. CDN 링크에 유효기간이 생겼기 때문. 로컬 파일 첨부로 바꿨다
- 봇 자체도 도커로 말았다. 도커 소켓을 마운트해서 컨테이너 제어 권한을 주고, 팰월드와 같은 도커 네트워크에 붙여서 API를 컨테이너 이름으로 부른다. 부팅하면 봇도 알아서 올라옴
- requirements가 discord.py 2.3 고정이었는데 최신으로 올렸다. 다행히 고칠 게 거의 없었다
사실은...
!!으라고 치면 "으거려으", "으으으" 같은 걸 랜덤으로 뱉는 명령이 있다. 이번 개량에서 유일하게 한 글자도 안 고친 기능이다. 제일 중요한 기능이라.
마치며
옛날 코드 뜯어보는 건 부끄러운데, ps로 PID 긁던 시절이 있었으니 API 한 방의 고마움도 아는 것이다.