aboutsummaryrefslogblamecommitdiff
path: root/src/espik_irc.c
blob: dbe962dff323a70a1e4918c85cfae63f6833a693 (plain) (tree)







































































































































































































































































































                                                                                  
#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 (len);
	buf.len = len + 1;	/* Alloc trailing \0 */

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

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

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

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

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

	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));	/* "<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]);
				free (msg);
				/* 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)
	{
		free (msg);
		espik_leave();
		return (0);
	}

	espik_debug_print ("%s", out);

	espik_leave();
	return (out);
}