mirror of
https://github.com/CarmJos/cn2b2t-project.git
synced 2024-09-19 22:05:45 +00:00
BungeeCord修改2b2t-proxy
This commit is contained in:
parent
8fc6f4dd99
commit
118973921a
@ -12,5 +12,6 @@
|
|||||||
<file url="file://$PROJECT_DIR$/2b2t-proxy/src/main/resources" charset="UTF-8" />
|
<file url="file://$PROJECT_DIR$/2b2t-proxy/src/main/resources" charset="UTF-8" />
|
||||||
<file url="file://$PROJECT_DIR$/ImperialGuards/src/main/java" charset="UTF-8" />
|
<file url="file://$PROJECT_DIR$/ImperialGuards/src/main/java" charset="UTF-8" />
|
||||||
<file url="file://$PROJECT_DIR$/ImperialGuards/src/main/resources" charset="UTF-8" />
|
<file url="file://$PROJECT_DIR$/ImperialGuards/src/main/resources" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/_lib/Cord.jar" charset="GBK" />
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
@ -10,6 +10,28 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<artifactId>2b2t-proxy</artifactId>
|
<artifactId>2b2t-proxy</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>8</source>
|
||||||
|
<target>8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.md-5</groupId>
|
||||||
|
<artifactId>Cord</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<scope>system</scope>
|
||||||
|
<systemPath>${basedir}/../_lib/Cord.jar</systemPath>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
60
2b2t-proxy/src/main/java/org/cn2b2t/proxy/Config.java
Normal file
60
2b2t-proxy/src/main/java/org/cn2b2t/proxy/Config.java
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
package org.cn2b2t.proxy;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.utils.FileConfig;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class Config {
|
||||||
|
|
||||||
|
|
||||||
|
public static List<String> illegalWords;
|
||||||
|
|
||||||
|
|
||||||
|
public static FileConfig yamen;
|
||||||
|
|
||||||
|
public static String database_SQLhost;
|
||||||
|
public static int database_SQLport;
|
||||||
|
public static String database_SQLdata;
|
||||||
|
public static String database_user;
|
||||||
|
public static String database_password;
|
||||||
|
|
||||||
|
public static String reason_default;
|
||||||
|
|
||||||
|
public static Map<String/*Layout*/, String/*Value*/> layouts = new HashMap<>();
|
||||||
|
|
||||||
|
public static List<String> servers;
|
||||||
|
|
||||||
|
|
||||||
|
public static void load() {
|
||||||
|
|
||||||
|
illegalWords = new FileConfig(Main.getInstance(), "illegalWords.yml").getStringList("words");
|
||||||
|
|
||||||
|
|
||||||
|
//yamen
|
||||||
|
yamen = new FileConfig(Main.getInstance(), "yamen.yml");
|
||||||
|
|
||||||
|
database_SQLhost = yamen.getString("Database.SQLhost");
|
||||||
|
database_SQLport = yamen.getInt("Database.SQLport");
|
||||||
|
database_SQLdata = yamen.getString("Database.SQLdata");
|
||||||
|
database_user = yamen.getString("Database.user");
|
||||||
|
database_password = yamen.getString("Database.password");
|
||||||
|
|
||||||
|
reason_default = yamen.getString("DefaultReason").replace("&", "§");
|
||||||
|
|
||||||
|
yamen.getSection("Layouts").getKeys().forEach((s) -> {
|
||||||
|
StringBuilder layoutBuilder = new StringBuilder();
|
||||||
|
yamen.getStringList("Layouts." + s).forEach((layout) -> {
|
||||||
|
layoutBuilder.append(layout);
|
||||||
|
layoutBuilder.append("\n");
|
||||||
|
});
|
||||||
|
layouts.put(s, layoutBuilder.toString().replace("&", "§").replace("%(space)", "\n "));
|
||||||
|
});
|
||||||
|
|
||||||
|
servers = yamen.getStringList("Servers");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
90
2b2t-proxy/src/main/java/org/cn2b2t/proxy/Main.java
Normal file
90
2b2t-proxy/src/main/java/org/cn2b2t/proxy/Main.java
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
package org.cn2b2t.proxy;
|
||||||
|
|
||||||
|
import net.md_5.bungee.BungeeCord;
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.plugin.Command;
|
||||||
|
import net.md_5.bungee.api.plugin.Listener;
|
||||||
|
import net.md_5.bungee.api.plugin.Plugin;
|
||||||
|
import net.md_5.bungee.api.scheduler.ScheduledTask;
|
||||||
|
import org.cn2b2t.proxy.functions.DatabaseConfig;
|
||||||
|
import org.cn2b2t.proxy.functions.permission.PermissionMain;
|
||||||
|
import org.cn2b2t.proxy.functions.serverinfo.ServerInfoMain;
|
||||||
|
import org.cn2b2t.proxy.listeners.LoginListener;
|
||||||
|
import org.cn2b2t.proxy.listeners.QuitListener;
|
||||||
|
import org.cn2b2t.proxy.listeners.ServerKickListener;
|
||||||
|
import org.cn2b2t.proxy.listeners.TeleportListener;
|
||||||
|
import org.cn2b2t.proxy.managers.DataManager;
|
||||||
|
import org.cn2b2t.proxy.managers.UserValueManager;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Main extends Plugin {
|
||||||
|
|
||||||
|
public static Main plugin;
|
||||||
|
public static Main instance;
|
||||||
|
public CommandSender console;
|
||||||
|
List<ScheduledTask> threads = new ArrayList<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
|
||||||
|
Main.plugin = this;
|
||||||
|
Main.instance = this;
|
||||||
|
console = BungeeCord.getInstance().getConsole();
|
||||||
|
|
||||||
|
|
||||||
|
console.sendMessage("§8----------------------------------------");
|
||||||
|
BungeeCord.getInstance().getServers().forEach((s, serverInfo) -> console.sendMessage("§a" + serverInfo.getAddress().getPort() + "§7 - §f" + s));
|
||||||
|
console.sendMessage("§8----------------------------------------");
|
||||||
|
|
||||||
|
loadConfigs();
|
||||||
|
|
||||||
|
DataManager.init();
|
||||||
|
PermissionMain.init();
|
||||||
|
ServerInfoMain.init();
|
||||||
|
UserValueManager.init();
|
||||||
|
|
||||||
|
regListener(new ServerKickListener());
|
||||||
|
regListener(new TeleportListener());
|
||||||
|
regListener(new QuitListener());
|
||||||
|
regListener(new LoginListener());
|
||||||
|
|
||||||
|
// threads.add(new BungeeScheduler().schedule(Main.getInstance(), PlayerCounter::count, 5, 5, TimeUnit.SECONDS));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
for (ScheduledTask task : threads) {
|
||||||
|
task.cancel();
|
||||||
|
}
|
||||||
|
// DataManager.getTempConnection().SQLqueryWithNoResult("TRUNCATE TABLE `countplayer`;");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void loadConfigs() {
|
||||||
|
|
||||||
|
DatabaseConfig.load();
|
||||||
|
Config.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void regCommmand(Command command) {
|
||||||
|
ProxyServer.getInstance().getPluginManager().registerCommand(Main.getInstance(), command);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void regListener(Listener listener) {
|
||||||
|
ProxyServer.getInstance().getPluginManager().registerListener(Main.getInstance(), listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unregListener(Listener listener) {
|
||||||
|
ProxyServer.getInstance().getPluginManager().unregisterListener(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Main getInstance() {
|
||||||
|
return Main.instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Main getPlugin() {
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package org.cn2b2t.proxy.commands;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.Main;
|
||||||
|
import org.cn2b2t.proxy.functions.serverinfo.ServerInfoConfig;
|
||||||
|
import org.cn2b2t.proxy.listeners.FixingMode;
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.plugin.Command;
|
||||||
|
|
||||||
|
public class ProxyInfos extends Command {
|
||||||
|
|
||||||
|
public ProxyInfos(final String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(final CommandSender sender, final String[] args) {
|
||||||
|
if (args.length == 1) {
|
||||||
|
String aim = args[0];
|
||||||
|
if (aim.equalsIgnoreCase("reload")) {
|
||||||
|
ServerInfoConfig.load();
|
||||||
|
if (ServerInfoConfig.fixing) {
|
||||||
|
Main.unregListener(new FixingMode());
|
||||||
|
Main.regListener(new FixingMode());
|
||||||
|
} else ProxyServer.getInstance().getPluginManager().unregisterListener(new FixingMode());
|
||||||
|
sender.sendMessage("§7已重载完成。");
|
||||||
|
} else {
|
||||||
|
this.helpSender(sender);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.helpSender(sender);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void helpSender(final CommandSender sender) {
|
||||||
|
sender.sendMessage("");
|
||||||
|
sender.sendMessage("§8[§a?§8] §7BungeeCommon §fMoCi-Proxy");
|
||||||
|
sender.sendMessage(" §8- §breload §8#§7重载配置文件。");
|
||||||
|
sender.sendMessage("");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
package org.cn2b2t.proxy.commands;
|
||||||
|
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.functions.permission.PermissionManager;
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
import net.md_5.bungee.api.plugin.Command;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author cam
|
||||||
|
*/
|
||||||
|
public class ProxyPermdog extends Command {
|
||||||
|
|
||||||
|
public ProxyPermdog(final String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(final CommandSender sender, final String[] args) {
|
||||||
|
|
||||||
|
if (!sender.hasPermission("moci.admin")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.length > 0) {
|
||||||
|
if (args[0].equalsIgnoreCase("user")) {
|
||||||
|
if (args.length == 2) {
|
||||||
|
ProxiedPlayer p = getPlayer(args[1]);
|
||||||
|
if (p != null) {
|
||||||
|
sender.sendMessage("§8----------------------------------------");
|
||||||
|
sender.sendMessage("§7UUID §e" + p.getUUID());
|
||||||
|
|
||||||
|
sender.sendMessage("§8----------------------------------------");
|
||||||
|
} else {
|
||||||
|
sender.sendMessage("玩家" + args[1] + "不存在");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (args[0].equalsIgnoreCase("uuid")) {
|
||||||
|
if (args.length == 2) {
|
||||||
|
ProxiedPlayer p = getPlayer(args[1]);
|
||||||
|
if (p != null) {
|
||||||
|
sender.sendMessage("UUID:" + p.getUUID());
|
||||||
|
sender.sendMessage("RealPerm:"
|
||||||
|
+ Arrays.toString(p.getPermissions().toArray()));
|
||||||
|
} else {
|
||||||
|
sender.sendMessage("玩家" + args[1] + "不存在");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (args[0].equalsIgnoreCase("update")) {
|
||||||
|
|
||||||
|
PermissionManager.updateAll();
|
||||||
|
|
||||||
|
sender.sendMessage("权限狗数据已更新");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private ProxiedPlayer getPlayer(String name) {
|
||||||
|
for (ProxiedPlayer p : ProxyServer.getInstance().getPlayers()) {
|
||||||
|
if (p.getName().equals(name)) {
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
341
2b2t-proxy/src/main/java/org/cn2b2t/proxy/functions/Account.java
Normal file
341
2b2t-proxy/src/main/java/org/cn2b2t/proxy/functions/Account.java
Normal file
@ -0,0 +1,341 @@
|
|||||||
|
package org.cn2b2t.proxy.functions;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.managers.DataManager;
|
||||||
|
import org.cn2b2t.proxy.utils.UUIDUtils;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
public class Account {
|
||||||
|
|
||||||
|
public static String getLastIP(int inkID) {
|
||||||
|
ResultSet query = DataManager.getWebsiteConnection().SQLquery("nl2_users", "id", inkID);
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
String lastip = null;
|
||||||
|
if (query.next()) {
|
||||||
|
lastip = query.getString("lastip");
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return lastip;
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在InkID" + inkID);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
DataManager.getWebsiteConnection().info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", query);
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在InkID" + inkID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getName(int inkID) {
|
||||||
|
ResultSet query = DataManager.getWebsiteConnection().SQLquery("nl2_users", "id", inkID);
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
String name = null;
|
||||||
|
if (query.next()) {
|
||||||
|
name = query.getString("username");
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在InkID" + inkID);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
DataManager.getWebsiteConnection().info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", query);
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在InkID" + inkID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UUID getUniqueID(int inkID) {
|
||||||
|
ResultSet query = DataManager.getWebsiteConnection().SQLquery("nl2_users", "id", inkID);
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
UUID uuid = null;
|
||||||
|
if (query.next()) {
|
||||||
|
uuid = UUIDUtils.toUUID(query.getString("uuid"));
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在InkID" + inkID);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
DataManager.getWebsiteConnection().info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", query);
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在InkID" + inkID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UUID getUniqueID(String name) {
|
||||||
|
ResultSet query = DataManager.getWebsiteConnection().SQLquery("nl2_users", "username", name);
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
UUID uuid = null;
|
||||||
|
if (query.next()) {
|
||||||
|
uuid = UUIDUtils.toUUID(query.getString("uuid"));
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在Name: " + name);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
DataManager.getWebsiteConnection().info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", query);
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在Name: " + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isOnlineMode(int inkID) {
|
||||||
|
ResultSet query = DataManager.getWebsiteConnection().SQLquery("nl2_users", "id", inkID);
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
UUID uuid = null;
|
||||||
|
String mojanguuid = null;
|
||||||
|
if (query.next()) {
|
||||||
|
mojanguuid = query.getString("mojanguuid");
|
||||||
|
}
|
||||||
|
if(mojanguuid != null && !mojanguuid.isEmpty() && !mojanguuid.equalsIgnoreCase("null")){
|
||||||
|
uuid = UUIDUtils.toUUID(mojanguuid);
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return uuid != null;
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在InkID" + inkID);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
DataManager.getWebsiteConnection().info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", query);
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在InkID" + inkID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isOnlineMode(String name) {
|
||||||
|
return getMojangUniqueID(name) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UUID getMojangUniqueID(String name) {
|
||||||
|
ResultSet query = DataManager.getWebsiteConnection().SQLquery("nl2_users", "username", name);
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
UUID result = null;
|
||||||
|
String mojanguuid = null;
|
||||||
|
if (query.next()) {
|
||||||
|
mojanguuid = query.getString("mojanguuid");
|
||||||
|
}
|
||||||
|
if(mojanguuid != null && !mojanguuid.isEmpty() && !mojanguuid.equalsIgnoreCase("null")){
|
||||||
|
result = UUIDUtils.toUUID(mojanguuid);
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在Name: " + name);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
DataManager.getWebsiteConnection().info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", query);
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在Name: " + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UUID[] getUUIDandMojangUniqueID(String name) {
|
||||||
|
ResultSet query = DataManager.getWebsiteConnection().SQLquery("nl2_users", "username", name);
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
UUID[] uuids = null;
|
||||||
|
String uuid = null;
|
||||||
|
String mojanguuid = null;
|
||||||
|
if (query.next()) {
|
||||||
|
uuids = new UUID[2];
|
||||||
|
uuid = query.getString("uuid");
|
||||||
|
mojanguuid = query.getString("mojanguuid");
|
||||||
|
}
|
||||||
|
if(uuid != null && !uuid.isEmpty() && !uuid.equalsIgnoreCase("null")){
|
||||||
|
uuids[0] = UUIDUtils.toUUID(uuid);
|
||||||
|
}
|
||||||
|
if(mojanguuid != null && !mojanguuid.isEmpty() && !mojanguuid.equalsIgnoreCase("null")){
|
||||||
|
uuids[1] = UUIDUtils.toUUID(mojanguuid);
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return uuids;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
DataManager.getWebsiteConnection().info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", query);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getInkID(String name) {
|
||||||
|
ResultSet query = DataManager.getWebsiteConnection().SQLquery("nl2_users", "username", name);
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
int id = -1;
|
||||||
|
if (query.next()) {
|
||||||
|
id = query.getInt("id");
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在Name: " + name);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
DataManager.getWebsiteConnection().info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", query);
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在Name: " + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getInkIDByUUID(String uuid) {
|
||||||
|
ResultSet query = DataManager.getWebsiteConnection().SQLquery("nl2_users", "uuid", uuid);
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
int id = -1;
|
||||||
|
if (query.next()) {
|
||||||
|
id = query.getInt("id");
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在UUID: " + uuid);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
DataManager.getWebsiteConnection().info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", query);
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在UUID: " + uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getEmail(int inkID) {
|
||||||
|
ResultSet query = DataManager.getWebsiteConnection().SQLquery("nl2_users", "id", inkID);
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
String email = null;
|
||||||
|
if (query.next()) {
|
||||||
|
email = query.getString("email");
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在InkID" + inkID);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
DataManager.getWebsiteConnection().info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", query);
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在InkID" + inkID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getEmail(String name) {
|
||||||
|
ResultSet query = DataManager.getWebsiteConnection().SQLquery("nl2_users", "id", name);
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
String email = null;
|
||||||
|
if (query.next()) {
|
||||||
|
email = query.getString("email");
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在Name: " + name);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
DataManager.getWebsiteConnection().info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", query);
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在Name: " + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isRegistered(String name) {
|
||||||
|
ResultSet query = DataManager.getWebsiteConnection().SQLquery("nl2_users", "username", name);
|
||||||
|
try {
|
||||||
|
return query != null && query.next();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
DataManager.getWebsiteConnection().info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", query);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UUID getUUIDFromMojang(String name) {
|
||||||
|
String result = sendHTTP("https://api.mojang.com/users/profiles/minecraft/" + name);
|
||||||
|
String uuid = "";
|
||||||
|
int start = result.indexOf("id\":\"") + 5;
|
||||||
|
while (result.charAt(start) != '\"') {
|
||||||
|
uuid += result.charAt(start);
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
return UUIDUtils.toUUID(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getNameFromMojang(UUID uuid) {
|
||||||
|
String result = sendHTTP("https://api.mojang.com/user/profiles/" + uuid.toString().replace("-","") + "/names");
|
||||||
|
String lastName = "";
|
||||||
|
if(result == null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
int start = result.lastIndexOf("name\":\"") + 7;
|
||||||
|
while (result.charAt(start) != '\"') {
|
||||||
|
lastName += result.charAt(start);
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
return lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static String sendHTTP(String keyword){
|
||||||
|
String result = "";//访问返回结果
|
||||||
|
BufferedReader read = null;//读取访问结果
|
||||||
|
Map<String, List<String>> map = new HashMap();
|
||||||
|
|
||||||
|
try {
|
||||||
|
//创建url
|
||||||
|
URL realurl = new URL(keyword);
|
||||||
|
//打开连接
|
||||||
|
URLConnection connection = realurl.openConnection();
|
||||||
|
// 设置通用的请求属性
|
||||||
|
connection.setRequestProperty("accept", "*/*");
|
||||||
|
connection.setRequestProperty("connection", "Keep-Alive");
|
||||||
|
// connection.setRequestProperty("user-agent",
|
||||||
|
// "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
|
||||||
|
connection.setReadTimeout(2000);
|
||||||
|
//建立连接
|
||||||
|
connection.connect();
|
||||||
|
// 获取所有响应头字段
|
||||||
|
map = connection.getHeaderFields();
|
||||||
|
// 遍历所有的响应头字段,获取到cookies等
|
||||||
|
// for (String key : map.keySet()) {
|
||||||
|
// System.out.println(key + "--->" + map.get(key));
|
||||||
|
// }
|
||||||
|
// 定义 BufferedReader输入流来读取URL的响应
|
||||||
|
read = new BufferedReader(new InputStreamReader(
|
||||||
|
connection.getInputStream(), "UTF-8"));
|
||||||
|
String line;//循环读取
|
||||||
|
while ((line = read.readLine()) != null) {
|
||||||
|
result += line;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
} finally {
|
||||||
|
if (read != null) {//关闭流
|
||||||
|
try {
|
||||||
|
read.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// System.out.println("keyword = " + keyword + "\nresult = " + result);
|
||||||
|
if (result.equals("")) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package org.cn2b2t.proxy.functions;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.Main;
|
||||||
|
import org.cn2b2t.proxy.utils.FileConfig;
|
||||||
|
import net.md_5.bungee.config.Configuration;
|
||||||
|
|
||||||
|
public class DatabaseConfig {
|
||||||
|
|
||||||
|
public static Configuration databaseConfig;
|
||||||
|
|
||||||
|
public static String host;
|
||||||
|
public static int port;
|
||||||
|
public static String user;
|
||||||
|
public static String passwd;
|
||||||
|
|
||||||
|
|
||||||
|
public static String data_kettle;
|
||||||
|
public static String data_temp;
|
||||||
|
public static String data_website;
|
||||||
|
|
||||||
|
public static void load() {
|
||||||
|
databaseConfig = null;
|
||||||
|
DatabaseConfig.databaseConfig = new FileConfig(Main.getPlugin(), "database.yml").getConfig();
|
||||||
|
|
||||||
|
host = databaseConfig.getString("Database.host");
|
||||||
|
port = databaseConfig.getInt("Database.port");
|
||||||
|
user = databaseConfig.getString("Database.user");
|
||||||
|
passwd = databaseConfig.getString("Database.password");
|
||||||
|
|
||||||
|
|
||||||
|
data_kettle = databaseConfig.getString("Database.databases.kettle");
|
||||||
|
data_temp = databaseConfig.getString("Database.databases.temp");
|
||||||
|
data_website = databaseConfig.getString("Database.databases.website");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
package org.cn2b2t.proxy.functions;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
|
||||||
|
public class PlayerCounter {
|
||||||
|
|
||||||
|
private static HashMap<String, Integer> counts = new HashMap<>();
|
||||||
|
|
||||||
|
|
||||||
|
// public static void count() {
|
||||||
|
// if (BungeeCord.getInstance().getPlayers().size() < 1) return;
|
||||||
|
// BungeeCord.getInstance().getServers().forEach((s, serverInfo) -> {
|
||||||
|
// int player = serverInfo.getPlayers().size();
|
||||||
|
// new BungeeScheduler().runAsync(Main.getInstance(), () -> {
|
||||||
|
//
|
||||||
|
// ResultSet query = DataManager.getTempConnection().SQLquery("countplayer", "server", s);
|
||||||
|
// try {
|
||||||
|
// if (query != null) {
|
||||||
|
// if (query.next()) {
|
||||||
|
// DataManager.getTempConnection().update("countplayer", "players", player,
|
||||||
|
// "server", s);
|
||||||
|
// } else {
|
||||||
|
// DataManager.getTempConnection().insert("countplayer",
|
||||||
|
// new String[]{"server", "players"},
|
||||||
|
// new Object[]{s, player});
|
||||||
|
// }
|
||||||
|
// query.close();
|
||||||
|
// }
|
||||||
|
// } catch (SQLException e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
// update();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public static Integer get(String serverName) {
|
||||||
|
// return get(serverName, false);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public static Integer get(String serverName, boolean isMultiServer) {
|
||||||
|
// if (isMultiServer) {
|
||||||
|
// return (!counts.isEmpty() && serverName.equalsIgnoreCase("#ALL") || serverName.equalsIgnoreCase("#AII")) ?
|
||||||
|
// counts.keySet().stream().mapToInt(s -> counts.getOrDefault(s, 0)).sum()
|
||||||
|
// : counts.entrySet().stream().filter(entry -> entry.getKey().startsWith(serverName)).mapToInt(Map.Entry::getValue).sum();
|
||||||
|
// } else {
|
||||||
|
// return (!counts.isEmpty() && serverName.equalsIgnoreCase("#ALL") || serverName.equalsIgnoreCase("#AII")) ?
|
||||||
|
// counts.keySet().stream().mapToInt(s -> counts.getOrDefault(s, 0)).sum()
|
||||||
|
// : counts.getOrDefault(serverName, 0);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public static void update() {
|
||||||
|
// counts.clear();
|
||||||
|
// Connection temp = DataManager.getTempConnection();
|
||||||
|
// ResultSet rs = temp.SQLqueryInTable("countplayer");
|
||||||
|
// try {
|
||||||
|
// if (rs != null) {
|
||||||
|
// while (rs.next()) {
|
||||||
|
// counts.put(rs.getString("server"), rs.getInt("players"));
|
||||||
|
// }
|
||||||
|
// rs.close();
|
||||||
|
// }
|
||||||
|
// } catch (SQLException e) {
|
||||||
|
// cn.moci.kettle.managers.utils.DataManager.getKettleConnection().info(e.getLocalizedMessage());
|
||||||
|
// Bukkit.getLogger().log(Level.WARNING, "code: {0}", rs);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package org.cn2b2t.proxy.functions.permission;
|
||||||
|
|
||||||
|
public class DataPermission {
|
||||||
|
|
||||||
|
public String perm;
|
||||||
|
public String base;
|
||||||
|
|
||||||
|
public DataPermission(String perm, String base) {
|
||||||
|
this.perm = perm;
|
||||||
|
this.base = base;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package org.cn2b2t.proxy.functions.permission;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class DataPermissionGroup {
|
||||||
|
|
||||||
|
public final int id;
|
||||||
|
public final List<Integer> extend;
|
||||||
|
public final List<DataPermission> perms;
|
||||||
|
|
||||||
|
public DataPermissionGroup(int id, List<Integer> extend, List<DataPermission> perms) {
|
||||||
|
this.id = id;
|
||||||
|
this.extend = extend;
|
||||||
|
this.perms = perms;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package org.cn2b2t.proxy.functions.permission;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.Main;
|
||||||
|
import org.cn2b2t.proxy.utils.FileConfig;
|
||||||
|
import net.md_5.bungee.config.Configuration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author cam
|
||||||
|
*/
|
||||||
|
public class PermConfig {
|
||||||
|
|
||||||
|
// 只加载"@"和“Bungee"库权限
|
||||||
|
|
||||||
|
public static Configuration permConfig;
|
||||||
|
|
||||||
|
|
||||||
|
public static void load() {
|
||||||
|
permConfig = null;
|
||||||
|
PermConfig.permConfig = new FileConfig(Main.getInstance(), "perm.yml").getConfig();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,63 @@
|
|||||||
|
package org.cn2b2t.proxy.functions.permission;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.Main;
|
||||||
|
import org.cn2b2t.proxy.managers.DataManager;
|
||||||
|
import org.cn2b2t.proxy.utils.data.Connection;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author cam
|
||||||
|
*/
|
||||||
|
public class PermissionDataManager {
|
||||||
|
|
||||||
|
public static Connection permdogConnection;
|
||||||
|
public static Connection websiteConnection;
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
permdogConnection = DataManager.getKettleConnection();
|
||||||
|
websiteConnection = DataManager.getWebsiteConnection();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getUniqueID(int inkID) {
|
||||||
|
ResultSet query = permdogConnection.SQLquery("nl2_users", "id", inkID);
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
String uuid = null;
|
||||||
|
if (query.next()) {
|
||||||
|
uuid = query.getString("uuid");
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在InkID" + inkID);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
permdogConnection.info(e.getLocalizedMessage());
|
||||||
|
Main.getInstance().getLogger().log(Level.WARNING, "code: {0}", query);
|
||||||
|
}
|
||||||
|
throw new NullPointerException("不存在InkID" + inkID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getInkID(String uuid) {
|
||||||
|
ResultSet query = permdogConnection.SQLquery("nl2_users", "uuid", uuid.replace("-", ""));
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
int id = -1;
|
||||||
|
if (query.next()) {
|
||||||
|
id = query.getInt("id");
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
permdogConnection.info(e.getLocalizedMessage());
|
||||||
|
Main.getInstance().getLogger().log(Level.WARNING, "code: {0}", query);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,108 @@
|
|||||||
|
package org.cn2b2t.proxy.functions.permission;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class PermissionLoader {
|
||||||
|
|
||||||
|
public static Integer[] getIntArray(String s) {
|
||||||
|
if (s == null || s.isEmpty()) return new Integer[0];
|
||||||
|
if (s.startsWith("[") && s.endsWith("]")) {
|
||||||
|
String inner = s.substring(1, s.length() - 1);
|
||||||
|
String[] split = inner.split(",");
|
||||||
|
Integer[] result = new Integer[split.length];
|
||||||
|
for (int i = 0; i < split.length; i++) {
|
||||||
|
String sec = split[i];
|
||||||
|
int num;
|
||||||
|
if (sec.startsWith("\"") && sec.endsWith("\"")) {
|
||||||
|
sec = sec.substring(1, sec.length() - 1);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
num = Integer.parseInt(sec);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
ProxyServer.getInstance().getLogger().info("Illegal Array: " + s + "(index=" + i + ")");
|
||||||
|
num = -1;
|
||||||
|
}
|
||||||
|
result[i] = num;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
ProxyServer.getInstance().getLogger().info("Illegal Array: " + s);
|
||||||
|
return new Integer[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String toString(Integer[] arr) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append("[");
|
||||||
|
for (int index = 0; index < arr.length; index++) {
|
||||||
|
int group_id = arr[index];
|
||||||
|
sb.append("\"").append(group_id).append("\"");
|
||||||
|
if (index != arr.length - 1) {
|
||||||
|
sb.append(",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sb.append("]");
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<DataPermissionGroup> getPermGroups(List<Integer> group_ids) {
|
||||||
|
return group_ids.stream().map(PermissionLoader::getPermGroup).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DataPermissionGroup getPermGroup(int group_id) {
|
||||||
|
ResultSet result = PermissionDataManager.websiteConnection.SQLquery("game_perms_group", "group_id", group_id);
|
||||||
|
try {
|
||||||
|
if (result != null) {
|
||||||
|
List<DataPermission> perms = new ArrayList<>();
|
||||||
|
List<Integer> extend = new ArrayList<>();
|
||||||
|
while (result.next()) {
|
||||||
|
String type = result.getString("type");
|
||||||
|
String value = result.getString("value");
|
||||||
|
String base = result.getString("base");
|
||||||
|
if (type.equalsIgnoreCase("perm")) {
|
||||||
|
perms.add(new DataPermission(value, base));
|
||||||
|
} else if (type.equalsIgnoreCase("extend")) {
|
||||||
|
try {
|
||||||
|
extend.add(Integer.valueOf(value));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "In table `game_perms_group`: id=" + result.getInt("id") +
|
||||||
|
">value must be integer, not \"" + value + "\"");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.close();
|
||||||
|
return new DataPermissionGroup(group_id, extend, perms);
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
PermissionDataManager.websiteConnection.info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "PermissionLoader.");
|
||||||
|
}
|
||||||
|
return new DataPermissionGroup(group_id, new ArrayList<>(), new ArrayList<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void loadGroupPermission(ProxiedPlayer p, List<DataPermissionGroup> groups) {
|
||||||
|
for (DataPermissionGroup group : groups) {
|
||||||
|
loadUserPermission(p, group.perms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void loadUserPermission(ProxiedPlayer p, List<DataPermission> perms) {
|
||||||
|
for (DataPermission perm : perms) {
|
||||||
|
String base = perm.base;
|
||||||
|
if (base.equals("@")) {
|
||||||
|
p.setPermission(perm.perm, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package org.cn2b2t.proxy.functions.permission;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.Main;
|
||||||
|
import org.cn2b2t.proxy.commands.ProxyPermdog;
|
||||||
|
import org.cn2b2t.proxy.listeners.OveridePermissionsListener;
|
||||||
|
|
||||||
|
public class PermissionMain {
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
PermConfig.load();
|
||||||
|
PermissionDataManager.init();
|
||||||
|
|
||||||
|
Main.regListener(new OveridePermissionsListener());
|
||||||
|
Main.regCommmand(new ProxyPermdog("proxypermdog"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void disable() {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,360 @@
|
|||||||
|
package org.cn2b2t.proxy.functions.permission;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 玩家的权限管理
|
||||||
|
* 除加入游戏时的加载,读取和写入都是同步运行,如果如要异步运行,请注意线程安全。
|
||||||
|
*
|
||||||
|
* @Author LSeng
|
||||||
|
*/
|
||||||
|
public class PermissionManager {
|
||||||
|
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * 卸载玩家的所有权限
|
||||||
|
// */
|
||||||
|
// public void unloadPermission(){
|
||||||
|
// for(Map.Entry<String, Boolean> perm : new HashMap<>(permissionAttachment.getPermissions()).entrySet()){
|
||||||
|
// permissionAttachment.unsetPermission(perm.getKey());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public void loadPermission() {
|
||||||
|
// List<PermGroup> groups = getUserGroup(getUser().getInkID());
|
||||||
|
// this.maxOrder = getMaxOrder(groups);
|
||||||
|
// PermissionLoader.loadGroupPermission(this, groups);//加载玩家的组权限
|
||||||
|
// PermissionLoader.loadUserPermission(this, getPermsIgnoreGroup(getUser().getInkID()));//加载玩家单独权限
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 由ID获取组
|
||||||
|
*
|
||||||
|
* @param group_id 组id
|
||||||
|
* @return 组
|
||||||
|
*/
|
||||||
|
public static DataPermissionGroup getGroupByID(int group_id) {
|
||||||
|
return PermissionLoader.getPermGroup(group_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得组下的所有玩家
|
||||||
|
*
|
||||||
|
* @param group_id 组ID
|
||||||
|
* @return 玩家的inkID和临时名字
|
||||||
|
*/
|
||||||
|
public static Map<Integer, String> getGroupMember(int group_id) {
|
||||||
|
ResultSet userResult = PermissionDataManager.websiteConnection.SQLquery("select * from nl2_users");
|
||||||
|
Map<Integer, String> map = new HashMap<>();
|
||||||
|
try {
|
||||||
|
if (userResult != null) {
|
||||||
|
while (userResult.next()) {
|
||||||
|
int target_id = userResult.getInt("group_id");
|
||||||
|
Integer[] secondary_groups = PermissionLoader.getIntArray(userResult.getString("secondary_groups"));
|
||||||
|
List<Integer> groups = new ArrayList<>(secondary_groups.length + 1);
|
||||||
|
groups.add(target_id);
|
||||||
|
groups.addAll(Arrays.asList(secondary_groups));
|
||||||
|
if (groups.contains(group_id)) {
|
||||||
|
map.put(userResult.getInt("id"), userResult.getString("username"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
userResult.close();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得玩家所在的组列表,不会顺便把继承的组也一起加载进去(但可以获得继承组的id)
|
||||||
|
* 假设玩家在组 MVP 中,组MVP继承VIP,则会获得组列表[MVP]
|
||||||
|
*
|
||||||
|
* @return 玩家所在的组列表
|
||||||
|
*/
|
||||||
|
public static List<DataPermissionGroup> getUserGroupsIgnoreExtend(int inkid) {
|
||||||
|
ResultSet userResult = PermissionDataManager.websiteConnection.SQLquery("nl2_users", "id", inkid);
|
||||||
|
try {
|
||||||
|
if (userResult != null) {
|
||||||
|
if (userResult.next()) {
|
||||||
|
int group_id = userResult.getInt("group_id");
|
||||||
|
Integer[] secondary_groups = PermissionLoader.getIntArray(userResult.getString("secondary_groups"));
|
||||||
|
List<Integer> groups = new ArrayList<>(secondary_groups.length + 1);
|
||||||
|
groups.add(group_id);
|
||||||
|
groups.addAll(Arrays.asList(secondary_groups));
|
||||||
|
|
||||||
|
return PermissionLoader.getPermGroups(groups);
|
||||||
|
}
|
||||||
|
userResult.close();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
PermissionDataManager.permdogConnection.info(e.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得玩家的主组
|
||||||
|
*
|
||||||
|
* @param inkid 玩家的inkID
|
||||||
|
* @return 玩家的主组
|
||||||
|
*/
|
||||||
|
public static DataPermissionGroup getMainGroup(int inkid) {
|
||||||
|
ResultSet groupResult = PermissionDataManager.websiteConnection.SQLquery("nl2_users", "id", inkid);
|
||||||
|
try {
|
||||||
|
if (groupResult != null) {
|
||||||
|
if (groupResult.next()) {
|
||||||
|
int group_id = groupResult.getInt("group_id");
|
||||||
|
|
||||||
|
return PermissionLoader.getPermGroup(group_id);
|
||||||
|
}
|
||||||
|
groupResult.close();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
PermissionDataManager.permdogConnection.info(e.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加载玩家的副组
|
||||||
|
*
|
||||||
|
* @param inkid 玩家的inkID
|
||||||
|
* @return 玩家的副组列表
|
||||||
|
*/
|
||||||
|
public static List<DataPermissionGroup> getSecondaryGroups(int inkid) {
|
||||||
|
ResultSet groupResult = PermissionDataManager.websiteConnection.SQLquery("nl2_users", "id", inkid);
|
||||||
|
try {
|
||||||
|
if (groupResult != null) {
|
||||||
|
if (groupResult.next()) {
|
||||||
|
Integer[] secondary_groups = PermissionLoader.getIntArray(groupResult.getString("secondary_groups"));
|
||||||
|
List<Integer> groups = new ArrayList<>(secondary_groups.length);
|
||||||
|
groups.addAll(Arrays.asList(secondary_groups));
|
||||||
|
|
||||||
|
return PermissionLoader.getPermGroups(groups);
|
||||||
|
}
|
||||||
|
groupResult.close();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
PermissionDataManager.permdogConnection.info(e.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得玩家所在的组列表,顺便把继承的组也一起加载进去
|
||||||
|
* 假设玩家在组 MVP 中,组MVP继承VIP,则会获得组列表[MVP, VIP]
|
||||||
|
*
|
||||||
|
* @return 玩家所在的组列表
|
||||||
|
*/
|
||||||
|
public static List<DataPermissionGroup> getUserGroup(int inkid) {
|
||||||
|
List<DataPermissionGroup> permGroups = getUserGroupsIgnoreExtend(inkid);
|
||||||
|
//加载继承组
|
||||||
|
for (DataPermissionGroup group : new ArrayList<>(permGroups)) {
|
||||||
|
if (!group.extend.isEmpty()) {//有继承的组
|
||||||
|
//检测是否有重复组
|
||||||
|
label:
|
||||||
|
for (int i : group.extend) {
|
||||||
|
for (DataPermissionGroup temp : permGroups) {
|
||||||
|
if (temp.id == i) {
|
||||||
|
continue label;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
permGroups.add(PermissionLoader.getPermGroup(i));//若无重复,则添加组
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return permGroups;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得玩家的单独权限,不获得组权限
|
||||||
|
* 比如玩家拥有权限 kar.abc ,玩家在组 VIP 中,组VIP有权限 kar.vip ,则会获得权限列表[kar.abc]
|
||||||
|
*
|
||||||
|
* @return 玩家的权限列表
|
||||||
|
*/
|
||||||
|
public static List<DataPermission> getPermsIgnoreGroup(int inkid) {
|
||||||
|
ResultSet userResult = PermissionDataManager.websiteConnection.SQLquery("game_perms_user", "inkid", inkid);
|
||||||
|
try {
|
||||||
|
if (userResult != null) {
|
||||||
|
List<DataPermission> perms = new ArrayList<>();
|
||||||
|
while (userResult.next()) {
|
||||||
|
String perm = userResult.getString("perm");
|
||||||
|
String base = userResult.getString("base");
|
||||||
|
|
||||||
|
perms.add(new DataPermission(perm, base));
|
||||||
|
}
|
||||||
|
|
||||||
|
userResult.close();
|
||||||
|
|
||||||
|
return perms;
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
PermissionDataManager.permdogConnection.info(e.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得玩家的所有权限,包括组权限
|
||||||
|
* 比如玩家拥有权限 kar.abc ,玩家在组 VIP 中,组VIP有权限 kar.vip ,则会获得权限列表[kar.abc, kar.vip]
|
||||||
|
*
|
||||||
|
* @return 玩家的权限列表
|
||||||
|
*/
|
||||||
|
public static List<DataPermission> getAllPerms(int inkid) {
|
||||||
|
List<DataPermission> list = new ArrayList<>(getPermsIgnoreGroup(inkid));
|
||||||
|
for (DataPermissionGroup group : getUserGroup(inkid)) {
|
||||||
|
list.addAll(group.perms);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新某玩家的权限
|
||||||
|
*
|
||||||
|
* @param p 玩家
|
||||||
|
*/
|
||||||
|
public static void updatePermission(ProxiedPlayer p) {
|
||||||
|
int inkid = PermissionDataManager.getInkID(p.getUniqueId().toString());
|
||||||
|
if (inkid != -1) {
|
||||||
|
List<DataPermissionGroup> groups = getUserGroup(inkid);
|
||||||
|
PermissionLoader.loadGroupPermission(p, groups);//加载玩家的组权限
|
||||||
|
PermissionLoader.loadUserPermission(p, getPermsIgnoreGroup(inkid));//加载玩家单独权限
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unloadPermission(ProxiedPlayer p) {
|
||||||
|
for (String s : new ArrayList<>(p.getPermissions())) {
|
||||||
|
p.setPermission(s, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新所有玩家的权限
|
||||||
|
*/
|
||||||
|
public static void updateAll() {
|
||||||
|
for (ProxiedPlayer p : ProxyServer.getInstance().getPlayers()) {
|
||||||
|
updatePermission(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取存在的组
|
||||||
|
*
|
||||||
|
* @return 得到一个Map,Key为group_id,Value为组名
|
||||||
|
*/
|
||||||
|
public static Map<Integer, String> getExistedGroups() {
|
||||||
|
Map<Integer, String> map = new HashMap<>();
|
||||||
|
ResultSet result = PermissionDataManager.permdogConnection.SQLquery("select * from nl2_groups");
|
||||||
|
try {
|
||||||
|
if (result != null) {
|
||||||
|
while (result.next()) {
|
||||||
|
int group_id = result.getInt("id");
|
||||||
|
String name = result.getString("name");
|
||||||
|
map.put(group_id, name);
|
||||||
|
}
|
||||||
|
result.close();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
PermissionDataManager.permdogConnection.info(e.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得组列表中order最高的order值
|
||||||
|
*/
|
||||||
|
public static int getMaxOrder(List<DataPermissionGroup> list) {
|
||||||
|
int maxOrder = -1;
|
||||||
|
ResultSet result = PermissionDataManager.permdogConnection.SQLquery("select * from nl2_groups");
|
||||||
|
try {
|
||||||
|
if (result != null) {
|
||||||
|
while (result.next()) {
|
||||||
|
int group_id = result.getInt("id");
|
||||||
|
for (DataPermissionGroup group : list) {
|
||||||
|
if (group.id == group_id) {
|
||||||
|
int order = result.getInt("order");
|
||||||
|
if (order > maxOrder) {
|
||||||
|
maxOrder = order;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.close();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
PermissionDataManager.permdogConnection.info(e.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return maxOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据groupID获取组名
|
||||||
|
*
|
||||||
|
* @param group_id 组ID
|
||||||
|
* @return 组名
|
||||||
|
*/
|
||||||
|
public static String getGroupName(int group_id) {
|
||||||
|
return getGroupName(new int[]{group_id})[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据groupID批量获取组名
|
||||||
|
*
|
||||||
|
* @param group_ids 批量获取的组的组ID
|
||||||
|
* @return 组名
|
||||||
|
*/
|
||||||
|
public static String[] getGroupName(int[] group_ids) {
|
||||||
|
String[] result = new String[group_ids.length];
|
||||||
|
Map<Integer, String> map = getExistedGroups();
|
||||||
|
for (int index = 0; index < group_ids.length; index++) {
|
||||||
|
int group_id = group_ids[index];
|
||||||
|
result[index] = map.get(group_id);
|
||||||
|
if (result[index] == null) {
|
||||||
|
result[index] = "Unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据组名获取组ID
|
||||||
|
*
|
||||||
|
* @param name 组名
|
||||||
|
* @return 组ID
|
||||||
|
*/
|
||||||
|
public static int getGroupID(String name) {
|
||||||
|
return getGroupID(new String[]{name})[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据组名批量获取组ID
|
||||||
|
*
|
||||||
|
* @param names 批量获取的组的组名
|
||||||
|
* @return 组ID
|
||||||
|
*/
|
||||||
|
public static int[] getGroupID(String[] names) {
|
||||||
|
int[] result = new int[names.length];
|
||||||
|
Map<Integer, String> map = getExistedGroups();
|
||||||
|
for (int index = 0; index < names.length; index++) {
|
||||||
|
String name = names[index];
|
||||||
|
int value = -1;
|
||||||
|
for (Map.Entry<Integer, String> entry : map.entrySet()) {
|
||||||
|
if (entry.getValue().equals(name)) {
|
||||||
|
value = entry.getKey();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result[index] = value;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,102 @@
|
|||||||
|
package org.cn2b2t.proxy.functions.proxyuser;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.functions.Account;
|
||||||
|
import org.cn2b2t.proxy.managers.DataManager;
|
||||||
|
import org.cn2b2t.proxy.utils.UUIDUtils;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class PreUser {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private boolean exist;
|
||||||
|
private UUID uuid;
|
||||||
|
private UUID mojangUUID;
|
||||||
|
long registerTime;
|
||||||
|
|
||||||
|
PreUser(String name){
|
||||||
|
this.name = name;
|
||||||
|
UUID[] uuids = Account.getUUIDandMojangUniqueID(name);
|
||||||
|
if(uuids == null){
|
||||||
|
this.exist = false;
|
||||||
|
} else {
|
||||||
|
this.exist = true;
|
||||||
|
this.uuid = uuids[0];
|
||||||
|
this.mojangUUID = uuids[1];
|
||||||
|
}
|
||||||
|
registerTime = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PreUser(UUID mojangUUID){
|
||||||
|
this.mojangUUID = mojangUUID;
|
||||||
|
if(mojangUUID == null){
|
||||||
|
exist = false;
|
||||||
|
uuid = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ResultSet result = DataManager.getWebsiteConnection().SQLquery("select * from nl2_users where mojanguuid = '"+mojangUUID.toString().replace("-","")+"'");
|
||||||
|
try {
|
||||||
|
if(result != null){
|
||||||
|
if(result.next()){
|
||||||
|
exist = true;
|
||||||
|
String name = result.getString("username");
|
||||||
|
UUID uuid = UUIDUtils.toUUID(result.getString("uuid"));
|
||||||
|
this.name = name;
|
||||||
|
this.uuid = uuid;
|
||||||
|
}
|
||||||
|
result.close();
|
||||||
|
}
|
||||||
|
} catch (SQLException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
registerTime = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean exist(){
|
||||||
|
return exist;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getUUID(){
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getMojangUUID(){
|
||||||
|
return mojangUUID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOnlineMode(){
|
||||||
|
return mojangUUID != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPremium(){
|
||||||
|
String mes = "select * from `uservalues` where `inkid` = '" + Account.getInkID(name) + "' AND `key` = 'verPremium'";
|
||||||
|
ResultSet query = DataManager.getTempConnection().SQLquery(mes);
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
String value = null;
|
||||||
|
if (query.next()) {
|
||||||
|
value = query.getString("value");
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return value != null && value.equalsIgnoreCase("true");
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
DataManager.getTempConnection().info(e.getLocalizedMessage());
|
||||||
|
System.out.println("code: "+mes);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void readyPremium(){
|
||||||
|
DataManager.getTempConnection().update("uservalues",
|
||||||
|
new String[]{"value"}, new Object[]{"ready"},
|
||||||
|
new String[]{"key", "inkid"}, new Object[]{"verPremium", Account.getInkID(name)});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,173 @@
|
|||||||
|
package org.cn2b2t.proxy.functions.proxyuser;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.Main;
|
||||||
|
import org.cn2b2t.proxy.functions.Account;
|
||||||
|
import org.cn2b2t.proxy.functions.permission.DataPermissionGroup;
|
||||||
|
import org.cn2b2t.proxy.functions.permission.PermissionLoader;
|
||||||
|
import org.cn2b2t.proxy.functions.permission.PermissionManager;
|
||||||
|
import org.cn2b2t.proxy.functions.serverinfo.ServerInfoConfig;
|
||||||
|
import org.cn2b2t.proxy.managers.DataManager;
|
||||||
|
import org.cn2b2t.proxy.managers.UserValueManager;
|
||||||
|
import net.md_5.bungee.BungeeCord;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
|
import net.md_5.bungee.scheduler.BungeeScheduler;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
public class ProxyUser {
|
||||||
|
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private int inkID;
|
||||||
|
private UUID mojangUUID;
|
||||||
|
private UUID gameUUID;
|
||||||
|
|
||||||
|
|
||||||
|
private boolean isRegistered;
|
||||||
|
|
||||||
|
private int version;
|
||||||
|
|
||||||
|
private boolean hasTarget;
|
||||||
|
private ServerInfo serverTarget;
|
||||||
|
|
||||||
|
private String targetServerName;
|
||||||
|
|
||||||
|
|
||||||
|
private Map<String, String> values;
|
||||||
|
|
||||||
|
|
||||||
|
public ProxyUser(String userName, String connectedIP, Integer version, UUID uuid, UUID mojangUUID) {
|
||||||
|
this.name = userName;
|
||||||
|
this.targetServerName = ServerInfoConfig.getServerInfo(connectedIP).getTargetServer();
|
||||||
|
|
||||||
|
this.version = version;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
isRegistered = Account.isRegistered(userName);
|
||||||
|
if (isRegistered) {
|
||||||
|
inkID = Account.getInkID(name);
|
||||||
|
this.mojangUUID = mojangUUID;
|
||||||
|
gameUUID = uuid;
|
||||||
|
values = UserValueManager.getDataValues(inkID);
|
||||||
|
} else {
|
||||||
|
inkID = -1;
|
||||||
|
this.mojangUUID = mojangUUID;
|
||||||
|
values = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!isOnlineMode() && !ServerInfoConfig.getServerInfo(connectedIP).isDirectTeleport()) {
|
||||||
|
new BungeeScheduler().runAsync(Main.getInstance(), () -> {
|
||||||
|
DataManager.putTarget(userName, targetServerName);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
new BungeeScheduler().runAsync(Main.getInstance(), this::createTempUser);
|
||||||
|
|
||||||
|
new BungeeScheduler().runAsync(Main.getInstance(), this::updatePermission);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getGameUUID() {
|
||||||
|
return gameUUID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getInkID() {
|
||||||
|
return inkID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isRegistered() {
|
||||||
|
return isRegistered;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updatePermission() {
|
||||||
|
new BungeeScheduler().runAsync(Main.getInstance(), () -> {
|
||||||
|
List<DataPermissionGroup> groups = PermissionManager.getUserGroup(inkID);
|
||||||
|
new BungeeScheduler().schedule(Main.getInstance(), () -> {
|
||||||
|
BungeeCord.getInstance().getConsole().sendMessage("loading perms of " + name);
|
||||||
|
PermissionLoader.loadGroupPermission(BungeeCord.getInstance().getPlayer(name), groups);//加载玩家的组权限
|
||||||
|
PermissionLoader.loadUserPermission(BungeeCord.getInstance().getPlayer(name), PermissionManager.getPermsIgnoreGroup(inkID));
|
||||||
|
}, 0, TimeUnit.MILLISECONDS);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getValues() {
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setServerTarget(String server) {
|
||||||
|
this.serverTarget = BungeeCord.getInstance().getServerInfo(server) != null ?
|
||||||
|
BungeeCord.getInstance().getServerInfo(server) : BungeeCord.getInstance().getServerInfo(ServerInfoConfig.defaultInfo.getTargetServer());
|
||||||
|
hasTarget = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServerInfo getServerTarget() {
|
||||||
|
hasTarget = false;
|
||||||
|
return serverTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOnlineMode() {
|
||||||
|
return mojangUUID != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isRealOnlineMode() {
|
||||||
|
return ProxyServer.getInstance().getPlayer(name).getPendingConnection().isOnlineMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getMojangUUID() {
|
||||||
|
return mojangUUID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createTempUser() {
|
||||||
|
ResultSet query = DataManager.getTempConnection().SQLquery("tempuser", "name", name);
|
||||||
|
try {
|
||||||
|
boolean exist = false;
|
||||||
|
if(query != null){
|
||||||
|
if(query.next()){
|
||||||
|
exist = true;
|
||||||
|
new BungeeScheduler().runAsync(Main.getInstance(), () -> DataManager.getTempConnection()
|
||||||
|
.update("tempuser",
|
||||||
|
new String[]{"name", "isonlinemode", "version"},
|
||||||
|
new Object[]{getName(), isRealOnlineMode() ? 1 : 0, version},
|
||||||
|
new String[]{"name"},
|
||||||
|
new Object[]{name}));
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
}
|
||||||
|
if(!exist){
|
||||||
|
new BungeeScheduler().runAsync(Main.getInstance(), () -> DataManager.getTempConnection()
|
||||||
|
.insert("tempuser",
|
||||||
|
new String[]{"name", "isonlinemode", "version"},
|
||||||
|
new Object[]{getName(), isRealOnlineMode() ? 1 : 0, version}));
|
||||||
|
}
|
||||||
|
} catch (SQLException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTargetServerName() {
|
||||||
|
return targetServerName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasTarget() {
|
||||||
|
return hasTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadPermission() {
|
||||||
|
PermissionManager.updatePermission(BungeeCord.getInstance().getPlayer(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,80 @@
|
|||||||
|
package org.cn2b2t.proxy.functions.proxyuser;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class UserManager {
|
||||||
|
|
||||||
|
private static List<ProxyUser> users = new ArrayList<>();
|
||||||
|
|
||||||
|
private static Set<PreUser> preUsers = new HashSet<>();
|
||||||
|
|
||||||
|
public static PreUser loadPreUser(String name){
|
||||||
|
PreUser preUser = new PreUser(name);
|
||||||
|
preUsers.add(preUser);
|
||||||
|
antiMemoryFlow(); //防止内存溢出
|
||||||
|
return preUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unloadPreUser(PreUser preUser){
|
||||||
|
preUsers.remove(preUser);
|
||||||
|
System.out.println("PreUser "+preUser.getName()+" has been unloaded.");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PreUser getPreUser(String name){
|
||||||
|
for(PreUser preUser : preUsers){
|
||||||
|
if(preUser.getName().equals(name)){
|
||||||
|
return preUser;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static long lastCheck;
|
||||||
|
private static void antiMemoryFlow(){
|
||||||
|
long now = System.currentTimeMillis();
|
||||||
|
if(now - lastCheck > 60000) {
|
||||||
|
lastCheck = now;
|
||||||
|
for (PreUser preUser : new HashSet<>(preUsers)){
|
||||||
|
if(now - preUser.registerTime > 30000){
|
||||||
|
preUsers.remove(preUser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(ProxyUser user : users){
|
||||||
|
if(ProxyServer.getInstance().getPlayer(user.getGameUUID()) == null){
|
||||||
|
unloadUser(user.getName());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ProxyUser loadUser(PreUser preUser, String connectedIP, Integer version) {
|
||||||
|
ProxyUser u = new ProxyUser(preUser.getName(), connectedIP, version, preUser.getUUID(), preUser.getMojangUUID());
|
||||||
|
users.add(u);
|
||||||
|
return u;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unloadUser(String name) {
|
||||||
|
for (ProxyUser user : users) {
|
||||||
|
if (user.getName().equals(name)) {
|
||||||
|
users.remove(user);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ProxyUser getUser(String name) {
|
||||||
|
return users.stream().filter(user -> user.getName().equals(name)).findFirst().orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<ProxyUser> getOnlineUsers() {
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,88 @@
|
|||||||
|
package org.cn2b2t.proxy.functions.serverinfo;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.Main;
|
||||||
|
import org.cn2b2t.proxy.utils.FileConfig;
|
||||||
|
import net.md_5.bungee.config.Configuration;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ServerInfoConfig {
|
||||||
|
|
||||||
|
public static HashMap<String, String> ipToName = new HashMap<>();
|
||||||
|
public static HashMap<String, ServerInfos> severinfos = new HashMap<>();
|
||||||
|
|
||||||
|
public static List<String> onlineIps;
|
||||||
|
public static List<String> offlineIps;
|
||||||
|
|
||||||
|
public static ServerInfos defaultInfo;
|
||||||
|
public static boolean fixing;
|
||||||
|
|
||||||
|
public static String fixingInfo;
|
||||||
|
public static String fixingMotd;
|
||||||
|
public static List<String> allowedPlayers;
|
||||||
|
|
||||||
|
public static Configuration serverinfo;
|
||||||
|
|
||||||
|
public static ServerInfos getServerInfo(String ip) {
|
||||||
|
return ServerInfoConfig.ipToName.containsKey(ip.toLowerCase()) ? (
|
||||||
|
(severinfos.containsKey(ipToName.get(ip.toLowerCase())) ?
|
||||||
|
severinfos.get(ipToName.get(ip.toLowerCase()))
|
||||||
|
: defaultInfo))
|
||||||
|
: defaultInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void load() {
|
||||||
|
serverinfo = null;
|
||||||
|
ServerInfoConfig.serverinfo = new FileConfig(Main.getPlugin(), "serverinfo.yml").getConfig();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ipToName.clear();
|
||||||
|
severinfos.clear();
|
||||||
|
fixing = serverinfo.getBoolean("FixingMode.enable");
|
||||||
|
|
||||||
|
|
||||||
|
if (fixing) {
|
||||||
|
fixingInfo = serverinfo.getString("FixingMode.Info");
|
||||||
|
fixingMotd = serverinfo.getString("FixingMode.Motd");
|
||||||
|
allowedPlayers = new ArrayList<>();
|
||||||
|
allowedPlayers = serverinfo.getStringList("FixingMode.players");
|
||||||
|
}
|
||||||
|
|
||||||
|
ServerInfoConfig.defaultInfo = new ServerInfos(ServerInfoConfig.serverinfo.getString("Default.Motd.line1"),
|
||||||
|
fixing ? fixingMotd : serverinfo.getString("Default.Motd.line2"),
|
||||||
|
serverinfo.getStringList("Default.PlayerInfo"),
|
||||||
|
fixing ? fixingInfo : serverinfo.getString("Default.version"),
|
||||||
|
serverinfo.getBoolean("Default.useFakePlayer"),
|
||||||
|
serverinfo.getInt("Default.maxPlayer"),
|
||||||
|
serverinfo.getString("Default.icon"),
|
||||||
|
"SYSTEM.MAINLOBBY",
|
||||||
|
false,
|
||||||
|
false);
|
||||||
|
|
||||||
|
onlineIps = serverinfo.getStringList("IP.online");
|
||||||
|
offlineIps = serverinfo.getStringList("IP.offline");
|
||||||
|
|
||||||
|
serverinfo.getSection("Settings").getKeys().forEach(name -> {
|
||||||
|
serverinfo.getStringList("Settings." + name + ".IP").forEach(ip -> ServerInfoConfig.ipToName.put(ip.toLowerCase(), name.toLowerCase()));
|
||||||
|
ServerInfoConfig.severinfos.put(name.toLowerCase(),
|
||||||
|
new ServerInfos(serverinfo.getString("Settings." + name + ".Motd.line1"),
|
||||||
|
fixing ? fixingMotd : serverinfo.getString("Settings." + name + ".Motd.line2"),
|
||||||
|
serverinfo.getStringList("Settings." + name + ".PlayerInfo"),
|
||||||
|
fixing ? fixingInfo : serverinfo.getString("Settings." + name + ".version"),
|
||||||
|
serverinfo.getBoolean("Settings." + name + ".useFakePlayer"),
|
||||||
|
serverinfo.getStringList("Settings." + name + ".playersFrom"),
|
||||||
|
serverinfo.getInt("Settings." + name + ".maxPlayer"),
|
||||||
|
serverinfo.getString("Settings." + name + ".icon"),
|
||||||
|
serverinfo.getString("Settings." + name + ".target"),
|
||||||
|
serverinfo.getBoolean("Settings." + name + ".directTeleport", false),
|
||||||
|
serverinfo.getBoolean("Settings." + name + ".onlyOnlineMode", false),
|
||||||
|
serverinfo.getString("Settings." + name + ".modType", "BUKKIT")));
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package org.cn2b2t.proxy.functions.serverinfo;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.Main;
|
||||||
|
import org.cn2b2t.proxy.commands.ProxyInfos;
|
||||||
|
import org.cn2b2t.proxy.listeners.FixingMode;
|
||||||
|
import org.cn2b2t.proxy.listeners.ProxyPingListener;
|
||||||
|
|
||||||
|
public class ServerInfoMain {
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
ServerInfoConfig.load();
|
||||||
|
|
||||||
|
Main.regCommmand(new ProxyInfos("proxyinfos"));
|
||||||
|
Main.regListener(new ProxyPingListener());
|
||||||
|
if (ServerInfoConfig.fixing) Main.regListener(new FixingMode());
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,149 @@
|
|||||||
|
package org.cn2b2t.proxy.functions.serverinfo;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.Main;
|
||||||
|
import org.cn2b2t.proxy.functions.PlayerCounter;
|
||||||
|
import org.cn2b2t.proxy.utils.MathMethods;
|
||||||
|
import net.md_5.bungee.BungeeCord;
|
||||||
|
import net.md_5.bungee.api.Favicon;
|
||||||
|
import net.md_5.bungee.api.ServerPing;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class ServerInfos {
|
||||||
|
private String motd1;
|
||||||
|
private String motd2;
|
||||||
|
private ServerPing.PlayerInfo[] playerinfo;
|
||||||
|
private String version;
|
||||||
|
private boolean useFakePlayer;
|
||||||
|
private List<String> playersFrom;
|
||||||
|
private int maxPlayers;
|
||||||
|
private Favicon favicon;
|
||||||
|
|
||||||
|
private String modType;
|
||||||
|
|
||||||
|
|
||||||
|
private String targetServer;
|
||||||
|
private boolean directTeleport;
|
||||||
|
private boolean onlyOnlineMode;
|
||||||
|
|
||||||
|
public ServerInfos(String motd1, String motd2,
|
||||||
|
List<String> playerinfo,
|
||||||
|
String version,
|
||||||
|
boolean useFakePlayer,
|
||||||
|
int maxPlayers,
|
||||||
|
String faviconpath,
|
||||||
|
String targetServer,
|
||||||
|
boolean directTeleport,
|
||||||
|
boolean onlyOnlineMode) {
|
||||||
|
|
||||||
|
this.motd1 = motd1.replace("&", "§");
|
||||||
|
this.motd2 = motd2.replace("&", "§");
|
||||||
|
this.playerinfo = playerinfo.stream().map(s -> new ServerPing.PlayerInfo(s.replace("&", "§"), UUID.randomUUID())).toArray(ServerPing.PlayerInfo[]::new);
|
||||||
|
this.version = version.replace("&", "§");
|
||||||
|
this.useFakePlayer = useFakePlayer;
|
||||||
|
this.maxPlayers = maxPlayers;
|
||||||
|
this.playersFrom = new ArrayList<>();
|
||||||
|
BufferedImage img;
|
||||||
|
try {
|
||||||
|
img = ImageIO.read(new File(Main.getInstance().getDataFolder().getParentFile().getAbsoluteFile().getParentFile().getAbsolutePath() + faviconpath));
|
||||||
|
favicon = Favicon.create(img);
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.print(faviconpath + "不存在。");
|
||||||
|
favicon = null;
|
||||||
|
}
|
||||||
|
this.targetServer = targetServer;
|
||||||
|
this.directTeleport = directTeleport;
|
||||||
|
this.onlyOnlineMode = onlyOnlineMode;
|
||||||
|
this.modType = "VANILLA";
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServerInfos(String motd1, String motd2,
|
||||||
|
List<String> playerinfo,
|
||||||
|
String version,
|
||||||
|
boolean useFakePlayer,
|
||||||
|
List<String> playersFrom,
|
||||||
|
int maxPlayers,
|
||||||
|
String faviconpath,
|
||||||
|
String targetServer,
|
||||||
|
boolean directTeleport,
|
||||||
|
boolean onlyOnlineMode,
|
||||||
|
String modType) {
|
||||||
|
this.motd1 = motd1.replace("&", "§");
|
||||||
|
this.motd2 = motd2.replace("&", "§");
|
||||||
|
this.playerinfo = playerinfo.stream().map(s -> new ServerPing.PlayerInfo(s.replace("&", "§"), UUID.randomUUID())).toArray(ServerPing.PlayerInfo[]::new);
|
||||||
|
this.version = version.replace("&", "§");
|
||||||
|
this.useFakePlayer = useFakePlayer;
|
||||||
|
this.playersFrom = playersFrom;
|
||||||
|
this.maxPlayers = maxPlayers;
|
||||||
|
BufferedImage img;
|
||||||
|
try {
|
||||||
|
img = ImageIO.read(new File(Main.getInstance().getDataFolder().getParentFile().getAbsoluteFile().getParentFile().getAbsolutePath() + faviconpath));
|
||||||
|
favicon = Favicon.create(img);
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.print(faviconpath + "不存在。");
|
||||||
|
favicon = null;
|
||||||
|
}
|
||||||
|
this.targetServer = targetServer;
|
||||||
|
this.directTeleport = directTeleport;
|
||||||
|
this.onlyOnlineMode = onlyOnlineMode;
|
||||||
|
this.modType = modType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getPlayersFrom() {
|
||||||
|
return playersFrom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getModType() {
|
||||||
|
|
||||||
|
return modType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMaxPlayers() {
|
||||||
|
return this.maxPlayers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMotd() {
|
||||||
|
return motd1 + "\n" + motd2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isUseFakePlayer() {
|
||||||
|
return useFakePlayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServerPing.PlayerInfo[] getPlayerinfo() {
|
||||||
|
return playerinfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVersion() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Favicon getFavicon() {
|
||||||
|
return favicon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTargetServer() {
|
||||||
|
return targetServer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDirectTeleport() {
|
||||||
|
return directTeleport;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOnlyOnlineMode() {
|
||||||
|
return onlyOnlineMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPlayerNumber() {
|
||||||
|
int playerNumber = playersFrom.size() > 0 ?
|
||||||
|
getPlayersFrom().stream().mapToInt(servername -> BungeeCord.getInstance().getServerInfo(servername).getPlayers().size()).sum()
|
||||||
|
: BungeeCord.getInstance().getPlayers().size();
|
||||||
|
return isUseFakePlayer() ? MathMethods.getFakePlayer(playerNumber) : playerNumber;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package org.cn2b2t.proxy.listeners;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.functions.serverinfo.ServerInfoConfig;
|
||||||
|
import net.md_5.bungee.api.event.PreLoginEvent;
|
||||||
|
import net.md_5.bungee.api.plugin.Listener;
|
||||||
|
import net.md_5.bungee.event.EventHandler;
|
||||||
|
|
||||||
|
public class FixingMode implements Listener {
|
||||||
|
|
||||||
|
@EventHandler(priority = 10)
|
||||||
|
public void onPinging(PreLoginEvent e) {
|
||||||
|
if (!ServerInfoConfig.allowedPlayers.contains(e.getConnection().getName())) {
|
||||||
|
e.setCancelReason("§7抱歉,本服务器仍在维护。\n \n" + ServerInfoConfig.fixingMotd);
|
||||||
|
e.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,403 @@
|
|||||||
|
package org.cn2b2t.proxy.listeners;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.Config;
|
||||||
|
import org.cn2b2t.proxy.Main;
|
||||||
|
import org.cn2b2t.proxy.functions.Account;
|
||||||
|
import org.cn2b2t.proxy.functions.proxyuser.PreUser;
|
||||||
|
import org.cn2b2t.proxy.functions.proxyuser.ProxyUser;
|
||||||
|
import org.cn2b2t.proxy.functions.proxyuser.UserManager;
|
||||||
|
import org.cn2b2t.proxy.functions.serverinfo.ServerInfoConfig;
|
||||||
|
import org.cn2b2t.proxy.managers.DataManager;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.connection.PendingConnection;
|
||||||
|
import net.md_5.bungee.api.event.*;
|
||||||
|
import net.md_5.bungee.api.plugin.Listener;
|
||||||
|
import net.md_5.bungee.connection.InitialHandler;
|
||||||
|
import net.md_5.bungee.event.EventHandler;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
||||||
|
/* proxy端用户
|
||||||
|
* 在用户进入子服(登陆服或大厅服)之前,先经过logging in的过程,在此过程决定玩家是否需要正版验证、是否可以进入等
|
||||||
|
* 这些函数都不是在主线程中运行的,所以无需担心主线程堵塞
|
||||||
|
* 但是,尽量减少验证的时间可以提减少玩家进入服务器的时间,太长的登录时间可能会造成time out,降低玩家体验
|
||||||
|
* 不过,大部分时间并不在这些事件中耗费,而是握手包和mojang验证的时间中耗费
|
||||||
|
*
|
||||||
|
* 当用户进入服务器时,
|
||||||
|
*
|
||||||
|
* 如果该用户已注册,且该玩家是正版,则设置该玩家为正版登入
|
||||||
|
* 接着获取该用户的UUID(1),若与数据库中的mojangUUID不匹配(2),则另开一个线程去更新玩家(2)的名字,然后再去寻找(1)的UUID是否在数据库中的mojangUUID存在
|
||||||
|
* 若存在,则证明该用户注册过,更新用户(1)的名字(要检测是否占用),并传送至大厅
|
||||||
|
* 若不存在,则证明该用户未注册过,告知到网站上注册
|
||||||
|
*
|
||||||
|
* 若该用户已注册,且该玩家是盗版,则设置该玩家为盗版登入,并传送至登录服(输入密码登陆)
|
||||||
|
*
|
||||||
|
* 如果该用户未注册,在mojang中获取该name的uuid,若存在,在数据库中查找mojangUUID是否存在,若存在,更新其名字(要检测是否占用),并设为正版
|
||||||
|
* 否则,从mojang中检测该用户是否为正版ID,若不是,告知请在官网上登陆
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 检测名字占用(开另一个线程去检测)
|
||||||
|
* 当更新一个正版玩家的名字时,从数据库中查找是否占用了另一个玩家的名字,若占用
|
||||||
|
* 占用的是一个正版玩家的名字,在mojang获取该正版玩家的新名字并更新,再次检测是否占用(递归到无占用或占用盗版玩家名字为止)
|
||||||
|
* 占用的是一个盗版玩家的名字,将该盗版玩家的名字设为NULL
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 传送至登录服后,接下来的事情就交给登录服处理了。
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class LoginListener implements Listener {
|
||||||
|
|
||||||
|
public static List<String> regOffline = new ArrayList<>();
|
||||||
|
|
||||||
|
public static boolean recover = ServerInfoConfig.fixing;
|
||||||
|
|
||||||
|
private boolean debug_time = false;
|
||||||
|
|
||||||
|
private static String hideName(String name){
|
||||||
|
if(name.length() >= 3){
|
||||||
|
int length = name.length()-3;
|
||||||
|
StringBuilder nameBuilder = new StringBuilder(name.substring(0, 3));
|
||||||
|
for(int i = 0; i<length; i++){
|
||||||
|
nameBuilder.append("*");
|
||||||
|
}
|
||||||
|
name = nameBuilder.toString();
|
||||||
|
return name;
|
||||||
|
} else {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 玩家登陆之前,此时玩家还没有UUID,是否验证正版在此处决定
|
||||||
|
*/
|
||||||
|
@EventHandler
|
||||||
|
public void onPreLogin(PreLoginEvent e) {
|
||||||
|
long start = 0;
|
||||||
|
if(debug_time) start = System.currentTimeMillis();
|
||||||
|
|
||||||
|
if (e.getConnection() == null || e.isCancelled()) return;
|
||||||
|
|
||||||
|
PendingConnection connection = e.getConnection();
|
||||||
|
|
||||||
|
String playerName = connection.getName();
|
||||||
|
//名字检测
|
||||||
|
if(useIllegalCharacter(playerName)){
|
||||||
|
e.setCancelReason("§b--§3-§8----------------------------------------§3-§b--\n" +
|
||||||
|
"§7尊敬的玩家您好,\n" +
|
||||||
|
"§7您当前使用的ID包含非法字符\n" +
|
||||||
|
"§7请更改您的名称后再加入服务器\n" +
|
||||||
|
"§7尽量使用字母和数字,可以使用中文,除此以外的所有字符都为非法字符!\n" +
|
||||||
|
"§b--§3-§8----------------------------------------§3-§b--");
|
||||||
|
e.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
PreUser preUser = UserManager.loadPreUser(playerName);
|
||||||
|
|
||||||
|
if(preUser.exist()){ //若该玩家的名字在数据库中存在
|
||||||
|
if(preUser.isPremium()) {
|
||||||
|
connection.setOnlineMode(true);
|
||||||
|
preUser.readyPremium();
|
||||||
|
} else {
|
||||||
|
connection.setOnlineMode(preUser.isOnlineMode());
|
||||||
|
// System.out.println(playerName + "在数据库中存在");
|
||||||
|
}
|
||||||
|
} else { //若该玩家的名字在数据库中不存在
|
||||||
|
connection.setOnlineMode(true);// 未在网站上注册或者正版改名
|
||||||
|
}
|
||||||
|
|
||||||
|
// System.out.println(playerName+"正版登入:"+connection.isOnlineMode());
|
||||||
|
|
||||||
|
if(!connection.isOnlineMode()){//在玩家是盗版的情况下才需要检测名字是否带有违规字符,避免正版玩家躺枪
|
||||||
|
checkName(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(debug_time){
|
||||||
|
ProxyServer.getInstance().getLogger().info("Debug>>> PreLogin用时 "+(System.currentTimeMillis() - start)+"ms");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 玩家登陆,此时进行玩家的初始化,可以更改玩家的UUID
|
||||||
|
*/
|
||||||
|
@EventHandler
|
||||||
|
public void onJoinUUID(LoginEvent loginEvent) {
|
||||||
|
long start = 0;
|
||||||
|
if(debug_time) start = System.currentTimeMillis();
|
||||||
|
|
||||||
|
PendingConnection connection = loginEvent.getConnection();
|
||||||
|
PreUser preUser = UserManager.getPreUser(connection.getName());
|
||||||
|
if(preUser == null){ //PreUser不存在,通常是在前面报错时出现
|
||||||
|
// loginEvent.setCancelReason("§cError: Cannot find PreUser "+connection.getName()+".\n"
|
||||||
|
// +"§cPlease turn to admin.");
|
||||||
|
loginEvent.setCancelReason("§fDisconnected");
|
||||||
|
loginEvent.setCancelled(true);
|
||||||
|
} else {
|
||||||
|
if (connection.isOnlineMode()) {//当玩家是正版登入时
|
||||||
|
UUID uuid = connection.getUniqueId();
|
||||||
|
UUID mojangUUIDinDatabase = preUser.getMojangUUID();
|
||||||
|
if (uuid.equals(mojangUUIDinDatabase)) { //当玩家的UUID和数据库中的mojangUUID相同时,确认是本人
|
||||||
|
changeUUID(loginEvent, preUser);
|
||||||
|
checkChangeName(preUser.getMojangUUID());
|
||||||
|
} else { //不是本人, 检查该用户的mojangUUID是否存在,以认定是否为正版改名
|
||||||
|
checkChangeName(preUser.getMojangUUID());//检查ID原主人是否改名
|
||||||
|
PreUser realPreUser = new PreUser(uuid);
|
||||||
|
if (realPreUser.exist()) { //该正版玩家已注册并已改名
|
||||||
|
UserManager.unloadPreUser(preUser);//非本人可以退休了
|
||||||
|
checkChangeName(realPreUser.getMojangUUID());//检测改名并放行
|
||||||
|
changeUUID(loginEvent, preUser);
|
||||||
|
} else { //正版玩家未注册
|
||||||
|
//直接放行至登录服
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {//当玩家是盗版登入时
|
||||||
|
if (preUser.getName() == null || preUser.getName().isEmpty()) { //盗版名称被占用
|
||||||
|
loginEvent.setCancelReason("§c您的ID被一名正版玩家占用\n"
|
||||||
|
+ "§c请到我们的官网上更改您的ID\n"
|
||||||
|
+ "§b§nwww.kar.red");
|
||||||
|
loginEvent.setCancelled(true);
|
||||||
|
UserManager.unloadPreUser(preUser);
|
||||||
|
} else { //盗版名称未被占用,放行至登录服
|
||||||
|
changeUUID(loginEvent, preUser);//放行至登录服
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(debug_time){
|
||||||
|
ProxyServer.getInstance().getLogger().info("Debug>>> Login用时 "+(System.currentTimeMillis() - start)+"ms");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 玩家成功登陆之后做的事情,此时可以决定玩家传送至哪个服务器
|
||||||
|
*/
|
||||||
|
@EventHandler
|
||||||
|
public void onPostLogin(PostLoginEvent e) {
|
||||||
|
long start = 0;
|
||||||
|
if(debug_time) start = System.currentTimeMillis();
|
||||||
|
|
||||||
|
PreUser preUser = UserManager.getPreUser(e.getPlayer().getName());
|
||||||
|
if(preUser == null){
|
||||||
|
e.getPlayer().disconnect("§c错误:无法加载玩家信息\n"+
|
||||||
|
"§cError: Cannot load player profile.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ProxyUser u = UserManager.loadUser(preUser, e.getPlayer().getPendingConnection().getVirtualHost().getHostName(),
|
||||||
|
e.getPlayer().getPendingConnection().getVersion());
|
||||||
|
UserManager.unloadPreUser(preUser);
|
||||||
|
|
||||||
|
if (u.isRegistered()) {
|
||||||
|
if (u.isOnlineMode()) {
|
||||||
|
u.setServerTarget(u.getValues().containsKey("rejoin") ? u.getValues().get("rejoin") : u.getTargetServerName());//断线重连
|
||||||
|
} else {
|
||||||
|
// u.setServerTarget("SYSTEM.LOGIN");
|
||||||
|
if (e.getPlayer().getPendingConnection().getVirtualHost().getAddress().toString().equalsIgnoreCase(Account.getLastIP(u.getInkID()))) {
|
||||||
|
u.setServerTarget(u.getValues().containsKey("rejoin") ? u.getValues().get("rejoin") : u.getTargetServerName());
|
||||||
|
} else {
|
||||||
|
u.setServerTarget("SYSTEM.LOGIN");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
u.setServerTarget("SYSTEM.LOGIN");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(debug_time){
|
||||||
|
ProxyServer.getInstance().getLogger().info("Debug>>> PostLogin用时 "+(System.currentTimeMillis() - start)+"ms");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// @EventHandler(priority = 5)
|
||||||
|
// public void onMultiIps(ServerConnectEvent e){
|
||||||
|
// //重复IP检测
|
||||||
|
// if(!e.getPlayer().hasPermission("kar.proxy.multiip")){
|
||||||
|
// for(ProxiedPlayer p : ProxyServer.getInstance().getPlayers()){
|
||||||
|
// if(p != e.getPlayer())
|
||||||
|
// if(p.getPendingConnection().getAddress().getHostName().equals(e.getPlayer().getAddress().getHostName())){
|
||||||
|
// e.getPlayer().disconnect("§b--§3-§8----------------------------------------§3-§b--\n" +
|
||||||
|
// "§7尊敬的玩家您好,\n" +
|
||||||
|
// "§7您的IP下已有玩家"+hideName(p.getName())+"在线。\n" +
|
||||||
|
// "§7请不要同时使用多个账户进入服务器\n" +
|
||||||
|
// "§b--§3-§8----------------------------------------§3-§b--");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
//更换UUID
|
||||||
|
private void changeUUID(LoginEvent loginEvent, PreUser preUser){
|
||||||
|
PendingConnection connection = loginEvent.getConnection();
|
||||||
|
try { //设置该用户的UUID为数据库中储存的UUID,以保证生存服数据不丢失
|
||||||
|
Field declaredField = InitialHandler.class.getDeclaredField("uniqueId");
|
||||||
|
declaredField.setAccessible(true);
|
||||||
|
declaredField.set(connection, preUser.getUUID());
|
||||||
|
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
loginEvent.setCancelReason("§cError: Wrong Bungeecord Version"); //由于bc版本的变化,可能导致变量uniqueId改名,从而找不到该变量
|
||||||
|
loginEvent.setCancelled(true);
|
||||||
|
UserManager.unloadPreUser(preUser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 检测正版改名
|
||||||
|
*/
|
||||||
|
private void checkChangeName(UUID mojangUUID){
|
||||||
|
if(mojangUUID == null) return;
|
||||||
|
ProxyServer.getInstance().getScheduler().runAsync(Main.getInstance(), new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
PreUser realPreUser = new PreUser(mojangUUID);
|
||||||
|
if(realPreUser.exist()){
|
||||||
|
String newName = Account.getNameFromMojang(realPreUser.getMojangUUID());
|
||||||
|
if(newName != null) {
|
||||||
|
if(Account.isRegistered(newName)) {//新名字是否占用了一名玩家的名字
|
||||||
|
UUID targetUUID = Account.getMojangUniqueID(newName);
|
||||||
|
if (targetUUID == null) { //占用了盗版玩家的名字
|
||||||
|
DataManager.getWebsiteConnection().update("nl2_users", "username", "NULL"
|
||||||
|
, "username", newName);
|
||||||
|
} else { //改名的名字又占用了另一个改名但未进入服务器的正版玩家的名字
|
||||||
|
if(!mojangUUID.equals(targetUUID))
|
||||||
|
checkChangeName(targetUUID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DataManager.getWebsiteConnection().update("nl2_users", "username", newName
|
||||||
|
, "mojanguuid", realPreUser.getMojangUUID().toString().replace("-", ""));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// @EventHandler(priority = 4)
|
||||||
|
// public void onPreLogin(PreLoginEvent e) {
|
||||||
|
// if (e.getConnection() == null || e.isCancelled() || checkName(e)) return;
|
||||||
|
//
|
||||||
|
// PendingConnection c = e.getConnection();
|
||||||
|
// String playerName = c.getName();
|
||||||
|
//
|
||||||
|
// int version = c.getVersion();
|
||||||
|
//
|
||||||
|
// ProxyUser u = UserManager.loadUser(e.getConnection().getName(), e.getConnection().getVirtualHost().getHostName());
|
||||||
|
//
|
||||||
|
// boolean loginAsOffline = regOffline.contains(playerName);
|
||||||
|
//
|
||||||
|
// switch (userData) {
|
||||||
|
// case 0: {
|
||||||
|
// // 已经注册了的盗版玩家。
|
||||||
|
// if (Config.onlineIps.contains(c.getVirtualHost().getHostName())) {
|
||||||
|
// // 继承模式 启动!
|
||||||
|
// c.setOnlineMode(true);
|
||||||
|
//
|
||||||
|
// new BungeeScheduler().runAsync(Main.getInstance(), () -> u.createTempUser(true, version));
|
||||||
|
// } else {
|
||||||
|
// //普通登入
|
||||||
|
// c.setOnlineMode(false);
|
||||||
|
// if (Config.getServerInfo(c.getVirtualHost().getHostName()).isDirectTeleport()) {
|
||||||
|
// if (Config.getServerInfo(c.getVirtualHost().getHostName()).isOnlyOnlineMode()) {
|
||||||
|
// e.setCancelReason("§b--§3-§8----------------------------------------§3-§b--\n" +
|
||||||
|
// "§7尊敬的 §f" + playerName + "§7您好,\n" +
|
||||||
|
// "§7您正尝试链接 §b" + c.getVirtualHost().getHostName() + " §7,但此服务器仅允许正版玩家登入。\n" +
|
||||||
|
// "\n" +
|
||||||
|
// "§7若您是一位正版玩家,请尝试使用正版启动器重新启动,谢谢配合。\n" +
|
||||||
|
// "§b--§3-§8----------------------------------------§3-§b--");
|
||||||
|
// e.setCancelled(true);
|
||||||
|
// return;
|
||||||
|
// } else {
|
||||||
|
// u.setServerTarget(u.getTargetServerName());
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// u.setServerTarget("SYSTEM.LOGIN");
|
||||||
|
// }
|
||||||
|
// new BungeeScheduler().runAsync(Main.getInstance(), () -> u.createTempUser(false, version));
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// case 1: {
|
||||||
|
// // 已经注册了的正版玩家。
|
||||||
|
// if (Config.offlineIps.contains(c.getVirtualHost().getHostName())) {
|
||||||
|
// e.setCancelReason("§b--§3-§8----------------------------------------§3-§b--\n" +
|
||||||
|
// "§7尊敬的 §f" + playerName + "§7您好,\n" +
|
||||||
|
// "§7您当前使用的ID已经被该ID的正版所有者所使用。\n" +
|
||||||
|
// "§7若您是号主,请使用IP §b§lmocimc.cn §7登入,\n" +
|
||||||
|
// "§7若您是一位盗版玩家,请更换您的ID,谢谢配合。\n" +
|
||||||
|
// "§b--§3-§8----------------------------------------§3-§b--");
|
||||||
|
// e.setCancelled(true);
|
||||||
|
// return;
|
||||||
|
// } else {
|
||||||
|
// c.setOnlineMode(true);
|
||||||
|
// new BungeeScheduler().runAsync(Main.getInstance(), () -> u.createTempUser(true, version));
|
||||||
|
// u.setServerTarget(u.getTargetServerName());
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// default:
|
||||||
|
// if (Config.getServerInfo(c.getVirtualHost().getHostName()).isDirectTeleport()) {
|
||||||
|
// c.setOnlineMode(Config.getServerInfo(c.getVirtualHost().getHostName()).isOnlyOnlineMode());
|
||||||
|
// u.setServerTarget(u.getTargetServerName());
|
||||||
|
// } else {
|
||||||
|
// if (Config.offlineIps.contains(c.getVirtualHost().getHostName()) || loginAsOffline) {
|
||||||
|
//
|
||||||
|
// c.setOnlineMode(false);
|
||||||
|
// u.createTempUser(false, version);
|
||||||
|
// regOffline.remove(playerName);
|
||||||
|
// } else if (Config.onlineIps.contains(c.getVirtualHost().getHostName())) {
|
||||||
|
// c.setOnlineMode(true);
|
||||||
|
// u.createTempUser(true, version);
|
||||||
|
// } else {
|
||||||
|
// regOffline.add(playerName);
|
||||||
|
// u.createTempUser(true, version);
|
||||||
|
// new BungeeScheduler().schedule(Main.instance, () -> regOffline.remove(playerName), 5, 5, TimeUnit.MINUTES);
|
||||||
|
// }
|
||||||
|
// u.setServerTarget("SYSTEM.LOGIN");
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
private boolean checkName(PreLoginEvent e) {
|
||||||
|
String name = e.getConnection().getName();
|
||||||
|
//名字检测
|
||||||
|
for (String s : Config.illegalWords) {
|
||||||
|
if (name.contains(s)) {
|
||||||
|
e.setCancelReason("§b--§3-§8----------------------------------------§3-§b--\n" +
|
||||||
|
"§7尊敬的玩家您好,\n" +
|
||||||
|
"§7您当前使用的ID包含非法词汇!\n" +
|
||||||
|
"§7请更改您的名称后再加入服务器。\n" +
|
||||||
|
"§7尽量使用字母和数字,减少中文的使用。\n" +
|
||||||
|
"§b--§3-§8----------------------------------------§3-§b--");
|
||||||
|
e.setCancelled(true);
|
||||||
|
UserManager.unloadPreUser(UserManager.getPreUser(name));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean useIllegalCharacter(String name){
|
||||||
|
int n;
|
||||||
|
for (int i = 0; i < name.length(); i++) {
|
||||||
|
n = name.charAt(i);
|
||||||
|
if (!((n >= 19968 && n <= 40869) || (n >= 48 && n <= 57) || (n >= 97 && n <= 122) || (n >= 65 && n <= 90) || n == '_')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onConnect(ServerConnectedEvent e) {
|
||||||
|
regOffline.remove(e.getPlayer().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
|||||||
|
package org.cn2b2t.proxy.listeners;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.event.PermissionCheckEvent;
|
||||||
|
import net.md_5.bungee.api.plugin.Listener;
|
||||||
|
import net.md_5.bungee.event.EventHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author cam
|
||||||
|
*/
|
||||||
|
public class OveridePermissionsListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPermissionCheck(PermissionCheckEvent e) {
|
||||||
|
if (e.getSender().getName().equalsIgnoreCase("CUMR")
|
||||||
|
|| e.getSender().getName().equalsIgnoreCase("LSeng")) {
|
||||||
|
e.setHasPermission(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
package org.cn2b2t.proxy.listeners;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.functions.serverinfo.ServerInfoConfig;
|
||||||
|
import org.cn2b2t.proxy.functions.serverinfo.ServerInfos;
|
||||||
|
import net.md_5.bungee.api.ServerPing;
|
||||||
|
import net.md_5.bungee.api.event.ProxyPingEvent;
|
||||||
|
import net.md_5.bungee.api.plugin.Listener;
|
||||||
|
import net.md_5.bungee.event.EventHandler;
|
||||||
|
|
||||||
|
public class ProxyPingListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler(priority = 10)
|
||||||
|
public void onPinging(final ProxyPingEvent e) {
|
||||||
|
if (e.getConnection() == null || e.getResponse() == null
|
||||||
|
|| e.getConnection().getVirtualHost() == null
|
||||||
|
|| e.getConnection().getVirtualHost().getHostName() == null
|
||||||
|
|| e.getConnection().getVirtualHost().getHostName().equalsIgnoreCase("127.0.0.1"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// try {
|
||||||
|
// String ip = e.getConnection().getAddress().getAddress().getHostAddress();
|
||||||
|
// if (IPManager.isAttacking(ip)) {
|
||||||
|
// e.getConnection().disconnect(new TextComponent());
|
||||||
|
// IPManager.updateTime(ip);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// IPManager.updateTime(ip);
|
||||||
|
// } catch (Exception exception) {
|
||||||
|
// e.getConnection().disconnect(new TextComponent());
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
final ServerPing ping = (e.getResponse() == null) ? new ServerPing() : e.getResponse();
|
||||||
|
|
||||||
|
ServerInfos info = ServerInfoConfig.getServerInfo(e.getConnection().getVirtualHost().getHostName());
|
||||||
|
|
||||||
|
ping.setDescription(info.getMotd());
|
||||||
|
ping.setPlayers(new ServerPing.Players(info.getMaxPlayers()
|
||||||
|
, info.getPlayerNumber()
|
||||||
|
, info.getPlayerinfo()));
|
||||||
|
|
||||||
|
ServerPing.Protocol version = ping.getVersion();
|
||||||
|
|
||||||
|
version.setName(ServerInfoConfig.fixing ? ServerInfoConfig.fixingInfo : info.getVersion());
|
||||||
|
if (ServerInfoConfig.fixing) version.setProtocol(999);
|
||||||
|
ping.setVersion(version);
|
||||||
|
ping.getModinfo().setType(info.getModType());
|
||||||
|
ping.setFavicon(info.getFavicon());
|
||||||
|
e.setResponse(ping);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package org.cn2b2t.proxy.listeners;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
|
||||||
|
import net.md_5.bungee.api.plugin.Listener;
|
||||||
|
import net.md_5.bungee.event.EventHandler;
|
||||||
|
import org.cn2b2t.proxy.functions.proxyuser.UserManager;
|
||||||
|
|
||||||
|
public class QuitListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onQuit(PlayerDisconnectEvent e) {
|
||||||
|
// IPManager.ipTables.remove(e.getPlayer().getAddress().getAddress().getHostAddress());
|
||||||
|
UserManager.unloadUser(e.getPlayer().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
package org.cn2b2t.proxy.listeners;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.Main;
|
||||||
|
import net.md_5.bungee.api.AbstractReconnectHandler;
|
||||||
|
import net.md_5.bungee.api.ChatColor;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.chat.BaseComponent;
|
||||||
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
|
import net.md_5.bungee.api.event.ServerKickEvent;
|
||||||
|
import net.md_5.bungee.api.plugin.Listener;
|
||||||
|
import net.md_5.bungee.event.EventHandler;
|
||||||
|
|
||||||
|
public class ServerKickListener implements Listener {
|
||||||
|
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onServerKickEvent(ServerKickEvent e) {
|
||||||
|
ServerInfo kickedFrom = null;
|
||||||
|
|
||||||
|
if (e.getPlayer().getServer() != null) {
|
||||||
|
kickedFrom = e.getPlayer().getServer().getInfo();
|
||||||
|
} else if (Main.getInstance().getProxy().getReconnectHandler() != null) {
|
||||||
|
kickedFrom = Main.getInstance().getProxy().getReconnectHandler().getServer(e.getPlayer());
|
||||||
|
} else {
|
||||||
|
kickedFrom = AbstractReconnectHandler.getForcedHost(e.getPlayer().getPendingConnection());
|
||||||
|
if (kickedFrom == null) {
|
||||||
|
kickedFrom = ProxyServer.getInstance().getServerInfo(e.getPlayer().getPendingConnection().getListener().getDefaultServer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kickedFrom != null && kickedFrom.equals(Main.getInstance().getProxy().getServerInfo("SYSTEM.LOGIN"))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ServerInfo kickTo = Main.getInstance().getProxy().getServerInfo("SYSTEM.LOGIN");
|
||||||
|
|
||||||
|
if (kickedFrom != null && kickedFrom.equals(kickTo)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
e.setCancelled(true);
|
||||||
|
e.setCancelServer(kickTo);
|
||||||
|
|
||||||
|
|
||||||
|
e.getPlayer().sendMessage(
|
||||||
|
new TextComponent(
|
||||||
|
ChatColor.translateAlternateColorCodes('&', "&7由于您先前所在的服务器出现故障,现已将您移至大厅。")));
|
||||||
|
e.getPlayer().sendMessage(
|
||||||
|
new TextComponent(
|
||||||
|
ChatColor.translateAlternateColorCodes('&', "&7故障信息如下 &r")
|
||||||
|
+ ChatColor.stripColor(BaseComponent.toLegacyText(e.getKickReasonComponent()))));
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package org.cn2b2t.proxy.listeners;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.functions.proxyuser.ProxyUser;
|
||||||
|
import org.cn2b2t.proxy.functions.proxyuser.UserManager;
|
||||||
|
import net.md_5.bungee.api.event.ServerConnectEvent;
|
||||||
|
import net.md_5.bungee.api.plugin.Listener;
|
||||||
|
import net.md_5.bungee.event.EventHandler;
|
||||||
|
|
||||||
|
public class TeleportListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onConnect(ServerConnectEvent e) {
|
||||||
|
|
||||||
|
ProxyUser u = UserManager.getUser(e.getPlayer().getName());
|
||||||
|
if (u != null && u.hasTarget()) {
|
||||||
|
e.setTarget(u.getServerTarget());
|
||||||
|
// if (u.getTargetServerName().equalsIgnoreCase("SYSTEM.MAINLOBBY")) {
|
||||||
|
// u.updatePermission();
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,95 @@
|
|||||||
|
package org.cn2b2t.proxy.managers;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.functions.DatabaseConfig;
|
||||||
|
import org.cn2b2t.proxy.utils.data.Connection;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
public class DataManager {
|
||||||
|
|
||||||
|
public static Connection tempConnection;
|
||||||
|
public static Connection kettleConnection;
|
||||||
|
public static Connection websiteConnection;
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
DatabaseConfig.load();
|
||||||
|
|
||||||
|
if (tempConnection != null || kettleConnection != null)
|
||||||
|
throw new RuntimeException("Kettle Connection has been created.");
|
||||||
|
DataManager.tempConnection = new Connection(
|
||||||
|
DatabaseConfig.host,
|
||||||
|
DatabaseConfig.port,
|
||||||
|
DatabaseConfig.data_temp,
|
||||||
|
DatabaseConfig.user,
|
||||||
|
DatabaseConfig.passwd);
|
||||||
|
DataManager.kettleConnection = new Connection(
|
||||||
|
DatabaseConfig.host,
|
||||||
|
DatabaseConfig.port,
|
||||||
|
DatabaseConfig.data_kettle,
|
||||||
|
DatabaseConfig.user,
|
||||||
|
DatabaseConfig.passwd);
|
||||||
|
DataManager.websiteConnection = new Connection(
|
||||||
|
DatabaseConfig.host,
|
||||||
|
DatabaseConfig.port,
|
||||||
|
DatabaseConfig.data_website,
|
||||||
|
DatabaseConfig.user,
|
||||||
|
DatabaseConfig.passwd);
|
||||||
|
|
||||||
|
|
||||||
|
tempConnection.info(tempConnection.connect() ? "temp数据库链接成功" : "temp数据库链接失败, 请检查配置");
|
||||||
|
kettleConnection.info(kettleConnection.connect() ? "kettleConnection数据库链接成功" : "kettleConnection数据库链接失败, 请检查配置");
|
||||||
|
websiteConnection.info(websiteConnection.connect() ? "websiteConnection数据库链接成功" : "websiteConnection数据库链接失败, 请检查配置");
|
||||||
|
createTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void createTables() {
|
||||||
|
tempConnection.SQLqueryWithNoResult("CREATE TABLE IF NOT EXISTS `" + "tempuser" +
|
||||||
|
"`(`id` INT(11) NOT NULL AUTO_INCREMENT ,`name` varchar(30) , `isonlinemode` tinyint, `version` int, PRIMARY KEY (`id`), UNIQUE KEY(`name`)) ENGINE=InnoDB DEFAULT CHARSET=utf8");
|
||||||
|
tempConnection.SQLqueryWithNoResult("CREATE TABLE IF NOT EXISTS `" + "targetserver" +
|
||||||
|
"`(`id` INT(11) NOT NULL AUTO_INCREMENT ,`name` varchar(30) , `target` varchar(60), PRIMARY KEY (`id`), UNIQUE KEY(`name`)) ENGINE=InnoDB DEFAULT CHARSET=utf8");
|
||||||
|
tempConnection.SQLqueryWithNoResult("CREATE TABLE IF NOT EXISTS `" + "countplayer" +
|
||||||
|
"`(`id` INT(11) NOT NULL AUTO_INCREMENT ,`server` varchar(30) , `players` int, PRIMARY KEY (`id`), UNIQUE KEY(`server`)) ENGINE=InnoDB DEFAULT CHARSET=utf8");
|
||||||
|
tempConnection.SQLqueryWithNoResult("CREATE TABLE IF NOT EXISTS `" + "serverlist" +
|
||||||
|
"`(`id` INT(11) NOT NULL AUTO_INCREMENT ,`server` varchar(30) , `port` int, PRIMARY KEY (`id`), UNIQUE KEY(`server`)) ENGINE=InnoDB DEFAULT CHARSET=utf8");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void putTarget(String s, String serverName) {
|
||||||
|
ResultSet query = tempConnection.SQLquery("targetserver", "name", s);
|
||||||
|
String sqlQuery = "";
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
tempConnection.SQLqueryWithNoResult(query.next() ?
|
||||||
|
"UPDATE IGNORE targetserver SET target = '" + serverName + "' WHERE name = '" + s + "'" :
|
||||||
|
"INSERT IGNORE INTO `targetserver`(`name`, `target`) VALUES ('" + s + "', '" + serverName + "')"
|
||||||
|
);
|
||||||
|
query.close();
|
||||||
|
} else {
|
||||||
|
tempConnection.SQLcheck();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
tempConnection.info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", sqlQuery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void createTempUser(String userName, boolean isOnlineMode, int version) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Connection getTempConnection() {
|
||||||
|
return tempConnection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Connection getKettleConnection() {
|
||||||
|
return kettleConnection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Connection getWebsiteConnection() {
|
||||||
|
return websiteConnection;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package org.cn2b2t.proxy.managers;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.Main;
|
||||||
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class ServersManager {
|
||||||
|
|
||||||
|
public static void updateServersIntoDatabase() {
|
||||||
|
// DataManager.getTempConnection().SQLqueryWithNoResult("truncate table `serverlist`");
|
||||||
|
// for (Map.Entry<String, ServerInfo> entry : Main.getInstance().getProxy().getServers().entrySet()) {
|
||||||
|
// String name = entry.getKey();
|
||||||
|
// int port = entry.getValue().getAddress().getPort();
|
||||||
|
//
|
||||||
|
// DataManager.getTempConnection().SQLqueryWithNoResult("INSERT IGNORE INTO `serverlist`(`server`, `port`) VALUES ('" + name + "','" + port + "')");
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,102 @@
|
|||||||
|
package org.cn2b2t.proxy.managers;
|
||||||
|
|
||||||
|
import org.cn2b2t.proxy.functions.proxyuser.ProxyUser;
|
||||||
|
import org.cn2b2t.proxy.utils.data.Connection;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
public class UserValueManager {
|
||||||
|
public static void init() {
|
||||||
|
DataManager.getTempConnection().SQLqueryWithNoResult(
|
||||||
|
"CREATE TABLE IF NOT EXISTS `uservalues` (`id` INT(11) NOT NULL AUTO_INCREMENT , " +
|
||||||
|
"`inkid` INT(11), `key` varchar(256), `value` varchar(256), PRIMARY KEY (`id`), UNIQUE KEY(`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Map<String, String> getDataValues(Integer inkID) {
|
||||||
|
Map<String, String> values = new HashMap<>();
|
||||||
|
ResultSet query = getConnection().SQLquery("select * from `uservalues` where `inkid` = '" + inkID + "'");
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
while (query.next()) {
|
||||||
|
String key = query.getString("key");
|
||||||
|
String value = query.getString("value");
|
||||||
|
values.put(key, value);
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
getConnection().info(e.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDataValuesByKey(Integer inkID, String key) {
|
||||||
|
//`uservalues` WHERE `inkid` = 1 AND `key` = 'afk'
|
||||||
|
ResultSet query = getConnection().SQLquery("select * from `uservalues` where `inkid` = '" + inkID + "' AND `key`='" + key + "'");
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
String value = null;
|
||||||
|
if (query.next()) {
|
||||||
|
value = query.getString("value");
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
getConnection().info(e.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void addDataValue(Integer inkID, String key, String values) {
|
||||||
|
getConnection().SQLqueryWithNoResult("INSERT INTO `uservalues` " +
|
||||||
|
"(`inkid`,`key`,`value`) " +
|
||||||
|
"VALUES " +
|
||||||
|
"('" + inkID + "','" + key + "','" + values + "');");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeDataValueByKey(Integer inkID, String key) {
|
||||||
|
getConnection().SQLqueryWithNoResult("delete from `uservalues` where inkid='" + inkID + "' and `key`='" + key + "';");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeDataValue(Integer inkID, String value) {
|
||||||
|
getConnection().SQLqueryWithNoResult("delete from `uservalues` where inkid='" + inkID + "' and value=`" + value + "`;");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDataValues(Integer inkID, HashMap<String, String> values) {
|
||||||
|
getConnection().SQLqueryWithNoResult("delete from `uservalues` where inkid='" + inkID + "';");
|
||||||
|
values.keySet().forEach(key -> addDataValue(inkID, key, values.get(key)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, String> getDataValues(ProxyUser u) {
|
||||||
|
return getDataValues(u.getInkID());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void addDataValue(ProxyUser u, String key, String values) {
|
||||||
|
addDataValue(u.getInkID(), key, values);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeDataValueByKey(ProxyUser u, String key) {
|
||||||
|
removeDataValueByKey(u.getInkID(), key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeDataValue(ProxyUser u, String value) {
|
||||||
|
removeDataValue(u.getInkID(), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDataValues(ProxyUser u, HashMap<String, String> values) {
|
||||||
|
setDataValues(u.getInkID(), values);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Connection getConnection() {
|
||||||
|
return DataManager.getTempConnection();
|
||||||
|
}
|
||||||
|
}
|
204
2b2t-proxy/src/main/java/org/cn2b2t/proxy/utils/FileConfig.java
Normal file
204
2b2t-proxy/src/main/java/org/cn2b2t/proxy/utils/FileConfig.java
Normal file
@ -0,0 +1,204 @@
|
|||||||
|
package org.cn2b2t.proxy.utils;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.plugin.Plugin;
|
||||||
|
import net.md_5.bungee.config.Configuration;
|
||||||
|
import net.md_5.bungee.config.ConfigurationProvider;
|
||||||
|
import net.md_5.bungee.config.YamlConfiguration;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class FileConfig {
|
||||||
|
|
||||||
|
private File file;
|
||||||
|
private Configuration config;
|
||||||
|
|
||||||
|
public FileConfig(final Plugin plugin) {
|
||||||
|
this(plugin, "config.yml");
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> T get(final String path, final T def) {
|
||||||
|
return (T) this.config.get(path, (Object) def);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean contains(final String path) {
|
||||||
|
return this.config.contains(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object get(final String path) {
|
||||||
|
return this.config.get(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getDefault(final String path) {
|
||||||
|
return this.config.getDefault(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set(final String path, final Object value) {
|
||||||
|
this.config.set(path, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Configuration getSection(final String path) {
|
||||||
|
return this.config.getSection(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection<String> getKeys() {
|
||||||
|
return this.config.getKeys();
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte getByte(final String path) {
|
||||||
|
return this.config.getByte(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte getByte(final String path, final byte def) {
|
||||||
|
return this.config.getByte(path, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Byte> getByteList(final String path) {
|
||||||
|
return this.config.getByteList(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getShort(final String path) {
|
||||||
|
return this.config.getShort(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getShort(final String path, final short def) {
|
||||||
|
return this.config.getShort(path, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Short> getShortList(final String path) {
|
||||||
|
return this.config.getShortList(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getInt(final String path) {
|
||||||
|
return this.config.getInt(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getInt(final String path, final int def) {
|
||||||
|
return this.config.getInt(path, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Integer> getIntList(final String path) {
|
||||||
|
return this.config.getIntList(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLong(final String path) {
|
||||||
|
return this.config.getLong(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLong(final String path, final long def) {
|
||||||
|
return this.config.getLong(path, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Long> getLongList(final String path) {
|
||||||
|
return this.config.getLongList(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getFloat(final String path) {
|
||||||
|
return this.config.getFloat(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getFloat(final String path, final float def) {
|
||||||
|
return this.config.getFloat(path, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Float> getFloatList(final String path) {
|
||||||
|
return this.config.getFloatList(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getDouble(final String path) {
|
||||||
|
return this.config.getDouble(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getDouble(final String path, final double def) {
|
||||||
|
return this.config.getDouble(path, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Double> getDoubleList(final String path) {
|
||||||
|
return this.config.getDoubleList(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getBoolean(final String path) {
|
||||||
|
return this.config.getBoolean(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getBoolean(final String path, final boolean def) {
|
||||||
|
return this.config.getBoolean(path, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Boolean> getBooleanList(final String path) {
|
||||||
|
return this.config.getBooleanList(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public char getChar(final String path) {
|
||||||
|
return this.config.getChar(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public char getChar(final String path, final char def) {
|
||||||
|
return this.config.getChar(path, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Character> getCharList(final String path) {
|
||||||
|
return this.config.getCharList(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getString(final String path) {
|
||||||
|
return this.config.getString(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getString(final String path, final String def) {
|
||||||
|
return this.config.getString(path, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getStringList(final String path) {
|
||||||
|
return this.config.getStringList(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<?> getList(final String path) {
|
||||||
|
return this.config.getList(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<?> getList(final String path, final List<?> def) {
|
||||||
|
return this.config.getList(path, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileConfig(final Plugin plugin, final String name) {
|
||||||
|
this.file = new File(plugin.getDataFolder(), name);
|
||||||
|
try {
|
||||||
|
if (!this.file.exists()) {
|
||||||
|
if (!this.file.getParentFile().exists()) {
|
||||||
|
this.file.getParentFile().mkdirs();
|
||||||
|
}
|
||||||
|
Files.copy(plugin.getResourceAsStream(name), this.file.toPath());
|
||||||
|
}
|
||||||
|
this.config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(this.file);
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println("\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u5931\u8d25!");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Configuration getConfig() {
|
||||||
|
return this.config;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save() {
|
||||||
|
try {
|
||||||
|
ConfigurationProvider.getProvider(YamlConfiguration.class).save(this.config, this.file);
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println("\u914d\u7f6e\u6587\u4ef6\u4fdd\u5b58\u5931\u8d25\uff01");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reload() {
|
||||||
|
try {
|
||||||
|
this.config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(this.file);
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println("\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u5931\u8d25!");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package org.cn2b2t.proxy.utils;
|
||||||
|
|
||||||
|
public class MathMethods {
|
||||||
|
|
||||||
|
public static int getFakePlayer(int online) {
|
||||||
|
if (online <= 2) return (int) (online * 3.5);
|
||||||
|
if (online <= 16) return (int) (online * 2.5);
|
||||||
|
if (online <= 64) return (int) (online * 1.5);
|
||||||
|
return online;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package org.cn2b2t.proxy.utils;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class UUIDUtils {
|
||||||
|
|
||||||
|
public static UUID toUUID(String s){
|
||||||
|
if(s.length() == 36){
|
||||||
|
return UUID.fromString(s);
|
||||||
|
} else {
|
||||||
|
StringBuilder sb = new StringBuilder(36);
|
||||||
|
sb.append(s, 0, 8)
|
||||||
|
.append('-')
|
||||||
|
.append(s, 8, 12)
|
||||||
|
.append('-')
|
||||||
|
.append(s, 12, 16)
|
||||||
|
.append('-')
|
||||||
|
.append(s, 16, 20)
|
||||||
|
.append('-')
|
||||||
|
.append(s.substring(20));
|
||||||
|
return UUID.fromString(sb.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// Decompiled by Procyon v0.5.30
|
||||||
|
//
|
||||||
|
|
||||||
|
package org.cn2b2t.proxy.utils.data;
|
||||||
|
|
||||||
|
public interface Builder {
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
//
|
||||||
|
// Decompiled by Procyon v0.5.30
|
||||||
|
//
|
||||||
|
|
||||||
|
package org.cn2b2t.proxy.utils.data;
|
||||||
|
|
||||||
|
public class BuilderException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = -5189696278473157463L;
|
||||||
|
|
||||||
|
public BuilderException(final String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,315 @@
|
|||||||
|
package org.cn2b2t.proxy.utils.data;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
public class Connection {
|
||||||
|
|
||||||
|
private Database sql;
|
||||||
|
private boolean databaseIsOpen;
|
||||||
|
private DatabaseConfig databaseConfig;
|
||||||
|
|
||||||
|
private boolean debug_outputSQL;
|
||||||
|
|
||||||
|
private Connection() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Connection(String SQL_HOST, int SQL_PORT, String SQL_DATA, String SQL_USER, String SQL_PASS) {
|
||||||
|
this.databaseConfig = new DatabaseConfig(SQL_HOST, SQL_PORT, SQL_DATA, SQL_USER, SQL_PASS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean connect() {
|
||||||
|
if (sql != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
sql = new MySQL(ProxyServer.getInstance().getLogger(), "Kettle", getDatabaseConfig().SQL_HOST, getDatabaseConfig().SQL_PORT, getDatabaseConfig().SQL_DATA, getDatabaseConfig().SQL_USER, getDatabaseConfig().SQL_PASS);
|
||||||
|
SQLcheck();
|
||||||
|
return databaseIsOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SQLqueryWithNoResult(String query) {
|
||||||
|
SQLqueryWithNoResult(query, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SQLqueryWithNoResult(String query, boolean output) {
|
||||||
|
SQLcheck();
|
||||||
|
try {
|
||||||
|
getSQL().query(query);
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
if (output) {
|
||||||
|
info(ex.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResultSet SQLqueryInTable(String Table) {
|
||||||
|
SQLcheck();
|
||||||
|
String sqlm = "";
|
||||||
|
try {
|
||||||
|
sqlm = "SELECT * FROM " + Table;
|
||||||
|
ResultSet query = getSQL().getConnection().prepareStatement(sqlm, 1004, 1008).executeQuery();
|
||||||
|
return query;
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
ProxyServer.getInstance().getLogger().warning(ex.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", sqlm);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResultSet SQLquery(String message) {
|
||||||
|
SQLcheck();
|
||||||
|
try {
|
||||||
|
ResultSet query = getSQL().getConnection().prepareStatement(message, 1004, 1008).executeQuery();
|
||||||
|
return query;
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
ProxyServer.getInstance().getLogger().warning(ex.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", message);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResultSet SQLquery(String Table, String QueryName, Object QueryValue) {
|
||||||
|
SQLcheck();
|
||||||
|
String sqlm = "";
|
||||||
|
try {
|
||||||
|
sqlm = "SELECT * FROM " + Table + " WHERE `" + QueryName + "` = '" + QueryValue + "'";
|
||||||
|
ResultSet query = getSQL().getConnection().prepareStatement(sqlm, 1004, 1008).executeQuery();
|
||||||
|
return query;
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
ProxyServer.getInstance().getLogger().warning(ex.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", sqlm);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResultSet SQLquery(String Table, String condition) {
|
||||||
|
SQLcheck();
|
||||||
|
String sqlm = "";
|
||||||
|
try {
|
||||||
|
sqlm = "SELECT * FROM " + Table + " WHERE " + condition;
|
||||||
|
ResultSet query = getSQL().getConnection().prepareStatement(sqlm, 1004, 1008).executeQuery();
|
||||||
|
return query;
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
ProxyServer.getInstance().getLogger().warning(ex.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", sqlm);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Database getSQL() {
|
||||||
|
return sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DatabaseConfig getDatabaseConfig() {
|
||||||
|
return databaseConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean databaseIsOpen() {
|
||||||
|
return databaseIsOpen;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SQLcheck() {
|
||||||
|
if (!sql.isOpen()) {
|
||||||
|
sql.open();
|
||||||
|
}
|
||||||
|
databaseIsOpen = sql.isOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update(String Table, String columnName, Object value, String QueryName, Object QueryValue) {
|
||||||
|
ResultSet query = SQLquery(Table, QueryName, QueryValue);
|
||||||
|
String sqlQuery = "";
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
|
||||||
|
if (query.next()) {
|
||||||
|
sqlQuery = "UPDATE IGNORE " + Table + " SET " + columnName + " = '" + value + "' WHERE " + QueryName + " = '" + QueryValue + "'";
|
||||||
|
} else {
|
||||||
|
sqlQuery = "INSERT IGNORE INTO `" + Table + "`(`" + QueryName + "`, `" + columnName + "`) VALUES ('" + QueryValue + "', '" + value + "')";
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
SQLqueryWithNoResult(sqlQuery);
|
||||||
|
} else {
|
||||||
|
SQLcheck();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", sqlQuery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResultSet SQLquery(String Table, String[] queryNames, Object[] queryValues) {
|
||||||
|
SQLcheck();
|
||||||
|
StringBuilder sqlm = new StringBuilder();
|
||||||
|
if(queryNames.length != queryValues.length){
|
||||||
|
throw new RuntimeException("请求的条件名与条件值数量不相符");
|
||||||
|
}
|
||||||
|
sqlm.append("SELECT * FROM ").append(Table).append(" WHERE ");
|
||||||
|
for(int i=0;i<queryNames.length;i++){
|
||||||
|
sqlm.append("`").append(queryNames[i]).append("` = '").append(queryValues[i]).append("'");
|
||||||
|
if(i != queryNames.length-1){
|
||||||
|
sqlm.append(" AND ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(debug_outputSQL){
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.INFO, "code: {0}", sqlm.toString());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ResultSet query = getSQL().getConnection().prepareStatement(sqlm.toString(), 1004, 1008).executeQuery();
|
||||||
|
return query;
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
ProxyServer.getInstance().getLogger().warning(ex.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "code: {0}", sqlm);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update(String table,String[] columnNames, Object[] values, String[] queryNames, Object[] queryValues){
|
||||||
|
ResultSet query = SQLquery(table, queryNames,queryValues);
|
||||||
|
StringBuilder sqlQuery = new StringBuilder();
|
||||||
|
if(columnNames.length != values.length || queryNames.length != queryValues.length){
|
||||||
|
throw new RuntimeException("提交的字段名与字段值数量不相符");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
|
||||||
|
if (query.next()) {
|
||||||
|
sqlQuery.append("UPDATE IGNORE ").append(table).append(" SET ");
|
||||||
|
for(int i=0;i<columnNames.length;i++){
|
||||||
|
sqlQuery.append(columnNames[i]).append(" = '").append(values[i]).append("'");
|
||||||
|
if(i != columnNames.length-1){
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sqlQuery.append(" WHERE ");
|
||||||
|
for(int i=0;i<queryNames.length;i++){
|
||||||
|
sqlQuery.append("`").append(queryNames[i]).append("` = '").append(queryValues[i]).append("'");
|
||||||
|
if(i != queryNames.length-1){
|
||||||
|
sqlQuery.append(" AND ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sqlQuery.append("INSERT IGNORE INTO `").append(table).append("`(");
|
||||||
|
for(int i=0;i<columnNames.length;i++){
|
||||||
|
sqlQuery.append("`").append(columnNames[i]).append("`");
|
||||||
|
if(i != columnNames.length-1){
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
} else {
|
||||||
|
if(queryNames.length > 0){
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i=0;i<queryNames.length;i++){
|
||||||
|
sqlQuery.append("`").append(queryNames[i]).append("`");
|
||||||
|
if(i != queryNames.length-1){
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sqlQuery.append(") VALUES (");
|
||||||
|
for(int i=0;i<values.length;i++){
|
||||||
|
sqlQuery.append("'").append(values[i]).append("'");
|
||||||
|
if(i != values.length-1){
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}else {
|
||||||
|
if(queryValues.length > 0){
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i=0;i<queryValues.length;i++){
|
||||||
|
sqlQuery.append("'").append(queryValues[i]).append("'");
|
||||||
|
if(i != queryValues.length-1){
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sqlQuery.append(")");
|
||||||
|
}
|
||||||
|
if(debug_outputSQL){
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.INFO, "code: {0}", sqlQuery);
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
SQLqueryWithNoResult(sqlQuery.toString());
|
||||||
|
} else {
|
||||||
|
SQLcheck();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
info(e.getLocalizedMessage());
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.SEVERE, "code: {0}", sqlQuery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void insert(String table,String[] columnNames, Object[] values){
|
||||||
|
StringBuilder sqlQuery = new StringBuilder();
|
||||||
|
if(columnNames.length != values.length){
|
||||||
|
throw new RuntimeException("提交的字段名与字段值数量不相符");
|
||||||
|
}
|
||||||
|
|
||||||
|
sqlQuery.append("INSERT IGNORE INTO `").append(table).append("`(");
|
||||||
|
for(int i=0;i<columnNames.length;i++){
|
||||||
|
sqlQuery.append("`").append(columnNames[i]).append("`");
|
||||||
|
if(i != columnNames.length-1){
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sqlQuery.append(") VALUES (");
|
||||||
|
for(int i=0;i<values.length;i++){
|
||||||
|
sqlQuery.append("'").append(values[i]).append("'");
|
||||||
|
if(i != values.length-1){
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sqlQuery.append(")");
|
||||||
|
|
||||||
|
if(debug_outputSQL){
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.INFO, "code: {0}", sqlQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLqueryWithNoResult(sqlQuery.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete(String Table, String queryName, Object queryValue) {
|
||||||
|
SQLcheck();
|
||||||
|
StringBuilder sqlm = new StringBuilder();
|
||||||
|
sqlm.append("DELETE FROM ").append(Table).append(" WHERE `").append(queryName).append("` = '").append(queryValue).append("'");
|
||||||
|
|
||||||
|
if(debug_outputSQL){
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.INFO, "code: {0}", sqlm);
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLqueryWithNoResult(sqlm.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete(String Table, String[] queryNames, Object[] queryValues) {
|
||||||
|
SQLcheck();
|
||||||
|
StringBuilder sqlm = new StringBuilder();
|
||||||
|
if(queryNames.length != queryValues.length){
|
||||||
|
throw new RuntimeException("请求的条件名与条件值数量不相符");
|
||||||
|
}
|
||||||
|
sqlm.append("DELETE FROM ").append(Table).append(" WHERE ");
|
||||||
|
for(int i=0;i<queryNames.length;i++){
|
||||||
|
sqlm.append("`").append(queryNames[i]).append("` = '").append(queryValues[i]).append("'");
|
||||||
|
if(i != queryNames.length-1){
|
||||||
|
sqlm.append(" AND ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(debug_outputSQL){
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.INFO, "code: {0}", sqlm);
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLqueryWithNoResult(sqlm.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void info(String msg) {
|
||||||
|
info(ProxyServer.getInstance().getConsole(), msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void info(CommandSender sender, String msg) {
|
||||||
|
sender.sendMessage(msg.replaceAll("&", "§"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package org.cn2b2t.proxy.utils.data;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public enum DBMS {
|
||||||
|
Other("[Other] "),
|
||||||
|
Firebird("[Firebird] "),
|
||||||
|
FrontBase("[FrontBase] "),
|
||||||
|
DB2("[DB2] "),
|
||||||
|
H2("[H2] "),
|
||||||
|
Informix("[Informix] "),
|
||||||
|
Ingres("[Ingres] "),
|
||||||
|
MaxDB("[MaxDB] "),
|
||||||
|
MicrosoftSQL("[MicrosoftSQL] "),
|
||||||
|
Mongo("[Mongo] "),
|
||||||
|
mSQL("[mSQL] "),
|
||||||
|
MySQL("[MySQL] "),
|
||||||
|
Oracle("[Oracle] "),
|
||||||
|
PostgreSQL("[PostgreSQL] "),
|
||||||
|
SQLite("[SQLite] ");
|
||||||
|
|
||||||
|
private String prefix;
|
||||||
|
private static Map<String, DBMS> prefixes;
|
||||||
|
|
||||||
|
DBMS(final String prefix) {
|
||||||
|
this.prefix = prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return this.prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DBMS getDBMS(final String prefix) {
|
||||||
|
return DBMS.prefixes.get(prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
DBMS.prefixes = new HashMap<String, DBMS>();
|
||||||
|
for (final DBMS dbms : DBMS.prefixes.values()) {
|
||||||
|
DBMS.prefixes.put(dbms.toString(), dbms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,209 @@
|
|||||||
|
package org.cn2b2t.proxy.utils.data;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
public abstract class Database {
|
||||||
|
protected Logger log;
|
||||||
|
protected final String prefix;
|
||||||
|
protected DBMS driver;
|
||||||
|
protected Connection connection;
|
||||||
|
protected Map<PreparedStatement, StatementEnum> preparedStatements = new HashMap<PreparedStatement, StatementEnum>();
|
||||||
|
protected int lastUpdate;
|
||||||
|
|
||||||
|
public Database(final Logger log, final String prefix, final DBMS dbms) throws DatabaseException {
|
||||||
|
// this.preparedStatements = new HashMap<PreparedStatement, StatementEnum>();
|
||||||
|
if (log == null) {
|
||||||
|
throw new DatabaseException("Logger cannot be null.");
|
||||||
|
}
|
||||||
|
if (prefix == null || prefix.length() == 0) {
|
||||||
|
throw new DatabaseException("Plugin prefix cannot be null or empty.");
|
||||||
|
}
|
||||||
|
this.log = log;
|
||||||
|
this.prefix = prefix;
|
||||||
|
this.driver = dbms;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final String prefix(final String message) {
|
||||||
|
return this.prefix + this.driver + message;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public final void writeInfo(final String toWrite) {
|
||||||
|
this.info(toWrite);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public final void writeError(final String toWrite, final boolean severe) {
|
||||||
|
if (severe) {
|
||||||
|
this.error(toWrite);
|
||||||
|
} else {
|
||||||
|
this.warning(toWrite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void info(final String info) {
|
||||||
|
if (info != null && !info.isEmpty()) {
|
||||||
|
this.log.info(this.prefix(info));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void warning(final String warning) {
|
||||||
|
if (warning != null && !warning.isEmpty()) {
|
||||||
|
this.log.warning(this.prefix(warning));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void error(final String error) {
|
||||||
|
if (error != null && !error.isEmpty()) {
|
||||||
|
this.log.severe(this.prefix(error));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract boolean initialize();
|
||||||
|
|
||||||
|
public final DBMS getDriver() {
|
||||||
|
return this.getDBMS();
|
||||||
|
}
|
||||||
|
|
||||||
|
public final DBMS getDBMS() {
|
||||||
|
return this.driver;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean open();
|
||||||
|
|
||||||
|
public final boolean close() {
|
||||||
|
if (this.connection != null) {
|
||||||
|
try {
|
||||||
|
this.connection.close();
|
||||||
|
return true;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
this.writeError("Could not close connection, SQLException: " + e.getMessage(), true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.writeError("Could not close connection, it is null.", true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public final boolean isConnected() {
|
||||||
|
return this.isOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
public final Connection getConnection() {
|
||||||
|
return this.connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isOpen() {
|
||||||
|
return this.isOpen(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isOpen(final int seconds) {
|
||||||
|
if (this.connection != null) {
|
||||||
|
try {
|
||||||
|
if (this.connection.isValid(seconds)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public final boolean checkConnection() {
|
||||||
|
return this.isOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int getLastUpdateCount() {
|
||||||
|
return this.lastUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void queryValidation(final StatementEnum p0) throws SQLException;
|
||||||
|
|
||||||
|
public final ResultSet query(final String query) throws SQLException {
|
||||||
|
this.queryValidation(this.getStatement(query));
|
||||||
|
final Statement statement = this.getConnection().createStatement();
|
||||||
|
if (statement.execute(query)) {
|
||||||
|
return statement.getResultSet();
|
||||||
|
}
|
||||||
|
final int uc = statement.getUpdateCount();
|
||||||
|
this.lastUpdate = uc;
|
||||||
|
return this.getConnection().createStatement().executeQuery("SELECT " + uc);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final ResultSet query(final PreparedStatement ps, final StatementEnum statement) throws SQLException {
|
||||||
|
this.queryValidation(statement);
|
||||||
|
if (ps.execute()) {
|
||||||
|
return ps.getResultSet();
|
||||||
|
}
|
||||||
|
final int uc = ps.getUpdateCount();
|
||||||
|
this.lastUpdate = uc;
|
||||||
|
return this.connection.createStatement().executeQuery("SELECT " + uc);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final ResultSet query(final PreparedStatement ps) throws SQLException {
|
||||||
|
ResultSet output = this.query(ps, this.preparedStatements.get(ps));
|
||||||
|
this.preparedStatements.remove(ps);
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final PreparedStatement prepare(final String query) throws SQLException {
|
||||||
|
final StatementEnum s = this.getStatement(query);
|
||||||
|
final PreparedStatement ps = this.connection.prepareStatement(query);
|
||||||
|
this.preparedStatements.put(ps, s);
|
||||||
|
return ps;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Long> insert(final String query) throws SQLException {
|
||||||
|
final ArrayList<Long> keys = new ArrayList<Long>();
|
||||||
|
final PreparedStatement ps = this.connection.prepareStatement(query, 1);
|
||||||
|
this.lastUpdate = ps.executeUpdate();
|
||||||
|
final ResultSet key = ps.getGeneratedKeys();
|
||||||
|
if (key.next()) {
|
||||||
|
keys.add(key.getLong(1));
|
||||||
|
}
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Long> insert(final PreparedStatement ps) throws SQLException {
|
||||||
|
this.lastUpdate = ps.executeUpdate();
|
||||||
|
this.preparedStatements.remove(ps);
|
||||||
|
final ArrayList<Long> keys = new ArrayList<Long>();
|
||||||
|
final ResultSet key = ps.getGeneratedKeys();
|
||||||
|
if (key.next()) {
|
||||||
|
keys.add(key.getLong(1));
|
||||||
|
}
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final ResultSet query(final Builder builder) throws SQLException {
|
||||||
|
return this.query(builder.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract StatementEnum getStatement(final String p0) throws SQLException;
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public boolean createTable() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public boolean checkTable(final String table) {
|
||||||
|
return this.isTable(table);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public boolean wipeTable(final String table) {
|
||||||
|
return this.truncate(table);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean isTable(final String p0);
|
||||||
|
|
||||||
|
public abstract boolean truncate(final String p0);
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package org.cn2b2t.proxy.utils.data;
|
||||||
|
|
||||||
|
public class DatabaseConfig {
|
||||||
|
public final String SQL_HOST;
|
||||||
|
public final int SQL_PORT;
|
||||||
|
public final String SQL_DATA;
|
||||||
|
public final String SQL_USER;
|
||||||
|
public final String SQL_PASS;
|
||||||
|
|
||||||
|
public DatabaseConfig(String SQL_HOST, int SQL_PORT, String SQL_DATA, String SQL_USER, String SQL_PASS) {
|
||||||
|
this.SQL_HOST = SQL_HOST;
|
||||||
|
this.SQL_PORT = SQL_PORT;
|
||||||
|
this.SQL_DATA = SQL_DATA;
|
||||||
|
this.SQL_USER = SQL_USER;
|
||||||
|
this.SQL_PASS = SQL_PASS;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
//
|
||||||
|
// Decompiled by Procyon v0.5.30
|
||||||
|
//
|
||||||
|
|
||||||
|
package org.cn2b2t.proxy.utils.data;
|
||||||
|
|
||||||
|
public class DatabaseException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 3063547825200154629L;
|
||||||
|
|
||||||
|
public DatabaseException(final String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package org.cn2b2t.proxy.utils.data;
|
||||||
|
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
public abstract class HostnameDatabase extends Database {
|
||||||
|
private String hostname = "localhost";
|
||||||
|
private int port = 0;
|
||||||
|
private String database = "minecraft";
|
||||||
|
private String username = "minecraft";
|
||||||
|
private String password = "";
|
||||||
|
|
||||||
|
public HostnameDatabase(Logger log, String prefix, DBMS dbms, String hostname, int port, String database, String username, String password) {
|
||||||
|
super(log, prefix, dbms);
|
||||||
|
setHostname(hostname);
|
||||||
|
setPort(port);
|
||||||
|
setUsername(username);
|
||||||
|
setPassword(password);
|
||||||
|
setDatabase(database);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHostname() {
|
||||||
|
return this.hostname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHostname(String hostname) {
|
||||||
|
if ((hostname == null) || (hostname.length() == 0))
|
||||||
|
throw new RuntimeException("Hostname cannot be null or empty.");
|
||||||
|
this.hostname = hostname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPort() {
|
||||||
|
return this.port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPort(int port) {
|
||||||
|
if ((port < 0) || (65535 < port))
|
||||||
|
throw new RuntimeException("Port number cannot be below 0 or greater than 65535.");
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return this.username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsername(String username) {
|
||||||
|
if (username == null)
|
||||||
|
throw new RuntimeException("Username cannot be null.");
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return this.password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
if (password == null)
|
||||||
|
throw new RuntimeException("Password cannot be null.");
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDatabase() {
|
||||||
|
return this.database;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDatabase(String database) {
|
||||||
|
if ((database == null) || (database.length() == 0))
|
||||||
|
throw new RuntimeException("Database cannot be null or empty.");
|
||||||
|
this.database = database;
|
||||||
|
}
|
||||||
|
}
|
182
2b2t-proxy/src/main/java/org/cn2b2t/proxy/utils/data/MySQL.java
Normal file
182
2b2t-proxy/src/main/java/org/cn2b2t/proxy/utils/data/MySQL.java
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
package org.cn2b2t.proxy.utils.data;
|
||||||
|
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
public class MySQL extends HostnameDatabase {
|
||||||
|
public MySQL(final Logger log, final String prefix, final String hostname, final String port, final String database, final String username, final String password) {
|
||||||
|
super(log, prefix, DBMS.MySQL, hostname, Integer.parseInt(port), database, username, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MySQL(final Logger log, final String prefix, final String hostname, final int port, final String database, final String username, final String password) {
|
||||||
|
super(log, prefix, DBMS.MySQL, hostname, port, database, username, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MySQL(final Logger log, final String prefix, final String database, final String username, final String password) {
|
||||||
|
super(log, prefix, DBMS.MySQL, "localhost", 3306, database, username, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MySQL(final Logger log, final String prefix, final String database, final String username) {
|
||||||
|
super(log, prefix, DBMS.MySQL, "localhost", 3306, database, username, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public MySQL(final Logger log, final String prefix, final String database) {
|
||||||
|
super(log, prefix, DBMS.MySQL, "localhost", 3306, database, "", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean initialize() {
|
||||||
|
try {
|
||||||
|
Class.forName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
|
||||||
|
return true;
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
this.warning("MySQL DataSource class missing: " + e.getMessage() + ".");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean open() {
|
||||||
|
try {
|
||||||
|
final String url = "jdbc:mysql://" + this.getHostname() + ":" + this.getPort() + "/" + this.getDatabase();
|
||||||
|
if (this.initialize()) {
|
||||||
|
this.connection = DriverManager.getConnection(url, this.getUsername(), this.getPassword());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
this.error("Could not establish a MySQL connection, SQLException: " + e.getMessage());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void queryValidation(final StatementEnum statement) throws SQLException {
|
||||||
|
switch ((Statements) statement) {
|
||||||
|
case USE: {
|
||||||
|
this.warning("Please create a new connection to use a different database.");
|
||||||
|
throw new SQLException("Please create a new connection to use a different database.");
|
||||||
|
}
|
||||||
|
case PREPARE:
|
||||||
|
case EXECUTE:
|
||||||
|
case DEALLOCATE: {
|
||||||
|
this.warning("Please use the prepare() method to prepare a query.");
|
||||||
|
throw new SQLException("Please use the prepare() method to prepare a query.");
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Statements getStatement(final String query) throws SQLException {
|
||||||
|
final String[] statement = query.trim().split(" ", 2);
|
||||||
|
try {
|
||||||
|
final Statements converted = Statements.valueOf(statement[0].toUpperCase());
|
||||||
|
return converted;
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
throw new SQLException("Unknown statement: \"" + statement[0] + "\".");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public boolean createTable(final String query) {
|
||||||
|
Statement statement = null;
|
||||||
|
if (query == null || query.equals("")) {
|
||||||
|
this.writeError("Could not create table: query is empty or null.", true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
statement = this.connection.createStatement();
|
||||||
|
statement.execute(query);
|
||||||
|
statement.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
this.writeError("Could not create table, SQLException: " + e.getMessage(), true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTable(final String table) {
|
||||||
|
Statement statement;
|
||||||
|
try {
|
||||||
|
statement = this.connection.createStatement();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
this.error("Could not create a statement in checkTable(), SQLException: " + e.getMessage());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
statement.executeQuery("SELECT * FROM " + table);
|
||||||
|
return true;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean truncate(final String table) {
|
||||||
|
Statement statement = null;
|
||||||
|
String query = null;
|
||||||
|
try {
|
||||||
|
if (!this.isTable(table)) {
|
||||||
|
this.error("Table \"" + table + "\" does not exist.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
statement = this.connection.createStatement();
|
||||||
|
query = "DELETE FROM " + table + ";";
|
||||||
|
statement.executeUpdate(query);
|
||||||
|
statement.close();
|
||||||
|
return true;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
this.error("Could not wipe table, SQLException: " + e.getMessage());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Statements implements StatementEnum {
|
||||||
|
SELECT("SELECT"),
|
||||||
|
INSERT("INSERT"),
|
||||||
|
UPDATE("UPDATE"),
|
||||||
|
DELETE("DELETE"),
|
||||||
|
DO("DO"),
|
||||||
|
REPLACE("REPLACE"),
|
||||||
|
LOAD("LOAD"),
|
||||||
|
HANDLER("HANDLER"),
|
||||||
|
CALL("CALL"),
|
||||||
|
CREATE("CREATE"),
|
||||||
|
ALTER("ALTER"),
|
||||||
|
DROP("DROP"),
|
||||||
|
TRUNCATE("TRUNCATE"),
|
||||||
|
RENAME("RENAME"),
|
||||||
|
START("START"),
|
||||||
|
COMMIT("COMMIT"),
|
||||||
|
SAVEPOINT("SAVEPOINT"),
|
||||||
|
ROLLBACK("ROLLBACK"),
|
||||||
|
RELEASE("RELEASE"),
|
||||||
|
LOCK("LOCK"),
|
||||||
|
UNLOCK("UNLOCK"),
|
||||||
|
PREPARE("PREPARE"),
|
||||||
|
EXECUTE("EXECUTE"),
|
||||||
|
DEALLOCATE("DEALLOCATE"),
|
||||||
|
SET("SET"),
|
||||||
|
SHOW("SHOW"),
|
||||||
|
DESCRIBE("DESCRIBE"),
|
||||||
|
EXPLAIN("EXPLAIN"),
|
||||||
|
HELP("HELP"),
|
||||||
|
USE("USE");
|
||||||
|
|
||||||
|
private String string;
|
||||||
|
|
||||||
|
Statements(final String string) {
|
||||||
|
this.string = string;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return this.string;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
package org.cn2b2t.proxy.utils.data;
|
||||||
|
|
||||||
|
public interface StatementEnum {
|
||||||
|
}
|
4
2b2t-proxy/src/main/resources/bungee.yml
Normal file
4
2b2t-proxy/src/main/resources/bungee.yml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
name: 2b2t-proxy
|
||||||
|
main: org.cn2b2t.proxy.Main
|
||||||
|
version: 1.0
|
||||||
|
author: Moci
|
0
2b2t-proxy/src/main/resources/config.yml
Normal file
0
2b2t-proxy/src/main/resources/config.yml
Normal file
9
2b2t-proxy/src/main/resources/database.yml
Normal file
9
2b2t-proxy/src/main/resources/database.yml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
Database:
|
||||||
|
host: 127.0.0.1
|
||||||
|
port: 3306
|
||||||
|
user: root
|
||||||
|
password: root
|
||||||
|
databases:
|
||||||
|
temp: temp
|
||||||
|
kettle: moci
|
||||||
|
website: moci
|
35
2b2t-proxy/src/main/resources/illegalWords.yml
Normal file
35
2b2t-proxy/src/main/resources/illegalWords.yml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
words:
|
||||||
|
- "操"
|
||||||
|
- "杀"
|
||||||
|
- "妈"
|
||||||
|
- "傻逼"
|
||||||
|
- "弱智"
|
||||||
|
- "孤儿"
|
||||||
|
- "黑客"
|
||||||
|
- "车队"
|
||||||
|
- "你妈"
|
||||||
|
- "死"
|
||||||
|
- "处女"
|
||||||
|
- "屌"
|
||||||
|
- "屄"
|
||||||
|
- "狗"
|
||||||
|
- "垃圾"
|
||||||
|
- "雌"
|
||||||
|
- "雄"
|
||||||
|
- "爹"
|
||||||
|
- "娘"
|
||||||
|
- "窝囊"
|
||||||
|
- "奶奶"
|
||||||
|
- "孙子"
|
||||||
|
- "儿子"
|
||||||
|
- "女儿"
|
||||||
|
- "爷"
|
||||||
|
- "遂"
|
||||||
|
- "胸"
|
||||||
|
- "监管"
|
||||||
|
- "管理"
|
||||||
|
- "主管"
|
||||||
|
- "腐竹"
|
||||||
|
- "服主"
|
||||||
|
- "客服"
|
||||||
|
- "内射"
|
4
2b2t-proxy/src/main/resources/owners.yml
Normal file
4
2b2t-proxy/src/main/resources/owners.yml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
owners:
|
||||||
|
- CUMR
|
||||||
|
- LSeng
|
||||||
|
- Red_Carl
|
0
2b2t-proxy/src/main/resources/perm.yml
Normal file
0
2b2t-proxy/src/main/resources/perm.yml
Normal file
139
2b2t-proxy/src/main/resources/serverinfo.yml
Normal file
139
2b2t-proxy/src/main/resources/serverinfo.yml
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
#COMMON FUCTIONS V1.0
|
||||||
|
#墨瓷
|
||||||
|
|
||||||
|
##MOTD设置
|
||||||
|
|
||||||
|
FixingMode:
|
||||||
|
enable: false
|
||||||
|
Motd: "&7深切哀悼在抗击新冠肺炎斗争中的牺牲烈士和逝世同胞。"
|
||||||
|
Info: "§c§l服务暂停至2020/4/5 00:00"
|
||||||
|
players:
|
||||||
|
- CUMR
|
||||||
|
- LSeng
|
||||||
|
- Raviloi
|
||||||
|
- Red_Carl
|
||||||
|
|
||||||
|
IP:
|
||||||
|
online:
|
||||||
|
- online.service.mocimc.cn
|
||||||
|
offline:
|
||||||
|
- offline.service.mocimc.cn
|
||||||
|
|
||||||
|
Default:
|
||||||
|
Motd:
|
||||||
|
line1: "&f§lKa&7&lr&c.RED &f中国专业MC游戏社区 &8| &f1.7.10&8-&f1.14&7通用 "
|
||||||
|
# line1: "&f&l墨&8&l瓷&8(&c中国&8) &3专业游戏社区 &8| &f服务暂停至2020/4/5 00:00"
|
||||||
|
line2: "&8[&cR&8] &7经典,回归;青春,永在。 &8| &7全原创自主开发 &f&l竞技场 &7开放测试!"
|
||||||
|
PlayerInfo:
|
||||||
|
- "&f§lKa&7&lr&c.RED &8(&c中国主服&8)"
|
||||||
|
- "&f"
|
||||||
|
- "&7建议您访问我们的网站 &f&lhttps://www.kar.red/ &7,"
|
||||||
|
- "&7或加入我们的讨论群 &c106660674 &7。"
|
||||||
|
- "&8"
|
||||||
|
version: "§f支持 §c1.7.2-1.14.4"
|
||||||
|
useFakePlayer: false
|
||||||
|
maxPlayer: 512
|
||||||
|
icon: "/icons/kar.png"
|
||||||
|
Settings:
|
||||||
|
RICHDRAGON:
|
||||||
|
IP:
|
||||||
|
- service.richi.pro
|
||||||
|
- richi.pro
|
||||||
|
Motd:
|
||||||
|
line1: "&6&lRichi&7.pro &f中国专业PVP社区服务器"
|
||||||
|
line2: "&7"
|
||||||
|
PlayerInfo:
|
||||||
|
- "&f"
|
||||||
|
- "&7制作中。"
|
||||||
|
- "&8"
|
||||||
|
version: "§f支持 §31.7.2-1.14.4"
|
||||||
|
useFakePlayer: false
|
||||||
|
maxPlayer: 999
|
||||||
|
icon: "/icons/richi.png"
|
||||||
|
target: "DR.ARENAS.PRACTICE"
|
||||||
|
playersFrom:
|
||||||
|
- DR.ARENAS.PRACTICE
|
||||||
|
2b2t:
|
||||||
|
IP:
|
||||||
|
- service.cn2b2t.org
|
||||||
|
- cn2b2t.org
|
||||||
|
Motd:
|
||||||
|
line1: "&7&l2B &c&lCN&7&l2B2T.ORG &f支持 1.12.2 - 最新正式版"
|
||||||
|
line2: "&7&l2T &6中国全开放式无规则无管理仿2B2T服务器"
|
||||||
|
PlayerInfo:
|
||||||
|
- "&f"
|
||||||
|
- "&7建议您访问我们的网站 &chttps://cn2b2t.org/ &7,"
|
||||||
|
- "&8"
|
||||||
|
version: "§f支持 §21.7.2-最新版本"
|
||||||
|
useFakePlayer: false
|
||||||
|
maxPlayer: 64
|
||||||
|
icon: "/icons/2b2t.png"
|
||||||
|
target: "2b2t"
|
||||||
|
directTeleport: false
|
||||||
|
onlyOnlineMode: false
|
||||||
|
PRIVATE_AXI:
|
||||||
|
IP:
|
||||||
|
- axi.service.privatemc.cn
|
||||||
|
- axi.privatemc.cn
|
||||||
|
Motd:
|
||||||
|
line1: "&f&l阿西&f的私人粉丝服务器 &8| &7请使用&f1.14.4&7登入"
|
||||||
|
line2: "&7本服务器由 &f&l墨&b&l瓷 &7免费支持、维护。"
|
||||||
|
PlayerInfo:
|
||||||
|
- "&f"
|
||||||
|
- "&7本服务器由 &f&l墨&b&l瓷 &7免费支持、维护。"
|
||||||
|
- "&8"
|
||||||
|
version: "§f支持 §21.14.4"
|
||||||
|
useFakePlayer: false
|
||||||
|
maxPlayer: 32
|
||||||
|
icon: "/icons/axi_private.png"
|
||||||
|
target: "PRIVATE_AXI"
|
||||||
|
directTeleport: false
|
||||||
|
onlyOnlineMode: false
|
||||||
|
PRIVATE_HAN:
|
||||||
|
IP:
|
||||||
|
- han.service.privatemc.cn
|
||||||
|
- han.privatemc.cn
|
||||||
|
Motd:
|
||||||
|
line1: "&f皇冠瑜伽会所 &8(1.7.10模组&8) "
|
||||||
|
line2: "&7需要整合包请加群 &f582496580"
|
||||||
|
PlayerInfo:
|
||||||
|
- "&f"
|
||||||
|
- "&7本服务器由 &f&l墨&b&l瓷 &7免费支持、维护。"
|
||||||
|
- "&7这里是 &f皇冠瑜伽会所 &7,"
|
||||||
|
- "&7一起van♂游♂戏♂ 吧!"
|
||||||
|
- "&7所含模组 &f拔刀剑&8、&f工业,"
|
||||||
|
- "&7需要整合包请加群 &f582496580"
|
||||||
|
- "&8"
|
||||||
|
version: "§f需要 §f1.7.10Forge"
|
||||||
|
useFakePlayer: false
|
||||||
|
maxPlayer: 64
|
||||||
|
icon: "/icons/yilong_private.png"
|
||||||
|
target: "PRIVATE.YILONG"
|
||||||
|
directTeleport: false
|
||||||
|
onlyOnlineMode: false
|
||||||
|
SEASURVIVAL:
|
||||||
|
IP:
|
||||||
|
- sea.service.privatemc.cn
|
||||||
|
- sea.privatemc.cn
|
||||||
|
Motd:
|
||||||
|
line1: " &3海 &b◐ &3暮 &b◑ &3礁 &71.8.9 大型海岛生存"
|
||||||
|
line2: " &8“&f伴余走海礁,同生观暮桥。&8”"
|
||||||
|
PlayerInfo:
|
||||||
|
- "&f"
|
||||||
|
- "&7本服务器由 &f&l墨&b&l瓷 &7免费支持、维护。"
|
||||||
|
- ""
|
||||||
|
- "&3海 &b◐ &3暮 &b◑ &3礁 &71.8.9 大型海岛生存"
|
||||||
|
- "&8“&f伴余走海礁,同生观暮桥。&8”"
|
||||||
|
- ""
|
||||||
|
- "&7建议您访问我们的网站 &bhttps://wiki.mocimc.cn/ &7,"
|
||||||
|
- "&7或加入我们的讨论群 &b731254012 &7。"
|
||||||
|
- "&8"
|
||||||
|
version: "§f需要 §f1.8.8"
|
||||||
|
useFakePlayer: false
|
||||||
|
maxPlayer: 256
|
||||||
|
icon: "/icons/sea.png"
|
||||||
|
target: "MOCI.SURVIVAL.SEA"
|
||||||
|
directTeleport: false
|
||||||
|
playersFrom:
|
||||||
|
- MOCI.SURVIVAL.SEA
|
||||||
|
onlyOnlineMode: false
|
46
2b2t-proxy/src/main/resources/yamen.yml
Normal file
46
2b2t-proxy/src/main/resources/yamen.yml
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
Database:
|
||||||
|
SQLhost: 127.0.0.1
|
||||||
|
SQLPort: 3306
|
||||||
|
SQLdata: moci
|
||||||
|
user: moci
|
||||||
|
password: moci
|
||||||
|
|
||||||
|
DefaultReason: "违反了规则"
|
||||||
|
|
||||||
|
Servers:
|
||||||
|
- SYSTEM_MAINLOBBY
|
||||||
|
- SYSTEM_LOGIN
|
||||||
|
|
||||||
|
Layouts:
|
||||||
|
default:
|
||||||
|
- '%(space)'
|
||||||
|
- '&3&l衙门 &7封禁管理系统 &8| &c禁令布告'
|
||||||
|
- '&b--&3-&8----------------------------------------&3-&b--'
|
||||||
|
- '&7您已被 &f&l墨&b&l瓷&c &7及其友服、子服&c封禁&7。'
|
||||||
|
- '&7'
|
||||||
|
- "&7由&f%(staff)&7执行操作,其理由为"
|
||||||
|
- "&8“&c%(reason)&8”。"
|
||||||
|
- "&7本禁令代号&f#%(id)&7,时效为 &f%(time)&7。"
|
||||||
|
- '&7'
|
||||||
|
- '&7若您不同意我们的禁令,可以在墨瓷&aWiki&7上找到申诉方法。'
|
||||||
|
- "&7详细地址于 &b&nhttps://wiki.mocimc.cn/#!Appeal.md"
|
||||||
|
- '&b--&3-&8----------------------------------------&3-&b--'
|
||||||
|
- '%(space)'
|
||||||
|
kick_default:
|
||||||
|
- '%(space)'
|
||||||
|
- '&3&l衙门 &7封禁管理系统 &8| &c踢出'
|
||||||
|
- '&b--&3-&8----------------------------------------&3-&b--'
|
||||||
|
- '&7您已被 &f&l墨&b&l瓷&c &7管理员&c踢出&7。'
|
||||||
|
- '&7'
|
||||||
|
- "&7由&f%(staff)&7执行操作,其理由为"
|
||||||
|
- "&8“&c%(reason)&8”。"
|
||||||
|
- '&7'
|
||||||
|
- '&7这&l不是&7封禁,您可以再次进入服务器。'
|
||||||
|
- '&b--&3-&8----------------------------------------&3-&b--'
|
||||||
|
- '%(space)'
|
||||||
|
warn_default:
|
||||||
|
- '&b--&3-&8----------------------------------------&3-&b--'
|
||||||
|
- '&7请注意,您已被管理员&f%(staff)&4警告&7!'
|
||||||
|
- "&7理由为 &8“&c%(reason)&8”。"
|
||||||
|
- '&7请您遵守出现在游戏公屏、浮空字体、告示牌上的规则!'
|
||||||
|
- '&b--&3-&8----------------------------------------&3-&b--'
|
BIN
_lib/Cord.jar
Normal file
BIN
_lib/Cord.jar
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user