aanoaa / p5-hubot

hubot perl port
15 stars 3 forks source link

타이머 이벤트 제공 #34

Closed am0c closed 11 years ago

am0c commented 11 years ago

확장 스크립트를 몇 초마다 수행되도록 할 수 있으면 좋을 것 같습니다.

aanoaa commented 11 years ago

hubot-scripts.json 파일 변경후에 재시작 하지 않고 읽어들이기 위함인가요?

am0c commented 11 years ago

아뇨, 그보다는 특정 플러그인이 Hubot이 규칙적으로 특정 작업을 수행하도록 하고 싶었습니다.

package Hubot::Scripts::MyScript;

use AnyEvent;
use Moose;

has 'cv',
    is => 'rw',
    default => sub { +{} };

sub load {
    my ($self, $robot) = @_;

    $self->cv->{loop} = (AE::timer 0, 20, sub {
        $robot->brain->save;
        $self->update($robot);
    });
}

만들고 보니 대략 위와 같이 타이머 이벤트 발생이 가능했습니다. 그래서 딱히 또다른 API가 필요 없다는 것을 뒤늦게 알았습니다.

aanoaa commented 11 years ago

오오미 :+1:

aanoaa commented 11 years ago

adapter 코드는 아래와 같고

$adapter->emit('connected');
# some stuff
$cv->recv;

$robot->loadHubotScripts 타이밍이 $adapter->emit('connected') 다음 이라서, event loop 가 시작된 후에 AE::timer 가 등록되기 때문인지 동작하지 않습니다.

aanoaa commented 11 years ago

아못군의 코드는 정상 동작합니다. WATCHER 의 lifetime 을 고려하지 않은 테스트 였습니다.

watcher object 를 load 함수 안에 두면 lifetime 이 끝나버려서 event loop 안에서 제거 되기 때문에 동작하지 않지만, 모듈내에 둔다면 동작합니다.

코드로 예를 들면,

sub load {
    my ( $class, $robot ) = @_;
    my $w;
    $w = AE::timer 0, 5, sub {'do something'}; # not working
}
my $w;
sub load {
    my ( $class, $robot ) = @_;
    $w = AE::timer 0, 5, sub {'do something'}; # working
}
aanoaa commented 11 years ago

http://search.cpan.org/~mlehmann/AnyEvent/lib/AnyEvent.pm#WATCHERS

if you follow the documentation, your code will work, if you don't, your code will not work, so you need to fix your code.

by Marc Lehmann