package URLQueue::MainController; use v5.26; use Moo; use experimental 'signatures'; use Gtk3; use Path::Tiny; use URI::Find; use URI::Title; use Email::Sender::Simple 'sendmail'; use Email::Sender::Transport::SMTP (); use Email::Simple; use Encode; use MIME::EncWords; use File::ShareDir 'dist_file'; use POSIX 'strftime'; has builder => ( is => 'lazy', builder => sub ($self) { my $glade_file=path(__FILE__)->sibling('main3.glade'); my $builder = Gtk3::Builder->new_from_file("$glade_file"); $builder->connect_signals(undef, $self); return $builder; }, ); has input => ( is => 'lazy', builder => sub ($self) { $self->builder->get_object('input') }, ); has _dragging => ( is => 'rw', default => 0 ); has _last_text => ( is => 'rw', default => '' ); sub set_icon($self,$icon) { $self->input->set_from_file( dist_file('URLQueue',"stock_book_${icon}.png") ); } sub BUILD($self,$args) { my $target_list=Gtk3::TargetList->new(); #$target_list->add_uri_targets(1); $target_list->add_text_targets(2); $self->input->drag_dest_set( ['all'], [], [qw(link)], ); $self->input->drag_dest_set_target_list($target_list); $self->set_icon('green'); } sub drag_motion($self, $widget, $context, $x, $y, $time, @) { if (!$self->_dragging) { $self->set_icon('open'); $self->_dragging(1); } return 1; } sub drag_leave($self, $widget, $context, $time, @) { if ($self->_dragging) { $self->set_icon('green'); $self->_dragging(0); } return 1; } sub drag_data_received($self, $widget, $context, $x, $y, $data, $info, $time, @) { if ($info==1) { $self->handle_uris($data->get_uris) } elsif ($info==2) { $self->handle_text($data->get_text); } else { warn "What is $info??"; } return 1; } sub paste_clipboard($self,$widget, @) { my $clipboard=Gtk3::Clipboard::get_default(); $clipboard->request_text(sub{$self->handle_text($_[1])}); return 1; } sub button_release($self,$widget,$event,@) { if ($event->button==2) { $self->set_icon('yellow'); my $clipboard=Gtk3::Clipboard::get(Gtk3::Gdk::Atom::intern('PRIMARY',0)); $clipboard->request_text(sub{$self->handle_text($_[1])}); return 1; } return 0; } sub quit { Gtk3->main_quit; } sub handle_text($self,$text) { return unless $text; # stupid hack to avoid double-drop from Firefox return if ($self->_last_text and $self->_last_text eq $text); $self->_last_text($text); { my @uris; my $tmptext=$text; URI::Find->new(sub { push @uris,$_[0]->as_string; return '' })->find(\$tmptext); if ($tmptext=~/\A \s* \z/smx) { return $self->handle_uris(\@uris); } } my ($title)=($text =~ m{ \A ^ (.+?) $}smx); for ($title,$text) { s{\A \s+}{}smx; s{\s+ \z}{}smx; } $title = 'URLQueue paste' if $title eq ''; $self->send_email($title,$text); $self->set_icon('green'); } sub handle_uris($self,$uris) { my @uris=grep {$_} @$uris; return unless @uris; my @titles=map {URI::Title::title($_)} @uris; my $title=join ' - ',@titles; my $body=''; while (@uris) { my $uri=shift @uris; my $name=shift @titles; $body.="$title $uri\n"; } $self->send_email($title,$body); $self->set_icon('green'); } sub send_email($self,$title,$body) { $title=MIME::EncWords::encode_mimewords( Encode::encode('utf-8',$title), Charset=>'utf-8', ); my $message = Email::Simple->create( header => [ From => 'urlqueue@thenautilus.net', To => 'dakkar@thenautilus.net', Subject => $title, 'Content-Type' => 'text/plain; charset=utf-8', 'Content-Transfer-Encoding' => '8bit', ], body => Encode::encode('utf-8',$body), ); warn $message->as_string;return; sendmail($message,{ from => 'urlqueue@thenautilus.net', transport => Email::Sender::Transport::SMTP->new({ host => 'luxion', port => 25, }), }); } 1;