From 8cf05f46a1fd21aec2ee4d370c3d9218444fe82b Mon Sep 17 00:00:00 2001 From: acidvegas Date: Thu, 15 Jun 2023 20:46:08 -0400 Subject: [PATCH] Added masshl alias's using perlexec --- alias.conf | 40 +-- scripts/perl/perlexec.pl | 38 +++ scripts/perl/query_blocker.pl | 469 ++++++++++++++++++++++++++++++++++ 3 files changed, 528 insertions(+), 19 deletions(-) create mode 100644 scripts/perl/perlexec.pl create mode 100644 scripts/perl/query_blocker.pl diff --git a/alias.conf b/alias.conf index 16ef50e..6845d2a 100644 --- a/alias.conf +++ b/alias.conf @@ -87,25 +87,27 @@ sn_move = "masshl %n: 1,8/!\08,04 WARNING 1,8/!\ 04This channel has moved sn_gold = "say You must have a SuperNETs 8,7GOLD account to view this message." # Useful -chatsize = "say ${info:term_height} lines, ${info:term_width} characters" -clear = "buffer clear" -close = "buffer close" -collapse = "allchan -current /buffer hide; /allpv -current /buffer hide" -colors = "say 1,00001,01011,02021,03031,04041,05051,06061,07071,08081,09091,10101,11111,12121,13131,14141,1515 ; say 1,16161,17171,18181,19191,20201,21211,22221,23231,24241,25251,26261,2727 ; say 1,28281,29291,30301,31311,32321,33331,34341,35351,36361,37371,38381,3939 ; say 1,40401,41411,42421,43431,44441,45451,46461,47471,48481,49491,50501,5151 ; say 1,52521,53531,54541,55551,56561,57571,58581,59591,60601,61611,62621,6363 ; say 1,64641,65651,66661,67671,68681,69691,70701,71711,72721,73731,74741,7575 ; say 1,76761,77771,78781,79791,80801,81811,82821,83831,84841,85851,86861,8787 ; say 1,88881,89891,90901,91911,92921,93931,94941,95951,96961,97971,98981,9999;" -exempt = "mode +eI *!*@*.acid.vegas *!*@*.acid.vegas" -gh = "say https://github.com/$*" -harchats = "set irc.server.$server.anti_flood_prio_high 0 ; /set irc.server.$server.anti_flood_prio_low 0" -log = "/set logger.level.irc.$server.$channel 9" -dontlog = "/set logger.level.irc.$server.$channel 0" -msgbuf = "command -buffer $1 * /input send $2-" -ns_ident = "msg NickServ IDENTIFY ${sec.data.${server}}" -ns_setup = "msg NickServ ACCESS ADD *@big.dick.acid.vegas; msg NickServ CERT ADD; msg NickServ SET AUTOOP ON; msg NickServ SET HIDE EMAIL ON; msg NickServ SET HIDE STATUS ON; msg NickServ SET HIDE USERMASK ON; msg NickServ SET HIDE QUIT ON; msg NickServ SET KEEPMODES ON; msg NickServ SET KILL QUICK; msg NickServ SET PRIVATE ON; msg NickServ SET SECURE ON" -redraw = "color reset;window refresh" -say = "msg *" -softchats = "set irc.server.$server.anti_flood_prio_high 2 ; /set irc.server.$server.anti_flood_prio_low 2" -uncollapse = "allchan -current /buffer unhide; /allpv -current /buffer unhide" -v = "voice * -yes" -wx = "who * n%nc" +allusers = "/perlexec my $b=$buffer\; my $i=weechat::infolist_get("irc_nick", "", weechat::buffer_get_string($b, "localvar_server").",".weechat::buffer_get_string($b, "localvar_channel"))\; my $s\; while(weechat::infolist_next($i)){ $s.=weechat::infolist_string($i, "name")." "\; } weechat::command($b, "$* $s")\; weechat::infolist_free($i)\;" +chatsize = "say ${info:term_height} lines, ${info:term_width} characters" +clear = "buffer clear" +close = "buffer close" +collapse = "allchan -current /buffer hide; /allpv -current /buffer hide" +colors = "say 1,00001,01011,02021,03031,04041,05051,06061,07071,08081,09091,10101,11111,12121,13131,14141,1515 ; say 1,16161,17171,18181,19191,20201,21211,22221,23231,24241,25251,26261,2727 ; say 1,28281,29291,30301,31311,32321,33331,34341,35351,36361,37371,38381,3939 ; say 1,40401,41411,42421,43431,44441,45451,46461,47471,48481,49491,50501,5151 ; say 1,52521,53531,54541,55551,56561,57571,58581,59591,60601,61611,62621,6363 ; say 1,64641,65651,66661,67671,68681,69691,70701,71711,72721,73731,74741,7575 ; say 1,76761,77771,78781,79791,80801,81811,82821,83831,84841,85851,86861,8787 ; say 1,88881,89891,90901,91911,92921,93931,94941,95951,96961,97971,98981,9999;" +exempt = "mode +eI *!*@*.acid.vegas *!*@*.acid.vegas" +foreachuser = "/perlexec my $b=$buffer\; my $i=weechat::infolist_get("irc_nick", "", weechat::buffer_get_string($b, "localvar_server").",".weechat::buffer_get_string($b, "localvar_channel"))\; while(weechat::infolist_next($i)){ weechat::command($b, "$* ".weechat::infolist_string($i, "name"))\; } weechat::infolist_free($i)\;" +gh = "say https://github.com/$*" +harchats = "set irc.server.$server.anti_flood_prio_high 0 ; /set irc.server.$server.anti_flood_prio_low 0" +log = "/set logger.level.irc.$server.$channel 9" +dontlog = "/set logger.level.irc.$server.$channel 0" +msgbuf = "command -buffer $1 * /input send $2-" +ns_ident = "msg NickServ IDENTIFY ${sec.data.${server}}" +ns_setup = "msg NickServ ACCESS ADD *@big.dick.acid.vegas; msg NickServ CERT ADD; msg NickServ SET AUTOOP ON; msg NickServ SET HIDE EMAIL ON; msg NickServ SET HIDE STATUS ON; msg NickServ SET HIDE USERMASK ON; msg NickServ SET HIDE QUIT ON; msg NickServ SET KEEPMODES ON; msg NickServ SET KILL QUICK; msg NickServ SET PRIVATE ON; msg NickServ SET SECURE ON" +redraw = "color reset;window refresh" +say = "msg *" +softchats = "set irc.server.$server.anti_flood_prio_high 2 ; /set irc.server.$server.anti_flood_prio_low 2" +uncollapse = "allchan -current /buffer unhide; /allpv -current /buffer unhide" +v = "voice * -yes" +wx = "who * n%nc" [completion] msgbuf = "%(buffers_plugins_names)" \ No newline at end of file diff --git a/scripts/perl/perlexec.pl b/scripts/perl/perlexec.pl new file mode 100644 index 0000000..0490a76 --- /dev/null +++ b/scripts/perl/perlexec.pl @@ -0,0 +1,38 @@ +# perlexec.pl by ArZa : Execute perl code + +# This program is free software: you can modify/redistribute it under the terms of +# GNU General Public License by Free Software Foundation, either version 3 or later +# which you can get from . +# This program is distributed in the hope that it will be useful, but without any warranty. + +weechat::register("perlexec", "ArZa ", "0.1", "GPL3", "Execute perl code", "", ""); +weechat::hook_command("perlexec", "Execute perl code", "[code]", + "Executes perl code given as an argument or creates a buffer for execution if not given an argument.\n\n". + "Code is anything like in a weechat perl script, executed in one block.\n\n". + "\$buffer is predefined as a pointer for the buffer where this command is executed.\n\n". + "For example, close current buffer if it's a query:\n". + " /perlexec weechat::buffer_close(\$buffer) if weechat::buffer_get_string(\$buffer, \"localvar_type\") eq \"private\";", + "", "perlexec", ""); + +sub perlexec { # the command + if($_[2]){ # if got an argument + my $buffer=$_[1]; + eval($_[2]); # execute + }else{ + my $buffer=weechat::buffer_search("perl", "perlexec"); # find the buffer + if(!$buffer){ # if not found + $buffer=weechat::buffer_new("perlexec", "buffer_input", "", "", ""); # create it + weechat::buffer_set($buffer, "title", "Perl execution buffer"); # set title + } + if(weechat::current_buffer() eq $buffer){ weechat::buffer_close($buffer); } # if we already are in the buffer, close it + else{ weechat::buffer_set($buffer, "display", 1); } # otherwise, switch to it + } + return weechat::WEECHAT_RC_OK; +} + +sub buffer_input { # input in the buffer + my $buffer=$_[1]; + weechat::print($buffer, "> ".$_[2]); # print + eval($_[2]); # execute + return weechat::WEECHAT_RC_OK; +} diff --git a/scripts/perl/query_blocker.pl b/scripts/perl/query_blocker.pl new file mode 100644 index 0000000..869163c --- /dev/null +++ b/scripts/perl/query_blocker.pl @@ -0,0 +1,469 @@ +# ----------------------------------------------------------------------------- +# +# query_blocker.pl - Simple blocker for private messages (i.e. spam). +# +# ----------------------------------------------------------------------------- +# Copyright (c) 2009 by rettub +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# ----------------------------------------------------------------------------- +# +# Simple IRC query blocker. +# - requires WeeChat 0.3.0 or newer +# - suggests perl script newsbar +# +# Got inspiration from (xchat script): +# GodOfGTA's Query-Blocker (eng) 1.2.3 +# http://home.arcor.de/godofgta/xchat/queryblocker-eng.pl +# +# ----------------------------------------------------------------------------- +# Download: +# http://github.com/rettub/weechat-plugins/raw/master/perl/query_blocker.pl +# ----------------------------------------------------------------------------- +# Changelog: +# +BEGIN { # Changelog for last version: + # changelog entries strating with '#' at beginning of line + # sry for unconventional, but I thing users should be able to browse + # last changes. Simply do '/newsbar changelog' out of weechat + + sub changelog { + # changelog entries starting with '#' below + my $clog = < "off", + "quiet" => 'off', + "show_hint" => 'on', + "whitelist" => "qb-whitelist.txt", + "auto_message" => "Right now I ignore all queries - perhaps not all :)", + "auto_message_prefix" => "Auto-Message: ", +); + +# FIXME store server too? +my $Last_query_nick = undef; +my $Deny_message = ""; + +sub DEBUG {weechat::print('', "***\t" . $_[0]);} + +# {{{ helpers +# +# irc_nick_find_color: find a color for a nick (according to nick letters) +# (ported to perl from WeeChats source) +sub irc_nick_find_color +{ + my $color = 0; + foreach my $c (split(//, $_[0])) + { + $color += ord($c); + } + $color = ($color % + weechat::config_integer (weechat::config_get ("weechat.look.color_nicks_number"))); + + my $color_name = sprintf("chat_nick_color%02d", $color + 1); + + return weechat::color ($color_name); +} +# }}} + +my %Blocked = (); +my %Allowed = (); + +sub nick_allowed { return exists $Allowed{ lc $_[0] }; } + +sub whitelist_read { + my $whitelist = weechat::config_get_plugin( "whitelist" ); + return unless -e $whitelist; + open (WL, "<", $whitelist) || DEBUG("$whitelist: $!"); + while () { + chomp; + $Allowed{$_} = 1 if length $_; + } + close WL; +} + +sub whitelist_save { + my $whitelist = weechat::config_get_plugin( "whitelist" ); + open (WL, ">", $whitelist) || DEBUG("write whitelist: $!"); + print WL "$_\n" foreach ( sort { "\L$a" cmp "\L$b" } keys %Allowed ); + close WL; +} + +# newsbar api staff {{{ +sub info2newsbar { + my ( $color, $category, $server, $nick, $message ) = @_; + + weechat::command( '', + "/newsbar add --color $color $category\t" + . irc_nick_find_color($nick) + . $nick + . weechat::color('reset') . '@' + . irc_nick_find_color($server) + . $server + . weechat::color('reset') + . weechat::color('bold') + . " tries to start a query: " + . weechat::color('reset') + . $message ); + weechat::command( '', + "/newsbar add --color $color $category\t" + . "To allow the query, type: " + . "/$COMMAND add $nick" ) unless (weechat::config_get_plugin('show_hint') eq 'off'); +} + +sub newsbar { + my $info_list = weechat::infolist_get( "perl_script", "name", "newsbar" ); + weechat::infolist_next($info_list); + + return weechat::infolist_string( $info_list, "name" ) eq 'newsbar'; +} +#}}} + +sub info_as_notice { + my ( $server, $my_nick, $nick, $message ) = @_; + + weechat::command( '', "/notice -server $server $my_nick $nick Tries to start a query: $message" ); + weechat::command( '', "/notice -server $server $my_nick $nick To allow the query type: /$COMMAND add $nick" ) + unless (weechat::config_get_plugin('show_hint') eq 'off'); +} + +sub modifier_irc_in_privmsg { + my ( $data, $signal, $server, $arg ) = @_; + + my $my_nick = weechat::info_get( 'irc_nick', $server ); + + if ( $arg =~ m/:(.+?)\!.+? PRIVMSG $my_nick :(\w.*)/ ) { + my $query_nick = $1; + my $query_msg = $2; + + # if nick is allowed to send queries, let WeeChat handle the query + return $arg if nick_allowed($query_nick); + + $Last_query_nick = $query_nick; + + unless ( exists $Blocked{$query_nick} ) { + unless (weechat::config_get_plugin('quiet') eq 'on') { + if ( newsbar() ) { + info2newsbar( 'lightred', '[QUERY-WARN]', $server, $query_nick, $query_msg ); + } else { + info_as_notice( $server, $my_nick, $query_nick, $query_msg ); + } + } + + # auto responce msg to query_nick + my $msg = $Deny_message; + $msg =~ s/%N/$query_nick/g; + weechat::command( '', "/msg -server $server $query_nick $msg " ); + $Blocked{$query_nick} = 0; + } + $Blocked{$query_nick}++; + } else { + return $arg; + } + + # return empty string - don't create a new buffer + return ''; +} + +sub _add { + my $arg = shift; + + if ( defined $arg ) { + foreach ( split( / +/, $arg ) ) { + $Last_query_nick = undef if ( defined $Last_query_nick and $_ eq $Last_query_nick ); + $Allowed{$_} = 1; + delete $Blocked{$_}; + weechat::print( '', "Allow queries for: '" . irc_nick_find_color($_) . $_ . weechat::color('reset') . "'"); + } + whitelist_save(); + } elsif ( defined $Last_query_nick and not exists $Allowed{$Last_query_nick} ) { + $Allowed{$Last_query_nick} = 1; + delete $Blocked{$Last_query_nick}; + weechat::print( '', "Allow queries for: '" . irc_nick_find_color($Last_query_nick) . $Last_query_nick . weechat::color('reset') . "'"); + $Last_query_nick = undef; + whitelist_save(); + # FIXME: open query window + } else { + weechat::print( '', "There is no nick to be added to the whitelist"); + } +} + +# handle hooks {{{ +{ +my %Hooks; + +sub qb_hooked { %Hooks }; + +sub qb_hook { + return 1 if qb_hooked(); + + $Hooks{query} = weechat::hook_command_run( '/query *', 'qb_query', "" ); + $Hooks{msg} = weechat::hook_command_run( '/msg *', 'qb_msg', "" ); + $Hooks{modifier} = weechat::hook_modifier( "irc_in_privmsg", "modifier_irc_in_privmsg", "" ); + + # FIXME handle hook errors (hook_ returns NULL := '') + DEBUG("cant hook command '/query'") if $Hooks{query} eq ''; + DEBUG("cant hook command '/msg'") if $Hooks{msg} eq ''; + DEBUG("cant hook modifier 'irc_in_privmsg'") if $Hooks{modifier} eq ''; + + return 0; +} + +sub qb_unhook { + return 1 unless qb_hooked(); + + # FIXME handle hook errors (hook_ returns NULL := '') + weechat::unhook( $Hooks{query} ); + weechat::unhook( $Hooks{msg} ); + weechat::unhook( $Hooks{modifier} ); + undef %Hooks; + + return 0; +} +} # }}} + +sub toggled_by_set { + my ( $script, $option, $value ) = @_; + + if ( $value ne 'on' ) { # all values different to 'on' will disable blocking + if ( $value ne 'off' ) { + weechat::config_set_plugin( $option, "off" ); + DEBUG("wrong value for option '$option', falling back to 'off'"); + } + if ( qb_hooked() ) { # enabled? + qb_unhook(); + weechat::print( '', "$COMMAND: disabled" ); + } else { + weechat::print( '', "$COMMAND: already disabled" ); + } + } else { # enable blocking + unless ( qb_hooked() ) { + qb_hook(); + weechat::print( '', "$COMMAND: private messages will be blocked" ); + } else { + weechat::print( '', "$COMMAND: private messages already blocked" ); + } + } + + return weechat::WEECHAT_RC_OK; +} + +sub query_blocker { + my ( $data, $buffer, $args ) = ( $_[0], $_[1], $_[2] ); + + if ( $args =~ /^o(n|ff)$/ ) { + weechat::config_set_plugin( 'block_queries', $args ); + } elsif ( $args eq 'status' ) { + if ( weechat::config_get_plugin( 'block_queries') eq 'on' ) { + weechat::print( '', "$COMMAND: private messages will be blocked"); + } else { + weechat::print( '', "$COMMAND: disabled"); + } + } elsif ( $args eq 'reload' ) { + whitelist_read(); + } elsif ( $args eq 'changelog' ) { + changelog(); + } else { + my ( $cmd, $arg ) = ( $args =~ /(.*?)\s+(.*)/ ); + $cmd = $args unless $cmd; + if ( $cmd eq 'list' ) { + if ( defined $arg and $arg eq 'last' ) { + if (defined $Last_query_nick) { + weechat::print( '', "Last blocked nick: '" . irc_nick_find_color($Last_query_nick) . $Last_query_nick . weechat::color('reset') . "'"); + } else { + weechat::print( '', "No blocked nicks"); + } + } else { + my $n = keys %Allowed; + weechat::print( '', "Allowed nicks for queries ($n):" ); + foreach ( sort { "\L$a" cmp "\L$b" } keys %Allowed ) { + weechat::print( '', " " . irc_nick_find_color($_) . $_ ); + } + } + } elsif ( $cmd eq 'blocked' ) { + if ( keys %Blocked ) { + if ( defined $arg and $arg eq 'clear' ) { + foreach ( sort { "\L$a" cmp "\L$b" } keys %Blocked ) { + weechat::print( '', "Removing blocked state from" . irc_nick_find_color($_) . $_ ); + delete $Blocked{$_}; + } + } else { + weechat::print( '', "Queries of this nicks have been blocked:" ); + foreach ( sort { "\L$a" cmp "\L$b" } keys %Blocked ) { + weechat::print( '', " " . irc_nick_find_color($_) . $_ . weechat::color('reset') . " (#$Blocked{$_})"); + } + } + } else { + weechat::print( '', "No nicks have been blocked" ); + } + } elsif ( $cmd eq 'add' ) { + _add($arg); + }elsif ( $cmd eq 'del' and defined $arg ) { + foreach ( split( / +/, $arg ) ) { + if (exists $Allowed{$_} ) { + delete $Allowed{$_}; + weechat::print( '', "Nick removed from whitelist: '" . irc_nick_find_color($_) . $_ . weechat::color('reset') . "'"); + } else { + weechat::print( '', "Can't remove nick, not in whitelist: '" . irc_nick_find_color($_) . $_ . weechat::color('reset') . "'"); + } + } + whitelist_save(); + } + } + return weechat::WEECHAT_RC_OK; +} + +sub _get_nick { + my ($l) = shift; + $l =~ s/\/(query|msg) +//; + + if ($l =~ /-server/ ) { + $l =~ s/-server \w+ //; + } + + $l =~ s/ .*$//; + + return $l; +} + +sub qb_query { + my $n = _get_nick($_[2]); + _add($n) unless nick_allowed($n); + + return weechat::WEECHAT_RC_OK; +} + +# add nick as allowed if responce isn't auto reply +sub qb_msg { + my ($msg) = $_[2] =~ /^\/msg -server .*?\s.*?\s(.*)/; + my $n = _get_nick($_[2]); + my $prefix = weechat::config_get_plugin('auto_message_prefix'); + + _add($n) unless nick_allowed($n) or $msg =~ /^$prefix/; + + return weechat::WEECHAT_RC_OK; +} + +# ----------------------------------------------------------------------------- +# +if ( weechat::register( $SCRIPT, $AUTHOR, $VERSION, $LICENSE, $DESCRIPTION, "", "" ) ) { + weechat::hook_command( $COMMAND, $DESCRIPTION, $ARGS_HELP, $CMD_HELP, $COMPLETITION, $CALLBACK, "" ); + + # FIXME [bug #27936] + if ( weechat::config_get_plugin("whitelist") eq '' ) { + my $wd = weechat::info_get( "weechat_dir", "" ); + $wd =~ s/\/$//; + weechat::config_set_plugin( "whitelist", $wd . "/" . $SETTINGS{"whitelist"} ); + } + while ( my ( $option, $default_value ) = each(%SETTINGS) ) { + weechat::config_set_plugin( $option, $default_value ) + if weechat::config_get_plugin($option) eq ""; + } + $Deny_message = weechat::config_get_plugin('auto_message_prefix') . weechat::config_get_plugin('auto_message'); + whitelist_read(); + weechat::print( '', "$COMMAND: loaded whitelist '" . weechat::config_get_plugin( "whitelist" ) . "'"); + + weechat::hook_config( "plugins.var.perl.$SCRIPT.block_queries", 'toggled_by_set', $SCRIPT ); + + if (weechat::config_get_plugin('block_queries') eq "on") { + qb_hook(); + weechat::print( '', "$COMMAND: private messages will be blocked"); + } else { + weechat::print( '', "$COMMAND: disabled"); + } +} + +# vim: ai ts=4 sts=4 et sw=4 tw=0 foldmethod=marker :