#include "ChatMessageProcessor.h" #include "../Global/Variablen.h" #include ChatMessageProcessor::ChatMessageProcessor() : Thread() { start(); } void ChatMessageProcessor::thread() { KSGClient::ChatServerNachricht msg; while( chatClient && chatClient->istVerbunden() && chatClient->getNextMessage( msg ) ) { switch( msg.type ) { case 0: // verbindung getrennt return; case 1: // kick loginClient->trenne( 0 ); infoClient->trenne( 0 ); chatClient->trenne( 0 ); cmProcessor = (ChatMessageProcessor *)cmProcessor->release(); aktion = 4; break; case 2: // Server Ausgelastet aktion = 1; if( nachLogin &&nachLogin->zNachrichtenListe() ) { hauptScreen->lock(); nachLogin->zNachrichtenListe()->addNachricht( new Text( "Server Ausgelastet" ), new Text( "Der Chat Server ist derzeit ausgelastet. Es wird versucht auf einen anderen Server auszuweichen." ), new Text( "Ok" ), 0 ); hauptScreen->unlock(); } break; case 3: // Fehler hauptScreen->lock(); if( nachLogin &&nachLogin->zNachrichtenListe() ) nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), msg.message.getThis(), new Text( "Ok" ), 0 ); hauptScreen->unlock(); break; case 4: // Chat Nachricht if( nachLogin &&nachLogin->zChatLeiste() ) { hauptScreen->lock(); nachLogin->zChatLeiste()->chatNachricht( msg.account, msg.message ); hauptScreen->unlock(); } break; case 5: // Spiel Einladung if( nachLogin && nachLogin->zNachrichtenListe() ) { int karteId = infoClient->getGruppenKarteId( msg.gruppe ); int spielId = infoClient->getSpielId( karteId ); Text *spiel = infoClient->getSpielName( spielId ); Text *karte = infoClient->getKarteName( karteId ); Text *name = infoClient->getSpielerName( msg.account ); Text *titel = new Text( "Spiel Einladung" ); Text *nachricht = new Text( "Von: " ); nachricht->append( name ); nachricht->append( "\nSpiel: " ); nachricht->append( spiel ); nachricht->append( "\nKarte: " ); nachricht->append( karte ); int gruppeId = msg.gruppe; int vonAccount = msg.account; hauptScreen->lock(); nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "annehmen" ), new Text( "ablehnen" ), [ gruppeId, vonAccount ]() { if( 1 ) { int karteId = infoClient->getGruppenKarteId( gruppeId ); int spielArt = infoClient->getSpielId( karteId ); KSGTDatei *dgt = new KSGTDatei( "data/dg.ksgt" ); dgt->laden(); bool sak = 0; int dgSId = infoClient->getDateiGruppeIdVonSpiel( spielArt ); bool sgf = 0; for( int i = 0; i < dgt->getZeilenAnzahl(); i++ ) { if( dgt->zFeld( i, 0 ) && TextZuInt( dgt->zFeld( i, 0 )->getText(), 10 ) == dgSId ) { sgf = 1; int lv = dgt->zFeld( i, 2 ) ? TextZuInt( dgt->zFeld( i, 2 )->getText(), 10 ) : 0; int ov = infoClient->getSpielVersion( spielArt ); if( lv == ov ) { sak = 1; break; } } } dgt->release(); std::function< void() > ja = [ gruppeId ]() { MausEreignis me; me.verarbeitet = 0; me.id = ME_RLinks; nachLogin->zTitelLeiste()->druckSpielen( me ); Array< int > *spieler = new Array< int >(); int anzahl = 0; if( !anmeldungClient ) anmeldungClient = mainClient->createAnmeldungServerClient(); if( !anmeldungClient ) nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( mainClient->getLetzterFehler() ), new Text( "Ok" ), 0 ); if( anmeldungClient && anmeldungClient->verbinde() ) { if( anmeldungClient->gruppeBetreten( gruppeId, spieler, &anzahl ) ) { nachLogin->zSpielenFenster()->gruppeBetreten( gruppeId ); for( int i = 0; i < anzahl; i++ ) nachLogin->zSpielenFenster()->spielerBetrittGruppe( gruppeId, spieler->hat( i ) ? spieler->get( i ) : 0 ); } else nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( anmeldungClient->getLetzterFehler() ), new Text( "Ok" ), 0 ); anmeldungClient->trenne( 0 ); } else if( anmeldungClient ) nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( anmeldungClient->getLetzterFehler() ), new Text( "Ok" ), 0 ); }; if( !sak ) { if( !sgf ) { Text *pfad = infoClient->getDateiGruppePfad( dgSId ); Text *idT = new Text(); idT->append( dgSId ); if( pfad ) { KSGTDatei *dg = new KSGTDatei( "data/dg.ksgt" ); dg->laden(); RCArray< Text > *zeile = new RCArray< Text >(); zeile->add( idT ); zeile->add( pfad ); zeile->add( new Text( "0" ) ); zeile->add( new Text( "0" ) ); dg->addZeile( 4, zeile ); zeile->release(); dg->speichern(); dg->release(); } else idT->release(); } Text msg = "Das Spiel '"; msg.append( infoClient->getSpielName( spielArt ) ); msg += "' muss aktualisiert werden."; nachLogin->zNachrichtenListe()->addNachricht( new SpielUpdateNachricht( nachLogin->zNachrichtenListe()->zSchrift(), new Text( "Update" ), msg.getThis(), dgSId, ja, [ gruppeId ]() { if( !anmeldungClient ) anmeldungClient = mainClient->createAnmeldungServerClient(); if( anmeldungClient && anmeldungClient->verbinde() ) { anmeldungClient->gruppeEinladungAblehnen( gruppeId ); anmeldungClient->trenne( 0 ); } } ) ); } else { ja(); } } }, [ gruppeId ]() { if( !anmeldungClient ) anmeldungClient = mainClient->createAnmeldungServerClient(); if( anmeldungClient && anmeldungClient->verbinde() ) { anmeldungClient->gruppeEinladungAblehnen( gruppeId ); anmeldungClient->trenne( 0 ); } } ); hauptScreen->unlock(); } break; case 6: // Account Status ändert sich hauptScreen->lock(); if( nachLogin &&nachLogin->zNachrichtenListe() ) nachLogin->zFreundesListe()->setStatus( msg.account, msg.message ); hauptScreen->unlock(); break; case 7: // Account Name ändert sich hauptScreen->lock(); if( nachLogin &&nachLogin->zNachrichtenListe() ) nachLogin->zFreundesListe()->setName( msg.account, msg.message ); hauptScreen->unlock(); break; case 8: // kein Freund mehr hauptScreen->lock(); if( nachLogin &&nachLogin->zNachrichtenListe() ) nachLogin->zFreundesListe()->removeMember( msg.account ); hauptScreen->unlock(); break; case 9: // Freundesanfrage if( nachLogin && nachLogin->zNachrichtenListe() ) { Text *titel = new Text( "Freundeseinladung" ); Text *nachricht = new Text( "" ); nachricht->append( infoClient->getSpielerName( msg.account ) ); nachricht->append( " möchte sich mit dir befreunden." ); int accountId = msg.account; hauptScreen->lock(); if( nachLogin &&nachLogin->zNachrichtenListe() ) { nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "annehmen" ), new Text( "ablehnen" ), [ accountId ]() { chatClient->freundesAnfrageBeantworten( accountId, 1 ); }, [ accountId ]() { chatClient->freundesAnfrageBeantworten( accountId, 0 ); } ); } hauptScreen->unlock(); } break; case 0xA: // Neuer Freund hauptScreen->lock(); if( nachLogin &&nachLogin->zNachrichtenListe() ) nachLogin->zFreundesListe()->addMember( msg.account ); hauptScreen->unlock(); break; case 0xB: // Freundesanfrage abgelehnt if( nachLogin &&nachLogin->zNachrichtenListe() ) { Text *titel = new Text( "Freundeseinladung Abgelehnt" ); Text *nachricht = new Text( "" ); nachricht->append( infoClient->getSpielerName( msg.account ) ); nachricht->append( " hat deine Freundesanfrage abgelehnt." ); hauptScreen->lock(); nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "Ok" ), 0 ); hauptScreen->unlock(); } break; case 0xC: // Einladung zum Chatroom if( nachLogin &&nachLogin->zNachrichtenListe() ) { Text *titel = new Text( "Chatroom Einladung" ); Text *nachricht = new Text( "" ); nachricht->append( infoClient->getSpielerName( msg.account ) ); nachricht->append( " lädt dich dazu ein das Chatroom '" ); nachricht->append( infoClient->getChatroomName( msg.chatroom ) ); nachricht->append( "' zu betreten." ); int chatroomId = msg.chatroom; int vonAccount = msg.account; nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "betreten" ), new Text( "ablehnen" ), [ chatroomId, vonAccount ]() { nachLogin->zChatLeiste()->addChat( 0, chatroomId ); chatClient->chatroomBetreten( chatroomId ); }, [ chatroomId, vonAccount ]() { chatClient->chatroomEinladungAblehnen( vonAccount, chatroomId ); } ); } break; case 0xD: // Einladung zum Chatroom abgelehnt if( nachLogin &&nachLogin->zNachrichtenListe() ) { Text *titel = new Text( "Chatroom Einladung Abgelehnt" ); Text *nachricht = new Text( "" ); nachricht->append( infoClient->getSpielerName( msg.account ) ); nachricht->append( " möchte dem Chatroom '" ); nachricht->append( infoClient->getChatroomName( msg.chatroom ) ); nachricht->append( "' nicht beitreten." ); hauptScreen->lock(); nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "Ok" ), 0 ); hauptScreen->unlock(); } break; case 0xE: // Spieler betritt Chatroom hauptScreen->lock(); if( nachLogin &&nachLogin->zChatLeiste() ) nachLogin->zChatLeiste()->addSpieler( msg.chatroom, msg.account ); hauptScreen->unlock(); break; case 0xF: // Chatroom Nachricht hauptScreen->lock(); if( nachLogin &&nachLogin->zChatLeiste() ) nachLogin->zChatLeiste()->chatroomNachricht( msg.chatroom, msg.account, msg.message ); hauptScreen->unlock(); break; case 0x10: // Spieler verlässt Chatroom hauptScreen->lock(); if( nachLogin &&nachLogin->zChatLeiste() ) nachLogin->zChatLeiste()->removeSpieler( msg.chatroom, msg.account ); hauptScreen->unlock(); break; case 0x11: // Freunde { char freundeAnzahl = msg.ids.getEintragAnzahl(); for( int i = 0; i < freundeAnzahl; i++ ) { if( nachLogin ) { while( !nachLogin->zFreundesListe() ) { Sleep( 50 ); } hauptScreen->lock(); nachLogin->zFreundesListe()->addMember( msg.ids.get( i ) ); hauptScreen->unlock(); } } break; } case 0x12: // Spieler im Chatroom { char anzahl = msg.ids.getEintragAnzahl(); for( char i = 0; i < anzahl; i++ ) { hauptScreen->lock(); if( nachLogin &&nachLogin->zChatLeiste() ) nachLogin->zChatLeiste()->addSpieler( msg.chatroom, msg.ids.get( i ) ); hauptScreen->unlock(); } break; } case 0x13: // Freund online hauptScreen->lock(); if( nachLogin &&nachLogin->zFreundesListe() ) nachLogin->zFreundesListe()->setOnline( msg.account, 1 ); hauptScreen->unlock(); break; case 0x14: // Freund offline hauptScreen->lock(); if( nachLogin &&nachLogin->zFreundesListe() ) nachLogin->zFreundesListe()->setOnline( msg.account, 0 ); hauptScreen->unlock(); break; case 0x15: // Chatroom Admin hauptScreen->lock(); if( nachLogin &&nachLogin->zChatLeiste() ) nachLogin->zChatLeiste()->setChatroomAdmin( msg.chatroom ); hauptScreen->unlock(); break; case 0x16: // Chatroom Kick hauptScreen->lock(); if( nachLogin &&nachLogin->zChatLeiste() ) nachLogin->zChatLeiste()->removeChat( 0, msg.chatroom ); hauptScreen->unlock(); break; case 0x17: // Spieler betritt Gruppe if( nachLogin &&nachLogin->zSpielenFenster() ) nachLogin->zSpielenFenster()->spielerBetrittGruppe( msg.gruppe, msg.account ); break; case 0x18: // Spieler verlässt Gruppe if( nachLogin &&nachLogin->zSpielenFenster() ) nachLogin->zSpielenFenster()->spielerVerlässtGruppe( msg.gruppe, msg.account ); break; case 0x19: // gruppe Nachricht if( nachLogin &&nachLogin->zSpielenFenster() ) nachLogin->zSpielenFenster()->gruppeNachricht( msg.gruppe, msg.message ); break; case 0x1A: // gruppe Angemeldet if( nachLogin &&nachLogin->zSpielenFenster() ) nachLogin->zSpielenFenster()->gruppeAnmelden( msg.gruppe ); break; case 0x1B: // gruppe Abgemeldet if( nachLogin &&nachLogin->zSpielenFenster() ) nachLogin->zSpielenFenster()->gruppeAbmelden( msg.gruppe ); break; case 0x1C: // gruppe Spiel starten if( nachLogin &&nachLogin->zSpielenFenster() ) nachLogin->zSpielenFenster()->setGruppeSpielStarten( msg.gruppe, msg.account == 1 ); break; case 0x1D: // kick aus Gruppe if( nachLogin &&nachLogin->zSpielenFenster() ) nachLogin->zSpielenFenster()->kickAusGruppe( msg.gruppe ); break; case 0x1E: // gruppe Admin if( nachLogin &&nachLogin->zSpielenFenster() ) nachLogin->zSpielenFenster()->setGruppeAdmin( msg.gruppe, msg.account ); break; case 0x1F: // gruppe Einladung abgelehnt if( nachLogin &&nachLogin->zSpielenFenster() ) nachLogin->zSpielenFenster()->gruppeEinadungAbgelehnt( msg.gruppe, msg.account ); break; case 0x20: // SpielServer Verbindungs Anfrage if( smProcessor ) smProcessor = (SpielMessageProcessor *)smProcessor->release(); if( spielClient ) spielClient = spielClient->release(); spielClient = msg.client; spielClient->verbinde(); smProcessor = new SpielMessageProcessor(); break; case 0x21: // Gruppe Einladung abgebrochen if( nachLogin &&nachLogin->zSpielenFenster() ) nachLogin->zSpielenFenster()->gruppeEinladungAbgebrochen( msg.gruppe, msg.account ); break; case 0x22: // Gruppe Einladung hinzufügen if( nachLogin &&nachLogin->zSpielenFenster() ) nachLogin->zSpielenFenster()->gruppeEinladungNeu( msg.gruppe, msg.account ); break; default: // Unbekannte Servernachricht if( nachLogin &&nachLogin->zNachrichtenListe() ) { hauptScreen->lock(); nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Unbekannte Nachricht vom Server. Eventuel ist der Client nicht mehr Aktuell." ), new Text( "Ok" ), 0 ); hauptScreen->unlock(); } break; } msg.ids.leeren(); } }