Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.62 KB | None | 0 0
  1. #include "bot.h"
  2.  
  3. void Bot::Connect()
  4. {
  5. bool tmp;
  6. #ifdef _WIN32
  7. tmp = SOCK_CREATEW();
  8. #else
  9. tmp = SOCK_CREATEL();
  10. #endif
  11.  
  12. if(tmp == 1) Login();
  13. }
  14.  
  15. void Bot::Disconnect()
  16. {
  17. #ifdef _WIN32
  18. shutdown(sock, SD_BOTH);
  19. closesocket(sock);
  20. WSACleanup();
  21. #else
  22. close(sock);
  23. #endif
  24.  
  25. printf("Socket Closed\n");
  26. Connected = false;
  27. }
  28.  
  29. void Bot::Login()
  30. {
  31. if(!strcmp(Client,"TAHC"))
  32. {
  33. Connected = true;
  34. ////Send("%c%c%s\r\n%s\r\n/join %s\r\n", 0x03, 0x04, Username, Password, Channel);
  35. ABYTE(0x03);ABYTE(0x04);ASTRING(Username);ASTRING((char*)"\r\n");ASTRING(Password);ASTRING((char*)"\r\n");
  36. //Send("\x03\x04%s\r\n%s\r\n/join %s\r\n", Username, Password, Channel);
  37. SOCK_HANDLERC();
  38. }
  39. else
  40. {
  41. send(sock,"\x01",1,0);
  42. SP_0x50();
  43. SOCK_HANDLERB();
  44. }
  45. }
  46.  
  47. int Bot::Send(char *lpszFmt, ...)
  48. {
  49. char szOutStr[256];
  50. va_list argptr;
  51.  
  52. va_start(argptr, lpszFmt);
  53. vsprintf(szOutStr, lpszFmt, argptr);
  54. va_end(argptr);
  55.  
  56. if (send(sock, szOutStr, strlen(szOutStr), 0) < 0)
  57. return 0;
  58.  
  59. return 1;
  60. }
  61.  
  62. bool Bot::SOCK_CREATEL()
  63. {
  64. struct hostent *h;
  65. struct sockaddr_in their_addr;
  66.  
  67. if ((h=gethostbyname(Server)) == NULL)
  68. {
  69. printf("gethostbyname error\n");
  70. return 0;
  71. }
  72.  
  73. if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  74. {
  75. printf("socket error \n");
  76. return 0;
  77. }
  78.  
  79. their_addr.sin_family = AF_INET;
  80. their_addr.sin_port = htons(6112);
  81. their_addr.sin_addr = *((struct in_addr *)h->h_addr);
  82.  
  83. //bzero(&(their_addr.sin_zero), 8);
  84.  
  85. if (connect(sock, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
  86. {
  87. printf("connect error\n");
  88. return 0;
  89. }
  90.  
  91. return 1;
  92. }
  93.  
  94. bool Bot::SOCK_CREATEW()
  95. {
  96. #ifdef _WIN32
  97. int error = WSAStartup (0x0202, &wsaData); //0x202 = Version 2.2 | 0x101 = Version 1.1 :)
  98.  
  99. if (error)
  100. {
  101. return 0;//return -1;
  102. }
  103.  
  104. if (wsaData.wVersion != 0x0202)
  105. {
  106. WSACleanup();
  107. return 0;//return -2;
  108. }
  109.  
  110. WSAStartup(MAKEWORD(1,1), &wsaData);
  111. sock = socket(AF_INET, SOCK_STREAM, 0);
  112. IRCAdd.sin_family = AF_INET;
  113. IRCAdd.sin_port = htons(6112);
  114.  
  115. unsigned long addr = inet_addr(Server);
  116. if (addr == INADDR_NONE) {
  117. hostent* HE = gethostbyname(Server);
  118. if (!HE) {
  119. WSACleanup();
  120. return 0;//return -4;
  121. }
  122. addr = *((u_long*)HE->h_addr_list[0]);
  123. }
  124.  
  125. IRCAdd.sin_addr.s_addr = addr;
  126. printf("Connecting to: %s:%u\n", Server, 6112);
  127.  
  128. FD_SET fd_s;
  129. FD_ZERO(&fd_s);
  130. FD_SET(sock, &fd_s);
  131.  
  132. error = connect(sock, (struct sockaddr *)&IRCAdd, sizeof(IRCAdd));
  133. if (error == SOCKET_ERROR)
  134. {
  135. error = select(0, NULL, &fd_s, NULL, 0);
  136.  
  137. if (error == SOCKET_ERROR) {
  138. WSACleanup();
  139. return 0;//return -3;
  140. }
  141. }
  142.  
  143. printf("Connected to %s!\n", Server);
  144. return 1;
  145. #endif
  146. }
  147.  
  148. void Bot::SOCK_HANDLERC()
  149. {
  150. int numbytes;
  151. int nBufLen=0;
  152. int nBufPos=0;
  153. char stageBuf[2048];
  154.  
  155. while(1)
  156. {
  157. int nNumToRead = 2048 - nBufLen - nBufPos;
  158.  
  159. if (nNumToRead == 0)
  160. {
  161. memmove(stageBuf, stageBuf+nBufPos, nBufLen);
  162. nBufPos = 0;
  163. nNumToRead = 2048 - nBufLen;
  164. }
  165.  
  166. numbytes = recv(sock, stageBuf + nBufPos + nBufLen, nNumToRead, 0);
  167.  
  168. if (numbytes <= 0) return;
  169.  
  170. nBufLen += numbytes;
  171.  
  172. while (nBufLen > 0)
  173. {
  174. char *m = stageBuf + nBufPos;
  175. int nMsgLen = 0;
  176.  
  177. while (nMsgLen < nBufLen)
  178. {
  179. if (m[nMsgLen] == '\n') break;
  180. nMsgLen++;
  181. }
  182.  
  183. nMsgLen++;
  184. if (nMsgLen > nBufLen) break;
  185. m[nMsgLen - 1] = '\0';
  186. //if (isdigit(*m))
  187. CDispatch(m);
  188. nBufLen -= nMsgLen;
  189. nBufPos += nMsgLen;
  190. }
  191.  
  192. if (!nBufLen) nBufPos = 0;
  193. }
  194. }
  195.  
  196. void Bot::SOCK_HANDLERB()
  197. {
  198. char recvbuf[32000];
  199.  
  200. while (1)
  201. {
  202. char *recvbuf2 = recvbuf;
  203. int numbytes = recv(sock, recvbuf, sizeof(recvbuf), 0);
  204.  
  205.  
  206. if (!numbytes || numbytes == -1)
  207. {
  208. printf("\nSOCK_HANDLERB() ERROR\n");
  209. return;
  210. }
  211.  
  212. while (numbytes >= 4)
  213. {
  214. if ((unsigned char)*recvbuf2 != (unsigned char)0xFF)
  215. {
  216. printf("\nNOT A 0xFF HHEADER\n");
  217. hexdump(recvbuf2);
  218. break;
  219. }
  220.  
  221. int bnetlen = *(unsigned short *)(recvbuf2 + 2);
  222. if (bnetlen > numbytes)
  223. {
  224. //printf("\nexpecting %d more bytes\n", bnetlen-numbytes);
  225.  
  226. if (recvbuf2 + numbytes >= recvbuf + sizeof(recvbuf))
  227. {
  228. memcpy(recvbuf, recvbuf2, numbytes);
  229. recvbuf2 = recvbuf;
  230. }
  231.  
  232. if (bnetlen > numbytes)
  233. {
  234. int tmp = recv(sock, recvbuf2 + numbytes, sizeof(recvbuf) - (recvbuf2 - recvbuf) - numbytes, 0);
  235.  
  236. if (!tmp || tmp == -1)
  237. {
  238. printf("\nSOCK_HANDLERB(2) ERROR\n");
  239. return;
  240. }
  241.  
  242. numbytes += tmp;
  243. }
  244. }
  245.  
  246. RP_HANDLER(recvbuf2[1], recvbuf2);
  247. recvbuf2 += bnetlen;
  248. numbytes -= bnetlen;
  249. }
  250. }
  251. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement