aboutsummaryrefslogblamecommitdiff
path: root/src/espik_irc.c
blob: e5c0bd456aff0681d1e91fb9238f56270bcc81eb (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 }
};

char**	separate_commandline (char *msg)
{
	unsigned int	len;
	char**			two_words;

	/* Yes, do nothing, just get len ! */
	for (len = 0; msg[len] != ' '; len++);
		two_words = malloc (sizeof(char*) * 2);

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

	return (two_words);
}

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
}

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 = "#test";

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

	printf ("%s\n", out);

	return (out);
}