ErhaltungServer.cpp 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511
  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 SSLServer();
  25. aServer->setPrivateKeyPassword( zIni->zWert( "SSLPasswort" )->getText() );
  26. aServer->setCertificateFile( zIni->zWert( "SSLCert" )->getText() );
  27. aServer->setPrivateKeyFile( zIni->zWert( "SSLKey" )->getText() );
  28. std::cout << "ES: Starten des Admin Servers...\n";
  29. if( !aServer->verbinde( (unsigned short)TextZuInt( ini->zWert( "AdminServerPort" )->getText(), 10 ), 10 ) )
  30. {
  31. std::cout << "ES: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
  32. exit( 1 );
  33. }
  34. db->setServerStatus( id, 2 );
  35. end = 0;
  36. nichtPausiert = 0;
  37. ref = 1;
  38. if( zIni->zWert( "Aktiv" )->istGleich( "TRUE" ) )
  39. {
  40. serverStarten();
  41. serverFortsetzen();
  42. }
  43. }
  44. // Destruktor
  45. ErhaltungServer::~ErhaltungServer()
  46. {
  47. fehler->release();
  48. server->trenne();
  49. server->release();
  50. aServer->trenne();
  51. aServer->release();
  52. ini->release();
  53. db->release();
  54. }
  55. void ErhaltungServer::runn()
  56. {
  57. while( !end )
  58. {
  59. SSLSKlient *klient;
  60. klient = aServer->getKlient();
  61. if( end && klient )
  62. {
  63. klient->trenne();
  64. klient = klient->release();
  65. Sleep( 1000 );
  66. return;
  67. }
  68. if( !klient )
  69. return;
  70. ESAKlient *clHandle = new ESAKlient( klient, getThis() );
  71. clHandle->start();
  72. }
  73. }
  74. void ErhaltungServer::thread()
  75. {
  76. while( 1 )
  77. {
  78. SKlient *klient;
  79. klient = server->getKlient();
  80. if( !klient )
  81. break;
  82. Framework::getThreadRegister()->cleanUpClosedThreads();
  83. ESKlient *clHandle = new ESKlient( klient, getThis() );
  84. clients++;
  85. clHandle->start();
  86. }
  87. }
  88. void ErhaltungServer::close()
  89. {
  90. db->setServerStatus( id, 1 );
  91. server->trenne();
  92. #ifdef WIN32
  93. warteAufThread( 1000 );
  94. #endif
  95. ende();
  96. run = 0;
  97. end = 1;
  98. Klient *klient = new Klient();
  99. klient->verbinde( aServer->getPort(), "127.0.0.1" );
  100. Sleep( 500 );
  101. aServer->trenne();
  102. klient->release();
  103. }
  104. // nicht constant
  105. bool ErhaltungServer::serverStarten()
  106. {
  107. if( nichtPausiert )
  108. {
  109. fehler->setText( "Der Server konnte nicht gestartet werden: Der Server läuft bereits." );
  110. return 0;
  111. }
  112. if( server )
  113. server->release();
  114. server = new Server();
  115. if( server->verbinde( (unsigned short)TextZuInt( ini->zWert( "ServerPort" )->getText(), 10 ), 10 ) )
  116. {
  117. nichtPausiert = 1;
  118. start();
  119. return 1;
  120. }
  121. else
  122. {
  123. serverBeenden();
  124. fehler->setText( "Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung." );
  125. return 0;
  126. }
  127. }
  128. bool ErhaltungServer::serverPause()
  129. {
  130. if( !nichtPausiert )
  131. {
  132. fehler->setText( "Der Server konnte nicht pausiert werden: Der Server läuft nicht." );
  133. return 0;
  134. }
  135. if( !db->setServerStatus( id, 2 ) )
  136. {
  137. fehler->setText( "Der Server konnte nicht pausiert werden: " );
  138. fehler->append( db->getLetzterFehler() );
  139. return 0;
  140. }
  141. return 1;
  142. }
  143. bool ErhaltungServer::serverFortsetzen()
  144. {
  145. if( !nichtPausiert )
  146. {
  147. fehler->setText( "Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht." );
  148. return 0;
  149. }
  150. if( !db->setServerStatus( id, 3 ) )
  151. {
  152. fehler->setText( "Der Server konnte nicht fortgesetzt werden: " );
  153. fehler->append( db->getLetzterFehler() );
  154. return 0;
  155. }
  156. return 1;
  157. }
  158. bool ErhaltungServer::serverBeenden()
  159. {
  160. if( !nichtPausiert )
  161. {
  162. fehler->setText( "Der Server konnte nicht beendet werden: Der Server läuft nicht." );
  163. return 0;
  164. }
  165. if( db->serverIstNichtPausiert( id ) )
  166. {
  167. fehler->setText( "Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden." );
  168. return 0;
  169. }
  170. nichtPausiert = 0;
  171. if( server )
  172. server->trenne();
  173. #ifdef WIN32
  174. warteAufThread( 1000 );
  175. #endif
  176. ende();
  177. return 1;
  178. }
  179. bool ErhaltungServer::setMaxKlients( unsigned char mc )
  180. {
  181. if( !db->setMaxClients( id, mc ) )
  182. {
  183. fehler->setText( "Die maximale Anzahl der Clients konnte nicht gesetzt werden:\n" );
  184. fehler->append( db->getLetzterFehler() );
  185. return 0;
  186. }
  187. ini->setWert( "MaxClients", Text() += mc );
  188. return 1;
  189. }
  190. void ErhaltungServer::addGesendet( int bytes )
  191. {
  192. gesendet += bytes;
  193. }
  194. void ErhaltungServer::addEmpfangen( int bytes )
  195. {
  196. empfangen += bytes;
  197. }
  198. void ErhaltungServer::clientTrennung()
  199. {
  200. clients--;
  201. }
  202. // constant
  203. bool ErhaltungServer::istAn() const
  204. {
  205. return db->serverIstNichtPausiert( id );
  206. }
  207. Server *ErhaltungServer::zServer() const
  208. {
  209. return server;
  210. }
  211. ESDatenbank *ErhaltungServer::zDB() const
  212. {
  213. return db;
  214. }
  215. bool ErhaltungServer::hatClients() const
  216. {
  217. return clients > 0;
  218. }
  219. int ErhaltungServer::getId() const
  220. {
  221. return id;
  222. }
  223. char *ErhaltungServer::getLetzterFehler() const
  224. {
  225. return fehler->getText();
  226. }
  227. // Reference Counting
  228. ErhaltungServer *ErhaltungServer::getThis()
  229. {
  230. ref++;
  231. return this;
  232. }
  233. ErhaltungServer *ErhaltungServer::release()
  234. {
  235. ref--;
  236. if( !ref )
  237. delete this;
  238. return 0;
  239. }
  240. // Inhalt der RSAKlient Klasse aus RegisterServer.h
  241. // Konstruktor
  242. ESAKlient::ESAKlient( SSLSKlient *klient, ErhaltungServer *es )
  243. : Thread()
  244. {
  245. this->klient = klient;
  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->getNachricht( &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->sende( "\1", 1 );
  278. unsigned char nLen = 0;
  279. klient->getNachricht( (char*)&nLen, 1 );
  280. char *n = new char[ nLen + 1 ];
  281. n[ (int)nLen ] = 0;
  282. if( nLen )
  283. klient->getNachricht( n, nLen );
  284. unsigned char pLen = 0;
  285. klient->getNachricht( (char*)&pLen, 1 );
  286. char *p = new char[ pLen + 1 ];
  287. p[ (int)pLen ] = 0;
  288. if( pLen )
  289. klient->getNachricht( p, pLen );
  290. int adminId = es->zDB()->istAdministrator( n, p );
  291. if( adminId )
  292. {
  293. klient->sende( "\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->sende( "\1", 1 );
  309. break;
  310. case 3: // Trennen
  311. br = 1;
  312. klient->sende( "\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->sende( "\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->sende( "\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->sende( "\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->sende( "\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->sende( "\1", 1 );
  433. klient->sende( &status, 1 );
  434. }
  435. break;
  436. case 9: // Server pausieren
  437. if( !adminId )
  438. errorZuKlient( "Du musst dich einloggen." );
  439. else
  440. {
  441. klient->sende( "\1", 1 );
  442. char pause = 0;
  443. klient->getNachricht( &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->sende( "\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->sende( "\1", 1 );
  476. int maxC = 0;
  477. klient->getNachricht( (char*)&maxC, 4 );
  478. if( es->zDB()->adminHatRecht( adminId, Admin_Recht::LSMCChange ) )
  479. {
  480. if( es->setMaxKlients( (unsigned char)maxC ) )
  481. klient->sende( "\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->sende( "\3", 1 );
  511. char len = (char)textLength( nachricht );
  512. klient->sende( &len, 1 );
  513. klient->sende( 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. else if( c == 3 )
  659. {
  660. if( encrypted )
  661. klient->sendeEncrypted( "\1", 1 );
  662. else
  663. klient->sende( "\1", 1 );
  664. br = 1;
  665. }
  666. else
  667. {
  668. }
  669. }
  670. else
  671. br = 1;
  672. if( br )
  673. break;
  674. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  675. es->addGesendet( klient->getUploadBytes( 1 ) );
  676. }
  677. while( erhalten )
  678. {
  679. Sleep( 1000 );
  680. zeit->messungEnde();
  681. zeit->messungStart();
  682. sekunden += zeit->getSekunden();
  683. if( letzteErhaltung <= sekunden - 60 ) // erhaltung time out
  684. {
  685. if( !abgemeldet )
  686. {
  687. std::cout << "IS: Der Klient " << klientNummer << " antwortet nicht mehr.\n";
  688. std::cout.flush();
  689. }
  690. int accountId = es->zDB()->clientIstEingeloggt( klientNummer );
  691. if( accountId )
  692. {
  693. Array< int > *ret = new Array< int >();
  694. int anzahl = es->zDB()->logoutKlient( klientNummer, ret );
  695. if( anzahl > 0 )
  696. {
  697. int jetzt = 0;
  698. int chAnz = ret->get( jetzt );
  699. jetzt++;
  700. for( int i = 0; i < chAnz; i++ )
  701. {
  702. int chatroomId = ret->get( jetzt );
  703. jetzt++;
  704. if( chatroomId )
  705. {
  706. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  707. weiter->spielerLeavesChatroom( chatroomId, accountId );
  708. weiter->release();
  709. if( ret->get( jetzt ) )
  710. {
  711. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  712. weiter->setChatroomAdmin( chatroomId, es->zDB()->getChatroomAdmin( chatroomId ) );
  713. weiter->release();
  714. }
  715. jetzt++;
  716. }
  717. }
  718. if( ret->get( jetzt ) == 1 )
  719. {
  720. jetzt++;
  721. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  722. weiter->spielErstelltAbbrechen( ret->get( jetzt ) );
  723. weiter->release();
  724. }
  725. jetzt++;
  726. if( ret->get( jetzt ) == 1 )
  727. {
  728. jetzt++;
  729. int gruppeId = ret->get( jetzt );
  730. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  731. weiter->spielerLeavesGruppe( gruppeId, accountId );
  732. weiter->release();
  733. jetzt++;
  734. if( ret->get( jetzt ) )
  735. {
  736. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  737. weiter->setGruppeAdmin( gruppeId, es->zDB()->getGruppeAdmin( gruppeId ) );
  738. weiter->release();
  739. }
  740. }
  741. else if( ret->get( jetzt ) == 2 )
  742. {
  743. jetzt++;
  744. int gruppeId = ret->get( jetzt );
  745. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  746. weiter->kickSpielerAusGruppe( gruppeId );
  747. weiter->release();
  748. }
  749. }
  750. ret->release();
  751. es->zDB()->unregisterKlient( klientNummer, es->getId() );
  752. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  753. weiter->patchServerKlientAbsturz( klientNummer );
  754. weiter->registerServerKlientAbsturz( klientNummer );
  755. weiter->loginServerKlientAbsturz( klientNummer );
  756. weiter->informationServerKlientAbsturz( klientNummer );
  757. weiter->chatServerKlientAbsturz( klientNummer );
  758. weiter->anmeldungServerKlientAbsturz( klientNummer );
  759. weiter->spielServerKlientAbsturz( klientNummer );
  760. weiter->shopServerKlientAbsturz( klientNummer );
  761. weiter->historieServerKlientAbsturz( klientNummer );
  762. weiter->newsServerKlientAbsturz( klientNummer );
  763. weiter->kartenServerKlientAbsturz( klientNummer );
  764. weiter->editorServerKlientAbsturz( klientNummer );
  765. weiter->minigameServerKlientAbsturz( klientNummer );
  766. weiter->release();
  767. es->zDB()->removeKlient( klientNummer );
  768. }
  769. else
  770. {
  771. es->zDB()->unregisterKlient( klientNummer, es->getId() );
  772. if( !abgemeldet )
  773. {
  774. ESGWeiterleitung *weiter = new ESGWeiterleitung( es->getThis() );
  775. weiter->patchServerKlientAbsturz( klientNummer );
  776. weiter->registerServerKlientAbsturz( klientNummer );
  777. weiter->loginServerKlientAbsturz( klientNummer );
  778. weiter->informationServerKlientAbsturz( klientNummer );
  779. weiter->chatServerKlientAbsturz( klientNummer );
  780. weiter->anmeldungServerKlientAbsturz( klientNummer );
  781. weiter->spielServerKlientAbsturz( klientNummer );
  782. weiter->shopServerKlientAbsturz( klientNummer );
  783. weiter->historieServerKlientAbsturz( klientNummer );
  784. weiter->newsServerKlientAbsturz( klientNummer );
  785. weiter->kartenServerKlientAbsturz( klientNummer );
  786. weiter->editorServerKlientAbsturz( klientNummer );
  787. weiter->minigameServerKlientAbsturz( klientNummer );
  788. weiter->release();
  789. es->zDB()->removeKlient( klientNummer );
  790. }
  791. }
  792. break;
  793. }
  794. }
  795. delete this;
  796. }
  797. // constant
  798. void ESKlient::errorZuKlient( const char *nachricht ) const
  799. {
  800. if( encrypted )
  801. {
  802. klient->sendeEncrypted( "\3", 1 );
  803. char len = (char)textLength( nachricht );
  804. klient->sendeEncrypted( &len, 1 );
  805. klient->sendeEncrypted( nachricht, len );
  806. }
  807. else
  808. {
  809. klient->sende( "\3", 1 );
  810. char len = (char)textLength( nachricht );
  811. klient->sende( &len, 1 );
  812. klient->sende( nachricht, len );
  813. }
  814. }
  815. // Inhalt der ESGWeiterleitung Klasse aus ErhaltungServer.h
  816. // Konstruktor
  817. ESGWeiterleitung::ESGWeiterleitung( ErhaltungServer *es )
  818. {
  819. this->es = es;
  820. ref = 1;
  821. }
  822. // Destruktor
  823. ESGWeiterleitung::~ESGWeiterleitung()
  824. {
  825. es->release();
  826. }
  827. // nicht constant
  828. bool ESGWeiterleitung::patchServerKlientAbsturz( int klientId )
  829. {
  830. Text *ip = new Text();
  831. int port = 0;
  832. if( !es->zDB()->getPatchServer( klientId, ip, &port ) )
  833. {
  834. ip->release();
  835. return 0;
  836. }
  837. Klient *k = new Klient();
  838. unsigned char key[ 20 ] = { 102, 139, 140, 143, 52, 52, 194, 167, 97, 106, 23, 72, 170, 121, 213, 178, 28, 28, 124, 185 };
  839. k->setSendeKey( (char*)key, 20 );
  840. k->setEmpfangKey( (char*)key, 20 );
  841. k->verbinde( (unsigned short)port, ip->getText() );
  842. ip->release();
  843. char ret = 0;
  844. k->sende( "\0", 1 ); // Verkeyung aktivieren
  845. k->sendeEncrypted( "\2\2", 2 );
  846. k->sendeEncrypted( (char*)&klientId, 4 );
  847. k->getNachrichtEncrypted( &ret, 1 );
  848. bool erf = ret == 1;
  849. k->sendeEncrypted( "\3", 1 );
  850. k->getNachrichtEncrypted( &ret, 1 );
  851. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  852. es->addGesendet( k->getUploadBytes( 1 ) );
  853. k->trenne();
  854. k->release();
  855. return erf;
  856. }
  857. bool ESGWeiterleitung::registerServerKlientAbsturz( int klientId )
  858. {
  859. Text *ip = new Text();
  860. int port = 0;
  861. if( !es->zDB()->getRegisterServer( klientId, ip, &port ) )
  862. {
  863. ip->release();
  864. return 0;
  865. }
  866. Klient *k = new Klient();
  867. unsigned char key[ 20 ] = { 186, 186, 179, 126, 216, 207, 123, 154, 168, 149, 51, 221, 6, 193, 160, 141, 164, 126, 44, 242 };
  868. k->setSendeKey( (char*)key, 20 );
  869. k->setEmpfangKey( (char*)key, 20 );
  870. k->verbinde( (unsigned short)port, ip->getText() );
  871. ip->release();
  872. char ret = 0;
  873. k->sendeEncrypted( "\2\2", 2 );
  874. k->sendeEncrypted( (char*)&klientId, 4 );
  875. k->getNachrichtEncrypted( &ret, 1 );
  876. bool erf = ret == 1;
  877. k->sendeEncrypted( "\3", 1 );
  878. k->getNachrichtEncrypted( &ret, 1 );
  879. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  880. es->addGesendet( k->getUploadBytes( 1 ) );
  881. k->trenne();
  882. k->release();
  883. return erf;
  884. }
  885. bool ESGWeiterleitung::loginServerKlientAbsturz( int klientId )
  886. {
  887. Text *ip = new Text();
  888. int port = 0;
  889. if( !es->zDB()->getLoginServer( klientId, ip, &port ) )
  890. {
  891. ip->release();
  892. return 0;
  893. }
  894. Klient *k = new Klient();
  895. unsigned char key[ 20 ] = { 143, 166, 245, 235, 76, 75, 116, 80, 26, 178, 142, 176, 109, 53, 106, 222, 223, 55, 139, 111 };
  896. k->setSendeKey( (char*)key, 20 );
  897. k->setEmpfangKey( (char*)key, 20 );
  898. k->verbinde( (unsigned short)port, ip->getText() );
  899. ip->release();
  900. char ret = 0;
  901. k->sendeEncrypted( "\2\2", 2 );
  902. k->sendeEncrypted( (char*)&klientId, 4 );
  903. k->getNachrichtEncrypted( &ret, 1 );
  904. bool erf = ret == 1;
  905. k->sendeEncrypted( "\3", 1 );
  906. k->getNachrichtEncrypted( &ret, 1 );
  907. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  908. es->addGesendet( k->getUploadBytes( 1 ) );
  909. k->trenne();
  910. k->release();
  911. return erf;
  912. }
  913. bool ESGWeiterleitung::informationServerKlientAbsturz( int klientId )
  914. {
  915. Text *ip = new Text();
  916. int port = 0;
  917. if( !es->zDB()->getInformationServer( klientId, ip, &port ) )
  918. {
  919. ip->release();
  920. return 0;
  921. }
  922. Klient *k = new Klient();
  923. unsigned char key[ 20 ] = { 231, 246, 125, 32, 88, 172, 229, 223, 246, 138, 74, 64, 142, 245, 217, 218, 162, 62, 103, 50 };
  924. k->setSendeKey( (char*)key, 20 );
  925. k->setEmpfangKey( (char*)key, 20 );
  926. k->verbinde( (unsigned short)port, ip->getText() );
  927. ip->release();
  928. char ret = 0;
  929. k->sendeEncrypted( "\2\2", 2 );
  930. k->sendeEncrypted( (char*)&klientId, 4 );
  931. k->getNachrichtEncrypted( &ret, 1 );
  932. bool erf = ret == 1;
  933. k->sendeEncrypted( "\3", 1 );
  934. k->getNachrichtEncrypted( &ret, 1 );
  935. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  936. es->addGesendet( k->getUploadBytes( 1 ) );
  937. k->trenne();
  938. k->release();
  939. return erf;
  940. }
  941. bool ESGWeiterleitung::chatServerKlientAbsturz( int klientId )
  942. {
  943. Text *ip = new Text();
  944. int port = 0;
  945. if( !es->zDB()->getChatServer( klientId, ip, &port ) )
  946. {
  947. ip->release();
  948. return 0;
  949. }
  950. Klient *k = new Klient();
  951. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  952. k->setSendeKey( (char*)key, 20 );
  953. k->setEmpfangKey( (char*)key, 20 );
  954. k->verbinde( (unsigned short)port, ip->getText() );
  955. ip->release();
  956. char ret = 0;
  957. k->sendeEncrypted( "\2\2", 2 );
  958. k->sendeEncrypted( (char*)&klientId, 4 );
  959. k->getNachrichtEncrypted( &ret, 1 );
  960. bool erf = ret == 1;
  961. k->sendeEncrypted( "\3", 1 );
  962. k->getNachrichtEncrypted( &ret, 1 );
  963. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  964. es->addGesendet( k->getUploadBytes( 1 ) );
  965. k->trenne();
  966. k->release();
  967. return erf;
  968. }
  969. bool ESGWeiterleitung::anmeldungServerKlientAbsturz( int klientId )
  970. {
  971. Text *ip = new Text();
  972. int port = 0;
  973. if( !es->zDB()->getAnmeldungServer( klientId, ip, &port ) )
  974. {
  975. ip->release();
  976. return 0;
  977. }
  978. Klient *k = new Klient();
  979. unsigned char key[ 20 ] = { 158, 10, 37, 155, 117, 58, 28, 197, 132, 76, 252, 83, 84, 222, 11, 125, 240, 218, 25, 201 };
  980. k->setSendeKey( (char*)key, 20 );
  981. k->setEmpfangKey( (char*)key, 20 );
  982. k->verbinde( (unsigned short)port, ip->getText() );
  983. ip->release();
  984. char ret = 0;
  985. k->sendeEncrypted( "\2\2", 2 );
  986. k->sendeEncrypted( (char*)&klientId, 4 );
  987. k->getNachrichtEncrypted( &ret, 1 );
  988. bool erf = ret == 1;
  989. k->sendeEncrypted( "\3", 1 );
  990. k->getNachrichtEncrypted( &ret, 1 );
  991. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  992. es->addGesendet( k->getUploadBytes( 1 ) );
  993. k->trenne();
  994. k->release();
  995. return erf;
  996. }
  997. bool ESGWeiterleitung::spielServerKlientAbsturz( int klientId )
  998. {
  999. Text *ip = new Text();
  1000. int port = 0;
  1001. if( !es->zDB()->getSpielServer( klientId, ip, &port ) )
  1002. {
  1003. ip->release();
  1004. return 0;
  1005. }
  1006. Klient *k = new Klient();
  1007. unsigned char key[ 20 ] = { 253, 234, 211, 132, 121, 230, 95, 145, 201, 13, 43, 77, 153, 223, 253, 69, 234, 43, 52, 99 };
  1008. k->setSendeKey( (char*)key, 20 );
  1009. k->setEmpfangKey( (char*)key, 20 );
  1010. k->verbinde( (unsigned short)port, ip->getText() );
  1011. ip->release();
  1012. char ret = 0;
  1013. k->sendeEncrypted( "\2\2", 2 );
  1014. k->sendeEncrypted( (char*)&klientId, 4 );
  1015. k->getNachrichtEncrypted( &ret, 1 );
  1016. bool erf = ret == 1;
  1017. k->sendeEncrypted( "\3", 1 );
  1018. k->getNachrichtEncrypted( &ret, 1 );
  1019. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1020. es->addGesendet( k->getUploadBytes( 1 ) );
  1021. k->trenne();
  1022. k->release();
  1023. return erf;
  1024. }
  1025. bool ESGWeiterleitung::shopServerKlientAbsturz( int klientId )
  1026. {
  1027. Text *ip = new Text();
  1028. int port = 0;
  1029. if( !es->zDB()->getShopServer( klientId, ip, &port ) )
  1030. {
  1031. ip->release();
  1032. return 0;
  1033. }
  1034. Klient *k = new Klient();
  1035. unsigned char key[ 20 ] = { 218, 226, 231, 216, 68, 63, 132, 155, 49, 235, 239, 0, 19, 23, 116, 244, 235, 21, 189, 53 };
  1036. k->setSendeKey( (char*)key, 20 );
  1037. k->setEmpfangKey( (char*)key, 20 );
  1038. k->verbinde( (unsigned short)port, ip->getText() );
  1039. ip->release();
  1040. char ret = 0;
  1041. k->sendeEncrypted( "\2\2", 2 );
  1042. k->sendeEncrypted( (char*)&klientId, 4 );
  1043. k->getNachrichtEncrypted( &ret, 1 );
  1044. bool erf = ret == 1;
  1045. k->sendeEncrypted( "\3", 1 );
  1046. k->getNachrichtEncrypted( &ret, 1 );
  1047. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1048. es->addGesendet( k->getUploadBytes( 1 ) );
  1049. k->trenne();
  1050. k->release();
  1051. return erf;
  1052. }
  1053. bool ESGWeiterleitung::historieServerKlientAbsturz( int klientId )
  1054. {
  1055. Text *ip = new Text();
  1056. int port = 0;
  1057. if( !es->zDB()->getHistorieServer( klientId, ip, &port ) )
  1058. {
  1059. ip->release();
  1060. return 0;
  1061. }
  1062. Klient *k = new Klient();
  1063. unsigned char key[ 20 ] = { 207, 30, 72, 46, 30, 50, 56, 213, 82, 107, 14, 201, 149, 58, 110, 138, 228, 241, 52, 54 };
  1064. k->setSendeKey( (char*)key, 20 );
  1065. k->setEmpfangKey( (char*)key, 20 );
  1066. k->verbinde( (unsigned short)port, ip->getText() );
  1067. ip->release();
  1068. char ret = 0;
  1069. k->sendeEncrypted( "\2\2", 2 );
  1070. k->sendeEncrypted( (char*)&klientId, 4 );
  1071. k->getNachrichtEncrypted( &ret, 1 );
  1072. bool erf = ret == 1;
  1073. k->sendeEncrypted( "\3", 1 );
  1074. k->getNachrichtEncrypted( &ret, 1 );
  1075. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1076. es->addGesendet( k->getUploadBytes( 1 ) );
  1077. k->trenne();
  1078. k->release();
  1079. return erf;
  1080. }
  1081. bool ESGWeiterleitung::newsServerKlientAbsturz( int klientId )
  1082. {
  1083. Text *ip = new Text();
  1084. int port = 0;
  1085. if( !es->zDB()->getNewsServer( klientId, ip, &port ) )
  1086. {
  1087. ip->release();
  1088. return 0;
  1089. }
  1090. Klient *k = new Klient();
  1091. unsigned char key[ 20 ] = { 4, 150, 243, 145, 204, 71, 253, 88, 4, 51, 189, 207, 189, 248, 231, 40, 106, 7, 182, 5 };
  1092. k->setSendeKey( (char*)key, 20 );
  1093. k->setEmpfangKey( (char*)key, 20 );
  1094. k->verbinde( (unsigned short)port, ip->getText() );
  1095. ip->release();
  1096. char ret = 0;
  1097. k->sendeEncrypted( "\2\2", 2 );
  1098. k->sendeEncrypted( (char*)&klientId, 4 );
  1099. k->getNachrichtEncrypted( &ret, 1 );
  1100. bool erf = ret == 1;
  1101. k->sendeEncrypted( "\3", 1 );
  1102. k->getNachrichtEncrypted( &ret, 1 );
  1103. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1104. es->addGesendet( k->getUploadBytes( 1 ) );
  1105. k->trenne();
  1106. k->release();
  1107. return erf;
  1108. }
  1109. bool ESGWeiterleitung::kartenServerKlientAbsturz( int klientId )
  1110. {
  1111. Text *ip = new Text();
  1112. int port = 0;
  1113. if( !es->zDB()->getKartenServer( klientId, ip, &port ) )
  1114. {
  1115. ip->release();
  1116. return 0;
  1117. }
  1118. Klient *k = new Klient();
  1119. unsigned char key[ 20 ] = { 24, 15, 53, 87, 38, 73, 154, 38, 246, 90, 39, 133, 11, 199, 22, 80, 26, 132, 95, 54 };
  1120. k->setSendeKey( (char*)key, 20 );
  1121. k->setEmpfangKey( (char*)key, 20 );
  1122. k->verbinde( (unsigned short)port, ip->getText() );
  1123. ip->release();
  1124. char ret = 0;
  1125. k->sendeEncrypted( "\2\2", 2 );
  1126. k->sendeEncrypted( (char*)&klientId, 4 );
  1127. k->getNachrichtEncrypted( &ret, 1 );
  1128. bool erf = ret == 1;
  1129. k->sendeEncrypted( "\3", 1 );
  1130. k->getNachrichtEncrypted( &ret, 1 );
  1131. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1132. es->addGesendet( k->getUploadBytes( 1 ) );
  1133. k->trenne();
  1134. k->release();
  1135. return erf;
  1136. }
  1137. bool ESGWeiterleitung::editorServerKlientAbsturz( int klientId )
  1138. {
  1139. Text *ip = new Text();
  1140. int port = 0;
  1141. if( !es->zDB()->getEditorServer( klientId, ip, &port ) )
  1142. {
  1143. ip->release();
  1144. return 0;
  1145. }
  1146. Klient *k = new Klient();
  1147. unsigned char key[ 20 ] = { 55, 124, 19, 204, 23, 5, 59, 75, 247, 138, 119, 111, 57, 250, 206, 187, 165, 6, 247, 151 };
  1148. k->setSendeKey( (char*)key, 20 );
  1149. k->setEmpfangKey( (char*)key, 20 );
  1150. k->verbinde( (unsigned short)port, ip->getText() );
  1151. ip->release();
  1152. char ret = 0;
  1153. k->sendeEncrypted( "\2\2", 2 );
  1154. k->sendeEncrypted( (char*)&klientId, 4 );
  1155. k->getNachrichtEncrypted( &ret, 1 );
  1156. bool erf = ret == 1;
  1157. k->sendeEncrypted( "\3", 1 );
  1158. k->getNachrichtEncrypted( &ret, 1 );
  1159. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1160. es->addGesendet( k->getUploadBytes( 1 ) );
  1161. k->trenne();
  1162. k->release();
  1163. return erf;
  1164. }
  1165. bool ESGWeiterleitung::minigameServerKlientAbsturz( int klientId )
  1166. {
  1167. Text *ip = new Text();
  1168. int port = 0;
  1169. if( !es->zDB()->getMinigameServer( klientId, ip, &port ) )
  1170. {
  1171. ip->release();
  1172. return 0;
  1173. }
  1174. Klient *k = new Klient();
  1175. unsigned char key[ 20 ] = { 88, 103, 192, 232, 69, 54, 57, 3, 239, 138, 234, 172, 126, 72, 81, 55, 205, 97, 59, 255 };
  1176. k->setSendeKey( (char*)key, 20 );
  1177. k->setEmpfangKey( (char*)key, 20 );
  1178. k->verbinde( (unsigned short)port, ip->getText() );
  1179. ip->release();
  1180. char ret = 0;
  1181. k->sendeEncrypted( "\2\2", 2 );
  1182. k->sendeEncrypted( (char*)&klientId, 4 );
  1183. k->getNachrichtEncrypted( &ret, 1 );
  1184. bool erf = ret == 1;
  1185. k->sendeEncrypted( "\3", 1 );
  1186. k->getNachrichtEncrypted( &ret, 1 );
  1187. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1188. es->addGesendet( k->getUploadBytes( 1 ) );
  1189. k->trenne();
  1190. k->release();
  1191. return erf;
  1192. }
  1193. bool ESGWeiterleitung::spielErstelltAbbrechen( int spielErstelltId )
  1194. {
  1195. bool ret = 1;
  1196. Text *ip = new Text( "" );
  1197. int port = 0;
  1198. ret = ret & es->zDB()->getSpielServer( spielErstelltId, ip, &port );
  1199. if( ip->getLength() )
  1200. {
  1201. Klient *klient = new Klient();
  1202. unsigned char key[ 20 ] = { 253, 234, 211, 132, 121, 230, 95, 145, 201, 13, 43, 77, 153, 223, 253, 69, 234, 43, 52, 99 };
  1203. klient->setSendeKey( (char*)key, 20 );
  1204. klient->setEmpfangKey( (char*)key, 20 );
  1205. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1206. ret = ret & klient->sendeEncrypted( "\x8\x1", 2 );
  1207. char res = 0;
  1208. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1209. if( res )
  1210. {
  1211. ret = ret & klient->sendeEncrypted( (char*)&spielErstelltId, 4 );
  1212. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1213. }
  1214. ret = (char)ret & res;
  1215. ret = ret & klient->sendeEncrypted( "\x8\x0", 2 );
  1216. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1217. ret = (char)ret & res;
  1218. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1219. es->addGesendet( klient->getUploadBytes( 1 ) );
  1220. klient->trenne();
  1221. klient = klient->release();
  1222. ip->release();
  1223. }
  1224. return ret;
  1225. }
  1226. bool ESGWeiterleitung::spielerLeavesGruppe( int gruppeId, int accountId )
  1227. {
  1228. bool ret = 1;
  1229. Array< int > *accId = new Array< int >();
  1230. int anzahl = es->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1231. for( int i = 0; i < anzahl; i++ )
  1232. {
  1233. int account = accId->get( i );
  1234. if( account == accountId )
  1235. continue;
  1236. Text *ip = new Text( "" );
  1237. int port = 0;
  1238. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1239. if( ip->getLength() )
  1240. {
  1241. Klient *klient = new Klient();
  1242. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1243. klient->setSendeKey( (char*)key, 20 );
  1244. klient->setEmpfangKey( (char*)key, 20 );
  1245. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1246. ret = ret & klient->sendeEncrypted( "\5\x15", 2 );
  1247. char res = 0;
  1248. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1249. if( res )
  1250. {
  1251. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1252. ret = ret & klient->sendeEncrypted( (char*)&accountId, 4 );
  1253. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1254. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1255. }
  1256. ret = (char)ret & res;
  1257. ret = ret & klient->sendeEncrypted( "\5\x18", 2 );
  1258. res = 0;
  1259. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1260. if( res )
  1261. {
  1262. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1263. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1264. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1265. }
  1266. ret = (char)ret & res;
  1267. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1268. es->addGesendet( klient->getUploadBytes( 1 ) );
  1269. klient->trenne();
  1270. klient = klient->release();
  1271. }
  1272. ip->release();
  1273. }
  1274. accId->release();
  1275. return ret;
  1276. }
  1277. bool ESGWeiterleitung::setGruppeAdmin( int gruppeId, int adminId )
  1278. {
  1279. if( !adminId || !gruppeId )
  1280. return 0;
  1281. bool ret = 1;
  1282. Array< int > *accId = new Array< int >();
  1283. int anzahl = es->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1284. for( int i = 0; i < anzahl; i++ )
  1285. {
  1286. int account = accId->get( i );
  1287. Text *ip = new Text( "" );
  1288. int port = 0;
  1289. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1290. if( ip->getLength() )
  1291. {
  1292. Klient *klient = new Klient();
  1293. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1294. klient->setSendeKey( (char*)key, 20 );
  1295. klient->setEmpfangKey( (char*)key, 20 );
  1296. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1297. ret = ret & klient->sendeEncrypted( "\5\x1B", 2 );
  1298. char res = 0;
  1299. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1300. if( res )
  1301. {
  1302. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1303. ret = ret & klient->sendeEncrypted( (char*)&adminId, 4 );
  1304. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1305. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1306. }
  1307. ret = (char)ret & res;
  1308. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1309. es->addGesendet( klient->getUploadBytes( 1 ) );
  1310. klient->trenne();
  1311. klient = klient->release();
  1312. }
  1313. ip->release();
  1314. }
  1315. accId->release();
  1316. return ret;
  1317. }
  1318. bool ESGWeiterleitung::spielerLeavesChatroom( int chatroomId, int accountId )
  1319. {
  1320. bool ret = 1;
  1321. Array< int > *accId = new Array< int >();
  1322. int anzahl = es->zDB()->getSpielerAusChatroom( chatroomId, accId );
  1323. for( int i = 0; i < anzahl; i++ )
  1324. {
  1325. int account = accId->get( i );
  1326. if( account == accountId )
  1327. continue;
  1328. Text *ip = new Text( "" );
  1329. int port = 0;
  1330. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1331. if( ip->getLength() )
  1332. {
  1333. Klient *klient = new Klient();
  1334. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1335. klient->setSendeKey( (char*)key, 20 );
  1336. klient->setEmpfangKey( (char*)key, 20 );
  1337. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1338. ret = ret & klient->sendeEncrypted( "\5\xE", 2 );
  1339. char res = 0;
  1340. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1341. if( res )
  1342. {
  1343. ret = ret & klient->sendeEncrypted( (char*)&accountId, 4 );
  1344. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1345. ret = ret & klient->sendeEncrypted( (char*)&chatroomId, 4 );
  1346. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1347. }
  1348. ret = (char)ret & res;
  1349. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1350. es->addGesendet( klient->getUploadBytes( 1 ) );
  1351. klient->trenne();
  1352. klient = klient->release();
  1353. }
  1354. ip->release();
  1355. }
  1356. accId->release();
  1357. return ret;
  1358. }
  1359. bool ESGWeiterleitung::setChatroomAdmin( int chatroomId, int adminId )
  1360. {
  1361. if( !adminId || !chatroomId )
  1362. return 0;
  1363. bool ret = 1;
  1364. Text *ip = new Text( "" );
  1365. int port = 0;
  1366. ret = ret & es->zDB()->getChatServer( adminId, ip, &port );
  1367. if( ip->getLength() )
  1368. {
  1369. Klient *klient = new Klient();
  1370. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1371. klient->setSendeKey( (char*)key, 20 );
  1372. klient->setEmpfangKey( (char*)key, 20 );
  1373. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1374. ret = ret & klient->sendeEncrypted( "\5\x12", 2 );
  1375. char res = 0;
  1376. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1377. if( res )
  1378. {
  1379. ret = ret & klient->sendeEncrypted( (char*)&adminId, 4 );
  1380. ret = ret & klient->sendeEncrypted( (char*)&chatroomId, 4 );
  1381. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1382. }
  1383. ret = (char)ret & res;
  1384. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1385. es->addGesendet( klient->getUploadBytes( 1 ) );
  1386. klient->trenne();
  1387. klient = klient->release();
  1388. }
  1389. ip->release();
  1390. return ret;
  1391. }
  1392. bool ESGWeiterleitung::kickSpielerAusGruppe( int gruppeId )
  1393. {
  1394. if( !gruppeId )
  1395. return 0;
  1396. bool ret = 1;
  1397. Array< int > *accId = new Array< int >();
  1398. int anzahl = es->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1399. for( int i = 0; i < anzahl; i++ )
  1400. {
  1401. int account = accId->get( i );
  1402. Text *ip = new Text( "" );
  1403. int port = 0;
  1404. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1405. if( ip->getLength() )
  1406. {
  1407. Klient *klient = new Klient();
  1408. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1409. klient->setSendeKey( (char*)key, 20 );
  1410. klient->setEmpfangKey( (char*)key, 20 );
  1411. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1412. ret = ret & klient->sendeEncrypted( "\5\x16", 2 );
  1413. char res = 0;
  1414. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1415. if( res )
  1416. {
  1417. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1418. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1419. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1420. }
  1421. ret = (char)ret & res;
  1422. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1423. es->addGesendet( klient->getUploadBytes( 1 ) );
  1424. klient->trenne();
  1425. klient = klient->release();
  1426. }
  1427. es->zDB()->kickSpielerAusGruppe( gruppeId, account );
  1428. ip->release();
  1429. }
  1430. accId->release();
  1431. return ret;
  1432. }
  1433. // constant
  1434. // Reference Counting
  1435. ESGWeiterleitung *ESGWeiterleitung::getThis()
  1436. {
  1437. ref++;
  1438. return this;
  1439. }
  1440. ESGWeiterleitung *ESGWeiterleitung::release()
  1441. {
  1442. ref--;
  1443. if( !ref )
  1444. delete this;
  1445. return 0;
  1446. }