diff --git a/build.gradle b/build.gradle index 96b7dd7..6424313 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ apply plugin: 'java' apply plugin: 'idea' -/* + // In this section you declare where to find the dependencies of your project repositories { // Use 'jcenter' for resolving your dependencies. @@ -23,6 +23,9 @@ repositories { dependencies { // The production code uses the SLF4J logging API at compile time compile 'org.slf4j:slf4j-api:1.7.22' + + compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.7.2' + // Declare the dependency for your favourite test framework you want to use in your tests. // TestNG is also supported by the Gradle Test task. Just change the @@ -30,4 +33,4 @@ dependencies { // 'test.useTestNG()' to your build script. testCompile 'junit:junit:4.12' } -*/ + diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2bb29e6..e2fb696 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Oct 25 22:22:22 MSK 2017 +#Wed Sep 26 15:18:39 YEKT 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip diff --git a/src/main/java/com/batiaev/java2/lesson8/AuthService.java b/src/main/java/com/batiaev/java2/lesson8/AuthService.java index f04c5a7..c953ef8 100644 --- a/src/main/java/com/batiaev/java2/lesson8/AuthService.java +++ b/src/main/java/com/batiaev/java2/lesson8/AuthService.java @@ -12,5 +12,7 @@ public interface AuthService { boolean login(String login, String pass); - boolean contains(String userName); + boolean contains(String nick); + + void changeNick(String login, String newNick); } diff --git a/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java b/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java index 3415d24..0395e80 100644 --- a/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java +++ b/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java @@ -1,5 +1,8 @@ package com.batiaev.java2.lesson8; +import org.sqlite.JDBC; + +import java.sql.*; import java.util.ArrayList; import java.util.List; @@ -10,42 +13,109 @@ * @since 06/11/17 */ public class BaseAuthService implements AuthService { - private class Entry { - private String login; - private String password; - private String nick; - public Entry(String login, String password, String nick) { - this.login = login; - this.password = password; - this.nick = nick; - } + private final String DB_PATH = "C:\\dev\\java\\desktop\\coursejava2\\users.db"; + private List entries; + private Connection conn; + private PreparedStatement addUserStatement; + private PreparedStatement selectUsersStatement; + private PreparedStatement updateNickStatement; + private PreparedStatement updatePasswordStatement; + private PreparedStatement deleteUserStatement; - public String getLogin() { - return login; - } + public BaseAuthService() { + init(); + } - public String getPassword() { - return password; + public void init() { + + try { + Class.forName("org.sqlite.JDBC"); + conn = DriverManager.getConnection(JDBC.PREFIX + DB_PATH); + Statement stmt = conn.createStatement(); + stmt.execute("CREATE TABLE IF NOT EXISTS users (login VARCHAR (50) UNIQUE NOT NULL PRIMARY KEY, password VARCHAR (250), nick VARCHAR (250) UNIQUE NOT NULL)"); + + selectUsersStatement = conn.prepareStatement("SELECT login, password, nick FROM USERS"); + addUserStatement = conn.prepareStatement("INSERT INTO USERS (login,password,nick) VALUES(?,?,?)"); + updateNickStatement = conn.prepareStatement("update USERS SET nick = ? WHERE login = ?"); + updatePasswordStatement = conn.prepareStatement("update USERS SET password = ? WHERE login = ?"); + deleteUserStatement = conn.prepareStatement("DELETE FROM USERS WHERE login=?"); + + loadUsersFromDB(); + + if (entries.size() == 0) { + for (int i = 0; i < 3; i++) { + addLogin("login" + i, "pass" + i, "nick" + i); + } + } + } catch (SQLException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); } + } - public String getNick() { - return nick; + private void addLogin(String login, String password, String nick) { + if (!contains(nick) && !containsLogin(login)) { + Entry entry = new Entry(login, password, nick); + try { + addUserStatement.setString(1, login); + addUserStatement.setString(2, password); + addUserStatement.setString(3, nick); + addUserStatement.execute(); + entries.add(entry); + } catch (SQLException e) { + e.printStackTrace(); + } } } - private List entries; + private void deleteUser(String login) { + try { + for (Entry entry : entries) { + if (entry.getLogin().equals(login)) { + deleteUserStatement.setString(1, login); + deleteUserStatement.execute(); + entries.remove(entry); + break; + } + } + } catch (SQLException e) { + e.printStackTrace(); + } + } - public BaseAuthService() { - init(); + private void updatePassword(String login, String password) { + try { + for (Entry entry : entries) { + if (entry.getLogin().equals(login)) { + updatePasswordStatement.setString(1, password); + updatePasswordStatement.setString(2, login); + updatePasswordStatement.execute(); + entry.setPassword(password); + break; + } + } + } catch (SQLException e) { + e.printStackTrace(); + } } - public int init() { - entries = new ArrayList<>(); - entries.add(new Entry("login1", "pass1", "nick1")); - entries.add(new Entry("login2", "pass2", "nick2")); - entries.add(new Entry("login3", "pass3", "nick3")); - return entries.size(); + @Override + public void changeNick(String login, String nick) { + try { + for (Entry entry : entries) { + if (entry.getLogin().equals(login)) { + updateNickStatement.setString(1, nick); + updateNickStatement.setString(2, login); + updateNickStatement.execute(); + entry.setNick(nick); + break; + } + } + } catch (SQLException e) { + e.printStackTrace(); + } } @Override @@ -65,12 +135,73 @@ public boolean login(String login, String pass) { } @Override - public boolean contains(String userName) { + public boolean contains(String nick) { + if (nick == null || nick.trim().isEmpty()) return false; + + for (Entry e : entries) { + if (nick.equals(e.getNick())) return true; + } + return false; + } + + private boolean containsLogin(String userName) { if (userName == null || userName.trim().isEmpty()) return false; for (Entry e : entries) { - if (userName.equals(e.getNick())) return true; + if (userName.equals(e.getLogin())) return true; } return false; } + + private void loadUsersFromDB() { + if (entries == null) { + entries = new ArrayList<>(); + } else { + entries.clear(); + } + + try { + ResultSet rs = selectUsersStatement.executeQuery(); + while (rs.next()) { + String login = rs.getString(1); + String password = rs.getString(2); + String nick = rs.getString(3); + entries.add(new Entry(login, password, nick)); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + + private class Entry { + private String login; + private String password; + private String nick; + + public Entry(String login, String password, String nick) { + this.login = login; + this.password = password; + this.nick = nick; + } + + public String getLogin() { + return login; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + } } diff --git a/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java b/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java index 9f975a4..f542ef8 100644 --- a/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java +++ b/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java @@ -21,6 +21,7 @@ public class ClientHandler extends Thread implements Closeable { private DataOutputStream out; private DataInputStream in; private String name = "unknown"; + private String login = ""; private boolean isAuth = false; private LocalDateTime connectTime = LocalDateTime.now(); @@ -48,6 +49,8 @@ public void run() { sendPrivateMessage(msg); } else if (msg.startsWith(Command.CHAT_MESSAGE.getText() + " ")) { sendChatMessage(msg); + } else if (msg.startsWith(Command.CHANGE_NICK.getText() + " ")) { + changeNick(msg); } } else { sendBroadcastMessage(name + " написал: " + msg); @@ -60,6 +63,22 @@ public void run() { System.out.println("Client disconnected"); } + private void changeNick(String msg) { + if(login.equals("")){ + return; + } + String newNick = msg.substring(Command.CHANGE_NICK.getText().length()).trim(); + + String userName = newNick; + if (isUserExist(userName)) { + sendMessage("Ник не изменен! '" + newNick + "' - уже занят"); + } else { + name = newNick; + server.changeNick(login, newNick); + sendMessage("Ник изменен на '" + newNick + "'!"); + } + } + private boolean isUserExist(String userName) { return server.getAuthService().contains(userName); } @@ -127,6 +146,7 @@ private void userAuth(String msg) { name = server.getAuthService().getNick(data[1], data[2]); if (name != null) { sendMessage("/authok " + name); + login = data[1]; isAuth = true; sendBroadcastMessage(name + " зашел в чат!"); } else { diff --git a/src/main/java/com/batiaev/java2/lesson8/Command.java b/src/main/java/com/batiaev/java2/lesson8/Command.java index 878c971..2e17b38 100644 --- a/src/main/java/com/batiaev/java2/lesson8/Command.java +++ b/src/main/java/com/batiaev/java2/lesson8/Command.java @@ -11,7 +11,8 @@ public enum Command { AUTHOK_COMMAND("/authok"), DISCONNECTED("/disconnected"), PRIVATE_MESSAGE("/w"), - CHAT_MESSAGE("/clients"); + CHAT_MESSAGE("/clients"), + CHANGE_NICK("/nick"); public String getText() { return text; diff --git a/src/main/java/com/batiaev/java2/lesson8/MyServer.java b/src/main/java/com/batiaev/java2/lesson8/MyServer.java index aeb6d46..a638963 100644 --- a/src/main/java/com/batiaev/java2/lesson8/MyServer.java +++ b/src/main/java/com/batiaev/java2/lesson8/MyServer.java @@ -21,10 +21,6 @@ public class MyServer { private final List clients = Collections.synchronizedList(new ArrayList<>()); private AuthService authService; - public static void main(String[] args) { - new MyServer(new BaseAuthService()); - } - private MyServer(AuthService authService) { this.authService = authService; @@ -53,6 +49,10 @@ private MyServer(AuthService authService) { } } + public static void main(String[] args) { + new MyServer(new BaseAuthService()); + } + private void startKiller() { new Thread(() -> { while (true) { @@ -94,4 +94,8 @@ void sendPrivateMessage(String from, String userName, String message) { c.sendMessage(from + " написал лично " + userName + ": " + message); } } + + public void changeNick(String login, String newNick) { + authService.changeNick(login, newNick); + } }