ChatClient.cpp 22 KB

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