Guest User

Untitled

a guest
Nov 2nd, 2019
551
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.32 KB | None | 0 0
  1. package l2f.gameserver.hwid;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.util.List;
  8. import java.util.concurrent.CopyOnWriteArrayList;
  9.  
  10. import l2f.gameserver.Config;
  11. import l2f.gameserver.database.DatabaseFactory;
  12. import l2f.gameserver.hwid.HwidGamer.PLAYER_THREAT;
  13. import l2f.gameserver.hwid.HwidLogging.SimpleLog;
  14. import l2f.gameserver.model.Player;
  15. import l2f.gameserver.model.entity.ChangeLogManager;
  16. import l2f.gameserver.utils.BatchStatement;
  17. import l2f.gameserver.utils.Log;
  18.  
  19. import org.slf4j.Logger;
  20. import org.slf4j.LoggerFactory;
  21.  
  22. public class HwidEngine
  23. {
  24. private static final Logger _log = LoggerFactory.getLogger(HwidEngine.class);
  25.  
  26. private final List<HwidGamer> _allHwids = new CopyOnWriteArrayList<>();
  27. private final List<SimpleLog> _logsToSave = new CopyOnWriteArrayList<>();
  28.  
  29. protected HwidEngine()
  30. {
  31.  
  32. }
  33.  
  34. public HwidGamer getGamerByHwid(String hwid)
  35. {
  36. for (HwidGamer gamer : _allHwids)
  37. {
  38. if (gamer.getHwid().equals(hwid))
  39. return gamer;
  40. }
  41.  
  42. return null;
  43. }
  44.  
  45. public HwidGamer newPlayer(Player player)
  46. {
  47. final String hwid = player.getHWID();
  48. for (HwidGamer gamer : _allHwids)
  49. {
  50. if (gamer.getHwid().equals(hwid))
  51. {
  52. gamer.addPlayer(player);
  53. return gamer;
  54. }
  55. }
  56.  
  57. // First logged char on this pc, loading from db
  58. final HwidGamer newHwid = loadHwidFromDatabase(hwid);
  59. newHwid.addPlayer(player);
  60. _allHwids.add(newHwid);
  61. return newHwid;
  62. }
  63.  
  64. /**
  65. * @param hwid
  66. * @return null if can, otherwise it @returns reason
  67. */
  68. public String canILog(String hwid)
  69. {
  70. for (HwidGamer gamer : _allHwids)
  71. {
  72. if (gamer.getHwid().equals(hwid))
  73. {
  74. if (gamer.getOnlineChars().size() == Config.MAX_CHARS_PER_PC)
  75. return "Only "+Config.MAX_CHARS_PER_PC+" character"+(Config.MAX_CHARS_PER_PC > 1 ? "s" : "")+" may be online on the same PC!";
  76. }
  77. }
  78.  
  79. final long banTime = getBanLeftTime(hwid);
  80. if (banTime == -100)
  81. return "You are banned!";
  82. if (banTime > 0)
  83. return "You are banned for "+(int)Math.ceil(banTime/60000)+" more minutes!";
  84. return null;
  85. }
  86.  
  87. public void logFailedLogin(Player player)
  88. {
  89. String hwid = player.getHWID();
  90. for (HwidGamer gamer : _allHwids)
  91. {
  92. if (gamer.getHwid().equals(hwid))
  93. {
  94. //Log.LogHwid(gamer, player.getName(), "Login", "Failed! Too many online characters!");
  95. Log.LogToPlayerCommunity(gamer, player, "Failed to login. Too many online characters!");
  96. return;
  97. }
  98. }
  99. }
  100.  
  101. public void banHwid(String hwidToBan)
  102. {
  103. HwidGamer gamer = getGamerByHwid(hwidToBan);
  104. if (gamer != null)
  105. {
  106. gamer.setHwidBanned(-100L);
  107. for (Player player : gamer.getOnlineChars())
  108. {
  109. Log.LogToPlayerCommunity(gamer, player, "Kicked! HWID was banned by admin!");
  110. player.kick();
  111. }
  112. banHwidInDb(hwidToBan, gamer.getBannedToDate());
  113. }
  114. }
  115.  
  116. private long getBanLeftTime(String hwid)
  117. {
  118. try (Connection con = DatabaseFactory.getInstance().getConnection();
  119. PreparedStatement statement = con.prepareStatement("SELECT banned FROM hwid WHERE HWID=?"))
  120. {
  121. statement.setString(1, hwid);
  122.  
  123. ResultSet rset = statement.executeQuery();
  124. if (rset.next())
  125. {
  126. long toDate = rset.getLong("banned");
  127. if (toDate == -100)
  128. return -100L;
  129. return toDate - System.currentTimeMillis();
  130. }
  131. }
  132. catch (SQLException e)
  133. {
  134. _log.error("Failed to load Hwid("+hwid+") from Database: ", e);
  135. }
  136. return 0;
  137. }
  138.  
  139. private HwidGamer loadHwidFromDatabase(String hwid)
  140. {
  141. HwidGamer foundGamer = null;
  142.  
  143. try (Connection con = DatabaseFactory.getInstance().getConnection();
  144. PreparedStatement statement = con.prepareStatement("SELECT * FROM hwid WHERE HWID=?"))
  145. {
  146. statement.setString(1, hwid);
  147.  
  148. ResultSet rset = statement.executeQuery();
  149. if (rset.next())
  150. {
  151. long firstTimePlayed = rset.getLong("first_time_played");
  152. long totalTimePlayed = rset.getLong("total_time_played")*1000L;
  153. int pollAnswer = rset.getInt("poll_answer");
  154. int warnings = rset.getInt("warnings");
  155. int seenChangeLog = rset.getInt("seenChangeLog");
  156. PLAYER_THREAT threat = PLAYER_THREAT.valueOf(rset.getString("threat"));
  157. long banned = rset.getLong("banned");
  158.  
  159. foundGamer = new HwidGamer(hwid, firstTimePlayed, totalTimePlayed, pollAnswer, warnings, seenChangeLog, threat, banned);
  160. }
  161. }
  162. catch (Exception e)
  163. {
  164. _log.error("Failed to load Hwid("+hwid+") from Database: ", e);
  165. }
  166.  
  167. if (foundGamer == null)
  168. foundGamer = justJoinedServer(hwid);
  169. return foundGamer;
  170. }
  171.  
  172. private HwidGamer justJoinedServer(String hwid)
  173. {
  174. HwidGamer newGamer = new HwidGamer(hwid, System.currentTimeMillis()/1000L, 0, -1, 0, ChangeLogManager.getInstance().getLatestChangeId(), PLAYER_THREAT.NONE, 0);
  175. saveNewGamer(newGamer);
  176. return newGamer;
  177. }
  178.  
  179. public void updateGamerInDb(HwidGamer gamer)
  180. {
  181. try (Connection con = DatabaseFactory.getInstance().getConnection();
  182. PreparedStatement statement = con.prepareStatement("UPDATE hwid SET first_time_played=?, total_time_played=?, poll_answer=?, warnings=?, seenChangeLog=?, threat=?, banned=? WHERE HWID=?"))
  183. {
  184. statement.setLong(1, gamer.getFirstTimePlayed());
  185. statement.setLong(2, gamer.getTotalTimePlayed()/1000L);
  186. statement.setInt(3, gamer.getPollAnswer());
  187. statement.setInt(4, gamer.getWarnings());
  188. statement.setInt(5, gamer.getSeenChangeLog());
  189. statement.setString(6, gamer.getThreat().toString());
  190. statement.setLong(7, gamer.getBannedToDate());
  191. statement.setString(8, gamer.getHwid());
  192. statement.executeUpdate();
  193. }
  194. catch (SQLException e)
  195. {
  196. _log.error("Failed to insert Hwid("+gamer.getHwid()+") to Database: ", e);
  197. }
  198. }
  199.  
  200. private void banHwidInDb(String hwid, long toDate)
  201. {
  202. try (Connection con = DatabaseFactory.getInstance().getConnection();
  203. PreparedStatement statement = con.prepareStatement("UPDATE hwid SET banned=? WHERE HWID=?"))
  204. {
  205. statement.setLong(1, toDate);
  206. statement.setString(2, hwid);
  207. statement.executeUpdate();
  208. }
  209. catch (SQLException e)
  210. {
  211. _log.error("Failed to ban Hwid("+hwid+") in Database: ", e);
  212. }
  213. }
  214.  
  215. private void saveNewGamer(HwidGamer gamer)
  216. {
  217. try (Connection con = DatabaseFactory.getInstance().getConnection();
  218. PreparedStatement statement = con.prepareStatement("INSERT INTO hwid SET HWID=?, first_time_played=?, total_time_played=?, poll_answer=?, warnings=?, seenChangeLog=?, threat=?, banned=?"))
  219. {
  220. statement.setString(1, gamer.getHwid());
  221. statement.setLong(2, gamer.getFirstTimePlayed());
  222. statement.setLong(3, gamer.getTotalTimePlayed()/1000L);
  223. statement.setInt(4, gamer.getPollAnswer());
  224. statement.setInt(5, gamer.getWarnings());
  225. statement.setInt(6, gamer.getSeenChangeLog());
  226. statement.setString(7, gamer.getThreat().toString());
  227. statement.setLong(8, 0L);//Banned
  228. statement.execute();
  229. }
  230. catch (SQLException e)
  231. {
  232. _log.error("Failed to insert Hwid("+gamer.getHwid()+") to Database: ", e);
  233. }
  234. }
  235.  
  236. public synchronized void addToSaveLog(int charObjId, String hwid, String msg, long currentTimeMillis)
  237. {
  238. final SimpleLog log = new SimpleLog();
  239. log._charObjId = charObjId;
  240. log._hwid = hwid;
  241. log._msg = msg;
  242. log._time = currentTimeMillis / 1000;
  243.  
  244. HwidLogging.getInstance().addNewLog(log);
  245. _logsToSave.add(log);
  246. }
  247.  
  248. /**
  249. * Save all data on shutdown
  250. */
  251. public void saveAllData()
  252. {
  253. // Saving logs
  254. if (!_logsToSave.isEmpty())
  255. {
  256. try (Connection con = DatabaseFactory.getInstance().getConnection();
  257. PreparedStatement statement = BatchStatement.createPreparedStatement(con, "INSERT INTO character_logs (obj_Id, HWID, action, time) VALUES (?, ?, ?, ?)"))
  258. {
  259. for (SimpleLog log : _logsToSave)
  260. {
  261. statement.setInt(1, log._charObjId);
  262. statement.setString(2, log._hwid);
  263. statement.setString(3, log._msg);
  264. statement.setLong(4, log._time);
  265. statement.addBatch();
  266. }
  267.  
  268. statement.executeBatch();
  269. }
  270. catch (Exception e)
  271. {
  272. _log.error("Failed to save all hwid logs to db: ", e);
  273. }
  274. }
  275.  
  276. // Saving hwid time
  277. if (!_allHwids.isEmpty())
  278. {
  279. try (Connection con = DatabaseFactory.getInstance().getConnection();
  280. PreparedStatement statement = BatchStatement.createPreparedStatement(con, "INSERT INTO `hwid` (HWID,first_time_played,total_time_played,poll_answer,warnings,threat) VALUES"
  281. + "(?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE first_time_played=VALUES(first_time_played),total_time_played=VALUES(total_time_played),poll_answer=VALUES(poll_answer),warnings=VALUES(warnings),threat=VALUES(threat);"))
  282. {
  283. for (HwidGamer gamer : _allHwids)
  284. {
  285. statement.setString(1, gamer.getHwid());
  286. statement.setLong(2, gamer.getFirstTimePlayed());
  287. statement.setLong(3, gamer.getTotalTimePlayed()/1000L);
  288. statement.setInt(4, gamer.getPollAnswer());
  289. statement.setInt(5, gamer.getWarnings());
  290. statement.setString(6, gamer.getThreat().toString());
  291. statement.addBatch();
  292. }
  293.  
  294. statement.executeBatch();
  295. }
  296. catch (Exception e)
  297. {
  298. _log.error("Failed to save all hwid times to db: ", e);
  299. }
  300. }
  301. }
  302.  
  303. public static HwidEngine getInstance()
  304. {
  305. return SingletonHolder._instance;
  306. }
  307.  
  308. private static class SingletonHolder
  309. {
  310. protected static final HwidEngine _instance = new HwidEngine();
  311. }
  312. }
Advertisement
Add Comment
Please, Sign In to add comment