diff options
Diffstat (limited to 'scripts/0x0st.pl')
-rw-r--r-- | scripts/0x0st.pl | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/scripts/0x0st.pl b/scripts/0x0st.pl new file mode 100644 index 0000000..be57ba1 --- /dev/null +++ b/scripts/0x0st.pl @@ -0,0 +1,215 @@ +use strict; +use vars qw($VERSION %IRSSI); + +use POSIX; +use Irssi; +use HTTP::Request::Common; +use LWP::UserAgent; +use Storable qw/store_fd fd_retrieve/; +use File::Glob qw/:bsd_glob/; + +$VERSION = '0.04'; +%IRSSI = ( + authors => 'bw1', + contact => 'bw1@aol.at', + name => '0x0st', + description => 'upload file to https://0x0.st/', + license => 'ISC', + url => 'https://scripts.irssi.org/', + changed => '2021-01-13', + modules => 'POSIX HTTP::Request::Common LWP::UserAgent Storable File::Glob', + commands=> '0x0st', + selfcheckcmd=> '0x0st -c', +); + +my $help = << "END"; +%9Name%9 + $IRSSI{name} +%9Version%9 + $VERSION +%9Syntax%9 + /0x0st [-p] [-s <URL> | -u <URL> | file ] + /0x0st -c +%9Description%9 + $IRSSI{description} + -p past url to channel + -s shorten url + -u file from url + -c self check +%9See also%9 + https://0x0.st/ + https://github.com/lachs0r/0x0 +END + +my $test_str; + +my $base_uri; + +my %bg_process= (); +my $self_check_timer; + +sub background { + my ($cmd) =@_; + my ($fh_r, $fh_w); + pipe $fh_r, $fh_w; + my $pid = fork(); + if ($pid ==0 ) { + my @res; + @res= &{$cmd->{cmd}}(@{$cmd->{args}}); + store_fd \@res, $fh_w; + close $fh_w; + POSIX::_exit(1); + } else { + $cmd->{fh_r}=$fh_r; + Irssi::pidwait_add($pid); + $bg_process{$pid}=$cmd; + } +} + +sub sig_pidwait { + my ($pid, $status) = @_; + if (exists $bg_process{$pid}) { + my @res= @{ fd_retrieve($bg_process{$pid}->{fh_r})}; + $bg_process{$pid}->{res}=[@res]; + if (exists $bg_process{$pid}->{last}) { + foreach my $p (@{$bg_process{$pid}->{last}}) { + &$p($bg_process{$pid}); + } + } else { + Irssi::print(join(" ",@res), MSGLEVEL_CLIENTCRAP); + } + delete $bg_process{$pid}; + } +} + +sub upload { + my ($filename) = @_; + my $ua = LWP::UserAgent->new(agent=>'wget'); + my $filename = bsd_glob $filename; + if (-e $filename) { + my $re = $ua->request(POST $base_uri, + Content_Type => 'form-data', + Content => + {file=>[$filename]} + ); + my $res= $re->content; + my $code= $re->code(); + chomp $res; + return $res, $code; + } +} + +sub url { + my ($url) = @_; + my $ua = LWP::UserAgent->new(agent=>'wget'); + my $re = $ua->request(POST $base_uri, + {url=> $url} + ); + my $res= $re->content; + my $code= $re->code(); + chomp $res; + return $res, $code; +} + +sub shorten { + my ($url) = @_; + my $ua = LWP::UserAgent->new(agent=>'wget'); + my $re = $ua->request(POST $base_uri, + {shorten=> $url} + ); + my $res= $re->content; + my $code= $re->code(); + chomp $res; + return $res, $code; +} + +sub past2channel { + my ($cmd) = @_; + my $witem = $cmd->{witem}; + if (defined $witem && (int($cmd->{res}[1] / 100) == 2)) { + $witem->command("msg * $cmd->{res}[0]"); + } else { + Irssi::print($cmd->{res}[0],MSGLEVEL_CLIENTCRAP); + } +} + +sub cmd { + my ($args, $server, $witem)=@_; + my ($opt, $arg) = Irssi::command_parse_options($IRSSI{'name'}, $args); + + if (length($args) >0 ) { + my $cmd; + if (exists $opt->{p}) { + $cmd->{last}=[\&past2channel]; + $cmd->{witem}=$witem; + } + if (exists $opt->{u}) { + $cmd->{cmd}=\&url; + $cmd->{args}=[$arg]; + background( $cmd ); + } elsif (exists $opt->{s}) { + $cmd->{cmd}=\&shorten; + $cmd->{args}=[$arg]; + background( $cmd ); + } elsif (exists $opt->{c}) { + $cmd->{cmd}=\&shorten; + $cmd->{args}=['https://scripts.irssi.org/']; + $cmd->{last}=[\&self_check]; + $self_check_timer= Irssi::timeout_add_once(2000, \&self_check, ''); + background( $cmd ); + } else { + $cmd->{cmd}=\&upload; + $cmd->{args}=[$arg]; + background( $cmd ); + } + } else { + cmd_help($IRSSI{'name'}); + } +} + +sub self_check { + my ( $arg )=@_; + my $s='ok'; + my @res; + if ( ref($arg) ne 'HASH' ) { + $s = 'Error: timeout'; + } else { + @res= @{$arg->{res}}; + Irssi::timeout_remove($self_check_timer); + Irssi::print("0x0st: surl: $res[0] stat: $res[1]", MSGLEVEL_CLIENTCRAP); + if ( 2 != scalar (@res ) ) { + $s = 'Error: arg count'; + } elsif ( $res[1] != 200 ) { + $s = "Error: HTTP status code ($res[1])"; + } elsif ( $res[0] !~ m/^http/ ) { + $s = "Error: result ($res[0])"; + } + } + Irssi::print("0x0st: selfcheck $s", MSGLEVEL_CLIENTCRAP); + my $schs_version = $Irssi::Script::selfcheckhelperscript::VERSION; + Irssi::command("selfcheckhelperscript $s") if (defined $schs_version); +} + +sub cmd_help { + my ($args, $server, $witem)=@_; + $args=~ s/\s+//g; + if ($IRSSI{name} eq $args) { + Irssi::print($help, MSGLEVEL_CLIENTCRAP); + Irssi::signal_stop(); + } +} + +sub sig_setup_changed { + $base_uri= Irssi::settings_get_str($IRSSI{name}.'_base_uri'); +} + +Irssi::signal_add('setup changed', \&sig_setup_changed); +Irssi::signal_add('pidwait', \&sig_pidwait); + +Irssi::settings_add_str($IRSSI{name} ,$IRSSI{name}.'_base_uri', 'https://0x0.st/'); + +Irssi::command_bind($IRSSI{name}, \&cmd); +Irssi::command_bind('help', \&cmd_help); +Irssi::command_set_options($IRSSI{name},"p u s c"); + +sig_setup_changed(); |