-
C++ Simple IRC Bot
Achtung: Nicht von mir!
Code:
#include <iostream>
#include <errno.h>
#include <cstring>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
using namespace std;
// substr is a clone of PHP's substr that I wrote
char *substr (const char *str, int start, int end) {
char *sub = new char[strlen(str)];
start -=1 ;
for(int i = 0;start<end;i += 1) {
sub[i] = str[start];
start += 1;
}
sub[end] = '\0';
return sub;
}
int main() {
struct hostent *he;
struct sockaddr_in their_addr;
int sockfd;
char msg[512];
char buffer[512];
int length;
int stay = 1;
cout << "SimpleBot" << endl << "A Simple IRC Bot" << endl;
// Connect the socket to the server
// lot of this will look fimiliar.
if ((he=gethostbyname("irc.quickstrike.org")) == NULL) {
perror("gethostbyname");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(6667);
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
memset(&(their_addr.sin_zero), '\0', ;
if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {
perror("connect");
exit(1);
}
// Time to register with USER and NICK
strcpy(msg,"USER simple simple simple :SimpleBot Example>br /<NICK SimpleIRC>br /<");
if (send(sockfd, msg, strlen(msg), 0) == -1) {
perror("send");
}
// Ok, now comes the fun part. Before you are able to do anything
// else you need to reply to a ping with a pong. Since we want
// to be able to respond again next time we get pinged, we'll
// start the loop here.
while (stay) {
// get info from the server, put it in buffer
if ((length=recv(sockfd, buffer, 511, 0)) == -1) {
perror("recv");
exit(1);
}
buffer[length] = '\0';
// Go through buffer looking for ping, or other messages.
for (int i = 0; buffer[i] != '\0'; i += 1) {
// do we have "PING"?
if (strncmp(substr(buffer,i,i+4),"PING",4) == 0) {
// reply to ping with pong, also joining #testchan
sprintf(msg, "PONG %s>br /<join :#testchan>br /<",substr(buffer,i+6,i+13));
if (send(sockfd, msg, strlen(msg), 0) == -1) {
perror("send");
}
}
// do we have a "hello"?
// note: in a real bot you would definatly want to extract the
// user's message and work with that.
if (strncmp(substr(buffer,i,i+5),"hello",5) == 0) {
// send bye! to #testchan, then quit
strcpy(msg, "PRIVMSG #testchan :bye!>br /<QUIT>br /<");
if (send(sockfd, msg, strlen(msg), 0) == -1) {
perror("send");
}
stay = 0; // leave our while()
}
}
}
close(sockfd);
return 0;
}