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_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;
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;