IrcBot - SchulProjekt



  • hi,
    ich habe jetzt in meiner schule 2 Jahre c++ gelernt und muss nun bis nächstes jahr eine abschlussarbeit schreiben ich wollte einen IrcBot programmieren doch habe ich noch keine ahnung wie ich anfangen soll .
    Hat einer ein paar links über IrcBots wie man ins irc connectet unter windows etc??

    Danke



  • wenn ich ircbot höre .. denke ich eher an einen bot der in einem channel status verteilt .. oder user über ihn informationen erhalten bzw abrufen können .. denke nicht das du das meinst aber was meinst du jetzt?



  • genau das meine ich 😉 halt sowas wie WinDrop nur nicht so ausgereift mit sovielen funktionen.



  • nicht mit standard C++ zu lösen.
    thread verschoben ins rund um die programmierung forum. Rund um die Programmierung



  • wie kann ich das dann lösen?



  • Zuerst solltest du dich über Netzwerkprogrammierung schlau machen.
    Dann kannst du anfangen dich mit dem IRC-Protokoll auseinanderzusetzen: http://www.irchelp.org/irchelp/rfc/



  • wenns ums conecten geht.. bitte:

    cmIRC.cpp :

    // cmIRC.cpp : Defines the entry point for the DLL application.
    //
    #define CM_IRC_DLL
    #include <winsock2.h>
    #include "cmIRC.h"
    #include <vector>
    #include <process.h>
    
    using namespace std;
    
    cmMSGPROC lCallback = NULL;
    SOCKET s;
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
                         )
    {
        return TRUE;
    }
    
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr)
    {
      long rc;
      unsigned long ip;
      HOSTENT* he;
    
      /* Parameter prüfen */
      if(hostnameOrIp==NULL || addr==NULL)
        return SOCKET_ERROR;
    
      /* eine IP in hostnameOrIp ? */
      ip=inet_addr(hostnameOrIp);
    
      /* bei einem fehler liefert inet_addr den Rückgabewert INADDR_NONE */
      if(ip!=INADDR_NONE)
      {
        addr->sin_addr.s_addr=ip;
        return 0;
      }
      else
      {
        /* Hostname in hostnameOrIp auflösen */
        he=gethostbyname(hostnameOrIp);
        if(he==NULL)
        {
          return SOCKET_ERROR;
        }
        else
        {
          /*die 4 Bytes der IP von he nach addr kopieren */
          memcpy(&(addr->sin_addr),he->h_addr_list[0],4);
        }
        return 0;
    
      }
    }
    
    unsigned int __stdcall RecThread(LPVOID)
    {
    char buf[256];
    string rec_str;
    long rc=0;
      while(rc!=SOCKET_ERROR)
      {
        rc=recv(s,buf,256,0);
        buf[rc]='\0';
        rec_str = buf;
        int ip = rec_str.find("PING");
        if(ip != -1)
        {
            string pong = rec_str.substr(ip,rec_str.size());
            char buf1[512];
            sprintf(buf1,"PONG %s\r\n",pong.c_str());
            send(s,buf1,strlen(buf),0);
        }
    
        char *token;
        char seps[]   = "\r\n";
        token = strtok( buf, seps );
        while( token != NULL )
        {
          lCallback(token);
          token = strtok( NULL, seps );
        }
    
      }
    return 0;
    }
    
    BOOL  cmIRCConnect(char *s_server, int i_port, char* username, char *nickname, cmMSGPROC lpCallback)
    {
    lCallback = lpCallback;
      long rc;
      SOCKADDR_IN addr;
      char buf[256];
    
      rc=startWinsock();
      if(rc!=0)
      {
        return FALSE;
      }
    
      // Socket erstellen
      s=socket(AF_INET,SOCK_STREAM,0);
      if(s==INVALID_SOCKET)
      {
        return FALSE;
      }
    
      // Verbinden
      memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
      addr.sin_family=AF_INET;
      addr.sin_port=htons(i_port);
      rc=getAddrFromString(s_server,&addr);
      if(rc==SOCKET_ERROR)
      {
        return FALSE;
      }
    
      rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
      if(rc==SOCKET_ERROR)
      {
        return FALSE;
      }
    
      char buf1[512];
      sprintf(buf1,"USER %s 0 0 :%s\r\n",username);
      int ret =send(s,buf1,strlen(buf1),0);
      char buf2[512];
      sprintf(buf2,"NICK %s\r\n",nickname);
      ret = send(s,buf2,strlen(buf2),0);
    
      _beginthreadex(NULL,0,RecThread,NULL,0,NULL);
    }
    
    BOOL cmIRCSend(char *msg)
    {
        int ret = send(s,msg,strlen(msg),0);
        return !(SOCKET_ERROR == ret);
    }
    
    BOOL cmIRCSendEx(char *msg_type, char *msg_to,char *msg)
    {
        char str[512];
        sprintf(str,"%s %s :%s\r\n",msg_type,msg_to,msg);
        int ret = send(s,str,strlen(str),0);
        return !(SOCKET_ERROR == ret);
    }
    
    void cmIRCGetNick(char *nick,char *SERVERmsg)
    {   
        string rec = SERVERmsg;
        int endnick = rec.find_first_of("!");
        string from_nick = rec.substr(1,endnick-1);
        strcpy(nick, from_nick.c_str());
    }
    
    void cmIRCGetMsg(char *message, char *SERVERmsg)
    {   
        string rec = SERVERmsg;
        int i = rec.find(":",2);
        string mes = rec.substr(i+1,rec.size()-i-1);
        strcpy(message, &SERVERmsg[i+1]);
    }
    

    example:

    #include "cmIRC.h" // cmIRC
    #include "iostream.h" // cout, cin
    #include <conio.h> // _cputs
    #include <stdio.h> // sprintf
    
    // Server - CALLBACK
    void CALLBACK recProc(char *msg)
    {
        _cputs("\n"); // neue Zeile
        _cputs(msg); // Empfangene Message in der Konsole ausgeben
        _cputs("\n"); // neue Zeile
            _cputs("\n"); // neue Zeile
        char tmp[512];
        cmIRCGetNick(tmp,msg);
        _cputs(tmp);
        _cputs(": "); // neue Zeile
        cmIRCGetMsg(tmp,msg);
        _cputs(tmp);
        _cputs("\n"); // neue Zeile
    }
    
    int main(int argc, char* argv[])
    {
    
    /*********** Init - Messages ****************/
    
        cout<<"********************************\n";
        cout<<"*    cmIRC sample by CMatt     *\n";
        cout<<"*          ++ 2002 ++          *\n";
        cout<<"********************************\n";
        cout<<"--------------------------------\n";
        cout<<"Type /help for Help.\n";
        cout<<"--------------------------------\n";
        cout<<"\n";
        cout<<"Verbinde mit Server...\n";
        cout<<"Username: ";
        char user[128];
        cin>>user; // Username einlesen
        cout<<"Nickname: ";
        char nick[128];
        cin>>nick; // Nickname einlesen
    
    /*********************************************/
    
        char server[] = "irc.chatspike.net"; // servername
        int port = 6667; // port
    
        if(cmIRCConnect(server,port,user,nick,&recProc)) // mit Server verbinden
        {
            cout<<"Mit Server verbunden!\n"; // Verbidung aufgebaut
            cout<<"Login...\r\n";
    
            /***** Konsoleneingaben verarbeiten *****/
    
            char comm[512];
            while(strcmp(comm,"/exit")!=0) // bei "/exit" beenden
            {
                cin>>comm; // Eingabe lesen
                if(strcmp(comm,"/help")==0) // "/help" - Commando
                {
                    cout<<"******************************\n";
                    cout<<"** cmIRC Sample - Commandos **\n";
                    cout<<"******************************\n";
                    cout<<"------------------------------\n";
                    cout<<"/exit = Programm beenden\n";
                    cout<<"/send = Sendet eine Message an den Server\n";
                    cout<<"------------------------------\n";
                }
                if(strcmp(comm,"/send")==0) // "/send" - Commando
                {
                    char msg[64];
                    char chan[64];
                    cin>>msg;
                    cin>>chan;
                    char send[128];
                    sprintf(send,"%s %s \r\n",msg,chan);
                    cmIRCSend(send); // an den Server senden
                    Sleep(300); // warten 
                    cmIRCSend(send); // zur sicherheit noch mal senden (Problem beim 1. JOIN...)
                }
    
            }
    
            /***************************************/
    
        }
        return 0;
    }
    

    könnte sein das einige funktionen in der cmIRC.cpp net richtig oder gar nicht funzen.. hab das Teil nie richtig fertig gemacht *g*.. aber cmIRCConnect und cmIRCSend funktionieren und mehr brauchst ja erst mal net 😉
    Damit solltest du erst mal ner Verbindung zu nem Server zustande bekommen und was senden/empfangen können. Was du dann an den server schicken musst findest du im Link DrGreenthumb.

    Viel glück 😉


Anmelden zum Antworten