Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 21.06 KB | None | 0 0
  1. #ifndef _IRC_H_
  2. #define _IRC_H_
  3.  
  4. #include <string.h>
  5. #include <stdio.h>
  6. #include <winsock2.h>
  7. #include <windows.h>
  8. #include <ws2tcpip.h>
  9. #include <stdlib.h>
  10. #include <time.h>
  11.  
  12. class IrcCantConnectException
  13. {
  14.     char message[1024];
  15. public:
  16.     IrcCantConnectException(const char *hostname)
  17.     {
  18.         strcpy(message,"IRC failed to connect to ");
  19.         strcat(message,hostname);
  20.     }
  21.     const char *getMessage() {return message;}
  22. };
  23.  
  24. class IrcConnection
  25. {
  26.     SOCKET sock;
  27.     char recvbuf[4096];
  28.     char recvbuf2[4096];
  29.     char sendbuf[4096];
  30.     int receiving;
  31.     int receiving2;
  32. protected:
  33.     bool operational;
  34.     char mynick[256];
  35.     const char *server_;
  36.     const char *user_;
  37.     const char *nick_;
  38.     const char *password_;
  39.     const char *channel_;
  40. public:
  41.     IrcConnection() {sock=NULL;*recvbuf='\0';receiving=0;}
  42.     void IrcConnectTo(const char *server,const char *user,const char *nick,const char *password,const char *channel)
  43.     {
  44.         int reply;
  45.         printf("\nNICK is %s\n\n",nick);
  46.         hostent *h=gethostbyname(server);
  47.         int addrlen=sizeof(sockaddr_in);
  48.         sockaddr_in addr;
  49.         sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  50.         if(sock==INVALID_SOCKET) throw "Failed to create socket";
  51.         if(!h) throw "gethostbyname failed";
  52.         //WSAStringToAddress(*h->h_addr_list,AF_INET,NULL,(sockaddr*)&addr,&addrlen);
  53.         addr.sin_addr.S_un.S_addr=*(unsigned long*)*h->h_addr_list;
  54.         addr.sin_family=AF_INET;
  55.         addr.sin_port=htons(IRCPORT);
  56.         if(connect(sock,(sockaddr*)&addr,sizeof addr)==SOCKET_ERROR)
  57.             throw "Failed to connect to server";
  58.         operational=true;
  59.         if(nick)
  60.         {
  61.             sprintf(recvbuf,"NICK %s",nick);
  62.             Send(recvbuf);
  63.             reply=GetReply();
  64.             strcpy(mynick,nick);
  65.         }
  66.         if(!user) user=nick;
  67.         {
  68.             sprintf(recvbuf,"USER %s 127.0.0.1 %s :IrcTelnetBot",user,server);
  69.             Send(recvbuf);
  70.             reply=GetReply();
  71.         }
  72.         if(password)
  73.         {
  74.             sprintf(recvbuf,"PRIVMSG NickServ :IDENTIFY %s",password);
  75.             Send(recvbuf);
  76.             Recv(false);
  77.             reply=GetReply();
  78.         }
  79.         if(channel)
  80.         {
  81.             while(reply!=375) reply=GetReply();
  82.             sprintf(recvbuf,"JOIN %s",channel);
  83.             Send(recvbuf);
  84.             reply=GetReply();
  85.         }
  86.         Send("PRIVMSG NickServ :SET UNFILTERED ON");
  87.         receiving=0;
  88.         Recv(false);
  89.         channel_=channel;
  90.         nick_=nick;
  91.         user_=user;
  92.         password_=password;
  93.         server_=server;
  94.     }
  95.     void Send(const char *message,SOCKET s=NULL)
  96.     {
  97.         int result;
  98.         if(s==NULL) s=sock;
  99.         if(s==sock && !operational) throw "Send on unoperational connection";
  100.         if(s)
  101.         {
  102.             sprintf(sendbuf,"%s\n",message);
  103.             if(s==sock)
  104.             {
  105.                 if((result=send(s,sendbuf,strlen(sendbuf),0))==SOCKET_ERROR || result==0)
  106.                 {
  107.                     sock=NULL;
  108.                     receiving=0;
  109.                     *recvbuf=*sendbuf='\0';
  110.                     printf("%s was disconnected: %s\n",mynick,message);
  111.                     fflush(stdout);
  112.                 }
  113.                 else
  114.                     printf("%s: %s\n",mynick,message),fflush(stdout);
  115.             }
  116.             else
  117.             {
  118.                 send(s,sendbuf,strlen(sendbuf),0);
  119.                 printf("(2) %s: %s\n",mynick,message),fflush(stdout);
  120.             }
  121.         }
  122.         else
  123.         {
  124.             operational=false;
  125.             throw "Send without a connection";
  126.         }
  127.     }
  128.     int GetReply()
  129.     {
  130. begin:
  131.         char *str=(char*)Recv(true);
  132.         char *pStr;
  133.         if(str && *str==':') str=strchr(str,' ')+1;
  134.         if(str==NULL) return -1;
  135.         for(pStr=str;*pStr;++pStr)
  136.             *pStr=tolower(*pStr);
  137.         if(strstr(str,"ping ")==str && *mynick)
  138.         {
  139.             str+=5;
  140.             if(!*str || !*(str-1))
  141.             {
  142.                 sprintf(sendbuf,"PONG %s",mynick);
  143.                 Send(sendbuf);
  144.             }
  145.             else
  146.             {
  147.                 sprintf(sendbuf,"PONG %s %s",mynick,str);
  148.                 Send(sendbuf);
  149.             }
  150.             goto begin;
  151.         }
  152.         pStr=strchr(str,' ');
  153.         if(pStr && strstr(pStr,"kick ")==pStr && strstr(pStr+5,mynick)==pStr+5)
  154.         {
  155.             closesocket(sock);
  156.             sock=NULL;
  157.             IrcConnectTo(server_,user_,nick_,password_,channel_);
  158.             return 0;
  159.         }
  160.         if(*str<'0' || *str>'9')
  161.             return -1;
  162.         return atoi(str);
  163.     }
  164.     const char *Recv(bool wait,SOCKET s=NULL)
  165.     {
  166.         if(s==NULL) s=sock;
  167.         if(s==sock && !operational) return NULL;
  168.         if(!s) return NULL;
  169.         if(!wait)
  170.         {
  171.             fd_set fds;
  172.             timeval tv={0,0};
  173.             FD_ZERO(&fds);
  174.             FD_SET(s,&fds);
  175.             select(s+1,&fds,NULL,NULL,&tv);
  176.             if(!FD_ISSET(s,&fds))
  177.                 return NULL;
  178.         }
  179.         char ch;
  180.         char *buf=(s==sock?recvbuf:recvbuf2);
  181.         int result;
  182.         int *receivingvar=(s==sock?&receiving:&receiving2);
  183.         while(true) // Not really
  184.         {
  185.             if(s!=sock)
  186.             {
  187.                 fd_set fds;
  188.                 timeval tv={0,0};
  189.                 FD_ZERO(&fds);
  190.                 FD_SET(s,&fds);
  191.                 select(s+1,&fds,NULL,NULL,&tv);
  192.                 if(!FD_ISSET(s,&fds))
  193.                 {
  194.                     buf[(*receivingvar)++]='\0';
  195.                     break;
  196.                 }
  197.             }
  198.             if((result=recv(s,&ch,1,0))==SOCKET_ERROR || result==0)
  199.             {
  200.                 if(s==sock)
  201.                 {
  202.                     Send("QUIT :Socket error");
  203.                     sock=NULL;
  204.                 }
  205.                 return NULL;
  206.             }
  207.             if(s!=sock && ch=='\x1B')
  208.             {
  209.                 while(ch!='m' && ch!='\r' && ch!='\n')
  210.                 {
  211.                     if((result=recv(s,&ch,1,0))==SOCKET_ERROR || result==0)
  212.                     {
  213.                         if(s==sock)
  214.                         {
  215.                             Send("QUIT :Socket error");
  216.                             sock=NULL;
  217.                         }
  218.                         return NULL;
  219.                     }
  220.                 }
  221.                 if(ch=='m')
  222.                 {
  223.                     if((result=recv(s,&ch,1,0))==SOCKET_ERROR || result==0)
  224.                     {
  225.                         if(s==sock)
  226.                         {
  227.                             Send("QUIT :Socket error");
  228.                             sock=NULL;
  229.                         }
  230.                         return NULL;
  231.                     }
  232.                 }
  233.             }
  234.             if(ch=='\r' || ch=='\0')
  235.                 ;
  236.             else if(ch=='\n')
  237.             {
  238.                 buf[(*receivingvar)++]='\0';
  239.                 break;
  240.             }
  241.             else
  242.                 buf[(*receivingvar)++]=ch;
  243.         }
  244.         *receivingvar=0;
  245.         if(!*buf)
  246.             return NULL;
  247.         printf("(R%s) %s: %s\n",(s==sock?"":"2"),mynick,buf);
  248.         fflush(stdout);
  249.         return buf;
  250.     }
  251.     ~IrcConnection()
  252.     {
  253.         if(sock)
  254.         {
  255.             Send("QUIT :IRC bot shutting down");
  256.             closesocket(sock);
  257.             sock=NULL;
  258.         }
  259.     }
  260.     bool IsConnected() {return (sock!=NULL);}
  261.     SOCKET GetSocket() {return sock;}
  262. };
  263.  
  264. class IrcUserBot : public IrcConnection
  265. {
  266.     char nick[64];
  267.     char password[64];
  268.     char sendbuf[4096];
  269.     char recvbuf[4096];
  270.     SOCKET connected_to;
  271.     char bound_to[256];
  272.     static int cur_number;
  273.     int nSentMessage;
  274.     bool being_stupid;
  275. public:
  276.     IrcUserBot() {*nick=*password=*bound_to=*sendbuf=*recvbuf='\0';connected_to=NULL;nSentMessage=0;being_stupid=false;}
  277.     void Construct()
  278.     {
  279.         *sendbuf=*recvbuf=*bound_to='\0';connected_to=NULL;
  280.         if(cur_number>=NNICKS)
  281.         {
  282.             sprintf(nick,"%s%i",BOTPREFIX,cur_number);
  283.             sprintf(password,"%s%i",PASSPREFIX,cur_number);
  284.             IrcConnectTo(SERVER,nick,nick,password,CHANNEL);
  285.         }
  286.         else
  287.         {
  288.             strcpy(nick,Nicks[cur_number]);
  289.             sprintf(password,"%s%i",PASSPREFIX,cur_number);
  290.             IrcConnectTo(SERVER,nick,nick,password,CHANNEL);
  291.         }
  292.         ++cur_number;
  293.         nSentMessage=0;
  294.     }
  295.     void DebugMessage(const char *message)
  296.     {
  297.         sprintf(sendbuf,"PRIVMSG %s :%s",CHANNEL,message);
  298.         Send(sendbuf);
  299.     }
  300.     void CheckBot()
  301.     {
  302.         char *str; // str is the complete message
  303.         char *pStr; // pStr is the message not including the source.
  304.         char *pUserFrom;
  305.         char *pUserTo;
  306.         char *pMessage;
  307.         if(!IsConnected()) IrcConnectTo(SERVER,nick,nick,password,CHANNEL);
  308.         if(!(str=(char*)Recv(false)))
  309.             return;
  310.         pStr=strchr(str,' ');
  311.         if(pStr && strstr(pStr,"404 ")==pStr)
  312.         {
  313.             closesocket(GetSocket());
  314.             if(cur_number>=NNICKS)
  315.             {
  316.                 sprintf(nick,"%s%i",BOTPREFIX,cur_number);
  317.                 sprintf(password,"%s%i",PASSPREFIX,cur_number);
  318.                 IrcConnectTo(SERVER,nick,nick,password,CHANNEL);
  319.             }
  320.             else
  321.             {
  322.                 strcpy(nick,Nicks[cur_number]);
  323.                 sprintf(password,"pass%i",PASSPREFIX,cur_number);
  324.                 IrcConnectTo(SERVER,nick,nick,password,CHANNEL);
  325.             }
  326.             cur_number++;
  327.             return;
  328.         }
  329.         {
  330.             char *p;
  331.             for(p=pStr;*p && *p!=' ';++p)
  332.                 *p=tolower(*p);
  333.         }
  334.         if(pStr && strstr(pStr,"kick ")==pStr && strstr(pStr+5,mynick)==pStr+5)
  335.         {
  336.             closesocket(GetSocket());
  337.             IrcConnectTo(server_,user_,nick_,password_,channel_);
  338.             return;
  339.         }
  340.         if((pStr && strstr(pStr,"ping")==pStr) || strstr(str,"ping")==str)
  341.         {
  342.             if(!pStr)
  343.             {
  344.                 sprintf(sendbuf,"PONG %s",nick);
  345.                 Send(sendbuf);
  346.                 return;
  347.             }
  348.             pUserFrom=pStr+1;
  349.             if(strchr(pUserFrom,' '))
  350.                 *strchr(pUserFrom,' ')='\0';
  351.             sprintf(sendbuf,"PONG %s %s",nick,pUserFrom);
  352.             Send(sendbuf);
  353.             return;
  354.         }
  355.         pStr=strchr(str,' ');
  356.         {
  357.             char *p;
  358.             for(p=pStr+1;*p && *p!=' ';++p)
  359.                 *p=tolower(*p);
  360.         }
  361.         if(!pStr || (strstr(pStr+1,"privmsg")!=pStr+1)) return;
  362.         char *pCommand=pStr+1;
  363.         ++pStr;
  364.         if(*str!=':') return;
  365.         pUserFrom=str+1;
  366.         *pStr='\0';
  367.         pUserTo=strchr(pStr+1,' ')+1;
  368.         if(pUserTo-1==NULL) return;
  369.         pStr=strchr(pUserTo,' ');
  370.         if(!pStr) return;
  371.         else (*pStr='\0'),(pMessage=pStr+1);
  372.         if(*pMessage==':') ++pMessage;
  373.         pStr=strchr(pUserFrom,'!');
  374.         if(pStr) *pStr='\0';
  375.  
  376.         if((pMessage[1]=='j' || pMessage[1]=='J'
  377.             || pMessage[1]=='p' || pMessage[1]=='P' || pMessage[1]=='?') && *pMessage=='!' && pMessage[2]==' ')
  378.         {
  379.             if(strcmp(pUserFrom,BOTMASTER))
  380.             {
  381.                 sprintf(sendbuf,"PRIVMSG %s :Only %s can make me join or part channels or be stupid",(*pUserTo=='#'?pUserTo:pUserFrom),BOTMASTER);
  382.                 Send(sendbuf);
  383.             }
  384.             else if(pMessage[1]=='?')
  385.             {
  386.                 being_stupid=!being_stupid;
  387.                 sprintf(sendbuf,"PRIVMSG %s :being_stupid is now %s",BOTMASTER,(being_stupid?"true":"false"));
  388.                 Send(sendbuf);
  389.             }
  390.             else if(pMessage[1]=='j' || pMessage[1]=='J')
  391.             {
  392.                 sprintf(sendbuf,"JOIN %s",pMessage+3);
  393.                 Send(sendbuf);
  394.             }
  395.             else //it must be p or P
  396.             {
  397.                 sprintf(sendbuf,"PART %s",pMessage+3);
  398.                 Send(sendbuf);
  399.             }
  400.         }
  401.         else if((pMessage[1]=='R' || pMessage[1]=='r') && *pMessage=='!' && pMessage[2]==' ')
  402.         {
  403.             if(strcmp(pUserFrom,BOTMASTER))
  404.             {
  405.                 sprintf(sendbuf,"PRIVMSG %s :Only %s can use !r",(*pUserTo=='#'?pUserTo:pUserFrom),BOTMASTER);
  406.                 Send(sendbuf);
  407.             }
  408.             else
  409.             {
  410.                 Send(pMessage+3);
  411.             }
  412.         }
  413.         else if((pMessage[1]=='m' || pMessage[1]=='M') && pMessage[0]=='!' && pMessage[2]==' ')
  414.         {
  415.             char *pSpace=strchr(pMessage+3,' ');
  416.             if(pSpace==NULL)
  417.                 return;
  418.             pMessage+=3;
  419.             *pSpace++='\0';
  420.             if(*pMessage=='#' && strcmp(pMessage,CHANNEL))
  421.             {
  422.                 sprintf(sendbuf,"JOIN %s",pMessage);
  423.                 Send(sendbuf);
  424.             }
  425.             if(!strcmpi(pMessage,mynick))
  426.             {
  427.                 sprintf(sendbuf,"PRIVMSG %s :%s has attempted to crash me. I will now either crash or be kicked off for excess flood. LOL.",CHANNEL,pUserFrom);
  428.                 Send(sendbuf);
  429.             }
  430.             sprintf(sendbuf,"PRIVMSG %s :%s",pMessage,pSpace);
  431.             Send(sendbuf);
  432.             if(*pMessage=='#' && strcmp(pMessage,CHANNEL))
  433.             {
  434.                 sprintf(sendbuf,"PART %s",pMessage);
  435.                 Send(sendbuf);
  436.             }
  437.         }
  438.         else if((pMessage[1]=='t' || pMessage[1]=='T') && pMessage[0]=='!' && pMessage[2]==' ')
  439.         {
  440.             char *pSpace=strchr(pMessage+3,' ');
  441.             if(pSpace==NULL)
  442.                 return;
  443.             pMessage+=3;
  444.             *pSpace++='\0';
  445.             if(*pMessage=='#' && strcmp(pMessage,CHANNEL))
  446.             {
  447.                 sprintf(sendbuf,"JOIN %s",pMessage);
  448.                 Send(sendbuf);
  449.             }
  450.             if(strcmpi(pMessage,mynick))
  451.             {
  452.                 sprintf(sendbuf,"PRIVMSG %s :%s",pMessage,pSpace);
  453.                 Send(sendbuf);
  454.             }
  455.         }
  456.         else if(*pMessage=='\001')
  457.         {
  458.             if(pMessage[1]=='P' && pMessage[2]=='I' && pMessage[3]=='N' && pMessage[4]=='G')
  459.             {
  460.                 sprintf(sendbuf,"PRIVMSG %s :\001PING 1123\001",pUserFrom);
  461.                 Send(sendbuf);
  462.                 sprintf(sendbuf,"PRIVMSG %s :\001VERSION\001",pUserFrom);
  463.                 Send(sendbuf);
  464.                 sprintf(sendbuf,"NOTICE %s :%s",pUserFrom,pMessage);
  465.                 Send(sendbuf);
  466.             }
  467.             else if(pMessage[1]=='V' && pMessage[2]=='E' && pMessage[3]=='R' && pMessage[4]=='S')
  468.             {
  469.                 sprintf(sendbuf,"NOTICE %s :\001VERSION None of your business!\001",pUserFrom);
  470.                 Send(sendbuf);
  471.             }
  472.         }
  473.         else if(pMessage[1]=='!' && pMessage[0]=='!' && pMessage[2]==' ')
  474.         {
  475.             if(!strcmpi(pMessage+3,mynick))
  476.             {
  477.                 sprintf(sendbuf,"PRIVMSG %s :%s has attempted to crash me. I will now either crash or be kicked off for excess flood. LOL.",CHANNEL,pUserFrom);
  478.                 Send(sendbuf);
  479.                 sprintf(sendbuf,"PRIVMSG %s :Sending endless string of pings to myself...",CHANNEL);
  480.                 Send(sendbuf);
  481.                 sprintf(sendbuf,"PRIVMSG %s :\001PING 1123\001",mynick);
  482.                 Send(sendbuf);
  483.             }
  484.             else
  485.             {
  486.                 sprintf(sendbuf,"PRIVMSG %s :%s",pMessage+3,pMessage);
  487.                 Send(sendbuf);
  488.             }
  489.         }
  490.         else if(isdigit(pMessage[1]) && pMessage[0]=='!' && pMessage[2]==' ')
  491.         {
  492.             if(*(pMessage+3))
  493.             {
  494.                 pUserTo=pMessage+3;
  495.                 if(strcmp(pUserTo,CHANNEL))
  496.                 {
  497.                     sprintf(sendbuf,"JOIN %s",pUserTo);
  498.                     Send(sendbuf);
  499.                 }
  500.             }
  501.             Send("NICK SpammingBot");
  502.             for(int k=0;k<pMessage[1]-'0';k++)
  503.             {
  504.                 try
  505.                 {
  506.                     if(GetSocket()==NULL)
  507.                         break;
  508.                     sprintf(sendbuf,"PRIVMSG %s :spamming. Buy my iPod!",pUserTo);
  509.                     Send(sendbuf);
  510.                     sprintf(sendbuf,"PRIVMSG %s :spamming. Buy my iPhone!",pUserTo);
  511.                     Send(sendbuf);
  512.                     sprintf(sendbuf,"PRIVMSG %s :spamming. Get the latest offer on all chocolate bar accessories!",pUserTo);
  513.                     Send(sendbuf);
  514.                     sprintf(sendbuf,"PRIVMSG %s :spamming. All the latest travel insurance stuff and nonsense!",pUserTo);
  515.                     Send(sendbuf);
  516.                     sprintf(sendbuf,"PRIVMSG %s :spamming. Go to #arianne!!",pUserTo);
  517.                     Send(sendbuf);
  518.                 } catch(...) {break;}
  519.             }
  520.             sprintf(sendbuf,"NICK %s",mynick);
  521.             Send(sendbuf);
  522.             if(*(pMessage+3) && strcmp(pUserTo,CHANNEL))
  523.             {
  524.                 sprintf(sendbuf,"JOIN %s",pUserTo);
  525.                 Send(sendbuf);
  526.             }
  527.         }
  528.         else if((pMessage[1]=='c' || pMessage[1]=='C') && pMessage[0]=='!' && pMessage[2]==' ')
  529.         {
  530.             if(*pUserTo!='#')
  531.                 pUserTo=pUserFrom;
  532.  
  533.             char *tok=strtok(pMessage," ");
  534.             int sugars=0;
  535.             int milk=1;
  536.             int type=0;
  537.             int size=4;
  538.             char *drink="coffee";
  539.             bool magnetic=false;
  540.             bool decaf=false;
  541.             char *other_milk="";
  542.             char *other_size="";
  543.             char *target=pUserFrom;
  544.             char message[1024]="";
  545. #define MILK_COLD 1
  546. #define MILK_GOAT 5
  547. #define MILK_HOT 3
  548. #define MILK_NONE 0
  549. #define MILK_FROTHED 2
  550. #define MILK_OTHER -1
  551. #define TYPE_NORMAL 0
  552. #define TYPE_ESPRESSO 1
  553. #define TYPE_TURKISH 2
  554. #define TYPE_ICED 3
  555.             tok=strtok(NULL," ");
  556.             while(tok)
  557.             {
  558.                 if(*tok!='-')
  559.                 {
  560.                     strcat(message," ");
  561.                     strcat(message,tok);
  562.                     tok=strtok(NULL," ");
  563.                     continue;
  564.                 }
  565.                 tok++;
  566.                 switch(*tok)
  567.                 {
  568.                 case 'e':type=TYPE_ESPRESSO;break;
  569.                 case 'T':type=TYPE_TURKISH;break;
  570.                 case 'i':type=TYPE_ICED;break;
  571.                 case 'm':
  572.                     {
  573.                         char *p;
  574.                         for(p=tok;*p;++p)
  575.                             *p=tolower(*p);
  576.                     }
  577.                     tok++;
  578.                     if(!strcmp(tok,"hot"))
  579.                         milk=MILK_HOT;
  580.                     else if(!strcmp(tok,"cold"))
  581.                         milk=MILK_COLD;
  582.                     else if(!strcmp(tok,"none"))
  583.                         milk=MILK_NONE;
  584.                     else if(!strcmp(tok,"frth"))
  585.                         milk=MILK_FROTHED;
  586.                     else if(!strcmp(tok,"goat"))
  587.                         milk=MILK_GOAT;
  588.                     else if(!strcmp(tok,"agnet") || !strcmp(tok,"agnetic") || !strcmp(tok,"chocolate"))
  589.                         magnetic=true;
  590.                     else
  591.                     {
  592.                         milk=MILK_OTHER;
  593.                         other_milk=tok;
  594.                         for(char *pStr=other_milk;*pStr;pStr++)
  595.                             if(*pStr=='_') *pStr=' ';
  596.                     }
  597.                     break;
  598.                 case 's':
  599.                     tok++;
  600.                     sugars=atoi(tok);
  601.                     break;
  602.                 case 'M':
  603.                     drink="message";
  604.                     size=-1;
  605.                     other_size="bottle";
  606.                     milk=MILK_NONE;
  607.                     break;
  608.                 case 'z':
  609.                 case 'S':
  610.                     tok++;
  611.                     if(*tok<'0' || *tok>'9')
  612.                     {
  613.                         size=-1;
  614.                         other_size=tok;
  615.                         for(char *pStr=other_size;*pStr;pStr++)
  616.                             if(*pStr=='_') *pStr=' ';
  617.                     }
  618.                     else
  619.                         size=atoi(tok);
  620.                     break;
  621.                 case '-':
  622.                     tok++;
  623.                     if(strstr(tok,"other=")==tok)
  624.                     {
  625.                         tok+=6;
  626.                         drink=tok;
  627.                         for(char *pStr=drink;*pStr;pStr++)
  628.                             if(*pStr=='_') *pStr=' ';
  629.                     }
  630.                     else if(strstr(tok,"target=")==tok)
  631.                     {
  632.                         tok+=7;
  633.                         target=tok;
  634.                     }
  635.                     else if(!strcmp(tok,"help"))
  636.                     {
  637.                         sprintf(sendbuf,"PRIVMSG %s :Usage: !c [--target={NICK|CHANNEL}] [-T] [-d] [-e] [--other=DRINKTYPE] [-mMILKTYPE] [-sNUMBER_OF_SUGARS] [-zSIZE]",pUserTo);Send(sendbuf);
  638.                         sprintf(sendbuf,"PRIVMSG %s :-T: Turkish coffee    -d: Decaf coffee      -e: Espresso coffee",pUserTo);Send(sendbuf);
  639.                         sprintf(sendbuf,"PRIVMSG %s :--other=DRINKTYPE: Make a non-coffee drink",pUserTo);Send(sendbuf);
  640.                         sprintf(sendbuf,"PRIVMSG %s :-mMILKTYPE  milktype can be none, hot, cold, frth, agnet, agnetic, or chocolate or a user defined string",pUserTo);Send(sendbuf);
  641.                         sprintf(sendbuf,"PRIVMSG %s :-zSIZE size can be 1, 2, 3, 4, 5, 6, or a user defined string",pUserTo);Send(sendbuf);
  642.                         sprintf(sendbuf,"PRIVMSG %s :--target={NICK|CHANNEL}   Give the coffee to the specified nick/channel",pUserTo);Send(sendbuf);
  643.                         sprintf(sendbuf,"PRIVMSG %s :-sNUMBER_OF_SUGARS   Give a negative value for an infinite number",pUserTo);Send(sendbuf);
  644.                         Sleep(5000);
  645.                         sprintf(sendbuf,"PRIVMSG %s :Usage: !t NICK|CHANNEL MESSAGE",pUserTo);Send(sendbuf);
  646.                         sprintf(sendbuf,"PRIVMSG %s :Send the specified MESSAGE to the specified NICK or CHANNEL (if a channel, the bot must be in that channel)",pUserTo);Send(sendbuf);
  647.                         return;
  648.                     }
  649.                     break;
  650.                 case 'd':decaf=true;break;
  651.                 }
  652.                 tok=strtok(NULL," ");
  653.             }
  654.             char coffeebuf[2048];
  655.             sprintf(coffeebuf,"a%s%s %s",(decaf?" decaf":""),(type==TYPE_ESPRESSO?" espresso":(type==TYPE_TURKISH?" Turkish":(type==TYPE_ICED?" iced":""))),drink);
  656.             char buf2[256];
  657.             if(sugars>0)
  658.                 sprintf(buf2," with %i sugars",sugars);
  659.             else if(sugars<0)
  660.                 strcpy(buf2," with an infinite number of sugars");
  661.             else
  662.                 *buf2='\0';
  663.             strcat(coffeebuf,buf2);
  664.             strcat(coffeebuf," ");
  665.             switch(size)
  666.             {
  667.             case 1:strcpy(buf2,"in a thimble");break;
  668.             case 2:strcpy(buf2,"in an espresso cup");break;
  669.             case 3:strcpy(buf2,"in a cafe-style coffee cup");break;
  670.             case 4:strcpy(buf2,"in an office mug");break;
  671.             case 5:strcpy(buf2,"in a sysadmin mug");break;
  672.             case 6:strcpy(buf2,"in a bucket");break;
  673.             case -1:sprintf(buf2,"in a %s",other_size);break;
  674.             default:sprintf(buf2,"in an container of size %i",size);
  675.             }
  676.             strcat(coffeebuf,buf2);
  677.             switch(milk)
  678.             {
  679.             case MILK_GOAT:strcpy(buf2," with a goat in it");break;
  680.             case MILK_COLD:strcpy(buf2," with cold milk");break;
  681.             case MILK_HOT:strcpy(buf2," with hot milk");break;
  682.             case MILK_NONE:strcpy(buf2," with no milk");break;
  683.             case MILK_FROTHED:strcpy(buf2," with frothed milk");break;
  684.             case MILK_OTHER:sprintf(buf2," with %s milk",other_milk);break;
  685.             default:sprintf(buf2," with a milk value of %i",milk);
  686.             }
  687.             strcat(coffeebuf,buf2);
  688.             if(*message)
  689.             {
  690.                 sprintf(buf2," %s",message);
  691.                 strcat(coffeebuf,buf2);
  692.             }
  693.             if(*target=='#')
  694.             {
  695.                 if(strcmp(target,CHANNEL))
  696.                 {
  697.                     sprintf(sendbuf,"JOIN %s",target);
  698.                     Send(sendbuf);
  699.                 }
  700.                 sprintf(sendbuf,"PRIVMSG %s :\001ACTION is making %s for this channel\001",target,coffeebuf);
  701.                 Send(sendbuf);
  702.             }
  703.             else if(strcmp(pUserFrom,target))
  704.             {
  705.                 sprintf(sendbuf,"PRIVMSG %s :\001ACTION is making %s for you\001",target,coffeebuf);
  706.                 Send(sendbuf);
  707.             }
  708.             sprintf(sendbuf,"PRIVMSG %s :\001ACTION is making %s for %s\001",pUserTo,coffeebuf,target);
  709.             Send(sendbuf);
  710. #ifdef REPORT_TO_CHANNEL
  711.             if(strcmp(pUserTo,CHANNEL))
  712.             {
  713.                 sprintf(sendbuf,"PRIVMSG %s :\001ACTION is making %s for %s\001",CHANNEL,coffeebuf,target);
  714.                 Send(sendbuf);
  715.             }
  716. #endif
  717.             if(milk>0 && milk<6)
  718.                 Sleep(milk*1000);
  719.             if(magnetic)
  720.             {
  721.                 sprintf(sendbuf,"PRIVMSG %s :\001ACTION spills %s's coffee into a Magnetic Laser Device\001",pUserTo,target);
  722.                 Send(sendbuf);
  723.                 if(*target=='#')
  724.                 {
  725.                     sprintf(sendbuf,"PRIVMSG %s :\001ACTION spills the channel's coffee into a Magnetic Laser Device\001",target,coffeebuf);
  726.                     Send(sendbuf);
  727.                 }
  728.                 else if(strcmp(pUserFrom,target))
  729.                 {
  730.                     sprintf(sendbuf,"PRIVMSG %s :\001ACTION spills your coffee into a Magnetic Laser Device\001",target);
  731.                     Send(sendbuf);
  732.                 }
  733. #ifdef REPORT_TO_CHANNEL
  734.                 if(strcmp(pUserTo,CHANNEL))
  735.                 {
  736.                     sprintf(sendbuf,"PRIVMSG %s :\001ACTION spills %s's coffee into a Magnetic Laser Device\001",CHANNEL,target);
  737.                     Send(sendbuf);
  738.                 }
  739. #endif
  740.                 char buffer[2048];
  741.                 strcpy(buffer,coffeebuf+2);
  742.                 sprintf(coffeebuf,"a magnetic %s which is emitting lots of blue light and a barely audible hum",buffer);
  743.             }
  744.             sprintf(sendbuf,"PRIVMSG %s :\001ACTION gives %s %s\001",pUserTo,target,coffeebuf);
  745.             Send(sendbuf);
  746.             if(*target=='#')
  747.             {
  748.                 sprintf(sendbuf,"PRIVMSG %s :\001ACTION gives everyone in this channel %s\001",target,coffeebuf);
  749.                 Send(sendbuf);
  750.                 if(strcmp(target,CHANNEL))
  751.                 {
  752.                     sprintf(sendbuf,"PART %s",target);
  753.                     Send(sendbuf);
  754.                 }
  755.             }
  756.             else if(strcmp(pUserFrom,target))
  757.             {
  758.                 sprintf(sendbuf,"PRIVMSG %s :\001ACTION gives you %s\001",target,coffeebuf);
  759.                 Send(sendbuf);
  760.             }
  761. #ifdef REPORT_TO_CHANNEL
  762.             if(strcmp(pUserTo,CHANNEL))
  763.             {
  764.                 sprintf(sendbuf,"PRIVMSG %s :\001ACTION gives %s %s\001",CHANNEL,target,coffeebuf);
  765.                 Send(sendbuf);
  766.             }
  767. #endif
  768.         }
  769.         else
  770.         {
  771.             if((*pMessage!='!' || pMessage[2]!=' ') && *pMessage!='\001')
  772.             {
  773.                 //if(*pUserTo=='#' && strcmp(pUserTo,CHANNEL))
  774.                 //{
  775.                     //sprintf(sendbuf,"PRIVMSG %s :%s: <%s> %s",CHANNEL,pUserTo,pUserFrom,pMessage);
  776.                     //Send(sendbuf);
  777.                 //}
  778.                 return;
  779.             }
  780.             if(being_stupid)
  781.             {
  782.                 char *target=(*pUserTo=='#'?pUserTo:pUserFrom);
  783.                 sprintf(sendbuf,"PRIVMSG %s :%s",target,pMessage);
  784.             }
  785.         }
  786.     }
  787.     bool IsBound() {return (connected_to!=NULL);}
  788.     ~IrcUserBot()
  789.     {
  790.         if(connected_to)
  791.         {
  792.             sprintf(sendbuf,"QUIT :IRC bot shutting down",CHANNEL);
  793.             Send(sendbuf);
  794.             closesocket(connected_to);
  795.         }
  796.     }
  797. };
  798.  
  799. extern IrcUserBot bots[NBOTS];
  800. extern IrcConnection botmain;
  801.  
  802. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement