Ein paar Fragen / Codesuche für Eclipse

Dieses Thema im Forum "Server Plugins" wurde erstellt von Mrcookie008, 18. Februar 2013.

  1. Mrcookie008
    Offline

    Mrcookie008

    Registriert seit:
    15. Dezember 2011
    Beiträge:
    380
    Ort:
    /home
    Minecraft:
    xCookieZz oder Mrcookie008 (Beides Premium)
    Heyho Leute:)

    Da ich grade sehr viel an meinem neuen Plugin arbeite , wollte ich auch 2 neue "Funktionen" einbauen , zum einen ist dass AntiSpam und AntiCaps , beides sollte ganz einfach funktionieren:

    Antispam:
    Wird ein beliebiger Text mehr als 3 mal hintereinander geschrieben , wird er nach dem 3. mal nichtmehr gesendet , der spieler bekommt per p.sendMessage eine Nachricht das Spamen verboten ist.

    AntiCaps:
    Wenn mehr als 50% des Textes Grossgeschrieben werden wird die Message nicht gesendet und er bekommt wieder eine Nachricht das Caps verboten sind.

    Da ich leider nirgens irgentwelche hinweiße auf Tutorials oder hilfe zu diesen 2 Befehlen gefunden habe frage ich euch deshalb.
    Hat evt. jemand von euch den Code der 2 Funktionen irgentwo rumliegen oder könnte mir das erklären?


    Problem Nr2.

    Ich habe folgenden Code , der als Countdown dient:

    Code (Text):
    1.                 int starter = 0;
    2.                 if(cmd.getName().equalsIgnoreCase("ct")){
    3.                     if(p.hasPermission("ct.ct")){
    4.                     if(args.length == 0){
    5.                         p.sendMessage("§cFalsch! Versuch mal: /ct <Zeit> - Also z.B /ct 10" );
    6.                        
    7.                     } else {
    8.                         starter = Integer.parseInt(args[0]);
    9.                         Bukkit.broadcastMessage("             " + "§2[]----- " +"§aDer Chat wird gereinigt in: " + "§2-----[]");
    10.                         while (starter != 0) {
    11.                             Bukkit.broadcastMessage("                                 " + ChatColor.DARK_GREEN + "" + starter + "§a sekunden");
    12.                             starter--;
    13.                             try {
    14.                                 Thread.sleep(1000);
    15.                             } catch (InterruptedException e) {
    16.                                 e.printStackTrace();
    17.                             }
    18.                            
    19.                         }
    20.                         if (starter == 0) {
    21.                             Bukkit.broadcastMessage("Hier kommen noch leerzeilen hin , hab ich eben weg gemacht..");
    22.                             Bukkit.broadcastMessage("§2-----------------------------------------------------");
    23.                             p.sendMessage("        " + "§2[]-----" + "§aDer Chat wurde von §e" + p.getName() + "§2gereinigt");
    24.                             Bukkit.broadcastMessage("§2-----------------------------------------------------");                       
    25.                         }
    26.                     }
    27.                 }
    28.             }
    29.                 else {
    30.                 }
    31.                 return true;
    32.               }
    Problem: Solange der Countdown abläuft , kann niemand etwas schreiben oder einen Befehl eingeben , die Nachrichten kommen erst nach dem Countdown an.. bitte um hilfe :/


    Danke im vorraus.

    LG.
     
    #1
  2. Calenria
    Offline

    Calenria

    Registriert seit:
    28. Juli 2012
    Beiträge:
    387
    Minecraft:
    Calenria
    #2
  3. Mrcookie008
    Offline

    Mrcookie008

    Registriert seit:
    15. Dezember 2011
    Beiträge:
    380
    Ort:
    /home
    Minecraft:
    xCookieZz oder Mrcookie008 (Beides Premium)
    #3
  4. Calenria
    Offline

    Calenria

    Registriert seit:
    28. Juli 2012
    Beiträge:
    387
    Minecraft:
    Calenria
    Das ist das du den Thread Schlafen legst. wenn du das tust schläft der ganze Server, deshalb einfach in einem AsyncTask starten. Das trifft doch dein Problem recht genau oder hab ich das Falsch verstanden?

    Für AntiCaps einfach RegEx benutzen und für AntiSpam pro User nen Array mit den letzten Nachrichten speichern, sollte kein Problem sein.
     
    #4
  5. Crafter6432
    Offline

    Crafter6432

    Registriert seit:
    22. Dezember 2011
    Beiträge:
    686
    Code (Text):
    1.  
    2. private double capsPercent(String text){
    3.         double upper = 0;
    4.         double letters = 0;
    5.         for (int i = 0; i < text.length(); i++) {
    6.              if(Character.isLetter(text.charAt(i))){
    7.                  letters++;
    8.              }
    9.              if(Character.isUpperCase(text.charAt(i))){
    10.                  upper++;
    11.              }
    12.         }
    13.         return (upper/letters*100);
    14.     }
    15.  
     
    #5
  6. Mrcookie008
    Offline

    Mrcookie008

    Registriert seit:
    15. Dezember 2011
    Beiträge:
    380
    Ort:
    /home
    Minecraft:
    xCookieZz oder Mrcookie008 (Beides Premium)
    Erkennt als fehler:

    capsPercent

    und

    (upper/letters*100);


    Lösungen gibt es keine
     
    #6
  7. Chrisliebaer
    Online

    Chrisliebaer

    Wieso so aufwendig? Das geht ganz easy. Für jeden großen Buchstaben zählst du eine Variable runter (--). Und für jeden kleinen Buchstaben zählst du DIE SELBE Variable eins hoch (++)

    Wenn deine Variable > 0 => Alles okay
    Wenn deine Variable < 0 => mehr als die hälfte Caps

    Da brauchst du weder mit Gleitkommazahlen arbeiten, noch mit Prozenten rechnen.


    Und außerdem ist das was du da gemacht hast ganz gefährlich, wenn jemand eine leere Nachricht (ich denke das dürfte mit nem Hack möglich sein) oder nur Leerzeichen sendet, dann Crasht das sogar, da du dann durch 0 teilen musst.
     
    #7
  8. games6471
    Online

    games6471

    Crashen bestimmt nicht, sondern das Plugin wird tausende Exceptions schmeißen und dann wird es eventuell zu Laggs kommen aber bestimmt nicht mehr.
     
    #8
  9. Mrcookie008
    Offline

    Mrcookie008

    Registriert seit:
    15. Dezember 2011
    Beiträge:
    380
    Ort:
    /home
    Minecraft:
    xCookieZz oder Mrcookie008 (Beides Premium)
    Ich bin Anfänger und bin jetzt.. Total verwirrt^^ Könnte wer nen funktionierenden Code schicken ._.

    Danke im Vorraus :)

    LG.
     
    #9
  10. Chrisliebaer
    Online

    Chrisliebaer

    Warum auch immer ich mich gerade nicht selbst zitieren kann. Naja, Code bekommst du von mir nicht, ich finde das muss man selbst schreiben. Aber ich schon sagte:

    Die Schleife, die alle Buchstaben der Nachricht durchläuft ist schonmal richtig. Und nun kann man das aber ganz leicht vereinfachen. Dich interessiert ja garnicht, ob mehr als 50% Caps ist. Du möchtest wissen, ob mehr große, als kleine Buchstaben drin sind. Und das kannst du einfach so machen, dass du alle Buchstaben mit der Schleife prüfst:

    Für jeden großen Buchstaben zählst du eine Variable runter (--). Und für jeden kleinen Buchstaben zählst du DIE SELBE Variable eins hoch (++)

    Wenn du die Schleife verlassen hast kannst du deine Variable prüfen.

    Wenn deine Variable > 0 => Alles okay
    Wenn deine Variable < 0 => mehr als die hälfte Caps

    Wenn man das ganze in Pseudocode schreiben will:
    Code (Text):
    1.  
    2. $verhältsnis = 0;
    3. Für jeden $Buchstabe von $Nachricht;
    4. {
    5.     Wenn $Buchstabe.großerBuchstabe:
    6.         $verhältnis--;
    7.     Ansonsten:
    8.         $verhältnis++;
    9. }
    10. Wenn $verhältnis < 0:
    11.     // nachricht ist capslock
    12. Anonsten
    13.     // anchricht ist kein capslock
    14.  
    Es hilft manchmal, wenn sich sich einfach so einen String auf Papier schreibt und dann mal selbst überlegt, was der Code macht.
     
    #10
  11. psygate
    Offline

    psygate

    Registriert seit:
    24. Februar 2013
    Beiträge:
    1
    Ich glaube ja, dass man am besten lernt zu Coden, wenn man gute Beispiele vorgelegt kriegt. Manchmal hilft vollständig mehr als nur halbvollständig. Hier hab' ich dir eine meiner Klassen zusammengesucht, die genau das macht, was du willst. Die musst du theoretisch nur noch als Modul reinkloppen und passt. (solange du Bukkit verwendest.)

    Code (Text):
    1.  
    2. package com.psygate.chat.chatguards;
    3.  
    4. import java.util.HashMap;
    5.  
    6. import org.bukkit.event.EventHandler;
    7. import org.bukkit.event.player.AsyncPlayerChatEvent;
    8.  
    9. public class ChatSpamGuard {
    10.     private HashMap<String, String> messages = new HashMap<String, String>();
    11.     private HashMap<String, Integer> tokens = new HashMap<String, Integer>();
    12.    
    13.     @EventHandler
    14.     public void chatEvent(AsyncPlayerChatEvent event) {
    15.         if(checkForTriple(event)) {
    16.             event.getPlayer().sendMessage("§6Stop spamming.§6");
    17.             event.setCancelled(true);
    18.         } else if(checkForAllCaps(event)) {
    19.             event.getPlayer().sendMessage("§6Stop spamming.§6");
    20.             event.setCancelled(true);
    21.         }
    22.     }
    23.  
    24.     private boolean checkForAllCaps(AsyncPlayerChatEvent event) {
    25.         String message = event.getMessage();
    26.         float length = message.length();    //float is wichtig, sonst kriegste am Ende nichts sinnvolles raus.
    27.         int capscount = 0;
    28.         for(int i = 0; i < message.length(); i++) {
    29.             char chr = message.charAt(i);
    30.             if(chr == Character.toUpperCase(chr)) {
    31.                 capscount++;
    32.             }
    33.         }
    34.        
    35.         return ((capscount/length) >= 0.5);
    36.     }
    37.  
    38.     private boolean checkForTriple(AsyncPlayerChatEvent event) {
    39.         String message = event.getMessage();
    40.         String player = event.getPlayer().getName();
    41.         if(messages.containsKey(player) && messages.get(player).equals(message)) {
    42.             tokens.put(player, tokens.get(player) + 1);
    43.             if(tokens.get(player) >= 3) return true;
    44.         } else if(messages.containsKey(player) && !messages.get(player).equals(message)) {
    45.             tokens.put(player, 0);
    46.         } else {
    47.             messages.put(player, message);
    48.             tokens.put(player, 0);
    49.         }
    50.        
    51.         return false;
    52.     }
    53. }
    54.  
    Edit: Öha, If-Branch vergessen. Ich bin so pro -.-
     
    #11
  12. ServerPvP
    Online

    ServerPvP

    Code (Text):
    1.  
    2. public void Countdown(final int sec){
    3.         taskidcd = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new BukkitRunnable() {
    4.             int seconds = sec;
    5.             public void run(){
    6.                 if (seconds > 0){
    7.                     if (seconds == 60){
    8.                         Bukkit.getServer().broadcastMessage("§7[§cCount§aDown§7] §aNoch §6" + seconds + " §aSekunden!");
    9.                     }
    10.                     if (seconds == 30){
    11.                         Bukkit.getServer().broadcastMessage("§7[§cCount§aDown§7] §aNoch §6" + seconds + " §aSekunden!");
    12.                     }
    13.                     if (seconds == 10){
    14.                         Bukkit.getServer().broadcastMessage("§7[§cCount§aDown§7] §aNoch §6" + seconds + " §aSekunden!");
    15.                     }
    16.                     if (seconds == 5){
    17.                         Bukkit.getServer().broadcastMessage("§7[§cCount§aDown§7] §aNoch §6" + seconds + " §aSekunden!");
    18.                     }
    19.                     if (seconds <= 3){
    20.                         Bukkit.getServer().broadcastMessage("§7[§cCount§aDown§7] §aNoch §6" + seconds +  (seconds == 1 ? " §aSekunde!" : " §aSekunden!"));
    21.                     }
    22.                     seconds--;
    23.                 }else{
    24.                     Bukkit.getServer().broadcastMessage("§7[§cCount§aDown§7] §aDie Zeit ist abgelaufen!");
    25.                     Bukkit.getScheduler().cancelTask(taskidcd);
    26.                     taskidcd = 0;
    27.                    }
    28.                 }
    29.         },0L, 20L);
    30.     }
    31.  
    Den Main Thread kann man nicht zum schlafen setzen. Dafür benutzt man SyncDelayedTasks.
    Falls welche wieder fragen:
    - BukkitRunnable statt Runnable da BukkitRunnable bei einem Reload auch entgültig gestoppt wird
    - final int sec da die Variabel "sec" nicht mehr modifiziert wird
    - Dies ist eine Methode, man muss sie mit zB CountDown(5); ausführen

    MfG ServerPvP
     
    #12