#!/usr/bin/perl
#
# Query-Blocker
###########################################################################
# Placed in the public domain.
###########################################################################
# Needs xchat, should work with any version > 1.6.3, tested with 1.6.3; 1.6.6; 1.6.10
#
my $script_name = "Query-Manager";
my $script_version = '1.0.0 En';
my $script_Date = '12.2002';
$homedir = $ENV{'HOME'};
#
IRC::register($script_name,$script_version, "", "");
IRC::print("\cC12\cB$script_name\cB Version\cC3 $script_version\cO by \cB\cC4C\cC7obra-x\cO loading...\n");
IRC::print "/QMHELP for more information\n";
#
# Global Variables
#
$homedir = $ENV{'HOME'};
@lstqnick;
@lstqtime=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@lstqflood=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
$stms1="is now \cBaktive.\cO\n";
$stms2="is now \cBinaktive.\cO\n";
$qbst="\cC3<\cC4Query-Manager\cC3>\cO\11";
#
# Settings for modified
#
$mtfl=20; # Time difference in SEC who say FLood
$mxfl=5; # Maximum Floods in relevant time
$QBLW="QM-Log"; #Logging Window
$play_cmd = "play";
$play_file = "C:\Program Files\X-Chat 2\plugins\.xchat\notify.wav";
$qmnn_sound = 1; # NickSond Standard = on
$QBMessage = "I don't accepting private messages or dialogs at this time. Please talk with me in the public channel. { Automessage }";
#
# Handler
#
IRC::add_command_handler("qb", "qb_on_off_cmdhandler");
IRC::add_command_handler("qbflip", "qb_flipflop_cmdhandler");
IRC::add_command_handler("qmstat", "qm_status_cmdhandler");
IRC::add_command_handler("qbadduser", "adduser_cmdhandler");
IRC::add_command_handler("qbremuser", "remuser_cmdhandler");
IRC::add_command_handler("qbloglist", "qblog_cmdhandler");
IRC::add_command_handler("qbulist", "qbloguserlist_cmdhandler");
IRC::add_command_handler("nsn", "nicksound_cmdhandler");
IRC::add_command_handler("qmhelp", "qmhelp_cmdhandler");
#
IRC::add_message_handler("PRIVMSG", "privmsg_cntl_handler");
#
# Direct Routines
#
sub qb_on_off_cmdhandler {
my $state = shift;
if (uc $state eq 'ON' ){
system("rm -f $homedir/.xchat/.privoff");
IRC::print("$qbst\cC7,0Query Blocker $stms1");
return 1;
} else {
if (uc $state eq 'OFF'){
system("touch $homedir/.xchat/.privoff");
IRC::print("$qbst\cC7,0Query Blocker $stms2");
return 1;
}
}
IRC::print("$qbst\cC7,0Syntax: QB [ON/OFF]");
return 1;
}
sub qb_flipflop_cmdhandler {
if(-e "$homedir/.xchat/.privoff") {
system("rm -f $homedir/.xchat/.privoff");
IRC::print("$qbst\cC7,0Query Blocker $stms1"); }
else {
system("touch $homedir/.xchat/.privoff");
IRC::print("$qbst\cC7,0Query Blocker $stms2"); }
return 1;
}
sub qm_status_cmdhandler {
if(-e "$homedir/.xchat/.privoff") { IRC::print("$qbst\cC7,0Query-Blocker are\cB inaktive.\n"); }
else { IRC::print("$qbst\cC7,0Query-Blocker are\cB aktive.\n");}
if ($qmnn_sound){ IRC::print("$qbst\cC7,0Nick Sound Notify are\cB aktive.\n");}
else { IRC::print("$qbst\cC7,0Nick Sound Notify are\cB inaktive.\n");}
return 1;
}
sub adduser_cmdhandler {
# Add user to whitelist
# Add user (C) 2002 Christopher MacGown
system("touch C:\Program Files\X-Chat 2\plugins\.xchat\whitelist"); # Ensure whitelist exists
open(WHITELIST, ">>$homedir/.xchat/whitelist") || die "Cannot open ~/.xchat/whitelist\n";
print WHITELIST $_[0],"\n";
close WHITELIST;
IRC::print("$qbst\cC7,0\cB$_[0]\cB added.\n");
check_whitelist();
return 1;
}
sub remuser_cmdhandler {
# Remove User from whitelist
# Rem User (C) 2002 Christopher MacGown
$remove = $_[0];
chomp($remove);
open(WHITELIST, "<$homedir/.xchat/whitelist") || die "Cannot open ~/whitelist\n";
@whitelist="";
while ( defined ($Ruser = )) {
chomp($Ruser);
if (lc($Ruser) eq lc($remove)){
IRC::print("$qbst\cC7,0\cB$Ruser\cB removed.\n");
} else {
push(@whitelist,$Ruser);
}
}
close WHITELIST;
open(WHITELIST, ">$homedir/.xchat/whitelist") || die "Cannot open ~/.xchat/whitelist\n";
foreach $QUser (@whitelist) {
if($QUser eq "" || $QUser eq "\0" || $QUser eq "\n") { ;;
} else {
print WHITELIST $QUser, "\n";
}
}
close WHITELIST;
check_whitelist();
return 1;
}
sub qblog_cmdhandler {
IRC::command("/query $QBLW");
IRC::print_with_channel("$qbst Qyerylogtest End","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[32]\0032>\00316\011 $lstqtime[32] $lstqflood[32] QB-Log 32\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[31]\0032>\00316\011 $lstqtime[31] $lstqflood[31] QB-Log 31\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[30]\0032>\00316\011 $lstqtime[30] $lstqflood[30] QB-Log 30\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[29]\0032>\00316\011 $lstqtime[29] $lstqflood[29] QB-Log 29\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[28]\0032>\00316\011 $lstqtime[28] $lstqflood[28] QB-Log 28\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[27]\0032>\00316\011 $lstqtime[27] $lstqflood[27] QB-Log 27\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[26]\0032>\00316\011 $lstqtime[26] $lstqflood[26] QB-Log 26\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[25]\0032>\00316\011 $lstqtime[25] $lstqflood[25] QB-Log 25\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[24]\0032>\00316\011 $lstqtime[24] $lstqflood[24] QB-Log 24\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[23]\0032>\00316\011 $lstqtime[23] $lstqflood[23] QB-Log 23\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[22]\0032>\00316\011 $lstqtime[22] $lstqflood[22] QB-Log 22\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[21]\0032>\00316\011 $lstqtime[21] $lstqflood[21] QB-Log 21\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[20]\0032>\00316\011 $lstqtime[20] $lstqflood[20] QB-Log 20\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[19]\0032>\00316\011 $lstqtime[19] $lstqflood[19] QB-Log 19\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[18]\0032>\00316\011 $lstqtime[18] $lstqflood[18] QB-Log 18\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[17]\0032>\00316\011 $lstqtime[17] $lstqflood[17] QB-Log 17\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[16]\0032>\00316\011 $lstqtime[16] $lstqflood[16] QB-Log 16\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[15]\0032>\00316\011 $lstqtime[15] $lstqflood[15] QB-Log 15\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[14]\0032>\00316\011 $lstqtime[14] $lstqflood[14] QB-Log 14\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[13]\0032>\00316\011 $lstqtime[13] $lstqflood[13] QB-Log 13\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[12]\0032>\00316\011 $lstqtime[12] $lstqflood[12] QB-Log 12\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[11]\0032>\00316\011 $lstqtime[11] $lstqflood[11] QB-Log 11\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[10]\0032>\00316\011 $lstqtime[10] $lstqflood[10] QB-Log 10\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[9]\0032>\00316\011 $lstqtime[9] $lstqflood[9] QB-Log 9\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[8]\0032>\00316\011 $lstqtime[8] $lstqflood[8] QB-Log 8\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[7]\0032>\00316\011 $lstqtime[7] $lstqflood[7] QB-Log 7\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[6]\0032>\00316\011 $lstqtime[6] $lstqflood[6] QB-Log 6\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[5]\0032>\00316\011 $lstqtime[5] $lstqflood[5] QB-Log 5\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[4]\0032>\00316\011 $lstqtime[4] $lstqflood[4] QB-Log 4\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[3]\0032>\00316\011 $lstqtime[3] $lstqflood[3] QB-Log 3\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[2]\0032>\00316\011 $lstqtime[2] $lstqflood[2] QB-Log 2\n","$QBLW","");
IRC::print_with_channel("\0032<\00315$lstqnick[1]\0032>\00316\011 $lstqtime[1] $lstqflood[1] QB-Log 1\n","$QBLW","");
IRC::print_with_channel("$qbst Qyerylogtest End","$QBLW","");
return 1;
}
sub qbloguserlist_cmdhandler {
open(DATA, "$homedir/.xchat/whitelist") || die "can't open whitelist\n";
@Whitelist="";
IRC::command("/query $QBLW");
IRC::print_with_channel("$qbst\cC7Akzeptierte Nicks.\cO\n","$QBLW","");
while ( defined ($Ruser = )) {
chomp($Ruser);
push(@Whitelist,$Ruser);
}
close DATA;
foreach $Wuser (@Whitelist) {
IRC::print_with_channel("$Wuser","$QBLW","");
}
IRC::print_with_channel("$qbst\cC7Ende der Liste.\cO\n","$QBLW","");
return 1;
}
sub nicksound_cmdhandler {
my $state = shift;
if (uc $state eq 'ON' ){
IRC::print("$qbst\cC7,0Nick Sound Notify $stms1");
$qmnn_sound = 1;
return 1;
} else {
if (uc $state eq 'OFF'){
IRC::print("$qbst\cC7,0Nick Sound Notify $stms2");
$qmnn_sound = 0;
return 1;
}
}
IRC::print("$qbst\cC7,0Syntax: NSN [ON/OFF]");
return 1;
}
sub qmhelp_cmdhandler {
IRC::print("\cC7 -- Query Manager Help --\n\n");
IRC::print("\cC3 -- Query Blocker --\n");
IRC::print("\cB/QB [ON/OFF]\cB shots on or off the Query Blocker.\n");
IRC::print("\cB/qbflip\cB flip the Query Blocker on or off.\n");
IRC::print("\cB/qmstat\cB shows its Blocker and Nicksound Notify active or not.\n");
IRC::print("\cB/qbadduser [nick]\cB will add a user to your Whitelist.\n");
IRC::print("\cB/qbremuser [nick]\cB will remove a user from your Whitelist.\n");
IRC::print("\cB/qbloglist\cB lists the actual Status in logging.\n");
IRC::print("\cB/qbulist\cB shows the list of accepted Nicks / Users.\n\n");
IRC::print("\cC3 -- Nicksound Notify --\n");
IRC::print("\cB/NSN [ON/OFF]\cB shots on or off the Nicksound Notify.\n");
return 1;
}
sub privmsg_cntl_handler {
local($line) = @_;
$MyName = (IRC::get_info(1));
# check if blocking is turned on or off
if(-e "$homedir/.xchat/.privoff"){
NSN(@_);
return;
} else {
if($line =~ m/:(.+?)\!.+? PRIVMSG $MyName :(.*)/) {
$QUser = $1;
$Umessage = $2;
$Allow = 1;
check_whitelist();
if ($Allow) { block_privmsg();} else {
NSN(@_);
return;
}
}
}
}
#
# Internal Routines
#
sub NSN {
if ($qmnn_sound){
my $mynick = IRC::get_info(1);
$mynick =~ tr/A-Z/a-z/;
my $line = shift(@_);
$line =~ tr/A-Z/a-z/;
if (index($line, $mynick) != -1){system("$play_cmd $play_file &");}
}
}
sub check_whitelist {
# For this to work correctly you want to at least touch a file in your homedirectory
# touch ~/whitelist you can populate this file with a single list of usernames
# which will then be read and if matched will allow that user to privmsg you as normal.
# case isn't important
open(DATA, "$homedir/.xchat/whitelist") || die "can't open whitelist\n";
@Whitelist="";
while ( defined ($Ruser = )) {
chomp($Ruser);
push(@Whitelist,$Ruser);
}
close DATA;
foreach $Wuser (@Whitelist) {
if (lc($QUser) eq lc($Wuser)) {
$Allow = 0;
return;
}
}
}
sub block_privmsg {
$qfld=0;
IRC::command("/query $QBLW");
$QTime=time();
if($QUser eq $lstqnick[30]) {$qtnlst=$lstqtime[30];$qfld=$lstqflood[30];}
if($QUser eq $lstqnick[29]) {$qtnlst=$lstqtime[29];$qfld=$lstqflood[29];}
if($QUser eq $lstqnick[28]) {$qtnlst=$lstqtime[28];$qfld=$lstqflood[28];}
if($QUser eq $lstqnick[27]) {$qtnlst=$lstqtime[27];$qfld=$lstqflood[27];}
if($QUser eq $lstqnick[26]) {$qtnlst=$lstqtime[26];$qfld=$lstqflood[26];}
if($QUser eq $lstqnick[25]) {$qtnlst=$lstqtime[25];$qfld=$lstqflood[25];}
if($QUser eq $lstqnick[24]) {$qtnlst=$lstqtime[24];$qfld=$lstqflood[24];}
if($QUser eq $lstqnick[23]) {$qtnlst=$lstqtime[23];$qfld=$lstqflood[23];}
if($QUser eq $lstqnick[22]) {$qtnlst=$lstqtime[22];$qfld=$lstqflood[22];}
if($QUser eq $lstqnick[21]) {$qtnlst=$lstqtime[21];$qfld=$lstqflood[21];}
if($QUser eq $lstqnick[20]) {$qtnlst=$lstqtime[20];$qfld=$lstqflood[20];}
if($QUser eq $lstqnick[19]) {$qtnlst=$lstqtime[19];$qfld=$lstqflood[19];}
if($QUser eq $lstqnick[18]) {$qtnlst=$lstqtime[18];$qfld=$lstqflood[18];}
if($QUser eq $lstqnick[17]) {$qtnlst=$lstqtime[17];$qfld=$lstqflood[17];}
if($QUser eq $lstqnick[16]) {$qtnlst=$lstqtime[16];$qfld=$lstqflood[16];}
if($QUser eq $lstqnick[15]) {$qtnlst=$lstqtime[15];$qfld=$lstqflood[15];}
if($QUser eq $lstqnick[14]) {$qtnlst=$lstqtime[14];$qfld=$lstqflood[14];}
if($QUser eq $lstqnick[13]) {$qtnlst=$lstqtime[13];$qfld=$lstqflood[13];}
if($QUser eq $lstqnick[12]) {$qtnlst=$lstqtime[12];$qfld=$lstqflood[12];}
if($QUser eq $lstqnick[11]) {$qtnlst=$lstqtime[11];$qfld=$lstqflood[11];}
if($QUser eq $lstqnick[10]) {$qtnlst=$lstqtime[10];$qfld=$lstqflood[10];}
if($QUser eq $lstqnick[9]) {$qtnlst=$lstqtime[9];$qfld=$lstqflood[9];}
if($QUser eq $lstqnick[8]) {$qtnlst=$lstqtime[8];$qfld=$lstqflood[8];}
if($QUser eq $lstqnick[7]) {$qtnlst=$lstqtime[7];$qfld=$lstqflood[7];}
if($QUser eq $lstqnick[6]) {$qtnlst=$lstqtime[6];$qfld=$lstqflood[6];}
if($QUser eq $lstqnick[5]) {$qtnlst=$lstqtime[5];$qfld=$lstqflood[5];}
if($QUser eq $lstqnick[4]) {$qtnlst=$lstqtime[4];$qfld=$lstqflood[4];}
if($QUser eq $lstqnick[3]) {$qtnlst=$lstqtime[3];$qfld=$lstqflood[3];}
if($QUser eq $lstqnick[2]) {$qtnlst=$lstqtime[2];$qfld=$lstqflood[2];}
if($QUser eq $lstqnick[1]) {$qtnlst=$lstqtime[1];$qfld=$lstqflood[1];}
$tmp=$QTime-$qtnlst;
if(($tmp>$mtfl) and ($qfld>0)) {$qfld=$qfld-1;}
if(($tmp>$mtfl*2) and ($qfld>0)) {$qfld=0;}
if($tmp<$mtfl) {
$qfld=$qfld+1;
if($qfld>$mxfl) {
if($qfld<$mxfl+2) {
IRC::command("/ignore $QUser!*@* PRIV");
IRC::send_raw("PRIVMSG $QUser : You Are Ignored by Flood !\n");
IRC::print_with_channel("\cC12<\cO$QUser\cC12>\cO\11\cB\cC4 Ignored by Flood !","$QBLW","");
}
if($qfld>($mxfl*2)) {
if($qfld<($mxfl*2+2)) {
IRC::print_with_channel("\cC12<\cO$QUser\cC12>\cO\11\cB\cC4 Kill by Flood !","$QBLW","");
IRC::command("/Kill $Quser --> Queryflooder");
}
}
}
}
if($QUser ne $lstqnick[1]) {
$lstqnick[30]=$lstqnick[29];$lstqtime[30]=$lstqtime[29];$lstqflood[30]=$lstqflood[29];
$lstqnick[29]=$lstqnick[28];$lstqtime[29]=$lstqtime[28];$lstqflood[29]=$lstqflood[28];
$lstqnick[28]=$lstqnick[27];$lstqtime[28]=$lstqtime[27];$lstqflood[28]=$lstqflood[27];
$lstqnick[27]=$lstqnick[26];$lstqtime[27]=$lstqtime[26];$lstqflood[27]=$lstqflood[26];
$lstqnick[26]=$lstqnick[25];$lstqtime[26]=$lstqtime[25];$lstqflood[26]=$lstqflood[25];
$lstqnick[25]=$lstqnick[24];$lstqtime[25]=$lstqtime[24];$lstqflood[25]=$lstqflood[24];
$lstqnick[24]=$lstqnick[23];$lstqtime[24]=$lstqtime[23];$lstqflood[24]=$lstqflood[23];
$lstqnick[23]=$lstqnick[22];$lstqtime[23]=$lstqtime[22];$lstqflood[23]=$lstqflood[22];
$lstqnick[22]=$lstqnick[21];$lstqtime[22]=$lstqtime[21];$lstqflood[22]=$lstqflood[21];
$lstqnick[21]=$lstqnick[20];$lstqtime[21]=$lstqtime[20];$lstqflood[21]=$lstqflood[20];
$lstqnick[20]=$lstqnick[19];$lstqtime[20]=$lstqtime[19];$lstqflood[20]=$lstqflood[19];
$lstqnick[19]=$lstqnick[18];$lstqtime[19]=$lstqtime[18];$lstqflood[19]=$lstqflood[18];
$lstqnick[18]=$lstqnick[17];$lstqtime[18]=$lstqtime[17];$lstqflood[18]=$lstqflood[17];
$lstqnick[17]=$lstqnick[16];$lstqtime[17]=$lstqtime[16];$lstqflood[17]=$lstqflood[16];
$lstqnick[16]=$lstqnick[15];$lstqtime[16]=$lstqtime[15];$lstqflood[16]=$lstqflood[15];
$lstqnick[15]=$lstqnick[14];$lstqtime[15]=$lstqtime[14];$lstqflood[15]=$lstqflood[14];
$lstqnick[14]=$lstqnick[13];$lstqtime[14]=$lstqtime[13];$lstqflood[14]=$lstqflood[13];
$lstqnick[13]=$lstqnick[12];$lstqtime[13]=$lstqtime[12];$lstqflood[13]=$lstqflood[12];
$lstqnick[12]=$lstqnick[11];$lstqtime[12]=$lstqtime[11];$lstqflood[12]=$lstqflood[11];
$lstqnick[11]=$lstqnick[10];$lstqtime[11]=$lstqtime[10];$lstqflood[11]=$lstqflood[10];
$lstqnick[10]=$lstqnick[9];$lstqtime[10]=$lstqtime[9];$lstqflood[10]=$lstqflood[9];
$lstqnick[9]=$lstqnick[8];$lstqtime[9]=$lstqtime[8];$lstqflood[9]=$lstqflood[8];
$lstqnick[8]=$lstqnick[7];$lstqtime[8]=$lstqtime[7];$lstqflood[8]=$lstqflood[7];
$lstqnick[7]=$lstqnick[6];$lstqtime[7]=$lstqtime[6];$lstqflood[7]=$lstqflood[6];
$lstqnick[6]=$lstqnick[5];$lstqtime[6]=$lstqtime[5];$lstqflood[6]=$lstqflood[5];
$lstqnick[5]=$lstqnick[4];$lstqtime[5]=$lstqtime[4];$lstqflood[5]=$lstqflood[4];
$lstqnick[4]=$lstqnick[3];$lstqtime[4]=$lstqtime[3];$lstqflood[4]=$lstqflood[3];
$lstqnick[3]=$lstqnick[2];$lstqtime[3]=$lstqtime[2];$lstqflood[3]=$lstqflood[2];
$lstqnick[2]=$lstqnick[1];$lstqtime[2]=$lstqtime[1];$lstqflood[2]=$lstqflood[1];
}
$lstqnick[1]=$QUser;$lstqtime[1]=$QTime;$lstqflood[1]=$qfld;
if(($qfld>$mxfl) or ($Umessage =~ m/no Query/) or ($Umessage =~ m/Query its off/) or ($Umessage =~ m/Pager/)) { return 1 } else {
IRC::send_raw("PRIVMSG $QUser : $QBMessage\r\n");
IRC::command("/query $QBLW");
IRC::print_with_channel("\0032<\cO$QUser\0032>\cO\11$Umessage\n","$QBLW","");
return 1;
}
}