Daybreakin Things

Posted
Filed under 컴퓨터
업그레이드라고 해서, 겉으로 뭔가 달라져 보이는 건 아니지만, 봇의 내부 구조를 완전히 새로 만들었다. 일단 여러 개의 채널에 동시에 접속하여 각기 따로 메시지를 처리할 수 있도록 하기 위해, 다음과 같은 클래스들을 만들었다.

Daybreakin IRC Bot 구조


먼저 IRC Server에서 메시지를 받으면 그걸 clsIRCMessage에게 주어서 parsing한다. 그러면 그 결과가 그 클래스의 속성들로 저장되고, 이것을 1차로 clsIRC(전체 접속 및 channel과 관련없는 모든 메시지 처리)로 넘겨준다. clsIRC는 메시지를 분석해서 자기가 처리해야 하는 메시지일 경우 메시지를 처리한 다음 먹어버린다. (뒤로 전달하지 않는다) 그렇지 않은 경우는 clsIRCChannels(현재 접속된 채널 관리)로 메시지가 넘어가고, 거기서 clsIRCMessage.Channel 속성에 맞는 채널 object로 메시지를 보내면 거기서 처리하게 된다. 이때 이것이 특수한 명령어 인식 문자(backquote)를 가지고 있으면 clsIRCCommand로 넘기고 이 놈이 최종 처리를 하게 된다.

이전에는 모든 걸 소켓의 이벤트 프로시저에서 처리했는데, 일단 이렇게 만들고 나니 기능의 추가, 삭제가 매우 용이해졌고, ActiveX DLL을 이용한 플러그인 방식도 도입할까 생각중이다.

만들면서 가장 고려해야 할 부분은 IRC Server가 도배 방지를 위해 빠르게 많은 양의 메시지를 보내면 Excess Flood로 접속을 끊어버린다는 점이다. (IRC에서는 사람들이 일부러 봇에게 연속적으로 많은 출력을 하는 명령을 주어 이 현상을 일으키는데, 이걸 두고 "봇을 죽인다"라고 한다) 그런 걸 방지하기 위해서 그동안 보낸 메시지의 양을 기록하고 이걸 특정 시간 비율에 따라 감소시켜 일정값 이하일때만 메시지를 전송하도록 pending하는 기능이 필요하다.

아무튼, 옵테러 방지 등 일반적으로 irc 이용자들이 원하고 있는 몇몇 추가 기능들을 넣으면 꽤 쓸만한 프로그램이 될 것 같다.