123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- #include "ChatMessageProcessor.h"
- #include "../Global/Variablen.h"
- #include <KSGTDatei.h>
- ChatMessageProcessor::ChatMessageProcessor()
- : Thread()
- {
- ref = 1;
- 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 = 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.account );
- 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 = 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;
- }
- }
- }
- ChatMessageProcessor *ChatMessageProcessor::getThis()
- {
- ref++;
- return this;
- }
- ChatMessageProcessor *ChatMessageProcessor::release()
- {
- if( !--ref )
- delete this;
- return 0;
- }
|