## ## Relay messages over email-to-MMS bridge while away. ## Supports basic replies to channels. ## ## Based on notify.pl by Luke Macken, Paul W. Frields ## use strict; use Irssi; use vars qw($VERSION %IRSSI); use Mail::IMAPClient; use MIME::Parser; $VERSION = "0.2"; %IRSSI = ( authors => 'Kevin Lange', contact => 'klange@dakko.us', name => 'txtnotify.pl', description => 'Relay hilights over txt message', license => 'GNU General Public License', url => 'https://dakko.us', ); Irssi::settings_add_str('txtnotify', 'txtnotify_last_server', ''); Irssi::settings_add_str('txtnotify', 'txtnotify_last_channel', ''); my $phone_address = 'xxx'; my $imap_serv = 'xxx'; my $imap_user = 'xxx'; my $imap_pass = 'xxx'; my $imap_fold = 'xxx'; sub notify { my ($server, $summary, $message) = @_; return if (!$server->{usermode_away}); open(MAIL, "| mail -I $phone_address"); print MAIL "~s" . $summary . "\n"; print MAIL $message; close(MAIL); } sub print_text_notify { my ($dest, $text, $stripped) = @_; my $server = $dest->{server}; return if (!$server || !($dest->{level} & MSGLEVEL_HILIGHT)); my $sender = $stripped; $sender =~ s/^\<.([^\>]+)\>.+/\1/ ; $sender =~ s/\.// ; $stripped =~ s/^\<.[^\>]+\>.// ; my $summary = $server->{tag}."/".$dest->{target}; Irssi::settings_set_str('txtnotify_last_server', $server->{tag}); Irssi::settings_set_str('txtnotify_last_channel', $dest->{target}); notify($server, $summary, "<" . $sender . "> " . $stripped); } sub message_private_notify { my ($server, $msg, $nick, $address) = @_; return if (!$server); notify($server, $server->{tag}."/".$nick, $msg); } sub check_mail { my $imap = Mail::IMAPClient->new(Server=>$imap_serv, User=>$imap_user, Password=>$imap_pass) or return; $imap->select($imap_fold); if (!$imap->message_count()) { return; # No messages } my @msgs = $imap->unseen(); foreach my $msg (@msgs) { my $parser = MIME::Parser->new( ); $parser->output_to_core(1); my $email = $parser->parse_data($imap->message_string($msg)); my $num_parts = $email->parts; for (my $i=0; $i < $num_parts; $i++) { my $part = $email->parts($i); my $content_type = $part->mime_type; my $body = $part->as_string; my $fh = $part->open("r"); while (my $line = <$fh>) { if (substr($line, 0, 1) eq ".") { my $channel = Irssi::settings_get_str("txtnotify_last_channel"); my $server = Irssi::settings_get_str("txtnotify_last_server"); my $body = substr($line, 1); my $isrv = Irssi::server_find_tag($server) or return; $isrv->command("ECHO (from email) ".$channel.": ".$body); $isrv->send_message($channel, $body, 0); } else { my ($stuff, $body) = split(" ", $line, 2); my ($server, $channel) = split("\/", $stuff); my $isrv = Irssi::server_find_tag($server) or return; $isrv->command("ECHO (from email) ".$channel.": ".$body); $isrv->send_message($channel, $body, 0); } } } } $imap->logout(); } Irssi::signal_add('print text', 'print_text_notify'); Irssi::signal_add('message private', 'message_private_notify'); Irssi::timeout_add(1000, 'check_mail', undef);