ErhaltungServer.cpp 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476
  1. #include "ErhaltungServer.h"
  2. #include <iostream>
  3. #include <Klient.h>
  4. #include <Globals.h>
  5. #ifndef WIN32
  6. #include <unistd.h>
  7. #define Sleep( x ) usleep( (x) * 1000 )
  8. #endif
  9. // Inhalt der ErhaltungServer Klasse aus ErhaltungServer.h
  10. // Konstruktor
  11. ErhaltungServer::ErhaltungServer( InitDatei *zIni )
  12. : Thread()
  13. {
  14. Network::Start( 100 );
  15. std::cout << "ES: Verbindung mit Datenbank wird hergestellt...\n";
  16. db = new ESDatenbank( zIni );
  17. empfangen = 0;
  18. gesendet = 0;
  19. clients = 0;
  20. fehler = new Text();
  21. ini = zIni->getThis();
  22. id = *zIni->zWert( "ServerId" );
  23. server = new Server();
  24. aServer = new Server();
  25. std::cout << "ES: Starten des Admin Servers...\n";
  26. if( !aServer->verbinde( (unsigned short)TextZuInt( ini->zWert( "AdminServerPort" )->getText(), 10 ), 10 ) )
  27. {
  28. std::cout << "ES: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
  29. exit( 1 );
  30. }
  31. db->setServerStatus( id, 2 );
  32. end = 0;
  33. nichtPausiert = 0;
  34. ref = 1;
  35. if( zIni->zWert( "Aktiv" )->istGleich( "TRUE" ) )
  36. {
  37. serverStarten();
  38. serverFortsetzen();
  39. }
  40. }
  41. // Destruktor
  42. ErhaltungServer::~ErhaltungServer()
  43. {
  44. fehler->release();
  45. server->trenne();
  46. server->release();
  47. aServer->trenne();
  48. aServer->release();
  49. ini->release();
  50. db->release();
  51. }
  52. void ErhaltungServer::runn()
  53. {
  54. while( !end )
  55. {
  56. SKlient *klient;
  57. klient = aServer->getKlient();
  58. if( end && klient )
  59. {
  60. klient->trenne();
  61. klient = klient->release();
  62. Sleep( 1000 );
  63. return;
  64. }
  65. if( !klient )
  66. return;
  67. ESAKlient *clHandle = new ESAKlient( klient, getThis() );
  68. clHandle->start();
  69. }
  70. }
  71. void ErhaltungServer::thread()
  72. {
  73. while( 1 )
  74. {
  75. SKlient *klient;
  76. klient = server->getKlient();
  77. if( !klient )
  78. break;
  79. Framework::getThreadRegister()->cleanUpClosedThreads();
  80. ESKlient *clHandle = new ESKlient( klient, getThis() );
  81. clients++;
  82. clHandle->start();
  83. }
  84. }
  85. void ErhaltungServer::close()
  86. {
  87. db->setServerStatus( id, 1 );
  88. server->trenne();
  89. #ifdef WIN32
  90. warteAufThread( 1000 );
  91. #endif
  92. ende();
  93. run = 0;
  94. end = 1;
  95. Klient *klient = new Klient();
  96. klient->verbinde( aServer->getPort(), "127.0.0.1" );
  97. Sleep( 500 );
  98. aServer->trenne();
  99. klient->release();
  100. }
  101. // nicht constant
  102. bool ErhaltungServer::serverStarten()
  103. {
  104. if( nichtPausiert )
  105. {
  106. fehler->setText( "Der Server konnte nicht gestartet werden: Der Server läuft bereits." );
  107. return 0;
  108. }
  109. if( server )
  110. server->release();
  111. server = new Server();
  112. if( server->verbinde( (unsigned short)TextZuInt( ini->zWert( "ServerPort" )->getText(), 10 ), 10 ) )
  113. {
  114. nichtPausiert = 1;
  115. start();
  116. return 1;
  117. }
  118. else
  119. {
  120. serverBeenden();
  121. fehler->setText( "Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung." );
  122. return 0;
  123. }
  124. }
  125. bool ErhaltungServer::serverPause()
  126. {
  127. if( !nichtPausiert )
  128. {
  129. fehler->setText( "Der Server konnte nicht pausiert werden: Der Server läuft nicht." );
  130. return 0;
  131. }
  132. if( !db->setServerStatus( id, 2 ) )
  133. {
  134. fehler->setText( "Der Server konnte nicht pausiert werden: " );
  135. fehler->append( db->getLetzterFehler() );
  136. return 0;
  137. }
  138. return 1;
  139. }
  140. bool ErhaltungServer::serverFortsetzen()
  141. {
  142. if( !nichtPausiert )
  143. {
  144. fehler->setText( "Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht." );
  145. return 0;
  146. }
  147. if( !db->setServerStatus( id, 3 ) )
  148. {
  149. fehler->setText( "Der Server konnte nicht fortgesetzt werden: " );
  150. fehler->append( db->getLetzterFehler() );
  151. return 0;
  152. }
  153. return 1;
  154. }
  155. bool ErhaltungServer::serverBeenden()
  156. {
  157. if( !nichtPausiert )
  158. {
  159. fehler->setText( "Der Server konnte nicht beendet werden: Der Server läuft nicht." );
  160. return 0;
  161. }
  162. if( db->serverIstNichtPausiert( id ) )
  163. {
  164. fehler->setText( "Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden." );
  165. return 0;
  166. }
  167. nichtPausiert = 0;
  168. if( server )
  169. server->trenne();
  170. #ifdef WIN32
  171. warteAufThread( 1000 );
  172. #endif
  173. ende();
  174. return 1;
  175. }
  176. bool ErhaltungServer::setMaxKlients( unsigned char mc )
  177. {
  178. if( !db->setMaxClients( id, mc ) )
  179. {
  180. fehler->setText( "Die maximale Anzahl der Clients konnte nicht gesetzt werden:\n" );
  181. fehler->append( db->getLetzterFehler() );
  182. return 0;
  183. }
  184. ini->setWert( "MaxClients", Text() += mc );
  185. return 1;
  186. }
  187. void ErhaltungServer::addGesendet( int bytes )
  188. {
  189. gesendet += bytes;
  190. }
  191. void ErhaltungServer::addEmpfangen( int bytes )
  192. {
  193. empfangen += bytes;
  194. }
  195. void ErhaltungServer::clientTrennung()
  196. {
  197. clients--;
  198. }
  199. // constant
  200. bool ErhaltungServer::istAn() const
  201. {
  202. return db->serverIstNichtPausiert( id );
  203. }
  204. Server *ErhaltungServer::zServer() const
  205. {
  206. return server;
  207. }
  208. ESDatenbank *ErhaltungServer::zDB() const
  209. {
  210. return db;
  211. }
  212. bool ErhaltungServer::hatClients() const
  213. {
  214. return clients > 0;
  215. }
  216. int ErhaltungServer::getId() const
  217. {
  218. return id;
  219. }
  220. char *ErhaltungServer::getLetzterFehler() const
  221. {
  222. return fehler->getText();
  223. }
  224. // Reference Counting
  225. ErhaltungServer *ErhaltungServer::getThis()
  226. {
  227. ref++;
  228. return this;
  229. }
  230. ErhaltungServer *ErhaltungServer::release()
  231. {
  232. ref--;
  233. if( !ref )
  234. delete this;
  235. return 0;
  236. }
  237. // Inhalt der RSAKlient Klasse aus RegisterServer.h
  238. // Konstruktor
  239. ESAKlient::ESAKlient( SKlient *klient, ErhaltungServer *es )
  240. : Thread()
  241. {
  242. this->klient = klient;
  243. unsigned char key[ 20 ] = { 139, 91, 188, 189, 188, 165, 72, 233, 199, 10, 253, 197, 61, 125, 201, 251, 37, 22, 161, 187 };
  244. klient->setSendeKey( (char*)key, 20 );
  245. klient->setEmpfangKey( (char*)key, 20 );
  246. name = new Text( "" );
  247. passwort = new Text( "" );
  248. adminId = 0;
  249. version = 0;
  250. this->es = es;
  251. }
  252. // Destruktor
  253. ESAKlient::~ESAKlient()
  254. {
  255. klient->trenne();
  256. klient->release();
  257. es->release();
  258. name->release();
  259. passwort->release();
  260. }
  261. // nicht constant
  262. void ESAKlient::thread()
  263. {
  264. while( 1 )
  265. {
  266. char c = 0;
  267. if( !klient->getNachrichtEncrypted( &c, 1 ) )
  268. break;
  269. else
  270. {
  271. bool br = 0;
  272. switch( c )
  273. {
  274. case 1: // Login
  275. if( 1 )
  276. {
  277. klient->sendeEncrypted( "\1", 1 );
  278. char nLen = 0;
  279. klient->getNachrichtEncrypted( &nLen, 1 );
  280. char *n = new char[ nLen + 1 ];
  281. n[ (int)nLen ] = 0;
  282. if( nLen )
  283. klient->getNachrichtEncrypted( n, nLen );
  284. char pLen = 0;
  285. klient->getNachrichtEncrypted( &pLen, 1 );
  286. char *p = new char[ pLen + 1 ];
  287. p[ (int)pLen ] = 0;
  288. if( pLen )
  289. klient->getNachrichtEncrypted( p, pLen );
  290. int adminId = es->zDB()->istAdministrator( n, p );
  291. if( adminId )
  292. {
  293. klient->sendeEncrypted( "\1", 1 );
  294. name->setText( n );
  295. passwort->setText( p );
  296. this->adminId = adminId;
  297. }
  298. else
  299. errorZuKlient( "Falsche Kombination aus Name und Passwort." );
  300. delete[] n;
  301. delete[] p;
  302. }
  303. break;
  304. case 2: // Logout
  305. adminId = 0;
  306. name->setText( "" );
  307. passwort->setText( "" );
  308. klient->sendeEncrypted( "\1", 1 );
  309. break;
  310. case 3: // Trennen
  311. br = 1;
  312. klient->sendeEncrypted( "\1", 1 );
  313. break;
  314. case 4: // Server starten
  315. if( !adminId )
  316. errorZuKlient( "Du musst dich einloggen." );
  317. else
  318. {
  319. if( es->zDB()->adminHatRecht( adminId, Admin_Recht::LSStarten ) )
  320. {
  321. if( !es->serverStarten() )
  322. {
  323. Text *err = new Text();
  324. err->append( es->getLetzterFehler() );
  325. errorZuKlient( err->getText() );
  326. err->release();
  327. }
  328. else
  329. klient->sendeEncrypted( "\1", 1 );
  330. }
  331. else
  332. errorZuKlient( "Du bist nicht berechtigt den Server zu starten." );
  333. }
  334. break;
  335. case 5: // Server beenden
  336. if( !adminId )
  337. errorZuKlient( "Du musst dich einloggen." );
  338. else
  339. {
  340. if( es->zDB()->adminHatRecht( adminId, Admin_Recht::LSBeenden ) )
  341. {
  342. if( es->serverBeenden() )
  343. klient->sendeEncrypted( "\1", 1 );
  344. else
  345. {
  346. Text *err = new Text();
  347. err->append( es->getLetzterFehler() );
  348. errorZuKlient( err->getText() );
  349. err->release();
  350. }
  351. }
  352. else
  353. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  354. }
  355. break;
  356. case 6: // Programm Schließen
  357. if( !adminId )
  358. errorZuKlient( "Du musst dich einloggen." );
  359. else
  360. {
  361. bool ok = 0;
  362. if( es->isRunning() )
  363. {
  364. if( es->zDB()->adminHatRecht( adminId, Admin_Recht::LSBeenden ) )
  365. {
  366. if( es->serverBeenden() )
  367. ok = 1;
  368. else
  369. {
  370. Text *err = new Text();
  371. err->append( es->getLetzterFehler() );
  372. errorZuKlient( err->getText() );
  373. err->release();
  374. }
  375. }
  376. else
  377. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  378. }
  379. else
  380. ok = 1;
  381. if( ok && es->hatClients() )
  382. {
  383. errorZuKlient( "Es sind noch Klients Online. Bitte versuche es später erneut." );
  384. break;
  385. }
  386. if( ok )
  387. {
  388. klient->sendeEncrypted( "\1", 1 );
  389. std::cout << "IS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
  390. es->close();
  391. br = 1;
  392. }
  393. }
  394. break;
  395. case 7: // Progtamm abstürzen
  396. if( !adminId )
  397. errorZuKlient( "Du musst dich einloggen." );
  398. else
  399. {
  400. bool ok = 0;
  401. if( es->isRunning() )
  402. {
  403. if( es->zDB()->adminHatRecht( adminId, Admin_Recht::LSBeenden ) )
  404. {
  405. es->serverBeenden();
  406. ok = 1;
  407. }
  408. else
  409. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  410. }
  411. else
  412. ok = 1;
  413. if( ok )
  414. {
  415. klient->sendeEncrypted( "\1", 1 );
  416. std::cout << "IS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
  417. es->close();
  418. br = 1;
  419. }
  420. }
  421. break;
  422. case 8: // Status Frage
  423. if( 1 )
  424. {
  425. char status = 0;
  426. if( es->isRunning() )
  427. {
  428. status = 1;
  429. if( es->istAn() )
  430. status = 2;
  431. }
  432. klient->sendeEncrypted( "\1", 1 );
  433. klient->sendeEncrypted( &status, 1 );
  434. }
  435. break;
  436. case 9: // Server pausieren
  437. if( !adminId )
  438. errorZuKlient( "Du musst dich einloggen." );
  439. else
  440. {
  441. klient->sendeEncrypted( "\1", 1 );
  442. char pause = 0;
  443. klient->getNachrichtEncrypted( &pause, 1 );
  444. if( es->zDB()->adminHatRecht( adminId, Admin_Recht::LSPausieren ) )
  445. {
  446. bool ok = 0;
  447. if( pause )
  448. ok = es->serverPause();
  449. else
  450. ok = es->serverFortsetzen();
  451. if( ok )
  452. klient->sendeEncrypted( "\1", 1 );
  453. else
  454. {
  455. Text *err = new Text();
  456. err->append( es->getLetzterFehler() );
  457. errorZuKlient( err->getText() );
  458. err->release();
  459. }
  460. }
  461. else
  462. {
  463. if( pause )
  464. errorZuKlient( "Du bist nicht berechtigt den Server zu pausieren." );
  465. else
  466. errorZuKlient( "Du bist nicht berechtigt den Server fortzusetzen." );
  467. }
  468. }
  469. break;
  470. case 0xA: // maximale Anzahl der Clients setzen
  471. if( !adminId )
  472. errorZuKlient( "Du musst dich einloggen." );
  473. else
  474. {
  475. klient->sendeEncrypted( "\1", 1 );
  476. int maxC = 0;
  477. klient->getNachrichtEncrypted( (char*)&maxC, 4 );
  478. if( es->zDB()->adminHatRecht( adminId, Admin_Recht::LSMCChange ) )
  479. {
  480. if( es->setMaxKlients( (unsigned char)maxC ) )
  481. klient->sendeEncrypted( "\1", 1 );
  482. else
  483. {
  484. Text *err = new Text();
  485. err->append( es->getLetzterFehler() );
  486. errorZuKlient( err->getText() );
  487. err->release();
  488. }
  489. }
  490. else
  491. errorZuKlient( "Du bist nicht berechtigt die maximale Anzahl der Clients zu verändern." );
  492. }
  493. break;
  494. default:
  495. errorZuKlient( "Unbekannte Nachricht!" );
  496. break;
  497. }
  498. if( br )
  499. break;
  500. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  501. es->addGesendet( klient->getUploadBytes( 1 ) );
  502. }
  503. }
  504. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  505. es->addGesendet( klient->getUploadBytes( 1 ) );
  506. delete this;
  507. }
  508. void ESAKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  509. {
  510. klient->sendeEncrypted( "\3", 1 );
  511. char len = (char)textLength( nachricht );
  512. klient->sendeEncrypted( &len, 1 );
  513. klient->sendeEncrypted( nachricht, len );
  514. }
  515. // Inhalt der ESKThread Klasse aus ErhaltungServer.h
  516. // Konstruktor
  517. ESKThread::ESKThread( ESKlient *zKlient )
  518. {
  519. this->zKlient = zKlient;
  520. ref = 1;
  521. }
  522. // Destruktor
  523. ESKThread::~ESKThread()
  524. {
  525. ende();
  526. }
  527. // nicht constant
  528. void ESKThread::thread()
  529. {
  530. while( 1 )
  531. {
  532. if( !zKlient->erhalten() )
  533. break;
  534. Sleep( 2000 );
  535. }
  536. run = 0;
  537. }
  538. // constant
  539. // Reference Counting
  540. ESKThread *ESKThread::getThis()
  541. {
  542. ref++;
  543. return this;
  544. }
  545. ESKThread *ESKThread::release()
  546. {
  547. ref--;
  548. if( !ref )
  549. delete this;
  550. return 0;
  551. }
  552. // Inhalt der ESKlient Klasse aus ErhaltungServer.h
  553. // Konstruktor
  554. ESKlient::ESKlient( SKlient *klient, ErhaltungServer *es )
  555. {
  556. th = new ESKThread( this );
  557. this->klient = klient;
  558. unsigned char key[ 20 ] = { 207, 242, 142, 161, 148, 107, 131, 33, 172, 68, 91, 169, 81, 106, 69, 131, 207, 56, 166, 248 };
  559. klient->setSendeKey( (char*)key, 20 );
  560. klient->setEmpfangKey( (char*)key, 20 );
  561. zeit = new ZeitMesser();
  562. zeit->messungStart();
  563. sekunden = 0;
  564. letzteErhaltung = 0;
  565. abgemeldet = 0;
  566. klientNummer = 0;
  567. this->es = es;
  568. encrypted = 0;
  569. }
  570. // Destruktor
  571. ESKlient::~ESKlient()
  572. {
  573. th->release();
  574. es->clientTrennung();
  575. es->release();
  576. klient->release();
  577. zeit->release();
  578. }
  579. // nicht constant
  580. bool ESKlient::erhalten()
  581. {
  582. char ret = 0;
  583. if( encrypted )
  584. {
  585. if( !klient->sendeEncrypted( "\1", 1 ) )
  586. return 0;
  587. if( !klient->getNachrichtEncrypted( &ret, 1 ) )
  588. return 0;
  589. if( ret == 1 )
  590. {
  591. klient->sendeEncrypted( "\1", 1 );
  592. abgemeldet = 1;
  593. letzteErhaltung = -5;
  594. return 0;
  595. }
  596. }
  597. else
  598. {
  599. if( !klient->sende( "\1", 1 ) )
  600. return 0;
  601. if( !klient->getNachricht( &ret, 1 ) )
  602. return 0;
  603. if( ret == 1 )
  604. {
  605. klient->sende( "\1", 1 );
  606. abgemeldet = 1;
  607. letzteErhaltung = -5;
  608. return 0;
  609. }
  610. }
  611. letzteErhaltung = sekunden;
  612. return 1;
  613. }
  614. void ESKlient::thread()
  615. {
  616. bool erhalten = 0;
  617. bool br = 0;
  618. while( 1 )
  619. {
  620. char c = 0;
  621. if( ( !encrypted && klient->getNachricht( &c, 1 ) ) || ( encrypted && klient->getNachrichtEncrypted( &c, 1 ) ) )
  622. {
  623. if( !c )
  624. encrypted = 1;
  625. if( c == 1 ) // Klient hat sich verbunden
  626. {
  627. if( encrypted )
  628. klient->getNachrichtEncrypted( (char*)&klientNummer, 4 );
  629. else
  630. klient->getNachricht( (char*)&klientNummer, 4 );
  631. if( !es->zDB()->proveKlient( klientNummer, es->getId() ) )
  632. {
  633. klientNummer = 0;
  634. errorZuKlient( "Du bist nicht für diesen Server eingetragen" );
  635. }
  636. else
  637. {
  638. if( encrypted )
  639. {
  640. Text *key = es->zDB()->getKlientKey( klientNummer );
  641. if( !key )
  642. errorZuKlient( "Es konnte kein Schlüssel ermittelt werden." );
  643. else
  644. {
  645. klient->sendeEncrypted( "\1", 1 );
  646. klient->setEmpfangKey( *key, key->getLength() );
  647. klient->setSendeKey( *key, key->getLength() );
  648. key->release();
  649. }
  650. }
  651. else
  652. klient->sende( "\1", 1 );
  653. erhalten = 1;
  654. th->start();
  655. br = 1;
  656. }
  657. }
  658. if( c == 3 )
  659. {
  660. if( encrypted )
  661. klient->sendeEncrypted( "\1", 1 );
  662. else
  663. klient->sende( "\1", 1 );
  664. br = 1;
  665. }
  666. }
  667. else
  668. br = 1;
  669. if( br )
  670. break;
  671. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  672. es->addGesendet( klient->getUploadBytes( 1 ) );
  673. }
  674. while( erhalten )
  675. {
  676. Sleep( 1000 );
  677. zeit->messungEnde();
  678. zeit->messungStart();
  679. sekunden += zeit->getSekunden();
  680. if( letzteErhaltung <= sekunden - 60 ) // erhaltung time out
  681. {
  682. if( !abgemeldet )
  683. {
  684. std::cout << "IS: Der Klient " << klientNummer << " antwortet nicht mehr.\n";
  685. std::cout.flush();
  686. }
  687. int accountId = es->zDB()->clientIstEingeloggt( klientNummer );
  688. if( accountId )
  689. {
  690. Array< int > *ret = new Array< int >();
  691. int anzahl = es->zDB()->logoutKlient( klientNummer, ret );
  692. if( anzahl > 0 )
  693. {
  694. int jetzt = 0;
  695. int chAnz = ret->get( jetzt );
  696. jetzt++;
  697. for( int i = 0; i < chAnz; i++ )
  698. {
  699. int chatroomId = ret->get( jetzt );
  700. jetzt++;
  701. if( chatroomId )
  702. {
  703. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  704. weiter->spielerLeavesChatroom( chatroomId, accountId );
  705. weiter->release();
  706. if( ret->get( jetzt ) )
  707. {
  708. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  709. weiter->setChatroomAdmin( chatroomId, es->zDB()->getChatroomAdmin( chatroomId ) );
  710. weiter->release();
  711. }
  712. jetzt++;
  713. }
  714. }
  715. if( ret->get( jetzt ) == 1 )
  716. {
  717. jetzt++;
  718. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  719. weiter->spielErstelltAbbrechen( ret->get( jetzt ) );
  720. weiter->release();
  721. }
  722. jetzt++;
  723. if( ret->get( jetzt ) == 1 )
  724. {
  725. jetzt++;
  726. int gruppeId = ret->get( jetzt );
  727. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  728. weiter->spielerLeavesGruppe( gruppeId, accountId );
  729. weiter->release();
  730. jetzt++;
  731. if( ret->get( jetzt ) )
  732. {
  733. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  734. weiter->setGruppeAdmin( gruppeId, es->zDB()->getGruppeAdmin( gruppeId ) );
  735. weiter->release();
  736. }
  737. }
  738. else if( ret->get( jetzt ) == 2 )
  739. {
  740. jetzt++;
  741. int gruppeId = ret->get( jetzt );
  742. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  743. weiter->kickSpielerAusGruppe( gruppeId );
  744. weiter->release();
  745. }
  746. }
  747. ret->release();
  748. es->zDB()->unregisterKlient( klientNummer, es->getId() );
  749. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  750. weiter->patchServerKlientAbsturz( klientNummer );
  751. weiter->registerServerKlientAbsturz( klientNummer );
  752. weiter->loginServerKlientAbsturz( klientNummer );
  753. weiter->informationServerKlientAbsturz( klientNummer );
  754. weiter->chatServerKlientAbsturz( klientNummer );
  755. weiter->anmeldungServerKlientAbsturz( klientNummer );
  756. weiter->spielServerKlientAbsturz( klientNummer );
  757. weiter->shopServerKlientAbsturz( klientNummer );
  758. weiter->historieServerKlientAbsturz( klientNummer );
  759. weiter->newsServerKlientAbsturz( klientNummer );
  760. weiter->kartenServerKlientAbsturz( klientNummer );
  761. weiter->editorServerKlientAbsturz( klientNummer );
  762. weiter->release();
  763. es->zDB()->removeKlient( klientNummer );
  764. }
  765. else
  766. {
  767. es->zDB()->unregisterKlient( klientNummer, es->getId() );
  768. if( !abgemeldet )
  769. {
  770. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  771. weiter->patchServerKlientAbsturz( klientNummer );
  772. weiter->registerServerKlientAbsturz( klientNummer );
  773. weiter->loginServerKlientAbsturz( klientNummer );
  774. weiter->informationServerKlientAbsturz( klientNummer );
  775. weiter->chatServerKlientAbsturz( klientNummer );
  776. weiter->anmeldungServerKlientAbsturz( klientNummer );
  777. weiter->spielServerKlientAbsturz( klientNummer );
  778. weiter->shopServerKlientAbsturz( klientNummer );
  779. weiter->historieServerKlientAbsturz( klientNummer );
  780. weiter->newsServerKlientAbsturz( klientNummer );
  781. weiter->kartenServerKlientAbsturz( klientNummer );
  782. weiter->editorServerKlientAbsturz( klientNummer );
  783. weiter->release();
  784. es->zDB()->removeKlient( klientNummer );
  785. }
  786. }
  787. break;
  788. }
  789. }
  790. delete this;
  791. }
  792. // constant
  793. void ESKlient::errorZuKlient( const char *nachricht ) const
  794. {
  795. if( encrypted )
  796. {
  797. klient->sendeEncrypted( "\3", 1 );
  798. char len = (char)textLength( nachricht );
  799. klient->sendeEncrypted( &len, 1 );
  800. klient->sendeEncrypted( nachricht, len );
  801. }
  802. else
  803. {
  804. klient->sende( "\3", 1 );
  805. char len = (char)textLength( nachricht );
  806. klient->sende( &len, 1 );
  807. klient->sende( nachricht, len );
  808. }
  809. }
  810. // Inhalt der ESGWeiterleitung Klasse aus ErhaltungServer.h
  811. // Konstruktor
  812. ESGWeiterleitung::ESGWeiterleitung( ErhaltungServer *es )
  813. {
  814. this->es = es;
  815. ref = 1;
  816. }
  817. // Destruktor
  818. ESGWeiterleitung::~ESGWeiterleitung()
  819. {
  820. es->release();
  821. }
  822. // nicht constant
  823. bool ESGWeiterleitung::patchServerKlientAbsturz( int klientId )
  824. {
  825. Text *ip = new Text();
  826. int port = 0;
  827. if( !es->zDB()->getPatchServer( klientId, ip, &port ) )
  828. {
  829. ip->release();
  830. return 0;
  831. }
  832. Klient *k = new Klient();
  833. unsigned char key[ 20 ] = { 102, 139, 140, 143, 52, 52, 194, 167, 97, 106, 23, 72, 170, 121, 213, 178, 28, 28, 124, 185 };
  834. k->setSendeKey( (char*)key, 20 );
  835. k->setEmpfangKey( (char*)key, 20 );
  836. k->verbinde( (unsigned short)port, ip->getText() );
  837. ip->release();
  838. char ret = 0;
  839. k->sende( "\0", 1 ); // Verkeyung aktivieren
  840. k->sendeEncrypted( "\2\2", 2 );
  841. k->sendeEncrypted( (char*)&klientId, 4 );
  842. k->getNachrichtEncrypted( &ret, 1 );
  843. bool erf = ret == 1;
  844. k->sendeEncrypted( "\3", 1 );
  845. k->getNachrichtEncrypted( &ret, 1 );
  846. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  847. es->addGesendet( k->getUploadBytes( 1 ) );
  848. k->trenne();
  849. k->release();
  850. return erf;
  851. }
  852. bool ESGWeiterleitung::registerServerKlientAbsturz( int klientId )
  853. {
  854. Text *ip = new Text();
  855. int port = 0;
  856. if( !es->zDB()->getRegisterServer( klientId, ip, &port ) )
  857. {
  858. ip->release();
  859. return 0;
  860. }
  861. Klient *k = new Klient();
  862. unsigned char key[ 20 ] = { 186, 186, 179, 126, 216, 207, 123, 154, 168, 149, 51, 221, 6, 193, 160, 141, 164, 126, 44, 242 };
  863. k->setSendeKey( (char*)key, 20 );
  864. k->setEmpfangKey( (char*)key, 20 );
  865. k->verbinde( (unsigned short)port, ip->getText() );
  866. ip->release();
  867. char ret = 0;
  868. k->sendeEncrypted( "\2\2", 2 );
  869. k->sendeEncrypted( (char*)&klientId, 4 );
  870. k->getNachrichtEncrypted( &ret, 1 );
  871. bool erf = ret == 1;
  872. k->sendeEncrypted( "\3", 1 );
  873. k->getNachrichtEncrypted( &ret, 1 );
  874. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  875. es->addGesendet( k->getUploadBytes( 1 ) );
  876. k->trenne();
  877. k->release();
  878. return erf;
  879. }
  880. bool ESGWeiterleitung::loginServerKlientAbsturz( int klientId )
  881. {
  882. Text *ip = new Text();
  883. int port = 0;
  884. if( !es->zDB()->getLoginServer( klientId, ip, &port ) )
  885. {
  886. ip->release();
  887. return 0;
  888. }
  889. Klient *k = new Klient();
  890. unsigned char key[ 20 ] = { 143, 166, 245, 235, 76, 75, 116, 80, 26, 178, 142, 176, 109, 53, 106, 222, 223, 55, 139, 111 };
  891. k->setSendeKey( (char*)key, 20 );
  892. k->setEmpfangKey( (char*)key, 20 );
  893. k->verbinde( (unsigned short)port, ip->getText() );
  894. ip->release();
  895. char ret = 0;
  896. k->sendeEncrypted( "\2\2", 2 );
  897. k->sendeEncrypted( (char*)&klientId, 4 );
  898. k->getNachrichtEncrypted( &ret, 1 );
  899. bool erf = ret == 1;
  900. k->sendeEncrypted( "\3", 1 );
  901. k->getNachrichtEncrypted( &ret, 1 );
  902. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  903. es->addGesendet( k->getUploadBytes( 1 ) );
  904. k->trenne();
  905. k->release();
  906. return erf;
  907. }
  908. bool ESGWeiterleitung::informationServerKlientAbsturz( int klientId )
  909. {
  910. Text *ip = new Text();
  911. int port = 0;
  912. if( !es->zDB()->getInformationServer( klientId, ip, &port ) )
  913. {
  914. ip->release();
  915. return 0;
  916. }
  917. Klient *k = new Klient();
  918. unsigned char key[ 20 ] = { 231, 246, 125, 32, 88, 172, 229, 223, 246, 138, 74, 64, 142, 245, 217, 218, 162, 62, 103, 50 };
  919. k->setSendeKey( (char*)key, 20 );
  920. k->setEmpfangKey( (char*)key, 20 );
  921. k->verbinde( (unsigned short)port, ip->getText() );
  922. ip->release();
  923. char ret = 0;
  924. k->sendeEncrypted( "\2\2", 2 );
  925. k->sendeEncrypted( (char*)&klientId, 4 );
  926. k->getNachrichtEncrypted( &ret, 1 );
  927. bool erf = ret == 1;
  928. k->sendeEncrypted( "\3", 1 );
  929. k->getNachrichtEncrypted( &ret, 1 );
  930. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  931. es->addGesendet( k->getUploadBytes( 1 ) );
  932. k->trenne();
  933. k->release();
  934. return erf;
  935. }
  936. bool ESGWeiterleitung::chatServerKlientAbsturz( int klientId )
  937. {
  938. Text *ip = new Text();
  939. int port = 0;
  940. if( !es->zDB()->getChatServer( klientId, ip, &port ) )
  941. {
  942. ip->release();
  943. return 0;
  944. }
  945. Klient *k = new Klient();
  946. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  947. k->setSendeKey( (char*)key, 20 );
  948. k->setEmpfangKey( (char*)key, 20 );
  949. k->verbinde( (unsigned short)port, ip->getText() );
  950. ip->release();
  951. char ret = 0;
  952. k->sendeEncrypted( "\2\2", 2 );
  953. k->sendeEncrypted( (char*)&klientId, 4 );
  954. k->getNachrichtEncrypted( &ret, 1 );
  955. bool erf = ret == 1;
  956. k->sendeEncrypted( "\3", 1 );
  957. k->getNachrichtEncrypted( &ret, 1 );
  958. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  959. es->addGesendet( k->getUploadBytes( 1 ) );
  960. k->trenne();
  961. k->release();
  962. return erf;
  963. }
  964. bool ESGWeiterleitung::anmeldungServerKlientAbsturz( int klientId )
  965. {
  966. Text *ip = new Text();
  967. int port = 0;
  968. if( !es->zDB()->getAnmeldungServer( klientId, ip, &port ) )
  969. {
  970. ip->release();
  971. return 0;
  972. }
  973. Klient *k = new Klient();
  974. unsigned char key[ 20 ] = { 158, 10, 37, 155, 117, 58, 28, 197, 132, 76, 252, 83, 84, 222, 11, 125, 240, 218, 25, 201 };
  975. k->setSendeKey( (char*)key, 20 );
  976. k->setEmpfangKey( (char*)key, 20 );
  977. k->verbinde( (unsigned short)port, ip->getText() );
  978. ip->release();
  979. char ret = 0;
  980. k->sendeEncrypted( "\2\2", 2 );
  981. k->sendeEncrypted( (char*)&klientId, 4 );
  982. k->getNachrichtEncrypted( &ret, 1 );
  983. bool erf = ret == 1;
  984. k->sendeEncrypted( "\3", 1 );
  985. k->getNachrichtEncrypted( &ret, 1 );
  986. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  987. es->addGesendet( k->getUploadBytes( 1 ) );
  988. k->trenne();
  989. k->release();
  990. return erf;
  991. }
  992. bool ESGWeiterleitung::spielServerKlientAbsturz( int klientId )
  993. {
  994. Text *ip = new Text();
  995. int port = 0;
  996. if( !es->zDB()->getSpielServer( klientId, ip, &port ) )
  997. {
  998. ip->release();
  999. return 0;
  1000. }
  1001. Klient *k = new Klient();
  1002. unsigned char key[ 20 ] = { 253, 234, 211, 132, 121, 230, 95, 145, 201, 13, 43, 77, 153, 223, 253, 69, 234, 43, 52, 99 };
  1003. k->setSendeKey( (char*)key, 20 );
  1004. k->setEmpfangKey( (char*)key, 20 );
  1005. k->verbinde( (unsigned short)port, ip->getText() );
  1006. ip->release();
  1007. char ret = 0;
  1008. k->sendeEncrypted( "\2\2", 2 );
  1009. k->sendeEncrypted( (char*)&klientId, 4 );
  1010. k->getNachrichtEncrypted( &ret, 1 );
  1011. bool erf = ret == 1;
  1012. k->sendeEncrypted( "\3", 1 );
  1013. k->getNachrichtEncrypted( &ret, 1 );
  1014. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1015. es->addGesendet( k->getUploadBytes( 1 ) );
  1016. k->trenne();
  1017. k->release();
  1018. return erf;
  1019. }
  1020. bool ESGWeiterleitung::shopServerKlientAbsturz( int klientId )
  1021. {
  1022. Text *ip = new Text();
  1023. int port = 0;
  1024. if( !es->zDB()->getShopServer( klientId, ip, &port ) )
  1025. {
  1026. ip->release();
  1027. return 0;
  1028. }
  1029. Klient *k = new Klient();
  1030. unsigned char key[ 20 ] = { 218, 226, 231, 216, 68, 63, 132, 155, 49, 235, 239, 0, 19, 23, 116, 244, 235, 21, 189, 53 };
  1031. k->setSendeKey( (char*)key, 20 );
  1032. k->setEmpfangKey( (char*)key, 20 );
  1033. k->verbinde( (unsigned short)port, ip->getText() );
  1034. ip->release();
  1035. char ret = 0;
  1036. k->sendeEncrypted( "\2\2", 2 );
  1037. k->sendeEncrypted( (char*)&klientId, 4 );
  1038. k->getNachrichtEncrypted( &ret, 1 );
  1039. bool erf = ret == 1;
  1040. k->sendeEncrypted( "\3", 1 );
  1041. k->getNachrichtEncrypted( &ret, 1 );
  1042. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1043. es->addGesendet( k->getUploadBytes( 1 ) );
  1044. k->trenne();
  1045. k->release();
  1046. return erf;
  1047. }
  1048. bool ESGWeiterleitung::historieServerKlientAbsturz( int klientId )
  1049. {
  1050. Text *ip = new Text();
  1051. int port = 0;
  1052. if( !es->zDB()->getHistorieServer( klientId, ip, &port ) )
  1053. {
  1054. ip->release();
  1055. return 0;
  1056. }
  1057. Klient *k = new Klient();
  1058. unsigned char key[ 20 ] = { 207, 30, 72, 46, 30, 50, 56, 213, 82, 107, 14, 201, 149, 58, 110, 138, 228, 241, 52, 54 };
  1059. k->setSendeKey( (char*)key, 20 );
  1060. k->setEmpfangKey( (char*)key, 20 );
  1061. k->verbinde( (unsigned short)port, ip->getText() );
  1062. ip->release();
  1063. char ret = 0;
  1064. k->sendeEncrypted( "\2\2", 2 );
  1065. k->sendeEncrypted( (char*)&klientId, 4 );
  1066. k->getNachrichtEncrypted( &ret, 1 );
  1067. bool erf = ret == 1;
  1068. k->sendeEncrypted( "\3", 1 );
  1069. k->getNachrichtEncrypted( &ret, 1 );
  1070. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1071. es->addGesendet( k->getUploadBytes( 1 ) );
  1072. k->trenne();
  1073. k->release();
  1074. return erf;
  1075. }
  1076. bool ESGWeiterleitung::newsServerKlientAbsturz( int klientId )
  1077. {
  1078. Text *ip = new Text();
  1079. int port = 0;
  1080. if( !es->zDB()->getNewsServer( klientId, ip, &port ) )
  1081. {
  1082. ip->release();
  1083. return 0;
  1084. }
  1085. Klient *k = new Klient();
  1086. unsigned char key[ 20 ] = { 4, 150, 243, 145, 204, 71, 253, 88, 4, 51, 189, 207, 189, 248, 231, 40, 106, 7, 182, 5 };
  1087. k->setSendeKey( (char*)key, 20 );
  1088. k->setEmpfangKey( (char*)key, 20 );
  1089. k->verbinde( (unsigned short)port, ip->getText() );
  1090. ip->release();
  1091. char ret = 0;
  1092. k->sendeEncrypted( "\2\2", 2 );
  1093. k->sendeEncrypted( (char*)&klientId, 4 );
  1094. k->getNachrichtEncrypted( &ret, 1 );
  1095. bool erf = ret == 1;
  1096. k->sendeEncrypted( "\3", 1 );
  1097. k->getNachrichtEncrypted( &ret, 1 );
  1098. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1099. es->addGesendet( k->getUploadBytes( 1 ) );
  1100. k->trenne();
  1101. k->release();
  1102. return erf;
  1103. }
  1104. bool ESGWeiterleitung::kartenServerKlientAbsturz( int klientId )
  1105. {
  1106. Text *ip = new Text();
  1107. int port = 0;
  1108. if( !es->zDB()->getKartenServer( klientId, ip, &port ) )
  1109. {
  1110. ip->release();
  1111. return 0;
  1112. }
  1113. Klient *k = new Klient();
  1114. unsigned char key[ 20 ] = { 24, 15, 53, 87, 38, 73, 154, 38, 246, 90, 39, 133, 11, 199, 22, 80, 26, 132, 95, 54 };
  1115. k->setSendeKey( (char*)key, 20 );
  1116. k->setEmpfangKey( (char*)key, 20 );
  1117. k->verbinde( (unsigned short)port, ip->getText() );
  1118. ip->release();
  1119. char ret = 0;
  1120. k->sendeEncrypted( "\2\2", 2 );
  1121. k->sendeEncrypted( (char*)&klientId, 4 );
  1122. k->getNachrichtEncrypted( &ret, 1 );
  1123. bool erf = ret == 1;
  1124. k->sendeEncrypted( "\3", 1 );
  1125. k->getNachrichtEncrypted( &ret, 1 );
  1126. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1127. es->addGesendet( k->getUploadBytes( 1 ) );
  1128. k->trenne();
  1129. k->release();
  1130. return erf;
  1131. }
  1132. bool ESGWeiterleitung::editorServerKlientAbsturz( int klientId )
  1133. {
  1134. Text *ip = new Text();
  1135. int port = 0;
  1136. if( !es->zDB()->getEditorServer( klientId, ip, &port ) )
  1137. {
  1138. ip->release();
  1139. return 0;
  1140. }
  1141. Klient *k = new Klient();
  1142. unsigned char key[ 20 ] = { 55, 124, 19, 204, 23, 5, 59, 75, 247, 138, 119, 111, 57, 250, 206, 187, 165, 6, 247, 151 };
  1143. k->setSendeKey( (char*)key, 20 );
  1144. k->setEmpfangKey( (char*)key, 20 );
  1145. k->verbinde( (unsigned short)port, ip->getText() );
  1146. ip->release();
  1147. char ret = 0;
  1148. k->sendeEncrypted( "\2\2", 2 );
  1149. k->sendeEncrypted( (char*)&klientId, 4 );
  1150. k->getNachrichtEncrypted( &ret, 1 );
  1151. bool erf = ret == 1;
  1152. k->sendeEncrypted( "\3", 1 );
  1153. k->getNachrichtEncrypted( &ret, 1 );
  1154. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1155. es->addGesendet( k->getUploadBytes( 1 ) );
  1156. k->trenne();
  1157. k->release();
  1158. return erf;
  1159. }
  1160. bool ESGWeiterleitung::spielErstelltAbbrechen( int spielErstelltId )
  1161. {
  1162. bool ret = 1;
  1163. Text *ip = new Text( "" );
  1164. int port = 0;
  1165. ret = ret & es->zDB()->getSpielServer( spielErstelltId, ip, &port );
  1166. if( ip->getLength() )
  1167. {
  1168. Klient *klient = new Klient();
  1169. unsigned char key[ 20 ] = { 253, 234, 211, 132, 121, 230, 95, 145, 201, 13, 43, 77, 153, 223, 253, 69, 234, 43, 52, 99 };
  1170. klient->setSendeKey( (char*)key, 20 );
  1171. klient->setEmpfangKey( (char*)key, 20 );
  1172. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1173. ret = ret & klient->sendeEncrypted( "\x8\x1", 2 );
  1174. char res = 0;
  1175. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1176. if( res )
  1177. {
  1178. ret = ret & klient->sendeEncrypted( (char*)&spielErstelltId, 4 );
  1179. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1180. }
  1181. ret = (char)ret & res;
  1182. ret = ret & klient->sendeEncrypted( "\x8\x0", 2 );
  1183. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1184. ret = (char)ret & res;
  1185. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1186. es->addGesendet( klient->getUploadBytes( 1 ) );
  1187. klient->trenne();
  1188. klient = klient->release();
  1189. ip->release();
  1190. }
  1191. return ret;
  1192. }
  1193. bool ESGWeiterleitung::spielerLeavesGruppe( int gruppeId, int accountId )
  1194. {
  1195. bool ret = 1;
  1196. Array< int > *accId = new Array< int >();
  1197. int anzahl = es->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1198. for( int i = 0; i < anzahl; i++ )
  1199. {
  1200. int account = accId->get( i );
  1201. if( account == accountId )
  1202. continue;
  1203. Text *ip = new Text( "" );
  1204. int port = 0;
  1205. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1206. if( ip->getLength() )
  1207. {
  1208. Klient *klient = new Klient();
  1209. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1210. klient->setSendeKey( (char*)key, 20 );
  1211. klient->setEmpfangKey( (char*)key, 20 );
  1212. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1213. ret = ret & klient->sendeEncrypted( "\5\x15", 2 );
  1214. char res = 0;
  1215. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1216. if( res )
  1217. {
  1218. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1219. ret = ret & klient->sendeEncrypted( (char*)&accountId, 4 );
  1220. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1221. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1222. }
  1223. ret = (char)ret & res;
  1224. ret = ret & klient->sendeEncrypted( "\5\x18", 2 );
  1225. res = 0;
  1226. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1227. if( res )
  1228. {
  1229. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1230. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1231. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1232. }
  1233. ret = (char)ret & res;
  1234. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1235. es->addGesendet( klient->getUploadBytes( 1 ) );
  1236. klient->trenne();
  1237. klient = klient->release();
  1238. }
  1239. ip->release();
  1240. }
  1241. accId->release();
  1242. return ret;
  1243. }
  1244. bool ESGWeiterleitung::setGruppeAdmin( int gruppeId, int adminId )
  1245. {
  1246. if( !adminId || !gruppeId )
  1247. return 0;
  1248. bool ret = 1;
  1249. Array< int > *accId = new Array< int >();
  1250. int anzahl = es->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1251. for( int i = 0; i < anzahl; i++ )
  1252. {
  1253. int account = accId->get( i );
  1254. Text *ip = new Text( "" );
  1255. int port = 0;
  1256. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1257. if( ip->getLength() )
  1258. {
  1259. Klient *klient = new Klient();
  1260. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1261. klient->setSendeKey( (char*)key, 20 );
  1262. klient->setEmpfangKey( (char*)key, 20 );
  1263. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1264. ret = ret & klient->sendeEncrypted( "\5\x1B", 2 );
  1265. char res = 0;
  1266. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1267. if( res )
  1268. {
  1269. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1270. ret = ret & klient->sendeEncrypted( (char*)&adminId, 4 );
  1271. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1272. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1273. }
  1274. ret = (char)ret & res;
  1275. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1276. es->addGesendet( klient->getUploadBytes( 1 ) );
  1277. klient->trenne();
  1278. klient = klient->release();
  1279. }
  1280. ip->release();
  1281. }
  1282. accId->release();
  1283. return ret;
  1284. }
  1285. bool ESGWeiterleitung::spielerLeavesChatroom( int chatroomId, int accountId )
  1286. {
  1287. bool ret = 1;
  1288. Array< int > *accId = new Array< int >();
  1289. int anzahl = es->zDB()->getSpielerAusChatroom( chatroomId, accId );
  1290. for( int i = 0; i < anzahl; i++ )
  1291. {
  1292. int account = accId->get( i );
  1293. if( account == accountId )
  1294. continue;
  1295. Text *ip = new Text( "" );
  1296. int port = 0;
  1297. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1298. if( ip->getLength() )
  1299. {
  1300. Klient *klient = new Klient();
  1301. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1302. klient->setSendeKey( (char*)key, 20 );
  1303. klient->setEmpfangKey( (char*)key, 20 );
  1304. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1305. ret = ret & klient->sendeEncrypted( "\5\xE", 2 );
  1306. char res = 0;
  1307. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1308. if( res )
  1309. {
  1310. ret = ret & klient->sendeEncrypted( (char*)&accountId, 4 );
  1311. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1312. ret = ret & klient->sendeEncrypted( (char*)&chatroomId, 4 );
  1313. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1314. }
  1315. ret = (char)ret & res;
  1316. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1317. es->addGesendet( klient->getUploadBytes( 1 ) );
  1318. klient->trenne();
  1319. klient = klient->release();
  1320. }
  1321. ip->release();
  1322. }
  1323. accId->release();
  1324. return ret;
  1325. }
  1326. bool ESGWeiterleitung::setChatroomAdmin( int chatroomId, int adminId )
  1327. {
  1328. if( !adminId || !chatroomId )
  1329. return 0;
  1330. bool ret = 1;
  1331. Text *ip = new Text( "" );
  1332. int port = 0;
  1333. ret = ret & es->zDB()->getChatServer( adminId, ip, &port );
  1334. if( ip->getLength() )
  1335. {
  1336. Klient *klient = new Klient();
  1337. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1338. klient->setSendeKey( (char*)key, 20 );
  1339. klient->setEmpfangKey( (char*)key, 20 );
  1340. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1341. ret = ret & klient->sendeEncrypted( "\5\x12", 2 );
  1342. char res = 0;
  1343. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1344. if( res )
  1345. {
  1346. ret = ret & klient->sendeEncrypted( (char*)&adminId, 4 );
  1347. ret = ret & klient->sendeEncrypted( (char*)&chatroomId, 4 );
  1348. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1349. }
  1350. ret = (char)ret & res;
  1351. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1352. es->addGesendet( klient->getUploadBytes( 1 ) );
  1353. klient->trenne();
  1354. klient = klient->release();
  1355. }
  1356. ip->release();
  1357. return ret;
  1358. }
  1359. bool ESGWeiterleitung::kickSpielerAusGruppe( int gruppeId )
  1360. {
  1361. if( !gruppeId )
  1362. return 0;
  1363. bool ret = 1;
  1364. Array< int > *accId = new Array< int >();
  1365. int anzahl = es->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1366. for( int i = 0; i < anzahl; i++ )
  1367. {
  1368. int account = accId->get( i );
  1369. Text *ip = new Text( "" );
  1370. int port = 0;
  1371. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1372. if( ip->getLength() )
  1373. {
  1374. Klient *klient = new Klient();
  1375. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1376. klient->setSendeKey( (char*)key, 20 );
  1377. klient->setEmpfangKey( (char*)key, 20 );
  1378. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1379. ret = ret & klient->sendeEncrypted( "\5\x16", 2 );
  1380. char res = 0;
  1381. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1382. if( res )
  1383. {
  1384. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1385. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1386. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1387. }
  1388. ret = (char)ret & res;
  1389. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1390. es->addGesendet( klient->getUploadBytes( 1 ) );
  1391. klient->trenne();
  1392. klient = klient->release();
  1393. }
  1394. es->zDB()->kickSpielerAusGruppe( gruppeId, account );
  1395. ip->release();
  1396. }
  1397. accId->release();
  1398. return ret;
  1399. }
  1400. // constant
  1401. // Reference Counting
  1402. ESGWeiterleitung *ESGWeiterleitung::getThis()
  1403. {
  1404. ref++;
  1405. return this;
  1406. }
  1407. ESGWeiterleitung *ESGWeiterleitung::release()
  1408. {
  1409. ref--;
  1410. if( !ref )
  1411. delete this;
  1412. return 0;
  1413. }