aboutsummaryrefslogblamecommitdiff
path: root/src/espik_irc.c
blob: a87f904c78421e67257be5bf81f5d68e65028cc0 (plain) (tree)
1
2
3
4
5
6
7
8
9






                        
                         
                      
                        



                                   
                     


              

                                                  

        


                    
                    

        
                     






                                             
                

  



                                                                      
                                        
 
                            
                                  
 
                                             


                                                                    
 

                               





                                                              
 
                           

 
     
                                
 
                               
 
                           
 




                                                     
                 
                                          
      
 
      
 
                                       
 
                                  

 
                                    
 



                                              
 




                                           
                    
 
                                                                                  

                                                                                  
 
                                                                 
 
                         

 
                                                   
 
                    


                                                               






                                                      

                                                                          
 
                                                    
 
                         

 
                                        
 
                    
 

                          


                                                                          

                                                                      





                                                 
 


                                                                          

                                                                           
         
 
                         

 
                                                   
 
                    
 

                                                                          
 
                                                     
 
                 
                                                     
      
 
          

                              
 
                             
          
 
                         

 
                                                  
 
                     

 

                                                    
                    
 

                                                                          
 
                                                     
 
                 
                                                    
      
 
                         

 
     
                                                                                
 
                      
 
 
                                               
 


                                      
 
      
 
                            
 
                    
 
                   
 
                               
 

                          
                                        
                            
 
                                                                 
 
                 
                                                                  
      
                
                                                      
 

                                                              
                                                                                  
                         
                                                                                     
                                                                             
                                         
                         








                                                                                  
                                                      


                 
                           
 
                 
                             
      

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

#include <Ecore.h>
//#include <Ecore_Con.h>

#include "espik_global.h"
#include "espik_irc.h"
#include "espik_error.h"
//#include "espik_common_handler.h"
#include "espik.h"
#include "espik_net.h"

char*	current_chan;

typedef struct
{
	char*	cmd_name;
	char*	(*format) (char *dest, char *msg);
} cmd_t;

typedef struct
{
	char*	buf;
	int	len;
} buf_t;

cmd_t	cmd_tab[] = {
	{ "JOIN",	irc_join	},
	{ "PART",	irc_part	},
	{ "PRIVMSG",	irc_privmsg	},
	{ "QUIT",	irc_quit	},
	{ "RAW",	irc_raw		},
	{ "NICK",	irc_nick	},
/*	{ "ACTION",	irc_action	}, */
	{ 0, 0 }
};

/* Cut the commandline in two string
 * 1: The first word
 * 2: The rest (without any trailer whitespace between firt and rest).
 */
char**	separate_commandline (char *msg)
{
	unsigned int	len;
	char**		two_words;

	/* Yes, do nothing, just get len ! */
	for (len = 0 ; msg[len] != ' ' && msg[len] != '\t' ; len++);

	two_words = malloc (2 * sizeof(char*));

	msg[len]	= '\0';
	two_words[0]	= msg;

	do
	{
		two_words[1] = msg + ++len;
	}
	while (*two_words[1] == ' ' || *two_words[1] == '\t');

	return (two_words);
}

#if 0
void	string_upper (char *str)
{
	unsigned int	len, i;

	len = strlen (str);

	for (i = 0; i < len; i++)
	{
		if (str[i] >= 0x61 && str[i] <= 0x7A)
			str[i] -= 0x20;
	}
#if _ESPIK_DEBUG_
	printf("string_upper: %s\n", str);
#endif
}
#endif

unsigned short	sendmsg_len (char* msg)
{
	return (strlen (msg) + 2);
}

static buf_t	make_buffer(int len)
{
	buf_t	buf;

	buf.buf = malloc (sizeof(char) * len);
	buf.len = len;

	return (buf);
}

char*	irc_privmsg (char* chan, char* msg)
{
	buf_t	out;

	out = make_buffer (strlen ("PRIVMSG") + 1	/* "PRIVMSG "		*/
			+ strlen (chan) + 2		/* ":<channel> "	*/
			+ strlen (msg) + 1);		/* "<msg>EOF"		*/

	snprintf (out.buf, out.len, "PRIVMSG %s :%s", chan, msg);

	return (out.buf);
}

char*	irc_join (char* chan __UNUSED__, char* msg)
{
	buf_t	out;
	
	/* COuld also by '&' and so one ...
	 * have to look on RFC, dev will be done with # only */
	if (msg[0] != '#')
	{
		printf ("%s is not a channel\n", msg);
		printf ("Usage: /JOIN #channel\n");
		return (0);
	}

	out = make_buffer (strlen ("JOIN") + 1		/* "JOIN "	*/
			+ strlen (msg) + 1);		/* "<msg>EOF"	*/

	snprintf (out.buf, out.len, "JOIN %s", msg);

	return (out.buf);
}

char*	irc_part (char* chan, char* msg)
{
	buf_t	out;

	if (msg[0] != '#')
	{
		out = make_buffer (strlen ("PART") + 1	/* "PART "	*/
				+ strlen (chan) + 2	/* ":<chan> "	*/
				+ strlen (msg) + 1);	/* "<msg>EOF"	*/

		snprintf (out.buf, out.len, "PART %s :%s", chan, msg);
	}
	else
	{
		char**	sep;

		sep = separate_commandline (msg);

		out = make_buffer (strlen ("PART") + 1	/* "PART "	*/
				+ strlen (sep[0]) + 2	/* ":<chan> "	*/
				+ strlen (sep[1]) + 1);	/* "<msg>EOF"	*/

		snprintf (out.buf, out.len, "PART %s :%s", sep[0], sep[1]);
	}

	return (out.buf);
}

char*	irc_quit (char* chan __UNUSED__, char* msg)
{
	buf_t	out;

	out = make_buffer (strlen ("QUIT") + 2		/* "QUIT :"	*/
			+ strlen (msg) + 1);		/* "<msg>EOF"	*/

	snprintf (out.buf, out.len, "QUIT :%s", msg);

#if _ESPIK_DEBUG_
	printf ("msg : %s\nout: %s\n", msg, out.buf);
#endif

	/*
	espik_raw_send (out);
	espik_con_shutdown ();

	irc_disconnect(sock);
	*/

	return (out.buf);
}

char*	irc_raw (char* chan __UNUSED__, char* msg)
{
	return (msg);
}

char*	irc_nick (char* chan __UNUSED__, char* nick)
{
	buf_t	out;

	out = make_buffer (strlen ("NICK") + 1		/* "NICK "	*/
			+ strlen (nick) + 1);		/* "<nick>EOF"	*/

	snprintf (out.buf, out.len, "NICK %s", nick);

#if _ESPIK_DEBUG_
	printf ("NICK CHANGED REQUEST: %s\n", nick);
#endif

	return (out.buf);
}

#if 0
Ecore_Con_Server*	irc_connect (char* host __UNUSED__, int port __UNUSED__)
{
	return (NULL);
}

void	irc_disconnect (Ecore_Con_Server *sock)
{
	printf ("> irc_disconnect\n");
	ecore_main_loop_quit ();
	printf ("< irc_disconnect\n");
}
#endif

char*	irc_send (char* msg)
{
	char*	out;

	out = NULL;

	current_chan = "#e.fr";

	if (msg[0] == '/')
	{
		char**	cmd_and_message;
		cmd_t*	cmd;

		cmd_and_message = separate_commandline (msg + 1);

#if _ESPIK_DEBUG_
/*		printf ("irc_send: <separate_commandline\n");	*/
#endif
		
		/*string_upper (cmd_and_message[0]);*/

		for (cmd = cmd_tab; cmd->cmd_name != 0; cmd++)
		{
			if ((strcasecmp (cmd_and_message[0], cmd->cmd_name)) == 0)
			{
				out = cmd->format (current_chan, cmd_and_message[1]);
				/* Why do job after found the good to do ? */
				break;   
			}
		}
		if (!out)
		{
			printf ("%s is not a know command\n", cmd_and_message[0]);
			return (0);
		}
	}
	else
	{
		out = irc_privmsg (current_chan, msg);
	}

	if (!out)
		return (0);

#if _ESPIK_DEBUG_
	printf ("%s\n", out);
#endif

	return (out);
}