diff options
Diffstat (limited to 'src/espik_irc.c')
-rw-r--r-- | src/espik_irc.c | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/src/espik_irc.c b/src/espik_irc.c new file mode 100644 index 0000000..dbe962d --- /dev/null +++ b/src/espik_irc.c @@ -0,0 +1,296 @@ +#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_debug.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; + espik_enter(); + + /* 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'); + + espik_leave(); + 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; + } + espik_debug_print ("string_upper: %s", str); + espik_leave(); +} +#endif + +unsigned short sendmsg_len (char* msg) +{ + espik_enter(); + espik_leave(); + return (strlen (msg) + 2); +} + +buf_t make_buffer(int len) +{ + buf_t buf; + espik_enter(); + + buf.buf = malloc (len); + buf.len = len + 1; /* Alloc trailing \0 */ + + espik_leave(); + return (buf); +} + +char* irc_privmsg (char* chan, char* msg) +{ + buf_t out; + espik_enter(); + + 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); + espik_leave(); + return (out.buf); +} + +char* irc_join (char* chan __UNUSED__, char* msg) +{ + buf_t out; + espik_enter(); + + /* Could also by '&' and so one ... + * have to look on RFC, dev will be done with # only */ + if (msg[0] != '#') + { + espik_debug_print ("%s is not a channel", msg); + espik_debug_print ("Usage: /JOIN #channel"); + espik_leave(); + return (0); + } + + out = make_buffer (strlen ("JOIN") + 1 /* "JOIN " */ + + strlen (msg)); /* "<msg>EOF" */ + + snprintf (out.buf, out.len, "JOIN %s", msg); + + free (msg); + espik_leave(); + return (out.buf); +} + +char* irc_part (char* chan, char* msg) +{ + buf_t out; + espik_enter(); + + 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); + espik_leave(); + return (out.buf); +} + +char* irc_quit (char* chan __UNUSED__, char* msg) +{ + buf_t out; + espik_enter(); + + out = make_buffer (strlen ("QUIT") + 2 /* "QUIT :" */ + + strlen (msg)); /* "<msg>EOF" */ + + snprintf (out.buf, out.len, "QUIT :%s", msg); + + espik_debug_print ("msg : %s\nout: %s", msg, out.buf); + + /* + espik_raw_send (out); + espik_con_shutdown (); + + irc_disconnect(sock); + */ + free (msg); + + espik_leave(); + return (out.buf); +} + +char* irc_raw (char* chan __UNUSED__, char* msg) +{ + espik_enter(); + espik_leave(); + return (msg); +} + +char* irc_nick (char* chan __UNUSED__, char* nick) +{ + espik_enter(); + buf_t out; + + out = make_buffer (strlen ("NICK") + 1 /* "NICK " */ + + strlen (nick)); /* "<nick>EOF" */ + + snprintf (out.buf, out.len, "NICK %s", nick); + + espik_debug_print ("NICK CHANGED REQUEST: %s", nick); + + espik_leave(); + 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(); + espik_debug_print ("> irc_disconnect"); + ecore_main_loop_quit (); + espik_debug_print ("< irc_disconnect"); + espik_leave(); +} +#endif + +char* irc_send (char* msg) +{ + char* out; + espik_enter(); + + out = NULL; + + current_chan = "#e.fr"; + + if (msg[0] == '/') + { + char** cmd_and_message; + cmd_t* cmd; + + cmd_and_message = separate_commandline (msg + 1); + + /* + espik_debug_print ("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) + { + espik_debug_print ("%s is not a know command", + cmd_and_message[0]); + espik_leave(); + return (0); + } + } + else + { + out = irc_privmsg (current_chan, msg); + } + + if (!out) + { + free (msg); + espik_leave(); + return (0); + } + + espik_debug_print ("%s", out); + + espik_leave(); + return (out); +} |