Parser irc 2

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 417 fois - Téléchargée 30 fois

Contenu du snippet

salut a tous.ce code permet de determiner les elements d'un message irc et de les ecrires dans une structure.bien pratique pour' l'ecriture d'un bot.tester sur mon bot ca marche nickel.(p3 400 mhz).

Source / Exemple :


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct IRCLINE
{
	char sender[64]; // :jack!busta@aol-C490E8E0 ou :irc.aol.com
	char action[8]; // PRIVMSG JOIN PART etc....
	char message[512]; // : salut mon gars
	char channel[32];  // #chanell
	char nick[32];    // bustabot
	char numeric[4]; // 401 succeful joined
	char mode[16];  // +MmuCcRitpv
}IRCLINE;

int IsUpperCase(char chaine[]){
    int i=0;
    while(chaine[i]!= '\0'){
    if(chaine[i] < 'A' || chaine[i] > 'Z') return 0;
    i++;
    }  
    return 1;
}

int IsNumeric(const char number[]){
    int i=0;
    while(number[i]!='\0'){
                         if(number[i] < '0' || number[i] > '9') return 0;                  
                          i++;
    }
    return i == 3 ?1 : 0;
}

int parseline(const char ircline[BUFSIZ],char tab[][512]){

	int     nb_mot=1,i=0,j=0;     
	char    *pointeur,*buffer;
     
	buffer = strdup(ircline); 
	pointeur = strtok( buffer, " " );
	strcpy(tab[0],pointeur);
	
	while( pointeur != NULL ) {	
		
		pointeur = strtok( NULL, " " ); 
		if ( pointeur != NULL ) { 
			nb_mot++; 
			strcpy(tab[nb_mot-1],pointeur);  
		} 

	}
	/*********** on 'recolle' la partie message ******************/
	for(i=1;i<(nb_mot+1);i++){
       if(tab[i][0]==':'){
         for(j=1;j<(nb_mot-i);j++){
         strcat(tab[i]," ");                         
         strcat(tab[i],tab[i+j]);
         strcpy(tab[i+j],"\0");
         }
       }
    }
    
	return nb_mot-(j-1);  
}

void GetIrcParam(const char imgline[],IRCLINE* irc){
    
    int nb_mot=0,i=0,j=0;
    char tab[10][512];
    memset(&tab, 0, sizeof(tab));
    nb_mot=parseline(imgline,tab);
    if(nb_mot==2){
            strcpy(irc->action,tab[0]);
            strcpy(irc->message,tab[1]+1);
        }
    else {
          strcpy(irc->sender,tab[0]+1);
                  for(i=1;i<(nb_mot);i++){                  
                              if(IsUpperCase(tab[i]))strcpy(irc->action,tab[i]);
                              //else if(IsNumeric(tab[i]))infoirc.numeric=atoi(tab[i]);
                              else if(IsNumeric(tab[i]))strcpy(irc->numeric,tab[i]);
                              else if(tab[i][0]=='#')strcpy(irc->channel,tab[i]);
                              else if(tab[i][0]==':')strcpy(irc->message,tab[i]+1);
                              else if((tab[i][0]==('-'))||(tab[i][0]=='+'))strcpy(irc->mode,tab[i]);
                              else {
                                   if(tab[i][0]!='@')strcpy(irc->nick,tab[i]);
                                   }
                  }
            }
                  
    
}

int main(){
    const char line[]=":jack!busta@aol-C490E8E0 TOPIC #bustabot :salut busta";
    IRCLINE infoirc;
    memset(&infoirc, 0, sizeof(infoirc));
    GetIrcParam(line,&infoirc);

    printf("Sender %s\n"
           "Action %s\n"
           "Message %s\n"
           "Channel %s\n"
           "Nick %s\n"
           "Numeric %s\n"
           "Mode %s\n",infoirc.sender,infoirc.action,infoirc.message,infoirc.channel,infoirc.nick,infoirc.numeric,infoirc.mode);

    
    getch();
    return 0;
}

Conclusion :


il reste quelques modification a faire pour ameliorer le code.je travail toujours dessus.c'est juste un code temporaire.

A voir également

Ajouter un commentaire Commentaires
Messages postés
13
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
7 janvier 2007

oki je ferai de mon mieux.de tout facon le code sur lequel je travail de suite est un code qui n'a rien a voir avec irc.histoire de changer un peu et que les gens ne pensent que ne sachent faire que ca lol.ca changera un peu lol.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Essaie quand même de varier un peu les titres si possible
Messages postés
13
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
7 janvier 2007

merci,ca reste assez ressemblable car j'utilise la fonction du 1 mais l'objectif reste different et je reste assez brancher irc donc les codes qui suivront seront aussi un peu du meme genre,je reprenderai meme ces codes pour illustrer leurs utilisation dans un projet final.merci de ta comprehention.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
OK, source dé-supprimée
Messages postés
13
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
7 janvier 2007

ya une difference majeur dans le code.la premiere source parsait la partie message "vue" sur le channel irc afin d'en faire des parametre tel argc argv sous irc avec un bot.celle ci ne fait pas ca du tout.elle identifie les action,sender,message,topic etc...bref a 1ere vue aucune difference pour quelq'un qui ne code rien utilisant irc.mais une difference majeur pour ceux qui connaissent.
en gros prenons cette ligne
const char line[]=":jack!busta@aol-C490E8E0 TOPIC #bustabot :salut busta";
le premier code parsait ce qu'il y a apres les :,cad salut busta pour en faire 2 param.pour en faire des commandes par la suite tel que : :join #channel.
ce code est tout a fait different en terme de fonctionnalité.car il identifie qui envoi le message.quel action est faites.le numero associer a l'action.etc....
bref je trouve que votre reaction a été bien vive sans vraiment regarder a quoi correspond le code.
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.