블로그 이미지
JEEN

서울에 사는 꽃청년의 IT찌질모험기

Rss feed Tistory
IT/Perl 2009.11.26 18:31

[ Perl ] IRC + AnyEvent + Moose -> Morris

2008/05/20 - [IT/Perl] - [ Perl ] IRC BOT을 만들어봅시다 :-) #1
2008/05/21 - [IT/Perl] - [ Perl ] IRC BOT을 만들어봅시다 :-) #2
2008/05/23 - [IT/Perl] - [ Perl ] IRC BOT을 만들어봅시다 :-) #3
2008/05/27 - [IT/Perl] - [ Perl ] IRC BOT을 만들어봅시다 :-) #4
2008/05/27 - [IT/Perl] - [ Perl ] IRC BOT을 만들어봅시다 :-) #5
2008/05/29 - [IT/Perl] - [ Perl ] IRC BOT을 만들어봅시다 :-) #6
2008/06/18 - [IT/Perl] - [ Perl ] IRC BOT을 만들어봅시다 :-) #번외편


그러고보니 1년이 지났군요. PoCo::IRC 로 IRC 봇 설레발을 작년에 7개넘게 포스팅한 걸로 압니다. 다시 뒤져보면 결국은 문서에 있는 코드 그대로 붙여쓰기 한 것 밖에 지나지 않는 군요.

  올해는 이벤트처리, 비동기처리 등에 관한 이슈가 빈번하게 들려오고 있습니다. AnyEvent 붐이라고 할 정도로 많은 새로운 모듈이 AnyEvent 의 네임스페이스를 차지하면서 올라가고 있습니다. 저도 공부의 필요성을 느끼고 문서를 읽어보고자 했으나, 대략 멍~ 한 상태는 어찌할 수 없었습니다.
  결론은 직접 써보고, 만들어보는 수 밖에 없었습니다.
 
  Perl 을 나름 제대로 쓰고자 했던 출발점이 IRC 봇 만들면서 그랬듯, AnyEvent 도 그렇게 시작하려고 했었습니다.
  그런데!! 일본의 Perl 해커 Maki 씨가  Morris 라는 봇을 만든 것을 봤습니다. Morris 는 AnyEvent + Moose 를 뼈대로 만들어졌으며, 매우 현대적인 펄 프로그래밍 스타일을 엿볼 수 있었습니다.
 
  특징으로는, 설정파일 기반으로 여러개의 IRC 서버에 접근할 수 있으며, 각 네트워크별로 Plugin 을 할당해줄 수 있고, 쉽게 Plugin 을 확장할 수 있습니다.

  http://github.com/lestrrat/Morris

  그래서 기존에 쓰고 있던 PoCo::IRC 로 깨작거렸던 것도 Morris 로 바꿨습니다. 뭐 추가로 이래저래 작업해야할 것들도 많겠지만... 일단은 너무 만족스럽습니다. :-)

  지난번 PoCo::IRC 프로세스 두개 띄워서 서로 IKC 로 묶어줬던 부분은 AnyEvent::MP 를 이용해서 같은 기능을 구현할 수 있습니다. AEMP는 Erlang Style 의 Multi-Processing/Message-Passing Framework 입니다. 기존의 PoCo::IKC 를 사용했던 경우는 두개의 프로세스에 각자 IKC 서버/클라이언트를 띄웠지만, Morris 가 사용하는 AEMP 의 경우는 Seed 역할을 하는 Process 가 필요합니다. 그 Seed 프로세스가 중간에서 중계역할을 해주는 것이죠.
 
  http://search.cpan.org/perldoc?AnyEvent::MP
 
  Intro 문서를 참고로 하시면 도움이 되실 겁니다. (아니 그보다 Intro 를 이해하지 않으면 뭐가 뭔지 알 수 없었습니다) 아무튼 AnyEvent::MP 모듈을 설치하면 aemp 라는 커맨드파일이 생성됩니다.

  $ aemp gensecret
  $ aemp profile seed binds "*:4040"
  $ aemp seeds "*:4040" nodeid anon/
  $ aemp run profile seed
 
 그 aemp 커맨드를 이용해서 위의 명령을 실행합니다. (Intro 에서 순서대로 따라하면 자연스레 입력하게 됩니다) 뭐 통신시 필요한 비밀키를 생성하고 시드를 4040포트로 붙여서 띄운다 라는 그런 내용입니다.

  IKC 대신에 AEMP를 사용하기로 했으니... 기본 플러그인인  Morris::Plugin::MP 를 사용하는 전제에서 아래의 Relay 플러그인을 그냥 냅다 써봤습니다.



  뭐 사실 hanirc <-> freenode 간에는 인코딩 타입등의 설정도 필요하겠지만... 그건 필요하신 분의 숙제로 남겨두도록 하겠습니다. :-)

  현재 irc.freenode.org #perl-kr <-> irc.hanirc.org #perl 은 이렇게 각 채널간의 메시지를 서로 릴레이하고 있습니다.

  그외 Plagger 같은 것들을 사용해서 RSS 를 긁어준다느니 등등도... AEMP 를 사용하는 플러그인 하나만 추가해주면 간단할 겁니다. 그냥 편히 쓰던 거 마저 써도 되지만... 그게 관리상에 이런저런 문제가 좀 있어서요.
  모두 AnyEvent!
신고
TOTAL 486,569 TODAY 59

티스토리 툴바