ChatMessageProcessor.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. #include "ChatMessageProcessor.h"
  2. #include "../Global/Variablen.h"
  3. #include <KSGTDatei.h>
  4. ChatMessageProcessor::ChatMessageProcessor()
  5. : Thread()
  6. {
  7. start();
  8. }
  9. void ChatMessageProcessor::thread()
  10. {
  11. KSGClient::ChatServerNachricht msg;
  12. while( chatClient && chatClient->istVerbunden() && chatClient->getNextMessage( msg ) )
  13. {
  14. switch( msg.type )
  15. {
  16. case 0: // verbindung getrennt
  17. return;
  18. case 1: // kick
  19. loginClient->trenne( 0 );
  20. infoClient->trenne( 0 );
  21. chatClient->trenne( 0 );
  22. cmProcessor = (ChatMessageProcessor *)cmProcessor->release();
  23. aktion = 4;
  24. break;
  25. case 2: // Server Ausgelastet
  26. aktion = 1;
  27. if( nachLogin &&nachLogin->zNachrichtenListe() )
  28. {
  29. hauptScreen->lock();
  30. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Server Ausgelastet" ),
  31. new Text( "Der Chat Server ist derzeit ausgelastet. Es wird versucht auf einen anderen Server auszuweichen." ),
  32. new Text( "Ok" ), 0 );
  33. hauptScreen->unlock();
  34. }
  35. break;
  36. case 3: // Fehler
  37. hauptScreen->lock();
  38. if( nachLogin &&nachLogin->zNachrichtenListe() )
  39. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), msg.message.getThis(), new Text( "Ok" ), 0 );
  40. hauptScreen->unlock();
  41. break;
  42. case 4: // Chat Nachricht
  43. if( nachLogin &&nachLogin->zChatLeiste() )
  44. {
  45. hauptScreen->lock();
  46. nachLogin->zChatLeiste()->chatNachricht( msg.account, msg.message );
  47. hauptScreen->unlock();
  48. }
  49. break;
  50. case 5: // Spiel Einladung
  51. if( nachLogin && nachLogin->zNachrichtenListe() )
  52. {
  53. int karteId = infoClient->getGruppenKarteId( msg.gruppe );
  54. int spielId = infoClient->getSpielId( karteId );
  55. Text *spiel = infoClient->getSpielName( spielId );
  56. Text *karte = infoClient->getKarteName( karteId );
  57. Text *name = infoClient->getSpielerName( msg.account );
  58. Text *titel = new Text( "Spiel Einladung" );
  59. Text *nachricht = new Text( "Von: " );
  60. nachricht->append( name );
  61. nachricht->append( "\nSpiel: " );
  62. nachricht->append( spiel );
  63. nachricht->append( "\nKarte: " );
  64. nachricht->append( karte );
  65. int gruppeId = msg.gruppe;
  66. int vonAccount = msg.account;
  67. hauptScreen->lock();
  68. nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "annehmen" ), new Text( "ablehnen" ), [ gruppeId, vonAccount ]()
  69. {
  70. if( 1 )
  71. {
  72. int karteId = infoClient->getGruppenKarteId( gruppeId );
  73. int spielArt = infoClient->getSpielId( karteId );
  74. KSGTDatei *dgt = new KSGTDatei( "data/dg.ksgt" );
  75. dgt->laden();
  76. bool sak = 0;
  77. int dgSId = infoClient->getDateiGruppeIdVonSpiel( spielArt );
  78. bool sgf = 0;
  79. for( int i = 0; i < dgt->getZeilenAnzahl(); i++ )
  80. {
  81. if( dgt->zFeld( i, 0 ) && TextZuInt( dgt->zFeld( i, 0 )->getText(), 10 ) == dgSId )
  82. {
  83. sgf = 1;
  84. int lv = dgt->zFeld( i, 2 ) ? TextZuInt( dgt->zFeld( i, 2 )->getText(), 10 ) : 0;
  85. int ov = infoClient->getSpielVersion( spielArt );
  86. if( lv == ov )
  87. {
  88. sak = 1;
  89. break;
  90. }
  91. }
  92. }
  93. dgt->release();
  94. std::function< void() > ja = [ gruppeId ]()
  95. {
  96. MausEreignis me;
  97. me.verarbeitet = 0;
  98. me.id = ME_RLinks;
  99. nachLogin->zTitelLeiste()->druckSpielen( me );
  100. Array< int > *spieler = new Array< int >();
  101. int anzahl = 0;
  102. if( !anmeldungClient )
  103. anmeldungClient = mainClient->createAnmeldungServerClient();
  104. if( !anmeldungClient )
  105. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( mainClient->getLetzterFehler() ), new Text( "Ok" ), 0 );
  106. if( anmeldungClient && anmeldungClient->verbinde() )
  107. {
  108. if( anmeldungClient->gruppeBetreten( gruppeId, spieler, &anzahl ) )
  109. {
  110. nachLogin->zSpielenFenster()->gruppeBetreten( gruppeId );
  111. for( int i = 0; i < anzahl; i++ )
  112. nachLogin->zSpielenFenster()->spielerBetrittGruppe( gruppeId, spieler->hat( i ) ? spieler->get( i ) : 0 );
  113. }
  114. else
  115. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( anmeldungClient->getLetzterFehler() ), new Text( "Ok" ), 0 );
  116. anmeldungClient->trenne( 0 );
  117. }
  118. else if( anmeldungClient )
  119. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( anmeldungClient->getLetzterFehler() ), new Text( "Ok" ), 0 );
  120. };
  121. if( !sak )
  122. {
  123. if( !sgf )
  124. {
  125. Text *pfad = infoClient->getDateiGruppePfad( dgSId );
  126. Text *idT = new Text();
  127. idT->append( dgSId );
  128. if( pfad )
  129. {
  130. KSGTDatei *dg = new KSGTDatei( "data/dg.ksgt" );
  131. dg->laden();
  132. RCArray< Text > *zeile = new RCArray< Text >();
  133. zeile->add( idT );
  134. zeile->add( pfad );
  135. zeile->add( new Text( "0" ) );
  136. zeile->add( new Text( "0" ) );
  137. dg->addZeile( 4, zeile );
  138. zeile->release();
  139. dg->speichern();
  140. dg->release();
  141. }
  142. else
  143. idT->release();
  144. }
  145. Text msg = "Das Spiel '";
  146. msg.append( infoClient->getSpielName( spielArt ) );
  147. msg += "' muss aktualisiert werden.";
  148. nachLogin->zNachrichtenListe()->addNachricht( new SpielUpdateNachricht( nachLogin->zNachrichtenListe()->zSchrift(), new Text( "Update" ), msg.getThis(), dgSId, ja, [ gruppeId ]()
  149. {
  150. if( !anmeldungClient )
  151. anmeldungClient = mainClient->createAnmeldungServerClient();
  152. if( anmeldungClient && anmeldungClient->verbinde() )
  153. {
  154. anmeldungClient->gruppeEinladungAblehnen( gruppeId );
  155. anmeldungClient->trenne( 0 );
  156. }
  157. } ) );
  158. }
  159. else
  160. {
  161. ja();
  162. }
  163. }
  164. }, [ gruppeId ]()
  165. {
  166. if( !anmeldungClient )
  167. anmeldungClient = mainClient->createAnmeldungServerClient();
  168. if( anmeldungClient && anmeldungClient->verbinde() )
  169. {
  170. anmeldungClient->gruppeEinladungAblehnen( gruppeId );
  171. anmeldungClient->trenne( 0 );
  172. }
  173. } );
  174. hauptScreen->unlock();
  175. }
  176. break;
  177. case 6: // Account Status ändert sich
  178. hauptScreen->lock();
  179. if( nachLogin &&nachLogin->zNachrichtenListe() )
  180. nachLogin->zFreundesListe()->setStatus( msg.account, msg.message );
  181. hauptScreen->unlock();
  182. break;
  183. case 7: // Account Name ändert sich
  184. hauptScreen->lock();
  185. if( nachLogin &&nachLogin->zNachrichtenListe() )
  186. nachLogin->zFreundesListe()->setName( msg.account, msg.message );
  187. hauptScreen->unlock();
  188. break;
  189. case 8: // kein Freund mehr
  190. hauptScreen->lock();
  191. if( nachLogin &&nachLogin->zNachrichtenListe() )
  192. nachLogin->zFreundesListe()->removeMember( msg.account );
  193. hauptScreen->unlock();
  194. break;
  195. case 9: // Freundesanfrage
  196. if( nachLogin && nachLogin->zNachrichtenListe() )
  197. {
  198. Text *titel = new Text( "Freundeseinladung" );
  199. Text *nachricht = new Text( "" );
  200. nachricht->append( infoClient->getSpielerName( msg.account ) );
  201. nachricht->append( " möchte sich mit dir befreunden." );
  202. int accountId = msg.account;
  203. hauptScreen->lock();
  204. if( nachLogin &&nachLogin->zNachrichtenListe() )
  205. {
  206. nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "annehmen" ), new Text( "ablehnen" ),
  207. [ accountId ]()
  208. {
  209. chatClient->freundesAnfrageBeantworten( accountId, 1 );
  210. }, [ accountId ]()
  211. {
  212. chatClient->freundesAnfrageBeantworten( accountId, 0 );
  213. } );
  214. }
  215. hauptScreen->unlock();
  216. }
  217. break;
  218. case 0xA: // Neuer Freund
  219. hauptScreen->lock();
  220. if( nachLogin &&nachLogin->zNachrichtenListe() )
  221. nachLogin->zFreundesListe()->addMember( msg.account );
  222. hauptScreen->unlock();
  223. break;
  224. case 0xB: // Freundesanfrage abgelehnt
  225. if( nachLogin &&nachLogin->zNachrichtenListe() )
  226. {
  227. Text *titel = new Text( "Freundeseinladung Abgelehnt" );
  228. Text *nachricht = new Text( "" );
  229. nachricht->append( infoClient->getSpielerName( msg.account ) );
  230. nachricht->append( " hat deine Freundesanfrage abgelehnt." );
  231. hauptScreen->lock();
  232. nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "Ok" ), 0 );
  233. hauptScreen->unlock();
  234. }
  235. break;
  236. case 0xC: // Einladung zum Chatroom
  237. if( nachLogin &&nachLogin->zNachrichtenListe() )
  238. {
  239. Text *titel = new Text( "Chatroom Einladung" );
  240. Text *nachricht = new Text( "" );
  241. nachricht->append( infoClient->getSpielerName( msg.account ) );
  242. nachricht->append( " lädt dich dazu ein das Chatroom '" );
  243. nachricht->append( infoClient->getChatroomName( msg.chatroom ) );
  244. nachricht->append( "' zu betreten." );
  245. int chatroomId = msg.chatroom;
  246. int vonAccount = msg.account;
  247. nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "betreten" ), new Text( "ablehnen" ),
  248. [ chatroomId, vonAccount ]()
  249. {
  250. nachLogin->zChatLeiste()->addChat( 0, chatroomId );
  251. chatClient->chatroomBetreten( chatroomId );
  252. }, [ chatroomId, vonAccount ]()
  253. {
  254. chatClient->chatroomEinladungAblehnen( vonAccount, chatroomId );
  255. } );
  256. }
  257. break;
  258. case 0xD: // Einladung zum Chatroom abgelehnt
  259. if( nachLogin &&nachLogin->zNachrichtenListe() )
  260. {
  261. Text *titel = new Text( "Chatroom Einladung Abgelehnt" );
  262. Text *nachricht = new Text( "" );
  263. nachricht->append( infoClient->getSpielerName( msg.account ) );
  264. nachricht->append( " möchte dem Chatroom '" );
  265. nachricht->append( infoClient->getChatroomName( msg.chatroom ) );
  266. nachricht->append( "' nicht beitreten." );
  267. hauptScreen->lock();
  268. nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "Ok" ), 0 );
  269. hauptScreen->unlock();
  270. }
  271. break;
  272. case 0xE: // Spieler betritt Chatroom
  273. hauptScreen->lock();
  274. if( nachLogin &&nachLogin->zChatLeiste() )
  275. nachLogin->zChatLeiste()->addSpieler( msg.chatroom, msg.account );
  276. hauptScreen->unlock();
  277. break;
  278. case 0xF: // Chatroom Nachricht
  279. hauptScreen->lock();
  280. if( nachLogin &&nachLogin->zChatLeiste() )
  281. nachLogin->zChatLeiste()->chatroomNachricht( msg.chatroom, msg.account, msg.message );
  282. hauptScreen->unlock();
  283. break;
  284. case 0x10: // Spieler verlässt Chatroom
  285. hauptScreen->lock();
  286. if( nachLogin &&nachLogin->zChatLeiste() )
  287. nachLogin->zChatLeiste()->removeSpieler( msg.chatroom, msg.account );
  288. hauptScreen->unlock();
  289. break;
  290. case 0x11: // Freunde
  291. {
  292. char freundeAnzahl = msg.ids.getEintragAnzahl();
  293. for( int i = 0; i < freundeAnzahl; i++ )
  294. {
  295. if( nachLogin )
  296. {
  297. while( !nachLogin->zFreundesListe() )
  298. {
  299. Sleep( 50 );
  300. }
  301. hauptScreen->lock();
  302. nachLogin->zFreundesListe()->addMember( msg.ids.get( i ) );
  303. hauptScreen->unlock();
  304. }
  305. }
  306. break;
  307. }
  308. case 0x12: // Spieler im Chatroom
  309. {
  310. char anzahl = msg.ids.getEintragAnzahl();
  311. for( char i = 0; i < anzahl; i++ )
  312. {
  313. hauptScreen->lock();
  314. if( nachLogin &&nachLogin->zChatLeiste() )
  315. nachLogin->zChatLeiste()->addSpieler( msg.chatroom, msg.ids.get( i ) );
  316. hauptScreen->unlock();
  317. }
  318. break;
  319. }
  320. case 0x13: // Freund online
  321. hauptScreen->lock();
  322. if( nachLogin &&nachLogin->zFreundesListe() )
  323. nachLogin->zFreundesListe()->setOnline( msg.account, 1 );
  324. hauptScreen->unlock();
  325. break;
  326. case 0x14: // Freund offline
  327. hauptScreen->lock();
  328. if( nachLogin &&nachLogin->zFreundesListe() )
  329. nachLogin->zFreundesListe()->setOnline( msg.account, 0 );
  330. hauptScreen->unlock();
  331. break;
  332. case 0x15: // Chatroom Admin
  333. hauptScreen->lock();
  334. if( nachLogin &&nachLogin->zChatLeiste() )
  335. nachLogin->zChatLeiste()->setChatroomAdmin( msg.chatroom );
  336. hauptScreen->unlock();
  337. break;
  338. case 0x16: // Chatroom Kick
  339. hauptScreen->lock();
  340. if( nachLogin &&nachLogin->zChatLeiste() )
  341. nachLogin->zChatLeiste()->removeChat( 0, msg.chatroom );
  342. hauptScreen->unlock();
  343. break;
  344. case 0x17: // Spieler betritt Gruppe
  345. if( nachLogin &&nachLogin->zSpielenFenster() )
  346. nachLogin->zSpielenFenster()->spielerBetrittGruppe( msg.gruppe, msg.account );
  347. break;
  348. case 0x18: // Spieler verlässt Gruppe
  349. if( nachLogin &&nachLogin->zSpielenFenster() )
  350. nachLogin->zSpielenFenster()->spielerVerlässtGruppe( msg.gruppe, msg.account );
  351. break;
  352. case 0x19: // gruppe Nachricht
  353. if( nachLogin &&nachLogin->zSpielenFenster() )
  354. nachLogin->zSpielenFenster()->gruppeNachricht( msg.gruppe, msg.message );
  355. break;
  356. case 0x1A: // gruppe Angemeldet
  357. if( nachLogin &&nachLogin->zSpielenFenster() )
  358. nachLogin->zSpielenFenster()->gruppeAnmelden( msg.gruppe );
  359. break;
  360. case 0x1B: // gruppe Abgemeldet
  361. if( nachLogin &&nachLogin->zSpielenFenster() )
  362. nachLogin->zSpielenFenster()->gruppeAbmelden( msg.gruppe );
  363. break;
  364. case 0x1C: // gruppe Spiel starten
  365. if( nachLogin &&nachLogin->zSpielenFenster() )
  366. nachLogin->zSpielenFenster()->setGruppeSpielStarten( msg.gruppe, msg.account == 1 );
  367. break;
  368. case 0x1D: // kick aus Gruppe
  369. if( nachLogin &&nachLogin->zSpielenFenster() )
  370. nachLogin->zSpielenFenster()->kickAusGruppe( msg.gruppe );
  371. break;
  372. case 0x1E: // gruppe Admin
  373. if( nachLogin &&nachLogin->zSpielenFenster() )
  374. nachLogin->zSpielenFenster()->setGruppeAdmin( msg.gruppe, msg.account );
  375. break;
  376. case 0x1F: // gruppe Einladung abgelehnt
  377. if( nachLogin &&nachLogin->zSpielenFenster() )
  378. nachLogin->zSpielenFenster()->gruppeEinadungAbgelehnt( msg.gruppe, msg.account );
  379. break;
  380. case 0x20: // SpielServer Verbindungs Anfrage
  381. if( smProcessor )
  382. smProcessor = (SpielMessageProcessor *)smProcessor->release();
  383. if( spielClient )
  384. spielClient = spielClient->release();
  385. spielClient = msg.client;
  386. spielClient->verbinde();
  387. smProcessor = new SpielMessageProcessor();
  388. break;
  389. case 0x21: // Gruppe Einladung abgebrochen
  390. if( nachLogin &&nachLogin->zSpielenFenster() )
  391. nachLogin->zSpielenFenster()->gruppeEinladungAbgebrochen( msg.gruppe, msg.account );
  392. break;
  393. case 0x22: // Gruppe Einladung hinzufügen
  394. if( nachLogin &&nachLogin->zSpielenFenster() )
  395. nachLogin->zSpielenFenster()->gruppeEinladungNeu( msg.gruppe, msg.account );
  396. break;
  397. default: // Unbekannte Servernachricht
  398. if( nachLogin &&nachLogin->zNachrichtenListe() )
  399. {
  400. hauptScreen->lock();
  401. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
  402. new Text( "Unbekannte Nachricht vom Server. Eventuel ist der Client nicht mehr Aktuell." ),
  403. new Text( "Ok" ), 0 );
  404. hauptScreen->unlock();
  405. }
  406. break;
  407. }
  408. msg.ids.leeren();
  409. }
  410. }