diff options
Diffstat (limited to 'src/espik_irc.c')
-rw-r--r-- | src/espik_irc.c | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/src/espik_irc.c b/src/espik_irc.c new file mode 100644 index 0000000..8846ab1 --- /dev/null +++ b/src/espik_irc.c @@ -0,0 +1,215 @@ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +#include <Ecore.h> +//#include <Ecore_Con.h> + +#include "global.h" +#include "espik_irc.h" +#include "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); +} |