Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package varekd.io;
- import java.net.InetSocketAddress;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import varekd.model.Inventory;
- import varekd.model.Point;
- import varekd.model.Player;
- import varekd.model.InvItem;
- import varekd.model.PlayerAppearance;
- import varekd.model.World;
- import varekd.util.Logger;
- import varekd.util.Formulae;
- import varekd.model.BankItem;
- import varekd.Server;
- import varekd.model.Bank;
- import java.util.Calendar;
- /**
- * Coded at 1AM by a very pissed off varek.
- * So don't expect miracles.
- * WARNING: NOT THREAD SAFE.
- */
- public class DBPlayerLoader implements PlayerLoader {
- // Statements for saving/loading playerz.
- private PreparedStatement queryPlayer, queryUser, updateBan, queryBan, queryloggedin, queryInv, queryBank, querySettings, queryList, updatePlayer, updatePlayernolocs, updateInv, updateBank, updateStats, updateExp, queryExp, queryStats, clearList, saveList, updateAppearance, updateSettings, insertSuspicious;
- // This shit is whack. Blocks people who try and log in too fast.
- private Map<String, BadPassword> attempts = new HashMap<String, BadPassword>();
- public DBPlayerLoader() throws SQLException, ClassNotFoundException {
- loadStatements();
- }
- public boolean ipBanned(String ip){
- try{
- ResultSet result = Server.db.getQuery("SELECT * FROM `ipbans` WHERE `ip`=\""+ip+"\"");
- if(!result.next()){
- return false;
- }
- if(result.getByte("banned")==1){
- return true;
- }
- return false;
- }catch(SQLException sqe){System.out.println("ERROR IN SQL! == "+sqe);}
- return false;
- }
- public void loadStatements() throws SQLException {
- Connection c = DBConnection.getConnection("playerpersistence");
- queryPlayer = c.prepareStatement("SELECT * FROM player INNER JOIN appearance ON appearance.playerid = player.id " +
- "WHERE player.username=? AND player.password=SHA1(?)");
- queryUser = c.prepareStatement("SELECT * FROM `users` WHERE id=?");
- queryloggedin = c.prepareStatement("UPDATE player SET loggedin=? WHERE username=?");
- queryInv = c.prepareStatement("SELECT itemid, amount, wielded FROM invitem WHERE playerid=? " +
- "ORDER BY position");
- queryBank = c.prepareStatement("SELECT itemid, amount FROM bankitem WHERE playerid=? " +
- "ORDER BY position");
- querySettings = c.prepareStatement("SELECT * FROM setting WHERE playerid=? AND type=?");
- queryExp = c.prepareStatement("SELECT exp_attack, exp_defense, exp_strength, exp_hits, exp_ranged, exp_prayer, exp_magic, points FROM exp WHERE user=? ");
- queryStats = c.prepareStatement("SELECT attack, defense, strength, hits, ranged, prayer, magic FROM stats WHERE user=? ");
- queryList = c.prepareStatement("SELECT playerhash, type FROM playerlist WHERE playerid=?");
- updatePlayer = c.prepareStatement("UPDATE player SET " +
- "x=?, y=?, fightmode=?, lastlogin=?, lastip=?, lastskulled=?, " +
- "changingappearance=?, male=?, combat=?, 5minrule=?, banned=?, kills=?, deaths=?, user=?, clan=?, clanrank=?, muted=?, lastsaidlong=?, lastkilled=?, f2p=?, pin=?, bankreset=? WHERE id=?");
- updateBan = c.prepareStatement("UPDATE player SET banned=? WHERE username=?");
- queryBan = c.prepareStatement("SELECT group, banned FROM player WHERE username=?");
- updatePlayernolocs = c.prepareStatement("UPDATE player SET " +
- "fightmode=?, lastlogin=?, lastip=?, lastskulled=?, " +
- "changingappearance=?, male=?, combat=?, 5minrule=?, banned=?, kills=?, deaths=?, user=?, clan=?, clanrank=?, muted=?, lastsaidlong=?, lastkilled=?, f2p=?, pin=?, bankreset=? WHERE id=?");
- updateInv = c.prepareStatement("UPDATE invitem SET itemid=?, amount=?, wielded=? " +
- "WHERE playerid=? AND position=?");
- updateBank = c.prepareStatement("UPDATE bankitem SET itemid=?, amount=? " +
- "WHERE playerid=? AND position=?");
- updateExp = c.prepareStatement("UPDATE exp SET exp_attack=?, exp_defense=?, exp_strength=?, exp_hits=?, exp_ranged=?, exp_prayer=?, exp_magic=?, points=? " +
- "WHERE user=?");
- updateStats = c.prepareStatement("UPDATE stats SET attack=?, defense=?, strength=?, hits=?, ranged=?, prayer=?, magic=? " +
- "WHERE user=?");
- clearList = c.prepareStatement("DELETE FROM playerlist WHERE playerid=?");
- saveList = c.prepareStatement("INSERT INTO playerlist (playerid, playerhash, type) " +
- "VALUES (?, ?, ?)");
- updateAppearance = c.prepareStatement("UPDATE appearance SET " +
- "haircolour=?, topcolour=?, trousercolour=?, skincolour=?, head=?, body=? " +
- "WHERE playerid=?");
- updateSettings = c.prepareStatement("UPDATE setting SET " +
- "bool1=?, bool2=?, bool3=?, bool4=? WHERE type=? AND playerid=?");
- insertSuspicious = c.prepareStatement("INSERT INTO suspiciousevent (playerid, value) VALUES (?, ?)");
- }
- /**
- * This is a bit of a hack. In case the connections are somehow closed, this method will check that they're okay
- * and if they're not okay it re-loads them.
- */
- private static boolean checkStatements(PreparedStatement... stmnts) {
- for (PreparedStatement ps : stmnts) {
- try {
- if (ps == null || ps.getConnection().isClosed()) {
- return false;
- }
- } catch (SQLException sqe) {
- return false;
- }
- }
- return true;
- }
- public byte load(Player p) {
- try {
- return load0(p);
- } catch (Exception e) {
- Logger.err("Error loading " + p.getUsername());
- Logger.err(e);
- e.printStackTrace();
- }
- return (byte) 17;
- }
- public synchronized byte load0(Player p) throws SQLException {
- String ip = ((InetSocketAddress) p.getSession().getRemoteAddress()).getAddress().getHostAddress();
- Server.getServer().getThrottleFilter().connectionOk(p.getSession());
- if (attempts.containsKey(ip)) {
- BadPassword bp = attempts.get(ip);
- if (bp.nextAttempt > 0) {
- if (System.currentTimeMillis() > bp.nextAttempt) {
- attempts.remove(ip);
- } else {
- return (byte) 7;
- }
- }
- }
- if (!checkStatements(queryPlayer, queryUser, queryloggedin, queryInv, queryBank, querySettings, queryExp, queryStats, queryList)) {
- loadStatements();
- }
- queryPlayer.setString(1, p.getUsername());
- queryPlayer.setString(2, p.getPassword());
- ResultSet resultPlayer = queryPlayer.executeQuery();
- if (!resultPlayer.next()) {
- BadPassword bp = attempts.get(ip);
- if (bp == null || System.currentTimeMillis() - 10 * 60 * 1000 > bp.lastAttempt) {
- bp = new BadPassword();
- attempts.put(ip, bp);
- }
- bp.attempt++;
- bp.lastAttempt = System.currentTimeMillis();
- if (bp.attempt >= Server.getServer().getConf().getInt("security.badpasswordcount")) {
- bp.nextAttempt = System.currentTimeMillis() + Server.getServer().getConf().getInt("security.badpassworddelay");
- }
- return 0x3; //no such user/password
- } else {
- p.setGroup(resultPlayer.getByte("group"));
- p.setKills(resultPlayer.getInt("kills"));
- p.setDeaths(resultPlayer.getInt("deaths"));
- if (World.getWorld().getPlayer(p.getUsernameHash()) != null) {
- return 0x4; //user already logged in
- }
- long longSinceBanned = System.currentTimeMillis()-resultPlayer.getLong("bantime");
- p.lastSaidSomething = resultPlayer.getLong("lastsaidlong");
- p.setLastKilled(resultPlayer.getLong("lastkilled"));
- p.setBankReset(resultPlayer.getLong("bankreset"));
- boolean changing = (resultPlayer.getInt("changing") == 1);
- if(changing)
- return (byte) 16;
- if(resultPlayer.getInt("banned")==2&&longSinceBanned<resultPlayer.getLong("banlong"))
- return (byte) 11; //temporarily banned
- if(resultPlayer.getInt("banned")==1)
- return (byte) 12; //permanently banned
- if(ipBanned(p.getCurrentIP()))
- return (byte) 13; //IP banned
- if (World.getWorld().getOwner(resultPlayer.getInt("owner")) != null)
- return (byte) 14; //user already logged in
- p.setOwner(resultPlayer.getInt("owner"));
- p.setId(resultPlayer.getInt("id"));
- p.setClan(resultPlayer.getString("clan"));
- p.setClanRank(resultPlayer.getInt("clanrank"));
- p.setMuted(resultPlayer.getInt("muted"));
- p.setF2P(false);//(resultPlayer.getBoolean("f2p"));
- p.setfiveminrule(resultPlayer.getInt("5minrule"));
- int x = resultPlayer.getInt("x");
- int y = resultPlayer.getInt("y");
- int fivex = resultPlayer.getInt("5x");
- int fivey = resultPlayer.getInt("5y");
- if(p.getfiveminrule()==0){
- p.setLocation(Point.location(x, y), true);
- }else{
- p.setfivex(x);
- p.setfivey(y);
- p.setLocation(Point.location(fivex, fivey), true);
- }
- // p.setLocation(Point.location(resultPlayer.getInt("x"), resultPlayer.getInt("y")), true);
- p.setFightMode(resultPlayer.getInt("fightmode"));
- p.setLastLogin(System.currentTimeMillis());
- p.setLastIP(resultPlayer.getString("lastip"));
- p.setLastSkulled(resultPlayer.getLong("lastskulled"));
- p.setChangingAppearance(resultPlayer.getBoolean("changingappearance"));
- p.setMale(resultPlayer.getBoolean("male"));
- int owner = resultPlayer.getInt("owner");
- queryUser.setInt(1, owner);
- ResultSet resultUser = queryUser.executeQuery();
- if (!resultUser.next()) {
- p.setSubscriptionExpires(0);
- System.out.println("Fail");
- }else{
- p.setSubscriptionExpires(resultUser.getLong("subscribelong"));
- }
- //Inventory
- Inventory i = new Inventory(p);
- queryInv.setInt(1, resultPlayer.getInt("id"));
- ResultSet resultInv = queryInv.executeQuery();
- while (resultInv.next()) {
- int id = resultInv.getInt(1);
- int amount = resultInv.getInt(2);
- if (id == -1) {
- break;
- }
- InvItem it = new InvItem(id, amount);
- it.setWield(resultInv.getBoolean(3));
- i.add(it);
- }
- p.setInventory(i);
- //Bank
- Bank b = new Bank();
- queryBank.setInt(1, p.getId());
- ResultSet resultBank = queryBank.executeQuery();
- while (resultBank.next()) {
- int id = resultBank.getInt(1);
- int amount = resultBank.getInt(2);
- if (id == -1) {
- break;
- }
- BankItem it = new BankItem(id, amount);
- b.addItem(it);
- }
- ResultSet result = Server.db.getQuery("SELECT pin FROM `player` WHERE `username`=\""+p.getUsername()+"\"");
- if(!result.next()){
- b.setPin(-1);
- }else{
- b.setPin(result.getInt("pin"));
- }
- p.setBank(b);
- //Settings
- querySettings.setInt(1, p.getId());
- querySettings.setString(2, "game");
- ResultSet gameSettings = querySettings.executeQuery();
- gameSettings.next();
- p.setGameSetting(0, gameSettings.getBoolean("bool1"));
- p.setGameSetting(1, gameSettings.getBoolean("bool2"));
- p.setGameSetting(2, gameSettings.getBoolean("bool3"));
- p.setGameSetting(3, gameSettings.getBoolean("bool4"));
- querySettings.setString(2, "privacy");
- ResultSet privacySettings = querySettings.executeQuery();
- privacySettings.next();
- p.setPrivacySetting(0, privacySettings.getBoolean("bool1"));
- p.setPrivacySetting(1, privacySettings.getBoolean("bool2"));
- p.setPrivacySetting(2, privacySettings.getBoolean("bool3"));
- p.setPrivacySetting(3, privacySettings.getBoolean("bool4"));
- //Stats
- queryExp.setString(1, p.getUsername());
- ResultSet resultExp = queryExp.executeQuery();
- while (resultExp.next()) {
- p.setExp(0, resultExp.getLong(1));
- p.setExp(1, resultExp.getLong(2));
- p.setExp(2, resultExp.getLong(3));
- p.setExp(3, resultExp.getLong(4));
- p.setExp(4, resultExp.getLong(5));
- p.setExp(5, resultExp.getLong(6));
- p.setExp(6, resultExp.getLong(7));
- p.setExp(7, resultExp.getLong(8));
- p.setMaxStat(0, Formulae.experienceToLevel(resultExp.getLong(1)));
- p.setMaxStat(1, Formulae.experienceToLevel(resultExp.getLong(2)));
- p.setMaxStat(2, Formulae.experienceToLevel(resultExp.getLong(3)));
- p.setMaxStat(3, Formulae.experienceToLevel(resultExp.getLong(4)));
- p.setMaxStat(4, Formulae.experienceToLevel(resultExp.getLong(5)));
- p.setMaxStat(5, Formulae.experienceToLevel(resultExp.getLong(6)));
- p.setMaxStat(6, Formulae.experienceToLevel(resultExp.getLong(7)));
- p.setMaxStat(7, Formulae.experienceToLevel(resultExp.getLong(8)));
- }
- queryStats.setString(1, p.getUsername());
- ResultSet resultStats = queryStats.executeQuery();
- while (resultStats.next()) {
- p.setCurStat(0, resultStats.getInt(1));
- p.setCurStat(1, resultStats.getInt(2));
- p.setCurStat(2, resultStats.getInt(3));
- p.setCurStat(3, resultStats.getInt(4));
- p.setCurStat(4, resultStats.getInt(5));
- p.setCurStat(5, resultStats.getInt(6));
- p.setCurStat(6, resultStats.getInt(7));
- }
- // queryloggedin.setInt(1, 0);
- //queryloggedin.setString(2, p.getUsername());
- // queryloggedin.executeUpdate();
- // Server.db.updateQuery("UPDATE `player` SET `loggedin`=1 WHERE `username`=\""+p.getUsername()+"\"");
- Server.db.updateQuery("UPDATE `player` SET `banned`=0 WHERE `username`=\""+p.getUsername()+"\"");
- queryList.setInt(1, p.getId());
- List<Long> friendsList = new ArrayList<Long>(), ignoreList = new ArrayList<Long>();
- ResultSet resultList = queryList.executeQuery();
- while (resultList.next()) {
- long playerHash = resultList.getLong(1);
- String type = resultList.getString(2);
- if (type.equals("ignore")) {
- ignoreList.add(playerHash);
- } else if (type.equals("friend")) {
- friendsList.add(playerHash);
- }
- }
- p.setFriendList(friendsList);
- p.setIgnoreList(ignoreList);
- //Appearance
- PlayerAppearance pa = new PlayerAppearance(resultPlayer.getInt("haircolour"), resultPlayer.getInt("topcolour"),
- resultPlayer.getInt("trousercolour"), resultPlayer.getInt("skincolour"), resultPlayer.getInt("head"),
- resultPlayer.getInt("body"));
- p.setWornItems(pa.getSprites());
- p.setAppearance(pa);
- Server.getServer().getThrottleFilter().acceptedLogin(p.getSession());
- return (p.getGroup() == 2 ? (byte) 25 : (p.getGroup() == 1 ? (byte) 24 : 0x00));
- }
- }
- public void save(Player p) {
- try {
- save0(p);
- } catch (Exception e) {
- Logger.err("Error loading " + p.getUsername());
- Logger.err(e);
- }
- }
- public synchronized void save0(Player p) throws SQLException {
- int i = 0, x = 0, y = 0;
- try {
- x = p.getLocation().getX();
- y = p.getLocation().getY();
- } catch (Exception e) {
- }
- if (!checkStatements(updatePlayer, updateInv, updateBank, updateStats, updateExp, clearList, saveList, updateAppearance, updateSettings)) {
- loadStatements();
- }
- if(!p.getLocation().in5minroom()){
- updatePlayer.setInt(++i, x);
- updatePlayer.setInt(++i, y);
- updatePlayer.setInt(++i, p.getFightMode());
- updatePlayer.setLong(++i, p.getLastLogin());
- updatePlayer.setString(++i, p.getCurrentIP());
- updatePlayer.setLong(++i, p.getLastSkulled());
- updatePlayer.setBoolean(++i, p.isChangingAppearance());
- updatePlayer.setBoolean(++i, p.isMale());
- updatePlayer.setInt(++i, p.getCombatLevel());
- updatePlayer.setInt(++i, p.getfiveminrule());
- updatePlayer.setInt(++i, p.getBanned());
- updatePlayer.setInt(++i, p.getKills());
- updatePlayer.setInt(++i, p.getDeaths());
- updatePlayer.setLong(++i, p.getUsernameHash());
- updatePlayer.setString(++i, p.getClan());
- updatePlayer.setInt(++i, p.getClanRank());
- updatePlayer.setInt(++i, p.getMuted());
- updatePlayer.setLong(++i, p.lastSaidSomething);
- updatePlayer.setLong(++i, p.getLastKilled());
- updatePlayer.setBoolean(++i, p.isF2P());
- updatePlayer.setInt(++i, p.getBank().getPin());
- updatePlayer.setLong(++i, p.getBankReset());
- updatePlayer.setInt(++i, p.getId());
- updatePlayer.executeUpdate();
- }
- else{
- updatePlayernolocs.setInt(++i, p.getFightMode());
- updatePlayernolocs.setLong(++i, p.getLastLogin());
- updatePlayernolocs.setString(++i, p.getCurrentIP());
- updatePlayernolocs.setLong(++i, p.getLastSkulled());
- updatePlayernolocs.setBoolean(++i, p.isChangingAppearance());
- updatePlayernolocs.setBoolean(++i, p.isMale());
- updatePlayernolocs.setInt(++i, p.getCombatLevel());
- updatePlayernolocs.setInt(++i, p.getfiveminrule());
- updatePlayernolocs.setInt(++i, p.getBanned());
- updatePlayernolocs.setInt(++i, p.getKills());
- updatePlayernolocs.setInt(++i, p.getDeaths());
- updatePlayernolocs.setLong(++i, p.getUsernameHash());
- updatePlayernolocs.setString(++i, p.getClan());
- updatePlayernolocs.setInt(++i, p.getClanRank());
- updatePlayernolocs.setInt(++i, p.getMuted());
- updatePlayernolocs.setLong(++i, p.lastSaidSomething);
- updatePlayernolocs.setLong(++i, p.getLastKilled());
- updatePlayernolocs.setBoolean(++i, p.isF2P());
- updatePlayernolocs.setInt(++i, p.getBank().getPin());
- updatePlayernolocs.setLong(++i, p.getBankReset());
- updatePlayernolocs.setInt(++i, p.getId());
- updatePlayernolocs.executeUpdate();
- }
- // Server.db.updateQuery("UPDATE `player` SET `loggedin`=0 WHERE `username`=\""+p.getUsername()+"\"");
- updateInv.setInt(4, p.getId());
- for (int slot = 0; slot < 30; slot++) {
- InvItem it = p.getInventory().get(slot);
- updateInv.setInt(1, it == null ? -1 : it.getId());
- updateInv.setInt(2, it == null ? -1 : it.getAmount());
- updateInv.setBoolean(3, it == null ? false : it.isWielded());
- updateInv.setInt(5, slot);
- updateInv.addBatch();
- }
- updateInv.executeBatch();
- updateBank.setInt(3, p.getId());
- for (int slot = 0; slot < 256; slot++) {
- BankItem it = p.getBank().getItem(slot);
- updateBank.setInt(1, it == null ? -1 : it.getId());
- updateBank.setInt(2, it == null ? -1 : it.getAmount());
- updateBank.setInt(4, slot);
- updateBank.addBatch();
- }
- updateBank.executeBatch();
- updateExp.setString(9, p.getUsername());
- updateExp.setLong(1, p.getExp(0));
- updateExp.setLong(2, p.getExp(1));
- updateExp.setLong(3, p.getExp(2));
- updateExp.setLong(4, p.getExp(3));
- updateExp.setLong(5, p.getExp(4));
- updateExp.setLong(6, p.getExp(5));
- updateExp.setLong(7, p.getExp(6));
- updateExp.setLong(8, p.getExp(7));
- updateExp.addBatch();
- updateExp.executeBatch();
- updateStats.setString(8, p.getUsername());
- updateStats.setLong(1, p.getCurStat(0));
- updateStats.setLong(2, p.getCurStat(1));
- updateStats.setLong(3, p.getCurStat(2));
- updateStats.setLong(4, p.getCurStat(3));
- updateStats.setLong(5, p.getCurStat(4));
- updateStats.setLong(6, p.getCurStat(5));
- updateStats.setLong(7, p.getCurStat(6));
- updateStats.addBatch();
- updateStats.executeBatch();
- clearList.setInt(1, p.getId());
- clearList.executeUpdate();
- saveList.setInt(1, p.getId());
- for (long friend : p.getFriendList()) {
- saveList.setLong(2, friend);
- saveList.setString(3, "friend");
- saveList.addBatch();
- }
- saveList.executeBatch();
- for (long ignore : p.getIgnoreList()) {
- saveList.setLong(2, ignore);
- saveList.setString(3, "ignore");
- saveList.addBatch();
- }
- saveList.executeBatch();
- PlayerAppearance pa = p.getAppearance();
- updateAppearance.setInt(1, pa.getHairColour());
- updateAppearance.setInt(2, pa.getTopColour());
- updateAppearance.setInt(3, pa.getTrouserColour());
- updateAppearance.setInt(4, pa.getSkinColour());
- updateAppearance.setInt(5, pa.getHead());
- updateAppearance.setInt(6, pa.getBody());
- updateAppearance.setInt(7, p.getId());
- updateAppearance.executeUpdate();
- updateSettings.setInt(6, p.getId());
- updateSettings.setString(5, "game");
- for (int n = 0; n < 4; n++) {
- updateSettings.setBoolean(n + 1, p.getGameSetting(n));
- }
- updateSettings.addBatch();
- updateSettings.setString(5, "privacy");
- for (int n = 0; n < 4; n++) {
- updateSettings.setBoolean(n + 1, p.getPrivacySetting(n));
- }
- updateSettings.addBatch();
- updateSettings.executeBatch();
- }
- public int getGroup(String name) {
- try {
- return getGroup0(name);
- } catch (Exception e) {
- Logger.err("Error loading " + name);
- Logger.err(e);
- }
- return 0;
- }
- public int getGroup0(String name) throws SQLException{
- int i = 0;
- if (!checkStatements(queryBan)) {
- loadStatements();
- }
- queryBan.setString(++i, name);
- ResultSet resultBan = queryBan.executeQuery();
- return (int)resultBan.getByte("group");
- }
- public int getBanned(String name) {
- try {
- return getBanned0(name);
- } catch (Exception e) {
- Logger.err("Error loading " + name);
- Logger.err(e);
- }
- return -1;
- }
- public int getBanned0(String name) throws SQLException{
- int i = 0;
- if (!checkStatements(queryBan)) {
- loadStatements();
- }
- queryBan.setString(++i, name);
- ResultSet resultBan = queryBan.executeQuery();
- if(resultBan.next()) {
- return (int)resultBan.getByte("banned");
- }
- return -1;
- }
- public void ban(String name, int banned) {
- try {
- ban0(name, banned);
- } catch (Exception e) {
- Logger.err("Error loading " + name);
- Logger.err(e);
- }
- }
- public void ban0(String name, int banned) throws SQLException{
- if (!checkStatements(updateBan)) {
- loadStatements();
- }
- updateBan.setByte(1, (byte)banned);
- updateBan.setString(2, name);
- updateBan.executeUpdate();
- }
- static class BadPassword {
- int attempt = 0;
- long nextAttempt, lastAttempt;
- }
- }
Add Comment
Please, Sign In to add comment