Skip to content
This repository was archived by the owner on Nov 26, 2019. It is now read-only.

Commit ad937d4

Browse files
committed
# Added Server History and changed minor things
* Added Server History * displayed server info messages now correct * You can now connect to seemingly offline servers * Fixed minor ui weaknesses
1 parent af5649b commit ad937d4

File tree

24 files changed

+615
-313
lines changed

24 files changed

+615
-313
lines changed

client/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ jfx {
110110
// this is used for files below "src/main/deploy", e.g. "src/main/deploy/windows/$rootProject.name.ico"
111111
appName = "SA-MP-ServerBrowser"
112112
additionalAppResources = 'src/main/additionalFiles'
113-
jfxMainAppJarName = "$appName"+"-"+"$projectVersion"+".jar"
113+
jfxMainAppJarName = "$appName"+".jar"
114114

115115
//precompiles the CSS to binary. Useful performance gain, if the CSS files are not modified during runtime
116116
css2bin = true

client/src/demo/java/com/msc/serverbrowser/WhatsLeftToTranslate.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,16 @@
66

77
import com.msc.serverbrowser.util.Language;
88

9+
/**
10+
* Prints all keys that are awating translation
11+
*
12+
* @author Marcel
13+
* @since 21.01.2018
14+
*/
915
public class WhatsLeftToTranslate {
16+
/**
17+
* @param args unused
18+
*/
1019
public static void main(final String[] args) {
1120

1221
final ResourceBundle englishLanguage = ResourceBundle.getBundle("com.msc.serverbrowser.localization.Lang", new Locale(Language.EN.getShortcut()));

client/src/main/java/com/msc/serverbrowser/data/FavouritesController.java

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
import java.text.MessageFormat;
1313
import java.util.ArrayList;
1414
import java.util.List;
15-
import java.util.Objects;
1615

1716
import com.msc.serverbrowser.constants.PathConstants;
1817
import com.msc.serverbrowser.data.entites.SampServer;
1918
import com.msc.serverbrowser.logging.Logging;
19+
import com.msc.serverbrowser.util.basic.StringUtility;
2020
import com.msc.serverbrowser.util.samp.SampQuery;
2121

2222
/**
@@ -87,8 +87,8 @@ public static void addServerToFavourites(final SampServer server) {
8787
}
8888
else {
8989
String statement = "INSERT INTO favourite(hostname, ip, lagcomp, language, players, maxplayers, mode, port, version, website) VALUES (''{0}'', ''{1}'', ''{2}'', ''{3}'', {4}, {5}, ''{6}'', {7}, ''{8}'', ''{9}'');";
90-
statement = escapeFormat(statement, server.getHostname(), server.getAddress(), server.getLagcomp(), server.getLanguage(), server.getPlayers()
91-
.toString(), server.getMaxPlayers().toString(), server.getMode(), server.getPort().toString(), server.getVersion(), server.getWebsite());
90+
statement = StringUtility.escapeFormat(statement, server.getHostname(), server.getAddress(), server.getLagcomp(), server.getLanguage(), server
91+
.getPlayers(), server.getMaxPlayers(), server.getMode(), server.getPort(), server.getVersion(), server.getWebsite());
9292
SQLDatabase.getInstance().execute(statement);
9393
}
9494
}
@@ -112,22 +112,13 @@ public static boolean isFavourite(final SampServer server) {
112112
*/
113113
public static void updateServerData(final SampServer server) {
114114
String statement = "UPDATE favourite SET hostname = ''{0}'', lagcomp = ''{1}'', language = ''{2}'', players = {3}, maxplayers = {4}, mode = ''{5}'', version = ''{6}'', website = ''{7}'' WHERE ip = ''{8}'' AND port = {9};";
115-
statement = escapeFormat(statement, server.getHostname(), server.getLagcomp(), server.getLanguage(), server.getPlayers().toString(), server
116-
.getMaxPlayers().toString(), server.getMode(), server.getVersion(), server.getWebsite(), server.getAddress(), server.getPort().toString());
115+
statement = StringUtility
116+
.escapeFormat(statement, server.getHostname(), server.getLagcomp(), server.getLanguage(), server.getPlayers().toString(), server
117+
.getMaxPlayers()
118+
.toString(), server.getMode(), server.getVersion(), server.getWebsite(), server.getAddress(), server.getPort().toString());
117119
SQLDatabase.getInstance().execute(statement);
118120
}
119121

120-
private static String escapeFormat(final String string, final String... replacements) {
121-
final String[] replacementsNew = new String[replacements.length];
122-
for (int i = 0; i < replacements.length; i++) {
123-
final String replacementValue = replacements[i];
124-
if (Objects.nonNull(replacementValue)) {
125-
replacementsNew[i] = replacementValue.replace("'", "''");
126-
}
127-
}
128-
return MessageFormat.format(string, (Object[]) replacementsNew);
129-
}
130-
131122
/**
132123
* Removes a server from favourites.
133124
*

client/src/main/java/com/msc/serverbrowser/data/SQLDatabase.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -50,28 +50,27 @@ private void init() {
5050
sqlConnection = DriverManager.getConnection("jdbc:sqlite:" + DB_LOCATION);
5151

5252
try (final Statement statement = sqlConnection.createStatement()) {
53-
final String createTableFavourites = "CREATE TABLE IF NOT EXISTS favourite (hostname text, ip text NOT NULL, lagcomp text, language text, players integer, maxplayers integer, mode text, port integer, version text, website text);";
53+
// TODO(MSC) favourites could be merged with serverconfig and use the servercache
54+
final String createTableFavourites = "CREATE TABLE IF NOT EXISTS favourite (hostname TEXT, ip TEXT NOT NULL, lagcomp TEXT, language TEXT, players INTEGER, maxplayers integer, mode TEXT, port INTEGER, version TEXT, website TEXT);";
5455
statement.execute(createTableFavourites);
5556

56-
final String createTableServerhistory = "CREATE TABLE IF NOT EXISTS serverhistory (hostname text, ip text NOT NULL, lagcomp text, language text, players integer, maxplayers integer, mode text, port integer, version text, website text);";
57-
statement.execute(createTableServerhistory);
57+
// TODO SOON!
58+
// final String createTableServerCache = "CREATE TABLE IF NOT EXISTS servercache (ip
59+
// TEXT NOT NULL, port INTEGER NOT NULL, hostname TEXT, language TEXT, players
60+
// INTEGER, maxplayers INTEGER, mode TEXT, version TEXT, PRIMARY KEY(ip, port));";
61+
// statement.execute(createTableServerCache);
5862

59-
final String createTableServerConfig = "CREATE TABLE IF NOT EXISTS serverconfig (ip text NOT NULL, port integer, username text);";
63+
final String createTableServerConfig = "CREATE TABLE IF NOT EXISTS serverconfig (ip TEXT NOT NULL, port INTEGER, username TEXT, lastJoin TEXT, PRIMARY KEY(ip, port));";
6064
statement.execute(createTableServerConfig);
61-
62-
final String createTableUsernames = "CREATE TABLE IF NOT EXISTS username (id integer PRIMARY KEY, username text NOT NULL);";
65+
66+
final String createTableUsernames = "CREATE TABLE IF NOT EXISTS username (id INTEGER PRIMARY KEY, username TEXT NOT NULL);";
6367
statement.execute(createTableUsernames);
6468

65-
final String createTableSettings = "CREATE TABLE IF NOT EXISTS setting (id integer UNIQUE, value text);";
69+
final String createTableSettings = "CREATE TABLE IF NOT EXISTS setting (id INTEGER PRIMARY KEY, value TEXT);";
6670
statement.execute(createTableSettings);
67-
68-
// TODO(MSC) Implement
69-
// final String createTableServerHistory = "CREATE TABLE IF NOT EXISTS favourite
70-
// (hostname text, ip text NOT NULL, lagcomp text, language text, players integer,
71-
// maxplayers integer, mode text, port integer, version text, website text);";
72-
// statement.execute(createTableServerHistory);
7371
}
74-
} catch (final SQLException exception) {
72+
}
73+
catch (final SQLException exception) {
7574
Logging.error("Error while initializing local Database connection.", exception);
7675
}
7776
}
@@ -86,7 +85,8 @@ private void init() {
8685
public boolean execute(final String statement) {
8786
try {
8887
return sqlConnection.createStatement().execute(statement);
89-
} catch (final SQLException exception) {
88+
}
89+
catch (final SQLException exception) {
9090
Logging.error("Couldn't execute query.", exception);
9191
return false;
9292
}
@@ -102,7 +102,8 @@ public boolean execute(final String statement) {
102102
public Optional<ResultSet> executeGetResult(final String statement) {
103103
try {
104104
return Optional.of(sqlConnection.prepareStatement(statement).executeQuery());
105-
} catch (final SQLException exception) {
105+
}
106+
catch (final SQLException exception) {
106107
Logging.error("Failed to execute SQL query!", exception);
107108
return Optional.empty();
108109
}
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
package com.msc.serverbrowser.data;
2+
3+
import java.sql.ResultSet;
4+
import java.sql.SQLException;
5+
import java.util.ArrayList;
6+
import java.util.Collection;
7+
import java.util.List;
8+
import java.util.Optional;
9+
10+
import com.msc.serverbrowser.data.entites.SampServer;
11+
import com.msc.serverbrowser.logging.Logging;
12+
import com.msc.serverbrowser.util.basic.StringUtility;
13+
14+
/**
15+
* Allows controller over server specific settings.
16+
* TODO(MSC) I could still improve the setter methods in case the table gets more fields.
17+
*
18+
* @author marcel
19+
* @since Jan 17, 2018
20+
*/
21+
public final class ServerConfig {
22+
23+
/**
24+
* Private constructor to prevent instantiation.
25+
*/
26+
private ServerConfig() {
27+
// Constructor to prevent instantiation.
28+
}
29+
30+
/**
31+
* Saves the last time a server has been joined.
32+
*
33+
* @param ip ip
34+
* @param port port
35+
* @param lastTimeJoined lastTimeJoined
36+
*/
37+
public static void setLastTimeJoinedForServer(final String ip, final Integer port, final Long lastTimeJoined) {
38+
final String statement = "INSERT OR REPLACE INTO serverconfig (ip, port, username, lastJoin ) values ("
39+
+ "''{0}''," // IP
40+
+ "{1}," // Port
41+
+ "(select username from serverconfig where ip=''{0}'' and port={1})," // Username
42+
+ "''{2}'');"; // lastTimeJoined
43+
final String filledStatement = StringUtility.escapeFormat(statement, ip, port, lastTimeJoined);
44+
SQLDatabase.getInstance().execute(filledStatement);
45+
}
46+
47+
/**
48+
* Sets the username to use when connect to to that specific server.
49+
*
50+
* @param ip server ip
51+
* @param port server port
52+
* @param username the username to be set
53+
*/
54+
public void setUsernameForServer(final String ip, final Integer port, final String username) {
55+
final String statement = "INSERT OR REPLACE INTO serverconfig (ip, port, username, lastJoin ) values ("
56+
+ "''{0}''," // IP
57+
+ "{1}," // Port
58+
+ "''{2}''," // Username
59+
+ "(select lastjoin from serverconfig where ip=''{0}'' and port={1}));"; // lastTimeJoined
60+
final String filledStatement = StringUtility.escapeFormat(statement, ip, port, username);
61+
SQLDatabase.getInstance().execute(filledStatement);
62+
}
63+
64+
/**
65+
* Returns the username to use for a specific server or an empty {@link Optional} in case no
66+
* username has been set.
67+
*
68+
* @param ip server ip
69+
* @param port server port
70+
* @return An {@link Optional} containing the to be used username or empty
71+
*/
72+
public Optional<String> getUsernameForServer(final String ip, final Integer port) {
73+
return getStringOfField(ip, port, "username");
74+
}
75+
76+
/**
77+
* Returns the username to use for a specific server or an empty {@link Optional} in case no
78+
* username has been set.
79+
*
80+
* @param ip server ip
81+
* @param port server port
82+
* @return An {@link Optional} containing the to be used username or empty
83+
*/
84+
public static Optional<Long> getLastJoinForServer(final String ip, final Integer port) {
85+
return getStringOfField(ip, port, "lastJoin").map(Long::parseLong);
86+
}
87+
88+
/**
89+
* Returns a list of all {@link SampServer}s which have a lastJoin date, the returned data
90+
* doesn't contain any other data whatsoever (hostname and so on).
91+
*
92+
* @return a {@link List} of all previously joined {@link SampServer}s
93+
*/
94+
public static List<SampServer> getLastJoinedServers() {
95+
final String statement = "SELECT ip, port, lastJoin FROM serverconfig WHERE lastJoin IS NOT NULL;";
96+
final Optional<ResultSet> resultSetOpt = SQLDatabase.getInstance().executeGetResult(statement);
97+
98+
final List<SampServer> servers = new ArrayList<>();
99+
if (resultSetOpt.isPresent()) {
100+
try (final ResultSet resultSet = resultSetOpt.get()) {
101+
while (resultSet.next()) {
102+
final SampServer server = new SampServer(resultSet.getString("ip"), resultSet.getInt("port"));
103+
server.setLastJoin(Long.parseLong(resultSet.getString("lastJoin")));
104+
servers.add(server);
105+
}
106+
}
107+
catch (final SQLException exception) {
108+
Logging.error("Error while retrieving previously joined servers.", exception);
109+
}
110+
}
111+
112+
return servers;
113+
}
114+
115+
/**
116+
* Fills a {@link Collection} of servers with their last join date.
117+
*
118+
* @param servers
119+
*/
120+
public static void initLastJoinData(final Collection<SampServer> servers) {
121+
servers.forEach(server -> {
122+
getLastJoinForServer(server.getAddress(), server.getPort())
123+
.ifPresent(server::setLastJoin);
124+
});
125+
}
126+
127+
private static Optional<String> getStringOfField(final String ip, final Integer port, final String field) {
128+
final String statement = "SELECT " + field + " FROM serverconfig WHERE ip=''{0}'' and port={1} AND " + field + " IS NOT NULL;";
129+
final String filledStatement = StringUtility.escapeFormat(statement, ip, port);
130+
131+
final Optional<ResultSet> resultSetOpt = SQLDatabase.getInstance().executeGetResult(filledStatement);
132+
133+
if (resultSetOpt.isPresent()) {
134+
try (final ResultSet resultSet = resultSetOpt.get()) {
135+
if (resultSet.next()) {
136+
return Optional.of(resultSet.getString(field));
137+
}
138+
}
139+
catch (final SQLException exception) {
140+
Logging.error("Error while retrieving field: '" + field + " of server: " + ip + ":" + port, exception);
141+
}
142+
}
143+
144+
return Optional.empty();
145+
}
146+
}

0 commit comments

Comments
 (0)