| 40 | | sub poe__start { |
| 41 | | my $poe = sweet_args; |
| 42 | | my $session_id = $poe->session->ID; |
| | 54 | sub 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 | |
| | 111 | sub 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 | |
| | 122 | sub irssi_private {} |
| | 123 | |
| | 124 | sub 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 | } |
| | 133 | sub irssi_own_private {} |
| | 134 | |
| | 135 | sub 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 | |
| | 151 | sub 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 | |
| | 165 | sub irssi_quit {} |
| | 166 | sub irssi_kick {} |
| | 167 | sub irssi_nick {} |
| | 168 | sub irssi_own_nick {} |
| | 169 | sub irssi_invite {} |
| | 170 | |
| | 171 | sub 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 | |
| | 180 | sub irssi_irc_op_public {} |
| | 181 | sub irssi_irc_own_wall {} |
| | 182 | |
| | 183 | sub 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 | |
| | 192 | sub 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 | |
| | 201 | sub 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 | |
| | 209 | sub 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 | } |
| | 216 | sub irssi_irc_own_ctcp {} |
| | 217 | sub irssi_irc_ctcp {} |
| | 218 | |
| | 219 | sub poe_load_setting { |
| | 220 | my $poe = sweet_args; |
| | 221 | |
| | 222 | delete $poe->heap->{config} if $poe->heap->{config}; |
| 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 | |
| | 255 | sub poe_unload { |
| | 256 | my $poe = sweet_args; |
| | 257 | $poe->kernel->post( mobirc_httpd => 'shutdown' ); |
| | 258 | |
| | 259 | Irssi::print('stopped mobirc'); |
| | 260 | } |
| | 261 | |
| | 262 | sub 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 | } |