ChatMessageProcessor.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. #include "ChatMessageProcessor.h"
  2. #include "../Global/Variablen.h"
  3. ChatMessageProcessor::ChatMessageProcessor()
  4. : Thread()
  5. {
  6. ref = 1;
  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 = 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, NachrichtType::nachricht, 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, NachrichtType::nachricht, 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. SpielEinladungParam *param = new SpielEinladungParam();
  66. param->gruppeId = msg.gruppe;
  67. param->vonAccount = msg.account;
  68. hauptScreen->lock();
  69. nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "annehmen" ), new Text( "ablehnen" ), NachrichtType::spielEinladung, param );
  70. hauptScreen->unlock();
  71. }
  72. break;
  73. case 6: // Account Status ändert sich
  74. hauptScreen->lock();
  75. if( nachLogin && nachLogin->zNachrichtenListe() )
  76. nachLogin->zFreundesListe()->setStatus( msg.account, msg.message );
  77. hauptScreen->unlock();
  78. break;
  79. case 7: // Account Name ändert sich
  80. hauptScreen->lock();
  81. if( nachLogin && nachLogin->zNachrichtenListe() )
  82. nachLogin->zFreundesListe()->setName( msg.account, msg.message );
  83. hauptScreen->unlock();
  84. break;
  85. case 8: // kein Freund mehr
  86. hauptScreen->lock();
  87. if( nachLogin && nachLogin->zNachrichtenListe() )
  88. nachLogin->zFreundesListe()->removeMember( msg.account );
  89. hauptScreen->unlock();
  90. break;
  91. case 9: // Freundesanfrage
  92. if( nachLogin && nachLogin->zNachrichtenListe() )
  93. {
  94. Text *titel = new Text( "Freundeseinladung" );
  95. Text *nachricht = new Text( "" );
  96. nachricht->append( infoClient->getSpielerName( msg.account ) );
  97. nachricht->append( " möchte sich mit dir befreunden." );
  98. int *accountId = new int;
  99. *accountId = msg.account;
  100. hauptScreen->lock();
  101. if( nachLogin && nachLogin->zNachrichtenListe() )
  102. {
  103. nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "annehmen" ), new Text( "ablehnen" ),
  104. NachrichtType::freundEinladung, (void*)accountId );
  105. }
  106. hauptScreen->unlock();
  107. }
  108. break;
  109. case 0xA: // Neuer Freund
  110. hauptScreen->lock();
  111. if( nachLogin && nachLogin->zNachrichtenListe() )
  112. nachLogin->zFreundesListe()->addMember( msg.account );
  113. hauptScreen->unlock();
  114. break;
  115. case 0xB: // Freundesanfrage abgelehnt
  116. if( nachLogin && nachLogin->zNachrichtenListe() )
  117. {
  118. Text *titel = new Text( "Freundeseinladung Abgelehnt" );
  119. Text *nachricht = new Text( "" );
  120. nachricht->append( infoClient->getSpielerName( msg.account ) );
  121. nachricht->append( " hat deine Freundesanfrage abgelehnt." );
  122. hauptScreen->lock();
  123. nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
  124. hauptScreen->unlock();
  125. }
  126. break;
  127. case 0xC: // Einladung zum Chatroom
  128. if( nachLogin && nachLogin->zNachrichtenListe() )
  129. {
  130. Text *titel = new Text( "Chatroom Einladung" );
  131. Text *nachricht = new Text( "" );
  132. nachricht->append( infoClient->getSpielerName( msg.account ) );
  133. nachricht->append( " lädt dich dazu ein das Chatroom '" );
  134. nachricht->append( infoClient->getChatroomName( msg.chatroom ) );
  135. nachricht->append( "' zu betreten." );
  136. ChatroomEinladungParam *param = new ChatroomEinladungParam();
  137. param->chatroomId = msg.chatroom;
  138. param->vonAccount = msg.account;
  139. nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "betreten" ), new Text( "ablehnen" ), NachrichtType::chatroomEinladung, param );
  140. }
  141. break;
  142. case 0xD: // Einladung zum Chatroom abgelehnt
  143. if( nachLogin && nachLogin->zNachrichtenListe() )
  144. {
  145. Text *titel = new Text( "Chatroom Einladung Abgelehnt" );
  146. Text *nachricht = new Text( "" );
  147. nachricht->append( infoClient->getSpielerName( msg.account ) );
  148. nachricht->append( " möchte dem Chatroom '" );
  149. nachricht->append( infoClient->getChatroomName( msg.chatroom ) );
  150. nachricht->append( "' nicht beitreten." );
  151. hauptScreen->lock();
  152. nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
  153. hauptScreen->unlock();
  154. }
  155. break;
  156. case 0xE: // Spieler betritt Chatroom
  157. hauptScreen->lock();
  158. if( nachLogin && nachLogin->zChatLeiste() )
  159. nachLogin->zChatLeiste()->addSpieler( msg.chatroom, msg.account );
  160. hauptScreen->unlock();
  161. break;
  162. case 0xF: // Chatroom Nachricht
  163. hauptScreen->lock();
  164. if( nachLogin && nachLogin->zChatLeiste() )
  165. nachLogin->zChatLeiste()->chatroomNachricht( msg.chatroom, msg.account, msg.message );
  166. hauptScreen->unlock();
  167. break;
  168. case 0x10: // Spieler verlässt Chatroom
  169. hauptScreen->lock();
  170. if( nachLogin && nachLogin->zChatLeiste() )
  171. nachLogin->zChatLeiste()->removeSpieler( msg.chatroom, msg.account );
  172. hauptScreen->unlock();
  173. break;
  174. case 0x11: // Freunde
  175. {
  176. char freundeAnzahl = msg.ids.getEintragAnzahl();
  177. for( int i = 0; i < freundeAnzahl; i++ )
  178. {
  179. if( nachLogin )
  180. {
  181. while( !nachLogin->zFreundesListe() )
  182. {
  183. Sleep( 50 );
  184. }
  185. hauptScreen->lock();
  186. nachLogin->zFreundesListe()->addMember( msg.ids.get( i ) );
  187. hauptScreen->unlock();
  188. }
  189. }
  190. break;
  191. }
  192. case 0x12: // Spieler im Chatroom
  193. {
  194. char anzahl = msg.ids.getEintragAnzahl();
  195. for( char i = 0; i < anzahl; i++ )
  196. {
  197. hauptScreen->lock();
  198. if( nachLogin && nachLogin->zChatLeiste() )
  199. nachLogin->zChatLeiste()->addSpieler( msg.chatroom, msg.ids.get( i ) );
  200. hauptScreen->unlock();
  201. }
  202. break;
  203. }
  204. case 0x13: // Freund online
  205. hauptScreen->lock();
  206. if( nachLogin && nachLogin->zFreundesListe() )
  207. nachLogin->zFreundesListe()->setOnline( msg.account, 1 );
  208. hauptScreen->unlock();
  209. break;
  210. case 0x14: // Freund offline
  211. hauptScreen->lock();
  212. if( nachLogin && nachLogin->zFreundesListe() )
  213. nachLogin->zFreundesListe()->setOnline( msg.account, 0 );
  214. hauptScreen->unlock();
  215. break;
  216. case 0x15: // Chatroom Admin
  217. hauptScreen->lock();
  218. if( nachLogin && nachLogin->zChatLeiste() )
  219. nachLogin->zChatLeiste()->setChatroomAdmin( msg.account );
  220. hauptScreen->unlock();
  221. break;
  222. case 0x16: // Chatroom Kick
  223. hauptScreen->lock();
  224. if( nachLogin && nachLogin->zChatLeiste() )
  225. nachLogin->zChatLeiste()->removeChat( 0, msg.chatroom );
  226. hauptScreen->unlock();
  227. break;
  228. case 0x17: // Spieler betritt Gruppe
  229. if( nachLogin && nachLogin->zSpielenFenster() )
  230. nachLogin->zSpielenFenster()->spielerBetrittGruppe( msg.gruppe, msg.account );
  231. break;
  232. case 0x18: // Spieler verlässt Gruppe
  233. if( nachLogin && nachLogin->zSpielenFenster() )
  234. nachLogin->zSpielenFenster()->spielerVerlässtGruppe( msg.gruppe, msg.account );
  235. break;
  236. case 0x19: // gruppe Nachricht
  237. if( nachLogin && nachLogin->zSpielenFenster() )
  238. nachLogin->zSpielenFenster()->gruppeNachricht( msg.gruppe, msg.message );
  239. break;
  240. case 0x1A: // gruppe Angemeldet
  241. if( nachLogin && nachLogin->zSpielenFenster() )
  242. nachLogin->zSpielenFenster()->gruppeAnmelden( msg.gruppe );
  243. break;
  244. case 0x1B: // gruppe Abgemeldet
  245. if( nachLogin && nachLogin->zSpielenFenster() )
  246. nachLogin->zSpielenFenster()->gruppeAbmelden( msg.gruppe );
  247. break;
  248. case 0x1C: // gruppe Spiel starten
  249. if( nachLogin && nachLogin->zSpielenFenster() )
  250. nachLogin->zSpielenFenster()->setGruppeSpielStarten( msg.gruppe, msg.account == 1 );
  251. break;
  252. case 0x1D: // kick aus Gruppe
  253. if( nachLogin && nachLogin->zSpielenFenster() )
  254. nachLogin->zSpielenFenster()->kickAusGruppe( msg.gruppe );
  255. break;
  256. case 0x1E: // gruppe Admin
  257. if( nachLogin && nachLogin->zSpielenFenster() )
  258. nachLogin->zSpielenFenster()->setGruppeAdmin( msg.gruppe, msg.account );
  259. break;
  260. case 0x1F: // gruppe Einladung abgelehnt
  261. if( nachLogin && nachLogin->zSpielenFenster() )
  262. nachLogin->zSpielenFenster()->gruppeEinadungAbgelehnt( msg.gruppe, msg.account );
  263. break;
  264. case 0x20: // SpielServer Verbindungs Anfrage
  265. if( smProcessor )
  266. smProcessor = smProcessor->release();
  267. if( spielClient )
  268. spielClient = spielClient->release();
  269. spielClient = msg.client;
  270. spielClient->verbinde();
  271. smProcessor = new SpielMessageProcessor();
  272. break;
  273. case 0x21: // Gruppe Einladung abgebrochen
  274. if( nachLogin && nachLogin->zSpielenFenster() )
  275. nachLogin->zSpielenFenster()->gruppeEinladungAbgebrochen( msg.gruppe, msg.account );
  276. break;
  277. case 0x22: // Gruppe Einladung hinzufügen
  278. if( nachLogin && nachLogin->zSpielenFenster() )
  279. nachLogin->zSpielenFenster()->gruppeEinladungNeu( msg.gruppe, msg.account );
  280. break;
  281. default: // Unbekannte Servernachricht
  282. if( nachLogin && nachLogin->zNachrichtenListe() )
  283. {
  284. hauptScreen->lock();
  285. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
  286. new Text( "Unbekannte Nachricht vom Server. Eventuel ist der Client nicht mehr Aktuell." ),
  287. new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
  288. hauptScreen->unlock();
  289. }
  290. break;
  291. }
  292. }
  293. }
  294. ChatMessageProcessor *ChatMessageProcessor::getThis()
  295. {
  296. ref++;
  297. return this;
  298. }
  299. ChatMessageProcessor *ChatMessageProcessor::release()
  300. {
  301. if( !--ref )
  302. delete this;
  303. return 0;
  304. }