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.c215
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);
+}