diff --git a/web_link_saver/img_url_myapi.pl b/web_link_saver/img_url_myapi.pl new file mode 100644 index 0000000..6dc9b01 --- /dev/null +++ b/web_link_saver/img_url_myapi.pl @@ -0,0 +1,290 @@ +use HexChat qw(:all); + +use strict; +use warnings "all"; +use HTTP::Tiny; +use utf8; + +binmode STDOUT, ':utf8'; +binmode STDERR, ':utf8'; + +sub hookfn; +sub loadliststatus($); +sub loadlist($); +sub savelist(@); +sub savesetting(@); +sub freehooks; + +my $script_name = "img_url_myapi.pl"; +HexChat::register($script_name, '0.1', 'Automatically stores URLs to myapi', \&freehooks); + +HexChat::print("$script_name loaded\n"); +my $help = 'Usage: +/dl enable nick|domain - enable nick or domain blacklist +/dl disable nick|domain - disable nick or domain blacklist +/dl add nick|domain - adds nick or domain to apropriate blacklist +/dl del nick|domain - removes nick or domain from apropriate blacklist +/dl show - show blacklists +/dl info - same as above +'; +my @hooks; +push @hooks, HexChat::hook_print('Channel Message', \&hookfn); +push @hooks, HexChat::hook_print('Channel Msg Hilight', \&hookfn); +push @hooks, HexChat::hook_print('Channel Action', \&hookfn); +push @hooks, HexChat::hook_print('Channel Action Hilight', \&hookfn); +push @hooks, HexChat::hook_command('dl', \&dl_cmd); + + +sub hookfn { + my ($nick, $text, $modechar) = @{$_[0]}; + my $nicklist = loadliststatus('dl_nicklist'); + + if ($nicklist != 0) { + my @nicklist = loadlist('dl_nicks'); + + foreach (@nicklist) { + next unless(defined($_)); + next if($_ eq ''); + + if ($_ eq $nick) { + undef $nick; undef $text; undef $modechar; + undef $nicklist; + @nicklist = -1; undef @nicklist; + return HexChat::EAT_NONE; + } + } + + @nicklist = -1; undef @nicklist; + } + + undef $nicklist; + + my @words = split(/\s+/, $text); + + foreach (@words) { + my $str = $_; + next unless(substr($str, 0, 4) eq 'http'); + +# disregard idn, until it cause real troubles :) + if ($str =~ m{https?://([a-zA-Z0-9\.\-_]+\.[a-zA-Z]+)/(?:.*)}) { + my $domain = $1; + my $domainlist = loadliststatus('dl_domainlist'); + + if ($domainlist != 0) { + my @domainlist = loadlist('dl_domains'); + + foreach (@domainlist) { + next unless(defined($_)); + next if($_ eq ''); + + if ($_ eq $domain) { + undef $nick; undef $text; undef $modechar; + @words = -1; undef @words; + undef $str; undef $domain; + undef $domainlist; + @domainlist = -1; undef @domainlist; + return HexChat::EAT_NONE; + } + } + + @domainlist = -1, undef @domainlist; + } + + undef $domainlist; + + my $http2 = HTTP::Tiny->new(default_headers => { 'url' => $str }); + $http2->get('http://localhost/api/image_dl'); + $http2 = undef; undef $http2; + } + } + + @words = -1; undef @words; + undef $nick; undef $text; undef $modechar; + + return HexChat::EAT_NONE; +} + +sub loadliststatus($) { + my $listtype = shift; + my $list = HexChat::plugin_pref_get($listtype); + + unless (defined($list)) { + savesetting('list', '0'); + $list = 0; + } + + undef $listtype; + return $list; +} + +sub loadlist($) { + my $setting = shift; + my $val = HexChat::plugin_pref_get($setting); + + unless (defined($val)) { + savesetting($setting, encode_base64('', '')); + $val = ''; + } + + my @values = map { decode_base64($_); } split(/ /, $val); + undef $setting; undef $val; + return @values; +} + +sub savelist(@) { + my $setting = shift; + my @list = map { encode_base64($_, ''); } @_; + my $value = join(' ', @list); + @list = -1; undef @list; + return savesetting($setting, $value); +} + +sub savesetting(@) { + my $setting = shift; + my $value = shift; + + if (HexChat::plugin_pref_set($setting, $value) == 0) { + HexChat::printf("Unable to save settings for %s\n", $script_name); + undef $setting; undef $value; + return undef; + } + + undef $setting; + return 1; +} + +sub dl_cmd { + shift(@{$_[0]}); + my $cmd = shift(@{$_[0]}); + my $entity = shift(@{$_[0]}); + my $value = join(' ', @{$_[0]}); + HexChat::print("\n"); + my $msg = undef; + + if (defined($cmd)) { + if ($cmd eq 'enable') { + if($entity eq 'nick') { + if (defined(savesetting('dl_nicklist', '1'))) { + $msg = "Nicks blacklist now enabled\n"; + } + } elsif ($entity eq 'domain') { + if (defined(savesetting('dl_domainlist', '1'))) { + $msg = "Domains blacklist now enabled\n"; + } + } + } elsif ($cmd eq 'disable') { + if($entity eq 'nick') { + if (defined(savesetting('dl_nicklist', '0'))) { + $msg = "Nicks blacklist now disabled\n"; + } + } elsif ($entity eq 'domain') { + if (defined(savesetting('dl_domainlist', '0'))) { + $msg = "Domains blacklist now disabled\n"; + } + } + } elsif (($cmd eq 'show') or ($cmd eq 'info')) { + $msg = ''; + + if (loadliststatus('dl_nicklist') == 0) { + $msg .= "Nicks blacklist: disabled\n"; + } else { + $msg .= "Nicks blacklist: enabled\n"; + } + + $msg .= "Blacklisted nicks = " . join( ', ', loadlist('dl_nicks')) ."\n"; + + if (loadliststatus('dl_domainlist') == 0) { + $msg .= "Domains blacklist: disabled\n"; + } else { + $msg .= "Domains blacklist: enabled\n"; + } + + $msg .= "Blacklisted domains = " . join( ', ', loadlist('dl_domains')) . "\n"; + } elsif ($cmd eq 'add') { + if ((defined($entity)) and (defined($value))) { + if ($entity eq 'nick') { + my @nicks = (loadlist('dl_nicks'), $value); + + unless (defined(savelist('dl_nicks', @nicks))) { + undef $cmd; undef $entity; undef $value; undef $msg; + @nicks = -1; undef @nicks; + return HexChat::EAT_ALL; + } + + $msg = sprintf("Nicks blacklist now: %s\n", join(', ', @nicks)); + @nicks = -1; undef @nicks; + } elsif ($entity eq 'domain') { + my @domains = (loadlist('dl_domains'), $value); + + unless (defined(savelist('dl_domains', @domains))) { + undef $cmd; undef $entity; undef $value; undef $msg; + @domains = -1; undef @domains; + return HexChat::EAT_ALL; + } + + $msg = sprintf("Domains blacklist now: %s\n", join(', ', @domains)); + @domains = -1; undef @domains; + } + } + } elsif ($cmd eq 'del') { + if ((defined($entity)) and (defined($value))) { + if ($entity eq 'nick') { + my @list = loadlist('dl_nicks'); + my @nicklist; + + foreach (@list) { + next if ($_ eq $value); + push @nicklist, $_; + } + + @list = -1; undef @list; + + unless (defined(savelist('dl_nicks', @nicklist))) { + undef $cmd; undef $entity; undef $value; undef $msg; + @nicklist = -1; undef @nicklist; + return HexChat::EAT_ALL; + } + + $msg = sprintf("Nicks blacklist now: %s\n", join(', ', @nicklist)); + @nicklist = -1; undef @nicklist; + } elsif ($entity eq 'domain') { + my @list = loadlist('dl_domains'); + my @domainlist; + + foreach (@list) { + next if ($_ eq $value); + push @domainlist, $_; + } + + @list = -1; undef @list; + + unless (defined(savelist('dl_domains', @domainlist))) { + undef $cmd; undef $entity; undef $value; undef $msg; + @domainlist = -1; undef @domainlist; + return HexChat::EAT_ALL; + } + + $msg = sprintf("Domains blacklist now: %s\n", join(', ', @domainlist)); + @domainlist = -1; undef @domainlist; + } + } + } + } + + unless(defined($msg)) { + HexChat::print($help); + } else { + HexChat::print($msg); + } + + undef $cmd; undef $entity; undef $value; undef $msg; + return HexChat::EAT_ALL; +} + +sub freehooks { + foreach (@hooks) { + HexChat::unhook($_); + } + + return HexChat::EAT_ALL; +}