Guest User

Untitled

a guest
Oct 16th, 2017
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.93 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. #include "libircclient.h"
  7.  
  8.  
  9. /*
  10.  * We store data in IRC session context.
  11.  */
  12. typedef struct
  13. {
  14.     char    * channel;
  15.     char    * nick;
  16.  
  17. } irc_ctx_t;
  18.  
  19.  
  20. void addlog (const char * fmt, ...)
  21. {
  22.     FILE * fp;
  23.     char buf[1024];
  24.     va_list va_alist;
  25.  
  26.     va_start (va_alist, fmt);
  27. #if defined (WIN32)
  28.     _vsnprintf (buf, sizeof(buf), fmt, va_alist);
  29. #else
  30.     vsnprintf (buf, sizeof(buf), fmt, va_alist);
  31. #endif
  32.     va_end (va_alist);
  33.  
  34.     printf ("%s\n", buf);
  35.  
  36.     if ( (fp = fopen ("irctest.log", "ab")) != 0 )
  37.     {
  38.         fprintf (fp, "%s\n", buf);
  39.         fclose (fp);
  40.     }
  41. }
  42.  
  43.  
  44. void dump_event (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count)
  45. {
  46.     char buf[512];
  47.     int cnt;
  48.  
  49.     buf[0] = '\0';
  50.  
  51.     for ( cnt = 0; cnt < count; cnt++ )
  52.     {
  53.         if ( cnt )
  54.             strcat (buf, "|");
  55.  
  56.         strcat (buf, params[cnt]);
  57.     }
  58.  
  59.  
  60.     addlog ("Event \"%s\", origin: \"%s\", params: %d [%s]", event, origin ? origin : "NULL", cnt, buf);
  61. }
  62.  
  63.  
  64. void event_join (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count)
  65. {
  66.     dump_event (session, event, origin, params, count);
  67.     irc_cmd_user_mode (session, "+i");
  68.     irc_cmd_msg (session, params[0], "Hi all");
  69. }
  70.  
  71.  
  72. void event_connect (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count)
  73. {
  74.     irc_ctx_t * ctx = (irc_ctx_t *) irc_get_ctx (session);
  75.     dump_event (session, event, origin, params, count);
  76.  
  77.     irc_cmd_join (session, ctx->channel, 0);
  78. }
  79.  
  80.  
  81. void event_privmsg (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count)
  82. {
  83.     dump_event (session, event, origin, params, count);
  84.  
  85.     printf ("'%s' said me (%s): %s\n",
  86.         origin ? origin : "someone",
  87.         params[0], params[1] );
  88. }
  89.  
  90.  
  91. void dcc_recv_callback (irc_session_t * session, irc_dcc_t id, int status, void * ctx, const char * data, unsigned int length)
  92. {
  93.     static int count = 1;
  94.     char buf[12];
  95.  
  96.     switch (status)
  97.     {
  98.     case LIBIRC_ERR_CLOSED:
  99.         printf ("DCC %d: chat closed\n", id);
  100.         break;
  101.  
  102.     case 0:
  103.         if ( !data )
  104.         {
  105.             printf ("DCC %d: chat connected\n", id);
  106.             irc_dcc_msg (session, id, "Hehe");
  107.         }
  108.         else
  109.         {
  110.             printf ("DCC %d: %s\n", id, data);
  111.             sprintf (buf, "DCC [%d]: %d", id, count++);
  112.             irc_dcc_msg (session, id, buf);
  113.         }
  114.         break;
  115.  
  116.     default:
  117.         printf ("DCC %d: error %s\n", id, irc_strerror(status));
  118.         break;
  119.     }
  120. }
  121.  
  122.  
  123. void dcc_file_recv_callback (irc_session_t * session, irc_dcc_t id, int status, void * ctx, const char * data, unsigned int length)
  124. {
  125.     if ( status == 0 && length == 0 )
  126.     {
  127.         printf ("File sent successfully\n");
  128.  
  129.         if ( ctx )
  130.             fclose ((FILE*) ctx);
  131.     }
  132.     else if ( status )
  133.     {
  134.         printf ("File sent error: %d\n", status);
  135.  
  136.         if ( ctx )
  137.             fclose ((FILE*) ctx);
  138.     }
  139.     else
  140.     {
  141.         if ( ctx )
  142.             fwrite (data, 1, length, (FILE*) ctx);
  143.         printf ("File sent progress: %d\n", length);
  144.     }
  145. }
  146.  
  147.  
  148. void event_channel (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count)
  149. {
  150.     char nickbuf[128];
  151.  
  152.     if ( count != 2 )
  153.         return;
  154.  
  155.     printf ("'%s' said in channel %s: %s\n",
  156.         origin ? origin : "someone",
  157.         params[0], params[1] );
  158.  
  159.     if ( !origin )
  160.         return;
  161.  
  162.     irc_target_get_nick (origin, nickbuf, sizeof(nickbuf));
  163.  
  164.     if ( !strcmp (params[1], "quit") )
  165.         irc_cmd_quit (session, "of course, Master!");
  166.  
  167.     if ( !strcmp (params[1], "help") )
  168.     {
  169.         irc_cmd_msg (session, params[0], "quit, help, dcc chat, dcc send, ctcp");
  170.     }
  171.  
  172.     if ( !strcmp (params[1], "ctcp") )
  173.     {
  174.         irc_cmd_ctcp_request (session, nickbuf, "PING 223");
  175.         irc_cmd_ctcp_request (session, nickbuf, "FINGER");
  176.         irc_cmd_ctcp_request (session, nickbuf, "VERSION");
  177.         irc_cmd_ctcp_request (session, nickbuf, "TIME");
  178.     }
  179.  
  180.     if ( !strcmp (params[1], "dcc chat") )
  181.     {
  182.         irc_dcc_t dccid;
  183.         irc_dcc_chat (session, 0, nickbuf, dcc_recv_callback, &dccid);
  184.         printf ("DCC chat ID: %d\n", dccid);
  185.     }
  186.  
  187.     if ( !strcmp (params[1], "dcc send") )
  188.     {
  189.         irc_dcc_t dccid;
  190.         irc_dcc_sendfile (session, 0, nickbuf, "irctest.c", dcc_file_recv_callback, &dccid);
  191.         printf ("DCC send ID: %d\n", dccid);
  192.     }
  193.  
  194.     if ( !strcmp (params[1], "topic") )
  195.         irc_cmd_topic (session, params[0], 0);
  196.     else if ( strstr (params[1], "topic ") == params[1] )
  197.         irc_cmd_topic (session, params[0], params[1] + 6);
  198.  
  199.     if ( strstr (params[1], "mode ") == params[1] )
  200.         irc_cmd_channel_mode (session, params[0], params[1] + 5);
  201.  
  202.     if ( strstr (params[1], "nick ") == params[1] )
  203.         irc_cmd_nick (session, params[1] + 5);
  204.  
  205.     if ( strstr (params[1], "whois ") == params[1] )
  206.         irc_cmd_whois (session, params[1] + 5);
  207. }
  208.  
  209.  
  210. void irc_event_dcc_chat (irc_session_t * session, const char * nick, const char * addr, irc_dcc_t dccid)
  211. {
  212.     printf ("DCC chat [%d] requested from '%s' (%s)\n", dccid, nick, addr);
  213.  
  214.     irc_dcc_accept (session, dccid, 0, dcc_recv_callback);
  215. }
  216.  
  217.  
  218. void irc_event_dcc_send (irc_session_t * session, const char * nick, const char * addr, const char * filename, unsigned long size, irc_dcc_t dccid)
  219. {
  220.     FILE * fp;
  221.     printf ("DCC send [%d] requested from '%s' (%s): %s (%lu bytes)\n", dccid, nick, addr, filename, size);
  222.  
  223.     if ( (fp = fopen ("file", "wb")) == 0 )
  224.         abort();
  225.  
  226.     irc_dcc_accept (session, dccid, fp, dcc_file_recv_callback);
  227. }
  228.  
  229. void event_numeric (irc_session_t * session, unsigned int event, const char * origin, const char ** params, unsigned int count)
  230. {
  231.     char buf[24];
  232.     sprintf (buf, "%d", event);
  233.  
  234.     dump_event (session, buf, origin, params, count);
  235. }
  236.  
  237.  
  238. int main (int argc, char **argv)
  239. {
  240.     irc_callbacks_t callbacks;
  241.     irc_ctx_t ctx;
  242.     irc_session_t * s;
  243.  
  244.     if ( argc != 4 )
  245.     {
  246.         printf ("Usage: %s <server> <nick> <channel>\n", argv[0]);
  247.         return 1;
  248.     }
  249.  
  250.     memset (&callbacks, 0, sizeof(callbacks));
  251.  
  252.     callbacks.event_connect = event_connect;
  253.     callbacks.event_join = event_join;
  254.     callbacks.event_nick = dump_event;
  255.     callbacks.event_quit = dump_event;
  256.     callbacks.event_part = dump_event;
  257.     callbacks.event_mode = dump_event;
  258.     callbacks.event_topic = dump_event;
  259.     callbacks.event_kick = dump_event;
  260.     callbacks.event_channel = event_channel;
  261.     callbacks.event_privmsg = event_privmsg;
  262.     callbacks.event_notice = dump_event;
  263.     callbacks.event_invite = dump_event;
  264.     callbacks.event_umode = dump_event;
  265.     callbacks.event_ctcp_rep = dump_event;
  266.     callbacks.event_ctcp_action = dump_event;
  267.     callbacks.event_unknown = dump_event;
  268.     callbacks.event_numeric = event_numeric;
  269.  
  270.     callbacks.event_dcc_chat_req = irc_event_dcc_chat;
  271.     callbacks.event_dcc_send_req = irc_event_dcc_send;
  272.  
  273.     s = irc_create_session (&callbacks);
  274.  
  275.     if ( !s )
  276.     {
  277.         printf ("Could not create session\n");
  278.         return 1;
  279.     }
  280.  
  281.     ctx.channel = argv[3];
  282.     ctx.nick = argv[2];
  283.  
  284.     irc_set_ctx (s, &ctx);
  285.  
  286.     if ( irc_connect (s, argv[1], 6667, 0, argv[2], 0, 0) )
  287.     {
  288.         printf ("Could not connect: %s\n", irc_strerror (irc_errno(s)));
  289.         return 1;
  290.     }
  291.  
  292.     irc_run (s);
  293.  
  294.     return 1;
  295. }
Add Comment
Please, Sign In to add comment