ChatMessageProcessor.cpp 20 KB

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