All pastes #220170 Raw Edit

Something

public text v1 · immutable
#220170 ·published 2006-10-25 01:38 UTC
rendered paste body
//Patricks code orginally
//going to create a irc client for windows with it

#include <iostream> /* std::cout, std::cerr, std::endl */
#include <cstdlib> /* exit */
#include <cstring> /* memcpy, memset */
#include <string> /* std::string */
#include <cerrno> /* perror */
#ifdef WIN32
#include <winsock2.h>
#else
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#endif

const unsigned int MAX_LINE = 1024; // Groesse des Empfangspuffers
using namespace std;

#ifdef WIN32
SOCKET sockfd;

#else
int sockfd;
#endif

void irc_disconnect() {
	#ifdef WIN32
	// Windows-Socket freigeben
	closesocket(sockfd);
	WSACleanup();
	#else
	close(sockfd);
	#endif
}

void s2u(const char *msg) { //send to uplink
	send(sockfd, msg, strlen(msg), 0);
}


void irc_connect() {
	#ifdef WIN32
	// Windows-Socket initialisieren
	WSADATA wsa;
	if(WSAStartup(MAKEWORD(2,0),&wsa)!=0)
	exit(1);
	#endif
	const int PORT = 6667;
	const char *HOST = "irc.freenode.org";
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	// Cast eigentlich nur in Windows noetig, fuer bessere Uebersicht hier ohne bedingte Kompilierung
	if(static_cast<int>(sockfd) < 0) {
		perror("socket()");
		irc_disconnect();
		exit(1);
	}
	hostent *hp = gethostbyname(HOST);
	if(!hp) {
		cerr << "gethostbyname()" << endl;
		irc_disconnect();
		exit(1);
	}
	sockaddr_in sin;
	memset((char*)&sin, 0, sizeof(sin));
	sin.sin_family = AF_INET;
	memcpy((char*)&sin.sin_addr, hp->h_addr, hp->h_length);
	sin.sin_port = htons(PORT);
	memset(&(sin.sin_zero), 0, 8*sizeof(char));
	if(connect(sockfd, (sockaddr*) &sin, sizeof(sin))==-1) {
	perror("connect()");
	irc_disconnect();
	exit(1);
	}
}

void irc_identify() {
	s2u("NICK TechSalvager\r\n"); // Nickname
	s2u("USER Justin 0 0 :Justin\r\n"); // Userdaten
	s2u("PRIVMSG NickServ IDENTIFY <Just6532>\r\n"); // Identifizieren
	s2u("JOIN #windows\r\n"); // Channel betreten
	s2u("PRIVMSG #windows :Hello!\r\n"); // Begruessungsnachricht
}

void bot_functions(const string &buffer) {
	size_t pos = 0;
	if((pos=buffer.find(":say "))!=string::npos) {
		s2u(("PRIVMSG #channel :"+buffer.substr(pos+5)+"\r\n").c_str());
	}
	if((pos=buffer.find(":!ijoin "))!=string::npos) {
		s2u(("JOIN "+buffer.substr(pos+8)+"\r\n").c_str());
	}
	else if(buffer.find(":User!User@User.user.insiderZ.DE")==0 && buffer.find("exit")!=string::npos) {
		s2u("PRIVMSG #channel :Cya\r\n");
		irc_disconnect();
		exit(0);
	}
}

void ping_parse(const string &buffer) {
	size_t pingPos = buffer.find("PING");
	if(pingPos!=string::npos) {
	string pong("PONG"+buffer.substr(pingPos+4)+"\r\n");
	cout << pong;
	s2u(pong.c_str());
	}
}

void irc_parse(string buffer) {
	if(buffer.find("\r\n") == buffer.length()-2)
		buffer.erase(buffer.length()-2);
		ping_parse(buffer);
		bot_functions(buffer);
}

int main() {
    int a=0;
    cout << "Please enter a nick" << endl;
    cin >> a;
	irc_connect();
	irc_identify();
	for(;;) {
	char buffer[MAX_LINE+1] = {0};
	if(recv(sockfd, buffer, MAX_LINE*sizeof(char), 0)<0) {		perror("recv()");
		irc_disconnect();
		exit(1);
	}
	cout << buffer;
	irc_parse(buffer);
	}
	irc_disconnect();
}