//Patricks code orginally //going to create a irc client for windows with it #include /* std::cout, std::cerr, std::endl */ #include /* exit */ #include /* memcpy, memset */ #include /* std::string */ #include /* perror */ #ifdef WIN32 #include #else #include #include #include #include #include #include #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(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 \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(); }