MmoupdateCommand.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package com.gmail.nossr50.commands.database;
  2. import java.util.List;
  3. import org.bukkit.command.Command;
  4. import org.bukkit.command.CommandSender;
  5. import org.bukkit.command.TabExecutor;
  6. import org.bukkit.entity.Player;
  7. import com.gmail.nossr50.mcMMO;
  8. import com.gmail.nossr50.config.Config;
  9. import com.gmail.nossr50.database.DatabaseManager;
  10. import com.gmail.nossr50.database.DatabaseManagerFactory;
  11. import com.gmail.nossr50.datatypes.player.PlayerProfile;
  12. import com.gmail.nossr50.locale.LocaleLoader;
  13. import com.gmail.nossr50.runnables.database.ConversionTask;
  14. import com.gmail.nossr50.util.player.UserManager;
  15. import com.google.common.collect.ImmutableList;
  16. public class MmoupdateCommand implements TabExecutor {
  17. @Override
  18. public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
  19. switch (args.length) {
  20. case 1:
  21. String argType = args[0];
  22. String oldType = validateName(sender, args[0]);
  23. if (oldType == null) {
  24. return true;
  25. }
  26. String newType = getCurrentDb();
  27. if (newType.equals(oldType)) {
  28. sender.sendMessage(LocaleLoader.getString("Commands.mmoupdate.Same", argType));
  29. return true;
  30. }
  31. DatabaseManager oldDb;
  32. if (oldType.equals("sql")) {
  33. oldDb = DatabaseManagerFactory.createSQLDatabaseManager();
  34. }
  35. else if (oldType.equals("flatfile")) {
  36. oldDb = DatabaseManagerFactory.createFlatfileDatabaseManager();
  37. }
  38. else try {
  39. @SuppressWarnings("unchecked")
  40. Class<? extends DatabaseManager> clazz = (Class<? extends DatabaseManager>) Class.forName(oldType);
  41. oldDb = DatabaseManagerFactory.createCustomDatabaseManager(clazz);
  42. oldType = clazz.getSimpleName(); // For pretty-printing; we have the database now
  43. }
  44. catch (Throwable e) {
  45. return false;
  46. }
  47. sender.sendMessage(LocaleLoader.getString("Commands.mmoupdate.Start", oldType, newType));
  48. // Convert the online players right away, without waiting
  49. // first, flush out the current data
  50. UserManager.saveAll();
  51. UserManager.clearAll();
  52. for (Player player : mcMMO.p.getServer().getOnlinePlayers()) {
  53. // Get the profile from the old database and save it in the new
  54. PlayerProfile profile = oldDb.loadPlayerProfile(player.getName(), false);
  55. if (profile.isLoaded()) {
  56. mcMMO.getDatabaseManager().saveUser(profile);
  57. }
  58. // Reload from the current database via UserManager
  59. UserManager.addUser(player);
  60. }
  61. // Schedule the task for all users
  62. new ConversionTask(oldDb, sender, oldType, newType).runTaskAsynchronously(mcMMO.p);
  63. return true;
  64. default:
  65. break;
  66. }
  67. return false;
  68. }
  69. /**
  70. * @return null - if type not recognized / class not found
  71. * empty string - if type is same as current
  72. * normalized string - if type is recognized
  73. */
  74. private String validateName(CommandSender sender, String type) {
  75. if (type.equalsIgnoreCase("sql") || type.equalsIgnoreCase("mysql")) {
  76. return "sql";
  77. }
  78. if (type.equalsIgnoreCase("flatfile") || type.equalsIgnoreCase("file")) {
  79. return "flatfile";
  80. }
  81. try {
  82. Class<?> clazz = Class.forName(type);
  83. if (!DatabaseManager.class.isAssignableFrom(clazz)) {
  84. sender.sendMessage(LocaleLoader.getString("Commands.mmoupdate.InvalidType", type));
  85. return null;
  86. }
  87. return type;
  88. }
  89. catch (Exception e) {
  90. sender.sendMessage(LocaleLoader.getString("Commands.mmoupdate.InvalidType", type));
  91. return null;
  92. }
  93. }
  94. private String getCurrentDb() {
  95. if (DatabaseManagerFactory.getCustomDatabaseManagerClass() != null) {
  96. return DatabaseManagerFactory.getCustomDatabaseManagerClass().getSimpleName();
  97. }
  98. return Config.getInstance().getUseMySQL() ? "sql" : "flatfile";
  99. }
  100. @Override
  101. public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
  102. Class<?> clazz = DatabaseManagerFactory.getCustomDatabaseManagerClass();
  103. if (clazz != null) {
  104. return ImmutableList.of("flatfile", "sql", clazz.getName());
  105. }
  106. return ImmutableList.of("flatfile", "sql");
  107. }
  108. }