PlayerRegister.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #include "PlayerRegister.h"
  2. #include <Datei.h>
  3. Framework::Text randomSecret()
  4. {
  5. int len = 1024 + (int)(((double)rand() / RAND_MAX - 0.5) * 512);
  6. char* key = new char[len + 1];
  7. for (int i = 0; i < len; i++)
  8. key[i] = (char)((((double)rand() / RAND_MAX) * 254) + 1);
  9. key[len] = 0;
  10. Framework::Text secret = key;
  11. delete[] key;
  12. return secret;
  13. }
  14. RegisteredPlayer::RegisteredPlayer(int id, Framework::Text name)
  15. : Framework::ReferenceCounter(),
  16. id(id),
  17. name(name),
  18. secret(randomSecret())
  19. {}
  20. RegisteredPlayer::RegisteredPlayer(Framework::StreamReader* zReader)
  21. : Framework::ReferenceCounter()
  22. {
  23. zReader->lese((char*)&id, 4);
  24. char len;
  25. zReader->lese(&len, 1);
  26. char* buffer = new char[len + 1];
  27. zReader->lese(buffer, len);
  28. buffer[(int)len] = 0;
  29. name = buffer;
  30. delete[] buffer;
  31. short sLen;
  32. zReader->lese((char*)&sLen, 2);
  33. buffer = new char[sLen + 1];
  34. zReader->lese(buffer, sLen);
  35. buffer[sLen] = 0;
  36. secret = buffer;
  37. delete[] buffer;
  38. }
  39. int RegisteredPlayer::getId() const
  40. {
  41. return id;
  42. }
  43. Framework::Text RegisteredPlayer::getName() const
  44. {
  45. return name;
  46. }
  47. Framework::Text RegisteredPlayer::getSecret() const
  48. {
  49. return secret;
  50. }
  51. void RegisteredPlayer::save(Framework::StreamWriter* zWriter) const
  52. {
  53. zWriter->schreibe((char*)&id, 4);
  54. char len = (char)name.getLength();
  55. zWriter->schreibe(&len, 1);
  56. zWriter->schreibe(name.getText(), len);
  57. short sLen = (short)secret.getLength();
  58. zWriter->schreibe((char*)&sLen, 2);
  59. zWriter->schreibe(secret.getText(), sLen);
  60. }
  61. PlayerRegister::PlayerRegister(Framework::Text worldPath)
  62. : Framework::ReferenceCounter(),
  63. path(worldPath + "/player/players.reg")
  64. {
  65. Framework::Datei regDat;
  66. regDat.setDatei(path);
  67. if (!regDat.existiert())
  68. {
  69. regDat.erstellen();
  70. }
  71. regDat.open(Framework::Datei::Style::lesen);
  72. while (!regDat.istEnde())
  73. {
  74. RegisteredPlayer* p = new RegisteredPlayer(&regDat);
  75. players.add(p);
  76. }
  77. regDat.close();
  78. }
  79. Framework::Text PlayerRegister::addPlayer(Framework::Text name)
  80. {
  81. cs.lock();
  82. int nextId = 0;
  83. for (RegisteredPlayer* player : players)
  84. {
  85. nextId = MAX(nextId, player->getId() + 1);
  86. if (player->getName().istGleich(name))
  87. {
  88. cs.unlock();
  89. return "";
  90. }
  91. }
  92. RegisteredPlayer* p = new RegisteredPlayer(nextId, name);
  93. players.add(p);
  94. save();
  95. cs.unlock();
  96. return p->getSecret();
  97. }
  98. bool PlayerRegister::hasPlayer(Framework::Text name)
  99. {
  100. cs.lock();
  101. for (RegisteredPlayer* player : players)
  102. {
  103. if (player->getName().istGleich(name))
  104. {
  105. cs.unlock();
  106. return 1;
  107. }
  108. }
  109. cs.unlock();
  110. return 0;
  111. }
  112. int PlayerRegister::getPlayerId(Framework::Text name)
  113. {
  114. cs.lock();
  115. for (RegisteredPlayer* player : players)
  116. {
  117. if (player->getName().istGleich(name))
  118. {
  119. cs.unlock();
  120. return player->getId();
  121. }
  122. }
  123. cs.unlock();
  124. return -1;
  125. }
  126. bool PlayerRegister::checkSecret(Framework::Text name, Framework::Text secret)
  127. {
  128. cs.lock();
  129. for (RegisteredPlayer* player : players)
  130. {
  131. if (player->getName().istGleich(name))
  132. {
  133. cs.unlock();
  134. return player->getSecret().istGleich(secret);
  135. }
  136. }
  137. cs.unlock();
  138. return secret.getLength() == 0; // new player
  139. }
  140. void PlayerRegister::save()
  141. {
  142. cs.lock();
  143. Framework::Datei regDat;
  144. regDat.setDatei(path);
  145. if (!regDat.existiert())
  146. {
  147. regDat.erstellen();
  148. }
  149. regDat.open(Framework::Datei::Style::schreiben);
  150. for (RegisteredPlayer* player : players)
  151. {
  152. player->save(&regDat);
  153. }
  154. regDat.close();
  155. cs.unlock();
  156. }