ChatClient.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912
  1. #include "ChatClient.h"
  2. #include "Keys.h"
  3. #include <Klient.h>
  4. #include <Globals.h>
  5. using namespace KSGClient;
  6. // Inhalt der ChatClient Klasse
  7. // Konstruktor
  8. ChatClient::ChatClient( int klientId, unsigned short port, char *ip, char *key, unsigned char keyLen )
  9. {
  10. ref = 1;
  11. this->ip = ip;
  12. this->port = port;
  13. cId = klientId;
  14. senden = 0;
  15. empfangen = 0;
  16. this->key = new char[ keyLen ];
  17. memcpy( this->key, key, keyLen );
  18. this->keyLen = keyLen;
  19. }
  20. // Destruktor
  21. ChatClient::~ChatClient()
  22. {
  23. trenne( 1 );
  24. delete[] key;
  25. }
  26. // verbindet sich mit dem zugewiesenen Chat Server
  27. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  28. bool ChatClient::verbinde()
  29. {
  30. cs.lock();
  31. if( senden )
  32. {
  33. cs.unlock();
  34. return 1;
  35. }
  36. senden = new Network::Klient();
  37. int keyLen = 0;
  38. char *key = 0;
  39. Keys::getServerKey( &key, keyLen, Keys::CHAT, Keys::SENDEN );
  40. senden->setSendeKey( key, keyLen );
  41. delete[] key;
  42. Keys::getServerKey( &key, keyLen, Keys::CHAT, Keys::EMPFANGEN );
  43. senden->setEmpfangKey( key, keyLen );
  44. delete[] key;
  45. if( senden->verbinde( port, ip ) )
  46. {
  47. if( senden->sendeEncrypted( "\1", 1 ) )
  48. {
  49. senden->sendeEncrypted( (char*)&cId, 4 );
  50. char ret = 0;
  51. senden->getNachrichtEncrypted( &ret, 1 );
  52. if( ret != 1 )
  53. {
  54. char byte = 0;
  55. senden->getNachrichtEncrypted( &byte, 1 );
  56. char *f = new char[ byte + 1 ];
  57. f[ byte ] = 0;
  58. senden->getNachrichtEncrypted( f, byte );
  59. err = f;
  60. delete[]f;
  61. senden->sendeEncrypted( "\3", 1 );
  62. char serverReturn = 0;
  63. senden->getNachrichtEncrypted( &serverReturn, 1 );
  64. senden->trenne();
  65. senden = senden->release();
  66. cs.unlock();
  67. return 0;
  68. }
  69. senden->setSendeKey( this->key, this->keyLen );
  70. senden->setEmpfangKey( this->key, this->keyLen );
  71. empfangen = new Network::Klient();
  72. int keyLen = 0;
  73. char *key = 0;
  74. Keys::getServerKey( &key, keyLen, Keys::CHAT, Keys::SENDEN );
  75. empfangen->setSendeKey( key, keyLen );
  76. delete[] key;
  77. Keys::getServerKey( &key, keyLen, Keys::CHAT, Keys::EMPFANGEN );
  78. empfangen->setEmpfangKey( key, keyLen );
  79. delete[] key;
  80. if( empfangen->verbinde( senden->getServerPort(), senden->getServerIp() ) )
  81. {
  82. empfangen->sendeEncrypted( "\1", 1 );
  83. empfangen->sendeEncrypted( (char*)&cId, 4 );
  84. char res = 0;
  85. empfangen->getNachrichtEncrypted( &res, 1 );
  86. if( res == 1 )
  87. {
  88. empfangen->setSendeKey( this->key, this->keyLen );
  89. empfangen->setEmpfangKey( this->key, this->keyLen );
  90. cs.unlock();
  91. return 1;
  92. }
  93. if( res == 3 )
  94. {
  95. char län = 0;
  96. senden->getNachrichtEncrypted( &län, 1 );
  97. char *nachricht = new char[ län + 1 ];
  98. nachricht[ län ] = 0;
  99. senden->getNachrichtEncrypted( nachricht, län );
  100. err = nachricht;
  101. delete[]nachricht;
  102. }
  103. trenne( 0 );
  104. }
  105. else
  106. {
  107. err = "Der dir zugewiesene Chat Server kann dir keine Nachrichten senden.";
  108. empfangen = empfangen->release();
  109. senden->sendeEncrypted( "\3", 1 );
  110. char serverReturn = 0;
  111. senden->getNachrichtEncrypted( &serverReturn, 1 );
  112. senden->trenne();
  113. senden = senden->release();
  114. cs.unlock();
  115. return 0;
  116. }
  117. }
  118. else
  119. {
  120. err = "Der dir zugewiesene Chat Server hat die Verbindung abgebrochen. Bitte versuche es Später erneut.";
  121. senden = senden->release();
  122. cs.unlock();
  123. return 0;
  124. }
  125. }
  126. else
  127. {
  128. err = "Der dir zugewiesene Chat Server antwortet nicht. Bitte versuche es Später erneut.";
  129. senden = senden->release();
  130. cs.unlock();
  131. return 0;
  132. }
  133. err = "Unbekannter Fehler";
  134. cs.unlock();
  135. return 0;
  136. }
  137. // sendet eine Chat Nachricht zu einem Account
  138. // zuAccount: Id des Ziel Accounts
  139. // nachricht: Die Nachricht
  140. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  141. bool ChatClient::chatNachricht( int zuAccount, const char *nachricht )
  142. {
  143. cs.lock();
  144. if( !senden )
  145. {
  146. err = "Der Client ist nicht verbunden.";
  147. cs.unlock();
  148. return 0;
  149. }
  150. char län = textLength( nachricht );
  151. if( !län )
  152. {
  153. cs.unlock();
  154. return 1;
  155. }
  156. senden->sendeEncrypted( "\6", 1 );
  157. char serverReturn = 0;
  158. senden->getNachrichtEncrypted( &serverReturn, 1 );
  159. if( serverReturn )
  160. {
  161. senden->sendeEncrypted( (char*)&zuAccount, 4 );
  162. senden->sendeEncrypted( &län, 1 );
  163. senden->sendeEncrypted( nachricht, län );
  164. }
  165. else
  166. {
  167. err = "Fehler beim senden der Nachricht.";
  168. cs.unlock();
  169. return 0;
  170. }
  171. cs.unlock();
  172. return 1;
  173. }
  174. // ändert den angezeigten Account Namen
  175. // name: der neue Name
  176. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  177. bool ChatClient::accountNameÄndern( const char *name )
  178. {
  179. cs.lock();
  180. if( !senden )
  181. {
  182. err = "Der Client ist nicht verbunden.";
  183. cs.unlock();
  184. return 0;
  185. }
  186. char län = textLength( name );
  187. if( !län )
  188. {
  189. cs.unlock();
  190. return 0;
  191. }
  192. senden->sendeEncrypted( "\x8", 1 );
  193. char serverReturn = 0;
  194. senden->getNachrichtEncrypted( &serverReturn, 1 );
  195. if( serverReturn )
  196. {
  197. senden->sendeEncrypted( &län, 1 );
  198. senden->sendeEncrypted( name, län );
  199. senden->getNachrichtEncrypted( &serverReturn, 1 );
  200. if( serverReturn == 1 )
  201. {
  202. cs.unlock();
  203. return 1;
  204. }
  205. }
  206. err = "Fehler beim ändern des Namens.";
  207. cs.unlock();
  208. return 0;
  209. }
  210. // beendet die Freundschaft mit einem Account
  211. // accountId: Die Id des Accounts
  212. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  213. bool ChatClient::freundschaftBeenden( int accountId )
  214. {
  215. cs.lock();
  216. if( !senden )
  217. {
  218. err = "Der Client ist nicht verbunden.";
  219. cs.unlock();
  220. return 0;
  221. }
  222. senden->sendeEncrypted( "\x9", 1 );
  223. char serverReturn = 0;
  224. senden->getNachrichtEncrypted( &serverReturn, 1 );
  225. if( serverReturn )
  226. {
  227. senden->sendeEncrypted( (char*)&accountId, 4 );
  228. senden->getNachrichtEncrypted( &serverReturn, 1 );
  229. if( serverReturn == 1 )
  230. {
  231. cs.unlock();
  232. return 1;
  233. }
  234. }
  235. err = "Fehler beim beenden der Freundschaft.";
  236. cs.unlock();
  237. return 0;
  238. }
  239. // sendet eine Freundesanfragezu einem Account
  240. // accountId: Die Id des Accounts
  241. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  242. bool ChatClient::freundesAnfrage( int accountId )
  243. {
  244. cs.lock();
  245. if( !senden )
  246. {
  247. err = "Der Client ist nicht verbunden.";
  248. cs.unlock();
  249. return 0;
  250. }
  251. senden->sendeEncrypted( "\xA", 1 );
  252. char serverReturn = 0;
  253. senden->getNachrichtEncrypted( &serverReturn, 1 );
  254. if( serverReturn )
  255. {
  256. senden->sendeEncrypted( (char*)&accountId, 4 );
  257. senden->getNachrichtEncrypted( &serverReturn, 1 );
  258. if( serverReturn == 1 )
  259. {
  260. cs.unlock();
  261. return 1;
  262. }
  263. }
  264. err = "Fehler beim senden der Freundschaftsanfrage.";
  265. cs.unlock();
  266. return 0;
  267. }
  268. // beantwortet eine Freundesanfrage
  269. // accountId: Die Id des Accounts
  270. // ja: 1:=annehmen,0:=ablehnen
  271. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  272. bool ChatClient::freundesAnfrageBeantworten( int accountId, bool ja )
  273. {
  274. cs.lock();
  275. if( !senden )
  276. {
  277. err = "Der Client ist nicht verbunden.";
  278. cs.unlock();
  279. return 0;
  280. }
  281. senden->sendeEncrypted( "\xB", 1 );
  282. char serverReturn = 0;
  283. senden->getNachrichtEncrypted( &serverReturn, 1 );
  284. if( serverReturn )
  285. {
  286. senden->sendeEncrypted( (char*)&accountId, 4 );
  287. char ok = (char)ja;
  288. senden->sendeEncrypted( &ok, 1 );
  289. senden->getNachrichtEncrypted( &serverReturn, 1 );
  290. if( serverReturn == 1 )
  291. {
  292. cs.unlock();
  293. return 1;
  294. }
  295. }
  296. err = "Fehler beim beantworten der Freundschaftsanfrage.";
  297. cs.unlock();
  298. return 0;
  299. }
  300. // erstellt ein chatroom
  301. // name: Der Name des Chatrooms
  302. // Gibt bei erfolg die Id des Chatrooms zurück, 0 sonst
  303. int ChatClient::chatroomErstellen( const char *name )
  304. {
  305. cs.lock();
  306. if( !senden )
  307. {
  308. err = "Der Client ist nicht verbunden.";
  309. cs.unlock();
  310. return 0;
  311. }
  312. char län = textLength( name );
  313. if( !län )
  314. {
  315. cs.unlock();
  316. return 0;
  317. }
  318. senden->sendeEncrypted( "\xC", 1 );
  319. char serverReturn = 0;
  320. senden->getNachrichtEncrypted( &serverReturn, 1 );
  321. if( serverReturn )
  322. {
  323. senden->sendeEncrypted( &län, 1 );
  324. senden->sendeEncrypted( name, län );
  325. senden->getNachrichtEncrypted( &serverReturn, 1 );
  326. if( serverReturn == 1 )
  327. {
  328. int ret = 0;
  329. senden->getNachrichtEncrypted( (char*)&ret, 4 );
  330. cs.unlock();
  331. return ret;
  332. }
  333. }
  334. err = "Fehler beim erstellen des Chatrooms.";
  335. cs.unlock();
  336. return 0;
  337. }
  338. // Sendet eine Einladung zum Chatroom
  339. // accountId: Die Id des Accounts der eingeladen werden soll
  340. // chatroomId: Die Id des Chatrooms
  341. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  342. bool ChatClient::chatroomEinladung( int accountId, int chatroomId )
  343. {
  344. cs.lock();
  345. if( !senden )
  346. {
  347. err = "Der Client ist nicht verbunden.";
  348. cs.unlock();
  349. return 0;
  350. }
  351. senden->sendeEncrypted( "\xD", 1 );
  352. char serverReturn = 0;
  353. senden->getNachrichtEncrypted( &serverReturn, 1 );
  354. if( serverReturn )
  355. {
  356. senden->sendeEncrypted( (char*)&accountId, 4 );
  357. senden->sendeEncrypted( (char*)&chatroomId, 4 );
  358. senden->getNachrichtEncrypted( &serverReturn, 1 );
  359. if( serverReturn == 1 )
  360. {
  361. cs.unlock();
  362. return 1;
  363. }
  364. }
  365. err = "Fehler beim senden der Chatroomeinladung.";
  366. cs.unlock();
  367. return 0;
  368. }
  369. // Einladung zum Chatroom wird abgelehnt
  370. // accountId: Die Id des Accounts
  371. // chatroomId: Die Id des Chatrooms
  372. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  373. bool ChatClient::chatroomEinladungAblehnen( int accountId, int chatroomId )
  374. {
  375. cs.lock();
  376. if( !senden )
  377. {
  378. err = "Der Client ist nicht verbunden.";
  379. cs.unlock();
  380. return 0;
  381. }
  382. senden->sendeEncrypted( "\xE", 1 );
  383. char serverReturn = 0;
  384. senden->getNachrichtEncrypted( &serverReturn, 1 );
  385. if( serverReturn )
  386. {
  387. senden->sendeEncrypted( (char*)&accountId, 4 );
  388. senden->sendeEncrypted( (char*)&chatroomId, 4 );
  389. senden->getNachrichtEncrypted( &serverReturn, 1 );
  390. if( serverReturn == 1 )
  391. {
  392. cs.unlock();
  393. return 1;
  394. }
  395. }
  396. err = "Fehler beim beantworten der Chatroomeinladung.";
  397. cs.unlock();
  398. return 0;
  399. }
  400. // betritt ein chatroom
  401. // chatroomId: Die Id des Chatrooms
  402. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  403. bool ChatClient::chatroomBetreten( int chatroomId )
  404. {
  405. cs.lock();
  406. if( !senden )
  407. {
  408. err = "Der Client ist nicht verbunden.";
  409. cs.unlock();
  410. return 0;
  411. }
  412. senden->sendeEncrypted( "\xF", 1 );
  413. char serverReturn = 0;
  414. senden->getNachrichtEncrypted( &serverReturn, 1 );
  415. if( serverReturn )
  416. {
  417. senden->sendeEncrypted( (char*)&chatroomId, 4 );
  418. senden->getNachrichtEncrypted( &serverReturn, 1 );
  419. if( serverReturn == 1 )
  420. {
  421. cs.unlock();
  422. return 1;
  423. }
  424. }
  425. err = "Fehler beim betreten des Chatrooms.";
  426. cs.unlock();
  427. return 0;
  428. }
  429. // chatroom Nachricht senden
  430. // chatroomId: Die Id des Chatrooms
  431. // nachricht: Die Nachricht die gesendet werden soll
  432. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  433. bool ChatClient::chatroomNachricht( int chatroomId, const char *nachricht )
  434. {
  435. cs.lock();
  436. if( !senden )
  437. {
  438. err = "Der Client ist nicht verbunden.";
  439. cs.unlock();
  440. return 0;
  441. }
  442. char län = textLength( nachricht );
  443. if( !län )
  444. {
  445. cs.unlock();
  446. return 0;
  447. }
  448. senden->sendeEncrypted( "\x10", 1 );
  449. char serverReturn = 0;
  450. senden->getNachrichtEncrypted( &serverReturn, 1 );
  451. if( serverReturn )
  452. {
  453. senden->sendeEncrypted( (char*)&chatroomId, 4 );
  454. senden->sendeEncrypted( &län, 1 );
  455. senden->sendeEncrypted( nachricht, län );
  456. senden->getNachrichtEncrypted( &serverReturn, 1 );
  457. if( serverReturn == 1 )
  458. {
  459. cs.unlock();
  460. return 1;
  461. }
  462. }
  463. err = "Fehler beim senden der Nachricht.";
  464. cs.unlock();
  465. return 0;
  466. }
  467. // verlässt chatroom
  468. // chatroomId: Die Id des Chatrooms
  469. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  470. bool ChatClient::chatroomVerlassen( int chatroomId )
  471. {
  472. cs.lock();
  473. if( !senden )
  474. {
  475. err = "Der Client ist nicht verbunden.";
  476. cs.unlock();
  477. return 0;
  478. }
  479. senden->sendeEncrypted( "\x11", 1 );
  480. char serverReturn = 0;
  481. senden->getNachrichtEncrypted( &serverReturn, 1 );
  482. if( serverReturn )
  483. {
  484. senden->sendeEncrypted( (char*)&chatroomId, 4 );
  485. senden->getNachrichtEncrypted( &serverReturn, 1 );
  486. if( serverReturn == 1 )
  487. {
  488. cs.unlock();
  489. return 1;
  490. }
  491. }
  492. err = "Fehler beim verlassen des Chatrooms.";
  493. cs.unlock();
  494. return 0;
  495. }
  496. // kickt Account aus Chatroom (nur wenn als admin des Chatrooms eingeloggt)
  497. // chatroomId: Die Id des Chatrooms
  498. // accountId: Die Id des Accounts
  499. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  500. bool ChatClient::chatroomKick( int chatroomId, int accountId )
  501. {
  502. cs.lock();
  503. if( !senden )
  504. {
  505. err = "Der Client ist nicht verbunden.";
  506. cs.unlock();
  507. return 0;
  508. }
  509. senden->sendeEncrypted( "\x12", 1 );
  510. char serverReturn = 0;
  511. senden->getNachrichtEncrypted( &serverReturn, 1 );
  512. if( serverReturn )
  513. {
  514. senden->sendeEncrypted( (char*)&chatroomId, 4 );
  515. senden->sendeEncrypted( (char*)&accountId, 4 );
  516. senden->getNachrichtEncrypted( &serverReturn, 1 );
  517. if( serverReturn == 1 )
  518. {
  519. cs.unlock();
  520. return 1;
  521. }
  522. }
  523. err = "Fehler beim kicken eines Spielers aus dem Chatroom.";
  524. cs.unlock();
  525. return 0;
  526. }
  527. // fragt nach allen freunden
  528. // Die Liste der Freunde kann über getNextMessage empfangen werden
  529. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  530. bool ChatClient::freundesListeAnfragen()
  531. {
  532. cs.lock();
  533. if( !senden )
  534. {
  535. err = "Der Client ist nicht verbunden.";
  536. cs.unlock();
  537. return 0;
  538. }
  539. char serverReturn = 0;
  540. senden->sendeEncrypted( "\x13", 1 );
  541. senden->getNachrichtEncrypted( &serverReturn, 1 );
  542. if( serverReturn == 1 )
  543. {
  544. cs.unlock();
  545. return 1;
  546. }
  547. err = "Fehler beim Anfragen der Freundesliste.";
  548. cs.unlock();
  549. return 0;
  550. }
  551. // fragt nach allen chatnachrichten, die gesendet wurden, während der Account in den der Client eingeloggt ist, offline war
  552. // Die einzelnen Nachrichten können über getNextMessage empfangen werden
  553. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  554. bool ChatClient::chatNachrichtAnfrage()
  555. {
  556. cs.lock();
  557. if( !senden )
  558. {
  559. err = "Der Client ist nicht verbunden.";
  560. cs.unlock();
  561. return 0;
  562. }
  563. char serverReturn = 0;
  564. senden->sendeEncrypted( "\x14", 1 );
  565. senden->getNachrichtEncrypted( &serverReturn, 1 );
  566. if( serverReturn == 1 )
  567. {
  568. cs.unlock();
  569. return 1;
  570. }
  571. err = "Fehler beim Anfragen der Chatnachrichten.";
  572. cs.unlock();
  573. return 0;
  574. }
  575. // Erhält die Verbindung aufrecht
  576. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  577. // Sollte während einer bestehenden Verbindung etwa einmal alle 60 Sekunden aufgerufen werden, da sonst der Router die Verbindung automatisch trennt
  578. bool ChatClient::keepAlive()
  579. {
  580. if( !senden )
  581. return 0;
  582. char res = 0;
  583. if( !cs.tryLock() )
  584. return 1;
  585. Framework::logLine( ( char* )"Verbindungstest zum Chat Server..." );
  586. bool ok = senden->sendeEncrypted( "\x15", 1 );
  587. ok &= senden->getNachrichtEncrypted( &res, 1 );
  588. cs.unlock();
  589. if( res != 1 || !ok )
  590. {
  591. Framework::logLine( ( char* )"Verbindungsabbruch." );
  592. trenne( 0 );
  593. }
  594. else
  595. Framework::logLine( ( char* )"Verbindung besteht." );
  596. return res == 1;
  597. }
  598. // Trennt die Verbindung zum Server
  599. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  600. // Sollte erst nach einem erfolgreichen Aufruf von verbinde aufgerufen werden
  601. bool ChatClient::trenne( bool abmelden )
  602. {
  603. if( !senden )
  604. return 1;
  605. cs.lock();
  606. senden->sendeEncrypted( "\3", 1 );
  607. char serverReturn = 0;
  608. senden->getNachrichtEncrypted( &serverReturn, 1 );
  609. senden->trenne();
  610. senden = senden->release();
  611. if( empfangen )
  612. {
  613. empfangen->trenne();
  614. empfangen = empfangen->release();
  615. }
  616. cs.unlock();
  617. return 1;
  618. }
  619. // Wartet auf eine Nachricht vom Chatserver.
  620. // Gibt bei Erfolg 1 zurück, 0 sonnst
  621. // nachricht: Eine Referenz auf die Struktur, in der die Nachricht gespeichert werden soll
  622. bool ChatClient::getNextMessage( ChatServerNachricht &nachricht )
  623. {
  624. if( !empfangen )
  625. {
  626. err = "Der Client ist nicht verbunden.";
  627. return 0;
  628. }
  629. do
  630. {
  631. if( !empfangen->getNachrichtEncrypted( &nachricht.type, 1 ) )
  632. {
  633. err = "Fehler beim Empfangen der Nachricht.";
  634. return 0;
  635. }
  636. switch( nachricht.type )
  637. {
  638. case 3: // Fehler
  639. if( 1 )
  640. {
  641. char länge = 0;
  642. empfangen->getNachrichtEncrypted( &länge, 1 );
  643. char *txt = new char[ länge + 1 ];
  644. txt[ länge ] = 0;
  645. empfangen->getNachrichtEncrypted( txt, länge );
  646. nachricht.message = txt;
  647. delete[] txt;
  648. }
  649. break;
  650. case 4: // Chat Nachricht
  651. if( 1 )
  652. {
  653. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  654. char länge = 0;
  655. empfangen->getNachrichtEncrypted( &länge, 1 );
  656. char *txt = new char[ länge + 1 ];
  657. txt[ länge ] = 0;
  658. empfangen->getNachrichtEncrypted( txt, länge );
  659. nachricht.message = txt;
  660. delete[] txt;
  661. }
  662. break;
  663. case 5: // Spiel Einladung
  664. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  665. empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
  666. break;
  667. case 6: // Account Status ändert sich
  668. if( 1 )
  669. {
  670. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  671. char län = 0;
  672. empfangen->getNachrichtEncrypted( &län, 1 );
  673. char *status = new char[ län + 1 ];
  674. status[ län ] = 0;
  675. empfangen->getNachrichtEncrypted( status, län );
  676. nachricht.message = status;
  677. delete[] status;
  678. }
  679. break;
  680. case 7: // Account Name ändert sich
  681. if( 1 )
  682. {
  683. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  684. char län = 0;
  685. empfangen->getNachrichtEncrypted( &län, 1 );
  686. char *name = new char[ län + 1 ];
  687. name[ län ] = 0;
  688. empfangen->getNachrichtEncrypted( name, län );
  689. nachricht.message = name;
  690. delete[] name;
  691. }
  692. break;
  693. case 8: // kein Freund mehr
  694. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  695. break;
  696. case 9: // Freundesanfrage
  697. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  698. break;
  699. case 0xA: // Neuer Freund
  700. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  701. break;
  702. case 0xB: // Freundesanfrage abgelehnt
  703. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  704. break;
  705. case 0xC: // Einladung zum Chatroom
  706. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  707. empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
  708. break;
  709. case 0xD: // Einladung zum Chatroom abgelehnt
  710. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  711. empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
  712. break;
  713. case 0xE: // Spieler betritt Chatroom
  714. empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
  715. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  716. break;
  717. case 0xF: // Chatroom Nachricht
  718. if( 1 )
  719. {
  720. empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
  721. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  722. char län = 0;
  723. empfangen->getNachrichtEncrypted( &län, 1 );
  724. char *txt = new char[ län + 1 ];
  725. txt[ län ] = 0;
  726. if( län )
  727. {
  728. empfangen->getNachrichtEncrypted( txt, län );
  729. nachricht.message = txt;
  730. }
  731. delete[] txt;
  732. }
  733. break;
  734. case 0x10: // Spieler verlässt Chatroom
  735. empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
  736. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  737. break;
  738. case 0x11: // Freunde
  739. if( 1 )
  740. {
  741. char freundeAnzahl;
  742. empfangen->getNachrichtEncrypted( &freundeAnzahl, 1 );
  743. for( int i = 0; i < freundeAnzahl; i++ )
  744. {
  745. int accountId = 0;
  746. empfangen->getNachrichtEncrypted( (char*)&accountId, 4 );
  747. nachricht.ids.add( accountId );
  748. }
  749. }
  750. break;
  751. case 0x12: // Spieler im Chatroom
  752. if( 1 )
  753. {
  754. empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
  755. char anzahl = 0;
  756. empfangen->getNachrichtEncrypted( &anzahl, 1 );
  757. for( char i = 0; i < anzahl; i++ )
  758. {
  759. int accountId = 0;
  760. empfangen->getNachrichtEncrypted( (char*)&accountId, 4 );
  761. nachricht.ids.add( accountId );
  762. }
  763. }
  764. break;
  765. case 0x13: // Freund online
  766. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  767. break;
  768. case 0x14: // Freund offline
  769. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  770. break;
  771. case 0x15: // Chatroom Admin
  772. empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
  773. break;
  774. case 0x16: // Chatroom Kick
  775. empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
  776. break;
  777. case 0x17: // Spieler betritt Gruppe
  778. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  779. empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
  780. break;
  781. case 0x18: // Spieler verlässt Gruppe
  782. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  783. empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
  784. break;
  785. case 0x19: // gruppe Nachricht
  786. if( 1 )
  787. {
  788. char län = 0;
  789. empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
  790. empfangen->getNachrichtEncrypted( &län, 1 );
  791. if( län )
  792. {
  793. char *txt = new char[ län + 1 ];
  794. txt[ län ] = 0;
  795. empfangen->getNachrichtEncrypted( txt, län );
  796. nachricht.message = txt;
  797. delete[] txt;
  798. }
  799. }
  800. break;
  801. case 0x1A: // gruppe Angemeldet
  802. empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
  803. break;
  804. case 0x1B: // gruppe Abgemeldet
  805. empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
  806. break;
  807. case 0x1C: // gruppe Spiel starten
  808. if( 1 )
  809. {
  810. char starten = 0;
  811. empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
  812. empfangen->getNachrichtEncrypted( &starten, 1 );
  813. nachricht.account = starten;
  814. }
  815. break;
  816. case 0x1D: // kick aus Gruppe
  817. empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
  818. break;
  819. case 0x1E: // gruppe Admin
  820. empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
  821. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  822. break;
  823. case 0x1F: // gruppe Einladung abgelehnt
  824. empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
  825. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  826. break;
  827. case 0x20: // SpielServer Verbindungs Anfrage
  828. if( 1 )
  829. {
  830. unsigned short port;
  831. unsigned char *ip = new unsigned char[ 4 ];
  832. empfangen->getNachrichtEncrypted( (char*)&port, 2 );
  833. empfangen->getNachrichtEncrypted( (char*)ip, 4 );
  834. nachricht.account = port;
  835. Text *ipT = new Text( "" );
  836. ipT->append( (int)ip[ 0 ] );
  837. ipT->append( "." );
  838. ipT->append( (int)ip[ 1 ] );
  839. ipT->append( "." );
  840. ipT->append( (int)ip[ 2 ] );
  841. ipT->append( "." );
  842. ipT->append( (int)ip[ 3 ] );
  843. nachricht.message = ipT->getText();
  844. delete[] ip;
  845. ipT->release();
  846. }
  847. break;
  848. case 0x21: // Gruppe Einladung abgebrochen
  849. empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
  850. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  851. break;
  852. case 0x22: // Gruppe Einladung hinzufügen
  853. empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
  854. empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
  855. break;
  856. case 0x23: // ping
  857. empfangen->sendeEncrypted( "\1", 1 );
  858. break;
  859. }
  860. } while( nachricht.type == 0x23 );
  861. }
  862. // Gibt 1 zurück, falls der Client verbunden ist, 0 sonst
  863. bool ChatClient::istVerbunden() const
  864. {
  865. return senden != 0;
  866. }
  867. // gibt den Letzten Fehlertext zuück
  868. // sollte erst aufgerufen werden, nachdem eine andere aufgerufene Methode fehlgeschlagen ist
  869. char *ChatClient::getLetzterFehler() const
  870. {
  871. return err;
  872. }
  873. // Erhöht den Reference Counter um 1 un gibt this zurück
  874. ChatServerClient *ChatClient::getThis()
  875. {
  876. ref++;
  877. return this;
  878. }
  879. // Verringert den Reference Counter um 1 und gibt 0 zurück.
  880. // Falls der Reference Counter nach dem Aufruf auf 0 ist löscht sich das Objekt selbst
  881. ChatServerClient *ChatClient::release()
  882. {
  883. if( !--ref )
  884. delete this;
  885. return 0;
  886. }