Fortuna는 오랫동안 수많은 Discord 서버에서 주사위를 굴리고, 코인을 관리하고, 캠페인이 순조롭게 굴러가도록 도와왔습니다. 하지만 무대 뒤에서는 모든 일을 한꺼번에 처리하는 하나의 거대한 프로그램으로 점점 불어나 있었고, 이음매가 슬슬 드러나기 시작했죠. 그래서 오래 살아남은 모든 프로젝트가 결국 마주하는 그 일을 했습니다. 바닥부터 전부 다시 만든 겁니다.
새로운 Fortuna는 응답이 더 빠르고, 부하 속에서도 더 든든하며, 저희가 개선하기에도 훨씬 수월하고, 여러분의 테이블과 함께 성장할 준비가 되어 있습니다. 그 작업의 대부분은 여러분 눈에는 절대 보이지 않는 곳에서 이뤄졌는데, 사실 그게 핵심입니다. 하지만 그 결과는 여러분이 실제로 사용하는 모든 곳에서 드러납니다. 무엇이 바뀌었고 왜 그게 중요한지, 그 전체 이야기를 들려드릴게요.
원래의 Fortuna는 흔한 방식 위에 지어졌습니다. Discord와 항상 열려 있는 영구 연결, 즉 Discord에서 게이트웨이라고 부르는 것을 붙잡고, 자신이 들어가 있는 모든 서버에서 벌어지는 모든 일을 쉬지 않고 듣는 봇이었죠. 봇이 커지면서 늘어난 부하를 감당하기 위해, 그 연결은 *샤드(shard)*라고 불리는 여러 개의 병렬 사본으로 쪼개졌습니다. 샤드 하나하나가 별개로 돌아가는 프로세스였고, 각각을 지켜보고, 재시작하고, 건강하게 유지해야 했습니다.
이 방식은 작동합니다. 그리고 여러 해 동안 잘 작동했죠. 하지만 분명한 대가가 따릅니다. 항상 연결되어 있는 봇은 아무도 명령어를 입력하지 않을 때조차 끊임없이 메모리를 쓰고 상태를 붙들고 있습니다. 봇이 볼 수 있는 모든 서버, 채널, 멤버가 그만큼 무게를 더했죠. 샤드 하나가 삐끗하면, 한 무더기의 서버가 그 여파를 느낄 수 있었습니다. 게다가 새 기능 하나를 추가할 때마다, 이미 열 가지 일을 동시에 하고 있는 프로그램 사이로 그것을 조심스레 꿰어 넣어야 했습니다.
저희는 더 가벼운 것을 원했습니다. 할 일이 있을 때 일하고, 없을 때는 조용히 있고, 하나씩 따로 고치거나 확장할 수 있는 작은 조각들로 만들어진 것을요.
요즘 Discord 봇에는 명령어를 처리하는 더 나은 방법이 있습니다. 연결을 열어 둔 채 기다리는 대신, 누군가 실제로 슬래시 명령어를 사용할 때만 Discord가 봇을 불러내도록 하는 거죠. Discord가 명령어를 포장해 단 한 번의 안전한 웹 요청으로 보내면, 봇이 응답합니다. 상시 연결도 없고, 놀고 있는 동안의 무게도 없습니다. 아무 일도 일어나지 않을 때 봇은 거의 아무것도 쓰지 않습니다.
이것이 새 설계의 핵심입니다. 저희는 옛 단일 덩어리를 목적이 분명한 두 조각으로 나눴습니다.
식당에 비유해 볼까요. 옛 Fortuna는 주문도 받고, 홀도 관리하고, 주방도 동시에 돌리려 애쓰는 정신없는 요리사 한 명이었습니다. 새 Fortuna는 주문이 들어오는 즉시 불을 켜는 주방(fortuna-http)과, 문 앞에서 들어오는 손님을 살피는 주의 깊은 안내 직원 한 명(fortuna-gateway)을 갖췄습니다. 각자 자기 일을 잘하고, 서로의 발목을 잡지 않습니다.
구조 이야기도 좋지만, 여러분이 서버에서 실제로 체감하게 될 것은 이렇습니다.
더 빠릿한 응답. 명령어 핵심부는 한 가지 일만 하고 놀고 있던 짐을 짊어지지 않기 때문에, 빠르고 일관되게 답합니다. 명령어가 뒤에서 기다려야 할 것이 줄어든 셈이죠.
더 나은 안정성. 두 조각은 서로 독립적입니다. 채팅 굴림 조력자가 재시작이 필요해도, 여러분의 슬래시 명령어는 눈 한 번 깜빡임 없이 계속 작동합니다. 문제가 봇 전체로 번지는 대신 그 자리에 머무릅니다.
압박 속에서도 든든하게. 상태 없는 명령어 핵심부는 서버와 플레이어가 더 몰려도 무게를 쌓아두지 않습니다. 북적이는 밤도 한가한 밤과 훨씬 비슷하게 흘러갑니다.
더 빠른 개선. 깔끔하고 모듈화된 핵심부 덕분에, 주변 전부를 건드리지 않고도 기능을 더하고 고칠 수 있습니다. 새 명령어가 말끔하게 끼워지고, 그만큼 업데이트가 여러분에게 더 빨리 도착합니다.
다시 만든다는 건 한동안 더하고 싶었던 것들을 내놓을 기회이기도 합니다. 새 Fortuna는 알찬 기능 묶음을 들고 옵니다.
/lc와 모더레이터용 /mod_lc로 잔액을 관리하죠. 보상과 등급이 여러분 커뮤니티 안에서만 유효하게 유지됩니다./config 명령어가 서버별 설정을 한곳에 모아줍니다. 그래서 각 커뮤니티가 자신들의 플레이 방식에 맞게 Fortuna를 조율할 수 있습니다./handouts 흐름으로 테이블에 공유하세요. 좋은 가상 테이블이라면 마땅히 그래야 하는 방식으로요./checkin 명령어로 출석을 손쉽게 표시하고 그룹의 진행을 챙길 수 있습니다.이 모든 것이 Fortuna가 늘 잘해온 것들과 나란히 자리합니다. 풍부한 주사위 굴림(슬래시 명령어로도, 채팅에 곧장 굴림을 입력하는 방식으로도), 일일 보상, 등급, 상점, 그 밖의 모든 것까지요.
가장 큰 편의성 개선 중 하나가 새 핵심부에 곧장 녹아 있습니다. 바로 완전한 현지화입니다. Fortuna는 이제 Discord의 모든 언어, 즉 서른 개가 넘는 로케일을 구사하며, 각 사용자의 Discord 설정에 따라 알맞은 언어를 자동으로 골라줍니다. 명령어 이름, 설명, 응답이 플레이어 자신의 언어로 도착하고, 합리적인 대체 순서가 마련되어 있어 누구도 빠진 번역을 멀뚱히 바라보는 일이 없습니다. 여러분의 테이블이 포르투갈어로 하든, 영어, 스페인어, 프랑스어, 일본어, 혹은 그 사이 어떤 언어로 하든, Fortuna는 각자가 있는 자리에서 맞이합니다.
기술적인 세부 사항을 좋아하신다면, 저희가 자랑스러워하는 몇 가지 선택을 소개합니다. 관심 없으시면 이 단락은 마음 편히 건너뛰셔도 됩니다.
Discord에서 오는 모든 명령어 요청은 Fortuna가 행동에 옮기기 전에 Ed25519 서명으로 암호학적으로 검증됩니다. 그래서 봇은 변조되지 않은 진짜 요청에만 응답합니다. 명령어 핵심부는 가벼운 Hono 프레임워크와 함께 Bun 위에서 돌아가고, 채팅 굴림 조력자는 정적으로 컴파일된 작은 Go 프로그램으로 아주 작은 흔적만 남긴 채 대기합니다. 둘 다 깔끔한 컨테이너 이미지로 배포되어, 배포가 빠르고 반복 가능합니다. 또한 제대로 된 오류 모니터링을 연결해 두어서, 정말로 무언가 잘못되면 저희가 그것을 알아채고 빠르게 고칠 수 있습니다. 물론 민감한 정보는 절대 기록하지 않도록 신경 쓰면서요.
공유 주사위 엔진은 저희의 다른 도구들을 떠받치는, 신뢰받는 바로 그 계산기입니다. 그래서 Discord에서 굴리든 생태계의 다른 어디에서 굴리든, 한 번의 굴림은 정확히 같은 의미를 갖습니다.
이 중 어느 것도 Fortuna의 정신을 바꾸지는 않습니다. 여전히 여러분의 주사위를 굴려주고 캠페인을 정돈해 주는 다정한 봇이죠. 바뀐 것은 그 밑을 받치는 토대입니다. 더 가볍고, 더 든든하고, 여러분을 방해하지 않으면서 계속 더 좋게 만들 수 있도록 지어졌습니다.
Fortuna를 여러분의 서버에 추가하고, 새 명령어들을 써보고, 다음에 무엇을 보고 싶은지 들려주세요. 주사위는 여러분이 준비되면 언제든 굴러갈 준비가 되어 있습니다.