#include #include #include #include //#include #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); }