/* -------------------------------------------------------- */ BOT* ircBOT_new (const char *nick, const char *pwd) { /* -------------------------------------------------------- */ int x = 0; BOT *bot = (BOT*) CALLOC(1, sizeof(BOT)); if(bot) { if(!nick) ERROR_EXIT("ircBOT_new: Error no NICK!!!\n"); bot->nick = strdup(nick); if(pwd) bot->pwd = strdup(pwd); else bot->pwd = NULL; bot->srv.state = IRC_SYS_NEEDCONNECT; bot->srv.sendbuf = NULL; bot->cmd_handler = LIST_new(); bot->tee_handler = LIST_new(); for(x=0; x<MAX_TIMER; x++) bot->timer[x].id = -1; } /* add this bot to the global ones */ if(!all_bots) all_bots = LIST_new(); if(!LIST_add(all_bots, bot)) ERROR_EXIT("ircBOT_new: Error adding bot to global BOT-List!!\n"); DEBUG("BOT with nick '%s' created.\n", bot->nick); return bot; };
/* -------------------------------------------------------- */ MSG* MSG_out(BOT *me, MSG * mymsg, char * raw_msg) { /* -------------------------------------------------------- */ MSG * msg = mymsg; if( !msg ) msg = MSG_new(me); msg->raw_msg = raw_msg; if(!me->srv.sendbuf) me->srv.sendbuf = LIST_new(); LIST_add(me->srv.sendbuf, msg); return msg; }
/* -------------------------------------------------------- */ int ircBOT_server(BOT *me, const char *host, int port) { /* -------------------------------------------------------- */ IRC_SRV *srv = &me->srv; struct sockaddr_in servaddr; int on=1; int irc_port = port > 0 ? port:IRC_PORT; if(srv->state != IRC_SYS_NEEDCONNECT) ircBOT_disconnect(me); srv->socket = socket(AF_INET, SOCK_STREAM, 0); setsockopt(srv->socket, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(irc_port); inet_pton(AF_INET, host, &servaddr.sin_addr); if( connect(srv->socket, (struct sockaddr*)&servaddr, sizeof(servaddr)) != 0 ) { ERROR("ircBOT_server: Error in connect: '%s' !\n", strerror(errno)); return IRC_ERROR; } srv->name = strdup(host); srv->state = IRC_SYS_IDLE; if(!srv->channels) srv->channels = LIST_new(); if(!srv->history) srv->history = LIST_new(); DEBUG("ircBOT_server: connected to '%s' on port '%i'.\n", srv->name, irc_port); /* ************************************** */ /* prepare to send NICK command to server */ //MSG_out(me, NULL, irc_build_msg(NULL, "PASS", "", NULL)); MSG_out(me, NULL, irc_build_msg(NULL, "NICK", me->nick, NULL)); MSG_out(me, NULL, irc_build_msg(NULL, "USER", irc_build_param("%s 0 *",me->nick), me->nick)) ; /* ************************************** */ return IRC_OK; }
/* -------------------------------------------------------- */ USER* irc_sys_find_user_or_add (BOT *me, USER *this_user) { /* -------------------------------------------------------- */ LIST *l = me->srv.users; USER *user = NULL; if(!this_user) { ERROR("irc_sys_find_user_or_add: NO 'this_user' in Parameter\n"); return NULL; } while( (user = LIST_next(l)) ) { if( strcmp(SICHER_STR(this_user->name), SICHER_STR(user->name)) == 0 && strcmp(SICHER_STR(this_user->host_user),SICHER_STR(user->host_user)) == 0 && strcmp(SICHER_STR(this_user->host), SICHER_STR(user->host)) == 0 ) return user; } if(!me->srv.users) me->srv.users = LIST_new(); LIST_add(me->srv.users, this_user); return NULL; };
Linked_List LISTcreate() { Linked_List list = LIST_new(); list->mark = LINK_new(); list->mark->next = list->mark->prev = list->mark; return( list ); }