From 19447e5e541513d485595117723608bc95a7e62b Mon Sep 17 00:00:00 2001 From: Ilya Date: Sun, 26 Apr 2020 17:39:11 +0300 Subject: [PATCH] convert code --- .../executionHistory/executionHistory.bin | Bin 20081 -> 206920 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/5.6.1/fileContent/fileContent.lock | Bin 0 -> 17 bytes .gradle/5.6.1/fileHashes/fileHashes.bin | Bin 18697 -> 22997 bytes .gradle/5.6.1/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../5.6.1/fileHashes/resourceHashesCache.bin | Bin 0 -> 18531 bytes .gradle/5.6.1/javaCompile/classAnalysis.bin | Bin 0 -> 193431 bytes .gradle/5.6.1/javaCompile/jarAnalysis.bin | Bin 0 -> 68712 bytes .gradle/5.6.1/javaCompile/javaCompile.lock | Bin 0 -> 17 bytes .gradle/5.6.1/javaCompile/taskHistory.bin | Bin 0 -> 26590 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .gradle/buildOutputCleanup/outputFiles.bin | Bin 18713 -> 19001 bytes WebInfoSponge.ipr | 151 ++++++++++++++++ WebInfoSponge.iws | 100 ++++++++++- WebInfoSponge.main.iml | 18 +- WebInfoSponge.test.iml | 39 ++-- build.gradle | 3 + build/resources/main/resources/langs/ru.json | 20 +++ .../main/resources/web/css/index.css | 0 .../resources/main/resources/web/js/index.js | 33 ++++ .../main/resources/web/pages/Index.html | 30 ++++ .../main/resources/web/pages/auth/Index.html | 19 ++ gradle/wrapper/gradle-wrapper.properties | 3 +- .../java/ru/redguy/webinfomod/Config.java | 52 ++++++ .../java/ru/redguy/webinfomod/IWebPage.java | 11 ++ .../java/ru/redguy/webinfomod/Logger.java | 22 +++ .../java/ru/redguy/webinfomod/LoggerType.java | 16 ++ src/main/java/ru/redguy/webinfomod/User.java | 12 ++ .../ru/redguy/webinfomod/UsersConfig.java | 48 +++++ .../ru/redguy/webinfomod/WebInfoSponge.java | 14 +- .../java/ru/redguy/webinfomod/WebPage.java | 12 ++ .../java/ru/redguy/webinfomod/WebServer.java | 73 ++++++++ .../ru/redguy/webinfomod/langs/Category.java | 5 + .../ru/redguy/webinfomod/langs/LangFile.java | 38 ++++ .../ru/redguy/webinfomod/langs/Links.java | 16 ++ .../redguy/webinfomod/langs/RootCategory.java | 11 ++ .../ru/redguy/webinfomod/langs/Titles.java | 16 ++ .../ru/redguy/webinfomod/langs/Words.java | 24 +++ .../redguy/webinfomod/langs/enums/Links.java | 17 ++ .../langs/enums/RootCategories.java | 7 + .../redguy/webinfomod/langs/enums/Titles.java | 15 ++ .../redguy/webinfomod/langs/enums/Words.java | 17 ++ .../langs/langcaterories/Difficulty.java | 17 ++ .../ru/redguy/webinfomod/pages/Index.java | 28 +++ .../redguy/webinfomod/pages/auth/Index.java | 25 +++ .../redguy/webinfomod/pages/auth/Worker.java | 60 +++++++ .../webinfomod/pages/json/MainData.java | 25 +++ .../redguy/webinfomod/pages/logout/Index.java | 21 +++ .../ru/redguy/webinfomod/utils/DataUtils.java | 17 ++ .../ru/redguy/webinfomod/utils/DoerUtils.java | 5 + .../ru/redguy/webinfomod/utils/WebUtils.java | 170 ++++++++++++++++++ src/main/resources/resources/langs/ru.json | 20 +++ .../resources/resources/web/css/index.css | 0 src/main/resources/resources/web/js/index.js | 33 ++++ .../resources/resources/web/pages/Index.html | 30 ++++ .../resources/web/pages/auth/Index.html | 19 ++ 56 files changed, 1285 insertions(+), 27 deletions(-) create mode 100644 .gradle/5.6.1/fileContent/fileContent.lock create mode 100644 .gradle/5.6.1/fileHashes/resourceHashesCache.bin create mode 100644 .gradle/5.6.1/javaCompile/classAnalysis.bin create mode 100644 .gradle/5.6.1/javaCompile/jarAnalysis.bin create mode 100644 .gradle/5.6.1/javaCompile/javaCompile.lock create mode 100644 .gradle/5.6.1/javaCompile/taskHistory.bin create mode 100644 build/resources/main/resources/langs/ru.json create mode 100644 build/resources/main/resources/web/css/index.css create mode 100644 build/resources/main/resources/web/js/index.js create mode 100644 build/resources/main/resources/web/pages/Index.html create mode 100644 build/resources/main/resources/web/pages/auth/Index.html create mode 100644 src/main/java/ru/redguy/webinfomod/Config.java create mode 100644 src/main/java/ru/redguy/webinfomod/IWebPage.java create mode 100644 src/main/java/ru/redguy/webinfomod/Logger.java create mode 100644 src/main/java/ru/redguy/webinfomod/LoggerType.java create mode 100644 src/main/java/ru/redguy/webinfomod/User.java create mode 100644 src/main/java/ru/redguy/webinfomod/UsersConfig.java create mode 100644 src/main/java/ru/redguy/webinfomod/WebPage.java create mode 100644 src/main/java/ru/redguy/webinfomod/WebServer.java create mode 100644 src/main/java/ru/redguy/webinfomod/langs/Category.java create mode 100644 src/main/java/ru/redguy/webinfomod/langs/LangFile.java create mode 100644 src/main/java/ru/redguy/webinfomod/langs/Links.java create mode 100644 src/main/java/ru/redguy/webinfomod/langs/RootCategory.java create mode 100644 src/main/java/ru/redguy/webinfomod/langs/Titles.java create mode 100644 src/main/java/ru/redguy/webinfomod/langs/Words.java create mode 100644 src/main/java/ru/redguy/webinfomod/langs/enums/Links.java create mode 100644 src/main/java/ru/redguy/webinfomod/langs/enums/RootCategories.java create mode 100644 src/main/java/ru/redguy/webinfomod/langs/enums/Titles.java create mode 100644 src/main/java/ru/redguy/webinfomod/langs/enums/Words.java create mode 100644 src/main/java/ru/redguy/webinfomod/langs/langcaterories/Difficulty.java create mode 100644 src/main/java/ru/redguy/webinfomod/pages/Index.java create mode 100644 src/main/java/ru/redguy/webinfomod/pages/auth/Index.java create mode 100644 src/main/java/ru/redguy/webinfomod/pages/auth/Worker.java create mode 100644 src/main/java/ru/redguy/webinfomod/pages/json/MainData.java create mode 100644 src/main/java/ru/redguy/webinfomod/pages/logout/Index.java create mode 100644 src/main/java/ru/redguy/webinfomod/utils/DataUtils.java create mode 100644 src/main/java/ru/redguy/webinfomod/utils/DoerUtils.java create mode 100644 src/main/java/ru/redguy/webinfomod/utils/WebUtils.java create mode 100644 src/main/resources/resources/langs/ru.json create mode 100644 src/main/resources/resources/web/css/index.css create mode 100644 src/main/resources/resources/web/js/index.js create mode 100644 src/main/resources/resources/web/pages/Index.html create mode 100644 src/main/resources/resources/web/pages/auth/Index.html diff --git a/.gradle/5.6.1/executionHistory/executionHistory.bin b/.gradle/5.6.1/executionHistory/executionHistory.bin index 67b96a5c7b950d7694028d429f93e10c780d77f8..6042342c5001b1ce3b6fb53682bb04a7b4b2ce9a 100644 GIT binary patch literal 206920 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 literal 17 UcmZQJ3fptTb1BPt1_)pW057Kl=l}o! diff --git a/.gradle/5.6.1/fileHashes/resourceHashesCache.bin b/.gradle/5.6.1/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..214f729e82879e39391bcaa5e9b8564d392b814a GIT binary patch literal 18531 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 Kj3^`1kNgJ-otP{D literal 0 HcmV?d00001 diff --git a/.gradle/5.6.1/javaCompile/javaCompile.lock b/.gradle/5.6.1/javaCompile/javaCompile.lock new file mode 100644 index 0000000000000000000000000000000000000000..e94a2cd5e9225cd701b4104d5ad4419be236a685 GIT binary patch literal 17 VcmZSnHm5oDikIdT1~6bM0suL61kC^d literal 0 HcmV?d00001 diff --git a/.gradle/5.6.1/javaCompile/taskHistory.bin b/.gradle/5.6.1/javaCompile/taskHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..5af09e1fb350a5e91a280b5a7fe5c293f9b34dee GIT binary patch literal 26590 zcmeI13yfS<8OOJXz!G_ch}QCGNkCF%uJ^p|Ij2etFWX`*m0AmU5zccv-PyUz%#O>J zU{Xm0q$nvRgv4k|tCSWr)I>rkEh6$L1ZY94={^75#v9DvtmSGhL1OkCTAP@)y0)apv5C{YUfj}S- z2m}IwKp+qZ1OkCTAP@)y0{<@r7Qu}i-n^NqryZ0pjvDOhia!L4DFUZ;S?Qv>tJTxFl_8Zb%o;W0((_$^R!dVE?2&GxAC#tGywq#(S z-=q`J(2&V&Dpg1O!b#j9-$~siPYX19%Ez^uMrVKSSq!0302ZC zhLLj0%XloXR0I|Zcbrzt@ryS1e&giVmi=a~e(8iSFWI-@tcNF#Vt9{AutzP+V!Mz| zoFbY#suYC{!Yr1GN`_-BjTMfH7)b@y+1zHh#ONNaTfFa?Exm(m!DC;z=BC~?TeeMH zSYD^~ilv20qwr! z&t1Q>v~l~#@7%QEyIXeO@W{lq!5v3ES=Li=QMtMl@;~iql%a#sB6pxH6B)(9pO+YNulVdf(bh*w61c@0C(x^HWcDTaovR&!0Q zlqi7|6>!pVpv-$AGT)NoR55e-lnT} z|6<}f&{FX|jeH7eKH}o6P{bmHv@8B`%AECzTZs}b6vCD}O9YQ)Gp3Zs6scJ{;(H%h zNtT^+{_4d~-X%Wq#k~h4%hhUGt-qF4U0N(JDb|;$YBd{B&0zw=FGeiQk6(tJ%#sBU)(B<>%6!*~Be#M5{x6FRwN5>pCZ^4FZRz7+__h2&X zqN1RR2OJ4FiVf9@5$K^56cWOxMJ*LEg|w|_F7Ixu^pPsn1yibjvWgy9lnWj`x)gA)*$%Pef-<~ zZJbMm#PYzBhK{s@(@0faJu=FBSB8WgE+!yCQ#ia8MxKMjI7t{2u=~ZJYaFK3#>@$w z3m&PaJg88)a>t36U46_Ow{P2V^SV`EUw?5M9qGMQj>^S_P=yk#2r~J&!C0)I(-UsA zRxxlUwi-Z z^r1KJz3to@-`yd7)vR21g+NqVIRA_V3+J5orBr)sy%!7%PAP)X+Uq2NJjI&9yqOTF zAPFx(2Isd}T%wRVc8TWxZ+`36bE=QMIm^>~KC^zsac{nJ>i*BXVK#^(RqsplZx-Q{ z8b_S5h9ktZ0V9~VND7ChNr-Ss%#&CkX?-40f`CHH;jfAQhlUoM`1%j;oU-rL#ar8G zi@Ddmd}O>F_XMShL^W#t0AvQ3bKP*IhYu$eO=Tz3laSp84>qL#}Bx=$& z<9U5ZV&Urqcyy@s1Z8`vrX}xjt7NP?fQZPQT@!wu%Tm literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index e3102b9c205d02e6f98f351ab228058570251cbb..60e5a2dacf90b0ca43d61602f86c8c89c5604b7b 100644 GIT binary patch literal 17 UcmZP$mvx=E=jr8O1_(F^05KZ`)&Kwi literal 17 UcmZP$mvx=E=jr8O1_05E9;Bme*a diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index b513f4715a8731b924fd37aaeef39d9169164168..87ee96e4a4d11d22ea646c392f68911c31792892 100644 GIT binary patch delta 436 zcmbO^iE-x?#tkMCk}{3!Cs@y)JO3pE7Y`85U-G3Q(_K^5(J-j^ z$H~1w#ZP&cAdI vs>Xk^siYPY)5eX8Kg2g0WQb07^tdsZ-BSpNc_$}$m`(Nr<0v4l0>t6~Wdgh9 delta 58 zcmdlvg>mL2#tkMCj69QlB|IkIm5`XMDk(8JSJGqhSs?uvh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -239,6 +361,24 @@ + + + + + + + + + + + + + + + + + + @@ -248,6 +388,17 @@ + + + + + + + + + + + diff --git a/WebInfoSponge.iws b/WebInfoSponge.iws index 0464ad5..1a2a782 100644 --- a/WebInfoSponge.iws +++ b/WebInfoSponge.iws @@ -1,7 +1,53 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WebInfoSponge.main.iml b/WebInfoSponge.main.iml index f168d9f..0d4e8b7 100644 --- a/WebInfoSponge.main.iml +++ b/WebInfoSponge.main.iml @@ -11,20 +11,22 @@ + + + - - + + + - - - + @@ -32,13 +34,17 @@ - + + + + + \ No newline at end of file diff --git a/WebInfoSponge.test.iml b/WebInfoSponge.test.iml index 5eaa4a1..96c8cac 100644 --- a/WebInfoSponge.test.iml +++ b/WebInfoSponge.test.iml @@ -19,28 +19,31 @@ - - - - - - - - - - - + + + + + + + - - - - - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 4583385..1550064 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,9 @@ targetCompatibility = '1.8' dependencies { compileOnly 'org.spongepowered:spongeapi:7.1.0' annotationProcessor 'org.spongepowered:spongeapi:7.1.0' + compile 'org.nanohttpd:nanohttpd:2.3.1' + compile 'org.reflections:reflections:0.9.12' + compile 'org.apache.directory.studio:org.apache.commons.io:2.4' } sponge.plugin.id = pluginId diff --git a/build/resources/main/resources/langs/ru.json b/build/resources/main/resources/langs/ru.json new file mode 100644 index 0000000..1c47d2c --- /dev/null +++ b/build/resources/main/resources/langs/ru.json @@ -0,0 +1,20 @@ +{ + "Links": { + "login": "Войти", + "logout": "Выйти", + "cp": "Панель управления" + }, + "Titles":{ + "auth": "Авторизация" + }, + "Words": { + "user": "Пользователь", + "password": "Пароль", + "Difficulty": { + "PEACEFUL": "Мирная", + "EASY": "Простая", + "NORMAL": "Нормальная", + "HARD": "Сложная" + } + } +} \ No newline at end of file diff --git a/build/resources/main/resources/web/css/index.css b/build/resources/main/resources/web/css/index.css new file mode 100644 index 0000000..e69de29 diff --git a/build/resources/main/resources/web/js/index.js b/build/resources/main/resources/web/js/index.js new file mode 100644 index 0000000..eb8a3c7 --- /dev/null +++ b/build/resources/main/resources/web/js/index.js @@ -0,0 +1,33 @@ +function onload() { + updatePageInfo(); +} + +function updatePageInfo() { + let header = document.getElementById("header"); + let stat = document.getElementById("stat"); + header.innerText = "Идёт загрузка..."; + stat.innerHTML = ""; + var xhr = new XMLHttpRequest(); + xhr.open('GET', '/json/mainData.json', true); + xhr.setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); + xhr.send(); + xhr.onreadystatechange = function () { + if (xhr.readyState !== 4) return; + let data = JSON.parse(xhr.responseText); + header.innerText = "Мод запущен на сервере"; + appendLine(stat, ["Версия игры", data.MineV]); + appendLine(stat, ["Игроки", data.Players]); + } +} + +function appendLine(table,array) { + let tr = document.createElement("tr"); + for (let arrayKey in array) { + let td = document.createElement("td"); + td.innerText = array[arrayKey]; + tr.appendChild(td); + } + table.appendChild(tr); +} + +document.addEventListener("DOMContentLoaded", onload); \ No newline at end of file diff --git a/build/resources/main/resources/web/pages/Index.html b/build/resources/main/resources/web/pages/Index.html new file mode 100644 index 0000000..b26b504 --- /dev/null +++ b/build/resources/main/resources/web/pages/Index.html @@ -0,0 +1,30 @@ + + + + + WebInfo + + + + + +
+ + +
+
+ + diff --git a/build/resources/main/resources/web/pages/auth/Index.html b/build/resources/main/resources/web/pages/auth/Index.html new file mode 100644 index 0000000..4d97101 --- /dev/null +++ b/build/resources/main/resources/web/pages/auth/Index.html @@ -0,0 +1,19 @@ + + + + + <replace id="1"/> + + + +
+
+
+ +
+ + \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 59b5f89..10c9563 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Sun Apr 26 16:46:02 MSK 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.1-all.zip diff --git a/src/main/java/ru/redguy/webinfomod/Config.java b/src/main/java/ru/redguy/webinfomod/Config.java new file mode 100644 index 0000000..dad1f98 --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/Config.java @@ -0,0 +1,52 @@ +package ru.redguy.webinfomod; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.spongepowered.api.Sponge; + +import java.io.*; +import java.util.HashMap; +import java.util.Map; + +public class Config { + + private JsonObject jsonObject; + public Map sessions; + private Logger logger; + + public Config(Logger logger) throws IOException { + this.logger = logger; + JsonParser parser = new JsonParser(); + Object obj = null; //читаем JSON файл + try { + obj = parser.parse(new FileReader("config/WebInfoMod.json")); + } catch (FileNotFoundException e) { + File f = new File("config/WebInfoMod.json"); + f.createNewFile(); + FileWriter fw = new FileWriter(f); + fw.write( + "{"+System.lineSeparator()+ + "\"WebPort\":8080,"+System.lineSeparator()+ + "\"lang\":\"ru\""+System.lineSeparator()+ + "}" + ); + fw.close(); + obj = parser.parse(new FileReader("config/WebInfoMod.json")); + } + jsonObject = (JsonObject) obj; + jsonObject.addProperty("MineV",Sponge.getPlatform().getMinecraftVersion().getName()); + sessions = new HashMap(); + } + + public String getString(String name) { + return jsonObject.get(name).getAsString(); + } + + public int getInt(String name) { + return jsonObject.get(name).getAsInt(); + } + + public Logger getLogger() { + return logger; + } +} diff --git a/src/main/java/ru/redguy/webinfomod/IWebPage.java b/src/main/java/ru/redguy/webinfomod/IWebPage.java new file mode 100644 index 0000000..22e7acd --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/IWebPage.java @@ -0,0 +1,11 @@ +package ru.redguy.webinfomod; + +import fi.iki.elonen.NanoHTTPD; +import ru.redguy.webinfomod.langs.LangFile; + +import java.io.IOException; + +public interface IWebPage { + + public NanoHTTPD.Response getPage(Config config, LangFile langFile, NanoHTTPD.IHTTPSession session) throws IOException; +} diff --git a/src/main/java/ru/redguy/webinfomod/Logger.java b/src/main/java/ru/redguy/webinfomod/Logger.java new file mode 100644 index 0000000..ffa3b6d --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/Logger.java @@ -0,0 +1,22 @@ +package ru.redguy.webinfomod; + +public class Logger { + + org.slf4j.Logger logger; + + public Logger(org.slf4j.Logger logger){ + this.logger = logger; + } + + public void info(LoggerType logFrom, String message) { + logger.info("["+logFrom.getName()+"] "+message); + } + + public void warn(LoggerType logFrom, String message) { + logger.warn("["+logFrom.getName()+"] "+message); + } + + public void error(LoggerType logFrom, String message) { + logger.error("["+logFrom.getName()+"] "+message); + } +} diff --git a/src/main/java/ru/redguy/webinfomod/LoggerType.java b/src/main/java/ru/redguy/webinfomod/LoggerType.java new file mode 100644 index 0000000..c134771 --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/LoggerType.java @@ -0,0 +1,16 @@ +package ru.redguy.webinfomod; + +public enum LoggerType { + Client("Client"), + Web("Web"); + + private String name; + + LoggerType(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/ru/redguy/webinfomod/User.java b/src/main/java/ru/redguy/webinfomod/User.java new file mode 100644 index 0000000..b6afcd2 --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/User.java @@ -0,0 +1,12 @@ +package ru.redguy.webinfomod; + +public class User { + + public String user; + public String password; + + public User(String user, String password) { + this.user = user; + this.password = password; + } +} diff --git a/src/main/java/ru/redguy/webinfomod/UsersConfig.java b/src/main/java/ru/redguy/webinfomod/UsersConfig.java new file mode 100644 index 0000000..f915c04 --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/UsersConfig.java @@ -0,0 +1,48 @@ +package ru.redguy.webinfomod; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import java.io.*; + +public class UsersConfig { + + private JsonArray rawUsers; + + public UsersConfig() throws IOException { + JsonParser parser = new JsonParser(); + Object rawData; + try { + rawData = parser.parse(new FileReader("config/WebInfoUsers.json")); + } catch (FileNotFoundException e) { + File f = new File("config/WebInfoUsers.json"); + f.createNewFile(); + FileWriter fw = new FileWriter(f); + fw.write( + "[{"+System.lineSeparator()+ + "\"user\":\"admin\","+System.lineSeparator()+ + "\"password\":\"admin\""+System.lineSeparator()+ + "}]" + ); + fw.close(); + rawData = parser.parse(new FileReader("config/WebInfoMod.json")); + } + rawUsers = (JsonArray) rawData; + } + + public User getUser(String name) { + User result = null; + for (JsonElement rawUser : rawUsers) { + JsonObject userJson = rawUser.getAsJsonObject(); + if(userJson.get("user").getAsString().equals(name)) { + result = new User( + userJson.get("user").getAsString(), + userJson.get("password").getAsString() + ); + } + } + return result; + } +} diff --git a/src/main/java/ru/redguy/webinfomod/WebInfoSponge.java b/src/main/java/ru/redguy/webinfomod/WebInfoSponge.java index e0f5d78..70db480 100644 --- a/src/main/java/ru/redguy/webinfomod/WebInfoSponge.java +++ b/src/main/java/ru/redguy/webinfomod/WebInfoSponge.java @@ -5,6 +5,9 @@ import org.slf4j.Logger; import org.spongepowered.api.event.game.state.GameStartedServerEvent; import org.spongepowered.api.event.Listener; import org.spongepowered.api.plugin.Plugin; +import ru.redguy.webinfomod.langs.LangFile; + +import java.io.IOException; @Plugin( id = "webinfomod", @@ -20,7 +23,16 @@ public class WebInfoSponge { @Inject private Logger logger; + public ru.redguy.webinfomod.Logger myLogger; + public Config config; + public WebServer webServer; + public LangFile langFile; + @Listener - public void onServerStart(GameStartedServerEvent event) { + public void onServerStart(GameStartedServerEvent event) throws IOException { + myLogger = new ru.redguy.webinfomod.Logger(logger); + config = new Config(myLogger); + langFile = new LangFile(config); + webServer = new WebServer(config.getInt("WebPort"), config, langFile); } } diff --git a/src/main/java/ru/redguy/webinfomod/WebPage.java b/src/main/java/ru/redguy/webinfomod/WebPage.java new file mode 100644 index 0000000..fa9042f --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/WebPage.java @@ -0,0 +1,12 @@ +package ru.redguy.webinfomod; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(value= ElementType.TYPE) +@Retention(value= RetentionPolicy.RUNTIME) +public @interface WebPage { + String url(); +} diff --git a/src/main/java/ru/redguy/webinfomod/WebServer.java b/src/main/java/ru/redguy/webinfomod/WebServer.java new file mode 100644 index 0000000..4a24e60 --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/WebServer.java @@ -0,0 +1,73 @@ +package ru.redguy.webinfomod; + +import fi.iki.elonen.NanoHTTPD; +import org.apache.commons.io.IOUtils; +import org.reflections.Reflections; +import org.reflections.scanners.FieldAnnotationsScanner; +import org.reflections.scanners.MethodAnnotationsScanner; +import org.reflections.scanners.MethodParameterScanner; +import org.reflections.scanners.TypeAnnotationsScanner; +import org.reflections.util.ClasspathHelper; +import org.reflections.util.ConfigurationBuilder; +import org.reflections.util.FilterBuilder; +import ru.redguy.webinfomod.langs.LangFile; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.nio.charset.StandardCharsets; + +public class WebServer extends NanoHTTPD { + + Config config; + Reflections reflections; + LangFile langFile; + + public WebServer(int port, Config config, LangFile langFile) throws IOException { + super(port); + ConfigurationBuilder configBuilder = + new ConfigurationBuilder() + .filterInputsBy(new FilterBuilder().includePackage("ru.redguy.webinfomod.pages")) + .setUrls(ClasspathHelper.forPackage("ru.redguy.webinfomod.pages")) + .setScanners( + new TypeAnnotationsScanner(), + new MethodParameterScanner(), + new MethodAnnotationsScanner(), + new FieldAnnotationsScanner() + ); + this.reflections = new Reflections(configBuilder); + start(NanoHTTPD.SOCKET_READ_TIMEOUT, false); + this.config = config; + this.langFile = langFile; + } + + @Override + public Response serve(IHTTPSession session) { + + if(session.getUri().startsWith("/css/")||session.getUri().startsWith("/js/")) { + String path = "/resources/web"+session.getUri(); + try { + return newFixedLengthResponse( + IOUtils.toString(WebServer.class.getResourceAsStream(path), StandardCharsets.UTF_8)); + } catch (IOException ignored) { + } + + } else { + for (Class mClass : reflections.getTypesAnnotatedWith(WebPage.class, true)) { + if (mClass.getAnnotation(WebPage.class).url().equals(session.getUri())) { + try { + return (Response) mClass.getMethod("getPage", Config.class, LangFile.class, IHTTPSession.class).invoke(mClass.newInstance(), config, langFile, session); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } + } + } + } + return newFixedLengthResponse("Not Founded!"); + } +} \ No newline at end of file diff --git a/src/main/java/ru/redguy/webinfomod/langs/Category.java b/src/main/java/ru/redguy/webinfomod/langs/Category.java new file mode 100644 index 0000000..dfbaa08 --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/langs/Category.java @@ -0,0 +1,5 @@ +package ru.redguy.webinfomod.langs; + +public class Category { + public String getString(Object login) {return null;} +} diff --git a/src/main/java/ru/redguy/webinfomod/langs/LangFile.java b/src/main/java/ru/redguy/webinfomod/langs/LangFile.java new file mode 100644 index 0000000..00d91e4 --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/langs/LangFile.java @@ -0,0 +1,38 @@ +package ru.redguy.webinfomod.langs; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import ru.redguy.webinfomod.Config; +import ru.redguy.webinfomod.langs.enums.RootCategories; +import org.apache.commons.io.IOUtils; + +import java.io.*; + +public class LangFile { + private JsonObject jsonObject; + public LangFile(Config config) throws IOException { + JsonParser parser = new JsonParser(); + Object obj = parser.parse( + IOUtils.toString( + LangFile.class.getResourceAsStream( + "/resources/langs/"+config.getString("lang")+".json" + ))); + jsonObject = (JsonObject) obj; + } + + public LangFile(JsonObject jsonObject) { + this.jsonObject = jsonObject; + } + + public RootCategory getCategory(RootCategories category) { + switch (category) { + case Links: + return new Links(jsonObject.getAsJsonObject("Links")); + case Titles: + return new Titles(jsonObject.getAsJsonObject("Titles")); + case Words: + return new Words(jsonObject.getAsJsonObject("Words")); + } + return null; + } +} diff --git a/src/main/java/ru/redguy/webinfomod/langs/Links.java b/src/main/java/ru/redguy/webinfomod/langs/Links.java new file mode 100644 index 0000000..befba4d --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/langs/Links.java @@ -0,0 +1,16 @@ +package ru.redguy.webinfomod.langs; + +import com.google.gson.JsonObject; + +public class Links extends RootCategory { + + JsonObject jsonObject; + + public Links(JsonObject jsonObject) { + this.jsonObject = jsonObject; + } + + public String getString(ru.redguy.webinfomod.langs.enums.Links links) { + return jsonObject.get(links.getName()).getAsString(); + } +} diff --git a/src/main/java/ru/redguy/webinfomod/langs/RootCategory.java b/src/main/java/ru/redguy/webinfomod/langs/RootCategory.java new file mode 100644 index 0000000..fd3ba89 --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/langs/RootCategory.java @@ -0,0 +1,11 @@ +package ru.redguy.webinfomod.langs; + +import ru.redguy.webinfomod.langs.langcaterories.Difficulty; + +public class RootCategory { + public String getString(Object non) {return null;} + + public Category getCategory(Object non) { + return null; + } +} diff --git a/src/main/java/ru/redguy/webinfomod/langs/Titles.java b/src/main/java/ru/redguy/webinfomod/langs/Titles.java new file mode 100644 index 0000000..fb6d3b8 --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/langs/Titles.java @@ -0,0 +1,16 @@ +package ru.redguy.webinfomod.langs; + +import com.google.gson.JsonObject; + +public class Titles extends RootCategory { + + JsonObject jsonObject; + + public Titles(JsonObject jsonObject) { + this.jsonObject = jsonObject; + } + + public String getString(ru.redguy.webinfomod.langs.enums.Titles titles) { + return jsonObject.get(titles.getName()).getAsString(); + } +} diff --git a/src/main/java/ru/redguy/webinfomod/langs/Words.java b/src/main/java/ru/redguy/webinfomod/langs/Words.java new file mode 100644 index 0000000..778ac9e --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/langs/Words.java @@ -0,0 +1,24 @@ +package ru.redguy.webinfomod.langs; + +import com.google.gson.JsonObject; +import ru.redguy.webinfomod.langs.langcaterories.Difficulty; + +public class Words extends RootCategory { + JsonObject jsonObject; + + public Words(JsonObject jsonObject) { + this.jsonObject = jsonObject; + } + + public String getString(ru.redguy.webinfomod.langs.enums.Links links) { + return jsonObject.get(links.getName()).getAsString(); + } + + public Category getCategory(ru.redguy.webinfomod.langs.enums.Words words) { + switch (words) { + case difficulty: + return new Difficulty(jsonObject.getAsJsonObject("Difficulty")); + } + return null; + } +} diff --git a/src/main/java/ru/redguy/webinfomod/langs/enums/Links.java b/src/main/java/ru/redguy/webinfomod/langs/enums/Links.java new file mode 100644 index 0000000..09eb90c --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/langs/enums/Links.java @@ -0,0 +1,17 @@ +package ru.redguy.webinfomod.langs.enums; + +public enum Links { + controlPanel("cp"), + logout("logout"), + login("login"); + + private String name; + + Links(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/ru/redguy/webinfomod/langs/enums/RootCategories.java b/src/main/java/ru/redguy/webinfomod/langs/enums/RootCategories.java new file mode 100644 index 0000000..357fd6c --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/langs/enums/RootCategories.java @@ -0,0 +1,7 @@ +package ru.redguy.webinfomod.langs.enums; + +public enum RootCategories { + Links, + Titles, + Words +} diff --git a/src/main/java/ru/redguy/webinfomod/langs/enums/Titles.java b/src/main/java/ru/redguy/webinfomod/langs/enums/Titles.java new file mode 100644 index 0000000..611ccbd --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/langs/enums/Titles.java @@ -0,0 +1,15 @@ +package ru.redguy.webinfomod.langs.enums; + +public enum Titles { + authPage("auth"); + + private String name; + + Titles(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/ru/redguy/webinfomod/langs/enums/Words.java b/src/main/java/ru/redguy/webinfomod/langs/enums/Words.java new file mode 100644 index 0000000..0cf0a29 --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/langs/enums/Words.java @@ -0,0 +1,17 @@ +package ru.redguy.webinfomod.langs.enums; + +public enum Words { + user("user"), + password("password"), + difficulty("Difficulty"); + + private String name; + + Words(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/ru/redguy/webinfomod/langs/langcaterories/Difficulty.java b/src/main/java/ru/redguy/webinfomod/langs/langcaterories/Difficulty.java new file mode 100644 index 0000000..200dadb --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/langs/langcaterories/Difficulty.java @@ -0,0 +1,17 @@ +package ru.redguy.webinfomod.langs.langcaterories; + +import com.google.gson.JsonObject; +import ru.redguy.webinfomod.langs.Category; + +public class Difficulty extends Category { + + JsonObject jsonObject; + + public Difficulty(JsonObject jsonObject) { + this.jsonObject = jsonObject; + } + + public String getString(Difficulty enumDifficulty) { + return jsonObject.get(enumDifficulty.toString()).getAsString(); + } +} diff --git a/src/main/java/ru/redguy/webinfomod/pages/Index.java b/src/main/java/ru/redguy/webinfomod/pages/Index.java new file mode 100644 index 0000000..18281a7 --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/pages/Index.java @@ -0,0 +1,28 @@ +package ru.redguy.webinfomod.pages; + +import fi.iki.elonen.NanoHTTPD; +import org.apache.commons.io.IOUtils; +import ru.redguy.webinfomod.*; +import ru.redguy.webinfomod.langs.LangFile; +import ru.redguy.webinfomod.langs.enums.Links; +import ru.redguy.webinfomod.langs.enums.RootCategories; +import ru.redguy.webinfomod.utils.WebUtils; + +import java.io.IOException; +import java.nio.charset.Charset; + +@WebPage(url = "/") +public class Index implements IWebPage { + public NanoHTTPD.Response getPage(Config config, LangFile langFile, NanoHTTPD.IHTTPSession session) throws IOException { + String path = "/resources/web/pages/Index.html"; + String page = IOUtils.toString(WebServer.class.getResourceAsStream(path), Charset.defaultCharset()); + WebUtils.CookieHandler ch = new WebUtils.CookieHandler(session.getHeaders()); + if(ch.read("session") == null) { + page = page.replace("","
"+langFile.getCategory(RootCategories.Links).getString(Links.login)+""); + } else { + page = page.replace("",""+langFile.getCategory(RootCategories.Links).getString(Links.logout)+"" + + ""+langFile.getCategory(RootCategories.Links).getString(Links.controlPanel)); + } + return NanoHTTPD.newFixedLengthResponse(page); + } +} diff --git a/src/main/java/ru/redguy/webinfomod/pages/auth/Index.java b/src/main/java/ru/redguy/webinfomod/pages/auth/Index.java new file mode 100644 index 0000000..1f41894 --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/pages/auth/Index.java @@ -0,0 +1,25 @@ +package ru.redguy.webinfomod.pages.auth; + +import fi.iki.elonen.NanoHTTPD; +import org.apache.commons.io.IOUtils; +import ru.redguy.webinfomod.*; +import ru.redguy.webinfomod.langs.LangFile; +import ru.redguy.webinfomod.langs.enums.RootCategories; +import ru.redguy.webinfomod.langs.enums.Titles; +import ru.redguy.webinfomod.langs.enums.Words; + +import java.io.IOException; +import java.nio.charset.Charset; + +@WebPage(url = "/auth/") +public class Index implements IWebPage { + + public NanoHTTPD.Response getPage(Config config, LangFile langFile, NanoHTTPD.IHTTPSession session) throws IOException { + String path = "/resources/web/pages/auth/Index.html"; + String page = IOUtils.toString(WebServer.class.getResourceAsStream(path), Charset.defaultCharset()); + page = page.replace("",langFile.getCategory(RootCategories.Titles).getString(Titles.authPage)); + page = page.replace("",langFile.getCategory(RootCategories.Words).getString(Words.user)); + page = page.replace("",langFile.getCategory(RootCategories.Words).getString(Words.password)); + return NanoHTTPD.newFixedLengthResponse(page); + } +} diff --git a/src/main/java/ru/redguy/webinfomod/pages/auth/Worker.java b/src/main/java/ru/redguy/webinfomod/pages/auth/Worker.java new file mode 100644 index 0000000..d99290f --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/pages/auth/Worker.java @@ -0,0 +1,60 @@ +package ru.redguy.webinfomod.pages.auth; + +import fi.iki.elonen.NanoHTTPD; +import ru.redguy.webinfomod.*; +import ru.redguy.webinfomod.langs.LangFile; +import ru.redguy.webinfomod.utils.WebUtils; + +import java.io.IOException; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@WebPage(url = "/auth/worker/") +public class Worker implements IWebPage { + public NanoHTTPD.Response getPage(Config config, LangFile langFile, NanoHTTPD.IHTTPSession session) throws IOException { + try { + session.parseBody(new HashMap()); + } catch (NanoHTTPD.ResponseException e) { + e.printStackTrace(); + } + Map> decodedQueryParameters = WebUtils.decodeParams(session.getQueryParameterString()); + if(!decodedQueryParameters.containsKey("user")) { + NanoHTTPD.Response response = NanoHTTPD.newFixedLengthResponse(NanoHTTPD.Response.Status.REDIRECT,NanoHTTPD.MIME_PLAINTEXT,""); + response.addHeader("Location","/auth/"); + return response; + } else { + if(!decodedQueryParameters.containsKey("password")) { + NanoHTTPD.Response response = NanoHTTPD.newFixedLengthResponse(NanoHTTPD.Response.Status.REDIRECT,NanoHTTPD.MIME_PLAINTEXT,""); + response.addHeader("Location","/auth/"); + return response; + } else { + UsersConfig usersConfig = new UsersConfig(); + User user = usersConfig.getUser(decodedQueryParameters.get("user").get(0)); + if(user == null) { + NanoHTTPD.Response response = NanoHTTPD.newFixedLengthResponse(NanoHTTPD.Response.Status.REDIRECT,NanoHTTPD.MIME_PLAINTEXT,""); + response.addHeader("Location", "/auth/"); + return response; + } else { + if (!user.password.equals(decodedQueryParameters.get("password").get(0))) { + NanoHTTPD.Response response = NanoHTTPD.newFixedLengthResponse(NanoHTTPD.Response.Status.REDIRECT,NanoHTTPD.MIME_PLAINTEXT,""); + response.addHeader("Location", "/auth/"); + return response; + } else { + Date date = new Date(); + String token = WebUtils.MD5(date.getTime()+"MagickSalt"); + WebUtils.CookieHandler ch = new WebUtils.CookieHandler(session.getHeaders()); + ch.set("session",token,1); + config.sessions.put(token,user.user); + NanoHTTPD.Response response = NanoHTTPD.newFixedLengthResponse(NanoHTTPD.Response.Status.REDIRECT,NanoHTTPD.MIME_PLAINTEXT,""); + response.addHeader("Location", "/"); + ch.unloadQueue(response); + config.getLogger().info(LoggerType.Web,user.user + " login!"); + return response; + } + } + } + } + } +} diff --git a/src/main/java/ru/redguy/webinfomod/pages/json/MainData.java b/src/main/java/ru/redguy/webinfomod/pages/json/MainData.java new file mode 100644 index 0000000..ff67abe --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/pages/json/MainData.java @@ -0,0 +1,25 @@ +package ru.redguy.webinfomod.pages.json; + +import com.google.gson.JsonObject; +import fi.iki.elonen.NanoHTTPD; +import ru.redguy.webinfomod.*; +import ru.redguy.webinfomod.langs.LangFile; +import ru.redguy.webinfomod.utils.DataUtils; + +import java.io.IOException; + +@WebPage(url="/json/mainData.json") +public class MainData implements IWebPage { + + public NanoHTTPD.Response getPage(Config config, LangFile langFile, NanoHTTPD.IHTTPSession session) throws IOException { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("MineV",config.getString("MineV")); + StringBuilder players = new StringBuilder(); + for (String s : DataUtils.getPlayersList()) { + players.append(s).append(","); + } + players.deleteCharAt(players.length()-1); + jsonObject.addProperty("Players",players.toString()); + return NanoHTTPD.newFixedLengthResponse(jsonObject.toString()); + } +} diff --git a/src/main/java/ru/redguy/webinfomod/pages/logout/Index.java b/src/main/java/ru/redguy/webinfomod/pages/logout/Index.java new file mode 100644 index 0000000..3974006 --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/pages/logout/Index.java @@ -0,0 +1,21 @@ +package ru.redguy.webinfomod.pages.logout; + +import fi.iki.elonen.NanoHTTPD; +import ru.redguy.webinfomod.*; +import ru.redguy.webinfomod.langs.LangFile; +import ru.redguy.webinfomod.utils.WebUtils; + +import java.io.IOException; + +@WebPage(url = "/logout/") +public class Index implements IWebPage { + public NanoHTTPD.Response getPage(Config config, LangFile langFile, NanoHTTPD.IHTTPSession session) throws IOException { + WebUtils.CookieHandler ch = new WebUtils.CookieHandler(session.getHeaders()); + config.getLogger().info(LoggerType.Web,config.sessions.get(ch.read("session"))+ " has been logout!"); + ch.delete("session"); + NanoHTTPD.Response response = NanoHTTPD.newFixedLengthResponse(NanoHTTPD.Response.Status.REDIRECT,NanoHTTPD.MIME_PLAINTEXT,""); + response.addHeader("Location", "/"); + ch.unloadQueue(response); + return response; + } +} diff --git a/src/main/java/ru/redguy/webinfomod/utils/DataUtils.java b/src/main/java/ru/redguy/webinfomod/utils/DataUtils.java new file mode 100644 index 0000000..076215e --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/utils/DataUtils.java @@ -0,0 +1,17 @@ +package ru.redguy.webinfomod.utils; + +import org.spongepowered.api.Sponge; +import org.spongepowered.api.entity.living.player.Player; + +import java.util.ArrayList; +import java.util.List; + +public class DataUtils { + public static List getPlayersList() { + List result = new ArrayList(); + for (Player onlinePlayer : Sponge.getServer().getOnlinePlayers()) { + result.add(onlinePlayer.getName()); + } + return result; + } +} diff --git a/src/main/java/ru/redguy/webinfomod/utils/DoerUtils.java b/src/main/java/ru/redguy/webinfomod/utils/DoerUtils.java new file mode 100644 index 0000000..162a041 --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/utils/DoerUtils.java @@ -0,0 +1,5 @@ +package ru.redguy.webinfomod.utils; + +public class DoerUtils { + +} diff --git a/src/main/java/ru/redguy/webinfomod/utils/WebUtils.java b/src/main/java/ru/redguy/webinfomod/utils/WebUtils.java new file mode 100644 index 0000000..d9fbf3e --- /dev/null +++ b/src/main/java/ru/redguy/webinfomod/utils/WebUtils.java @@ -0,0 +1,170 @@ +package ru.redguy.webinfomod.utils; + +import fi.iki.elonen.NanoHTTPD; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.text.SimpleDateFormat; +import java.util.*; + +public class WebUtils { + public static Map> decodeParams(String queryString) { + Map> parms = new HashMap>(); + if (queryString != null) { + StringTokenizer st = new StringTokenizer(queryString, "&"); + while (st.hasMoreTokens()) { + String e = st.nextToken(); + int sep = e.indexOf('='); + String propertyName = sep >= 0 ? decodePercent(e.substring(0, sep)).trim() : decodePercent(e).trim(); + if (!parms.containsKey(propertyName)) { + parms.put(propertyName, new ArrayList()); + } + String propertyValue = sep >= 0 ? decodePercent(e.substring(sep + 1)) : null; + if (propertyValue != null) { + parms.get(propertyName).add(propertyValue); + } + } + } + return parms; + } + + protected static String decodePercent(String str) { + String decoded = null; + try { + decoded = URLDecoder.decode(str, "UTF8"); + } catch (UnsupportedEncodingException ignored) { + } + return decoded; + } + + public static String MD5(String md5) { + try { + java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); + byte[] array = md.digest(md5.getBytes()); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < array.length; ++i) { + sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3)); + } + return sb.toString(); + } catch (java.security.NoSuchAlgorithmException e) { + } + return null; + } + + public static class CookieHandler implements Iterable { + + private final HashMap cookies = new HashMap(); + + private final ArrayList queue = new ArrayList(); + + public CookieHandler(Map httpHeaders) { + String raw = httpHeaders.get("cookie"); + if (raw != null) { + String[] tokens = raw.split(";"); + for (String token : tokens) { + String[] data = token.trim().split("="); + if (data.length == 2) { + this.cookies.put(data[0], data[1]); + } + } + } + } + + /** + * Set a cookie with an expiration date from a month ago, effectively + * deleting it on the client side. + * + * @param name + * The cookie name. + */ + public void delete(String name) { + set(name, "-delete-", -30); + } + + @Override + public Iterator iterator() { + return this.cookies.keySet().iterator(); + } + + /** + * Read a cookie from the HTTP Headers. + * + * @param name + * The cookie's name. + * @return The cookie's value if it exists, null otherwise. + */ + public String read(String name) { + return this.cookies.get(name); + } + + public void set(Cookie cookie) { + this.queue.add(cookie); + } + + /** + * Sets a cookie. + * + * @param name + * The cookie's name. + * @param value + * The cookie's value. + * @param expires + * How many days until the cookie expires. + */ + public void set(String name, String value, int expires) { + this.queue.add(new Cookie(name, value, Cookie.getHTTPTime(expires))); + } + + /** + * Internally used by the webserver to add all queued cookies into the + * Response's HTTP Headers. + * + * @param response + * The Response object to which headers the queued cookies + * will be added. + */ + public void unloadQueue(NanoHTTPD.Response response) { + for (Cookie cookie : this.queue) { + response.addHeader("Set-Cookie", cookie.getHTTPHeader()); + } + } + + public void printDebug() { + System.out.println(cookies); + } + } + + public static class Cookie { + + public static String getHTTPTime(int days) { + Calendar calendar = Calendar.getInstance(); + SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); + dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + calendar.add(Calendar.DAY_OF_MONTH, days); + return dateFormat.format(calendar.getTime()); + } + + private final String n, v, e; + + public Cookie(String name, String value) { + this(name, value, 30); + } + + public Cookie(String name, String value, int numDays) { + this.n = name; + this.v = value; + this.e = getHTTPTime(numDays); + } + + public Cookie(String name, String value, String expires) { + this.n = name; + this.v = value; + this.e = expires; + } + + public String getHTTPHeader() { + String fmt = "%s=%s; expires=%s; path=/"; + return String.format(fmt, this.n, this.v, this.e); + } + } +} diff --git a/src/main/resources/resources/langs/ru.json b/src/main/resources/resources/langs/ru.json new file mode 100644 index 0000000..1c47d2c --- /dev/null +++ b/src/main/resources/resources/langs/ru.json @@ -0,0 +1,20 @@ +{ + "Links": { + "login": "Войти", + "logout": "Выйти", + "cp": "Панель управления" + }, + "Titles":{ + "auth": "Авторизация" + }, + "Words": { + "user": "Пользователь", + "password": "Пароль", + "Difficulty": { + "PEACEFUL": "Мирная", + "EASY": "Простая", + "NORMAL": "Нормальная", + "HARD": "Сложная" + } + } +} \ No newline at end of file diff --git a/src/main/resources/resources/web/css/index.css b/src/main/resources/resources/web/css/index.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/resources/web/js/index.js b/src/main/resources/resources/web/js/index.js new file mode 100644 index 0000000..eb8a3c7 --- /dev/null +++ b/src/main/resources/resources/web/js/index.js @@ -0,0 +1,33 @@ +function onload() { + updatePageInfo(); +} + +function updatePageInfo() { + let header = document.getElementById("header"); + let stat = document.getElementById("stat"); + header.innerText = "Идёт загрузка..."; + stat.innerHTML = ""; + var xhr = new XMLHttpRequest(); + xhr.open('GET', '/json/mainData.json', true); + xhr.setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); + xhr.send(); + xhr.onreadystatechange = function () { + if (xhr.readyState !== 4) return; + let data = JSON.parse(xhr.responseText); + header.innerText = "Мод запущен на сервере"; + appendLine(stat, ["Версия игры", data.MineV]); + appendLine(stat, ["Игроки", data.Players]); + } +} + +function appendLine(table,array) { + let tr = document.createElement("tr"); + for (let arrayKey in array) { + let td = document.createElement("td"); + td.innerText = array[arrayKey]; + tr.appendChild(td); + } + table.appendChild(tr); +} + +document.addEventListener("DOMContentLoaded", onload); \ No newline at end of file diff --git a/src/main/resources/resources/web/pages/Index.html b/src/main/resources/resources/web/pages/Index.html new file mode 100644 index 0000000..b26b504 --- /dev/null +++ b/src/main/resources/resources/web/pages/Index.html @@ -0,0 +1,30 @@ + + + + + WebInfo + + + + + +
+ + +
+
+ + diff --git a/src/main/resources/resources/web/pages/auth/Index.html b/src/main/resources/resources/web/pages/auth/Index.html new file mode 100644 index 0000000..4d97101 --- /dev/null +++ b/src/main/resources/resources/web/pages/auth/Index.html @@ -0,0 +1,19 @@ + + + + + <replace id="1"/> + + + +
+
+
+ +
+ + \ No newline at end of file