FORUM DARKERS

Tecnologia & Informática => Programação => C/C#/C++ => Topic started by: Anonymous on 13 de July , 2006, 03:42:28 PM

Title: bot em C ainda nao esta totalmente desenvolvido
Post by: Anonymous on 13 de July , 2006, 03:42:28 PM
É um bot simples pra irc fiz no Dev-C++ (windows comanda)
Baixe a lib de regex pra windows no devpaks.org nome RXPOSIX
compile com -lwsock32 e -lrx
se for porta pra linux troque rxposix.h por regex.h e nao precisa add a lib rx =X
precisar um arquivo de config tbm no formato

exemplo de como seria

dbot.conf

nick = euller
user = dur
mode = 8
servername = *
realname = David Valentim Dias
channel = #darkers

usando
$ dbot irc.gigachat.net 6667Testei no canal =X

#include <stdio.h>
#include <stdlib.h>
#include <rxposix.h> // devpaks.org Build by codingmaster
#include <winsock2.h>

int er_match(const char *regex,const char *buff,regmatch_t *match)
{
regex_t reg;
if (regcomp(®,regex,REG_EXTENDED|REG_ICASE|REG_NEWLINE) != 0) return -1;
if (regexec(®,buff,1,match,0) != 0)
return -1;
return 0;
}

char* getConf(const char *item,char **value) {
FILE *fp;
if (!(fp=fopen("dbot.conf","r"))) {
printf("Arquivo de configuracao nao encontrado.\n");
exit(1);
}
int x;
regmatch_t match;
char rbuff[512];
char re[512];
snprintf(re,512,"^ *%s *= *",item);
while(!feof(fp)) {
fgets(rbuff,512,fp);
if (!er_match(re,rbuff,&match)) {
if (strchr(&rbuff[match.rm_eo],'\n')) {
*value=malloc(strlen(&rbuff[match.rm_eo])+1-2);
memcpy(*value,&rbuff[match.rm_eo],strlen(&rbuff[match.rm_eo])+1-2);
*(*value+strlen(&rbuff[match.rm_eo])+1-2)='\0';
}
else {
*value=malloc(strlen(&rbuff[match.rm_eo])+1);
memcpy(*value,&rbuff[match.rm_eo],strlen(&rbuff[match.rm_eo])+1);
*(*value+strlen(&rbuff[match.rm_eo])+1)='\0';
}
fclose(fp);
return *value;
}
}
fclose(fp);
return NULL;
}

int strFpos(const char *string,const int ch) {
int x;
for(x=0;*string;string++,x++)
if (*string == ch)
return x;
return -1;
}

int main(int argc, char *argv[])
{
if (argc < 3) exit(0);
WSADATA data;
if (WSAStartup(0x0002,&data) != 0) {
printf("Impossivel iniciar o uso da Windows Socket DLL.\n");
exit(0);
}
int s,x,t,j;
struct sockaddr_in sinfo;
struct hostent *he;
regmatch_t match;
char sbuff[512],rbuff[512],re[512];
if (!(he=gethostbyname(argv[1]))) {
printf("Host nao encontrado.\n");
exit(0);
}
sinfo.sin_family=AF_INET;
sinfo.sin_port=htons(atoi(argv[2]));
memcpy(&sinfo.sin_addr.s_addr,he->h_addr,he->h_length);
memset(&sinfo.sin_zero,0x00,8);
s=socket(AF_INET,SOCK_STREAM,0);

if (connect(s,(struct sockaddr *)&sinfo,sizeof(sinfo)) != 0) {
printf("Impossivel estabelecer uma conexao.\n");
exit(0);
}
char *nick;
getConf("nick",&nick);
x=snprintf(sbuff,512,"NICK %s\r\n",nick);
if (send(s,sbuff,x,0) == -1) {
printf("Impossivel enviar.\n");
exit(0);
}
char *user,*mode,*servername,*realname,*channel;
getConf("user",&user);
getConf("mode",&mode);
getConf("servername",&servername);
getConf("realname",&realname);
getConf("channel",&channel);
x=snprintf(sbuff,512,"USER %s %s %s :%s\r\n",user,mode,servername,realname);
if (send(s,sbuff,x,0) == -1) {
printf("Impossivel enviar.\n");
exit(0);
}
while (1) {
memset(rbuff,0x00,512);
memset(sbuff,0x00,512);
if ((x=recv(s,rbuff,512,0))==-1) {
printf("Impossivel enviar.\n");
exit(0);
}
rbuff[x]='\0';
if(!er_match("^PING :",rbuff,&match)) {
if (strFpos(&rbuff[match.rm_so],'\r') != -1)
rbuff[strFpos(&rbuff[match.rm_so],'\r')]='\0';
x=snprintf(sbuff,512,"PONG :%s\r\n",&rbuff[match.rm_eo]);
if (send(s,sbuff,x,0) == -1) {
printf("%s",strerror(errno));
exit(0);
}
}
if(!er_match("^:.+ 001",rbuff,&match)) {
servername=malloc(match.rm_eo);
memcpy(servername,&rbuff[match.rm_so+1],match.rm_eo-5);
*(servername+match.rm_eo-5)='\0';
printf("Nome do servidor: %s\n",servername);
}
snprintf(re,512,"^:%s 376",servername);
if(!er_match(re,rbuff,&match)) {
printf("Fim do MoTD.\n");
x=snprintf(sbuff,512,"JOIN %s\r\n",channel);
if (send(s,sbuff,x,0) == -1) {
printf("Impossivel enviar. JOIN\n");
exit(0);
}
}
snprintf(re,512,"^:.+!.+@.+ JOIN :%s",channel);
if(!er_match(re,rbuff,&match)) {
snprintf(re,512,"^:%s!.+@.+ JOIN :%s",nick,channel);
if(!er_match(re,rbuff,&match)) {
printf("No canal.\n");
}
else {
er_match("^:.+!",rbuff,&match);
rbuff[match.rm_eo-1]='\0';
x=snprintf(sbuff,512,"PRIVMSG %s :%s: Bem vindo!\r\n",channel,&rbuff[match.rm_so+1]);
if (send(s,sbuff,x,0) == -1) {
printf("Impossivel enviar. PRIVMSG\n");
exit(0);
}
}
}
}
}
Title: Re: bot em C ainda nao esta totalmente desenvolvido
Post by: Anonymous on 15 de July , 2006, 06:43:39 AM
Ae dvd.. parebens pela criação .. dá uma melhorada nele ^^
pra fica mais filé.. ou como quiser ... l33t :)
Title: Re: bot em C ainda nao esta totalmente desenvolvido
Post by: HadeS on 15 de July , 2006, 09:27:00 AM
Muito bom DVD. Muito bom mesmo.

Como o r1c4rdo1988 disse, umas melhoradas e fica ótimo! :D

HadeS