begin process at 2010 07 30 01:42:03
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Bots

 > SERVICE GEOFRONT (PERL)

SERVICE GEOFRONT (PERL)


 Information sur la source

Note :
6 / 10 - par 1 personne
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Bots Classé sous :Bot, Geofront, oper, unrealirc, service Niveau :Initié Date de création :06/03/2010 Date de mise à jour :07/03/2010 10:44:29 Vu / téléchargé :835 / 18

Auteur : iZyTeHPariaH

Ecrire un message privé
Commentaire sur cette source (30)
Ajouter un commentaire et/ou une note

 Description

Bonjour à tous. Voici ma première source : un robot géofront rédigé en perl destiné à ceux qui souhaitent administrer leur serveur irc. Il est conçu pour fonctionner en tant que service sous les démons UNREALIRCD. N'hesitez pas à faire des modifications, ce robot est loin d'être parfait. La programation mIRC me semblant être bien trop omniprésente sur ce site, j'espère que cela montrera à ceux qui débutent que ce n'est pas le seul moyen de coder des bots. Plus d'informations dans le readme.

Source

  • #!/usr/bin/perl
  • ####################################################
  • # SiNuZoiD #
  • # Service Géofront par iZy_TeH_PariaH #
  • # Version : 1.0 #
  • # Testé sur Ubuntu #
  • # Plus d'informations dans le readme #
  • ####################################################
  • use IO::Socket;
  • use Digest::SHA1 qw(sha1 sha1_hex sha1_base64);
  • use threads;
  • #--main
  • my ($addr,$port,$nick,$pass) = @ARGV;
  • die ('Syntaxe : .pl addr port nick pass*') if (!defined($nick));
  • my %admin; #tableau de hachage contenant la liste Username -> Password
  • load_axx();
  • my %blacklist;#blacklist 1 = AKICK
  • my %conf; #table de hachage contenant la liste des configurations fixées
  • $conf{"IDENT"} = undef; #Identifiant à bloquer [Kill quand le pseudo match]
  • $conf{"ANTIPUB"} = 0; # 0 = pas d'antipub / 1 = Kick sur pub / 2 = KiLL sur pub / 3 = G-LINE sur pub
  • $conf{"SMODE"} = undef;
  • $conf{"UCHAN"} = "#Services";
  • $conf{"GEO_HOST"} = "Geofront.fr";
  • $conf{"SERV_ADMIN_HOST"} = "ServiceAdmin.fr";
  • print "-------- SinuZoiD Geofront Service ------------\n";
  • print "UCHAN : ".$conf{"UCHAN"}."\n";
  • print "GEO_HOST : ".$conf{"GEO_HOST"}."\n";
  • print "SERV_ADMIN_HOST : ".$conf{"SERV_ADMIN_HOST"}."\n";
  • print "Connection à $addr ($port)... Nick : $nick\n";
  • my $sock = IO::Socket::INET->new(proto => 'tcp', #Socket de connection au serveur IRC
  • PeerAddr => $addr,
  • PeerPort => $port);
  • my ($ans,$raw);
  • connection_serv($nick,$sock,$pass); #Connection au serveur
  • while ($raw = <$sock>){ #Comunication avec le serveur
  • $ans = uncolor_raw($raw);
  • my $type = get_type($ans); #Récupération du type de requête
  • on_ping($ans,$sock) if ($type =~ /PING/);
  • on_join($ans,$sock) if ($type =~ /\sJOIN\s/);
  • on_privmsg($ans,$sock,$nick,%admin) if ($type =~ /\sPRIVMSG\s/);
  • on_quit($ans,$sock) if ($type =~ /\sQUIT\s/);
  • on_part($ans,$sock) if ($type =~ /\sPART\s/);
  • on_mode($ans,$sock) if ($type =~/\sMODE\s/);
  • on_notice($ans,$sock) if ($type =~ /\sNOTICE\s/);
  • on_raw_378($ans,$sock) if ($type =~ /\s378\s/); #whois IP - real hostname
  • on_raw_311($ans,$sock) if ($type =~ /\s311\s/); #whois is pseudo usrname hostname
  • on_raw_318($ans,$sock) if ($type =~ /\s318\s/); #end of /whois
  • }
  • #--Administration MESSAGE PRIVÉ
  • sub order_join{
  • my ($sock,$nick,$raw) = @_;
  • my ($w1,$w2) = ($raw =~ /^(\S+)\s+(\S+)/);
  • if (!defined($w2)){
  • send_notice($nick, "Erreur de syntaxe : join #CANAL",$sock);
  • return 0;
  • }
  • send_notice($nick,"Joining $w2...",$sock);
  • join_c($w2,$sock);
  • };
  • sub order_quit{
  • my ($sock, $nick,$raw) = @_;
  • send_notice($nick,"Déconnection du serveur...\n",$sock);
  • print $sock "QUIT :Rebooting Service...\r\n";
  • };
  • sub order_mod_axx{
  • my ($sock,$nick,$raw) = @_;
  • my ($w1,$w2,$w3) = ($raw =~ /^(\S+)\s+(\S+)\s+(\S+)/);
  • if (!defined($w3)){
  • send_notice($nick, "Erreur de syntaxe : modify AncienPass NouveauPass",$sock);
  • return 0;
  • }
  • $nick =~ tr/A-Z/a-z/;
  • chomp $w3;
  • my $sha1 = sha1_hex($w2);
  • if ($admin{$nick} eq $sha1){
  • my $bool = 0;
  • my $new_pass = sha1_hex($w3);
  • open FIC, "root_axx.conf";
  • my @fic = <FIC>;
  • close FIC;
  • foreach $entry (@fic){
  • if($entry =~ /^$nick\s/i){
  • $entry = "$nick $new_pass\n";
  • $bool = 1;
  • break;
  • }
  • }
  • if ($bool == 1){
  • open FIC, ">root_axx.conf";
  • foreach $entry (@fic){
  • print FIC "$entry";
  • }
  • close FIC;
  • send_notice($nick, "Votre nouveau mot de passe est désormais $w3.",$sock);
  • load_axx();
  • }
  • else{
  • send_notice($nick, "Entrée non trouvée.",$sock);
  • }
  • return 0;
  • }
  • else{
  • send_notice($nick,"Mot de passe incorrect !",$sock);
  • }
  • };
  • sub order_rem_axx{
  • my ($sock,$nick,$raw) = @_;
  • my ($w1,$w2) = ($raw =~ /^(\S+)\s+(\S+)/);
  • if (!defined($w2)){
  • send_notice ($nick, "Erreur de syntaxe : remove PSEUDO",$sock);
  • return 0;
  • }
  • chomp $w2;
  • open FIC,"root_axx.conf";
  • my @fic = <FIC>;
  • my $bool = 0;
  • close FIC;
  • foreach $entry (@fic){
  • if($entry =~ /^$w2\s/i){
  • $entry = "";
  • $bool = 1;
  • break;
  • }
  • }
  • if($bool == 1){
  • open FIC, ">root_axx.conf";
  • foreach $entry (@fic){
  • print FIC "$entry";
  • }
  • close FIC;
  • send_notice($nick, "Base de donnée modifiée.",$sock);
  • load_axx();
  • log_actions("$nick REMOVES the geofront account of $w2");
  • }
  • else{
  • send_notice ($nick,"Entrée non trouvée.",$sock);
  • }
  • return 0;
  • };
  • sub order_add_axx{
  • my ($sock,$nick,$raw) = @_;
  • my ($w1,$w2,$w3) = ($raw =~ /^(\S+)\s+(\S+)\s+(\S+)/);
  • if (!defined($w3)){
  • send_notice($nick,"Erreur de syntaxe : add PSEUDO PASS",$sock);
  • return 0;
  • }
  • open FIC,"root_axx.conf";
  • @fic = <FIC>;
  • close FIC;
  • chomp $w3;
  • my $sha1 = sha1_hex($w3);
  • foreach (@fic){
  • my ($usr,$pass) = ($_ =~ /^(\S*)\s(\S*)/);
  • if ($w2 =~ /^$usr$/i){
  • send_notice($nick,"$w2 est déjà inscrit dans la base de données. Utilisez la commande \"modify\" pour en modifier l'entrée",$sock);
  • return 0;
  • }
  • }
  • open FIC, ">>root_axx.conf";
  • print FIC "$w2 $sha1\n";
  • close FIC;
  • send_notice($nick,"L'utilisateur $w2 à été inscrit dans la base de données. Son mot de passe est désormais $w3.",$sock);
  • load_axx();
  • log_actions("$nick ADDS a geofront account for $w2");
  • return 0;
  • };
  • sub order_self_unban{
  • my ($sock,$nick,$raw,$mask) = @_;
  • my ($w1,$w2) = ($raw =~ /^(\S+)\s+(\S+)/);
  • if (!defined($w2)){
  • send_notice($nick,"Erreur de syntaxe : unban chan",$sock);
  • }
  • else{
  • change_mode("-b",$w2,$sock,$mask);
  • send_notice($nick,"Requête effectuée",$sock);
  • }
  • };
  • sub order_oper{
  • my ($sock,$nick,$raw) = @_;
  • my ($w1,$w2,$w3) = ($raw =~ /^(\S+)\s+(\S+)\s+(\S+)/);
  • if (!defined($w3)){
  • send_notice($nick,"Erreur de syntaxe : oper <username> <oper_password>",$sock);
  • }
  • else{
  • print $sock "OPER $w2 $w3\r\n";
  • }
  • };
  • sub order_set_mode{
  • my ($sock, $nick, $raw) = @_;
  • my ($w1, $w2, $w3) = ($raw =~ /^(\S+)\s+(\S+)\s+(\S+)/);
  • if (!defined ($w3)){
  • send_notice($nick, "Erreur de syntaxe : mode <target> <mode>",$sock);
  • }
  • else{
  • change_mode($w3,$w2,$sock);
  • send_notice($nick,"Requête effectuée",$sock);
  • }
  • };
  • sub order_part{
  • my ($sock,$nick,$raw) = @_;
  • my ($w1,$w2) = ($raw =~ /^(\S+)\s+(\S+)/);
  • if (!defined($w2)){
  • send_notice($nick, "Erreur de syntaxe : part <chan>",$sock);
  • }
  • else{
  • part ($w2,$sock);
  • send_notice($nick,"Requête effectuée",$sock);
  • }
  • };
  • sub order_bl_list{
  • my ($sock,$nick,$raw) = @_;
  • my $not;
  • send_notice($nick, "--- BLACKLIST ---",$sock);
  • send_notice($nick, " TYPE NICKNAME",$sock);
  • while (my ($k,$v) = each(%blacklist)){
  • send_notice ($nick, "[CHAN] $k",$sock) if ($v == 1);
  • send_notice ($nick, "[SERV] $k",$sock) if ($v == 2);
  • }
  • };
  • #--Administration MESSAGE PUBLICS
  • sub order_mode{
  • my ($sock,$nick,$raw,$chan) = @_;
  • my ($w1,$w2) = ($raw =~ /^(\S+)\s+(\S+)/);
  • if (!defined($w2)){
  • send_notice($nick,"Erreur de syntaxe : !m <modes> <cible>",$sock);
  • }
  • else{
  • my ($w3) = ($raw =~ /^\S+\s+\S+\s(\S+)/);
  • if (!defined($w3)){ #sans paramètre
  • change_mode($w2,$chan,$sock)
  • }
  • else{ #avec paramètre
  • change_mode($w2,$chan,$sock,$w3);
  • }
  • }
  • };
  • sub order_kick{
  • my ($sock,$nick,$raw,$chan,$botnick) = @_;
  • my ($w1,$w2,$w3) = ($raw =~ /(\S+)\s+(\S+)\s*(.*)/);
  • if ($w2 =~ /^$botnick$/i){
  • send_notice($nick,"Erreur, vous ne pouvez pas expulser le robot",$sock);
  • return 0;
  • }
  • if (!defined($w2)){
  • send_notice($nick,"Erreur de syntaxe : !xk <nick> <raison>",$sock);
  • }
  • else{
  • kick($w2,$chan,$sock,$w3);
  • }
  • };
  • sub order_add_blacklist_akick{
  • my ($sock,$nick,$raw,$botnick,$chan,) = @_;
  • my ($w1,$w2) = ($raw =~ /(\S+)\s+(\S+)/);
  • if ($w2 =~ /^$botnick$/i){
  • send_notice($nick,"Erreur, vous ne pouvez pas blacklister le robot",$sock);
  • return 0;
  • }
  • if (!defined ($w2)){
  • send_notice($nick,"Erreur de syntaxe : !xbl (/msg bl) <nick> ",$sock);
  • }
  • else{
  • send_notice($nick,"L'utilisateur $w2 a bien été ajouté à la blacklist. Tappez !xunbl <pseudo> pour l'y en retirer.",$sock);
  • log_actions("$nick BLACKLISTED $w2 [KICK]");
  • $w2 =~ tr/A-Z/a-z/;
  • $blacklist{$w2} = 1;
  • kick($w2,$chan,$sock,"-- Requested by $nick ::: Added to the BLACKLIST --");
  • }
  • };
  • sub order_rem_blacklist_akick{
  • my ($sock,$nick,$raw,$chan) = @_;
  • my ($w1,$w2) = ($raw =~ /(\S+)\s+(\S+)/);
  • if (!defined ($w2)){
  • send_notice($nick,"Erreur de syntaxe : !xunbl (/msg unbl) <nick>",$sock);
  • }
  • else{
  • $w2 =~ tr/A-Z/a-z/;
  • if(defined($blacklist{$w2})){
  • $blacklist{$w2} = undef;
  • send_notice($nick,"Le pseudo $w2 a bien été retiré de la blacklist",$sock);
  • log_actions("$nick REMOVE $w2 from blacklist");
  • }
  • else{
  • send_notice($nick,"Impossible de trouver l'entrée",$sock);
  • }
  • }
  • };
  • sub order_add_blacklist_agline{
  • my ($sock,$nick,$raw,$botnick,$chan) = @_;
  • my ($w1,$w2) = ($raw =~ /^(\S+)\s+(\S+)/);
  • if ($w2 =~ /^$botnick$/i){
  • send_notice($nick,"Erreur, vous ne pouvez pas blacklister le robot",$sock);
  • return 0;
  • }
  • if (!defined ($w2)){
  • send_notice($nick,"Erreur de syntaxe : !xsbl (/msg sbl) <nick> ",$sock);
  • }
  • else{
  • send_notice($nick,"L'utilisateur $w2 a bien été ajouté à la blacklist. Tappez !xunbl <pseudo> pour l'y en retirer.",$sock);
  • print_uchan("$nick a ajouté le pseudo $w2 à la liste noire du serveur. Toute connection de ce pseudo sera automatiquement G-Lined",$sock);
  • $w2 =~ tr/A-Z/a-z/;
  • log_actions("$nick BLACKLISTED $w2 [G-LINE]");
  • $blacklist{$w2} = 2;
  • }
  • };
  • sub order_set_ident{
  • my ($sock,$nick,$raw,$chan) = @_;
  • my ($w1,$w2) = ($raw =~ /(\S+)\s+(\S+)/);
  • if (!defined($w2)){
  • send_notice($nick,"Erreur de syntaxe : !xid <identifiant>",$sock);
  • }
  • else{
  • $w2 =~ tr/A-Z/a-z/;
  • $conf{"IDENT"} = $w2;
  • send_notice($nick,"L'identifiant $w2 est désormais interdit sur les salons. Tapez !xuid pour désactiver le ban à vue",$sock);
  • print_uchan("$nick a interdit l'identifiant $w2. Toute connection sur le serveur comportant ce motif sera automatiquement G-LINED",$sock);
  • log_actions("$nick set auto-gline on ident $w2");
  • }
  • };
  • sub order_rem_ident{
  • my ($sock,$nick,$raw,$chan) = @_;
  • my ($w1) = ($raw =~ /(\S+)/);
  • if (!defined ($conf{"IDENT"})){
  • send_notice($nick,"Aucun identifiant n'est interdit actuellement.",$sock);
  • }
  • else{
  • $conf{"IDENT"} = undef;
  • print_uchan("$nick à levé l'intediction d'identifiant.",$sock);
  • log_actions("$nick remove auto-gline on the ident");
  • send_notice($nick,"La protection anti-idenfiant est désactivée.",$sock);
  • }
  • };
  • sub order_smode{
  • my ($sock,$nick,$raw) = @_;
  • if(!defined($conf{"SMODE"})){
  • $conf{"SMODE"} = 1;
  • print_uchan("$nick a activé le mode de sécurité serveur maximum. Aucune connection entrante ne sera accéptée jusqu'à ce que vous levez l'interdiction (!xusmode)",$sock);
  • send_notice($nick,"Mode de sécurité maximum activé ! Tapez !xsusmode pour le retirer",$sock);
  • log_actions("$nick set SECURITY-MODE ON");
  • }
  • else{
  • send_notice($nick,"Le mode de sécurité maximum est déjà activé",$sock);
  • }
  • };
  • sub order_rem_smode{
  • my ($sock,$nick,$raw) = @_;
  • if (!defined($conf{"SMODE"})){
  • send_notice($nick,"Le mode de sécurité est déja desactivé !",$sock);
  • }
  • else{
  • $conf{"SMODE"} = undef;
  • send_notice($nick,"Mode de sécurité desactivé",$sock);
  • log_actions("$nick set SECURITY-MODE OFF");
  • print_uchan("$nick à desactivé le mode de sécurité maximum !",$sock);
  • }
  • };
  • sub order_help{
  • my ($sock,$nick,$chan) = @_;
  • send_notice($nick,"------------------- Commandes Géofront -------------------",$sock);
  • send_notice($nick," Commandes en Message Privé:",$sock);
  • send_notice($nick,"auth <password> ................ authentification sur le robot",$sock);
  • send_notice($nick,"load ........................... recharge le fichier root_axx.conf en mémoire",$sock);
  • send_notice($nick,"join <#chan> ................... rejoint le salon spécifié",$sock);
  • send_notice($nick,"part <#chan> ................... part du salon spécifié",$sock);
  • send_notice($nick,"quit ........................... quitte le serveur",$sock);
  • send_notice($nick,"unban <#chan> .................. débannit votre host du salon spécifié (ban de la forme *!*\@votrehost)",$sock);
  • send_notice($nick,"oper <user> <password> ......... permet au robot de s'identifier en temps qu'IRCOP",$sock);
  • send_notice($nick,"kill <pseudo>",$sock);
  • send_notice($nick,"kline <pseudo> ................. permet de kill (respct. k-line / g-line / z-line) l'utilisateur spécifié du serveur.",$sock);
  • send_notice($nick,"gline <pseudo>",$sock);
  • send_notice($nick,"zline <pseudo>",$sock);
  • send_notice($nick,"bl / unbl <pseudo> ........... permet de blacklister (respct. retirer de la blacklist) l'utilisateur spécifié.",$sock);
  • send_notice($nick,"sbl / unbl <pseudo> .......... permet de blacklister (respct. retirer de la blacklist) du serveur l'utilisateur spécifié.",$sock);
  • send_notice($nick,"smode / unsmode .............. bloque (respct. lève le blocage) des connections serveur.",$sock);
  • send_notice($nick, "mode <target> <mode> ........ ajoute/retire le(s) modes spécifiés sur la cible.",$sock);
  • send_notice($nick,"bllist ....................... affiche la blacklist.",$sock);
  • send_notice($nick," ",$sock);
  • send_notice($nick," Commandes en Message Public:",$sock);
  • send_notice($nick,"!m <mode> <parametre>* .......... execute le(s) mode(s) sur le salon spécifié associé au paramètre éventuellement précisé",$sock);
  • send_notice($nick,"!xk <pseudo> <raison>* .......... kick le pseudo avec la raison éventuellement précisée",$sock);
  • send_notice($nick,"!xkill <pseudo> <raison>*",$sock);
  • send_notice($nick,"!xkline <pseudo> <raison>*",$sock);
  • send_notice($nick,"!xgline <pseudo> <raison>*........ kill (respct k-line/g-line/z-line) l'utilisateur spécifié du serveur",$sock);
  • send_notice($nick,"!xzline <pseudo> <raison>*",$sock);
  • send_notice($nick,"!xbl <pseudo> .................... ajoute le pseudo spécifié à la blacklist (liste des AutoKick/ban)",$sock);
  • send_notice($nick,"!xubl <pseudo> ................... retire le pseudo spécifié de la blacklist",$sock);
  • send_notice($nick,"!xsbl <pseudo> .................... blacklist le pseudo sur le serveur (se retire avec !xubl)",$sock);
  • send_notice($nick,"!xbllist .......................... affiche la liste des utilisateurs blacklistés",$sock);
  • send_notice($nick,"!xid <ident> ..................... Bloque l'identifiant <ident> (G-line toute personne rejoignant le salon dont le pseudo comporte le motif spécifié dans <ident>)",$sock);
  • send_notice($nick,"!xuid ............................ retire le bloquage de l'identifiant.",$sock);
  • send_notice($nick,"!xsmode / !xunsmode .............. bloque (respct. lève le blocage) des connections serveur.",$sock);
  • send_notice($nick,"Nota bene : les paramètres suivis d'un asterisque * sont facultatifs",$sock);
  • };
  • #--Systèmes OPER
  • sub order_kill{
  • my ($sock,$nick,$raw,$botnick) = @_;
  • my ($w1,$w2,$w3) = ($raw =~ /^(\S+)\s+(\S+)\s*(.*)/);
  • if ($w2 =~ /^$botnick$/i){
  • send_notice($nick,"Erreur, vous ne pouvez pas déconnecter le robot",$sock);
  • return 0;
  • }
  • if (!defined($w2)){
  • send_notice($nick,"Erreur de syntaxe : [!xkill / msg kill] <nick> <raison>",$sock);
  • }
  • else{
  • kill_($w2,$sock,$nick,$w3);
  • }
  • };
  • sub order_gline{
  • my ($sock,$nick,$raw,$botnick) = @_;
  • my ($w1,$w2,$w3) = ($raw =~ /^(\S+)\s+(\S+)\s*(.*)/);
  • if ($w2 =~ /^$botnick$/i){
  • send_notice($nick,"Erreur, vous ne pouvez pas déconnecter le robot",$sock);
  • return 0;
  • }
  • if (!defined($w2)){
  • send_notice($nick,"Erreur de syntaxe : [!xgline / msg gline] <nick> <raison>",$sock);
  • }
  • else{
  • G_line($w2,$sock,$nick,$w3);
  • }
  • };
  • sub order_kline{
  • my ($sock,$nick,$raw,$botnick) = @_;
  • my ($w1,$w2,$w3) = ($raw =~ /^(\S+)\s+(\S+)\s*(.*)/);
  • if ($w2 =~ /^$botnick$/i){
  • send_notice($nick,"Erreur, vous ne pouvez pas déconnecter le robot",$sock);
  • return 0;
  • }
  • if (!defined($w2)){
  • send_notice($nick,"Erreur de syntaxe : [!xkline / msg kline] <nick> <raison>",$sock);
  • }
  • else{
  • K_line($w2,$sock,$nick,$w3);
  • }
  • };
  • sub order_zline{
  • my ($sock,$nick,$raw,$botnick) = @_;
  • my ($w1,$w2,$w3) = ($raw =~ /^(\S+)\s+(\S+)\s*(.*)/);
  • if ($w2 =~ /^$botnick$/i){
  • send_notice($nick,"Erreur, vous ne pouvez pas déconnecter le robot",$sock);
  • return 0;
  • }
  • if (!defined($w2)){
  • send_notice($nick,"Erreur de syntaxe : [!xzline / msg zline] <nick> <raison>",$sock);
  • }
  • else{
  • Z_line($w2,$sock,$nick,$w3);
  • }
  • };
  • #-- Network
  • sub connection_serv{
  • my ($name,$sock,$pass) = @_;
  • print $sock "PASS $pass\r\n" if (defined($pass));
  • print $sock "NICK $name\r\n";
  • print $sock "USER iService localhost irc_server :18 F iZy <3\r\n"
  • };
  • #--Fonction utillitaires
  • sub get_type{
  • my ($raw) = @_;
  • my ($entete) = ($raw =~ /^:*([^:]*):/); #Si l'entête prends un paramètre
  • if(!($entete =~ /\S+/)){
  • $entete = $raw;
  • }
  • return $entete;
  • };
  • sub get_usrname{#retourne le nick/usr/host
  • my ($raw) = @_;
  • my ($nick,$usr,$host) = ($raw =~ /^(.*)!(.*)@(.*)/);
  • return ($nick,$usr,$host);
  • };
  • sub uncolor_raw{#Supprime la couleur du texte
  • my ($msg) = @_;
  • chomp $msg;
  • $msg =~ s/[0,1]{0,1}[0-9]{0,1}//g;
  • $msg =~ s///g;
  • #$msg =~ s///g;
  • $msg =~ s///g;
  • return $msg;
  • };
  • sub load_axx{ #charge en mémoire la liste des accès
  • %admin = undef;
  • open FIC,"root_axx.conf"; #Syntaxe :: user pass
  • while (<FIC>){
  • my ($usr,$pass) = ($_ =~ /^(\S+)\s(\S+)/);
  • chomp $usr;
  • chomp $pass;
  • $usr =~ tr/A-Z/a-z/;
  • $admin{$usr} = $pass;
  • }
  • close FIC;
  • };
  • sub is_register{ #regarde si le pseudo est inscrit
  • my ($host) = @_;
  • my $geo_h = $conf{"GEO_HOST"};
  • if ($host =~ /^$geo_h/i){
  • return 1;
  • }
  • else{
  • return 0;
  • }
  • };
  • sub log_actions{
  • my ($data) = @_;
  • my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  • $mon++;
  • $year += 1900;
  • open FIC, ">>log_IRCOP.log";
  • print FIC "[$mday/$mon/$year]- $hour:$min:$sec # $data\n";
  • close FIC;
  • };
  • sub print_uchan{
  • my ($data,$sock) = @_;
  • if (defined($conf{"UCHAN"})){
  • send_pubmsg($conf{"UCHAN"},$data,$sock);
  • }
  • };
  • #--Event
  • sub on_ping{
  • my ($raw,$sock) = @_;
  • my ($pong) = ($raw =~ /^PING (:\w*)/);
  • print $sock "PONG $pong\r\n";
  • };
  • sub on_join{
  • my ($ans,$sock) = @_;
  • my ($src,$canal) = ($ans =~ /^:(\S*)\sJOIN\s:(\S*)/);
  • my ($nick,$usr,$host) = get_usrname($src);
  • $nick =~ tr/A-Z/a-z/;
  • if ($blacklist{$nick} == 1){
  • change_mode("+b",$canal,$sock,"*!*\@$host");
  • kick($nick,$canal,$sock,"BLACKLISTED !");
  • return 0;
  • }
  • };
  • sub on_part{
  • my ($ans,$sock) = @_;
  • my ($src,$canal) = ($ans =~/^:(\S*)\sPART\s(\S*)/); #pas de ":" => iZy_TeH_PariaH!iZoMorphisM@reagi-100E34EF.w86-219.abo.wanadoo.fr PART #ados
  • my ($nick,$usr,$host) = get_usrname($src);
  • };
  • sub on_quit{
  • my ($ans,$sock) = @_;
  • my ($src) = ($ans =~ /^:(\S*)\sQUIT\s/);
  • my ($nick,$usr,$host) = get_usrname($src);
  • };
  • sub on_privmsg{
  • my ($ans,$sock,$botnick,%admin) = @_;
  • my ($src,$dst,$msg) = ($ans =~ /^:(\S*)\sPRIVMSG\s(\S*)\s:(.*)/);
  • my ($nick,$usr,$host) = get_usrname($src);
  • my $servhost = $conf{"SERV_ADMIN_HOST"};
  • if(!($dst =~ /^$botnick$/i)){
  • on_pubmsg($src,$dst,$msg,$sock,$botnick);
  • return 0;
  • }
  • on_privmsg_admin($src,$dst,$msg,$nick,$sock,$host,$botnick) if (is_register("$host"));
  • on_privmsg_servadmin($src,$dst,$msg,$nick,$sock,$host,$botnick) if ($host =~ /^$servhost$/i);
  • on_version($nick,$sock) if($msg =~ /^VERSION\s/);
  • if($msg =~ /^AUTH\s/i){ #Authentification dans le chat.
  • if (is_register("$host")){
  • send_notice($nick,"Vous êtes déjà authentifié.",$sock);
  • }
  • else{
  • my ($pass) = ($msg =~ /^\S*\s(\S*)/);
  • my $sha1 = sha1_hex($pass);
  • $nick =~ tr/A-Z/a-z/;
  • if($admin{$nick} eq $sha1){
  • change_host($nick,$conf{"GEO_HOST"},$sock);
  • send_notice($nick,"Vous êtes désormais authentifié",$sock);
  • }
  • else{
  • send_notice($nick,"Echec de l'authentification",$sock);
  • kill_($nick,$sock,"Anti-Bruteforce Security System","Password missmatch");
  • }
  • }
  • }
  • return 0;
  • };
  • sub on_privmsg_admin{ #messages privés venant d'admins
  • my ($src,$dst,$msg,$nick,$sock,$host_sender,$botnick) = @_;
  • my ($word1) = ($msg =~ /^(\S+)/);
  • if ($word1 eq "load"){
  • load_axx();
  • send_notice($nick,"Base de données des utilisateurs rechargée en mémoire.",$sock);
  • }
  • order_mod_axx($sock,$nick,$msg) if ($word1 eq "modify");
  • order_join($sock,$nick,$msg) if ($word1 eq "join");
  • order_quit($sock,$nick,$msg) if ($word1 eq "quit");
  • order_self_unban($sock,$nick,$msg,"*!*\@$host_sender") if ($word1 eq "unban");
  • order_part($sock,$nick,$msg) if ($word1 eq "part");
  • order_bl_list($sock,$nick,$msg) if ($word1 eq "bllist");
  • #oper
  • order_oper($sock,$nick,$msg) if ($word1 eq "oper");
  • order_kill($sock,$nick,$msg,$botnick) if ($word1 eq "kill");
  • order_gline($sock,$nick,$msg,$botnick) if ($word1 eq "gline");
  • order_kline($sock,$nick,$msg,$botnick) if ($word1 eq "kline");
  • order_zline($sock,$nick,$msg,$botnick) if ($word1 eq "zline");
  • order_add_blacklist_agline($sock,$nick,$msg,$botnick) if ($word1 eq "sbl");
  • order_add_blacklist_akick($sock,$nick,$msg,$botnick) if ($word1 eq "bl");
  • order_rem_blacklist_akick($sock,$nick,$msg) if ($word1 eq "unbl");
  • order_set_mode($sock,$nick,$msg) if ($word1 eq "mode");
  • order_smode($sock,$nick,$msg) if ($word1 eq "smode");
  • order_rem_smode($sock,$nick,$msg) if ($word1 eq "unsmode");
  • #help
  • order_help($sock,$nick,$msg) if ($word1 eq "help");
  • };
  • sub on_pubmsg{
  • my ($src,$dst,$msg,$sock,$botnick) = @_;
  • my ($nick,$usr,$host) = get_usrname($src);
  • on_pubmsg_admin($nick,$src,$dst,$msg,$sock,$botnick) if(is_register("$host"));
  • };
  • sub on_pubmsg_admin{ #messages venant d'admins
  • my ($nick,$src,$dst,$msg,$sock,$botnick) = @_;
  • order_mode($sock,$nick,$msg,$dst) if ($msg =~ /^!m\s/i);
  • order_kick($sock,$nick,$msg,$dst,$botnick) if ($msg =~ /^!xk\s/i);
  • #oper
  • order_kill($sock,$nick,$msg,$botnick) if ($msg =~ /^!xkill\s/i);
  • order_gline($sock,$nick,$msg,$botnick) if ($msg =~ /^!xgline\s/i);
  • order_kline($sock,$nick,$msg,$botnick) if ($msg =~ /^!xkline\s/i);
  • order_zline($sock,$nick,$msg,$botnick) if ($msg =~ /^!xzline\s/i);
  • order_add_blacklist_agline($sock,$nick,$msg,$botnick,$dst) if ($msg =~ /^!xsbl\s/i);
  • order_add_blacklist_akick($sock,$nick,$msg,$botnick,$dst) if ($msg =~ /^!xbl\s/i);
  • order_rem_blacklist_akick($sock,$nick,$msg) if ($msg =~ /^!xunbl\s/i);
  • order_set_ident($sock,$nick,$msg) if ($msg =~ /^!xid\s/i);
  • order_rem_ident($sock,$nick,$msg) if ($msg =~ /^!xuid\s/i);
  • order_smode($sock,$nick,$msg) if ($msg =~ /^!xsmode\s/i);
  • order_rem_smode($sock,$nick,$msg) if ($msg =~ /^!xunsmode\s/i);
  • order_bl_list ($sock,$nick,$msg) if ($msg =~ /^!xbllist\s/i);
  • };
  • sub on_privmsg_servadmin{
  • my ($src,$dst,$msg,$nick,$sock,$host,$botnick)= @_;
  • order_add_axx($sock,$nick,$msg) if ($msg =~ /^add\s/i);
  • order_rem_axx($sock,$nick,$msg) if ($msg =~ /^remove\s/i);
  • if ($msg =~ /^load\s/i){
  • load_axx();
  • send_notice($nick,"Base de données des utilisateurs rechargée en mémoire.",$sock);
  • }
  • };
  • sub on_mode{
  • my ($ans,$sock) = @_;
  • my ($src,$dst,$mode,$parametre) = ($ans =~ /^:(\S+)\sMODE\s(\S+)\s(\S+)\s*(.*)$/);
  • my ($nick,$usr,$host) = get_usrname($src);
  • chomp $parametre;
  • if ($mode eq "+b" && $parametre =~ /^\*!\*@\*/){
  • kick($nick,$dst,$sock,"Taking Over detected");
  • change_mode("-b",$dst,$sock,"*!*@*")
  • }
  • };
  • sub on_version{
  • my ($nick, $sock) = @_;
  • send_notice($nick,"SinuZoiD System, bot de sécurité en Perl rédigé par iZy_TeH_PariaH",$sock);
  • };
  • sub on_notice{
  • my ($ans,$sock) = @_;
  • my ($src,$dst,$msg) = ($ans =~ /^(\S+)\sNOTICE\s(\S+)\s:(.*)$/);
  • my ($nick,$usr,$host) = get_usrname($src);
  • if (!defined($usr)){ #si ça ne matche pas
  • #serv notice
  • on_serv_notice($src,$dst,$msg,$sock); #src contient l'adresse server
  • }
  • else{
  • #user notice
  • }
  • };
  • sub on_nick{
  • my ($ans,$sock) = @_;
  • };
  • sub on_serv_notice{
  • my ($src,$dst,$msg,$sock) = @_;
  • my ($info,$data) = ($msg =~ /\*\*\*\s+Notice\s+--([^:]*):\s(.*)$/);
  • print_uchan("$msg",$sock);
  • on_new_connection($info,$data) if ($info =~ /Client\sconnecting\s/i);
  • on_new_exit($info,$data) if ($info =~ /Client\sexiting/i);
  • };
  • sub on_new_connection{
  • my ($info,$data) = @_;
  • my ($nick,$realh) = ($data =~ /(\S+)\s\((\S+)\)/);
  • $nick =~ tr/A-Z/a-z/;
  • $realh =~ s/^\S+\@//;
  • if(defined($conf{"SMODE"})){
  • kill_($nick,$sock,"Security System","Mode de sécurité activé ! Merci de vous reconnecter ulterieurement.");
  • }
  • if(defined($conf{"IDENT"})){
  • my $id = $conf{"IDENT"};
  • G_line($nick,$sock,"-- Match with blacklisted ident --") if ($nick =~ /$id/i);
  • return 0;
  • }
  • if ($blacklist{$nick} == 2){
  • G_line($nick,$sock,"-- BLACKLISTED ! --");
  • return 0;
  • }
  • };
  • sub on_new_exit{
  • my ($info,$data) = @_;
  • my ($pseudo,$realh) = ($data =~ /(\S+)\s\((\S+)\)/);
  • $realh =~ s/^\S+\@//;
  • chomp $pseudo;
  • chomp $realh;
  • };
  • sub on_raw_311{# nick user host
  • my ($ans,$sock) = @_;
  • my ($nickname,$usrname,$hostname) = ($ans =~ /^:\S+\s311\s\S+\s(\S+)\s(\S+)\s(\S+)\s*:*/);
  • $nickname =~ tr/A-Z/a-z/;
  • };
  • sub on_raw_378{ #is connecting from...
  • my ($ans,$sock) = @_;
  • my ($targ,$host,$ip) = ($ans =~ /(\S+)\s:is\sconnecting\sfrom\s(\S+)\s(\d+\.\d+\.\d+\.\d+)\s*$/);
  • };
  • sub on_raw_318{ #end of /whois
  • my ($ans,$sock) = @_;
  • my ($nickname) = ($ans =~ /^:\S+\s318\s\S+\s(\S+)\s*:*/);
  • };
  • #--Action
  • sub change_nick{
  • my ($nick,$sock) = @_;
  • print $sock "NICK $nick\r\n";
  • };
  • sub send_notice{
  • my ($dst,$msg,$sock) = @_;
  • print $sock "NOTICE $dst :$msg\r\n";
  • };
  • sub send_msg{
  • my ($dst,$msg,$sock) = @_;
  • print $sock "PRIVMSG $dst :$msg\r\n";
  • };
  • sub join_c{
  • my ($chan,$sock) = @_;
  • print $sock "JOIN $chan\r\n";
  • };
  • sub kill{
  • my ($nick,$sock,$arg) = @_;
  • if (!($arg)){
  • print $sock "KILL $nick :-- Requested by an IRCOP --\r\n";
  • }
  • else{
  • print $sock "KILL $nick :$arg\r\n";
  • }
  • };
  • sub change_mode{
  • my ($mode,$targ,$sock,$para) = @_;
  • print $sock "MODE $targ $mode\r\n" if (!defined($para));
  • print $sock "MODE $targ $mode $para\r\n" if (defined($para));
  • };
  • sub kick{
  • my ($targ,$chan,$sock,$raison) = @_;
  • print $sock "KICK $chan $targ :--Requested--\r\n" if (!($raison));
  • print $sock "KICK $chan $targ :$raison\r\n" if (defined($raison));
  • };
  • sub whois{
  • my ($targ,$sock) = @_;
  • print $sock "WHOIS $targ\r\n";
  • };
  • sub send_pubmsg{
  • my ($targ,$data,$sock) = @_;
  • print $sock "PRIVMSG $targ :$data\r\n";
  • };
  • sub part{
  • my ($targ,$sock) = @_;
  • print $sock "PART $targ :-- Requested by a Geofront --\r\n";
  • };
  • #oper
  • sub change_host{
  • my ($targ,$new_host,$sock) = @_;
  • print $sock "CHGHOST $targ $new_host\r\n";
  • };
  • sub kill_{
  • my ($targ,$sock,$nick,$raison) = @_;
  • print $sock "KILL $targ :$raison\r\n" if ($raison);
  • print $sock "KILL $targ :--Requested--\r\n" if (!$raison);
  • log_actions("$nick killed $targ [Raison : $raison]");
  • }
  • sub G_line{
  • my ($targ,$sock,$raison) = @_;
  • print $sock "GLINE $targ :$raison\r\n" if (defined($raison));
  • print $sock "GLINE $targ :G-lined [Requested by an IRCOP/Geofront]\r\n" if (!defined ($raison));
  • log_actions("$nick G-LINED $targ [Raison : $raison]");
  • };
  • sub K_line{
  • my ($targ,$sock,$raison) = @_;
  • print $sock "KLINE $targ :$raison\r\n" if (defined($raison));
  • print $sock "KLINE $targ :K-lined [Requested by an IRCOP/Geofront]\r\n" if (!defined($raison));
  • log_actions("$nick K-LINED $targ [Raison : $raison]");
  • };
  • sub Z_line{
  • my ($targ,$sock,$raison) = @_;
  • print $sock "ZLINE $targ :$raison\r\n" if (defined($raison));
  • print $sock "ZLINE $targ :Z-lined [Requested by an IRCOP/Geofront]\r\n" if (!defined($raison));
  • log_actions("$nick Z-LINED $targ [Raison : $raison]");
  • };
  • #EOF
#!/usr/bin/perl


####################################################
#			      SiNuZoiD						   #
# Service Géofront par iZy_TeH_PariaH			   #
# Version : 1.0							           #
# Testé sur Ubuntu                                 #
# Plus d'informations dans le readme               #
####################################################

use IO::Socket;
use Digest::SHA1 qw(sha1 sha1_hex sha1_base64);
use threads;
#--main
my ($addr,$port,$nick,$pass)  = @ARGV;
die ('Syntaxe : .pl addr port nick pass*') if (!defined($nick));
my %admin; #tableau de hachage contenant la liste Username -> Password
load_axx();
my %blacklist;#blacklist 1 = AKICK
my %conf; #table de hachage contenant la liste des configurations fixées
$conf{"IDENT"} = undef; #Identifiant à bloquer [Kill quand le pseudo match]
$conf{"ANTIPUB"} = 0; # 0 = pas d'antipub / 1 = Kick sur pub / 2 = KiLL sur pub / 3 = G-LINE sur pub
$conf{"SMODE"} = undef;
$conf{"UCHAN"} = "#Services";
$conf{"GEO_HOST"} = "Geofront.fr";
$conf{"SERV_ADMIN_HOST"} = "ServiceAdmin.fr";
print "-------- SinuZoiD Geofront Service ------------\n";
print "UCHAN : ".$conf{"UCHAN"}."\n";
print "GEO_HOST : ".$conf{"GEO_HOST"}."\n";
print "SERV_ADMIN_HOST : ".$conf{"SERV_ADMIN_HOST"}."\n";
print "Connection à $addr ($port)... Nick : $nick\n";

my $sock = IO::Socket::INET->new(proto => 'tcp', #Socket de connection au serveur IRC
								 PeerAddr => $addr,
								 PeerPort => $port);
								 
my ($ans,$raw);
connection_serv($nick,$sock,$pass); #Connection au serveur
while ($raw = <$sock>){ #Comunication avec le serveur
	$ans = uncolor_raw($raw);
	my $type = get_type($ans); #Récupération du type de requête
	on_ping($ans,$sock) if ($type =~ /PING/);
	on_join($ans,$sock) if ($type =~ /\sJOIN\s/);
	on_privmsg($ans,$sock,$nick,%admin) if ($type =~ /\sPRIVMSG\s/);
	on_quit($ans,$sock) if ($type =~ /\sQUIT\s/);
	on_part($ans,$sock) if ($type =~ /\sPART\s/);
	on_mode($ans,$sock) if ($type =~/\sMODE\s/);
	on_notice($ans,$sock) if ($type =~ /\sNOTICE\s/);
	on_raw_378($ans,$sock) if ($type =~ /\s378\s/); #whois IP - real hostname
	on_raw_311($ans,$sock) if ($type =~ /\s311\s/); #whois is pseudo usrname hostname
	on_raw_318($ans,$sock) if ($type =~ /\s318\s/); #end of /whois
}
#--Administration MESSAGE PRIVÉ
sub order_join{
	my ($sock,$nick,$raw) = @_;
	my ($w1,$w2) = ($raw =~ /^(\S+)\s+(\S+)/);
	
	if (!defined($w2)){
		send_notice($nick, "Erreur de syntaxe : join #CANAL",$sock);
		return 0;
	}
	send_notice($nick,"Joining $w2...",$sock);
	join_c($w2,$sock);
};
sub order_quit{
	my ($sock, $nick,$raw) = @_;
	send_notice($nick,"Déconnection du serveur...\n",$sock);
	print $sock "QUIT :Rebooting Service...\r\n";
};
sub order_mod_axx{
	my ($sock,$nick,$raw) = @_;
	my ($w1,$w2,$w3) = ($raw =~ /^(\S+)\s+(\S+)\s+(\S+)/);
	if (!defined($w3)){
		send_notice($nick, "Erreur de syntaxe : modify AncienPass NouveauPass",$sock);
		return 0;
	}
	$nick =~ tr/A-Z/a-z/;
	chomp $w3;
	my $sha1 = sha1_hex($w2); 
	if ($admin{$nick} eq $sha1){
		my $bool = 0;
		my $new_pass = sha1_hex($w3);
		open FIC, "root_axx.conf";
		my @fic = <FIC>;
		close FIC;
		foreach $entry (@fic){
			if($entry =~ /^$nick\s/i){
				$entry = "$nick $new_pass\n";
				$bool = 1;
				break;
			}
		}
		if ($bool == 1){
			open FIC, ">root_axx.conf";
			foreach $entry (@fic){
				print FIC "$entry";
			}
			close FIC;
			send_notice($nick, "Votre nouveau mot de passe est désormais $w3.",$sock);
			load_axx();
		}
		else{
			send_notice($nick, "Entrée non trouvée.",$sock);
		}
	return 0;
	}
	else{
		send_notice($nick,"Mot de passe incorrect !",$sock);
	}
};
sub order_rem_axx{
	my ($sock,$nick,$raw) = @_;
	my ($w1,$w2) = ($raw =~ /^(\S+)\s+(\S+)/);
	if (!defined($w2)){
		send_notice ($nick, "Erreur de syntaxe : remove PSEUDO",$sock);
		return 0;
	}
	chomp $w2;
	open FIC,"root_axx.conf";
	my @fic = <FIC>;
	my $bool = 0;
	close FIC;
	foreach $entry (@fic){
		if($entry =~ /^$w2\s/i){
			$entry = "";
			$bool = 1;
			break;
		}
	}
	if($bool == 1){
		open FIC, ">root_axx.conf";
		foreach $entry (@fic){
			print FIC "$entry";
		}
		close FIC;
		send_notice($nick, "Base de donnée modifiée.",$sock);
		load_axx();
		log_actions("$nick REMOVES the geofront account of $w2");
	}
	else{
		send_notice ($nick,"Entrée non trouvée.",$sock);
	}
	return 0;
};
sub order_add_axx{
	my ($sock,$nick,$raw) = @_;
	my ($w1,$w2,$w3) = ($raw =~ /^(\S+)\s+(\S+)\s+(\S+)/);
	if (!defined($w3)){
		send_notice($nick,"Erreur de syntaxe : add PSEUDO PASS",$sock);
		return 0;
	}
	open FIC,"root_axx.conf";
	@fic = <FIC>;
	close FIC;
	chomp $w3;
	my $sha1 = sha1_hex($w3);
	foreach (@fic){
		my ($usr,$pass) = ($_ =~ /^(\S*)\s(\S*)/);
		if ($w2 =~ /^$usr$/i){
			send_notice($nick,"$w2 est déjà inscrit dans la base de données. Utilisez la commande \"modify\" pour en modifier l'entrée",$sock);
			return 0;
		}
	}
	open FIC, ">>root_axx.conf";
	print FIC "$w2 $sha1\n";
	close FIC;
	send_notice($nick,"L'utilisateur $w2 à été inscrit dans la base de données. Son mot de passe est désormais $w3.",$sock);
	load_axx();
	log_actions("$nick ADDS a geofront account for $w2");
	return 0;
};
sub order_self_unban{
	my ($sock,$nick,$raw,$mask) = @_;
	my ($w1,$w2) = ($raw =~ /^(\S+)\s+(\S+)/);
	if (!defined($w2)){
		send_notice($nick,"Erreur de syntaxe : unban chan",$sock);
	}
	else{
		change_mode("-b",$w2,$sock,$mask);
		send_notice($nick,"Requête effectuée",$sock);
	}
};
sub order_oper{
	my ($sock,$nick,$raw) = @_;
	my ($w1,$w2,$w3) = ($raw =~ /^(\S+)\s+(\S+)\s+(\S+)/);
	if (!defined($w3)){
		send_notice($nick,"Erreur de syntaxe : oper <username> <oper_password>",$sock);
	}
	else{
		print $sock "OPER $w2 $w3\r\n";
	}
};
sub order_set_mode{
	my ($sock, $nick, $raw) = @_;
	my ($w1, $w2, $w3) = ($raw =~ /^(\S+)\s+(\S+)\s+(\S+)/);
	if (!defined ($w3)){
		send_notice($nick, "Erreur de syntaxe : mode <target> <mode>",$sock);
	}
	else{
		change_mode($w3,$w2,$sock);
		send_notice($nick,"Requête effectuée",$sock);
	}
};
sub order_part{
	my ($sock,$nick,$raw) = @_;
	my ($w1,$w2) = ($raw =~ /^(\S+)\s+(\S+)/);
	if (!defined($w2)){
		send_notice($nick, "Erreur de syntaxe : part <chan>",$sock);
	}
	else{
		part ($w2,$sock);
		send_notice($nick,"Requête effectuée",$sock);
	}
};
sub order_bl_list{
	my ($sock,$nick,$raw) = @_;
	my $not;
	send_notice($nick, "--- BLACKLIST ---",$sock);
	send_notice($nick, " TYPE       NICKNAME",$sock);				    	
	while (my ($k,$v) = each(%blacklist)){
		send_notice ($nick, "[CHAN]       $k",$sock) if ($v == 1);
		send_notice ($nick, "[SERV]       $k",$sock) if ($v == 2);
	}
};
#--Administration MESSAGE PUBLICS
sub order_mode{
	my ($sock,$nick,$raw,$chan) = @_;
	my ($w1,$w2) = ($raw =~ /^(\S+)\s+(\S+)/);
	if (!defined($w2)){
		send_notice($nick,"Erreur de syntaxe : !m <modes> <cible>",$sock);
	}
	else{
		my ($w3) = ($raw =~ /^\S+\s+\S+\s(\S+)/);
		if (!defined($w3)){ #sans paramètre
			change_mode($w2,$chan,$sock)
		}
		else{ #avec paramètre
			change_mode($w2,$chan,$sock,$w3);
		}
	}
};
sub order_kick{
	my ($sock,$nick,$raw,$chan,$botnick) = @_;
	my ($w1,$w2,$w3) = ($raw =~ /(\S+)\s+(\S+)\s*(.*)/);
	if ($w2 =~ /^$botnick$/i){
		send_notice($nick,"Erreur, vous ne pouvez pas expulser le robot",$sock);
		return 0;
	}
	if (!defined($w2)){
		send_notice($nick,"Erreur de syntaxe : !xk <nick> <raison>",$sock);
	}
	else{
		kick($w2,$chan,$sock,$w3);
	}
};
sub order_add_blacklist_akick{
	my ($sock,$nick,$raw,$botnick,$chan,) = @_;
	my ($w1,$w2) = ($raw =~ /(\S+)\s+(\S+)/);
	if ($w2 =~ /^$botnick$/i){
		send_notice($nick,"Erreur, vous ne pouvez pas blacklister le robot",$sock);
		return 0;
	}
	if (!defined ($w2)){
		send_notice($nick,"Erreur de syntaxe : !xbl (/msg bl) <nick> ",$sock);
	}
	else{
		send_notice($nick,"L'utilisateur $w2 a bien été ajouté à la blacklist. Tappez !xunbl <pseudo> pour l'y en retirer.",$sock);
		log_actions("$nick BLACKLISTED $w2 [KICK]");
		$w2 =~ tr/A-Z/a-z/;
		$blacklist{$w2} = 1;
		kick($w2,$chan,$sock,"-- Requested by $nick ::: Added to the BLACKLIST --");
	}
};
sub order_rem_blacklist_akick{
	my ($sock,$nick,$raw,$chan) = @_;
	my ($w1,$w2) = ($raw =~ /(\S+)\s+(\S+)/);
	if (!defined ($w2)){
		send_notice($nick,"Erreur de syntaxe : !xunbl (/msg unbl) <nick>",$sock);
	}
	else{
		$w2 =~ tr/A-Z/a-z/;
		if(defined($blacklist{$w2})){
			$blacklist{$w2} = undef;
			send_notice($nick,"Le pseudo $w2 a bien été retiré de la blacklist",$sock);
			log_actions("$nick REMOVE $w2 from blacklist");
		}
		else{
			send_notice($nick,"Impossible de trouver l'entrée",$sock);
		}
	}
};
sub order_add_blacklist_agline{
	my ($sock,$nick,$raw,$botnick,$chan) = @_;
	my ($w1,$w2) = ($raw =~ /^(\S+)\s+(\S+)/);
	if ($w2 =~ /^$botnick$/i){
		send_notice($nick,"Erreur, vous ne pouvez pas blacklister le robot",$sock);
		return 0;
	}
	if (!defined ($w2)){
		send_notice($nick,"Erreur de syntaxe : !xsbl (/msg sbl) <nick> ",$sock);
	}
	else{
		send_notice($nick,"L'utilisateur $w2 a bien été ajouté à la blacklist. Tappez !xunbl <pseudo> pour l'y en retirer.",$sock);
		print_uchan("$nick a ajouté le pseudo $w2 à la liste noire du serveur. Toute connection de ce pseudo sera automatiquement G-Lined",$sock);
		$w2 =~ tr/A-Z/a-z/;
		log_actions("$nick BLACKLISTED $w2 [G-LINE]");
		$blacklist{$w2} = 2;
	}
};

sub order_set_ident{
	my ($sock,$nick,$raw,$chan) = @_;
	my ($w1,$w2) = ($raw =~ /(\S+)\s+(\S+)/);
	if (!defined($w2)){
		send_notice($nick,"Erreur de syntaxe : !xid <identifiant>",$sock);
	}
	else{
		$w2 =~ tr/A-Z/a-z/;
		$conf{"IDENT"} = $w2;
		send_notice($nick,"L'identifiant $w2 est désormais interdit sur les salons. Tapez !xuid pour désactiver le ban à vue",$sock);
		print_uchan("$nick a interdit l'identifiant $w2. Toute connection sur le serveur comportant ce motif sera automatiquement G-LINED",$sock);
		log_actions("$nick set auto-gline on ident $w2");
	}
};
sub order_rem_ident{
	my ($sock,$nick,$raw,$chan) = @_;
	my ($w1) = ($raw =~ /(\S+)/);
	if (!defined ($conf{"IDENT"})){
		send_notice($nick,"Aucun identifiant n'est interdit actuellement.",$sock);
	}
	else{
		$conf{"IDENT"} = undef;
		print_uchan("$nick à levé l'intediction d'identifiant.",$sock);
		log_actions("$nick remove auto-gline on the ident");
		send_notice($nick,"La protection anti-idenfiant est désactivée.",$sock);
	}
};
sub order_smode{
	my ($sock,$nick,$raw) = @_;
	if(!defined($conf{"SMODE"})){
		$conf{"SMODE"} = 1;
		print_uchan("$nick a activé le mode de sécurité serveur maximum. Aucune connection entrante ne sera accéptée jusqu'à ce que vous levez l'interdiction (!xusmode)",$sock);
		send_notice($nick,"Mode de sécurité maximum activé ! Tapez !xsusmode pour le retirer",$sock);
		log_actions("$nick set SECURITY-MODE ON");
	}
	else{	
		send_notice($nick,"Le mode de sécurité maximum est déjà activé",$sock);
	}
};
sub order_rem_smode{
	my ($sock,$nick,$raw) = @_;
	if (!defined($conf{"SMODE"})){
		send_notice($nick,"Le mode de sécurité est déja desactivé !",$sock);
	}
	else{
		$conf{"SMODE"} = undef;
		send_notice($nick,"Mode de sécurité desactivé",$sock);
		log_actions("$nick set SECURITY-MODE OFF");
		print_uchan("$nick à desactivé le mode de sécurité maximum !",$sock);
	}
};
sub order_help{
	my ($sock,$nick,$chan) = @_;
	send_notice($nick,"------------------- Commandes Géofront -------------------",$sock);
	send_notice($nick,"		Commandes en Message Privé:",$sock);
	send_notice($nick,"auth <password> ................ authentification sur le robot",$sock);
	send_notice($nick,"load ........................... recharge le fichier root_axx.conf en mémoire",$sock);
	send_notice($nick,"join <#chan> ................... rejoint le salon spécifié",$sock);
	send_notice($nick,"part <#chan> ................... part du salon spécifié",$sock);
	send_notice($nick,"quit ........................... quitte le serveur",$sock);
	send_notice($nick,"unban <#chan> .................. débannit votre host du salon spécifié (ban de la forme *!*\@votrehost)",$sock);
	send_notice($nick,"oper <user> <password> ......... permet au robot de s'identifier en temps qu'IRCOP",$sock);
	send_notice($nick,"kill <pseudo>",$sock);
	send_notice($nick,"kline <pseudo> ................. permet de kill (respct. k-line / g-line / z-line) l'utilisateur spécifié du serveur.",$sock);
	send_notice($nick,"gline <pseudo>",$sock);
	send_notice($nick,"zline <pseudo>",$sock);
	send_notice($nick,"bl / unbl <pseudo> ........... permet de blacklister (respct. retirer de la blacklist) l'utilisateur spécifié.",$sock);
	send_notice($nick,"sbl / unbl <pseudo> .......... permet de blacklister (respct. retirer de la blacklist) du serveur l'utilisateur spécifié.",$sock);
	send_notice($nick,"smode / unsmode .............. bloque (respct. lève le blocage) des connections serveur.",$sock);
	send_notice($nick, "mode <target> <mode> ........ ajoute/retire le(s) modes spécifiés sur la cible.",$sock);
	send_notice($nick,"bllist ....................... affiche la blacklist.",$sock);
	send_notice($nick,"                   ",$sock);
	send_notice($nick,"			Commandes en Message Public:",$sock);
	send_notice($nick,"!m <mode> <parametre>* .......... execute le(s) mode(s) sur le salon spécifié associé au paramètre éventuellement précisé",$sock);
	send_notice($nick,"!xk <pseudo> <raison>* .......... kick le pseudo avec la raison éventuellement précisée",$sock);
	send_notice($nick,"!xkill <pseudo> <raison>*",$sock);
	send_notice($nick,"!xkline <pseudo> <raison>*",$sock);
	send_notice($nick,"!xgline <pseudo> <raison>*........ kill (respct k-line/g-line/z-line) l'utilisateur spécifié du serveur",$sock);
	send_notice($nick,"!xzline <pseudo> <raison>*",$sock);
	send_notice($nick,"!xbl <pseudo> .................... ajoute le pseudo spécifié à la blacklist (liste des AutoKick/ban)",$sock);
	send_notice($nick,"!xubl <pseudo> ................... retire le pseudo spécifié de la blacklist",$sock);
	send_notice($nick,"!xsbl <pseudo> .................... blacklist le pseudo sur le serveur (se retire avec !xubl)",$sock); 
	send_notice($nick,"!xbllist .......................... affiche la liste des utilisateurs blacklistés",$sock);
	send_notice($nick,"!xid <ident> ..................... Bloque l'identifiant <ident> (G-line toute personne rejoignant le salon dont le pseudo comporte le motif spécifié dans <ident>)",$sock);
	send_notice($nick,"!xuid ............................ retire le bloquage de l'identifiant.",$sock);
	send_notice($nick,"!xsmode / !xunsmode .............. bloque (respct. lève le blocage) des connections serveur.",$sock);
	send_notice($nick,"Nota bene : les paramètres suivis d'un asterisque * sont facultatifs",$sock);
	
};
#--Systèmes OPER
sub order_kill{
	my ($sock,$nick,$raw,$botnick) = @_;
	my ($w1,$w2,$w3) = ($raw =~ /^(\S+)\s+(\S+)\s*(.*)/);
	if ($w2 =~ /^$botnick$/i){
		send_notice($nick,"Erreur, vous ne pouvez pas déconnecter le robot",$sock);
		return 0;
	}
	if (!defined($w2)){	
		send_notice($nick,"Erreur de syntaxe : [!xkill / msg kill] <nick> <raison>",$sock);
	}
	else{
		kill_($w2,$sock,$nick,$w3);
	}
};
sub order_gline{
	my ($sock,$nick,$raw,$botnick) = @_;
	my ($w1,$w2,$w3) = ($raw =~ /^(\S+)\s+(\S+)\s*(.*)/);
	if ($w2 =~ /^$botnick$/i){
		send_notice($nick,"Erreur, vous ne pouvez pas déconnecter le robot",$sock);
		return 0;
	}
	if (!defined($w2)){	
		send_notice($nick,"Erreur de syntaxe : [!xgline / msg gline] <nick> <raison>",$sock);
	}
	else{
		G_line($w2,$sock,$nick,$w3);
	}
};
sub order_kline{
	my ($sock,$nick,$raw,$botnick) = @_;
	my ($w1,$w2,$w3) = ($raw =~ /^(\S+)\s+(\S+)\s*(.*)/);
	if ($w2 =~ /^$botnick$/i){
		send_notice($nick,"Erreur, vous ne pouvez pas déconnecter le robot",$sock);
		return 0;
	}
	if (!defined($w2)){	
		send_notice($nick,"Erreur de syntaxe : [!xkline / msg kline] <nick> <raison>",$sock);
	}
	else{
		K_line($w2,$sock,$nick,$w3);
	}
};
sub order_zline{
	my ($sock,$nick,$raw,$botnick) = @_;
	my ($w1,$w2,$w3) = ($raw =~ /^(\S+)\s+(\S+)\s*(.*)/);
	if ($w2 =~ /^$botnick$/i){
		send_notice($nick,"Erreur, vous ne pouvez pas déconnecter le robot",$sock);
		return 0;
	}
	if (!defined($w2)){	
		send_notice($nick,"Erreur de syntaxe : [!xzline / msg zline] <nick> <raison>",$sock);
	}
	else{
		Z_line($w2,$sock,$nick,$w3);
	}
};
#-- Network

sub connection_serv{
	my ($name,$sock,$pass) = @_;
	print $sock "PASS $pass\r\n" if (defined($pass));
	print $sock "NICK $name\r\n";
	print $sock "USER iService localhost irc_server :18 F iZy <3\r\n"
};


#--Fonction utillitaires
sub get_type{
	my ($raw) = @_;
	my ($entete) = ($raw =~ /^:*([^:]*):/); #Si l'entête prends un paramètre
	if(!($entete =~ /\S+/)){
		$entete = $raw;
	}
	return $entete;
};
sub get_usrname{#retourne le nick/usr/host
	my ($raw) = @_;
	my ($nick,$usr,$host) = ($raw =~ /^(.*)!(.*)@(.*)/);
	return ($nick,$usr,$host);
};
sub uncolor_raw{#Supprime la couleur du texte
	my ($msg) = @_;
	chomp $msg;
	$msg =~ s/[0,1]{0,1}[0-9]{0,1}//g;
	$msg =~ s///g;
	#$msg =~ s///g;
	$msg =~ s///g;
	return $msg;
};

sub load_axx{ #charge en mémoire la liste des accès
	%admin = undef;
	open FIC,"root_axx.conf"; #Syntaxe :: user pass
	while (<FIC>){
		my ($usr,$pass) = ($_ =~ /^(\S+)\s(\S+)/);
		chomp $usr;
		chomp $pass;
		$usr =~ tr/A-Z/a-z/;
		$admin{$usr} = $pass;
	}
	close FIC;

};
sub is_register{ #regarde si le pseudo est inscrit
	my ($host) = @_;
	my $geo_h = $conf{"GEO_HOST"};
	if ($host =~ /^$geo_h/i){
		return 1;
		}
	else{
		return 0;
	}
};
sub log_actions{
	my ($data) = @_;
	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
	$mon++;
	$year += 1900;
	open FIC, ">>log_IRCOP.log";
	print FIC "[$mday/$mon/$year]- $hour:$min:$sec # $data\n";
	close FIC;
};

sub print_uchan{
	my ($data,$sock) = @_;
	if (defined($conf{"UCHAN"})){
		send_pubmsg($conf{"UCHAN"},$data,$sock);
	}
};
#--Event

sub on_ping{
	my ($raw,$sock) = @_;
	my ($pong) = ($raw =~ /^PING (:\w*)/);
	print $sock "PONG $pong\r\n";
};

sub on_join{
	my ($ans,$sock) = @_;
	my ($src,$canal) = ($ans =~ /^:(\S*)\sJOIN\s:(\S*)/);
	my ($nick,$usr,$host) = get_usrname($src);
	$nick =~ tr/A-Z/a-z/;
	if ($blacklist{$nick} == 1){
		change_mode("+b",$canal,$sock,"*!*\@$host");
		kick($nick,$canal,$sock,"BLACKLISTED !");
		return 0;
	}
};
sub on_part{
	my ($ans,$sock) = @_;
	my ($src,$canal) = ($ans =~/^:(\S*)\sPART\s(\S*)/); #pas de ":" => iZy_TeH_PariaH!iZoMorphisM@reagi-100E34EF.w86-219.abo.wanadoo.fr PART #ados
	my ($nick,$usr,$host) = get_usrname($src);

};
sub on_quit{
	my ($ans,$sock) = @_;
	my ($src) = ($ans =~ /^:(\S*)\sQUIT\s/);
	my ($nick,$usr,$host) = get_usrname($src);
};
sub on_privmsg{
	my ($ans,$sock,$botnick,%admin) = @_;
	my ($src,$dst,$msg) = ($ans =~ /^:(\S*)\sPRIVMSG\s(\S*)\s:(.*)/);
	my ($nick,$usr,$host) = get_usrname($src);
	my $servhost = $conf{"SERV_ADMIN_HOST"};
	if(!($dst =~ /^$botnick$/i)){
		on_pubmsg($src,$dst,$msg,$sock,$botnick);
		return 0;
	}
	on_privmsg_admin($src,$dst,$msg,$nick,$sock,$host,$botnick) if (is_register("$host"));
	on_privmsg_servadmin($src,$dst,$msg,$nick,$sock,$host,$botnick) if ($host =~ /^$servhost$/i);
	on_version($nick,$sock) if($msg =~ /^VERSION\s/);
	if($msg =~ /^AUTH\s/i){ #Authentification dans le chat.
		if (is_register("$host")){
			send_notice($nick,"Vous êtes déjà authentifié.",$sock);
		}
		else{
			my ($pass) = ($msg =~ /^\S*\s(\S*)/);
			my $sha1 = sha1_hex($pass);
			$nick =~ tr/A-Z/a-z/;
			if($admin{$nick} eq $sha1){
				change_host($nick,$conf{"GEO_HOST"},$sock);
				send_notice($nick,"Vous êtes désormais authentifié",$sock);
			}
			else{
				send_notice($nick,"Echec de l'authentification",$sock);
				kill_($nick,$sock,"Anti-Bruteforce Security System","Password missmatch");
			}
		}
	}
	
	return 0;
};
sub on_privmsg_admin{ #messages privés venant d'admins
	my ($src,$dst,$msg,$nick,$sock,$host_sender,$botnick) = @_;
	my ($word1) = ($msg =~ /^(\S+)/);
	if ($word1 eq "load"){
		load_axx();
		send_notice($nick,"Base de données des utilisateurs rechargée en mémoire.",$sock);
	}
	order_mod_axx($sock,$nick,$msg) if ($word1 eq "modify");
	order_join($sock,$nick,$msg) if ($word1 eq "join");
	order_quit($sock,$nick,$msg) if ($word1 eq "quit");
	order_self_unban($sock,$nick,$msg,"*!*\@$host_sender") if ($word1 eq "unban");
	order_part($sock,$nick,$msg) if ($word1 eq "part");
	order_bl_list($sock,$nick,$msg) if ($word1 eq "bllist");
	#oper
	order_oper($sock,$nick,$msg) if ($word1 eq "oper");	
	order_kill($sock,$nick,$msg,$botnick) if ($word1 eq "kill");
	order_gline($sock,$nick,$msg,$botnick) if ($word1 eq "gline");
	order_kline($sock,$nick,$msg,$botnick) if ($word1 eq "kline");
	order_zline($sock,$nick,$msg,$botnick) if ($word1 eq "zline");
	order_add_blacklist_agline($sock,$nick,$msg,$botnick) if ($word1 eq "sbl");
	order_add_blacklist_akick($sock,$nick,$msg,$botnick) if ($word1 eq "bl");
	order_rem_blacklist_akick($sock,$nick,$msg) if ($word1 eq "unbl");
	order_set_mode($sock,$nick,$msg) if ($word1 eq "mode");
	order_smode($sock,$nick,$msg) if ($word1 eq "smode");
	order_rem_smode($sock,$nick,$msg) if ($word1 eq "unsmode");
	#help
	order_help($sock,$nick,$msg) if ($word1 eq "help");

};
sub on_pubmsg{
	my ($src,$dst,$msg,$sock,$botnick) = @_;
	my ($nick,$usr,$host) = get_usrname($src);
	on_pubmsg_admin($nick,$src,$dst,$msg,$sock,$botnick) if(is_register("$host"));
};
sub on_pubmsg_admin{ #messages venant d'admins
	my ($nick,$src,$dst,$msg,$sock,$botnick) = @_;
	order_mode($sock,$nick,$msg,$dst) if ($msg =~ /^!m\s/i);
	order_kick($sock,$nick,$msg,$dst,$botnick) if ($msg =~ /^!xk\s/i);
	#oper
	order_kill($sock,$nick,$msg,$botnick) if ($msg =~ /^!xkill\s/i);
	order_gline($sock,$nick,$msg,$botnick) if ($msg =~ /^!xgline\s/i);
	order_kline($sock,$nick,$msg,$botnick) if ($msg =~ /^!xkline\s/i);
	order_zline($sock,$nick,$msg,$botnick) if ($msg =~ /^!xzline\s/i);
	order_add_blacklist_agline($sock,$nick,$msg,$botnick,$dst) if ($msg =~ /^!xsbl\s/i);
	order_add_blacklist_akick($sock,$nick,$msg,$botnick,$dst) if ($msg =~ /^!xbl\s/i);
	order_rem_blacklist_akick($sock,$nick,$msg) if ($msg =~ /^!xunbl\s/i);
	order_set_ident($sock,$nick,$msg) if ($msg =~ /^!xid\s/i);
	order_rem_ident($sock,$nick,$msg) if ($msg =~ /^!xuid\s/i);
	order_smode($sock,$nick,$msg) if ($msg =~ /^!xsmode\s/i);
	order_rem_smode($sock,$nick,$msg) if ($msg =~ /^!xunsmode\s/i);
	order_bl_list ($sock,$nick,$msg) if ($msg =~ /^!xbllist\s/i);
};
sub on_privmsg_servadmin{
	my ($src,$dst,$msg,$nick,$sock,$host,$botnick)= @_;
	order_add_axx($sock,$nick,$msg) if ($msg =~ /^add\s/i);
	order_rem_axx($sock,$nick,$msg) if ($msg =~ /^remove\s/i);
	if ($msg =~ /^load\s/i){
		load_axx();
		send_notice($nick,"Base de données des utilisateurs rechargée en mémoire.",$sock);
	}
};
sub on_mode{
	my ($ans,$sock) = @_;
	my ($src,$dst,$mode,$parametre) = ($ans =~ /^:(\S+)\sMODE\s(\S+)\s(\S+)\s*(.*)$/);
	my ($nick,$usr,$host) = get_usrname($src);
	chomp $parametre;
	if ($mode eq "+b" && $parametre =~ /^\*!\*@\*/){
		kick($nick,$dst,$sock,"Taking Over detected");
		change_mode("-b",$dst,$sock,"*!*@*")
	}
};
sub on_version{
	my ($nick, $sock) = @_;
	send_notice($nick,"SinuZoiD System, bot de sécurité en Perl rédigé par iZy_TeH_PariaH",$sock);
};
sub on_notice{
	my ($ans,$sock) = @_;
	my ($src,$dst,$msg) = ($ans =~ /^(\S+)\sNOTICE\s(\S+)\s:(.*)$/);
	my ($nick,$usr,$host) = get_usrname($src);
	if (!defined($usr)){ #si ça ne matche pas
		#serv notice
		on_serv_notice($src,$dst,$msg,$sock); #src contient l'adresse server
	}
	else{
		#user notice

	}
};
sub on_nick{
	my ($ans,$sock) = @_;
};
sub on_serv_notice{
	my ($src,$dst,$msg,$sock) = @_;
	my ($info,$data) = ($msg =~ /\*\*\*\s+Notice\s+--([^:]*):\s(.*)$/);
	print_uchan("$msg",$sock);
	on_new_connection($info,$data) if ($info =~ /Client\sconnecting\s/i);
	on_new_exit($info,$data) if ($info =~ /Client\sexiting/i);
};
sub on_new_connection{
	my ($info,$data) = @_;
	my ($nick,$realh) = ($data =~ /(\S+)\s\((\S+)\)/);
	$nick =~ tr/A-Z/a-z/;
	$realh =~ s/^\S+\@//;
	if(defined($conf{"SMODE"})){
		kill_($nick,$sock,"Security System","Mode de sécurité activé ! Merci de vous reconnecter ulterieurement.");
	}
	if(defined($conf{"IDENT"})){
		my $id = $conf{"IDENT"};
		G_line($nick,$sock,"-- Match with blacklisted ident --") if ($nick =~ /$id/i);
		return 0;
	}
	if ($blacklist{$nick} == 2){
		G_line($nick,$sock,"-- BLACKLISTED ! --");
		return 0;
	}
};
sub on_new_exit{
	my ($info,$data) = @_;
	my ($pseudo,$realh) = ($data =~ /(\S+)\s\((\S+)\)/);
	$realh =~ s/^\S+\@//;
	chomp $pseudo;
	chomp $realh;
};
sub on_raw_311{# nick user host
	my ($ans,$sock) = @_;
	my ($nickname,$usrname,$hostname) = ($ans =~ /^:\S+\s311\s\S+\s(\S+)\s(\S+)\s(\S+)\s*:*/);
	$nickname =~ tr/A-Z/a-z/;
};
sub on_raw_378{ #is connecting from...
	my ($ans,$sock) = @_;
	my ($targ,$host,$ip) = ($ans =~ /(\S+)\s:is\sconnecting\sfrom\s(\S+)\s(\d+\.\d+\.\d+\.\d+)\s*$/);
};
sub on_raw_318{ #end of /whois
	my ($ans,$sock) = @_;
	my ($nickname) = ($ans =~ /^:\S+\s318\s\S+\s(\S+)\s*:*/);
		
};
#--Action
sub change_nick{
	my ($nick,$sock) = @_;
	print $sock "NICK $nick\r\n";
};
sub send_notice{
	my ($dst,$msg,$sock) = @_;
	print $sock "NOTICE $dst :$msg\r\n";
};
sub send_msg{
	my ($dst,$msg,$sock) = @_;
	print $sock "PRIVMSG $dst :$msg\r\n";
};
sub join_c{
	my ($chan,$sock) = @_;
	print $sock "JOIN $chan\r\n";
};
sub kill{
	my ($nick,$sock,$arg) = @_;
	if (!($arg)){
		print $sock "KILL $nick :-- Requested by an IRCOP --\r\n";
	}
	else{
		print $sock "KILL $nick :$arg\r\n";
	}
};
sub change_mode{
	my ($mode,$targ,$sock,$para) = @_;
	print $sock "MODE $targ $mode\r\n" if (!defined($para));
	print $sock "MODE $targ $mode $para\r\n" if (defined($para));
};
sub kick{
	my ($targ,$chan,$sock,$raison) = @_;
	print $sock "KICK $chan $targ :--Requested--\r\n" if (!($raison));
	print $sock "KICK $chan $targ :$raison\r\n" if (defined($raison));
};
sub whois{
	my ($targ,$sock) = @_;
	print $sock "WHOIS $targ\r\n";
};
sub send_pubmsg{
	my ($targ,$data,$sock) = @_;
	print $sock "PRIVMSG $targ :$data\r\n";
};
sub part{
	my ($targ,$sock) = @_;
	print $sock "PART $targ :-- Requested by a Geofront --\r\n";
};
#oper
sub change_host{
	my ($targ,$new_host,$sock) = @_;
	print $sock "CHGHOST $targ $new_host\r\n";
};
sub kill_{
	my ($targ,$sock,$nick,$raison) = @_;
	print $sock "KILL $targ :$raison\r\n" if ($raison);
	print $sock "KILL $targ :--Requested--\r\n" if (!$raison);
	log_actions("$nick killed $targ [Raison : $raison]");
}
sub G_line{
	my ($targ,$sock,$raison) = @_;
	print $sock "GLINE $targ :$raison\r\n" if (defined($raison));
	print $sock "GLINE $targ :G-lined [Requested by an IRCOP/Geofront]\r\n" if (!defined ($raison));
	log_actions("$nick G-LINED $targ [Raison : $raison]");
};
sub K_line{
	my ($targ,$sock,$raison) = @_;
	print $sock "KLINE $targ :$raison\r\n" if (defined($raison));
	print $sock "KLINE $targ :K-lined [Requested by an IRCOP/Geofront]\r\n" if (!defined($raison));
	log_actions("$nick K-LINED $targ [Raison : $raison]");
};
sub Z_line{
	my ($targ,$sock,$raison) = @_;
	print $sock "ZLINE $targ :$raison\r\n" if (defined($raison));
	print $sock "ZLINE $targ :Z-lined [Requested by an IRCOP/Geofront]\r\n" if (!defined($raison));
	log_actions("$nick Z-LINED $targ [Raison : $raison]");
};
#EOF

 Conclusion

J'espère que vous tirerez un apprentissage de cette source ! J'ai essayé de commenter le code pour que la comprehension ne soit pas trop rude ! Merci de me reporter les bugs si vous en trouvez !

Enjoy !

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   SinuZoiD
    • root_axx.conf
    • Readme.txtTélécharger ce fichier [Réservé aux membres club]Voir ce fichier7 033 octets
    • Readme.txt~Télécharger ce fichier [Réservé aux membres club]7 031 octets
    • Sinuzoid.plTélécharger ce fichier [Réservé aux membres club]27 182 octets
    • Sinuzoid.pl~Télécharger ce fichier [Réservé aux membres club]27 169 octets

Télécharger le zip


 Historique

06 mars 2010 18:22:40 :
Modification du .zip / Modification du niveau de difficulté / Supression de l'affichage des raw IRC.
07 mars 2010 10:44:29 :
Modification de la présentation des commandes (/msg Sinuzoid help). Ajout de la commande !xbllist (ou /msg Sinuzoid bllist) pour afficher la liste des utilisateurs de la liste noire. Modification du readme pour expliquer comment installer les modules nécessaire au fonctionnement du bot.

 Sources de la même categorie

Source avec Zip TCL EGGDROP par aliassangelius
ANIMATION POUR BOT par michounou
RECORD AFFLUENCE MULTI-SALON par extarsik
Source avec Zip Source avec une capture LOGCHAN BY DIIMS :: POUR BOT :: TOTALEMENT CONFIGURABLE par sodims
SALON TRADUCTION par CsDarkman

 Sources en rapport avec celle ci

LA CONFIGURATION D'UN EGGDROP QUI ENLÈVE LES BANS APRÈS X ... par Atok
Source avec Zip Source avec une capture LOGCHAN BY DIIMS :: POUR BOT :: TOTALEMENT CONFIGURABLE par sodims
Source avec Zip BIOTECH [V1.0] par kassak1
Source avec Zip SYSTÈME SEEN par Niamor7
Source avec Zip Source avec une capture GEOTOOLS : GESTION D'UN UWORLD par PaDa

Commentaires et avis

Commentaire de iZyTeHPariaH le 06/03/2010 18:27:25

Désolé a tous, je n'avais pas posté la bonne source et la sécurité par authentification ne marchait pas. Le bug est désormais corrigé.
J'attends vos conseils pour améliorer ce code !

Commentaire de aliassangelius le 06/03/2010 22:24:24 6/10

ouah pas mal le code j'ai lu en speed mais c'est super c'est ce dont je risque d'avoir besoin dans quelque temp quand je vais lancer mon server irc unrealird !! même si je ne comprend pas le perl les explication sont pas mal j'aime bien.

toutefois j'aurai une question un peut bête on le lance via un eggdrop ? car perl je sais pas comment cela fonctionne :s

Commentaire de iZyTeHPariaH le 07/03/2010 00:42:49

Salut ! Il faut que tu aie installé perl sur ton serveur (sudo apt-get install perl sur débian). Ensuite, tu installe les modules requis ( "sudo cpan" puis "install <nom du module>"). Regarde dans le readme !

Tient moi au courrant ;-)

Commentaire de PaDa le 07/03/2010 11:44:15

A priori Perl est installé par défaut sur Debian ;)

Sympa la source sinon, j'aurais juste quelques conseils :
- externalise les données dans un/des fichier(s) de conf, ça rendrait le code nettement plus lisible (dommage que l'aide soit directement dans le code notamment)
- tu pourrais factoriser certaines opérations : les ouvertures/écriture/fermeture d'un fichier de conf gagneraient à être toutes dans une fonction donnée par exemple
- tu peux certainement diviser la source en plusieurs fichiers, ça commence à être long pour un seul fichier et tu t'y retrouveras mieux pour faire évoluer à terme

Bonne continuation!

Commentaire de iZyTeHPariaH le 07/03/2010 12:37:20

Salut PaDa. Merci pour ton commentaire.
A vrai dire, je reconnais que je pourrais créer un fichier de configuration, mais sachant qu'il n'y a que quelques options, je pense que c'est d'autant plus rapide de les modifier directement dans le script (ou de les faire passer en paramètre via le shell par exemple).
Par contre, je ne vois pas ce que tu entends par "factoriser les opérations". Le fichier gérant les accès est chargé à partir d'une seule fonction, et l'ajout/suppression d'accès se fait via 3 fonctions différentes.

Et pour ta dernière remarque, je dois reconnaitre que j'ai appris assez rapidement le perl, et que j'ai du passer certains chapitres, notamment la programation modulaire ! Mais j'm'y mettrais (Peut être =D)!

Bonne continuation à toi aussi ;-)

Commentaire de aliassangelius le 07/03/2010 23:41:36

Salut ok j'ai bien tout noter des que je créer mon server je te tien au courant sans soucis =)
ps: pada débian sais pas si il et bien niveau sécurité mais faut je cherche quel type de server et le meilleur =)

Commentaire de Benjamin37 le 08/03/2010 10:53:05

Belle source . J'ai lu furtivement le code mais le projet est pas mal .

En effet pada a raison . Perl est installé par défaut sur Debian et aussi sur Ubuntu ( normal hein )

Commentaire de iZyTeHPariaH le 08/03/2010 20:31:56

Merci ! Je suis toujours ouvert aux comentaires !

Commentaire de uaip le 12/03/2010 13:41:50

Salut,
Ca change effectivement des codes mIRC de coloration des whois ou répondeurs pv... (ne rentrons pas dans les préjugés :p), mais je ne vois pas trop où est le niveau initié là dedans.
Cela dit, la source a l'air complète. Malheureusement aucun commentaire (ou très peu), donc pas facile de lire...
Tu te mettras à la prog modulaire, je te le garantis (on passe tous par cette transition 1/plusieurs fichiers, qui nous rebute au début, par flemme sans doute).

Une remarque quand même j'ai lu assez rapidement), il y a beaucoup de regex, trop peut-être. Tu les utilises parfois pour tokenizer par exemple, on peut faire autrement. Autant éviter les regex quand on peut faire sans...

Bonne continuation, je re-regarderai sans doute le code, installé confortablement chez moi.

Commentaire de iZyTeHPariaH le 13/03/2010 04:07:41

Bonjour ! Merci pour ton commentaire. J'ai choisis de mettre un niveau de difficulté "initié" dans le sens où il est nécessaire d'être un initié d'irc pour comprendre les raw IRC (ça s'arrete là). Sachant que la plus part des gens qui passent tapent On Privmsg (ou autre, je ne programme pas sous mIRC), je pensais que ça pouvais en perturber certain =).

J'ai essayé également de donner des noms compréhensibles à mes fonctions,de bien diviser toutes les tâches et de subdiviser mon script en plusieurs rubriques. Si malgrès tout elle reste difficile à interpréter, je peux en effet la détailler.

Les expressions rationelles sont assez puissantes (surtout en perl), c'est pour ça que je les utilises pour récupérer notamment les differents mots de la raw IRC (et pour frimer ?). Cependant, je suis d'accord qu'elles alourdissent énormément le code vu qu'elles sont recompilées à chaque itérations. Cependant certaines regex sont identiques. Il existe une option (m//e si je ne m'abuse) permettant d'éviter la recompilation de l'automate à chaque execution de cette regex, mais j'avoue ne pas m'être renseigné sur le sujet. Je reconnais ne pas avoir optimisé au maximum ce code (ce qui ne veut pas dire que je ne me suis pas appliqué hein ?), je me pencherais sur ce problème quand j'aurai un peu de temps.

Une fois de plus, merci pour vos commentaires !

Commentaire de wims le 18/03/2010 23:08:08

"Les expressions rationelles sont assez puissantes (surtout en perl), c'est pour ça que je les utilises pour récupérer notamment les differents mots de la raw IRC (et pour frimer ?). Cependant, je suis d'accord qu'elles alourdissent énormément le code vu qu'elles sont recompilées à chaque itérations. Cependant certaines regex sont identiques. Il existe une option (m//e si je ne m'abuse) permettant d'éviter la recompilation de l'automate à chaque execution de cette regex, mais j'avoue ne pas m'être renseigné sur le sujet. Je reconnais ne pas avoir optimisé au maximum ce code (ce qui ne veut pas dire que je ne me suis pas appliqué hein ?), je me pencherais sur ce problème quand j'aurai un peu de temps."

je ne connais pas le perl mais je connais bien les regex pcre, et ce que voulais dire Uaip je pense, c'est que les regex sont lentes, puissante dans le sens ou c'est très bien pour parser très simplement une chaine voir faire des remplacement, mais plus lent que si tu ne les utilisaient pas en gros :)

Commentaire de iZyTeHPariaH le 20/03/2010 21:08:35

C'est bien ce que j'ai compris, mais une particularité du perl c'est que les regex disposent d'une option pour ne pas que l'automate recompile la regex à chaque utilisation : ainsi, le processus n'est pas alourdi. Mais c'est vrai, il faudrait que je me renseigne sur cette option.

Merci pour ta remarque !

Commentaire de RanZ0x le 06/04/2010 10:13:51

Ta source est pas mal, mais n'est pas compatible avec inspircd et dreams ircd, je le met quand même en téléchargement sur mon site web les tcl d'eggdrop sa soule beaucoup, sa serai bien d'avoir une version compatible avec inspircd...
Et prévois si tu peux un service anope en Perl gérant le mysql sa serai bien c'est ce que je cherche merci ^^

Cordialement
Tr3nT  

Commentaire de RanZ0x le 06/04/2010 10:15:21

mon site www.ingeulls.fr sa serai bien de faire découvrir le PERL sur mon site les protocole et plein de choses merci

Commentaire de uaip le 06/04/2010 12:24:52

Salut,
"Et prévois si tu peux un service anope en Perl gérant le mysql sa serai bien c'est ce que je cherche merci ^^ "

Tu veux pas non plus un café, 5 euros et un Mars ?

Commentaire de aliassangelius le 06/04/2010 17:11:01

Bonjour

MDR RanZox.. si vraiment comme tu la écrit "Tr3nT" tu serais le vrai Tr3nT je pense que tu serait faire cela hein =)

Commentaire de uaip le 06/04/2010 19:30:28

Salut,
Et félicitation pour le don que tu possèdes, à savoir être capable d'écrire sans réfléchir à la phrase que tu écris.
Non seulement tu utilises le verbe "être" au lieu de "savoir", mais en plus tu ne sais pas le conjuguer.
Non vraiment, c'est fort...

Commentaire de aliassangelius le 06/04/2010 20:23:46

en même temp on et pas içi pour corriger les erreurs sur l'hortographe.. mais des source bref on sans fou

Commentaire de uaip le 06/04/2010 21:36:58

Je me suis permis de critiquer ton orthographe (article 3 de la charte) en partie parce-que ton commentaire ne servait à rien.
D'ailleurs il ne corrige pas non plus la source :)
"Bref", comme tu dis. La parenthèse est fermée.

Commentaire de RanZ0x le 07/04/2010 00:54:38

tu crois vraiement que je vais passé mon temp à me relire et me corriger en orthographe pour info j'ai passé l'âge du Perl et du tcl ...
j'ai autre chose à faire sur ce c'est çà un site journal intime je fouille pour voir les sources et les mettres sur mon site ensuite moi j'ai plus le temps pour irc, je propose des idée pour moi et pour les gens aussi qui m'ont demandé
@+

Commentaire de uaip le 07/04/2010 16:21:59

Salut,
Apparemment tu n'as toujours pas dépassé le stade du "moi je suis plus fort que toi, d'abord". J'en ai quelque chose à faire, tu crois, des langages que tu maitrises ?
Je ne suis pas non plus sur IRC, et je faisais du Perl et TCL il y a environ 2ans. Comme quoi, ta tentative de domination est ratée.
Désolé si je t'ai vexé, c'était pas mon intention.

A bon entendeur.

Commentaire de RanZ0x le 07/04/2010 18:02:42

non pas dutout véxé pourquoi je le serai si tu fais des choses bien en perl ou en tcl pourquoi pas ? aliassangelius  c'était à lui que je m'adressais donc pas à toi, je répond plus à des message de provocation alors faites ce que vous voulez
@+

Commentaire de iZyTeHPariaH le 10/04/2010 14:34:34

Détendez vous les gars ;-)

Pour répondre à RanZ0x, en théorie, les raw IRC de base sont respectées (donc tu peux te connecter sur ton serveur avec ce bot, kicke...). Derrière, les raws particulières de UnrealIRCD ne sont pas utilisables (j'ai developpé ce bot car j'avais uniquement un unrealircd sous la main). Ainsi, il ne fonctionnera que partiellement sur les serveurs n'utilisant pas le démon UNREAL.

Navré ;-)

PS : n'hesitez pas à poster ce bot, je rapelle que je l'ai publié à dans un but didactique, et si il peut permettre à certains de mieux comprendre comment fonctionne IRC, ça ne peut être que bénéfique ;-).

Commentaire de RanZ0x le 10/04/2010 20:52:53

ok
je suis hébergeur et webmaster/webdesign, si tu veux je te propose plusieur solution gratuitement pour que tu puisse dévellopper des services ou des robots sur d'autre serveur comme inspircd..... puis je mettrais t'es sources en téléchargement sur mon site aprés on pourrait integrer mysql et php pour pouvoir gérer le service via le web
  

Commentaire de uaip le 10/04/2010 21:04:31

Tiens, je viens de me rendre compte d'un truc génial.
Je reprochais la faute d'orthographe à aliassangelius, qui m'a répondu au début, puis c'est RanZ0x qui a pris la suite. Alors quoi, il est stupide ? Les deux pseudos sont la même personne ? Héhé... mystère.

Sinon, il est sympa, ton site. J'aime bien l'ergonomie et le design.

Commentaire de RanZ0x le 10/04/2010 21:24:36

UAIP faut bien faire des efforts d'orthographe d'ailleurs en ce moment je suis en formation donc je fais des progrès en orthographe et pour info le reproche des fautes d'orthographes je l'ai pris pour moi

ce site je me suis pas cassé la téte c'est un CMS j'ai trop de travail en ce moment je peux pas m'amusé pour mon site donc moi je trouve qu'il est pas beau

pour info je suis pas le genre de mec qui trompe les gens donc j'ai pas deux pseudos je ne vois pas l'utilité puis j'ai autre chose à faire

Commentaire de uaip le 10/04/2010 22:00:04

Lol ok ok, pas de soucis :)
Cela dit, on ne peut pas se permettre de se nommer "webmaster/webdesign" quand on utilise un CMS ;)
N'empêche que j'aime bien le rendu.
Mais on s'éloigne du topic, fermons la parenthèse.

Commentaire de RanZ0x le 10/04/2010 22:13:08

sans commentaire

Commentaire de iZyTeHPariaH le 11/04/2010 08:25:56

Merci de proposer Ranzox, mais je n'ai plus trop le temps de developper en ce moment (periode de concours ;-) ).

Commentaire de RanZ0x le 11/04/2010 21:37:42

ok pas grave c'est pour toi et pour les gens et c'est vrai que niveau inspircd y'a pas trop de services moi j'ai un Pooshy et anope mais le reste y'a pas de services autres que çà
quand t'es chaud tu sais ou me trouver jilaniyy@hotmail.fr si tu as besoin de devellopper

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Problème PsyBNC [ par RoX5 ] Yop,J'ai installer mon bot psybnc sur le port 7001 nikel sa marche super mais le prob, depuis que je me connecte ac psybnc je suis bien oper, je c&#23 service de stats [ par sebabulle ] Bonjour,voila je suis a la recherche d'aide loolEn fait j'ai un ami qui a ouvert un serveur irc... on a fait un bot de stats mais voila on se demande Recherche scripteur TCL [ par RoX5 ] Hello, Comment allez vous ?&nbsp; Je recherche un scripteur TCL qui pourrais me faire un script pour que mon bot eggdrop s'identifie quand il se conne Script TCL VIP BOT [ par DetaX ] Bonjour tout le monde j'ai chercher sur google sur Qnet et je trouves pas de codeur TCL. J'aurai besoin d'un bot ViP Comme ceux de : http://www.sicher Bot connection/déconnexion [ par RoX5 ] Bonjour,Existe t'il d&#233;j&#224; un bot (en eggdrop ou pearl) qui dit sur un canal pr&#233;d&#233;fini ex #oper qui dit chaque fois que quelq'un se installer un bot sur son canal [ par BlackWizzard ] salut! tt le monde!je voudrais savoir comment instaler et administrer un bot sur un channel (le mien C #hackz sur irc.respublica.fr)...G deja un bot m Explication de la plupart des failles des channel service version 5,5.1 [ par taye ] WarninG - WG (wanadoo/voila chat | Undernet)---------- ----Liste de quelques bugs assez vieux des Channel Service (CS5, CS5.1):Déconnecter le servic créer un bot sous quakenet [ par benlesurvivant ] est-ce que kkun pourrais m'epliquer comment créer un bot sous quakenet. Merci d'avance :-) Améliorer un bot pour un chan de clan counter-strike [ par JeKto ] Salut !Je voudrai améliorer mon bot pour mon clan j'ai dejà quelsues commandes TEXT mais je voudrai par exemple que le bot guarde en memoire le nick d Serveur IRC [ par Delirium ] Hello :)J'ai crée un nouveau petit reseau IRC dont le but est^la convivialité !!pour le moment il n'est pas encore "super" fréquanté mais avec des gen


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Juillet 2010
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,967 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales