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











                                     










                                                  





                                          











                                                                      














                                                                    















                                                     
                                         





                                       





                                  



                                                       





                                           







                                                                          





                                                   




                                                               

                                                    








                                                                          





                                        






















                                                                               





                                                   





                                                                          
                                                   








                              




                                                  




                                                    






                                                                          
                                                  
 













                                                                                
                                    
                                
                                    






                            












                                                                 
                                                           


















                                                                                  
                                                           
                                                               



                                   
                                                      



                           


                           
                           
 

                     
#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.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;

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

	len = strlen (str);

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

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

buf_t	make_buffer(int len)
{
	buf_t	buf;

	buf.buf = malloc (len);
	buf.len = len + 1;	/* Alloc trailing \0 */

	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));		/* "<msg>EOF"	*/

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

	free (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", msg);
		printf ("Usage: /JOIN #channel");
		return (0);
	}

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

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

	free (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));	/* "<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]));	/* "<msg>EOF"*/

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

	free (msg);
	return (out.buf);
}

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

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

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

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

	/*
	espik_raw_send (out);
	espik_con_shutdown ();

	irc_disconnect(sock);
	*/
	free (msg);

	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));	/* "<nick>EOF"	*/

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

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

	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();
	printf ("> irc_disconnect");
	ecore_main_loop_quit ();
	printf ("< irc_disconnect");
	espik_leave();
}
#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);

		/*
		printf ("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]);
				free (msg);
				/* Why do job after found the good to do ? */
				break;   
			}
		}
		if (!out)
		{
			printf ("%s is not a know command",
					   cmd_and_message[0]);
			return (0);
		}
	}
	else
		out = irc_privmsg (current_chan, msg);

	if (!out)
	{
		free (msg);
		return (0);
	}

	printf ("%s", out);

	return (out);
}