컴피 맵이 자기네들 웹서버랑 디스코드 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리뷰 한번 부탁해본다.
몬말인지 모르겠지만 일단 개추줌
꽤나 흥미롭네
커맨드라인에서 팩토리오를 실행할 때 stdin이랑 stdout을 리다이렉션한다고 이해하면 맞는거겠지?