aboutsummaryrefslogblamecommitdiff
path: root/src/espik_irc.c
blob: 3e5b3f78f178f13a5aedf93363e230daee81807c (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12











                                     

                  
                    


              

                                           

        








                                  





                                                                      
                                        
 

                      
 

                                                              
 
                                         
 

                      
 




                                                        
 
                     


     
                              
 











                                         


      
                                       
 
                            

 
                           
 
             
 

                                             
 
               

 
                                          
 
             
 


                                                              
 
                                                           
 

                   

 
                                                  
 

















                                                          

 
                                       
 
             
 




                                                          
 




                                                          
 
                                     
 


                                                             
 

                                                               
 

                   

 
                                                  
 
             
 

                                                           
 
                                               
 
                                             
 


                        
 


                       
 
                   

 
                                                 
 
               

 
                                                   
 
             
 

                                                          
 
                                               
 
                                            
 
                   


     
                                                                           
 


                

 
                                             
 




                              


      
                           
 



             
                         













































                                                                
 
#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.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    /* ":<channel> "*/
         + strlen (msg));    /* "<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));    /* "<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  /* ":<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);
  return (out.buf);
}

char*  irc_quit (char* chan __UNUSED__, char* msg)
{
  buf_t  out;

  out = make_buffer (strlen ("QUIT") + 2    /* "QUIT :"  */
         + strlen (msg));    /* "<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));  /* "<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: <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)
    {
      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);
}