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