My Mad Idea: CMSbot

Stato
Discussione chiusa ad ulteriori risposte.

yawn

Utente Silver
30 Settembre 2008
18
1
0
61
ok.. e' una cazzata come programma :p.... ma e' stato divertente per passare un po' di tempo in cui mi annoiavo :D ..

CMSbot: creare un (semplice xD) sito web usando un bot irc... per ora e' version alpha 0.0.1 .. poi decidero' se continuare o no :D

Nopaste (syntax highlighting) : http://sprunge.us/TMMb?pl

Code:
[ot]
Codice:
# CMS/IRC Bot
# Create Your Own Website Using An Irc Bot!
# by yawn
# License: GNU/GPL v3

use IO::Socket;
use Archive::Tar;
use DBI;
use WWW::Mechanize;
use warnings;

my $pwds="boot";
my $irc= "irc.blacklight.gotdns.org";
my $chan= "#prova";
my $nick = "CMSbot";
my $socket= IO::Socket::INET -> new(PeerAddr=> $irc,
							PeerPort=> 6667,
							Proto=>'tcp',
) or die "Cannot Connect To Server\n";

print $socket "NICK $nick\r\n";
print $socket "USER $nick: $nick $nick $nick $nick $nick $nick $nick $nick\r\n";
print $socket "JOIN $chan\r\n";
print $socket "PRIVMSG $chan :Hi, CMSbot's here to serve you!\r\n";
print $socket "PRIVMSG $chan :.help for a help menu\r\n";

while ($sv= <$socket>)  {
	print $sv;
	if ($sv =~ m/PING (:.*)/)  {
		print $socket "PONG ".$1;
	}
	if ($sv =~ /:(.*?)!/) {
		$user= $1;
	}
	if ($sv =~ m/JOIN/)  {
		print $socket "PRIVMSG $chan :Welcome $user\r\n"  if ($user ne $nick);
	}
	if ($sv =~ m/.help/)  {
		if ($user ne "CMSbot")  {
			print $socket "PRIVMSG $user :CMSbot's help desk\r\n";
			print $socket "PRIVMSG $user :[+] .create <site_name>:<article_name>:<article_text>-> creates an article\r\n";
			print $socket "PRIVMSG $user :[+] .upload <site_name> -> uploads the site tar archive to zShare\r\n";
			print $socket "PRIVMSG $user :[+] .die <password> -> kills the bot\r\n";
		}
	}
	if ($sv =~/.create (\w+) (\w+) (.*)/)  {
		my $nama=$1;
		my $txt=$3;
		my $tit= $2;
		my $con=DBI->connect("DBI:CSV:");
		$con->do( "CREATE TABLE $nama (id INTEGER NOT NULL, txt TEXT, title TEXT)");
		my $lol = $nama;
		$lol =~ s/^\s+//;
		$lol =~ s/\s+$//;
		my $asd= `tail -n 1 $lol`;
		if ($asd=~ /(.*),(.*)/)  {
			$idx= $1;
			$idx++;
		}
		$con->do( "INSERT INTO $nama VALUES (".$idx.", ". $con->quote ($txt) . ",". $con->quote($tit).")");
		print $socket "PRIVMSG $user :Article $tit was successfully created! :D\r\n";
		$con->disconnect;
	}
	if($sv =~m/.upload (\w+)/)  {
		my $namez= $1;
		chomp($namez);
		$zip= Archive::Tar->new();
		$zip->add_files('index.php','template.css','show.php');
		$zip->add_files($namez);
		my $filez= $namez.".tar";
		$zip->write($filez);
		my $ua = new WWW::Mechanize;
		$ua->agent_alias ( 'Windows Mozilla' );
		$ua -> get ("http://zshare.net/");
		$ua -> form_number (1);
		$ua -> field ( "file" => $filez );
		$ua -> click();
		if ( $ua -> success() )
		{
			my $content = $ua -> content();
			if ($content =~ m[(http://www\.zshare\.net/download/.+?/)] )  {
				print $socket "PRIVMSG $user :Download URL for your website is: $1\r\n";
			}
		} else {
			die "Error while getting the page";
		}
	}
	if($sv =~/.die (\w+)/)  {
		print $socket "PRIVMSG $chan :Adios :'(\r\n";
		exit() if ($1 eq $pwds);
	}
}
[/ot]

(bisogna inserire su show.php e index.php il nome della tabella (variabile $article)

la grafica in php fa schifo (non sono affatto bravo xD) quindi se qualcuno ha qualche idea per renderlo un po' piu' decente ben venga... (in allegato.. e' il mio primo lavoretto in php quindi se ho fatto qualche cazzata perdonatemi :p)

critiche & suggerimenti al codice graditi

enjoy :p

ps: la funzione per l'upload su zshare ce l'aveva Lepa gia' pronta quindi ho usato la sua
 
nel file archive.tar, mi sembra ci siano 21 imperfezioni nei link: la barra iniziale.
href='/show.php in index.php
a href='/'> in show.php


almeno su windows con apache 2.2, quello rindirizza alla base dell'indirizzo: ad esempio http://localhost/.
se metti questo in un'altro percorso, ad esempio http://localhost/asd/, la cosa non funziona più.
 
pazzo, ma la RFC vi sta cosi' antipatica?
1)
Codice:
print $socket "USER $nick: $nick $nick $nick $nick $nick $nick $nick $nick\r\n";
Sintassi STRA-ERRATA secondo la RFC, giusta:
Codice:
print $socket "USER $nick 0 * :$nick\r\n";
2)
Codice:
print $socket "JOIN $chan\r\n";
print $socket "PRIVMSG $chan :Hi, CMSbot's here to serve you!\r\n";
print $socket "PRIVMSG $chan :.help for a help menu\r\n";
Anche questo e' errato: non bisogna subito mandare i comandi del join e del PRIVMSG , bisogna aspettare che il server e' pronto . Abozzo:
Codice:
[qui mandi l'USER e il NICK]
while (<$socket>)
{
    if ($_ =~ /PING :(.+)/) { print $socket "PONG :$1"; }
    if ($_ =~ /(.*)001(.*)/) # il server e' pronto , posso inviarci i comandi
    {
        [qui ci mandi il join, il privmsg ecc.]
    }
}
3)
Codice:
	if ($sv =~ /:(.*?)!/) {
		$user= $1;
	}
	if ($sv =~ m/JOIN/)  {
		if ($user ne "CMSbot")  {
			print $socket "PRIVMSG $chan :Welcome $user\r\n" ;
		}
	}
:omfg::omfg:
Innanzitutto, invece di dichiarare una variabile globale contenente il nick dell'utente, fatti una bella sub da richiamare solo quando serve. Esempio:
Codice:
sub getNick
{
    my $srvString = shift;
    if ($srvString =~ /:(.+)!~{0,1}/)
    {
        return $1;
    }
    return 0;
}
Codice:
print "Nick : " . &getNick (":pazzo!~");

Mentre quel JOIN e' orribile. Molto piu' ordinato invece sarebbe:
Codice:
if ($_ =~ /(.+)JOIN $chan/)
{
    print $socket "PRIVMSG ${chan} :Benvenuto, " . &getNick ($1);
}
4)
Codice:
if ($sv =~ m/.help/)  { [...]
. va escapato, e' un carattere speciale nelle regex.
Inoltre non mi piace questa sintassi, meglio cosi':
Codice:
if ($sv =~ /PRIVMSG ${chan} :\.help/) { [...]


Ti consiglio di dare un occhiata a questa: http://www.faqs.org/rfcs/rfc2812.html - la RFC di IRC con la sintassi a tutti i comandi.

Ovviamente sono solo suggerimenti :)
Il codice PHP ancora non l'ho guardato, poi ti sapro' dire.
Ciao
 
Stato
Discussione chiusa ad ulteriori risposte.