Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.41 KB | None | 0 0
  1. #include "irc.h"
  2. #include "tools.h"
  3.  
  4. #include <cstdio>
  5. #include <set>
  6. #include <cstdlib>
  7. #include <ctime>
  8. #include <iostream>
  9. #include <exception>
  10. #include <map>
  11.  
  12. #ifdef WIN32
  13.     #include <windows.h>
  14. #else
  15.     #include <pthread.h>
  16.     #pragma comment(lib, "pthread")
  17. #endif
  18.  
  19. typedef std::multiset<std::string> authVec;
  20. typedef std::vector<std::string> UsersVector;
  21. typedef std::map<time_t, std::string> TimerMap;
  22.  
  23. #ifdef WIN32
  24.     DWORD threadFunc(LPVOID p)
  25.     {
  26.         ::Sleep(100);
  27.         return 1; //shutdown thread
  28.     }
  29. #else
  30.     void *threadFunc(void *p)
  31.     {
  32.         char *msg = (char*)p;
  33.         printf("%s", msg);
  34.     }
  35. #endif
  36.  
  37. bool VectorFind(authVec& vec, const std::string& toFind)
  38. {
  39.     for(authVec::iterator it = vec.begin(); it != vec.end(); ++it) {
  40.         if((*it) == toFind)
  41.             return true;
  42.     }
  43.     return false;
  44. }
  45.  
  46. void restart()
  47. {
  48. #ifdef WIN32
  49.     system("TibiaBot.exe");
  50. #else
  51.     system("./TibiaBot");
  52. #endif
  53.     exit(-1);
  54. }
  55.  
  56. int main(int argc, char **argv)
  57. {
  58.     try
  59.     {
  60.         #ifdef WIN32
  61.             WSAData wsaData;
  62.             if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  63.                 return 1;
  64.  
  65.             SOCKET sf = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  66.             sockaddr_in service;
  67.             LPHOSTENT host = gethostbyname("127.0.0.1");
  68.             service.sin_family = AF_INET;
  69.             service.sin_addr = *((LPIN_ADDR)*host->h_addr_list);
  70.             service.sin_port = htons(113);
  71.             if(bind(sf, (SOCKADDR*)&service, sizeof(service)) != SOCKET_ERROR)
  72.                 std::cout << "Bind succesfull." << std::endl;
  73.             else
  74.                 std::cout << "Bind unsuccessfull, error: " << strerror(WSAGetLastError()) << " Errno: " << strerror(errno) << std::endl;
  75.  
  76.             if(listen(sf, -1) != SOCKET_ERROR)
  77.                 std::cout << "Listen succesfull" << std::endl;
  78.             else
  79.                 std::cout << "Listen unsuccessfull, error: "<< strerror(WSAGetLastError()) << " Errno: " << strerror(errno) << std::endl;
  80.  
  81.             int optval, sz=sizeof(int);
  82.             if(setsockopt(sf, SOL_SOCKET, SO_REUSEADDR, (char*)&optval, sz) != SOCKET_ERROR)
  83.                 std::cout << "setsockopt(): ok, value: " << sz << std::endl;
  84.             else
  85.                 std::cout << "setsockopt(): not ok, value: " << sz << ", error: " << strerror(WSAGetLastError()) << std::endl;
  86.         #endif
  87.         std::string nick = "TibiaBotDEV", user = "TibiaBot", botChannel = "#Tibia", buffer="", server = "us.quakenet.org";
  88.         if(argc == 2)
  89.             nick = std::string(argv[1]);
  90.  
  91.         if(argc == 3)
  92.             user = std::string(argv[2]);
  93.  
  94.         if(argc == 4)
  95.             server = std::string(argv[3]);
  96.  
  97.         if(argc == 5)
  98.             botChannel = std::string(argv[4]);
  99.     #ifdef WIN32
  100.         DWORD threadId[6];
  101.         for (int i = 0; i < 5; ++i) {
  102.             if(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&threadFunc, (LPVOID)&i, 0, &threadId[i]) != NULL) {
  103.                 printf("Created Thread %d\n", i+1);
  104.                 continue;
  105.             }
  106.             printf("Failed to create thread %d\nStopping....\n", i+1);
  107.             break;
  108.         }
  109.     #else
  110.         pthread_t threads[6];
  111.         int p[5];
  112.         char message[50];
  113.         for (int i = 0; i < 5; ++i) {
  114.             sprintf(message, "Created Thread %d\n", i+1);
  115.             p[i] = pthread_create(&threads[i], NULL, threadFunc, (void*)message);
  116.             if(p[i] != 0) {
  117.                 printf("Failed to create thread %d\nStopping....\n", i+1);
  118.                 break;
  119.             } else {
  120.                 pthread_join(threads[i], NULL);
  121.                 continue;
  122.             }
  123.         }
  124.     #endif
  125.         irc* Irc = new irc(server.c_str(), 6667);
  126.         Irc->sendMessage("USER " + user + " * * :" + user + "\r\n");
  127.         Irc->sendMessage("NICK " + nick + "\r\n");
  128.         bool s=false, started = false;
  129.         authVec authed;
  130.         authed.insert("Xeonz.users.quakenet.org");
  131.         authed.insert("Talaturen.users.quakenet.org");
  132.         authed.insert("Cykotitan.users.quakenet.org");
  133.         authed.insert("Chrsman.users.quakenet.org");
  134.         authed.insert("TibiaBot.users.quakenet.org");
  135.         UsersVector users;
  136.         TimerMap timers;
  137.         while(true) {
  138.             buffer = Irc->getReceivedMessage();
  139.             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();
  140.             if(buffer.find("PING") != std::string::npos) {
  141.                 std::string tmp = "PO" + buffer.substr(2) + "\r\n";
  142.                 printf("Sending ping request: %s\n", buffer.substr(2).c_str());
  143.                 Irc->sendMessage(tmp);
  144.             } else if(buffer.find("PRIVMSG") != std::string::npos) {
  145.                 printf("%s %s[%s]: %s\n", t.c_str(), name.c_str(), channel.c_str(), msg.c_str());
  146.             } else if(buffer.find("MODE") != std::string::npos) {
  147.                 printf("%s %s (%s) %s\n", t.c_str(), name.c_str(), mode.c_str(), target.c_str());
  148.                 if(!s) {
  149.                     Irc->sendMessage("JOIN " + botChannel + "\r\n");
  150.                     s = true;
  151.                 }
  152.             } else if(buffer.find("353") != std::string::npos) {
  153.                 std::string p = msg, sep = " ";
  154.                 strgsub(p, "+", "");
  155.                 strgsub(p, "@", "");
  156.                 strgsub(p, "%", "");
  157.                 strgsub(p, "&", "");
  158.                 size_t start = 0, end;
  159.                 std::cout << "Names for " + channel + ":";
  160.                 while((end = p.find(sep, start)) != std::string::npos) {
  161.                     std::cout << p.substr(start, end - start) << " ";
  162.                     users.push_back(p.substr(start, end - start));
  163.                     start = end + sep.size();
  164.                 }
  165.             } else if(buffer.find("INVITE") != std::string::npos) {
  166.                 Irc->sendMessage("JOIN " + botChannel + "\r\n");
  167.             } else if(buffer.find("NOTICE") != std::string::npos) {
  168.                 printf("%s[%s]: %s\n", t.c_str(), name.c_str(), msg.c_str());
  169.             } else if(buffer.find("JOIN") != std::string::npos) {
  170.                 printf("%s %s[%s] has joined %s\n", t.c_str(), name.c_str(), mask.c_str(), channel.c_str());
  171.                 users.push_back(name);
  172.                 timers.insert(std::make_pair(time(NULL) + 2000 / 1000, name));
  173.             } else if(buffer.find("PART") != std::string::npos) {
  174.                 printf("%s %s[%s] has left %s\n", t.c_str(), name.c_str(), mask.c_str(), channel.c_str());
  175.             } else if(buffer.find("QUIT") != std::string::npos) {
  176.                 printf("%s %s[%s] has quit (%s)\n", t.c_str(), name.c_str(), mask.c_str(), msg.c_str());
  177.             } else if(buffer.find("NICK") != std::string::npos) {
  178.                 printf("%s %s is now known as %s\n", t.c_str(), name.c_str(), msg.c_str());
  179.             } else if(buffer.find("TOPIC") != std::string::npos) {
  180.                 printf("Topic for %s: %s\n", channel.c_str(), msg.c_str());
  181.             } else if(buffer.find("KICK") != std::string::npos) {
  182.                 printf("%s %s was kicked by %s\n", t.c_str(), kicked.c_str(), name.c_str());
  183.             } else {
  184.                 if(!buffer.empty())
  185.                     printf("%s\n", buffer.c_str());
  186.             }
  187.             if(started) {
  188.                 for(TimerMap::iterator it = timers.begin(); it != timers.end(); ++it) {
  189.                     if(it->second != nick) {
  190.                         if(time(NULL) >= it->first) {
  191.                             try
  192.                             {
  193.                                 Irc->sendMessage("MODE " + channel + " +v " + it->second + "\r\n");
  194.                                 timers.erase(it->first);
  195.                                 it->second = "";
  196.                             }
  197.                             catch(std::exception const& e)
  198.                             {
  199.                                 Irc->sendMessage("PRIVMSG " + channel + " :Exception caught: " + e.what() + "\r\n");
  200.                                 std::cout << "Exception: " << e.what() << std::endl;
  201.                             }
  202.                         }
  203.                     }
  204.                 }
  205.             }
  206.             if(s) {
  207.                 if(VectorFind(authed, host)) {
  208.                     if(msg.substr(0, 5) == ".kick") {
  209.                         msg = msg.substr(6);
  210.                         Irc->sendMessage("KICK " + channel + " " + msg + "\r\n");
  211.                     } else if(msg.substr(0, 6) == "!names") {
  212.                         std::string _tmp = "";
  213.                         for(UsersVector::iterator it = users.begin(); it != users.end(); ++it)
  214.                             _tmp += *it + " ";
  215.                         Irc->sendMessage("PRIVMSG " + channel + " :" + _tmp + "\r\n");
  216.                     } else if(msg.substr(0, 6) == "!start") {
  217.                         started = true;
  218.                         Irc->sendMessage("PRIVMSG " + channel + " :Started.\r\n");
  219.                     } else if(msg.substr(0, 5) == "!stop") {
  220.                         started = false;
  221.                         Irc->sendMessage("PRIVMSG " + channel + " :Stopped.\r\n");
  222.                     } else if(msg.substr(0, 3) == ".+o") {
  223.                         msg = msg.substr(4);
  224.                         Irc->sendMessage("MODE " + channel + " +o " + msg + "\r\n");
  225.                     } else if(msg.substr(0, 3) == ".-o") {
  226.                         msg = msg.substr(4);
  227.                         Irc->sendMessage("MODE " + channel + " -o " + msg + "\r\n");
  228.                     } else if(msg.substr(0, 3) == ".+b") {
  229.                         msg = msg.substr(4);
  230.                         Irc->sendMessage("MODE " + channel + " +b " + msg + "*!*@*\r\n");
  231.                     } else if(msg.substr(0, 4) == ".+bk") {
  232.                         msg = msg.substr(5);
  233.                         Irc->sendMessage("MODE " + channel + " +b " + msg + "*!*@*\r\n");
  234.                         Irc->sendMessage("KICK " + channel + " " + msg + "\r\n");
  235.                     } else if(msg.substr(0, 3) == ".-b") {
  236.                         msg = msg.substr(4);
  237.                         Irc->sendMessage("MODE " + channel + " -b " + msg + "*!*@*\r\n");
  238.                     } else if(msg.substr(0, 5) == ".nick" && name == "Chrsman") {
  239.                         msg = msg.substr(6);
  240.                         Irc->sendMessage("NICK " + msg + "\r\n");
  241.                         nick = msg;
  242.                     } else if(msg.substr(0, 3) == ".+v") {
  243.                         msg = msg.substr(4);
  244.                         Irc->sendMessage("MODE " + channel + " +v " + msg + "\r\n");
  245.                     } else if(msg.substr(0, 3) == ".-v") {
  246.                         msg = msg.substr(4);
  247.                         Irc->sendMessage("MODE " + channel + " -v " + msg + "\r\n");
  248.                     } else if(msg.substr(0, 6) == ".invite") {
  249.                         msg = msg.substr(7);
  250.                         Irc->sendMessage("INVITE " + channel + " " + msg + "\r\n");
  251.                     } else if(msg.substr(0, 5) == ".quit" && name == "Chrsman") {
  252.                         msg = msg.substr(6);
  253.                         Irc->sendMessage("QUIT :" + msg + "\r\n");
  254.                         exit(1);
  255.                     } else if(msg.substr(0, 5) == "!part" && name == "Chrsman") {
  256.                         msg = msg.substr(6);
  257.                         Irc->sendMessage("PART " + msg + "\r\n");
  258.                     } else if(msg.substr(0, 2) == "!s") {
  259.                         msg = msg.substr(3);
  260.                         Irc->sendMessage("PRIVMSG " + channel + " :" + msg + "\r\n");
  261.                         continue;
  262.                     }
  263.                 }
  264.             }
  265.         }
  266.     }
  267.     catch(std::exception& e)
  268.     {
  269.         std::cout << "Exception: " << e.what() << std::endl;
  270.         system("pause");
  271.     }
  272.     return 0;
  273. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement