#include #include #include #include /*#include */ #include "espik_global.h" #include "espik_irc.h" #include "espik_error.h" /*#include "espik_common_handler.h"*/ #include "espik_net.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; /* 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'); 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; } printf ("string_upper: %s", str); espik_leave(); } #endif unsigned short sendmsg_len (char* msg) { return (strlen (msg) + 2); } buf_t make_buffer(int len) { buf_t buf; buf.buf = malloc (len); buf.len = len + 1; /* Alloc trailing \0 */ return (buf); } char* irc_privmsg (char* chan, char* msg) { buf_t out; out = make_buffer (strlen ("PRIVMSG") + 1 /* "PRIVMSG " */ + strlen (chan) + 2 /* ": "*/ + strlen (msg)); /* "EOF" */ snprintf (out.buf, out.len, "PRIVMSG %s :%s", chan, msg); free (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", msg); printf ("Usage: /JOIN #channel"); return (0); } out = make_buffer (strlen ("JOIN") + 1 /* "JOIN " */ + strlen (msg)); /* "EOF" */ snprintf (out.buf, out.len, "JOIN %s", msg); free (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)); /* "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])); /* "EOF"*/ snprintf (out.buf, out.len, "PART %s :%s", sep[0], sep[1]); } free (msg); return (out.buf); } char* irc_quit (char* chan __UNUSED__, char* msg) { buf_t out; out = make_buffer (strlen ("QUIT") + 2 /* "QUIT :" */ + strlen (msg)); /* "EOF" */ snprintf (out.buf, out.len, "QUIT :%s", msg); printf ("msg : %s\nout: %s", msg, out.buf); /* espik_raw_send (out); espik_con_shutdown (); irc_disconnect(sock); */ free (msg); 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)); /* "EOF" */ snprintf (out.buf, out.len, "NICK %s", nick); printf ("NICK CHANGED REQUEST: %s", nick); 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(); printf ("> irc_disconnect"); ecore_main_loop_quit (); printf ("< irc_disconnect"); espik_leave(); } #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); /* printf ("irc_send: 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) { printf ("%s is not a know command", cmd_and_message[0]); return (0); } } else out = irc_privmsg (current_chan, msg); if (!out) { free (msg); return (0); } printf ("%s", out); return (out); }