컴피 맵이 자기네들 웹서버랑 디스코드 api같은거랑 의사소통하는 구조가

텍스트 기반 프로그램의 stdin과 stdout만 사용해서 다 구현되네


- 게임서버에서 외부서버로 뭔가 전달하는 건

"[태그]" 형태의 양식을 포함한 문자열을 log()함수를 써서 stdout에 출력하면 팩토리오를 돌리던 명령행 처리프로그램(cmd, python같은거)이 그 stdout을 읽고 다른 제어 프로그램으로 전달해주게 되어있는 것 같고,


- 외부서버에서 게임서버를 제어하는건

팩토리오를 돌리던 명령행 처리프로그램(cmd, python같은거)이 직접 stdin을 입력해서 서버콘솔에서 바로 시나리오 파일에 등록된 함수를 호출하는 커맨드를 입력하는건데,


예를 들면,

/silent-command local Server = require 'utils.server'; Server.query_online_players()

이렇게 서버콘솔에다가 바로 입력하면,

"[태그]"양식으로 된 문자열을 stdout으로 출력해서 온라인 플레이어 목록을 다른 프로그램으로 넘겨주게 되어있다.

일단 컴피 시나리오에서 저 커맨드를 서버콘솔에 입력하면

[QUERY-PLAYERS]["player1", "griefer", "villain"]

뭐 이런식으로 stdout에 나타나는 거임.


서버콘솔은 그냥 아무 글자나 입력하면 [CHAT] <server>: 안뇽?아무 글자다. 뭐 이런식으로 나오게 되는 그 콘솔.


이 기능은 \utils\server.lua랑 \utils\session_data.lua 같은 곳에 작성되어있어서 살펴볼 수 있다.



디스코드에서 입력한 챗이 게임에서도 나타나는건 디스코드가 팩토리오 서버프로그램에 직접

/silent-command game.print("[DISCORD]솰라솰라") 머 이런식으로 커맨드를 넣어주기 때문이라고 추측함.



그래서 이 이야기를 하는 이유는.


개인이 컴피 맵 파일을 헤드리스로 호스팅 할 경우 이딴 기능이 하등 쓸모없을게 뻔하므로

쓸데없어보이는 오류 출력같은건 전부 주석처리하라고...



그리고 \antigrief.lua가 테러 의심 로그를 죄다 남겨줘서 일부기능은 테러 후처리에 상당히 좋지만 사전방지기능이 상당히 불편한데,

플탐이 얼마 이하이면 뭘 못하게 하고 뭘 못하게 하고 이런 구문이 존나 많이 있다.

플탐 기준을 600틱 뭐 이런 수준으로 확내리거나 아예 플탐 체크해서 방지하는 구문을 통째로 주석처리하면

/trust 명령을 굳이 일일히 안써줘도 수류탄 던지고 청사진 깔고 핵날리고 등등 하는게 가능해질테니 이 파일도 꼭 손봐야한다.



그리고 모니터링하는건

stdout중에서 "[" "]" 같은 문자를 포함한 라인만 표시하도록 정규식 같은걸 써서 필터링 하면 c언어 오류같은건 안뜨고 꼭 필요한 정보만 보여주므로 보기 좋다.



최근인가? 팩토리오에 RCON이라는 외부 의사소통 인터페이스가 도입되었다는데, 그게 무슨 기술인지는 모르겠지만 일단 컴피 맵에선 안쓰이는것 같다.

아는 사람있으면 RCON리뷰 한번 부탁해본다.