#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <Ecore.h>
//#include <Ecore_Con.h>
#include "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;
cmd_t cmd_tab[] = {
{"JOIN", irc_join},
{"PART", irc_part},
{"PRIVMSG", irc_privmsg},
{"QUIT", irc_quit},
{"RAW", irc_raw},
/*{"ACTION", irc_action}, */
{0, 0}
};
char **separate_commandline (char *msg)
{
unsigned int len;
char **two_words;
for (len = 0; msg[len] != ' '; len++); /* Yes, do nothing, just get len ! */
two_words = malloc (sizeof (char *) * 2);
chk_malloc (two_words);
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;
}
}
unsigned short sendmsg_len (char *msg)
{
return (strlen (msg) + 2);
}
char *irc_privmsg (char *chan, char *msg)
{
char *out;
unsigned int len;
len = strlen ("PRIVMSG") + 1 /* space */
+ strlen (chan) + 2 /* space: */
+ strlen (msg) + 1; /* \0 */
out = malloc (sizeof (char) * len);
chk_malloc (out);
snprintf (out, len, "PRIVMSG %s :%s", chan, msg);
return (out);
}
char *irc_join (char *chan __UNUSED__, char *msg)
{
char *out;
int len;
if (msg[0] != '#') /* COuld also by '&' and so one ... have to look on RFC, dev will be done with # only */
{
printf ("%s is not a channel\n", msg);
printf ("Usage: /JOIN #channel\n");
return (0);
}
len = strlen ("JOIN") + 1 + strlen (msg) + 1;
out = malloc (sizeof (char) * len);
chk_malloc (out);
snprintf (out, len, "JOIN %s", msg);
return (out);
}
char *irc_part (char *chan, char *msg)
{
char *out;
int len;
if (msg[0] != '#')
{
len = strlen ("PART") + 1 + strlen (chan) + 2 + strlen (msg) + 1;
printf ("irc_part: len: %d\n", len);
out = malloc (sizeof (char) * len);
chk_malloc (out);
snprintf (out, len, "PART %s :%s", chan, msg);
}
else
{
char **sep;
sep = separate_commandline (msg);
len = strlen ("PART") + 1 + strlen (sep[0]) + 2 + strlen (sep[1]) + 1;
out = malloc (sizeof (char) * len);
chk_malloc (out);
snprintf (out, len, "PART %s :%s", sep[0], sep[1]);
}
return (out);
}
char *irc_quit (char *chan __UNUSED__, char *msg)
{
char *out;
int len;
len = strlen ("QUIT") + 2 + strlen (msg) + 1;
out = malloc (sizeof (char) * len);
chk_malloc (out);
snprintf (out, len, "QUIT :%s", msg);
printf ("msg : %s\nout: %s\n", msg, out);
//espik_raw_send (out);
//espik_con_shutdown ();
// irc_disconnect(sock);
return (out);
}
char *irc_raw (char *chan __UNUSED__, char *msg)
{
return (msg);
}
/*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");
}*/
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);
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]);
break; /* WHy do job after found the good to do ? */
}
}
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);
}