Add marriage list command

This commit is contained in:
Lennart ten Wolde 2015-01-09 18:27:08 +01:00
parent 8ba4d385b1
commit bfed27fd81
6 changed files with 145 additions and 2 deletions

View file

@ -8,6 +8,7 @@ import org.bukkit.plugin.Plugin;
import com.lenis0012.bukkit.marriage2.commands.Command;
import com.lenis0012.bukkit.marriage2.misc.BConfig;
import com.lenis0012.bukkit.marriage2.misc.ListQuery;
public interface Marriage {
/**
@ -26,6 +27,16 @@ public interface Marriage {
*/
MPlayer getMPlayer(UUID uuid);
/**
* Get a list of all married players.
* Note: This is IO, so please put it on an async task.
*
* @param scale Amount of results per page.
* @param page The page you want to fetch
* @return Fetched page of marriages list
*/
ListQuery getMarriageList(int scale, int page);
/**
* Marry 2 players to eachother.
*

View file

@ -0,0 +1,35 @@
package com.lenis0012.bukkit.marriage2.commands;
import org.bukkit.Bukkit;
import com.lenis0012.bukkit.marriage2.Marriage;
import com.lenis0012.bukkit.marriage2.config.Message;
import com.lenis0012.bukkit.marriage2.misc.ListQuery;
public class CommandList extends Command {
public CommandList(Marriage marriage, String[] aliases) {
super(marriage, aliases);
setDescription("View a list of all married players");
setUsage("[page]");
setAllowConsole(true);
}
@Override
public void execute() {
reply(Message.FETCHING_LIST);
final int page = getArgLength() > 0 ? getArgAsInt(0) : 1;
if(page < 1) {
reply(Message.NEGATIVE_NUMBER);
}
Bukkit.getScheduler().runTaskAsynchronously(marriage.getPlugin(), new Runnable() {
@Override
public void run() {
final ListQuery list = marriage.getMarriageList(10, page - 1);
list.send(sender);
}
});
}
}

View file

@ -17,7 +17,10 @@ public enum Message {
ITEM_GIFTED("&aYou have given %s of %s to your partner!"),
GIFT_RECEIVED("&aYou have received %s of %s as a gift from your partner!"),
PARTNER_NOT_ONLINE("&cYour partner is currently not online!"),
HOME_SET("&aYou have set a home for your marriage!");
FETCHING_LIST("&eFetching player marriage list..."),
HOME_SET("&aYou have set a home for your marriage!"),
INVALID_FORMAT("&cThe argument could not be parsed to an integer!"),
NEGATIVE_NUMBER("&cYou must enter a positive number!");
private final String defaultMessage;
private String message;

View file

@ -17,6 +17,7 @@ import com.lenis0012.bukkit.marriage2.internal.data.DataManager;
import com.lenis0012.bukkit.marriage2.internal.data.MarriageData;
import com.lenis0012.bukkit.marriage2.internal.data.MarriagePlayer;
import com.lenis0012.bukkit.marriage2.listeners.DatabaseListener;
import com.lenis0012.bukkit.marriage2.misc.ListQuery;
public class MarriageCore extends MarriageBase {
private final Map<UUID, MarriagePlayer> players = Collections.synchronizedMap(new HashMap<UUID, MarriagePlayer>());
@ -69,4 +70,9 @@ public class MarriageCore extends MarriageBase {
((MarriagePlayer) player1).addMarriage(mdata);
((MarriagePlayer) player2).addMarriage(mdata);
}
@Override
public ListQuery getMarriageList(int scale, int page) {
return dataManager.listMarriages(page, page);
}
}

View file

@ -7,12 +7,16 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import org.bukkit.configuration.file.FileConfiguration;
import com.lenis0012.bukkit.marriage2.MData;
import com.lenis0012.bukkit.marriage2.internal.MarriageCore;
import com.lenis0012.bukkit.marriage2.misc.ListQuery;
public class DataManager {
private final MarriageCore core;
@ -100,7 +104,7 @@ public class DataManager {
private void loadMarriages(Connection connection, MarriagePlayer player, boolean alt) throws SQLException {
PreparedStatement ps = connection.prepareStatement(String.format(
"SELECT * FROM %sdata WHERE %s=?;", alt ? "player2" : "player1", prefix));
"SELECT * FROM %sdata WHERE %s=?;", prefix, alt ? "player2" : "player1", prefix));
ResultSet result = ps.executeQuery();
while(result.next()) {
player.addMarriage(new MarriageData(result));
@ -111,6 +115,39 @@ public class DataManager {
}
}
public ListQuery listMarriages(int scale, int page) {
Connection connection = newConnection();
try {
// Count rows to get amount of pages
PreparedStatement ps = connection.prepareStatement("SELECT COUNT(*) FROM " + prefix + "data;");
ResultSet result = ps.executeQuery();
int pages = (int) Math.ceil(result.getInt("COUNT") / (double) scale);
// Fetch te right page
ps = connection.prepareStatement(String.format(
"SELECT * FROM %sdata ORDER BY id DESC LIMIT %s OFFSET %s;", prefix, scale, scale * page));
result = ps.executeQuery();
List<MData> list = new ArrayList<MData>();
while(result.next()) {
list.add(new MarriageData(result));
}
return new ListQuery(pages, page, list);
} catch (SQLException e) {
core.getLogger().log(Level.WARNING, "Failed to load marriage list", e);
return new ListQuery(0, 0, new ArrayList<MData>());
} finally {
if(connection != null) {
try {
connection.close();
} catch (SQLException e) {
;
}
}
}
}
private Connection newConnection() {
try {
return DriverManager.getConnection(url);

View file

@ -0,0 +1,51 @@
package com.lenis0012.bukkit.marriage2.misc;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.scheduler.BukkitRunnable;
import com.lenis0012.bukkit.marriage2.MData;
import com.lenis0012.bukkit.marriage2.internal.MarriagePlugin;
public class ListQuery {
private final int pages;
private final int page;
private final List<MData> marriages;
public ListQuery(int pages, int page, List<MData> marriages) {
this.pages = pages;
this.page = page;
this.marriages = marriages;
}
public void send(final CommandSender to) {
new BukkitRunnable() {
@Override
public void run() {
to.sendMessage(ChatColor.GOLD + ChatColor.BOLD.toString() + "Married players:");
to.sendMessage(ChatColor.GOLD + "Page " + page + "/" + pages);
for(MData data : marriages) {
OfflinePlayer player1 = Bukkit.getOfflinePlayer(data.getPlayer1Id());
OfflinePlayer player2 = Bukkit.getOfflinePlayer(data.getPllayer2Id());
to.sendMessage(ChatColor.GREEN + player1.getName() + " + " + player2.getName());
}
}
}.runTask(MarriagePlugin.getInstance().getPlugin());
}
public int getPages() {
return pages;
}
public int getPage() {
return page;
}
public List<MData> getMarriages() {
return marriages;
}
}