commit
a075059739
@ -0,0 +1,163 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
document, but changing it is not allowed.
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates the terms
|
||||
and conditions of version 3 of the GNU General Public License, supplemented
|
||||
by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser General
|
||||
Public License, and the "GNU GPL" refers to version 3 of the GNU General Public
|
||||
License.
|
||||
|
||||
|
||||
|
||||
"The Library" refers to a covered work governed by this License, other than
|
||||
an Application or a Combined Work as defined below.
|
||||
|
||||
|
||||
|
||||
An "Application" is any work that makes use of an interface provided by the
|
||||
Library, but which is not otherwise based on the Library. Defining a subclass
|
||||
of a class defined by the Library is deemed a mode of using an interface provided
|
||||
by the Library.
|
||||
|
||||
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an Application
|
||||
with the Library. The particular version of the Library with which the Combined
|
||||
Work was made is also called the "Linked Version".
|
||||
|
||||
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the Corresponding
|
||||
Source for the Combined Work, excluding any source code for portions of the
|
||||
Combined Work that, considered in isolation, are based on the Application,
|
||||
and not on the Linked Version.
|
||||
|
||||
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the object
|
||||
code and/or source code for the Application, including any data and utility
|
||||
programs needed for reproducing the Combined Work from the Application, but
|
||||
excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License without
|
||||
being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a facility
|
||||
refers to a function or data to be supplied by an Application that uses the
|
||||
facility (other than as an argument passed when the facility is invoked),
|
||||
then you may convey a copy of the modified version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to ensure
|
||||
that, in the event an Application does not supply the function or data, the
|
||||
facility still operates, and performs whatever part of its purpose remains
|
||||
meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of this License
|
||||
applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from a header
|
||||
file that is part of the Library. You may convey such object code under terms
|
||||
of your choice, provided that, if the incorporated material is not limited
|
||||
to numerical parameters, data structure layouts and accessors, or small macros,
|
||||
inline functions and templates (ten or fewer lines in length), you do both
|
||||
of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the Library
|
||||
is used in it and that the Library and its use are covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that, taken together,
|
||||
effectively do not restrict modification of the portions of the Library contained
|
||||
in the Combined Work and reverse engineering for debugging such modifications,
|
||||
if you also do each of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that the Library
|
||||
is used in it and that the Library and its use are covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during execution, include
|
||||
the copyright notice for the Library among these notices, as well as a reference
|
||||
directing the user to the copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this License,
|
||||
and the Corresponding Application Code in a form suitable for, and under terms
|
||||
that permit, the user to recombine or relink the Application with a modified
|
||||
version of the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the Library. A
|
||||
suitable mechanism is one that (a) uses at run time a copy of the Library
|
||||
already present on the user's computer system, and (b) will operate properly
|
||||
with a modified version of the Library that is interface-compatible with the
|
||||
Linked Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise be required
|
||||
to provide such information under section 6 of the GNU GPL, and only to the
|
||||
extent that such information is necessary to install and execute a modified
|
||||
version of the Combined Work produced by recombining or relinking the Application
|
||||
with a modified version of the Linked Version. (If you use option 4d0, the
|
||||
Installation Information must accompany the Minimal Corresponding Source and
|
||||
Corresponding Application Code. If you use option 4d1, you must provide the
|
||||
Installation Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the Library side
|
||||
by side in a single library together with other library facilities that are
|
||||
not Applications and are not covered by this License, and convey such a combined
|
||||
library under terms of your choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based on the
|
||||
Library, uncombined with any other library facilities, conveyed under the
|
||||
terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it is a work
|
||||
based on the Library, and explaining where to find the accompanying uncombined
|
||||
form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of the
|
||||
GNU Lesser General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to address
|
||||
new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library as you
|
||||
received it specifies that a certain numbered version of the GNU Lesser General
|
||||
Public License "or any later version" applies to it, you have the option of
|
||||
following the terms and conditions either of that published version or of
|
||||
any later version published by the Free Software Foundation. If the Library
|
||||
as you received it does not specify a version number of the GNU Lesser General
|
||||
Public License, you may choose any version of the GNU Lesser General Public
|
||||
License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide whether
|
||||
future versions of the GNU Lesser General Public License shall apply, that
|
||||
proxy's public statement of acceptance of any version is permanent authorization
|
||||
for you to choose that version for the Library.
|
@ -0,0 +1,6 @@
|
||||
# ForceServer
|
||||
|
||||
Bungeecord-Plugin that can force players to join specific servers by default based on
|
||||
- UUID
|
||||
- Name
|
||||
- Permission
|
@ -0,0 +1,11 @@
|
||||
|
||||
|
||||
# Force default-join-server for players that match the following attributes
|
||||
# More specific attributes are preferred (UUID > Name > Permission)
|
||||
forceServer:
|
||||
byUUID:
|
||||
'25282767-426d-446a-99ab-5554b354ac59': Server1
|
||||
byName:
|
||||
'ABCDE': Server1
|
||||
byPermission:
|
||||
'forceServer.server1': Server1
|
@ -0,0 +1,89 @@
|
||||
package eu.ruekov.ruakij.forceServer;
|
||||
|
||||
import com.google.common.io.ByteStreams;
|
||||
import com.google.common.io.Files;
|
||||
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.*;
|
||||
import java.util.Random;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class ConfigHelper {
|
||||
public static Configuration loadOrRecreateConfig(Plugin plugin, String resource) throws IOException {
|
||||
return loadOrRecreateConfig(plugin, resource, null);
|
||||
}
|
||||
public static Configuration loadOrRecreateConfig(Plugin plugin, String resource, Logger log) throws IOException {
|
||||
|
||||
for(int i=0; i<2; i++) {
|
||||
try {
|
||||
// Copy default config if not existing
|
||||
ConfigHelper.loadAndSaveResource(plugin, "config.yml");
|
||||
} catch (IOException e) {
|
||||
|
||||
if(log!=null)log.severe("Could not load plugin-resource!");
|
||||
throw e;
|
||||
}
|
||||
|
||||
try {
|
||||
// Read config
|
||||
return ConfigurationProvider.getProvider(YamlConfiguration.class).load(new File(plugin.getDataFolder(), resource));
|
||||
|
||||
} catch (IOException e) {
|
||||
|
||||
if(i == 0) {
|
||||
if(log!=null)log.severe("Could not load configuration-file!");
|
||||
e.printStackTrace();
|
||||
|
||||
if(log!=null)log.info("Backing-up config and creating a new one");
|
||||
backupAndDisableConfig(resource);
|
||||
}
|
||||
else
|
||||
throw e;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// We should not end up here..
|
||||
throw new IOException("Could not create/load configuration-file!");
|
||||
}
|
||||
|
||||
public static void backupAndDisableConfig(String resource) throws IOException {
|
||||
|
||||
// Rename the old config to a new-one, so settings are not lost
|
||||
Random rand = new Random();
|
||||
String newResource = resource + rand.nextInt();
|
||||
|
||||
Files.move(new File(resource), new File(newResource));
|
||||
}
|
||||
|
||||
public static File loadAndSaveResource(Plugin plugin, String resource) throws IOException {
|
||||
File folder = plugin.getDataFolder();
|
||||
if (!folder.exists())
|
||||
folder.mkdir();
|
||||
File resourceFile = new File(folder, resource);
|
||||
if (!resourceFile.exists()) {
|
||||
resourceFile.createNewFile();
|
||||
try (InputStream in = plugin.getResourceAsStream(resource);
|
||||
OutputStream out = new FileOutputStream(resourceFile)) {
|
||||
ByteStreams.copy(in, out);
|
||||
}
|
||||
}
|
||||
return resourceFile;
|
||||
}
|
||||
|
||||
public static boolean validateEntry(String entry, String[] allowed) {
|
||||
return validateEntry(entry, allowed, false);
|
||||
}
|
||||
public static boolean validateEntry(String entry, String[] allowed, boolean caseSensetive) {
|
||||
|
||||
for(String allow : allowed) {
|
||||
|
||||
if(entry.equalsIgnoreCase(allow))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@ -0,0 +1,85 @@
|
||||
package eu.ruekov.ruakij.forceServer;
|
||||
|
||||
import eu.ruekov.ruakij.forceServer.command.forceServer;
|
||||
import eu.ruekov.ruakij.forceServer.listener.PostLogin;
|
||||
import net.md_5.bungee.api.plugin.Plugin;
|
||||
import net.md_5.bungee.api.plugin.PluginDescription;
|
||||
import net.md_5.bungee.config.Configuration;
|
||||
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class Main extends Plugin {
|
||||
|
||||
public static Main plugin;
|
||||
public static PluginDescription pInfo;
|
||||
|
||||
public static Logger log;
|
||||
|
||||
public static Configuration config;
|
||||
|
||||
public static HashMap<String, String> forceServerByUUID;
|
||||
public static HashMap<String, String> forceServerByName;
|
||||
public static HashMap<String, String> forceServerByPermission;
|
||||
|
||||
public void onEnable() {
|
||||
log = getLogger(); // Get logger
|
||||
plugin = this; // Get plugin
|
||||
pInfo = this.getDescription(); // Get plugin-info
|
||||
|
||||
log.info("Loading config..");
|
||||
try {
|
||||
loadConfig();
|
||||
} catch (IOException ex) {
|
||||
log.severe("Loading config failed!");
|
||||
ex.printStackTrace();
|
||||
|
||||
// Disable plugin
|
||||
onDisable();
|
||||
return;
|
||||
}
|
||||
|
||||
log.info("Registering commands..");
|
||||
this.getProxy().getPluginManager().registerCommand(this, new forceServer("forceserver"));
|
||||
|
||||
log.info("Registering events..");
|
||||
this.getProxy().getPluginManager().registerListener(this, new PostLogin());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
|
||||
log.info("Version: " + pInfo.getVersion() + " is now disabled!");
|
||||
}
|
||||
|
||||
public void loadConfig() throws IOException {
|
||||
config = ConfigHelper.loadOrRecreateConfig(this, "config.yml");
|
||||
|
||||
// Load UUID-List into memory
|
||||
forceServerByUUID = new HashMap<>();
|
||||
Configuration byUuidSection = config.getSection("forceServer.byUUID");
|
||||
for(String uuid : byUuidSection.getKeys()) {
|
||||
String targetServer = byUuidSection.getString(uuid);
|
||||
forceServerByUUID.put(uuid, targetServer);
|
||||
}
|
||||
log.info(forceServerByUUID.size() +" UUID's");
|
||||
|
||||
forceServerByName = new HashMap<>();
|
||||
Configuration byNameSection = config.getSection("forceServer.byName");
|
||||
for(String uuid : byNameSection.getKeys()) {
|
||||
String targetServer = byNameSection.getString(uuid);
|
||||
forceServerByName.put(uuid, targetServer);
|
||||
}
|
||||
log.info(forceServerByName.size() +" Names");
|
||||
|
||||
forceServerByPermission = new HashMap<>();
|
||||
Configuration byPermissionSection = config.getSection("forceServer.byPermission");
|
||||
for(String uuid : byPermissionSection.getKeys()) {
|
||||
String targetServer = byPermissionSection.getString(uuid);
|
||||
forceServerByPermission.put(uuid, targetServer);
|
||||
}
|
||||
log.info(forceServerByPermission.size() +" Permission-Nodes");
|
||||
}
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package eu.ruekov.ruakij.forceServer.command;
|
||||
|
||||
import eu.ruekov.ruakij.forceServer.Main;
|
||||
import net.md_5.bungee.api.CommandSender;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
import net.md_5.bungee.api.plugin.Command;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class forceServer extends Command {
|
||||
public forceServer(String name) { super(name); }
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
|
||||
// Permission check if sender is player
|
||||
if(sender instanceof ProxiedPlayer){
|
||||
ProxiedPlayer p = (ProxiedPlayer)sender;
|
||||
|
||||
if(!p.hasPermission("forceServer.cmd")){
|
||||
p.sendMessage("§cNo Permission!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Main.log.info("Reloading config..");
|
||||
sender.sendMessage("§eReloading..");
|
||||
try {
|
||||
Main.plugin.loadConfig();
|
||||
} catch (IOException ex) {
|
||||
Main.log.severe("Reloading config failed!");
|
||||
ex.printStackTrace();
|
||||
|
||||
sender.sendMessage("§cFailed! See config for details");
|
||||
return;
|
||||
}
|
||||
sender.sendMessage("§aDone");
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
package eu.ruekov.ruakij.forceServer.listener;
|
||||
|
||||
import eu.ruekov.ruakij.forceServer.Main;
|
||||
import net.md_5.bungee.BungeeCord;
|
||||
import net.md_5.bungee.api.config.ServerInfo;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
import net.md_5.bungee.api.event.PostLoginEvent;
|
||||
import net.md_5.bungee.api.plugin.Listener;
|
||||
import net.md_5.bungee.event.EventHandler;
|
||||
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class PostLogin implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onPostLogin(PostLoginEvent e) {
|
||||
|
||||
ProxiedPlayer p = e.getPlayer();
|
||||
|
||||
// byUUID
|
||||
String forcedTargetServer = Main.forceServerByUUID.get(p.getUniqueId().toString());
|
||||
// byName
|
||||
if(forcedTargetServer == null) Main.forceServerByName.get(p.getName());
|
||||
// byPermission
|
||||
if(forcedTargetServer == null) {
|
||||
for(String permission : Main.forceServerByPermission.keySet()) {
|
||||
if(p.hasPermission(permission)){
|
||||
forcedTargetServer = Main.forceServerByPermission.get(permission);
|
||||
}
|
||||
}
|
||||
Main.forceServerByPermission.get(p);
|
||||
}
|
||||
if(forcedTargetServer == null) return;
|
||||
|
||||
ServerInfo sInfo = BungeeCord.getInstance().getServerInfo(forcedTargetServer);
|
||||
if(sInfo == null) {
|
||||
Main.log.severe("TargetServer '"+ forcedTargetServer +"' not found!");
|
||||
return;
|
||||
}
|
||||
|
||||
p.connect(sInfo);
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
name: ForceServer
|
||||
version: 1.0.0
|
||||
author: Ruakij
|
||||
|
||||
main: eu.ruekov.ruakij.forceServer.Main
|
Loading…
Reference in New Issue