#include #include #include #include //#include #include "espik_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; typedef struct { char* buf; int len; } buf_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 } }; 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; } #if _ESPIK_DEBUG_ printf("string_upper: %s\n", str); #endif } unsigned short sendmsg_len (char* msg) { return (strlen (msg) + 2); } static buf_t make_buffer(int len) { buf_t buf; buf.buf = malloc (sizeof(char) * len); buf.len = len; return (buf); } char* irc_privmsg (char* chan, char* msg) { buf_t out; out = make_buffer (strlen ("PRIVMSG") + 1 /* "PRIVMSG " */ + strlen (chan) + 2 /* ": " */ + strlen (msg) + 1); /* "EOF" */ snprintf (out.buf, out.len, "PRIVMSG %s :%s", chan, 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\n", msg); printf ("Usage: /JOIN #channel\n"); return (0); } out = make_buffer (strlen ("JOIN") + 1 /* "JOIN " */ + strlen (msg) + 1); /* "EOF" */ snprintf (out.buf, out.len, "JOIN %s", 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 /* ": " */ + strlen (msg) + 1); /* "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 /* ": " */ + strlen (sep[1]) + 1); /* "EOF" */ snprintf (out.buf, out.len, "PART %s :%s", sep[0], sep[1]); } return (out.buf); } char* irc_quit (char* chan __UNUSED__, char* msg) { buf_t out; out = make_buffer (strlen ("QUIT") + 2 /* "QUIT :" */ + strlen (msg) + 1); /* "EOF" */ snprintf (out.buf, out.len, "QUIT :%s", msg); #if _ESPIK_DEBUG_ printf ("msg : %s\nout: %s\n", msg, out.buf); #endif /* espik_raw_send (out); espik_con_shutdown (); irc_disconnect(sock); */ 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) + 1); /* "EOF" */ snprintf (out.buf, out.len, "NICK %s", nick); #if _ESPIK_DEBUG_ printf ("NICK CHANGED REQUEST: %s\n", nick); #endif return (out.buf); } #if 0 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"); } #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); #if _ESPIK_DEBUG_ printf ("irc_send: 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); }