#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; /* Yes, do nothing, just get len ! */ for (len = 0; msg[len] != ' '; len++); two_words = malloc (sizeof(char*) * 2); 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; /* EOF */ out = malloc (sizeof(char) * len); snprintf (out, len, "PRIVMSG %s :%s", chan, msg); return (out); } char* irc_join (char* chan __UNUSED__, char* msg) { char* out; int len; /* 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\n", msg); printf ("Usage: /JOIN #channel\n"); return (0); } len = strlen ("JOIN") + 1 + strlen (msg) + 1; out = malloc (sizeof(char) * len); 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); 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); 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); 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]); /* WHy do job after found the good to do ? */ break; } } 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); }