Såg tråden när jag kollade runt lite så jag tyckte att jag kunde registrera mig och koda en simpel irc-bot.
Boten är skriven i C++.
#include <windows.h>
#include <iostream>
#include <string>
#include <fstream>
#define DEFAULT_CHANNEL "#0merta"
using namespace std;
SOCKET InitSocket(const char* ip, int port);
DWORD WINAPI ReceiveThread();
class bot{
public:
string name;
SOCKET client;
string SendToChan(string chan, string data);
};
string bot::SendToChan(string chan, string data)
{
string str = "PRIVMSG ";
str+=chan;
str+=" :";
str+=data;
str+="\r\n";
return str;
}
bot B;
int main()
{
cout << "Enter name: ";
getline(cin, B.name);
cout << "Enter IP: ";
string ip;
getline(cin, ip);
cout << "And port: ";
int port;
cin >> port;
cout << "Connecting to " << ip << " on port " << port << endl;
B.client = InitSocket(ip.c_str(), port);
CreateThread(NULL, 0, LPTHREAD_START_ROUTINE(ReceiveThread), NULL, 0, 0);
string nick = "NICK ";
nick += B.name;
nick += "\r\nUSER hejsan B B B\r\n";
send(B.client, nick.c_str(), nick.length(), 0);
Sleep(2000);
string Join = "JOIN ";
Join += DEFAULT_CHANNEL;
Join += "\r\n";
send(B.client, Join.c_str(), Join.length(), 0);
send(B.client, B.SendToChan(DEFAULT_CHANNEL, "Test").c_str(), B.SendToChan(DEFAULT_CHANNEL, "Test").length(), 0);
while(1)
{
cout << "Kanal/person du vill skicka meddelande till: ";
string buffer;
getline(cin, buffer);
cout << "Meddelande: ";
string med;
getline(cin, med);
send(B.client, B.SendToChan(buffer, med).c_str(), B.SendToChan(buffer, med).length(), 0);
}
}
void AddToLog(std::string buffer)
{
ofstream stream;
stream.open("C:\\logfile.txt", ios::app);
stream << buffer.c_str();
stream.close();
}
DWORD WINAPI ReceiveThread()
{
char data[1024] = "";
while(1)
{
while(recv(B.client, data, sizeof(data), 0) > 0)
{
AddToLog(data);
if(strstr(data, "PING") != NULL)
{
std::string test = data;
std::string substring = test.substr(6);
test = "PONG :";
test += substring;
test += "\r\n";
send(B.client, test.c_str(), test.length(), 0);
}
ZeroMemory(data, sizeof(data));
}
Sleep(10);
}
return 0;
}
SOCKET InitSocket(const char* ip, int port)
{
WSADATA wsaData;
WORD version;
SOCKET zeSock;
version = MAKEWORD(2, 2);
int error;
error = WSAStartup(version, &wsaData);
if(error != 0)
return false;
if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
WSACleanup();
return false;
}
zeSock = socket(AF_INET, SOCK_STREAM, 0);
if(zeSock == INVALID_SOCKET)
return false;
struct hostent *host;
struct sockaddr_in sin;
host = gethostbyname(ip);
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr = *((in_addr *)host->h_addr);
sin.sin_port = htons(port);
error = connect(zeSock, (sockaddr*)&sin, sizeof sin);
if(error != 0)
return false;
return zeSock;
}