Changeset 875 for lang/perl/irssi

Show
Ignore:
Timestamp:
10/30/07 11:37:39 (6 years ago)
Author:
typester
Message:

perl/irssi/scripts/mobirc.pl:

  • /script load しただけではHTTPDを起動しないように変更 (todo: optionでできるようにする)
  • load後 /mobirc start で HTTPD開始。 /mobirc stop で停止
  • stop -> start でyamlは読み直す (todo: reload or restart option)
  • yamlファイルの場所(mobirc_config_path)が設定されてない場合メッセージ出してHTTPDは起動しない
  • yamlファイルが不正だったときもメッセージ出してHTTPは起動しない
  • BUG: /script unload 後、再loadするとなんか動かない。GLibなんたらこうたらってエラー出る。Yappoさんたすけて!
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/irssi/scripts/mobirc.pl

    r855 r875  
    88use POE qw/Session::Irssi Loop::Glib/; 
    99 
    10 use boolean ':all'; 
    1110use Encode; 
    1211use Mobirc::Util; 
     
    1615our %IRSSI = ( name => 'mobirc' ); 
    1716 
    18 Irssi::settings_add_str('mobirc', 'mobirc_config_path', 'configpath'); 
     17Irssi::settings_add_str('mobirc', 'mobirc_config_path', ''); 
    1918 
    2019POE::Session::Irssi->create( 
    2120    inline_states => { 
    2221        map { ( $_ => __PACKAGE__->can("poe_$_") ) } 
    23             qw/_start/ 
     22            qw/load load_setting unload/ 
     23    }, 
     24 
     25    irssi_commands => { 
     26        mobirc => sub { 
     27            my $poe = sweet_args; 
     28            my ($data, $server, $witem) = @{ $poe->args->[1] }; 
     29 
     30            if (($data || '') =~ /start/) { 
     31                $poe->kernel->yield('load'); 
     32            } 
     33            elsif (($data || '') =~ /stop/) { 
     34                $poe->kernel->yield('unload'); 
     35            } 
     36        }, 
    2437    }, 
    2538 
     
    3144            qw/op_public own_wall own_action action own_notice notice own_ctcp ctcp/ 
    3245        ), 
     46        'command script unload' => \&script_unload, 
    3347    }, 
    3448); 
     
    3852} 
    3953 
    40 sub poe__start { 
    41     my $poe = sweet_args; 
    42     my $session_id = $poe->session->ID; 
     54sub poe_load { 
     55    my $poe = sweet_args; 
     56 
     57    $poe->kernel->call( $poe->session, 'load_setting') 
     58        or return; 
     59 
     60    POE::Session->create( 
     61        inline_states => { 
     62            _start => sub { 
     63                my $poe = sweet_args; 
     64                $poe->kernel->alias_set('irc_session'); # create dummy irc_session 
     65 
     66                for my $c ( Irssi::channels() ) { 
     67                    my $canon_name = canon_name($c->{name}); 
     68                    add_message( $poe, 
     69                        decode( $poe->heap->{config}->{irc}->{incode} || 'utf-8', $canon_name ), 
     70                        undef, decode('utf-8', 'Connected to irc server!'), 'connect' ); 
     71 
     72                    $poe->heap->{channel_name}->{ $canon_name } = $c->{name}; 
     73                    $poe->heap->{channel_topic}->{ $canon_name } = $c->{topic}; 
     74                } 
     75            }, 
     76        }, 
     77        heap => { 
     78            seen_traffic   => 1, 
     79            disconnect_msg => 1, 
     80            channel_topic  => {}, 
     81            channel_mtime  => {}, 
     82            channel_name   => {}, 
     83            channel_topic  => {}, 
     84            config         => $poe->heap->{config}, 
     85            irc            => bless({}, __PACKAGE__), 
     86        }, 
     87    ); 
     88 
     89    POE::Session->create( 
     90        inline_states => { 
     91            _start => sub { 
     92                $_[KERNEL]->alias_set('mobirc_irc'); 
     93            }, 
     94 
     95            privmsg => sub { 
     96                my ($channel, $message) = @_[ARG0, ARG1]; 
     97 
     98                ($channel) = grep { $_->{name} eq $channel } Irssi::channels(); 
     99                if ($channel) { 
     100                    $channel->{server}->command("MSG $channel->{name} $message"); 
     101                } 
     102            }, 
     103        }, 
     104 
     105    ); 
     106 
     107    Mobirc::HTTPD->init($poe->heap->{config}); 
     108    Irssi::print('started mobirc') if $poe->kernel->alias_resolve('mobirc_httpd'); 
     109} 
     110 
     111sub irssi_public { 
     112    my $poe = sweet_args; 
     113    my ($server, $msg, $nick, $address, $target) = @{ $poe->args->[1] }; 
     114 
     115    add_message( 
     116        $poe, decode( 'utf-8',  $target ), 
     117        $nick, decode( 'utf-8', $msg ), 
     118        'public', 
     119    ); 
     120} 
     121 
     122sub irssi_private {} 
     123 
     124sub irssi_own_public { 
     125    my $poe = sweet_args; 
     126    my ($server, $msg, $target) = @{ $poe->args->[1] }; 
     127 
     128    # HTTPDから発言した場合、ここで発言すると二重発言されてしまう。でもirssiからのときは反映させたい: TODO 
     129#    add_message( 
     130#        $poe, decode('utf-8', $target), $server->{nick}, decode('utf-8', $msg), 'public' 
     131#    ); 
     132} 
     133sub irssi_own_private {} 
     134 
     135sub irssi_join { 
     136    my $poe = sweet_args; 
     137    my ($server, $channel, $nick, $address) = @{ $poe->args->[1] }; 
     138 
     139    my $irc = $poe->kernel->alias_resolve('irc_session')->get_heap; 
     140 
     141    $irc->{channel_name}->{canon_name($channel)} = $channel; 
     142    unless ($server->{nick} eq $nick) { 
     143        add_message( 
     144            $poe, decode('utf-8', $channel), 
     145            undef, decode('utf-8', "$nick joined"), 
     146            'join', 
     147        ); 
     148    } 
     149} 
     150 
     151sub irssi_part { 
     152    my $poe = sweet_args; 
     153    my ($server, $channel, $nick, $address, $reason) = @{ $poe->args->[1] }; 
     154    my $irc = $poe->kernel->alias_resolve('irc_session')->get_heap; 
     155 
     156    my $canon_channel = canon_name($channel); 
     157    if ($server->{nick} eq $nick) { 
     158        delete $irc->{channel_name}{$canon_channel}; 
     159    } 
     160    else { 
     161        add_message($poe, decode('utf-8', $channel), undef, decode('utf-8', "$nick leaves"), 'leave'); 
     162    } 
     163} 
     164 
     165sub irssi_quit {} 
     166sub irssi_kick {} 
     167sub irssi_nick {} 
     168sub irssi_own_nick {} 
     169sub irssi_invite {} 
     170 
     171sub irssi_topic { 
     172    my $poe = sweet_args; 
     173    my ($server, $channel, $topic, $nick, $address) = @{ $poe->args->[1] }; 
     174    my $irc = $poe->kernel->alias_resolve('irc_session')->get_heap; 
     175 
     176    add_message($poe, decode('utf-8', $channel), undef, decode('utf-8', "$nick set topic: $topic"), 'topic'); 
     177    $irc->{channel_topic}{canon_name($channel)} = $topic; 
     178} 
     179 
     180sub irssi_irc_op_public {} 
     181sub irssi_irc_own_wall {} 
     182 
     183sub irssi_irc_own_action { 
     184    my $poe = sweet_args; 
     185    my ($server, $msg, $target) = @{ $poe->args->[1] }; 
     186    my $irc = $poe->kernel->alias_resolve('irc_session')->get_heap; 
     187 
     188    $msg = sprintf('* %s %s', $server->{nick}, decode('utf-8', $msg)); 
     189    add_message( $poe, decode('utf-8', $target), '', $msg, 'ctcp_action'); 
     190} 
     191 
     192sub irssi_irc_action { 
     193    my $poe = sweet_args; 
     194    my ($server, $msg, $nick, $address, $target) = @{ $poe->args->[1] }; 
     195    my $irc = $poe->kernel->alias_resolve('irc_session')->get_heap; 
     196 
     197    $msg = sprintf('* %s %s', $nick, decode('utf-8', $msg)); 
     198    add_message( $poe, decode('utf-8', $target), '', $msg, 'ctcp_action'); 
     199} 
     200 
     201sub irssi_irc_own_notice { 
     202    my $poe = sweet_args; 
     203    my ($server, $msg, $target) = @{ $poe->args->[1] }; 
     204    my $irc = $poe->kernel->alias_resolve('irc_session')->get_heap; 
     205 
     206    add_message($poe, decode('utf-8', $target), $server->{nick}, decode('utf-8', $msg), 'notice'); 
     207} 
     208 
     209sub irssi_irc_notice { 
     210    my $poe = sweet_args; 
     211    my ($server, $msg, $nick, $address, $target) = @{ $poe->args->[1] }; 
     212    my $irc = $poe->kernel->alias_resolve('irc_session')->get_heap; 
     213 
     214    add_message($poe, decode('utf-8', $target), $nick, decode('utf-8', $msg), 'notice'); 
     215} 
     216sub irssi_irc_own_ctcp {} 
     217sub irssi_irc_ctcp {} 
     218 
     219sub poe_load_setting { 
     220    my $poe = sweet_args; 
     221 
     222    delete $poe->heap->{config} if $poe->heap->{config}; 
    43223 
    44224    my $conffname = Irssi::settings_get_str('mobirc_config_path'); 
    45     die "file does not exist: $conffname" unless -f $conffname; 
    46  
    47     my $config = YAML::Syck::LoadFile($conffname); 
     225    unless ($conffname) { 
     226        Irssi::print('mobirc_config_path is not defined, please do "/set mobirc_config_path your_yaml_path" first'); 
     227        return; 
     228    } 
     229    unless (-f $conffname && -r _) { 
     230        Irssi::print("file does not exist: $conffname"); 
     231        return; 
     232    } 
     233 
     234    my $config; 
     235    eval { $config = YAML::Syck::LoadFile($conffname) }; 
     236    if ($@) { 
     237        Irssi::print("can't read $conffname: $@"); 
     238        return; 
     239    } 
     240 
    48241    # set default vars. 
    49242    $config->{irc}->{ping_delay} ||= 30; 
     
    57250    $config->{httpd}->{content_type} ||= 'text/html; charset=Shift_JIS'; 
    58251 
    59     POE::Session->create( 
    60         inline_states => { 
    61             _start => sub { 
    62                 $_[KERNEL]->alias_set('irc_session'); # create dummy irc_session 
    63                 my $poe = sweet_args; 
    64   
    65                 for my $c ( map { $_->{name} } Irssi::channels() ) { 
    66                     add_message( $poe, 
    67                         decode( $poe->heap->{config}->{irc}->{incode}, canon_name($c) ), 
    68                         undef, decode('utf8', 'Connected to irc server!'), 'connect' ); 
    69  
    70                     $poe->heap->{channel_name}->{ canon_name($c) } = $c; 
    71                     $poe->heap->{channel_topics}->{ canon_name($c) } = $c; 
    72                 } 
    73             }, 
    74         }, 
    75         heap => { 
    76             seen_traffic   => true, 
    77             disconnect_msg => true, 
    78             channel_topic  => {}, 
    79             channel_mtime  => {}, 
    80             channel_name   => {}, 
    81             channel_topic  => {}, 
    82             config         => $config, 
    83             irc            => bless({}, __PACKAGE__), 
    84         }, 
    85     ); 
    86  
    87     POE::Session->create( 
    88         inline_states => { 
    89             _start => sub { 
    90                 $_[KERNEL]->alias_set('mobirc_irc'); 
    91             }, 
    92  
    93             privmsg => sub { 
    94                 my ($channel, $message) = @_[ARG0, ARG1]; 
    95  
    96                 ($channel) = grep { $_->{name} eq $channel } Irssi::channels(); 
    97                 if ($channel) { 
    98                     $channel->{server}->command("MSG $channel->{name} $message"); 
    99                 } 
    100             }, 
    101         }, 
    102  
    103     ); 
    104  
    105     Mobirc::HTTPD->init($config); 
    106 } 
    107  
    108 sub irssi_public { 
    109     my $poe = sweet_args; 
    110     my ($server, $msg, $nick, $address, $target) = @{ $poe->args->[1] }; 
    111  
    112     add_message( 
    113         $poe, decode( 'utf-8',  $target ), 
    114         $nick, decode( 'utf-8', $msg ), 
    115         'public', 
    116     ); 
    117 } 
    118  
    119 sub irssi_private {} 
    120  
    121 sub irssi_own_public { 
    122     my $poe = sweet_args; 
    123     my ($server, $msg, $target) = @{ $poe->args->[1] }; 
    124  
    125     # HTTPD発言した場合、ここで発言すると二重発言されてしまう。でもirssiからのときは反映させたい TODO 
    126 #    add_message( 
    127 #        $poe, decode('utf-8', $target), $server->{nick}, decode('utf-8', $msg), 'public' 
    128 #    ); 
    129 } 
    130 sub irssi_own_private {} 
    131  
    132 sub irssi_join { 
    133     my $poe = sweet_args; 
    134     my ($server, $channel, $nick, $address) = @{ $poe->args->[1] }; 
    135  
    136     my $irc = $poe->kernel->alias_resolve('irc_session')->get_heap; 
    137  
    138     $irc->{channel_name}->{canon_name($channel)} = $channel; 
    139     unless ($server->{nick} eq $nick) { 
    140         add_message( 
    141             $poe, decode('utf-8', $channel), 
    142             undef, decode('utf-8', "$nick joined"), 
    143             'join', 
    144         ); 
    145     } 
    146 } 
    147  
    148 sub irssi_part { 
    149     my $poe = sweet_args; 
    150     my ($server, $channel, $nick, $address, $reason) = @{ $poe->args->[1] }; 
    151     my $irc = $poe->kernel->alias_resolve('irc_session')->get_heap; 
    152  
    153     my $canon_channel = canon_name($channel); 
    154     if ($server->{nick} eq $nick) { 
    155         delete $irc->{channel_name}{$canon_channel}; 
    156     } 
    157     else { 
    158         add_message($poe, decode('utf-8', $channel), undef, decode('utf-8', "$nick leaves"), 'leave'); 
    159     } 
    160 } 
    161  
    162 sub irssi_quit {} 
    163 sub irssi_kick {} 
    164 sub irssi_nick {} 
    165 sub irssi_own_nick {} 
    166 sub irssi_invite {} 
    167  
    168 sub irssi_topic { 
    169     my $poe = sweet_args; 
    170     my ($server, $channel, $topic, $nick, $address) = @{ $poe->args->[1] }; 
    171     my $irc = $poe->kernel->alias_resolve('irc_session')->get_heap; 
    172  
    173     add_message($poe, decode('utf-8', $channel), undef, decode('utf-8', "$nick set topic: $topic"), 'topic'); 
    174     $irc->{channel_topic}{canon_name($channel)} = $topic; 
    175 } 
    176  
    177 sub irssi_irc_op_public {} 
    178 sub irssi_irc_own_wall {} 
    179  
    180 sub irssi_irc_own_action { 
    181     my $poe = sweet_args; 
    182     my ($server, $msg, $target) = @{ $poe->args->[1] }; 
    183     my $irc = $poe->kernel->alias_resolve('irc_session')->get_heap; 
    184  
    185     $msg = sprintf('* %s %s', $server->{nick}, decode('utf-8', $msg)); 
    186     add_message( $poe, decode('utf-8', $target), '', $msg, 'ctcp_action'); 
    187 } 
    188  
    189 sub irssi_irc_action { 
    190     my $poe = sweet_args; 
    191     my ($server, $msg, $nick, $address, $target) = @{ $poe->args->[1] }; 
    192     my $irc = $poe->kernel->alias_resolve('irc_session')->get_heap; 
    193  
    194     $msg = sprintf('* %s %s', $nick, decode('utf-8', $msg)); 
    195     add_message( $poe, decode('utf-8', $target), '', $msg, 'ctcp_action'); 
    196 } 
    197  
    198 sub irssi_irc_own_notice { 
    199     my $poe = sweet_args; 
    200     my ($server, $msg, $target) = @{ $poe->args->[1] }; 
    201     my $irc = $poe->kernel->alias_resolve('irc_session')->get_heap; 
    202  
    203     add_message($poe, decode('utf-8', $target), $server->{nick}, decode('utf-8', $msg), 'notice'); 
    204 } 
    205  
    206 sub irssi_irc_notice { 
    207     my $poe = sweet_args; 
    208     my ($server, $msg, $nick, $address, $target) = @{ $poe->args->[1] }; 
    209     my $irc = $poe->kernel->alias_resolve('irc_session')->get_heap; 
    210  
    211     add_message($poe, decode('utf-8', $target), $nick, decode('utf-8', $msg), 'notice'); 
    212 } 
    213 sub irssi_irc_own_ctcp {} 
    214 sub irssi_irc_ctcp {} 
     252    $poe->heap->{config} = $config; 
     253} 
     254 
     255sub poe_unload { 
     256    my $poe = sweet_args; 
     257    $poe->kernel->post( mobirc_httpd => 'shutdown' ); 
     258 
     259    Irssi::print('stopped mobirc'); 
     260} 
     261 
     262sub script_unload { 
     263    my $poe = sweet_args; 
     264    my ($script) = @{ $poe->args->[1] }; 
     265 
     266    if ($script =~ m!/$IRSSI{name}\.pl$!) { 
     267        $poe->kernel->yield('unload'); 
     268    } 
     269} 
    215270 
    216271# XXX: to avoid weird warnings 
     
    241296Daisuke Murase <typester@cpan.org> 
    242297 
     298Kazuhiro Osawa 
     299 
    243300=cut 
    244301