SteamWar/BungeeCore
Archiviert
13
2

Ignore-System initial push #93

Manuell gemergt
Lixfel hat 10 Commits von IgnoreSystem nach master 2020-08-29 11:08:44 +02:00 zusammengeführt
7 geänderte Dateien mit 237 neuen und 0 gelöschten Zeilen
Nur Änderungen aus Commit 1e2f2441ab werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@ -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
Veraltet
Review

Nein, das kommt in die Datenbank (das skaliert schließlich)

Nein, das kommt in die Datenbank (das skaliert schließlich)
new ErrorLogger();
new ConnectionListener();

Datei anzeigen

@ -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) {
Veraltet
Review

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) {
Veraltet
Review

Lieber über UUIDs als ProxiedPlayer

Lieber über UUIDs als ProxiedPlayer
if (victim==null || offender==null) return;
Veraltet
Review

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) {
Veraltet
Review

Auch hier lieber UUIDs

Auch hier lieber UUIDs
if (victim==null || offender==null) return;
Veraltet
Review

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;
Veraltet
Review

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");
Veraltet
Review

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);
Veraltet
Review

Bei Set ist Überprüfung unnötig

Bei Set ist Überprüfung unnötig
Veraltet
Review

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);
Veraltet
Review

Bei Set ist Überprüfung unnötig

Bei Set ist Überprüfung unnötig
Veraltet
Review

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

Datei anzeigen

@ -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..");
Veraltet
Review

Deutsch bitte.

Deutsch bitte.
Veraltet
Review

Bzw. kannst du die Nachricht auch komplett weglassen

Bzw. kannst du die Nachricht auch komplett weglassen
return;
Veraltet
Review

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){

Datei anzeigen

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

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!");
Veraltet
Review

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?");
Veraltet
Review

ignorieren kleingeschrieben.

ignorieren kleingeschrieben.
return;
}else {
IgnoreSystem.ignore(p, target);
BungeeCore.send(p, BungeeCore.CHAT_PREFIX + "§7Du ignorierst nun " + target.getDisplayName() + ".");
}
Veraltet
Review

Was ist nur mit deinem Tab-Spacing los?

Was ist nur mit deinem Tab-Spacing los?
}
}

Datei anzeigen

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

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)
Review

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

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
Review

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;

Datei anzeigen

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

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){
Veraltet
Review

Tab-Spacing

Tab-Spacing
Veraltet
Review

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!");
Veraltet
Review

Auch hier: Bitte mit SteamwarUser

Auch hier: Bitte mit SteamwarUser
Veraltet
Review

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
Veraltet
Review

Ich meine target.

Ich meine target.
Veraltet
Review

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

Datei anzeigen

@ -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
Veraltet
Review

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)