aboutsummaryrefslogblamecommitdiff
path: root/src/espik_irc.c
blob: 82607ef31a15feca520daee64b76a7a8493ba09f (plain) (tree)
1
2
3
4
5
6
7
8
9








                        
                        












































































































































































































                                                                                                                        
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#include <Ecore.h>
//#include <Ecore_Con.h>

#include "global.h"
#include "espik_irc.h"
#include "espik_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);
}