Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
C IRC bot skeleton
#1
Well, simply put I wrote this IRC bot 'skeleton' in C. It's still widely open for improvements, this is like a 'rough draft,' so to speak. I'm sharing this in hopes I could get some input and constructive criticism. Good or bad, all criticism is appreciated...anything that would help me improve it, that is. So far it simply idles in IRC and pongs when pinged by the server and says "sup %s" where %s is the nick of the person who said its nick...but that's all a skeleton should be. Tongue

Code:
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#define BUFSIZE 512
#define PSYCHO  NULL

/***********************
* argv[1] -> host
* argv[2] -> port
* argv[3] -> chan
* argv[4] -> nick
* argv[5] -> user
***********************/

struct irc_data {
    char nick[32];
    char user[32];
    char host[64];
    char chan[32];
    char message[512];
    int is_ready;
};

void die(const char*,int);
void parse_data(char*,struct irc_data**);
int  sayc(int,const char*,const char*, ...);

int main(int argc, char **argv){

    if(argc!=6){
        fprintf(stderr,"usage: %s <host> <port> <chan> <nick> <ident>\n",argv[0]);
        exit(1);
    }

    const char *host = argv[1];
    const char *port = argv[2];
    const char *chan = argv[3];
    const char *nick = argv[4];
    const char *user = argv[5];

    char buff[BUFSIZE], ip[INET_ADDRSTRLEN];
    int sfd,status,sent,recvd,i;
    struct addrinfo hints,*serv;
    struct sockaddr_in *sip;
    struct irc_data *irc = malloc(sizeof(struct irc_data));

    memset(&hints,0,sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;

    if((status=getaddrinfo(host,port,&hints,&serv))<0)
        die("getaddrinfo",status);
    if((sfd=socket(serv->ai_family,serv->ai_socktype,serv->ai_protocol))<0)
        die("socket",sfd);
    if((status=connect(sfd,serv->ai_addr,serv->ai_addrlen))<0)
        die("connect",status);

    sip = (struct sockaddr_in*)serv->ai_addr;
    inet_ntop(serv->ai_family,&sip->sin_addr,ip,sizeof(ip));

    snprintf(buff,BUFSIZE,"USER %s 8 * :\x50\x73\x79\x63\x68\x6F\x20\x42\x6F\x74\r\nNICK %s\r\nJOIN #%s\r\n",user,nick,chan);
    if((sent=send(sfd,buff,strlen(buff),0))<0)
        die("send",sent);

    while((recvd=recv(sfd,buff,BUFSIZE-1,0))>=0){
        buff[recvd-1]=0;
        puts(buff);
        parse_data(buff,&irc);
        if(irc->is_ready)
            if(strstr(irc->message,nick) != NULL)
                sayc(sfd,irc->chan,"sup %s",irc->nick);
        if(sscanf(buff,"PING :%s",buff)==1){
            snprintf(buff,BUFSIZE,"PONG :%s",buff);
            if(send(sfd,buff,strlen(buff),0)>0)
                puts("PONG!");
            else puts("PONG failed...just sayin");
        }
        
    }
    free(irc);
    close(sfd);
    freeaddrinfo(serv);
}


void die(const char *msg, int err){
    fprintf(stderr,"%s: %s\n",msg,gai_strerror(err));
    exit(1);
}

void parse_data(char *buff,struct irc_data **fat){
    if(sscanf(buff,":%[^!]!%[^@]@%[^ ] %*[^ ] %[^ :] :%[^\r\n]",(*fat)->nick,(*fat)->user,(*fat)->host,(*fat)->chan,(*fat)->message) == 5){
        (*fat)->is_ready = 1;
        if((*fat)->chan[0] != '#') strcpy((*fat)->chan,(*fat)->nick);
    } else (*fat)->is_ready = 0;
}

int sayc(int sockfd, const char *chan, const char *fmt, ...){
    char msg[BUFSIZE], k[BUFSIZE];    //need to change sizes..do it later
    va_list list;
    va_start(list,fmt);
    vsnprintf(k,BUFSIZE,fmt,list);
    snprintf(msg,BUFSIZE,"PRIVMSG %s :%s\r\n",chan,k); //potential problem with \r\n being truncated if string is too large..do it later
    va_end(list);
    return send(sockfd,msg,strlen(msg),0);
}
// Psycho
<Aoi-chan> everyone's first vi session. ^C^C^X^X^X^XquitqQ!qdammit[esc]qwertyuiopasdfghjkl;:xwhat
Reply


Messages In This Thread
C IRC bot skeleton - by Psycho - 02-17-2010, 04:22 AM
RE: C IRC bot skeleton - by Fallen - 04-05-2010, 06:48 PM
RE: C IRC bot skeleton - by php - 04-05-2010, 09:12 PM
RE: C IRC bot skeleton - by Psycho - 04-06-2010, 12:07 AM
RE: C IRC bot skeleton - by C!RCU!T tr0jAn ☠ - 04-06-2010, 12:15 AM
RE: C IRC bot skeleton - by TomC - 06-09-2010, 09:34 AM
RE: C IRC bot skeleton - by Psycho - 06-11-2010, 04:38 PM
RE: C IRC bot skeleton - by Kondry - 07-14-2010, 03:20 PM
RE: C IRC bot skeleton - by `P R O D I G Y™ - 07-21-2010, 10:04 PM
RE: C IRC bot skeleton - by haphazard - 11-23-2010, 08:08 PM
RE: C IRC bot skeleton - by Salmon - 11-24-2010, 07:53 PM
RE: C IRC bot skeleton - by Bursihido - 12-13-2010, 10:47 PM
RE: C IRC bot skeleton - by Volkov - 02-05-2011, 12:47 AM
RE: C IRC bot skeleton - by Jay - 02-06-2011, 12:13 AM
RE: C IRC bot skeleton - by versx - 02-10-2011, 12:43 PM
RE: C IRC bot skeleton - by Tectu - 11-09-2011, 04:01 PM
RE: C IRC bot skeleton - by Hex - 11-09-2011, 08:23 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  IRC Class Libaray 1.1 - C++ IRC bots made easy delme 19 7,656 09-22-2011, 06:43 AM
Last Post: Mike.X.
  Runescape Bot? #Nix 7 3,636 08-28-2011, 11:54 AM
Last Post: Bigandrewgold
  [C++] IRC Bot. wchar_t 25 14,295 06-05-2011, 12:30 AM
Last Post: USN

Forum Jump:


Users browsing this thread: 2 Guest(s)