← 목록

취준생 때 만든 팰월드 디스코드 봇 개량기

#python#discord#palworld#docker

팰월드 서버를 다시 파면서 옛날 코드를 꺼냈다. 취준생 때 만든 디스코드 봇인데 디스코드에서 !!열기, !!닫기, !!상태 같은 명령으로 팰월드 서버를 원격 조종하는 물건이다. 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 한 방이 고맙긴 함

← 목록으로
오늘 0·전체 0