Ignore-System initial push #93
@ -51,6 +51,8 @@ public class BungeeCore extends Plugin {
|
||||
public void onEnable(){
|
||||
setInstance(this);
|
||||
loadConfig();
|
||||
|
||||
IgnoreSystem.folder = new File(getDataFolder() + "/ignoreSystem/"); //folder where the playerdata from the "/ignore" system is saved
|
||||
|
||||
|
||||
new ErrorLogger();
|
||||
new ConnectionListener();
|
||||
|
157
src/de/steamwar/bungeecore/IgnoreSystem.java
Normale Datei
@ -0,0 +1,157 @@
|
||||
package de.steamwar.bungeecore;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.UUID;
|
||||
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
|
||||
public class IgnoreSystem{
|
||||
private static HashMap<UUID, IgnoreSystem> ignorers = new HashMap<UUID, IgnoreSystem>();
|
||||
public static File folder; //FileSystem-Folder: ../ignoreSystem/
|
||||
|
||||
//TODO load and unLoad functions - Filesystem
|
||||
|
||||
public static boolean isIgnored(UUID ignorer, UUID ignored) {
|
||||
if (!ignorers.containsKey(ignorer))
|
||||
ignorers.put(ignorer, new IgnoreSystem(ignorer));
|
||||
return ignorers.get(ignorer).isIgnoring(ignored);
|
||||
}
|
||||
|
||||
public static void load(UUID id) {
|
||||
Lixfel
hat
Muss diese Funktion public sein? Besser fände ich, wenn es eine private-Methode IgnoreSystem get(UUID) gibt, die ein IgnoreSystem für die UUID zurückgibt, unabhängig davon, ob sie schon gecached ist, oder ob sie noch aus der Datenbank geladen werden muss. Diese funktion kann dann in isIgnored, ignore und unIgnore verwendet werden. Muss diese Funktion public sein?
Besser fände ich, wenn es eine private-Methode IgnoreSystem get(UUID) gibt, die ein IgnoreSystem für die UUID zurückgibt, unabhängig davon, ob sie schon gecached ist, oder ob sie noch aus der Datenbank geladen werden muss. Diese funktion kann dann in isIgnored, ignore und unIgnore verwendet werden.
|
||||
if (!ignorers.containsKey(id))
|
||||
ignorers.put(id, new IgnoreSystem(id));
|
||||
}
|
||||
|
||||
public static void onStop() {
|
||||
ignorers.forEach((u,i) -> {
|
||||
i.saveId(u);
|
||||
});
|
||||
}
|
||||
|
||||
public static void save(UUID id) {
|
||||
if (ignorers.containsKey(id))
|
||||
ignorers.get(id).saveId(id);
|
||||
}
|
||||
|
||||
public static void unLoad(UUID id) {
|
||||
if (ignorers.containsKey(id))
|
||||
ignorers.remove(id);
|
||||
}
|
||||
|
||||
public static void ignore(ProxiedPlayer victim, ProxiedPlayer offender) {
|
||||
Lixfel
hat
Lieber über UUIDs als ProxiedPlayer Lieber über UUIDs als ProxiedPlayer
|
||||
if (victim==null || offender==null) return;
|
||||
Lixfel
hat
Warum sollte null hier überhaupt ankommen? Warum sollte null hier überhaupt ankommen?
|
||||
if (!ignorers.containsKey(victim.getUniqueId()))
|
||||
ignorers.put(victim.getUniqueId(), new IgnoreSystem(victim.getUniqueId()));
|
||||
ignorers.get(victim.getUniqueId()).ignore(offender.getUniqueId());
|
||||
}
|
||||
|
||||
public static void unIgnore(ProxiedPlayer victim, ProxiedPlayer offender) {
|
||||
Lixfel
hat
Auch hier lieber UUIDs Auch hier lieber UUIDs
|
||||
if (victim==null || offender==null) return;
|
||||
Lixfel
hat
Warum sollte hier überhaupt null ankommen? Warum sollte hier überhaupt null ankommen?
|
||||
if (!ignorers.containsKey(victim.getUniqueId()))
|
||||
ignorers.put(victim.getUniqueId(), new IgnoreSystem(victim.getUniqueId()));
|
||||
ignorers.get(victim.getUniqueId()).unIgnore(offender.getUniqueId());
|
||||
}
|
||||
|
||||
//--------Ignoring-Player-Instance-Below-----------------------------
|
||||
|
||||
/**
|
||||
* List of Ignored Players
|
||||
*/
|
||||
private ArrayList<UUID> ignored;
|
||||
Lixfel
hat
Bitte keine ArrayList, sondern ein Set (Performance + keine Dopplungen möglich) Bitte keine ArrayList, sondern ein Set (Performance + keine Dopplungen möglich)
|
||||
|
||||
/**
|
||||
* is THIS instance ignoring [id]
|
||||
* @param id the person, which might get ignored
|
||||
*/
|
||||
public boolean isIgnoring(UUID id) {
|
||||
return ignored.contains(id);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param id
|
||||
*/
|
||||
public IgnoreSystem(UUID id) {
|
||||
ignored = new ArrayList<UUID>();
|
||||
File f = new File(folder+id.toString()+".cfg");
|
||||
Lixfel
hat
Wie bereits geschrieben: Eine Datenbank-Tabelle ist da die sauberere Lösung Wie bereits geschrieben: Eine Datenbank-Tabelle ist da die sauberere Lösung
|
||||
if (f.exists()) {
|
||||
try {
|
||||
FileReader fr = new FileReader(f);
|
||||
int a=0;
|
||||
String current="";
|
||||
try {
|
||||
while ((a=fr.read())!=-1) {
|
||||
char c = (char) a;
|
||||
if (c=='\n') {
|
||||
if (current!="")
|
||||
ignored.add(UUID.fromString(current));
|
||||
current="";
|
||||
}else
|
||||
current+=c;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} catch (FileNotFoundException e) {} //impossible
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* start ignoring someone
|
||||
* @param id annoying person
|
||||
*/
|
||||
public void ignore(UUID id) {
|
||||
if (!ignored.contains(id))
|
||||
ignored.add(id);
|
||||
Lixfel
hat
Bei Set ist Überprüfung unnötig Bei Set ist Überprüfung unnötig
Lixfel
hat
Bei einer Datenbank: Hier mit Datenbank synchronisieren, nicht wenn der Spieler disconnected Bei einer Datenbank: Hier mit Datenbank synchronisieren, nicht wenn der Spieler disconnected
|
||||
}
|
||||
|
||||
/**
|
||||
* stop ignoring someone
|
||||
* @param id forgiven person
|
||||
*/
|
||||
public void unIgnore(UUID id) {
|
||||
if (ignored.contains(id))
|
||||
ignored.remove(id);
|
||||
Lixfel
hat
Bei Set ist Überprüfung unnötig Bei Set ist Überprüfung unnötig
Lixfel
hat
Bei einer Datenbank: Hier mit Datenbank synchronisieren, nicht wenn der Spieler disconnected Bei einer Datenbank: Hier mit Datenbank synchronisieren, nicht wenn der Spieler disconnected
|
||||
}
|
||||
|
||||
/**
|
||||
* Save this Users-Data to a File
|
||||
* @param id UUID of Player -> Filename
|
||||
*/
|
||||
public void saveId(UUID id) {
|
||||
File f = new File(folder+id.toString()+".cfg");
|
||||
if (!f.exists()) {
|
||||
try {
|
||||
f.createNewFile();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (ignored.size()<1) {
|
||||
f.delete();
|
||||
return;
|
||||
}
|
||||
try {
|
||||
FileWriter fw = new FileWriter(f);
|
||||
String s = "";
|
||||
for (UUID i : ignored)
|
||||
s+=i.toString()+'\n';
|
||||
char[] o = s.toCharArray();
|
||||
char[] i=new char[o.length+1];
|
||||
for (int k=0;k<o.length;k++)
|
||||
i[k]=o[k];
|
||||
i[i.length]=(char)-1;
|
||||
fw.write(i);
|
||||
fw.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
@ -22,12 +22,22 @@ public class ChallengeCommand extends BasicCommand {
|
||||
BungeeCore.send(sender, BungeeCore.CHAT_PREFIX + "§8/§echallenge §8[§7Spieler§8]");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(sender instanceof ProxiedPlayer)) {
|
||||
BungeeCore.send(sender, BungeeCore.CHAT_PREFIX + "You cant run this from the Console..");
|
||||
Lixfel
hat
Deutsch bitte. Deutsch bitte.
Lixfel
hat
Bzw. kannst du die Nachricht auch komplett weglassen Bzw. kannst du die Nachricht auch komplett weglassen
|
||||
return;
|
||||
Lixfel
hat
Tab-spacing verhauen Tab-spacing verhauen
|
||||
}
|
||||
|
||||
ProxiedPlayer target = ProxyServer.getInstance().getPlayer(args[0]);
|
||||
if(target == null){
|
||||
BungeeCore.send(sender, BungeeCore.CHAT_PREFIX + "§cDer gewünschte Spieler ist nicht online.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (IgnoreSystem.isIgnored(target.getUniqueId(), ((ProxiedPlayer) sender).getUniqueId())) {
|
||||
BungeeCore.send(sender, BungeeCore.CHAT_PREFIX + "§cDer gewünschte Spieler hat dich geblockt.");
|
||||
return;
|
||||
}
|
||||
|
||||
Subserver subserver = Subserver.getSubserver(target);
|
||||
if(subserver != null && subserver.getType() == Servertype.ARENA){
|
||||
|
32
src/de/steamwar/bungeecore/commands/IgnoreCommand.java
Normale Datei
@ -0,0 +1,32 @@
|
||||
package de.steamwar.bungeecore.commands;
|
||||
|
||||
import de.steamwar.bungeecore.BungeeCore;
|
||||
import de.steamwar.bungeecore.IgnoreSystem;
|
||||
import net.md_5.bungee.api.CommandSender;
|
||||
import net.md_5.bungee.api.ProxyServer;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
|
||||
public class IgnoreCommand extends BasicCommand {
|
||||
|
||||
public IgnoreCommand() {
|
||||
super("ignore", "steamwar.ignore");
|
||||
Lixfel
hat
Berechtigung null Berechtigung null
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender s, String[] args) {
|
||||
if (!(s instanceof ProxiedPlayer)) return;
|
||||
ProxiedPlayer p = (ProxiedPlayer) s;
|
||||
ProxiedPlayer target = ProxyServer.getInstance().getPlayer(args[0]);
|
||||
if(target == null){
|
||||
BungeeCore.send(p, BungeeCore.CHAT_PREFIX + "§cDieser Spieler ist derzeit nicht online!");
|
||||
Lixfel
hat
Sollte auch funktionieren, wenn das target nicht online ist. Nutze daher den SteamwarUser statt ProxiedPlayer Sollte auch funktionieren, wenn das target nicht online ist. Nutze daher den SteamwarUser statt ProxiedPlayer
|
||||
return;
|
||||
}else if(target.equals(p)){
|
||||
BungeeCore.send(p, BungeeCore.CHAT_PREFIX + "§cWie willst du dich selber Ignorieren?");
|
||||
Lixfel
hat
ignorieren kleingeschrieben. ignorieren kleingeschrieben.
|
||||
return;
|
||||
}else {
|
||||
IgnoreSystem.ignore(p, target);
|
||||
BungeeCore.send(p, BungeeCore.CHAT_PREFIX + "§7Du ignorierst nun " + target.getDisplayName() + ".");
|
||||
}
|
||||
Lixfel
hat
Was ist nur mit deinem Tab-Spacing los? Was ist nur mit deinem Tab-Spacing los?
|
||||
}
|
||||
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
package de.steamwar.bungeecore.commands;
|
||||
|
||||
import de.steamwar.bungeecore.BungeeCore;
|
||||
import de.steamwar.bungeecore.IgnoreSystem;
|
||||
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||
import net.md_5.bungee.api.CommandSender;
|
||||
import net.md_5.bungee.api.ProxyServer;
|
||||
@ -37,6 +38,9 @@ public class MsgCommand extends BasicCommand {
|
||||
if(target == null){
|
||||
BungeeCore.send(player, BungeeCore.CHAT_PREFIX + "§cDieser Spieler ist derzeit nicht online!");
|
||||
return;
|
||||
}else if (IgnoreSystem.isIgnored(target.getUniqueId(), player.getUniqueId())) {
|
||||
BungeeCore.send(player, BungeeCore.CHAT_PREFIX + "§cDieser Spieler hat dich geblockt!");
|
||||
return;
|
||||
Lixfel
hat
Ich weiß nicht, ob auch bei /r diese Zeilen aufgerufen werden (bitte nochmal überprüfen) Ich weiß nicht, ob auch bei /r diese Zeilen aufgerufen werden (bitte nochmal überprüfen)
Jan9103
hat
die Zeile die Zeile ```if (args.length < 2) {
BungeeCore.send(player, BungeeCore.CHAT_PREFIX + "/msg [Benutzer] [Nachricht]");
return;
}```lässt mich vermuten, dass es nicht für /r gültig ist
Lixfel
hat
Nein, ich meine, ob das Blocken auch /r Nachrichten blockiert! Nein, ich meine, ob das Blocken auch /r Nachrichten blockiert!
|
||||
}else if(target.getChatMode() != ProxiedPlayer.ChatMode.SHOWN){
|
||||
BungeeCore.send(player, BungeeCore.CHAT_PREFIX + "§cDieser Spieler empfängt derzeit keine Chatnachrichten!");
|
||||
return;
|
||||
|
29
src/de/steamwar/bungeecore/commands/UnIgnoreCommand.java
Normale Datei
@ -0,0 +1,29 @@
|
||||
package de.steamwar.bungeecore.commands;
|
||||
|
||||
import de.steamwar.bungeecore.BungeeCore;
|
||||
import de.steamwar.bungeecore.IgnoreSystem;
|
||||
import net.md_5.bungee.api.CommandSender;
|
||||
import net.md_5.bungee.api.ProxyServer;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
|
||||
public class UnIgnoreCommand extends BasicCommand {
|
||||
|
||||
public UnIgnoreCommand() {
|
||||
super("unignore", "steamwar.ignore");
|
||||
Lixfel
hat
Auch hier: Berechtigung null Auch hier: Berechtigung null
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender s, String[] args) {
|
||||
if (!(s instanceof ProxiedPlayer)) return;
|
||||
ProxiedPlayer p = (ProxiedPlayer) s;
|
||||
ProxiedPlayer target = ProxyServer.getInstance().getPlayer(args[0]);
|
||||
if(target == null){
|
||||
Lixfel
hat
Tab-Spacing Tab-Spacing
Jan9103
hat
bei mir stimmt das Tab-Spacing überall - villeicht zeigt git es anders an oder ist meine tab-breite im verhältniss zur leerzeichenbreite anders als deine bei mir stimmt das Tab-Spacing überall - villeicht zeigt git es anders an oder ist meine tab-breite im verhältniss zur leerzeichenbreite anders als deine
|
||||
BungeeCore.send(p, BungeeCore.CHAT_PREFIX + "§cDieser Spieler ist derzeit nicht online!");
|
||||
Lixfel
hat
Auch hier: Bitte mit SteamwarUser Auch hier: Bitte mit SteamwarUser
Jan9103
hat
diese nachricht wird an den command-sender geschickt -> er ist garantiert online, sonst hätte er den Befehl ja nicht senden können diese nachricht wird an den command-sender geschickt -> er ist garantiert online, sonst hätte er den Befehl ja nicht senden können
Lixfel
hat
Ich meine target. Ich meine target.
Lixfel
hat
Man kann keinen Spieler blocken, der derzeit offline ist. Das muss geändert werden. Man kann keinen Spieler blocken, der derzeit offline ist. Das muss geändert werden.
|
||||
return;
|
||||
}else {
|
||||
IgnoreSystem.unIgnore(p, target);
|
||||
BungeeCore.send(p, BungeeCore.CHAT_PREFIX + "§7Du beachtest nun " + target.getDisplayName() + " wieder.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
package de.steamwar.bungeecore.listeners;
|
||||
|
||||
import de.steamwar.bungeecore.BungeeCore;
|
||||
import de.steamwar.bungeecore.IgnoreSystem;
|
||||
import de.steamwar.bungeecore.Servertype;
|
||||
import de.steamwar.bungeecore.Subserver;
|
||||
import de.steamwar.bungeecore.commands.ChallengeCommand;
|
||||
@ -123,10 +124,12 @@ public class ConnectionListener extends BasicListener {
|
||||
@EventHandler
|
||||
public void onDisconnect(PlayerDisconnectEvent e){
|
||||
ChallengeCommand.remove(e.getPlayer());
|
||||
IgnoreSystem.unLoad(e.getPlayer().getUniqueId());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onServerDisconnect(ServerDisconnectEvent e){
|
||||
IgnoreSystem.onStop(); //save all
|
||||
Lixfel
hat
Dieses Event wird getriggert, wenn der Subserver beendet wird, nicht wenn der Server runterfährt! Bei Umsetzung in Datenbank sollte das sowieso nicht mehr nötig sein. Dieses Event wird getriggert, wenn der Subserver beendet wird, nicht wenn der Server runterfährt! Bei Umsetzung in Datenbank sollte das sowieso nicht mehr nötig sein.
|
||||
ServerInfo server = e.getTarget();
|
||||
Subserver subserver = Subserver.getSubserver(server);
|
||||
if(subserver == null)
|
||||
|
Nein, das kommt in die Datenbank (das skaliert schließlich)