aboutsummaryrefslogblamecommitdiff
path: root/src/espik_irc.c
blob: 2555297ec96574368ecf52d32caf40f9ae2d2abe (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_net.h"
#include "espik_debug.h"
#include "espik.h"

char*	current_chan;

typedef struct
{
	char*	cmd_name;
	char*	(*format) (char *dest, char *msg);
} cmd_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;
	espik_enter();

	/* 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');

	espik_leave();
	return (two_words);
}

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

	len = strlen (str);

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

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

buf_t	make_buffer(int len)
{
	buf_t	buf;
	espik_enter();

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

	espik_leave();
	return (buf);
}

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

	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);

	espik_leave();
	return (out.buf);
}

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

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

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

	espik_leave();
	return (out.buf);
}

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

	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]);
	}

	espik_leave();
	return (out.buf);
}

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

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

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

	espik_debug_print ("msg : %s\nout: %s", msg, out.buf);

	/*
	espik_raw_send (out);
	espik_con_shutdown ();

	irc_disconnect(sock);
	*/

	espik_leave();
	return (out.buf);
}

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

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

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

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

	espik_debug_print ("NICK CHANGED REQUEST: %s", nick);

	espik_leave();
	return (out.buf);
}

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

void	irc_disconnect (Ecore_Con_Server *sock)
{
	espik_enter();
	espik_debug_print ("> irc_disconnect");
	ecore_main_loop_quit ();
	espik_debug_print ("< irc_disconnect");
	espik_leave();
}
#endif

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

	out = NULL;

	current_chan = "#e.fr";

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

		cmd_and_message = separate_commandline (msg + 1);

/*		espik_debug_print ("irc_send: <separate_commandline");	*/
		
		/*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)
		{
			espik_debug_print ("%s is not a know command",
					   cmd_and_message[0]);
			espik_leave();
			return (0);
		}
	}
	else
	{
		out = irc_privmsg (current_chan, msg);
	}

	if (!out)
	{
		espik_leave();
		return (0);
	}

	espik_debug_print ("%sn", out);

	espik_leave();
	return (out);
}