Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -23,11 +23,14 @@ 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
// testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add
// 'test.useTestNG()' to your build script.
testCompile 'junit:junit:4.12'
}
*/

4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -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
4 changes: 3 additions & 1 deletion src/main/java/com/batiaev/java2/lesson8/AuthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
185 changes: 158 additions & 27 deletions src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.batiaev.java2.lesson8;

import org.sqlite.JDBC;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

Expand All @@ -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<Entry> 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<Entry> 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
Expand All @@ -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;
}
}
}
20 changes: 20 additions & 0 deletions src/main/java/com/batiaev/java2/lesson8/ClientHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
Expand Down Expand Up @@ -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 {
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/com/batiaev/java2/lesson8/Command.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
12 changes: 8 additions & 4 deletions src/main/java/com/batiaev/java2/lesson8/MyServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@ public class MyServer {
private final List<ClientHandler> 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;

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
}
}