aboutsummaryrefslogtreecommitdiff
path: root/src/espik_irc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/espik_irc.c')
-rw-r--r--src/espik_irc.c296
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);
+}