1
mirror of https://github.com/CarmJos/cn2b2t-project.git synced 2024-09-19 13:55:45 +00:00

BungeeCord修改2b2t-proxy

This commit is contained in:
carm 2020-05-27 00:25:24 +08:00
parent 8fc6f4dd99
commit 118973921a
54 changed files with 4115 additions and 0 deletions

View File

@ -12,5 +12,6 @@
<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/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/_lib/Cord.jar" charset="GBK" />
</component>
</project>

View File

@ -10,6 +10,28 @@
<modelVersion>4.0.0</modelVersion>
<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>

View 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");
}
}

View 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;
}
}

View File

@ -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("");
}
}

View File

@ -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;
}
}

View 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;
}
}
}

View File

@ -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");
}
}

View File

@ -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);
// }
// }
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}
}
}

View File

@ -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() {
}
}

View File

@ -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 得到一个MapKey为group_idValue为组名
*/
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;
}
}

View File

@ -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)});
}
}

View File

@ -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));
}
}

View File

@ -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;
}
}

View File

@ -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")));
});
}
}

View File

@ -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());
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}
}

View File

@ -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());
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}

View File

@ -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());
}
}

View File

@ -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()))));
}
}

View File

@ -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();
// }
}
}
}

View File

@ -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;
}
}

View File

@ -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 + "')");
// }
}
}

View File

@ -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();
}
}

View 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();
}
}
}

View File

@ -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;
}
}

View File

@ -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());
}
}
}

View File

@ -0,0 +1,8 @@
//
// Decompiled by Procyon v0.5.30
//
package org.cn2b2t.proxy.utils.data;
public interface Builder {
}

View File

@ -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);
}
}

View File

@ -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("&", "§"));
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View 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;
}
}
}

View File

@ -0,0 +1,4 @@
package org.cn2b2t.proxy.utils.data;
public interface StatementEnum {
}

View File

@ -0,0 +1,4 @@
name: 2b2t-proxy
main: org.cn2b2t.proxy.Main
version: 1.0
author: Moci

View File

View File

@ -0,0 +1,9 @@
Database:
host: 127.0.0.1
port: 3306
user: root
password: root
databases:
temp: temp
kettle: moci
website: moci

View File

@ -0,0 +1,35 @@
words:
- "操"
- "杀"
- "妈"
- "傻逼"
- "弱智"
- "孤儿"
- "黑客"
- "车队"
- "你妈"
- "死"
- "处女"
- "屌"
- "屄"
- "狗"
- "垃圾"
- "雌"
- "雄"
- "爹"
- "娘"
- "窝囊"
- "奶奶"
- "孙子"
- "儿子"
- "女儿"
- "爷"
- "遂"
- "胸"
- "监管"
- "管理"
- "主管"
- "腐竹"
- "服主"
- "客服"
- "内射"

View File

@ -0,0 +1,4 @@
owners:
- CUMR
- LSeng
- Red_Carl

View File

View 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

View 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

Binary file not shown.