Protected!

Hier könnt ihr eure selbstgeschriebenen Plugins veröffentlichen.

Protected!

Beitragvon ilouHD » So 19. Okt 2014, 21:10

Hallo zusammen,

ich überarbeite ab morgen mein PermissionsSystem 'Protected!'. Die neue Version, also die BETA, wird dann noch mehr Features mit sich bringen, wie zum Beispiel das Demoten von Spielern, direktes setzen der Gruppen, ...

Die ALPHA will ich euch dafür hier jetzt mal geben, damit ihr nicht auf PermisisonsEX oder so zurückgreifen müsst.

Als erstes benötigt ihr einmal MySQL.class, die so aufgebaut ist, wie die von @PostCrafter. Ich werde euch meine (die glaube ich von PostCrafter kopiert wurde *copy'n'paste*) hier mal bereit stellen:
Code: Alles auswählen
  1. package de.CaveMC.CaveMC.MySQL;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.sql.Connection;
  5. import java.sql.DriverManager;
  6. import java.sql.PreparedStatement;
  7. import java.sql.ResultSet;
  8. import java.sql.SQLException;
  9. import org.bukkit.Bukkit;
  10. import org.bukkit.configuration.file.FileConfiguration;
  11. import org.bukkit.configuration.file.YamlConfiguration;
  12. import de.CaveMC.CaveMC.main.CaveMC;
  13. public class MySQL {
  14.    private String host;
  15.    private int port;
  16.    private String user;
  17.    private String password;
  18.    private String database;
  19.    
  20.    public static Connection conn;
  21.    
  22.    public MySQL() throws Exception {
  23.       File file = new File("plugins/CaveMC/", "config.yml");
  24.       FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
  25.       String db = "database.";
  26.       
  27.       if(!file.exists()) {
  28.          cfg.addDefault(db + "host", "localhost");
  29.          cfg.addDefault(db + "port", 3306);
  30.          cfg.addDefault(db + "user", "user");
  31.          cfg.addDefault(db + "password", "password");
  32.          cfg.addDefault(db + "database", "database");
  33.          cfg.options().copyDefaults(true);
  34.          try {
  35.             cfg.save(file);
  36.          } catch (IOException e) {
  37.             Bukkit.getConsoleSender().sendMessage(CaveMC.prefix_MySQL + "§cCan't create config-File!");
  38.             e.printStackTrace();
  39.          }
  40.       }
  41.       
  42.       this.host = cfg.getString(db + "host");
  43.       this.port = cfg.getInt(db + "port");
  44.       this.user = cfg.getString(db + "user");
  45.       this.password = cfg.getString(db + "password");
  46.       this.database = cfg.getString(db + "database");
  47.       
  48.       this.openConnection();
  49.    }
  50.    
  51.    public Connection openConnection() throws Exception {
  52.       Class.forName("com.mysql.jdbc.Driver");
  53.       Connection conn = DriverManager.getConnection("jdbc:mysql://" + this.host + ":" + this.port + "/" + this.database, this.user, this.password);
  54.       MySQL.conn = conn;
  55.       return conn;
  56.    }
  57.    
  58.    public Connection getConnection() {
  59.       return MySQL.conn;
  60.    }
  61.    
  62.    public boolean hasConnection() {
  63.       try {
  64.          return MySQL.conn != null || MySQL.conn.isValid(1);
  65.       } catch (SQLException e) {
  66.          return false;
  67.       }
  68.    }
  69.    
  70.    public void queryUpdate(String query) {
  71.       Connection conn = MySQL.conn;
  72.       PreparedStatement st = null;
  73.       try {
  74.          st = conn.prepareStatement(query);
  75.          st.executeUpdate();
  76.       } catch (SQLException e) {
  77.          Bukkit.getConsoleSender().sendMessage("§c§lFailed to send update '§7" + query + "§c§l'.");
  78.       } finally {
  79.          this.closeRessources(null, st);
  80.       }
  81.    }
  82.    
  83.    
  84.    
  85.    public void closeRessources(ResultSet rs, PreparedStatement st) {
  86.       if (rs != null) {
  87.          try {
  88.             rs.close();
  89.          } catch (SQLException e) {
  90.             Bukkit.getConsoleSender().sendMessage(CaveMC.prefix_MySQL + "§cCan't close MYSQL-Ressources!");
  91.          }
  92.       }
  93.       if (st != null) {
  94.          try {
  95.             st.close();
  96.          } catch (SQLException e) {
  97.             Bukkit.getConsoleSender().sendMessage(CaveMC.prefix_MySQL + "§cCan't close MYSQL-Ressources!");
  98.          }
  99.       }
  100.    }
  101.    
  102.    public void closeConnection() {
  103.       try {
  104.          MySQL.conn.close();
  105.       } catch (SQLException e) {
  106.          Bukkit.getConsoleSender().sendMessage(CaveMC.prefix_MySQL + "§cCan't close MYSQL-Connection!");
  107.       } finally {
  108.          MySQL.conn = null;
  109.       }
  110.    }
  111. }


Nun brauchen wir eine Klasse, für die Ränge. Wie man sehen kann, ist alles hardgecodet, was aber hier nun nicht als schlimm gesehen werden sollte:
Code: Alles auswählen
  1. package de.CaveMC.CaveMC.Rank;
  2. import de.CaveMC.CaveMC.MySQL.MySQL;
  3. import de.CaveMC.CaveMC.main.CaveMC;
  4. import java.sql.*;
  5. import org.bukkit.entity.Player;
  6. public class Ranks {
  7.     public static void promote(Player p) {
  8.         try {
  9.             Statement st = MySQL.conn.createStatement();
  10.             if(!hasSpecialRank(p)) {
  11.                 st.executeUpdate("UPDATE Player SET Rang = 'Premium' WHERE UUID = '" + p.getUniqueId() + "'");
  12.                 p.sendMessage(CaveMC.prefix + "Du hast den Rang §6Premium §3erhalten!");
  13.             } else if(getRank(p).equalsIgnoreCase("Premium")) {
  14.                 st.executeUpdate("UPDATE Player SET Rang = 'YouTuber' WHERE UUID = '" + p.getUniqueId() + "'");
  15.                 p.sendMessage(CaveMC.prefix + "Du hast den Rang §5YouTuber §3erhalten!");
  16.             } else if(getRank(p).equalsIgnoreCase("YouTuber")) {
  17.                 st.executeUpdate("UPDATE Player SET Rang = 'Supporter' WHERE UUID = '" + p.getUniqueId() + "'");
  18.                 p.sendMessage(CaveMC.prefix + "Du hast den Rang §2Supporter §3erhalten!");
  19.             } else if(getRank(p).equalsIgnoreCase("Supporter")) {
  20.                 st.executeUpdate("UPDATE Player SET Rang = 'Developer' WHERE UUID = '" + p.getUniqueId() + "'");
  21.                 p.sendMessage(CaveMC.prefix + "Du hast den Rang §3Developer §3erhalten!");
  22.             } else if(getRank(p).equalsIgnoreCase("Developer"))
  23.                 st.executeUpdate("UPDATE Player SET Rang = 'Admin' WHERE UUID = '" + p.getUniqueId() + "'");
  24.             p.sendMessage(CaveMC.prefix + "Du hast den Rang §4Admin §3erhalten!");
  25.         } catch(SQLException sqlexception) {
  26.            
  27.         }
  28.     }
  29.     public static String getRank(Player p) {
  30.         String rang = "";
  31.         ResultSet rs = null;
  32.         try {
  33.             Statement st = MySQL.conn.createStatement();
  34.             rs = st.executeQuery("SELECT * FROM Player WHERE UUID='" + p.getUniqueId() + "'");
  35.             if(hasSpecialRank(p)) {
  36.                 while(rs.next())
  37.                     rang = rs.getString(2);
  38.                 return rang;
  39.             }
  40.         } catch(SQLException sqlexception) {
  41.            
  42.         }
  43.         return "Player";
  44.     }
  45.     public static boolean hasSpecialRank(Player p) {
  46.         ResultSet rs = null;
  47.         Statement st;
  48.       try {
  49.          st = MySQL.conn.createStatement();
  50.          
  51.          rs = st.executeQuery("SELECT * FROM Player WHERE UUID='" + p.getUniqueId() + "'");
  52.            while(rs.next())
  53.                if(rs != null)
  54.                    return true;
  55.       } catch (SQLException e) {
  56.          e.printStackTrace();
  57.       }
  58.         return false;
  59.     }
  60. }


und hier ein Beispiel, wie man die Leute promoted:
Code: Alles auswählen
  1. package de.CaveMC.CaveMC.commands;
  2. import org.bukkit.Bukkit;
  3. import org.bukkit.command.Command;
  4. import org.bukkit.command.CommandExecutor;
  5. import org.bukkit.command.CommandSender;
  6. import org.bukkit.entity.Player;
  7. import de.CaveMC.CaveMC.Rank.Ranks;
  8. import de.CaveMC.CaveMC.main.CaveMC;
  9. public class PromoteCMD implements CommandExecutor {
  10.    @Override
  11.    public boolean onCommand(CommandSender cs, Command cmd, String label, String[] args) {
  12.       if(cmd.getName().equalsIgnoreCase("promote")) {
  13.          if(cs instanceof Player){
  14.             Player p = (Player) cs;
  15.             if(Ranks.getRank(p).equalsIgnoreCase("Admin")) {
  16.                if(args.length == 1) {
  17.                   Player target = Bukkit.getPlayerExact(args[0]);
  18.                   Ranks.promote(target);
  19.                } else {
  20.                   p.sendMessage(CaveMC.prefix + "Bitte verwende §6/promote <Player>");
  21.                }
  22.             } else {
  23.                p.sendMessage(CaveMC.prefix + "Dafür benötigst du den Rang §6Admin");
  24.             }
  25.          } else {
  26.             cs.sendMessage(CaveMC.ERROR.NO_PLAYER);
  27.          }
  28.       }
  29.       return true;
  30.    }
  31. }


Die angegebenen Strings als Prefix, bzw. Message sind hier aufzufinden:
Code: Alles auswählen
  1. public static final String prefix = "§9§lCaveMC §7§l» §3";
  2.    public static final String prefix_MySQL = "§3MySQL §6» §3";
  3.    
  4.    public class ERROR {
  5.       public static final String NO_PERMISSIONS = CaveMC.prefix + "§cDas darfst du nicht!";
  6.       public static final String NO_PLAYER = CaveMC.prefix + "§cDu bist kein Spieler!";
  7.    }
  8.    
  9.    public class MySQLMessages {
  10.       public static final String NO_CONNECTION = "§c[§4§l!§c] " + CaveMC.prefix_MySQL + "Keine Verbindung zu MySQL-Servern!";
  11.       public static final String CONNECTION_OPENED = "§a[§2§l!§a] " + CaveMC.prefix_MySQL + "Verbindung zu MySQL-Servern aufgebaut!";
  12.       public static final String CONNECTION_UNAVAILABLE = "§c[§4§l!§c] " + CaveMC.prefix_MySQL + "MySQL-Server unerreichbar!";
  13.    }

Das war es auch schon von 'Promoted!'

Mit freundlichen Grüßen,
ilouHD
Bild
Benutzeravatar
ilouHD
 
Beiträge: 1733
Registriert: Do 9. Jan 2014, 14:49

Re: Protected!

Beitragvon PostCrafter » So 19. Okt 2014, 21:42

Und was hat das jetzt mit einem Permissions-Plugin zu tun? Bisher erkenne ich hauptsächlich SQL-Queries, die Spielern irgendwelche Strings setzen, von Permissions ist weit und breit nichts zu sehen.
TeamSpeak-Server zur freien Nutzung: postcrafter.de
Benutzeravatar
PostCrafter
Administrator
 
Beiträge: 1443
Registriert: Do 6. Jun 2013, 19:16
Wohnort: Ebersberg

Re: Protected!

Beitragvon ilouHD » So 19. Okt 2014, 22:27

PostCrafter hat geschrieben:Und was hat das jetzt mit einem Permissions-Plugin zu tun? Bisher erkenne ich hauptsächlich SQL-Queries, die Spielern irgendwelche Strings setzen, von Permissions ist weit und breit nichts zu sehen.


Man fragt nun ab, ob der Spieler den entsprechenden Rang hat, statt die Permission. Ich hätte es glaube ich eher Rängesystem nennen sollen.

Ausserdem, was mir gerade noch auffiel, ist, dass die Tabelle Player aus UUID VARCHAR(255) und Rang VARCHAR(255) besteht. Entweder ihr ändert es, oder erstellt die notwendige Tabelle und ändert es in den Klassen.
Bild
Benutzeravatar
ilouHD
 
Beiträge: 1733
Registriert: Do 9. Jan 2014, 14:49

Re: Protected!

Beitragvon Sep2703 » Mo 20. Okt 2014, 07:55

Also dann verwende ich lieber PermissionsEx...

- Deine Ränge sind hardgecoded (Ja, ich will kein Netzwerk aufmachen und für mein Konzept brauche ich ganz andere Ränge)
- Es gibt keine Permissions, die universell einsetzbar sind -> Alle Plugins sind an deine API gebunden
- Bei der closeResources()-Methode wird ein PreparedStatement-Objekt als Parameter erwartet. Und du arbeitest mit normalen Statements?! Ich würde mich da mal entscheiden (Oder der Code mit den PreparedStatements kommt von Postcrafter und der Rest von dir...)
- Das Plugin müsste für einen richtigen Einsatz weitaus umfangreicher sein
- Die Rechenoperation sind nicht asynchron

Fazit:
Leider muss ich sagen, dass mir das Plugin nicht ausreicht. Ich weiß nicht, wie es den anderen geht. Es bietet mir eine zu geringe Flexibilität und unterstützt viele Features, die beispielsweise PermissionsEx oder zPermissions unterstützen, nicht. Hinzukommt, dass als UUID die Entity-UUID des jeweiligen Spielers verwendet wird. Da bringt dann auch der ganze MySQL-Kram nichts, da diese sowieso von Server zu Server variiert.
Du möchtest programmieren lernen oder dein Bukkit-/Spigot-Wissen erweitern?
Hier habe ich für dich kostenlose Tutorials: https://youtube.com/janhektor
Benutzeravatar
Sep2703
 
Beiträge: 677
Registriert: Mi 8. Jan 2014, 15:13
Wohnort: 127.0.0.1

Re: Protected!

Beitragvon ilouHD » Mo 20. Okt 2014, 12:15

Sep2703 hat geschrieben:Also dann verwende ich lieber PermissionsEx...

- Deine Ränge sind hardgecoded (Ja, ich will kein Netzwerk aufmachen und für mein Konzept brauche ich ganz andere Ränge)
- Es gibt keine Permissions, die universell einsetzbar sind -> Alle Plugins sind an deine API gebunden
- Bei der closeResources()-Methode wird ein PreparedStatement-Objekt als Parameter erwartet. Und du arbeitest mit normalen Statements?! Ich würde mich da mal entscheiden (Oder der Code mit den PreparedStatements kommt von Postcrafter und der Rest von dir...)
- Das Plugin müsste für einen richtigen Einsatz weitaus umfangreicher sein
- Die Rechenoperation sind nicht asynchron

Fazit:
Leider muss ich sagen, dass mir das Plugin nicht ausreicht. Ich weiß nicht, wie es den anderen geht. Es bietet mir eine zu geringe Flexibilität und unterstützt viele Features, die beispielsweise PermissionsEx oder zPermissions unterstützen, nicht. Hinzukommt, dass als UUID die Entity-UUID des jeweiligen Spielers verwendet wird. Da bringt dann auch der ganze MySQL-Kram nichts, da diese sowieso von Server zu Server variiert.

Das Plugin ist aber auch ca. Ein halbes Jahr alt.
Bild
Benutzeravatar
ilouHD
 
Beiträge: 1733
Registriert: Do 9. Jan 2014, 14:49

Re: Protected!

Beitragvon killer32kingXD » Mo 20. Okt 2014, 15:36

Nice

Ich hoffe ich bin irgendwan auch mal in der lage so ein großes Plugin zu machen ^^.
Viel Glück noch.

lg killer32kingXD
Benutzeravatar
killer32kingXD
 
Beiträge: 66
Registriert: Fr 23. Mai 2014, 20:03

Re: Protected!

Beitragvon ilouHD » Mo 20. Okt 2014, 15:44

Naja, Groß ist es nicht. Es besteht aus ner MySQL-class und ner Rank.class, die fürs promoten sorgt (und hardgecodet ist, was sich jedoch ändern wird). Das ist auch der Grund der Überarbeitung. Zu wenig Optionen, zu hardgecodet, es wird nun mit PlayerID's gearbeitet, statt mit UUID, ...

Auch wenn manche aus diesem dieses 'Rängesystem' sch**e finden. Aber man muss sagen, dass ich mich damit vor nem halben Jahr kaum auskannte. Programmiere ja jetzt erst seit ~0,75 Jahren.
Bild
Benutzeravatar
ilouHD
 
Beiträge: 1733
Registriert: Do 9. Jan 2014, 14:49

Re: Protected!

Beitragvon Jofkos » Mo 20. Okt 2014, 16:33

Sep2703 hat geschrieben:Entity-UUID des jeweiligen Spielers verwendet wird. Da bringt dann auch der ganze MySQL-Kram nichts, da diese sowieso von Server zu Server variiert.
Das wäre witzlos wenn es so wäre. Wenn die UUID von Server zu Server unteschiedlich wäre, könnte man diese auch gleich weglassen.
Jeder Minecraft-Account hat eine UUID, und diese ändert sich nicht.
Zuletzt geändert von Jofkos am Mo 20. Okt 2014, 17:41, insgesamt 1-mal geändert.
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: Protected!

Beitragvon ilouHD » Mo 20. Okt 2014, 16:40

Jofkos hat geschrieben:
Sep2703 hat geschrieben:Entity-UUID des jeweiligen Spielers verwendet wird. Da bringt dann auch der ganze MySQL-Kram nichts, da diese sowieso von Server zu Server variiert.
Das wäre witzlos wenn es so wäre. Wenn die UUID von Server zu Server unteschiedlich wäre, könnte man diese auch gleich weglassen.


Ausserdem, wird die UUID von Mojang gesetzt:
https://api.mojang.com/users/profiles/minecraft/ilouHD

Sonst stände sie nicht da.
Bild
Benutzeravatar
ilouHD
 
Beiträge: 1733
Registriert: Do 9. Jan 2014, 14:49

Re: Protected!

Beitragvon Sep2703 » Mo 20. Okt 2014, 18:28

Ja, aber wenn du die Mojang-UUID mit der von Bukkit vergleichst, sind diese unterschiedlich.
Zumindest habe ich zwei Test-Server und dasselbe Plugin gibt mir zwei verschiedene Werte.
Du möchtest programmieren lernen oder dein Bukkit-/Spigot-Wissen erweitern?
Hier habe ich für dich kostenlose Tutorials: https://youtube.com/janhektor
Benutzeravatar
Sep2703
 
Beiträge: 677
Registriert: Mi 8. Jan 2014, 15:13
Wohnort: 127.0.0.1

Nächste

Zurück zu Veröffentlichungen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron