#include "ChatMessageProcessor.h" #include "../Global/Variablen.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, NachrichtType::nachricht, 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, NachrichtType::nachricht, 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 ); SpielEinladungParam *param = new SpielEinladungParam(); param->gruppeId = msg.gruppe; param->vonAccount = msg.account; hauptScreen->lock(); nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "annehmen" ), new Text( "ablehnen" ), NachrichtType::spielEinladung, param ); 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 = new int; *accountId = msg.account; hauptScreen->lock(); if( nachLogin && nachLogin->zNachrichtenListe() ) { nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "annehmen" ), new Text( "ablehnen" ), NachrichtType::freundEinladung, (void*)accountId ); } 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, NachrichtType::nachricht, 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." ); ChatroomEinladungParam *param = new ChatroomEinladungParam(); param->chatroomId = msg.chatroom; param->vonAccount = msg.account; nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "betreten" ), new Text( "ablehnen" ), NachrichtType::chatroomEinladung, param ); } 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, NachrichtType::nachricht, 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, NachrichtType::nachricht, 0 ); hauptScreen->unlock(); } break; } } } ChatMessageProcessor *ChatMessageProcessor::getThis() { ref++; return this; } ChatMessageProcessor *ChatMessageProcessor::release() { if( !--ref ) delete this; return 0; }