#!/usr/bin/perl
#
#SCRIPT: XNatChat.pl
#
#VERSIONE: 0.1
#
#AUTORE:
# Vittorio Zuccala' (nathanvi)
# perlmonk@nathanvi.it
#
#LICENZA
#Questo programma e' free software; puoi redistribuirlo e/o modificarlo
# nei termini della GNU General Public License come e' stata pubblicata
# dalla Free Software Foundation dalla versione 2 della Licenza.
# Questo programma e' distribuito nella speranza di essere utile,
# ma SENZA ALCUNA GARANZIA; non si fornisce alcuna garanzia di
# COMMERCIALIZZAZIONE o FUNZIONAMENTO. Consulta la
# GNU General Public License per maggiori dettagli.
#Originale: http://www.gnu.org/licenses/gpl.txt
#Italiano: http://www.softwarelibero.it/gnudoc/gpl.it.txt
#
#Per informazioni sulla licenza consulta il file di testo:
# doc/LICENZA
#
#Per informazioni sull'installazione, configurazione e requisiti
#di sitema consulta il file di testo:
# doc/INSTALL
#
#Per avere delle informazioni sulle funzionalita' dello script si
#consulti il file:
# doc/HELP
BEGIN{
if($^O=~/Win/i){
eval "use Win32";
die $@ if $@;
}
}
###################################################
# ATTENZIONE
# SE SI HANNO PROBLEMI A SENTIRE I SUONI
# SI CAMBI LA VARIABILE $snd_cmd.
# La prima nel caso si sia in un sistema linux, la seconda
# se si e' in un sistema windows e si metta il percorso
# del programma per la riproduzione di file WAV
###################################################
my $snd_cmd;
my @dir;
my $dirscript;
my $tmp;
$snd_cmd='/usr/bin/aplay' if $^O=~/Linux/i;
$snd_cmd=$ENV{PROGRAMFILES}.'\Windows Media Player\mplayer2.exe' if $^O=~/Win/i;
#Sotto directory in cui stanno i suoni.
#Si puo' lasciare il valore indicato
my $snd_dir="snd";
#I suoni sono impostati nella funzione "sound"
my $snd_private="matrixsound.wav";
my $snd_hilight="4magnum.wav";
my $snd_mention="whoa3.wav";
my $snd_init= "20th.wav";
#####################################
##########
########## NON TOCCARE DA QUI!!
##########
#####################################
#Moduli da caricare all'inizio dello script.
#Sono tutti moduli standard.
use strict;
use File::Find;
#Configurazione:
#Directory in cui e' inserito lo script
#In Linux e' la dir da dove parte lo script
#In windows la vado a cercare assumendo che se non e'
#nella dir di default dei dati delle applicazioni, di solito
#c:\Document and Settings\utente\application data\X-Chat2 o qualcosa di simile
#non trova nulla...
if ($^O=~/Linux/i){
chdir($ENV{HOME});
@dir=<.x*hat*>;
find(\&wanted, @dir);
sub wanted {
/$snd_dir\/$snd_init/i
&& -d $File::Find::name;
$tmp=$File::Find::dir;
}
$dirscript=$ENV{HOME}.'/'.$tmp;
$dirscript=~s/\\/\//g;
}
if ($^O=~/Win/i){
chdir($ENV{APPDATA});
@dir=<X*hat*>;
find(\&wanted, @dir);
sub wanted {
/$snd_init/i;
$tmp=$File::Find::dir if $_=~/$snd_init/;
}
$dirscript=$ENV{APPDATA}.'/'.$tmp;
$dirscript=~s/\//\\/g;
}
#Stringa che contrassegna in ~/.xchat/xchat.conf i valori da evidenziare
my $hlt="irc_extra_hilight";
my $script="XNatChat";
my $ver="v0.2.4";
my ($xver, $mynick, $chan, $server, $xdir, $away, $netname, $serverhost, $chantopic);
#Il terzo parametro e' la shutdown routine ovvero cosa deve fare quando chiudo
#il programma. Per esempio potrei scegliere di salvare dei file di configurazione
#Il quarto parametro è riservato per usi futuri.
IRC::register($script, $ver, "", "");
#Spiegazione di come funziona lo script per l'utente.
IRC::print("\cC0\cB$script $ver by \cB\cC4N\cC7athan\cC5VI\cO is loaded\n");
IRC::print("/helpnat per avere informazioni sui comandi messi a disposizione dallo script\n");
IRC::command("/exec $snd_cmd $dirscript/$snd_init & 2>/dev/null") if $^O=~/Linux/i;
system("\"$snd_cmd\" \"$dirscript\\$snd_init\"") if $^O=~/Win/i;
####################################################################
############
############ INFORMAZIONI
############
#####################################################################
IRC::add_command_handler("informazioni", "informazioni");
sub informazioni{
$xver = IRC::get_info(0);
$mynick = IRC::get_info(1);
$chan = IRC::get_info(2);
$server = IRC::get_info(3);
$xdir = IRC::get_info(4);
$away = IRC::get_info(5);
$netname = IRC::get_info(6);
$serverhost = IRC::get_info(7);
$chantopic = IRC::get_info(8);
IRC::print("Versione XChat: $xver,\nTuo nick: $mynick,\nChannel attuale: $chan,\n");
IRC::print("Server: $server,\nDirectory XChat: $xdir,\nStato away: $away,\n");
IRC::print("Network name: $netname,\nServer HostName: $serverhost,\nChannel Topic: $chantopic");
}
####################################################################
############
############ HELP all'utente che vuole sapere i comandi dello script
############
#####################################################################
IRC::add_command_handler("helpnat", "helpnat");
sub helpnat{
IRC::print("\cBComandi disponibili:\n");
IRC::print("\cC4/helpnat\cC0\cB Stampa questo menu'!.\n");
IRC::print("\cC4/sound on|off\cC0\cB permette di abilitare o disabilitare gli effetti sonori.\n");
IRC::print("\cC4/informazioni\cC0\cB Fornisce le informazioni su utente e programma.\n\n");
IRC::print("\cC4/var\cC0\cB Fa vedere tutte le variabili di sistema\n");
IRC::print("\cC4/ef\cC0\cB Esclama una imprecazione forte!.\n");
IRC::print("\cC4/es\cC0\cB Esclama una imprecazione soft!.\n\n");
IRC::print("\cC4/sys\cC0\cB Fornisce tutte le info di sistema elencate di seguito\n");
IRC::print("\cC4/os\cC0\cB Fornisce le info sul OS\n");
IRC::print("\cC4/uptime\cC0\cB Fornisce il tempo di uptime della macchina\n");
IRC::print("\cC4/mem\cC0\cB Fornisce le info sulla memoria disponibile/usata\n");
IRC::print("\cC4/cpu\cC0\cB Fornisce le info sullo stato della cpu\n");
IRC::print("\cC4/bh\cC0\cB Permette di eseguire dei comandi di shell e vedere autoput su Xchat\n");
IRC::print("\cC4/bhs\cC0\cB Come /bh ma fa vedere autoput a altri utenti\n");
}
IRC::add_command_handler("var", "var");
sub var{
IRC::print("\cBVariabili:\n");
IRC::print("\cB\$Comando riproduzione suoni:$snd_cmd\n");
IRC::print("\cB\$Directory dello script $dirscript\n");
foreach (keys(%ENV)){
IRC::print("\c0\$ENV{$_} = $ENV{$_}\n"); }
if($^O=~/Win/i){
IRC::print("MODULO WIN32\n");
my $BuildNum=Win32::BuildNumber();
IRC::print("Active Perl Build Number: $BuildNum\n");
my $FsType=Win32::FsType();
IRC::print("FS Type: $FsType\n");
my $Arch=Win32::GetArchName();
IRC::print("Arch Name: $Arch\n");
my $Chip=Win32::GetChipName();
IRC::print("Chip: $Chip\n");
my $PWD=Win32::GetCwd();
IRC::print("Per impostare variabile... PWD: $PWD\n");
my $OSTipo=Win32::GetOSVersion();
IRC::print("OS Version: $OSTipo\n");
my $OSName=Win32::GetOSName();
IRC::print("OS Name: $OSName\n");
my $Login=Win32::LoginName();
IRC::print("Login: $Login\n");
my $Nodo=Win32::NodeName();
IRC::print("NodeName: $Nodo\n");
IRC::print("Comando suono: $snd_cmd $dirscript\n");
}
}
####################################################################
############
############ HANDLER a cui si da in pasto ciò che scrivono gli altri
############ effettuando dei controlli.
############
#####################################################################
IRC::add_message_handler("PRIVMSG", "privmsg");
sub privmsg{
my $line = shift;
$line =~ /:.*?\s*([^!]*)!([^@]*@[^ ]*) +(.*?)\s*:(.*)/;
my ($nick, $host, $chan, $text) = ($1, $2, $3, $4);
if ($text =~ /^\cA.*\cA$/) { return 0 };
$chan =~ s/PRIVMSG\s*//;
my $cur_nick = IRC::get_info(1);
my $awaystat=IRC::get_info(5);
if ($chan =~ /\Q$cur_nick\E/i) {
if ($snd_private) {
IRC::command("/exec $snd_cmd $dirscript/$snd_private &") if $^O=~/Linux/i;
system("\"$snd_cmd\" \"$dirscript\\$snd_private\"") if $^O=~/Win/i;
}
}
if ($text =~ /\b\Q$cur_nick\E\b/i) {
if ($text =~ /^\s*$cur_nick/i) {
if ($snd_hilight) {
IRC::command("/exec $snd_cmd $dirscript/$snd_hilight &") if $^O=~/Linux/i;
system("\"$snd_cmd\" \"$dirscript\\$snd_hilight\"") if $^O=~/Win/i;
}
} else {
if ($snd_mention) {
IRC::command("/exec $snd_cmd $dirscript/$snd_mention &") if $^O=~/Linux/i;
system("\"$snd_cmd\" \"$dirscript\\$snd_mention\"") if $^O=~/Win/i;
}
}
}
if(($text =~ /^$cur_nick/i) && $awaystat){
IRC::command("/say \cC0Sono la Segretaria di \cC4$cur_nick \cC0Al momento non c'e', riprova piu' tardi, mi ha detto di preparargli il caffe' quindi torna...");
}
if(($text =~ /'.*'/i) && $nick eq $cur_nick){
IRC::command("/say \c0Comando: \cC8$1");
}
return 0;
}
####################################################################
############
############ COMANDI
############
#####################################################################
#ESCLAMAZIONI FORTI
IRC::add_command_handler("ef", "ehard");
sub ehard{
my @aM=("Porca","Baldracca","Vacca", "Puttana",
"Merda", "Fanculo", "Bocchinara", "Fagottara", "Pornostar",
"Putrefatta", "Appestata", "Necrofila", "Corsara", "Mongoloide",
"Pelandrona", "Psicotica");
my @bM=("la Juve","la miseria", "la Eva", "la vacca",
"la troia", "la galera", "ogni squadra di calcio ma soprattutto la Juve",
"la vergine che non la da");
my @cM=("e zoccola la miseria!","e finocchi i suoi figli!",
"e complicata la vita!","e gioventù sprecata!",
"ed anche assassina!", "ed anche lebbrosa!",
"ed anche mercenaria!", "e la Juve fallita!");
my($index,$a,$b,$c);
srand;
$index = rand @aM;
$a = @aM[$index];
$index = rand @bM;
$b = @bM[$index];
$index = rand @cM;
$c = @cM[$index];
IRC::command("/say $a $b $c");
return 1;
}
#ESCLAMAZIONI SOFT
IRC::add_command_handler("es", "esoft");
sub esoft{
my @aM=("Per dindirindina...", "Misericordia",
"O mannaggia!", "Santa Blatta",
"Porcellina la miseriotta!!", "Per la miseria",
"Ma pensa te!", "Per dinci!",
"Oh gioventù bruciata!");
my($index,$a,$b,$c);
srand;
$index = rand @aM;
$a = @aM[$index];
IRC::command("/say $a ");
return 1;
}
#IMPOSTAZIONE DEI SUONI
IRC::add_command_handler("sound", "sound");
sub sound{
my $ok=1;
my $par=shift;
if($par eq "on"){
$snd_private="matrixsound.wav";
$snd_hilight="4magnum.wav";
$snd_mention="whoa3.wav";
$snd_init="20th.wav";
IRC::print("I suoni sono stati abilitati!");
}
elsif($par eq "off"){
$snd_private="";
$snd_hilight="";
$snd_mention="";
IRC::print("I suoni sono stati esclusi!");
}
else{
IRC::print("I parametri ammessi da comando sono \cC4\"on\" \cC0e \cC4\"off\"\cC0!");
}
}
#PASSAGGIO DI COMANDI SHELL
IRC::add_command_handler("bh", "bash");
sub bash{
my @par=shift;
my $result=`@par`;
IRC::print("$result");
}
#PASSAGGIO DI COMANDI SHELL E STAMPA A VIDEO
IRC::add_command_handler("bhs", "bashscreen");
sub bashscreen{
my @par=shift;
my $result=`@par`;
IRC::command("/say $result ");
}
##############################################################
##########
########## INFORMAZIONI DI SISTEMA
##########
##############################################################
# Tutte le informazioni
IRC::add_command_handler("sys", "sys_handler");
sub sys_handler{
IRC::command("/os");
IRC::command("/cpu");
IRC::command("/mem");
IRC::command("/uptime");
IRC::command("/procs");
return 1;
}
#OPERATING SYSTEM
IRC::add_command_handler("os", "os_handler");
sub os_handler{
my $kerver=`uname -nrsm` if $^O=~/Linux/i;
my $kerver=Win32::GetOSName() if $^O=~/Win/i;
chomp($kerver);
IRC::command("/say \cBOS::\cC4 $kerver");
return 1;
}
#UPTIME
IRC::add_command_handler("uptime", "uptime_handler");
sub uptime_handler{
if($^O=~/Linux/i){
my $uptime=`/usr/bin/uptime`;
my (@fuptime,@fuptime,@puptime,@uptimea);
if ($uptime =~ /days/) {
@fuptime=split(" load", $uptime);
IRC::command("/say \cBUPTIME::\cC4 $fuptime[0]");
return 1;
}
if ($uptime =~ /day/){
@fuptime=split(" load", $uptime);
IRC::command("/say \cBUPTIME::\cC4 $fuptime[0]");
return 1;
}
if ($uptime =~ /min/)
{
@uptimea=split("up ", $uptime);
@fuptime=split(" min", $uptimea[1]);
IRC::command("/say \cBUPTIME::\cC4 [$fuptime[0] Mins]");
return 1;
}
else
{
@uptimea=split(",", $uptime);
@fuptime=split("up ", $uptimea[0]);
@puptime=split(":", $fuptime[1]);
IRC::command("/say \cBUPTIME::\cC4 [$puptime[0] Hours]:[$puptime[1] Mins]");
return 1;
}
}
elsif($^O=~/Win/i){
IRC::command("/say UPTIME? Sono davvero in imbarazzo. Davvero puoi chiedere tanto a un sistema windows?");
return 1;
}
else{
IRC::command("/say Purtroppo il mio plugin non ha riconosciuto il sistema e quindi non sa determinare l'UPTIME");
return 1;
}
}
#CPU
IRC::add_command_handler("cpu", "cpu_handler");
sub cpu_handler{
if($^O=~/Linux/i){
my $cpu_name=`cat /proc/cpuinfo | grep "model name"`;
chomp($cpu_name);
my @name=split(":", $cpu_name);
my $fname=$name[1];
my $cpu_speed=`cat /proc/cpuinfo | grep "cpu MHz"`;
chomp($cpu_speed);
my @speed=split(":", $cpu_speed);
my $fspeed=$speed[1];
my $full=`procinfo`;
my @lcpu=split("\n", $full);
my @luser=split(":", $lcpu[8]);
my @lnice=split(":", $lcpu[9]);
my @lsyst=split(":", $lcpu[10]);
my @lidle=split(":", $lcpu[11]);
my @user=split(" ", $luser[3]);
my @nice=split(" ", $lnice[3]);
my @syst=split(" ", $lsyst[3]);
my @idle=split(" ", $lidle[3]);
IRC::command("/say \cBCPU:: [Model:$fname]:[Speed:$fspeed MHz]");
IRC::command("/say \cBCPU:: [User: $user[1]][Nice $nice[1]][System $syst[1]][Idle $idle[1]]");
return 1;
}
elsif($^O=~/Win/i){
my $cpu_name=eval"Win32::GetChipName.\":\".$ENV{PROCESSOR_IDENTIFIER}";
chomp($cpu_name);
IRC::command("/say \cBCPU:: [Model:$cpu_name]");
return 1;
}
else{
IRC::command("/say Purtroppo il mio plugin non ha riconosciuto il sistema e quindi non sa determinare la CPU");
}
}
#MEMORIA DISPONIBILE
IRC::add_command_handler("mem", "mem_handler");
sub mem_handler{
if($^O=~/Linux/i){
my $membar;
my $tot=`cat /proc/meminfo | grep MemTotal`;
chomp($tot);
my @ftot=split(" ", $tot);
my $free=`cat /proc/meminfo | grep MemFree`;
chomp($free);
my @ffree=split(" ", $free);
my $used=$ftot[1]-$ffree[1];
my $pertot=100/$ftot[1];
my $peruse=$pertot*$used;
my $checkram=substr($peruse, "0", "1");
if ($checkram == 0) { $membar="\cB||||||||||"; }
if ($checkram == 1) { $membar="|\cB|||||||||"; }
if ($checkram == 2) { $membar="||\cB||||||||"; }
if ($checkram == 3) { $membar="|||\cB|||||||"; }
if ($checkram == 4) { $membar="||||\cB||||||"; }
if ($checkram == 5) { $membar="|||||\cB|||||"; }
if ($checkram == 6) { $membar="||||||\cB||||"; }
if ($checkram == 7) { $membar="|||||||\cB|||"; }
if ($checkram == 8) { $membar="||||||||\cB||"; }
if ($checkram == 9) { $membar="|||||||||\cB|"; }
my $checkram=substr($peruse, "0", "3");
if ($checkram == 100) { $membar="||||||||||"; }
IRC::command("/say \cBMEM::\cC4 [Free: $ffree[1] kB]:[Used: $used kB]:[Total $ftot[1] kB]");
IRC::command("/say \cBMEM::\cC4 [Usage:$peruse%]:[Bar: $membar]");
return 1;
}
elsif($^O=~/Win/i){
IRC::command("/say Memoria? Ti prego, non mettermi in imbarazzo; siamo su windows. Senza le finestrelle come si fa a vedere la memoria? ;-)");
return 1;
}
else{
IRC::command("/say Purtroppo il mio plugin non ha riconosciuto il sistema e quindi non sa determinare la CPU");
}
}