Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "irc.h"
- #include "tools.h"
- #include <cstdio>
- #include <set>
- #include <cstdlib>
- #include <ctime>
- #include <iostream>
- #include <exception>
- #include <map>
- #ifdef WIN32
- #include <windows.h>
- #else
- #include <pthread.h>
- #pragma comment(lib, "pthread")
- #endif
- typedef std::multiset<std::string> authVec;
- typedef std::vector<std::string> UsersVector;
- typedef std::map<time_t, std::string> TimerMap;
- #ifdef WIN32
- DWORD threadFunc(LPVOID p)
- {
- ::Sleep(100);
- return 1; //shutdown thread
- }
- #else
- void *threadFunc(void *p)
- {
- char *msg = (char*)p;
- printf("%s", msg);
- }
- #endif
- bool VectorFind(authVec& vec, const std::string& toFind)
- {
- for(authVec::iterator it = vec.begin(); it != vec.end(); ++it) {
- if((*it) == toFind)
- return true;
- }
- return false;
- }
- void restart()
- {
- #ifdef WIN32
- system("TibiaBot.exe");
- #else
- system("./TibiaBot");
- #endif
- exit(-1);
- }
- int main(int argc, char **argv)
- {
- try
- {
- #ifdef WIN32
- WSAData wsaData;
- if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
- return 1;
- SOCKET sf = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- sockaddr_in service;
- LPHOSTENT host = gethostbyname("127.0.0.1");
- service.sin_family = AF_INET;
- service.sin_addr = *((LPIN_ADDR)*host->h_addr_list);
- service.sin_port = htons(113);
- if(bind(sf, (SOCKADDR*)&service, sizeof(service)) != SOCKET_ERROR)
- std::cout << "Bind succesfull." << std::endl;
- else
- std::cout << "Bind unsuccessfull, error: " << strerror(WSAGetLastError()) << " Errno: " << strerror(errno) << std::endl;
- if(listen(sf, -1) != SOCKET_ERROR)
- std::cout << "Listen succesfull" << std::endl;
- else
- std::cout << "Listen unsuccessfull, error: "<< strerror(WSAGetLastError()) << " Errno: " << strerror(errno) << std::endl;
- int optval, sz=sizeof(int);
- if(setsockopt(sf, SOL_SOCKET, SO_REUSEADDR, (char*)&optval, sz) != SOCKET_ERROR)
- std::cout << "setsockopt(): ok, value: " << sz << std::endl;
- else
- std::cout << "setsockopt(): not ok, value: " << sz << ", error: " << strerror(WSAGetLastError()) << std::endl;
- #endif
- std::string nick = "TibiaBotDEV", user = "TibiaBot", botChannel = "#Tibia", buffer="", server = "us.quakenet.org";
- if(argc == 2)
- nick = std::string(argv[1]);
- if(argc == 3)
- user = std::string(argv[2]);
- if(argc == 4)
- server = std::string(argv[3]);
- if(argc == 5)
- botChannel = std::string(argv[4]);
- #ifdef WIN32
- DWORD threadId[6];
- for (int i = 0; i < 5; ++i) {
- if(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&threadFunc, (LPVOID)&i, 0, &threadId[i]) != NULL) {
- printf("Created Thread %d\n", i+1);
- continue;
- }
- printf("Failed to create thread %d\nStopping....\n", i+1);
- break;
- }
- #else
- pthread_t threads[6];
- int p[5];
- char message[50];
- for (int i = 0; i < 5; ++i) {
- sprintf(message, "Created Thread %d\n", i+1);
- p[i] = pthread_create(&threads[i], NULL, threadFunc, (void*)message);
- if(p[i] != 0) {
- printf("Failed to create thread %d\nStopping....\n", i+1);
- break;
- } else {
- pthread_join(threads[i], NULL);
- continue;
- }
- }
- #endif
- irc* Irc = new irc(server.c_str(), 6667);
- Irc->sendMessage("USER " + user + " * * :" + user + "\r\n");
- Irc->sendMessage("NICK " + nick + "\r\n");
- bool s=false, started = false;
- authVec authed;
- authed.insert("Xeonz.users.quakenet.org");
- authed.insert("Talaturen.users.quakenet.org");
- authed.insert("Cykotitan.users.quakenet.org");
- authed.insert("Chrsman.users.quakenet.org");
- authed.insert("TibiaBot.users.quakenet.org");
- UsersVector users;
- TimerMap timers;
- while(true) {
- buffer = Irc->getReceivedMessage();
- std::string name = getName(buffer), msg = getMsg(buffer), channel = getChannel(buffer), mode = getMode(buffer), mask = getMask(buffer), target = getModeTarget(buffer), kicked = getKicked(buffer), host = getHost(buffer), t = getTime();
- if(buffer.find("PING") != std::string::npos) {
- std::string tmp = "PO" + buffer.substr(2) + "\r\n";
- printf("Sending ping request: %s\n", buffer.substr(2).c_str());
- Irc->sendMessage(tmp);
- } else if(buffer.find("PRIVMSG") != std::string::npos) {
- printf("%s %s[%s]: %s\n", t.c_str(), name.c_str(), channel.c_str(), msg.c_str());
- } else if(buffer.find("MODE") != std::string::npos) {
- printf("%s %s (%s) %s\n", t.c_str(), name.c_str(), mode.c_str(), target.c_str());
- if(!s) {
- Irc->sendMessage("JOIN " + botChannel + "\r\n");
- s = true;
- }
- } else if(buffer.find("353") != std::string::npos) {
- std::string p = msg, sep = " ";
- strgsub(p, "+", "");
- strgsub(p, "@", "");
- strgsub(p, "%", "");
- strgsub(p, "&", "");
- size_t start = 0, end;
- std::cout << "Names for " + channel + ":";
- while((end = p.find(sep, start)) != std::string::npos) {
- std::cout << p.substr(start, end - start) << " ";
- users.push_back(p.substr(start, end - start));
- start = end + sep.size();
- }
- } else if(buffer.find("INVITE") != std::string::npos) {
- Irc->sendMessage("JOIN " + botChannel + "\r\n");
- } else if(buffer.find("NOTICE") != std::string::npos) {
- printf("%s[%s]: %s\n", t.c_str(), name.c_str(), msg.c_str());
- } else if(buffer.find("JOIN") != std::string::npos) {
- printf("%s %s[%s] has joined %s\n", t.c_str(), name.c_str(), mask.c_str(), channel.c_str());
- users.push_back(name);
- timers.insert(std::make_pair(time(NULL) + 2000 / 1000, name));
- } else if(buffer.find("PART") != std::string::npos) {
- printf("%s %s[%s] has left %s\n", t.c_str(), name.c_str(), mask.c_str(), channel.c_str());
- } else if(buffer.find("QUIT") != std::string::npos) {
- printf("%s %s[%s] has quit (%s)\n", t.c_str(), name.c_str(), mask.c_str(), msg.c_str());
- } else if(buffer.find("NICK") != std::string::npos) {
- printf("%s %s is now known as %s\n", t.c_str(), name.c_str(), msg.c_str());
- } else if(buffer.find("TOPIC") != std::string::npos) {
- printf("Topic for %s: %s\n", channel.c_str(), msg.c_str());
- } else if(buffer.find("KICK") != std::string::npos) {
- printf("%s %s was kicked by %s\n", t.c_str(), kicked.c_str(), name.c_str());
- } else {
- if(!buffer.empty())
- printf("%s\n", buffer.c_str());
- }
- if(started) {
- for(TimerMap::iterator it = timers.begin(); it != timers.end(); ++it) {
- if(it->second != nick) {
- if(time(NULL) >= it->first) {
- try
- {
- Irc->sendMessage("MODE " + channel + " +v " + it->second + "\r\n");
- timers.erase(it->first);
- it->second = "";
- }
- catch(std::exception const& e)
- {
- Irc->sendMessage("PRIVMSG " + channel + " :Exception caught: " + e.what() + "\r\n");
- std::cout << "Exception: " << e.what() << std::endl;
- }
- }
- }
- }
- }
- if(s) {
- if(VectorFind(authed, host)) {
- if(msg.substr(0, 5) == ".kick") {
- msg = msg.substr(6);
- Irc->sendMessage("KICK " + channel + " " + msg + "\r\n");
- } else if(msg.substr(0, 6) == "!names") {
- std::string _tmp = "";
- for(UsersVector::iterator it = users.begin(); it != users.end(); ++it)
- _tmp += *it + " ";
- Irc->sendMessage("PRIVMSG " + channel + " :" + _tmp + "\r\n");
- } else if(msg.substr(0, 6) == "!start") {
- started = true;
- Irc->sendMessage("PRIVMSG " + channel + " :Started.\r\n");
- } else if(msg.substr(0, 5) == "!stop") {
- started = false;
- Irc->sendMessage("PRIVMSG " + channel + " :Stopped.\r\n");
- } else if(msg.substr(0, 3) == ".+o") {
- msg = msg.substr(4);
- Irc->sendMessage("MODE " + channel + " +o " + msg + "\r\n");
- } else if(msg.substr(0, 3) == ".-o") {
- msg = msg.substr(4);
- Irc->sendMessage("MODE " + channel + " -o " + msg + "\r\n");
- } else if(msg.substr(0, 3) == ".+b") {
- msg = msg.substr(4);
- Irc->sendMessage("MODE " + channel + " +b " + msg + "*!*@*\r\n");
- } else if(msg.substr(0, 4) == ".+bk") {
- msg = msg.substr(5);
- Irc->sendMessage("MODE " + channel + " +b " + msg + "*!*@*\r\n");
- Irc->sendMessage("KICK " + channel + " " + msg + "\r\n");
- } else if(msg.substr(0, 3) == ".-b") {
- msg = msg.substr(4);
- Irc->sendMessage("MODE " + channel + " -b " + msg + "*!*@*\r\n");
- } else if(msg.substr(0, 5) == ".nick" && name == "Chrsman") {
- msg = msg.substr(6);
- Irc->sendMessage("NICK " + msg + "\r\n");
- nick = msg;
- } else if(msg.substr(0, 3) == ".+v") {
- msg = msg.substr(4);
- Irc->sendMessage("MODE " + channel + " +v " + msg + "\r\n");
- } else if(msg.substr(0, 3) == ".-v") {
- msg = msg.substr(4);
- Irc->sendMessage("MODE " + channel + " -v " + msg + "\r\n");
- } else if(msg.substr(0, 6) == ".invite") {
- msg = msg.substr(7);
- Irc->sendMessage("INVITE " + channel + " " + msg + "\r\n");
- } else if(msg.substr(0, 5) == ".quit" && name == "Chrsman") {
- msg = msg.substr(6);
- Irc->sendMessage("QUIT :" + msg + "\r\n");
- exit(1);
- } else if(msg.substr(0, 5) == "!part" && name == "Chrsman") {
- msg = msg.substr(6);
- Irc->sendMessage("PART " + msg + "\r\n");
- } else if(msg.substr(0, 2) == "!s") {
- msg = msg.substr(3);
- Irc->sendMessage("PRIVMSG " + channel + " :" + msg + "\r\n");
- continue;
- }
- }
- }
- }
- }
- catch(std::exception& e)
- {
- std::cout << "Exception: " << e.what() << std::endl;
- system("pause");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement