Motivation bei Privatprojekten (Split aus Diamond of Death)



  • irc::session
    Enthält Daten zu aktuellen Verbindung - Nickname, Username, Realname, Channel

    irc::logger
    Verwaltet die Log-Datei, fügt Datum/Zeit-Strings und Server/Client Präfixe an.

    irc::config_manager
    Erstellt eine neue Config-Datei, wenn nicht vorhanden und bietet Zugriffsmethoden auf die einzelnen Einstellungen.

    irc::channel
    Enthält Daten über den Channel (User + Rechte, Chanmodes, Topic) und stellt Methoden zu dessen Verwaltung bereit.

    irc::plugin_manager
    Bietet Methoden zur Verwaltung von Plugins und zum Auslösen von Events.

    irc::plugin
    Stellt Methoden zur Kommunikation mit Plugins bereit.

    irc::message_parser
    Zerlegt Nachrichten in ihre Teile und macht daraus Events, die an den irc::plugin_manager weitergeleitet werden.

    So richtig, oder doch zu ungenau?

    Edit - Vergessene Klassen:

    irc::console
    Selbsterklärend nehme ich an. Stellt dem Benutzer die Befehle zur Verfügung.

    irc::listener
    Plugin-seitige Klasse, die auf Events reagieren kann.



  • Mache dir am besten auch einen Ablaufplan. Was passiert, wenn ein Client connected, oder jemand eine Nachricht schreibt, oder jemand einen Befehl absetzt etc.? Insbesondere welche Klassen sind wie und in welcher Reihenfolge beteiligt. Überlege auch die Ablaufpläne für deine User Stories.



  • otze schrieb:

    Schrittweise vorgehen: [...]

    So in der Art mache ichs auch. Ich weiß, dass mein aktuelles Projekt eine Weile (1-2 Jahre oder länger) dauern kann. Ich hab mir daher Meilensteine definiert, die sehr fein granular sind. Der erste ist z.B. nur, das Grundgerüst der Architektur (die ich mir vorher gut überlegt hab) zum Laufen zu kriegen, d.h. Programm startet, alle Komponenten werden einmal erzeugt und kurz "angetickt", und das Ding fährt sich wieder runter. Wenn das läuft, kommt schrittweise die Funktionalität in kleinen Happen.
    Was ich dabei beachten muss ist, mich zu beherrschen. Viele Funktionalität brauche ich noch garnicht, auch wenn es mich in den Fingern juckt, die "mal eben" zu schreiben. Was ich nicht brauche, ist eben später dran, und so komme ich einerseits relativ schnell zu den Ergebnissen, andererseits bin ich bei jedem Meilenstein gezwungen, einen Teil der nervigen Drecksarbeit zu machen, die man so gern auf später verschiebt und die einem normalerweise im "fast fertig"-Zustand den Tag vermiest, weil die ganzen Bonbons schon gelutscht sind und nurnoch Mist zu erledigen ist 😉
    Ich arbeite streng Testbasiert, d.h. ich schreibe den Header einer Klasse, dann erst die nötigen Tests, und dann die Implementierung, bis die Tests laufen. Die Implementierung soll dabei so einfach wie möglich bleiben, d.h. wenn es noch keine Situation gibt, in der der Client mit einem Server verbunden ist, dann liefert Client::isConnected() eben stumpf false zurück, statt irgendwelche komplexeren Abfragen zu starten.
    So gehts schrittweise voran - und ich hab noch nie so lange und gerne an einem Projekt gearbeitet wie an dem aktuellen 🙂



  • Ich zieh auf Arbeit ein Projekt alleine auf - seit ende 2008. Das Projekt mach immer noch Spaß, und es kommen immer mehr Features hinzu 🙂 Hätte das Projekt auch gerne daheim am PC, aber hier nützt es nichts ^^.



  • Use Case Config-Erstellung
    .) Sollte glaub ich selbsterklärend sein. irc::config_manager erstellt die Datei, wenn nicht vorhanden.

    Use Case Log-Start
    .) Ebenfalls selbsterklärend. irc::logger erstellt Logdatei.

    Use Case Auto-Connect
    .) Mit irc::config_manager werden die Verbindungsdaten geholt
    .) Eine neue irc::session wird erstellt

    Use Case Auto-Plugin-Load
    .) irc::plugin_manager lädt Plugins.

    Use Case Nachricht vom Server:
    .) irc::session liest Zeile
    .) irc::message_parser erzeugt Event aus der Zeile
    .) Ändert sich was Channel-spezifisches, wird irc::channel verwendet
    .) irc::plugin_manager schickt das Event an die Plugins

    Use Case Nachricht von Plugin:
    .) irc::plugin_manager benachrichtigt irc::message_parser
    .) irc::message_parser macht IRC Nachricht
    .) irc::session sendet die Nachricht

    Use Case Plugin-Shutdown:
    .) irc::plugin_manager stoppt Plugins

    Use Case Bot-Shutdown:
    .) irc::plugin_manager fährt Plugins herunter
    .) irc::session schließt Verbindung

    Use Case Console-Connect:
    .) irc::console liest Befehl ein
    .) irc::session wird erstellt und verbindet
    .) irc::plugin_manager startet Plugins

    Use Case Console-Disconnect:
    .) irc::console liest Befehl ein
    .) irc::plugin_manager stoppt Plugins
    .) irc::session schließt Verbindung

    Use Case Console-Plugin-Start:
    .) irc::console liest Befehl ein
    .) irc::plugin_manager startet Plugin

    Use Case Console-Plugin-Stop:
    .) irc::console liest den Befehl ein
    .) irc::plugin_manager stoppt Plugin

    Use Case User-Information:
    .) irc::console gibt Zeile samt Datum und Uhrzeit aus

    Use Case Logging:
    .) irc::logger schreibt Zeile samt Datum und Uhrzeit in Datei

    So? 🙂
    (Plugin API lass ich jetzt mal Weg, wichtig ist mal der Bot.)



  • Das ist alles zu ungenau, du vergisst jedesmal die Hälfte. Beispiel:

    314159265358979 schrieb:

    Use Case Auto-Connect
    .) Mit irc::config_manager werden die Verbindungsdaten geholt
    .) Eine neue irc::session wird erstellt

    Der config_manager kommt doch nicht einfach mal so auf die Idee, die Verbindungsdaten zu holen, genauso wenig wie session telepathisch davon erfährt und plötzlich meint, eine Verbindung aufbauen zu müssen.
    Also: Wer lässt den config_manager die Daten holen, an wen werden sie weiter gegeben, wer erstellt die Session, was passiert dann mit der Session?

    Das gleiche bei den anderen Use-Cases.



  • Ich weiß nicht so Recht, wie ich das beschreiben soll 😞

    So ein Konstrukt hab ich im Hinterkopf:

    int main(int argc, char** argv)
    {
        irc::config_manager conf("bot.conf");
    
        std::string host = conf.get<std::string>("host");
        uint16_t port = conf.get<utin16_t>("port");
    
        std::string nickname = conf.get<std::string>("nickname");
    
        irc::session session(host, port, nick);
    }
    

    Wie soll ich sowas beschreiben? 😞



  • Keine Ideen?



  • 314159265358979 schrieb:

    Keine Ideen?

    Irgendwie sagt man dir hier zum n-ten Mal wie das funktioniert und du verstehst es einfach nicht. Kauf dir ein Buch, google etwas oder beleg ein Fach.

    Blöd bist du ja nicht oder? 🤡



  • Du kannst mir nicht unterstellen, dass ich mir keine Mühe gebe. Ich bin gewillt, dieses Projekt fertigzustellen, aber ich habe eben noch nie ein Projekt auf diese Weise gemacht - da ist das doch nicht schlimm, wenn ich mal nicht weiß, was man tun soll.



  • Auch wenn ihr mir gesagt habt, ich soll noch nicht mit dem Coden anfangen, hab ichs nun doch getan. Warum? Ich brauche mal ein Erfolgserlebnis, um weitere Motivation zu bekommen 😃

    Ich habe nicht mit den großen Dingen angefangen, sondern mit denen, wo nicht allzu viele Designentscheidungen zu treffen waren. Hier mal ein Stückchen Test-Code meiner Klassen mit Log.

    #include "../include/socket.hpp"
    #include "../include/error.hpp"
    
    int main()
    {
    	using namespace paprikachu;
    
    	boost::asio::io_service ios;
    
    	irc::socket socket(ios, irc::resolve_host(ios, "www.google.at", "80"));
    	socket.write_line("GET /index.html HTTP/1.1");
    	socket.write_line("Connection: Close");
    	socket.write_line("Host: www.google.at");
    	socket.write_line("");
    
    	try
    	{
    		for(;;)
    			socket.read_line();
    	}
    
    	catch(irc::socket_error&)
    	{}
    
    	return 0;
    }
    

    logfile schrieb:

    [2011-Aug-30 02:58:40.052294] <Info> :: resolving host www.google.at:80 ...
    [2011-Aug-30 02:58:40.478771] <Info> :: host www.google.at:80 resolved
    [2011-Aug-30 02:58:40.478844] <Info> :: found endpoint for www.google.at:80 - 209.85.148.147
    [2011-Aug-30 02:58:40.478863] <Info> :: found endpoint for www.google.at:80 - 209.85.148.105
    [2011-Aug-30 02:58:40.478879] <Info> :: found endpoint for www.google.at:80 - 209.85.148.106
    [2011-Aug-30 02:58:40.478895] <Info> :: found endpoint for www.google.at:80 - 209.85.148.104
    [2011-Aug-30 02:58:40.478910] <Info> :: found endpoint for www.google.at:80 - 209.85.148.103
    [2011-Aug-30 02:58:40.478926] <Info> :: found endpoint for www.google.at:80 - 209.85.148.99
    [2011-Aug-30 02:58:40.479017] <Info> :: connecting to www.google.at:80 (209.85.148.147) ...
    [2011-Aug-30 02:58:40.528375] <Info> :: connected to www.google.at:80 (209.85.148.147)
    [2011-Aug-30 02:58:40.528559] <Client> :: GET /index.html HTTP/1.1
    [2011-Aug-30 02:58:40.528669] <Client> :: Connection: Close
    [2011-Aug-30 02:58:40.528733] <Client> :: Host: www.google.at
    [2011-Aug-30 02:58:40.528777] <Client> ::
    [2011-Aug-30 02:58:40.690945] <Server> :: HTTP/1.1 200 OK
    [2011-Aug-30 02:58:40.691039] <Server> :: Date: Tue, 30 Aug 2011 00:58:40 GMT
    [2011-Aug-30 02:58:40.691081] <Server> :: Expires: -1
    [2011-Aug-30 02:58:40.691121] <Server> :: Cache-Control: private, max-age=0
    [2011-Aug-30 02:58:40.691162] <Server> :: Content-Type: text/html; charset=ISO-8859-1
    [2011-Aug-30 02:58:40.691209] <Server> :: Set-Cookie: PREF=ID=e9ddca510657b0dd:FF=0:TM=1314665920:LM=1314665920:S=Dq_a0oHvuFjmwgT0; expires=Thu, 29-Aug-2013 00:58:40 GMT; path=/; domain=.google.at
    [2011-Aug-30 02:58:40.691281] <Server> :: Set-Cookie: NID=50=mG8afluu30k7spP-w-U7S5KMCUfyzQbhYQim3Dp9X6NiznxiLS7UreJ7DKWDqoNx3WUEIbSroMBkOQsOB6eyZLqnWV0bkUrob1aeGKAbH4LQOPycBI_MS_HHZMLwu81s; expires=Wed, 29-Feb-2012 00:58:40 GMT; path=/; domain=.google.at; HttpOnly
    [2011-Aug-30 02:58:40.691350] <Server> :: Server: gws
    [2011-Aug-30 02:58:40.691419] <Server> :: X-XSS-Protection: 1; mode=block
    [2011-Aug-30 02:58:40.691488] <Server> :: Connection: close
    [2011-Aug-30 02:58:40.691742] <Server> ::
    [2011-Aug-30 02:58:40.692102] <Server> :: === Webiste-Quelltext mal rausgenommen ===
    [2011-Aug-30 02:58:40.794119] <Warning> :: failed to read from socket: End of file



  • Aha.



  • Ja genau, ich suche mit einem nicht mal annähernd fertigen Projekt Aufmerksamkeit. Du hast mich durchschaut 🙄



  • Das drollige ist, dass du genau das tust, und es nichtmal bemerkst, wenn dich jmd. mit der Nase drauf stösst 😃



  • Wenn du mir nicht helfen willst, dann lass meinen Thread in Ruhe. Danke.



  • hustbaer schrieb:

    Das drollige ist, dass du genau das tust, und es nichtmal bemerkst, wenn dich jmd. mit der Nase drauf stösst 😃

    Endlich mal einer der ihn darauf hinweist!

    314159265358979 schrieb:

    Wenn du mir nicht helfen willst, dann lass meinen Thread in Ruhe. Danke.

    Eigentlich is es SeppJs Thread. 🤡



  • Bitte den Thread zumachen, das macht so keinen Sinn.



  • Du hast hier doch viele nützliche Antworten bekommen. Gib (den Thread) doch nicht gleich auf, nur weil nun auch was drin steht, was nicht im Sinne des Erfinders ist. 😉



  • Natürlich habe ich viele nützliche Antworten bekommen und dafür bin ich auch unendlich dankbar. Aber das gespamme hilft mir absolut nicht weiter, und wenn das nicht aufhört sehe ich keine andere Möglichkeit. Auch sehe ich nicht wirklich jemanden, der mir noch helfen möchte.
    Mein Projekt wird weitergehen, egal ob mit oder ohne Thread.



  • Wenn du das Gespamme nicht hilfreich findest, dann hör auf selbst zu spammen bzw. Gespamme zu provozieren.
    Ja, so einfach ist das.


Anmelden zum Antworten