블로그 이미지
JEEN

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

Rss feed Tistory
IT/Perl 2008.05.23 12:20

[ Perl ] IRC BOT을 만들어봅시다 :-) #3

하루에 한 번씩 쓸려고 했는데.. 역시 계획대로 쉽게 되지는 않는군요.

IRC BOT을 만들어봅시다 :-) #3

 - #2 에서는...

   - PoCo::IRC 를 이용해서 실제 IRC서버에 접속하고, 채널입장을 할 수 있었습니다.
   - IRC에서의 여러 이벤트들이 있다는 것을 알았습니다.

 - #3 에서는...

   - IRC에서 벌어지는 여러가지 이벤트 처리를 어떻게 하는 지에 대해서 알아보겠습니다.
   - IRC 에서 쓰이는 커맨드의 종류에 대해서도 함께 알아보겠습니다.

 - IRC Events

  자주 쓰이는 Event 를 우선으로 하겠습니다. 그리고 이벤트에서 받을 수 있는 인수에 대해서도 함께 알아보겠습니다.

  - irc_public (ARG0 - "닉!호스트", ARG1 - "채널이름", ARG2 - "메시지")
 채널 상에서 일반적인 대화시에 발생하는 이벤트 입니다.
sub irc_public {
my ($sender, $who, $where, $what) = @_[SENDER, ARG0 .. ARG2];
my ($nick, $host) = split /!/, $who; # nick 과 호스트를 분리
my $channel = $where->[0]; # $where는 배열 참조
$irc->yield( privmsg => $channel => $nick . " : WTF?" );
# 건방진 봇이 되는 Lifehack
}
  - irc_join ( ARG0 - "닉!호스트", ARG1 - "채널이름" )
 누군가 채널에 입장했을 때 발생하는 이벤트 입니다.
sub irc_join {
     my ($sender, $who, $where) = @_[SENDER, ARG0, ARG1];
my ($nick, $host) = split /!/, $who; # nick 과 호스트를 분리
my $channel = $where->[0]; # $where는 배열 참조
$irc->yield( privmsg => $channel => $nick . " : Hello" );
# 언어에서 Hello World 가 기본이듯, Bot 에서도 Hello Bot 만들기는 가장 기본적인 예제입니다.
}

  - irc_msg ( ARG0 - "닉!호스트", ARG1 - "MSG 받은 당사자", ARG2 - "메시지" )
 귓속말 이벤트(1:1 대화)가 발생했을 때 입니다. 물론 여기서 메시지를 받는 대상은 "봇"이 됩니다.
sub irc_msg {
     my ($sender, $who, $where, $what) = @_[SENDER, ARG0 .. ARG2 ];
my ($nick, $host) = split /!/, $who; # nick 과 호스트를 분리
my $me = $where->[0]; # $where는 배열 참조
$irc->yield( privmsg => $nick => "What's wrong?" );
# 이번에는 privmsg 의 대상은 채널이 아니라, 닉네임이 됩니다.
# 귓속말 했는데 채널에 대고 떠들면 안되겠죠? 물론 인수에는 채널 정보를 얻을 수 없기도 하지만요.
}
  - irc_connected, irc_disconnected (ARG0 - "서버 이름" )
 
 IRC 서버에 접속하거나 나갔을 때의 이벤트 처리입니다.  강제종료가 아니라 정상적인 disconnect 가 되었다면, irc_disconnected 도 호출됩니다. 서버의 문제로 튕기거나 하는 상황이 적절한 예가 될 것입니다. irc_disconneted 에 다시 IRC 접속하게 해두면... 강제종료 하지 않는 이상은 계속해서 접속하려고 하겠죠. (물론 서버에서 부정한 접속이라고 튕겨낼 가능성이 있습니다)

  - irc_kick, irc_mode, irc_notice, irc_nick.... 
 채널 내에서 누구를 쫓아낼 때의 이벤트라든지, 누구에게 옵을 줬는지, 누군가 notice로 알릴 때나, 누군가 자신의 닉네임을 바꿀 때의 이벤트도 처리할 수 있습니다. 이에 대해서는 POE::Component::IRC 페이지에서 자세하게 확인하실 수 있으실 겁니다. 전부 다 쓰는 것은 역시나 힘들군요.

 - IRC Commands

 IRC에서 사용하는 기본적인 커맨드에 관한 이야기입니다. 이런 커맨드로 인해 이벤트가 발생하고, 그렇게 발생한 이벤트를 위에서 기술한 이벤트 처리에서 다루게 됩니다. 내용은 자주 사용하는 일부의 커맨드만을 다루도록 하겠습니다. 그리고 역시 마찬가지로 POE::Component::IRC 페이지에서 보다 더 자세한 내용을 알 수 있습니다.

  - privmsg
  주로 대부분의 IRC 클라이언트에서 이 명령어를 생략해도 됩니다. 일반적인 말하기 커맨드입니다.

  - join
  IRC 서버 접속 이후, 채널에 입장할 시에 쓰이는 커맨드 입니다.

  - kick
  맘에 안드는 대상을 쫓아냅니다. kick을 사용하는 당사자는 옵을 가지고 있어야 합니다.

  - mode
  채널 내의 어떤 사용자에 대해 권한을 설정할 수 있습니다. 엄격한 정책을 가지고 있는 채널에서는 여러가지 권한을 설정할 수 있습니다.

  - nick
  자신의 닉네임을 변경할 수 있습니다.

  - notice
  통보 메시지를 채널이나 유저에게 알립니다.

  - topic
  방의 주제를 설정할 수 있습니다.


 - Tutorial

 자신이 처리할 이벤트는 미리 POE::Session을 만들 때 등록해 둘 필요가 있습니다.
POE::Session->create(
                     package_states => [
                                        main => [ qw(_default _start irc_001 irc_public irc_msg ) ],
                                        ],
                     heap => { irc => $irc },
                     );

 이렇게 해두면 irc_public 과 irc_msg 를 처리할 수 있게 됩니다.
sub irc_public {
my ($sender, $who, $where, $what) = @_[SENDER, ARG0 .. ARG2];
my ($nick, $host) = split /!/, $who; # nick 과 호스트를 분리
my $channel = $where->[0]; # $where는 배열 참조
$irc->yield( privmsg => $channel => $nick . " : WTF?" );
# 건방진 봇이 되는 Lifehack
}

 그리고 irc_public 에서 이벤트를 위와 같이 기술합니다.

  $irc->yield ( <blahblah> => <target> => <do something> );

 이와 같이 IRC에 이벤트를 날릴 수 있습니다.
 <blahblah> 에는 위에서 말한 IRC Command 를,
 <target> 에는 채널이름이나 유저를,
 <do something> 에는 말하고 싶은 무언가를...

 물론 커맨드마다 필요한 인수는 다를 수 있으니, 그에 맞게 사용하시면 됩니다.
 실제 사용예제에 대해서는 차후에 다룰 예정이지만, 맘이 급하신 분들은 아래의 -PR 을 따라오시면 됩니다.

  - Summary

  - IRC 의 이벤트 처리에는 여러가지가 있고, 대부분을 처리할 수 있습니다.
  - IRC 커맨드에는 여러종류가 있고, 상황에 맞춰서 사용할 수 있습니다.

  - #4 에서는...

  - POE::Component::IRC::Plugin::(.*) 모듈을 사용해서 이미 만들어져 있는 Plugin 들을 붙여보겠습니다.

  - PR
※ 현재 POE::Component::IRC를 사용한 Perl Bot 만들기 프로젝트가 진행중입니다.
- http://code.google.com/p/perl-irc-bot
※ 더불어 perldoc을 한글로 번역하기 위한 프로젝트도 진행중입니다.
- http://code.google.com/p/perldoc-kr
※ 거기에 덧붙여 me2day Perl API를 만드는 프로젝트도 진행중입니다.
- http://code.google.com/p/me2day-perl-api

 참여를 원하시면 댓글을 달아주시거나, email: aiatejin@gmail.com
 혹은 IRC(irc.hanirc.org, #perl)에서 JEEN에게 연락하시면 됩니다.

신고
TOTAL 483,672 TODAY 11

티스토리 툴바