Kyseessä siis erittäin yksinkertainen SDL_net socketeilla toteutettu irc botti. Botti on tehty ja testattu linuxilla. Pienellä säädöllä se toimii hyvin myös windowsissa (koska socetit sdl_netillä). Botti osaa lukea konfiguraatiotiedoston, yhdistää sen avulla valitulle irc palvelimelle ja reconnectata yhteyden mennessä poikki. Virheentarkastuksia ei ole kauheasti, mutta jos ei bottia koita väkisin bugiin saada niin pitäisi toimia. Kommentteja lisäsin aika runsaalla kädellä ennen tänne lähettämistä.. Toivottavasti tästä jollekkin jotain apua.. Pistäkää rohkeasti palautetta tai kysymyksiä. Mitä vaan. (:
globals.h
//konfiguraatioiden määrittelyt ja tietueen luonti. typedef struct{ char host[100]; int port; char nick[50]; int logging; } Confs; Confs confs; #define BUFFER 1024 //muut globaalit muuttujat. int connected=0; int re = 1; IPaddress ip; TCPsocket sokka;
kiljubot.c
/* kiljubot.c kääntö: gcc -o kiljubot kiljubot.c `sdl-config --cflags` `sdl-config --libs` -lSDL_net */ //sisällytykset #include <stdio.h> #include <string.h> #include <SDL/SDL.h> #include <SDL/SDL_net.h> //globaalit muuttujat ja vakiot #include "globals.h" //prototyypit int buffershow (char *buffer); //tulostaa vastaanotetun datan sekä näytölle(tai minne stdin ohjaakaan..), että tiedostoon. int reconf (char *conffile); //lukee asetustiedostosta configuraatiot muuttujiin myöhempää käyttöä varten. int parsedata (char *buffer); //pilkkoo vastaanotetun datan pienempiin osiin sekä reagoi siihen. int reset_confs (void); //nollaa asetukset ja muuttaa ne oletuksille. int kiljuconnect (void); //muodostaa socetin SDL_net kirjastoa käyttämällä. //main. int main (int argc, char *argv[]){ //määritellään configuraatiotiedostoksi /etc/kiljubot.conf tai parametrin mukaan. char conff[100]; if(argc == 2){ strcpy(conff, argv[1]); } else{ sprintf(conff, "/etc/kiljubot.conf"); } printf("\nKiljubot starting...\n"); //alustetaan SDL ja SDLNet. if(SDL_Init(0) == -1){ printf("SDL_Init: %s\n", SDL_GetError()); exit(0); } if(SDLNet_Init() == -1){ printf("SDLNet_Init: %s\n", SDLNet_GetError()); exit(0); } //alustetaan konfiguraatiot ja luetaan konfiguraatiotiedosto. if(reset_confs() != 0){ printf("Error in funktion reset_confs!\n"); exit(0); } if(reconf(conff) != 0){ printf("Error in funktion reconf!\n"); exit(0); } //socetin muodostus. kiljuconnect(); //varataan muistista kilotavu vastaanotettavaa dataa varten ja nollataan se. char buffer[BUFFER]; memset(buffer, '\0', BUFFER); //looppi joka pyörii niin kauan kunnes se lopetetaan. while(re){ //vastaanotetaan data. SDLNet_TCP_Recv(sokka, buffer, BUFFER); //datan käsittely sekä lähetys. if(parsedata(buffer) == 1){ printf("Connection broken\n"); kiljuconnect(); } //tulostetaan vastaanotettu data näytölle sekä tarvittaessa logfileen. buffershow(buffer); } SDLNet_Quit(); SDL_Quit(); return 0; } //------------------------------------------------------------ int reconf (char *conffile){ printf("Reading configuration file %s...\n", conffile); FILE *kiljuconf; kiljuconf = fopen(conffile, "r"); char a[100], b[100], line[100]; int c; //luetaan tiedostosta jokainen rivi ja otetaan dataa tarvittaessa muuttujiin. while(feof(kiljuconf)==0){ fgets(line, 99, kiljuconf); sscanf(line, "%s", a); if(strcmp(a, "port") == 0){ sscanf(line, "%s%s", a, b); c=atoi(b); confs.port=c; } sscanf(line, "%s", a); if(strcmp(a, "logging") == 0){ sscanf(line, "%s%s", a, b); c=atoi(b); confs.logging=c; } sscanf(line, "%s", a); if(strcmp(a, "host") == 0 && confs.host[0] == '\0'){ sscanf(line, "%s%s", a, b); strcpy(confs.host, b); printf("Host: %s\n", confs.host); } sscanf(line, "%s", a); if(strcmp(a, "nick") == 0 && confs.nick[0] == '\0'){ sscanf(line, "%s%s", a, b); strcpy(confs.nick, b); printf("Nick: %s\n", confs.nick); } } if(confs.logging>0) printf("Logging: True\n"); printf("Port: %d\n", confs.port); return 0; } //--------------------------------------------- int parsedata (char *buffer){ char ping[100], send[BUFFER]; char a[100], b[100], c[50], d[50], e[50], f[50]; int len,result; //pilkotaan puskurin data muuttujiin. sscanf(buffer, "%s%s%s%s%s%s" , a, b, c, d, e, f); //annetaan serverille nickname ja username jos niitä ei ole vielä annettu. if(connected == 0){ sprintf(send, "NICK %s\r\n", confs.nick); len=strlen(send); result=SDLNet_TCP_Send(sokka, &send, len); if(result<len) printf("SDLNet_TCP_Send: %s\n", SDLNet_GetError()); sprintf(send, "USER %s 0 0 :%s\r\n", confs.nick, confs.nick); len=strlen(send); result=SDLNet_TCP_Send(sokka, &send, len); if(result<len) printf("SDLNet_TCP_Send: %s\n", SDLNet_GetError()); connected = 1; } //jos serveriltä lähetetään PING siihen vastataan asianmukaisella tavalla. if(strcmp(a, "PING") == 0){ sprintf(ping, "PONG %s\r\n", b); len=strlen(ping); result=SDLNet_TCP_Send(sokka, &ping, len); } //jos yhteys on katkennut, se pitää muodostaa uudelleen. if(strcmp(a, "ERROR") == 0 || strcmp(b, "ERROR") == 0 || strcmp(c, "ERROR") == 0 ||strcmp(d, "ERROR") == 0 || strcmp(e, "ERROR") == 0 || strcmp(f, "ERROR") == 0 ){ connected=0; return 1; } return 0; } //------------------------------------------------------------------------------------------------- int buffershow (char *buffer){ //näytetään vastaanotettu data, sekä tulostetaan se tiedostoon kiljulog. printf("%s", buffer); if(confs.logging){ FILE *kiljulog; kiljulog=fopen("kiljubot.log", "a"); fprintf(kiljulog, "%s", buffer); fclose(kiljulog); } memset(buffer, '\0', BUFFER); return 0; } //---------------------------------------------------------------------------------------------- int reset_confs (void){ //oletusasetukset konfiguraatioille. memset(confs.host, '\0', strlen(confs.host)*sizeof(char)); memset(confs.nick, '\0', strlen(confs.nick)*sizeof(char)); confs.port=6667; confs.logging=1; return 0; } //---------------------------------------------------------------------------------------------- int kiljuconnect (void){ //yhdistetään palvelimelle printf("Connecting...\n"); //muutetaan hostname ip osoitteeksi. if(SDLNet_ResolveHost(&ip, confs.host, confs.port) == -1){ printf("Error in rosolving host!\n"); printf("SDLNet_ResolveHost: %s\n", SDLNet_GetError()); exit(0); } else printf("IP address resolved!\n"); //yhdistetään selvitettyyn ip osoitteeseen. sokka=SDLNet_TCP_Open(&ip); if(!sokka) { printf("SDLNet_TCP_Open: %s\n", SDLNet_GetError()); exit(0); } else printf("Connected!\n\n"); return 0; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.