Advertisement
Guest User

Untitled

a guest
Apr 16th, 2012
955
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 12.63 KB | None | 0 0
  1. #include <socket>
  2.  
  3. #define MAX_NICK_LEN 30
  4. #define MAX_CHANNEL_LEN 32
  5. #define MAX_BOTS 5
  6. #define COMMAND_PREFIX '!'
  7.  
  8.  
  9. forward onBotConnect(botid);
  10. forward onBotDisconnect(botid);
  11. forward onCTCPRequest(botid, user[], request_msg[], user_ident[]);
  12. forward onChannelMessage(botid, user[], channel[], message[], user_ident[]);
  13. forward onIRCCommand(botid, user[], channel[], command[], user_ident[]);
  14. forward onPrivateMessage(botid, user[], message[], user_ident[]);
  15. forward onChannelJoin(botid, user[], channel[], user_ident[]);
  16. forward onChannelPart(botid, user[], channel[], part_msg[], user_ident[]);
  17. forward onBotNotice(botid, source[], message[], user_ident);
  18. forward onUserQuit(botid, user[], leaving_msg[], user_ident[]);
  19. forward onNicknameChange(botid, user[], new_name[], user_ident[]);
  20. forward onChannelKick(botid, user[], victim[], channel[], reason[], user_ident[]);
  21. forward onBotInvite(botid, user[], channel[], user_ident[]);
  22. forward onRawCommand(botid, raw_code, raw_data[]);
  23. forward onChannelMode(botid, user[], channel[], mode[], option[], user_ident[]);
  24. forward onTopicChange(botid, user[], channel[], topic[], user_ident[]);
  25.  
  26.  
  27. enum botInfo {
  28.     Socket:socket,
  29.     sNickname[MAX_NICK_LEN],
  30.     sUsername[MAX_NICK_LEN],
  31.     sRealName[MAX_NICK_LEN*2],
  32.     sServer[80],
  33.     iPort,
  34.     bool:bConnected,
  35. }
  36. new g_aIRCBot[MAX_BOTS][botInfo];
  37. new g_iBots = -1;
  38.  
  39. stock ircbot_connect(server[], port, nickname[], username[], realname[])
  40. {
  41.     new sData[256];
  42.     g_iBots++;
  43.     g_aIRCBot[g_iBots][socket] = socket_create(TCP);
  44.     if(is_socket_valid(g_aIRCBot[g_iBots][socket])) {
  45.         g_aIRCBot[g_iBots][bConnected] = false;
  46.         format(g_aIRCBot[g_iBots][sServer], 80, server);
  47.         g_aIRCBot[g_iBots][iPort] = port;
  48.         format(g_aIRCBot[g_iBots][sNickname], MAX_NICK_LEN, nickname);
  49.         format(g_aIRCBot[g_iBots][sUsername], MAX_NICK_LEN, username);
  50.         format(g_aIRCBot[g_iBots][sRealName], MAX_NICK_LEN*2, realname);
  51.         socket_connect(g_aIRCBot[g_iBots][socket], g_aIRCBot[g_iBots][sServer], g_aIRCBot[g_iBots][iPort]);
  52.         format(sData, sizeof sData, "NICK %s\r\nUSER %s - - :%s\r\nMODE %s +B\r\n", g_aIRCBot[g_iBots][sNickname], g_aIRCBot[g_iBots][sUsername], g_aIRCBot[g_iBots][sRealName], g_aIRCBot[g_iBots][sNickname]);
  53.         socket_send(g_aIRCBot[g_iBots][socket], sData);
  54.         return g_iBots;
  55.     }
  56.     g_iBots--;
  57.     return (-1);
  58. }
  59.  
  60. stock ircbot_reconnect(botid)
  61. {
  62.     new sData[80];
  63.     if(is_socket_valid(g_aIRCBot[botid][socket]) && !g_aIRCBot[botid][bConnected]) {
  64.         g_aIRCBot[botid][socket] = socket_create(TCP);
  65.         socket_connect(g_aIRCBot[botid][socket], g_aIRCBot[botid][server], g_aIRCBot[botid][port]);
  66.         format(sData, sizeof sData, "NICK %s\r\nUSER %s - - :%s\r\nMODE %s +B\r\n", g_aIRCBot[botid][sNickname], g_aIRCBot[botid][sUsername], g_aIRCBot[botid][sRealName], g_aIRCBot[botid][sNickname]);
  67.         socket_send(g_aIRCBot[botid][socket], sData);
  68.         return 1;
  69.     }
  70.     return 0;
  71. }
  72.  
  73. stock ircbot_say(botid, receiver[], message[])
  74. {
  75.     new sMessage[256];
  76.     if(is_socket_valid(g_aIRCBot[botid][socket]) && g_aIRCBot[botid][bConnected]) {
  77.         format(sMessage, sizeof sMessage, "PRIVMSG %s :%s\r\n", receiver, message);
  78.         socket_send(g_aIRCBot[botid][socket], sMessage);
  79.         return 1;
  80.     }
  81.     return 0;
  82. }
  83.  
  84. // /me command
  85. stock ircbot_action(botid, receiver[], message[])
  86. {
  87.     new sMessage[256];
  88.     if(is_socket_valid(g_aIRCBot[botid][socket]) && g_aIRCBot[botid][bConnected]) {
  89.         format(sMessage, sizeof sMessage, "PRIVMSG %s :\001ACTION %s\001\r\n", receiver, message);
  90.         socket_send(g_aIRCBot[botid][socket], sMessage);
  91.         return 1;
  92.     }
  93.     return 0;
  94. }
  95.  
  96. stock ircbot_kick(botid, channel[], user[], reason[])
  97. {
  98.     new sMessage[256];
  99.     if(is_socket_valid(g_aIRCBot[botid][socket]) && g_aIRCBot[botid][bConnected]) {
  100.         format(sMessage, sizeof sMessage, "KICK %s %s %s", channel, user, reason);
  101.         socket_send(g_aIRCBot[botid][socket], sMessage);
  102.         return 1;
  103.     }
  104.     return 0;
  105. }
  106.  
  107. stock ircbot_notice(botid, receiver[], message[])
  108. {
  109.     new sMessage[256];
  110.     if(is_socket_valid(g_aIRCBot[botid][socket]) && g_aIRCBot[botid][bConnected]) {
  111.         format(sMessage, sizeof sMessage, "NOTICE %s %s", receiver, message);
  112.         socket_send(g_aIRCBot[botid][socket], sMessage);
  113.         return 1;
  114.     }
  115.     return 0;
  116. }
  117.  
  118. stock is_bot_connected(botid)
  119. {
  120.     return g_aIRCBot[botid][bConnected];
  121. }
  122.  
  123. stock ircbot_join(botid, channel[])
  124. {
  125.     new sData[MAX_CHANNEL_LEN+9];
  126.     if(is_socket_valid(g_aIRCBot[botid][socket]) && g_aIRCBot[botid][bConnected]) {
  127.         format(sData, sizeof sData, "JOIN %s\r\n", channel);
  128.         socket_send(g_aIRCBot[botid][socket], sData);
  129.         return 1;
  130.     }
  131.     return 0;
  132. }
  133.  
  134. stock ircbot_part(botid, channel[], message[])
  135. {
  136.     new sData[256];
  137.     if(is_socket_valid(g_aIRCBot[botid][socket]) && g_aIRCBot[botid][bConnected]) {
  138.         format(sData, sizeof sData, "PART %s :%s\r\n", channel, msg);
  139.         socket_send(g_aIRCBot[botid][socket], sData);
  140.         return 1;
  141.     }
  142.     return 0;
  143. }
  144.  
  145. stock ircbot_quit(botid, message[])
  146. {
  147.     new sData[256];
  148.     if(is_socket_valid(g_aIRCBot[botid][socket]) && g_aIRCBot[botid][bConnected]) {
  149.         format(sData, sizeof sData, "QUIT :%s\r\n", message);
  150.         socket_send(g_aIRCBot[botid][socket], sData);
  151.         return 1;
  152.     }
  153.     return 0;
  154. }
  155.  
  156. stock ircbot_raw(botid, raw_cmd[])
  157. {
  158.     new sData[256];
  159.     if(is_socket_valid(g_aIRCBot[botid][socket]) && g_aIRCBot[botid][bConnected]) {
  160.         format(sData, sizeof sData, "%s\r\n", raw_cmd);
  161.         socket_send(g_aIRCBot[botid][socket], sData);
  162.         return 1;
  163.     }
  164.     return 0;
  165. }
  166.  
  167. stock ircbot_setmode(botid, channel[], mode[])
  168. {
  169.     new sData[256];
  170.     if(is_socket_valid(g_aIRCBot[botid][socket]) && g_aIRCBot[botid][bConnected]) {
  171.         format(sData, sizeof sData, "MODE %s %s\r\n", channel, mode);
  172.         socket_send(g_aIRCBot[botid][socket], sData);
  173.         return 1;
  174.     }
  175.     return 0;
  176. }
  177.  
  178. public onSocketAnswer(Socket:id, data[], data_len)
  179. {
  180.     for(new i;i < MAX_BOTS;i++) {
  181.         if(g_aIRCBot[i][socket] == id) {
  182.             // :server 376 nickname :End of /MOTD command.
  183.             if(!g_aIRCBot[g_iBots][bConnected]) {
  184.                 if(strfind(data, ":End of /MOTD command.") != -1) {
  185.                     g_aIRCBot[g_iBots][bConnected] = true;
  186.                     // onBotConnect(botid);
  187.                     CallRemoteFunction("onBotConnect", "i", i);
  188.                     return 0;
  189.                 }
  190.             }
  191.             if(!g_aIRCBot[g_iBots][bConnected] || !Ping(id, data)) return 0;
  192.             new strParts[5][128];
  193.             split(data, strParts, 5, ' ');
  194.             if(!isNumeric(strParts[1])) {
  195.                 new sUser[MAX_NICK_LEN], sIdent[60];
  196.                 substr(sIdent, strParts[0], 1);
  197.                 FilterNickname(strParts[0], sUser);
  198.                 // lets parse all incoming events
  199.                 if(!strcmp(strParts[1], "PRIVMSG")) {
  200.                     new sMessage[256];
  201.                     trim(array_slice(data, 3), sMessage);
  202.                     if(sMessage[0] == COMMAND_PREFIX && sMessage[1] != ' ')
  203.                         CallRemoteFunction("onIRCCommand", "issss", i, sUser, strParts[2], sMessage, sIdent);
  204.                     if(sMessage[0] == '\001') {
  205.                         strmid(sMessage, sMessage, 1, strlen(sMessage)-1);
  206.                         // onCTCPRequest(botid, user[], request_msg[], user_ident[]);
  207.                         CallRemoteFunction("onCTCPRequest", "isss", i, sUser, sMessage, sIdent);
  208.                     } else if(strParts[2][0] == '#') {
  209.                         // onChannelMessage(botid, user[], channel[], message[], user_ident[]);
  210.                         CallRemoteFunction("onChannelMessage", "issss", i, sUser, strParts[2], sMessage, sIdent);
  211.                     } else {
  212.                         // onPrivateMessage(botid, user[], message[], user_ident[]);
  213.                         CallRemoteFunction("onPrivateMessage", "isss", i, sUser, sMessage, sIdent);
  214.                     }
  215.                 } else if(!strcmp(strParts[1], "JOIN")) {
  216.                     new sChannel[MAX_CHANNEL_LEN];
  217.                     strmid(sChannel, strParts[2], 1, strlen(strParts[2])-1);
  218.                     trim(sChannel, sChannel);
  219.                     // onChannelJoin(botid, user[], channel[], user_ident[]);
  220.                     CallRemoteFunction("onChannelJoin", "isss", i, sUser, sChannel, sIdent);
  221.                 } else if(!strcmp(strParts[1], "PART")) {
  222.                     new sMessage[128];
  223.                     if(strlen(strParts[3]) > 0)
  224.                         trim(array_slice(data, 3), sMessage);
  225.                     else
  226.                         format(sMessage, sizeof sMessage, "None");
  227.                     // onChannelPart(botid, user[], channel[], part_msg[], user_ident[]);
  228.                     CallRemoteFunction("onChannelPart", "issss", i, sUser, strParts[2], sMessage, sIdent);
  229.                 } else if(!strcmp(strParts[1], "NOTICE")) {
  230.                     new sMessage[128];
  231.                     trim(array_slice(data, 3), sMessage);
  232.                     // onBotNotice(botid, source[], message[], user_ident);
  233.                     CallRemoteFunction("onBotNotice", "issss", i, strParts[2], sMessage, sIdent);
  234.                 } else if(!strcmp(strParts[1], "QUIT")) {
  235.                     new sMessage[128];
  236.                     trim(array_slice(data, 2), sMessage);
  237.                     // onUserQuit(botid, user[], leaving_msg[], user_ident[]);
  238.                     CallRemoteFunction("onUserQuit", "isss", i, sUser, sMessage, sIdent);
  239.                 } else if(!strcmp(strParts[1], "NICK")) {
  240.                     new sNew[128];
  241.                     substr(sNew, strParts[2], 1);
  242.                     // onNicknameChange(botid, user[], new_name[], user_ident[]);
  243.                     CallRemoteFunction("onNicknameChange", "isss", i, sUser, sNew, sIdent);
  244.                 } else if(!strcmp(strParts[1], "KICK")) {
  245.                     new sMessage[128];
  246.                     trim(array_slice(data, 4), sMessage);
  247.                     // onChannelKick(botid, user[], victim[], channel[], reason[], user_ident[]);
  248.                     CallRemoteFunction("onChannelKick", "isssss", i, sUser, strParts[3], strParts[2], sMessage, sIdent);
  249.                 } else if(!strcmp(strParts[1], "INVITE")) {
  250.                     new sChannel[MAX_CHANNEL_LEN];
  251.                     substr(sChannel, strParts[3], 1);
  252.                     // onBotInvite(botid, user[], channel[], user_ident[]);
  253.                     CallRemoteFunction("onBotInvite", "iss", i, sUser, sChannel, sIdent);
  254.                 } else if(!strcmp(strParts[1], "MODE")) {
  255.                     new sOption[256];
  256.                     if(strlen(strParts[4]) > 0)
  257.                         trim(array_slice(data, 4, 1), sOption);
  258.                     // onChannelMode(botid, user[], channel[], mode[], option[], user_ident[]);
  259.                     CallRemoteFunction("onChannelMode", "isssss", i, sUser, strParts[2], strParts[3], sOption, sIdent);
  260.                 } else if(!strcmp(strParts[1], "TOPIC")) {
  261.                     new sTopic[256];
  262.                     trim(array_slice(data, 3), sTopic);
  263.                     // onTopicChange(botid, user[], channel[], topic[], user_ident[]);
  264.                     CallRemoteFunction("onTopicChange", "issss", i, sUser, strParts[2], sTopic, sIdent);
  265.                 }
  266.             } else {
  267.                 CallRemoteFunction("onRawCommand", "iis", i, strval(strParts[1]), array_slice(data, 2, 1));
  268.             }
  269.         }
  270.         break;
  271.     }
  272.     return 1;
  273. }
  274.  
  275. public onSocketClose(Socket:id)
  276. {
  277.     for(new i;i < MAX_BOTS;i++) {
  278.         if(g_aIRCBot[i][socket] == id) {
  279.             if(g_aIRCBot[i][bConnected]) {
  280.                 CallRemoteFunction("onBotDisconnect", "i", i);
  281.                 g_aIRCBot[i][bConnected] = false;
  282.             }
  283.         }
  284.     }
  285.     return 1;
  286. }
  287.  
  288. stock substr(dest[], source[], pos, max_len = sizeof(dest))
  289. {
  290.     return strmid(dest, source, pos, strlen(source), max_len);
  291. }
  292.  
  293. stock trim(string_data[], dest[])
  294. {
  295.     for(new i, a = strlen(string_data);i < a;i++)
  296.     {
  297.         if(string_data[i] != '\r' && string_data[i] != '\n'/* string_data[i] != '\001'*/)
  298.             dest[i] = string_data[i];
  299.     }
  300. }
  301.  
  302. stock FilterNickname(const ident[], dest[])
  303. {
  304.     // :nick!user@hostname
  305.     new pos = strfind(ident, "!");
  306.     return strmid(dest, ident, 1, pos, MAX_NICK_LEN);
  307. }
  308.  
  309. // php like behaviour
  310. stock array_slice(array[], offset, start_pos = 2)
  311. {
  312.     new pCount = 0, final[1024];
  313.     for(new i, a = strlen(array);i < a;i++)
  314.     {
  315.         if(array[i] == ' ') {
  316.             pCount++;
  317.             if(pCount == offset) {
  318.                 // skip :msg
  319.                 strmid(final, array, i+start_pos, a);
  320.                 break;
  321.             }
  322.         }
  323.     }
  324.     return final;
  325. }
  326.  
  327. stock Ping(Socket:id, raw_data[])
  328. {
  329.     // handle ping pong
  330.     new idx, string[256];
  331.     string = strtok(raw_data, idx);
  332.     if(!strcmp(string, "PING")) {
  333.         new pong[64];
  334.         string = strtok(raw_data, idx);
  335.         format(pong, sizeof pong, "PONG :%s\r\n", string);
  336.         socket_send(id, pong);
  337.         return 0;
  338.     }
  339.     return 1;
  340. }
  341.  
  342. stock isNumeric(const string[])
  343. {
  344.     new len = strlen(string);
  345.     if(!len) return 0;
  346.     for (new i = 0; i < len; i++) {
  347.         if(string[i] < '0' || string[i] > '9') return 0;
  348.     }
  349.     return 1;
  350. }
  351.  
  352. strtok(const string[], &index)
  353. {
  354.     new length = strlen(string);
  355.     while ((index < length) && (string[index] <= ' '))
  356.     {
  357.         index++;
  358.     }
  359.  
  360.     new offset = index;
  361.     new result[256];
  362.     while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
  363.     {
  364.         result[index - offset] = string[index];
  365.         index++;
  366.     }
  367.     result[index - offset] = EOS;
  368.     return result;
  369. }
  370.  
  371. // (c) to whoever made this function
  372. stock split(const strsrc[], strdest[][], limit, delimiter = '|')
  373. {
  374.     new i, li, aNum, len, srclen = strlen(strsrc);
  375.     while(i <= srclen && aNum < limit)
  376.     {
  377.         if (strsrc[i] == delimiter || i == srclen)
  378.         {
  379.             len = strmid(strdest[aNum], strsrc, li, i, 128);
  380.             strdest[aNum][len] = 0;
  381.             li = i + 1;
  382.             aNum++;
  383.         }
  384.         i++;
  385.     }
  386.     return 1;
  387. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement