package space.models; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import space.Server; import space.physics.Entity; import sql.SQL; import com.corundumstudio.socketio.SocketIOClient; public class User { private static SQL sql = SQL.getInstance(); private static PreparedStatement select = sql.prepareStatement("SELECT `id`, `auth`, `credits` FROM `users` WHERE `username`=?"); private static Server _server = Server.instance(); public static User getUserIfAuthed(SocketIOClient socket, User.Login data) throws SQLException { select.setString(1, data.name); try(ResultSet r = select.executeQuery()) { if(r.next()) { if(data.auth.equals(r.getString("auth"))) { return new User(socket, r, data); } else { System.err.println("Auth error for " + data.name + " (" + socket.getRemoteAddress() + ")"); //TODO: Log auth error } } } return null; } public final SocketIOClient socket; public final int id; public final String name; public final int credits; private LoginResponse _serializeLoginResponse = new LoginResponse(); public LoginResponse serializeLoginResponse() { return _serializeLoginResponse; } private Ship _ship; private User(SocketIOClient socket, ResultSet r, User.Login data) throws SQLException { this.socket = socket; id = r.getInt("id"); name = data.name; credits = r.getInt("credits"); } public Ship ship() { return _ship; } public void sendMessage(String from, String message) { socket.sendEvent("ms", new User.Message(from, message)); } public void sendEntity(Entity.Add add) { socket.sendEvent("ea", add); } public void sendCelestial(Entity.Add add) { socket.sendEvent("ca", add); } public void sendUpdate(Entity.Update[] update) { socket.sendEvent("up", update); } public void sendCelestials(Entity.Update[] update) { socket.sendEvent("cp", update); } public void useShip(Ship.Use data) { leaveShip(); _ship = _server.findShip(data.s, data.i); //TODO: handle shit if(_ship == null) { System.out.println("Disconnecting user for invalid ship"); socket.disconnect(); return; } _ship.use(this); } public void leaveShip() { if(_ship != null) { _ship.leave(); } } public void sendUseShip(Ship ship) { socket.sendEvent("us", new Ship.Use(ship)); } public static class Login { public String name; public String auth; } public class LoginResponse { public int getId() { return id; } public void send() { socket.sendEvent("lr", this); } } public static class Message { public String id; public String msg; public Message() { } public Message(String id, String msg) { this.id = id; this.msg = msg; } } }