Skip to content

Commit

Permalink
Add /vote top
Browse files Browse the repository at this point in the history
  • Loading branch information
ProjectInfinity committed Apr 24, 2018
1 parent 8777eaf commit f3b4bd9
Show file tree
Hide file tree
Showing 7 changed files with 118 additions and 27 deletions.
5 changes: 3 additions & 2 deletions src/main/java/io/pocketvote/PocketVote.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import cn.nukkit.scheduler.TaskHandler;
import cn.nukkit.utils.ConfigSection;
import cn.nukkit.utils.TextFormat;
import io.pocketvote.cmd.VoteCommand;
import io.pocketvote.listener.VoteListener;
import io.pocketvote.cmd.PocketVoteCommand;
import io.pocketvote.task.ExpireVotesTask;
Expand Down Expand Up @@ -55,7 +56,6 @@ public void onEnable() {
/*
* List of things I need to do.
* TODO: Add GURU support.
* TODO: Add TopVoter
* TODO: Add Vote link.
* TODO: Add diagnose.
* TODO: Add heartbeat.
Expand All @@ -77,6 +77,7 @@ public void onEnable() {

getServer().getPluginManager().registerEvents(new VoteListener(plugin), plugin);
getServer().getCommandMap().register("pocketvote", new PocketVoteCommand(plugin));
getServer().getCommandMap().register("vote", new VoteCommand(plugin));

/* Register tasks */
tasks = new ArrayList<>();
Expand Down Expand Up @@ -168,7 +169,7 @@ public VoteManager getVoteManager() {
return vm;
}

public void updateConfig() {
private void updateConfig() {
if(plugin.getConfig().getInt("version", 1) == 1) {
getLogger().info(TextFormat.YELLOW + "Migrating config to version 2.");
getConfig().set("multi-server.enabled", false);
Expand Down
37 changes: 37 additions & 0 deletions src/main/java/io/pocketvote/cmd/VoteCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package io.pocketvote.cmd;

import cn.nukkit.command.Command;
import cn.nukkit.command.CommandSender;
import cn.nukkit.command.PluginIdentifiableCommand;
import cn.nukkit.plugin.Plugin;
import cn.nukkit.utils.TextFormat;
import io.pocketvote.PocketVote;
import io.pocketvote.task.TopVoterTask;

public class VoteCommand extends Command implements PluginIdentifiableCommand {

private PocketVote plugin;

public VoteCommand(PocketVote plugin) {
super("vote", "PocketVote vote command", "/vote [top]", new String[]{"v"});
this.plugin = plugin;
}

@Override
public boolean execute(CommandSender sender, String s, String[] args) {
if(!sender.hasPermission("pocketvote.vote")) {
sender.sendMessage(TextFormat.RED + "You do not have permission to use /vote.");
return true;
}
if(args.length > 0 && args[0].equalsIgnoreCase("TOP")) {
plugin.getServer().getScheduler().scheduleAsyncTask(plugin, new TopVoterTask(plugin, sender.getName()));
return true;
}
return false; // TODO: Add vote link here when "top" is not specified.
}

@Override
public Plugin getPlugin() {
return plugin;
}
}
21 changes: 11 additions & 10 deletions src/main/java/io/pocketvote/task/ApiRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,25 +21,22 @@ public class ApiRequest extends AsyncTask {

private String url;
private String method;
private String action;
private HashMap<String, String> postFields;
private String identity;
private String secret;
private String version;

public ApiRequest(String url, String method, HashMap<String, String> postFields) {
public ApiRequest(String url, String method, String action, HashMap<String, String> postFields) {
this.url = url;
this.method = method;
this.action = action;
this.postFields = postFields;
this.identity = PocketVote.getPlugin().identity;
this.secret = PocketVote.getPlugin().secret;
this.version = PocketVote.getPlugin().getDescription().getVersion();
}

/*@Override
public void onRun() {
// Overridden by the extending class.
}*/

@Override
public void onRun() {
HttpURLConnection con;
Expand Down Expand Up @@ -93,10 +90,14 @@ public void onRun() {
return;
}

// Only a successful API request can reach this.
if(result.hasPayload()) {
Jws<Claims> claims = Jwts.parser().setSigningKey(secret.getBytes("UTF-8")).parseClaimsJws(json.get("payload").asText());
result.setClaims(claims.getBody(), true);
switch(action) {
case "VOTE":
// Only a successful API request can reach this.
if(result.hasPayload()) {
Jws<Claims> claims = Jwts.parser().setSigningKey(secret.getBytes("UTF-8")).parseClaimsJws(json.get("payload").asText());
result.setClaims(claims.getBody(), true);
}
break;
}

setResult(result);
Expand Down
4 changes: 1 addition & 3 deletions src/main/java/io/pocketvote/task/SchedulerTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,9 @@
public class SchedulerTask extends Task {

private PocketVote plugin;
private String version;

public SchedulerTask(PocketVote plugin) {
this.plugin = plugin;
this.version = plugin.getDescription().getVersion();
}

@Override
Expand All @@ -19,7 +17,7 @@ public void onRun(int i) {

if(!plugin.multiserver || plugin.multiserverRole.equalsIgnoreCase("master")) {
if(plugin.secret != null && !plugin.secret.isEmpty() && plugin.identity != null && !plugin.identity.isEmpty()) {
plugin.getServer().getScheduler().scheduleAsyncTask(plugin, new VoteCheckTask(plugin, plugin.identity, plugin.secret, version));
plugin.getServer().getScheduler().scheduleAsyncTask(plugin, new VoteCheckTask(plugin));
} else {
plugin.getLogger().critical("Please finish configuring PocketVote, then restart your server.");
}
Expand Down
59 changes: 59 additions & 0 deletions src/main/java/io/pocketvote/task/TopVoterTask.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package io.pocketvote.task;

import cn.nukkit.Server;
import cn.nukkit.command.CommandSender;
import cn.nukkit.command.ConsoleCommandSender;
import cn.nukkit.utils.TextFormat;
import com.fasterxml.jackson.databind.JsonNode;
import io.pocketvote.PocketVote;
import io.pocketvote.data.TaskResult;

public class TopVoterTask extends ApiRequest {

private final String player;

public TopVoterTask(PocketVote plugin, String player) {
super(plugin.isDev() ? "http://127.0.0.1:9000/v2/top/10" : "https://api.pocketvote.io/v2/top/10", "GET", "TOP", null);
this.player = player;

plugin.getLogger().debug("Getting top voters.");
}

@Override
public void onCompletion(Server server) {
CommandSender player = this.player.equalsIgnoreCase("CONSOLE") ? new ConsoleCommandSender() : server.getPlayer(this.player);
if(player == null) return;

if(!(super.getResult() instanceof TaskResult) || !hasResult() || !(getResult() instanceof TaskResult)) {
player.sendMessage(TextFormat.RED + "Failed to retrieve top voters. Try again later.");
server.getLogger().error("[PocketVote] Result of " + getClass().getCanonicalName() + " was not an instance of TaskResult.");
return;
}

TaskResult result = (TaskResult) getResult();

if(result.hasError()) {
player.sendMessage(TextFormat.RED + "An error occurred while contacting the PocketVote servers, please try again later.");
server.getLogger().error("[PocketVote] TopVoterTask: " + result.getMessage());
return;
}

if(!result.hasPayload() || !result.getRawPayload().isArray()) {
server.getLogger().debug("[PocketVote] TopVoterTask: No payload or payload was not an array.");
return;
}

player.sendMessage(TextFormat.AQUA + "### Current top 10 voters ###");
int rank = 1;
boolean color = true;

for(final JsonNode vote : result.getRawPayload()) {
player.sendMessage("" + (color ? TextFormat.WHITE : TextFormat.GRAY) + rank + ". " + vote.get("player").asText() + " (" + vote.get("votes").asInt() + ")");
rank++;
color = !color;
}

if(result.getRawPayload().size() == 0) player.sendMessage(TextFormat.GRAY + "No voters found, start voting!");
}

}
14 changes: 3 additions & 11 deletions src/main/java/io/pocketvote/task/VoteCheckTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,26 +25,18 @@
public class VoteCheckTask extends ApiRequest {

private PocketVote plugin;
private String identity;
private String secret;
private String version;
private boolean dev;

public VoteCheckTask(PocketVote plugin, String identity, String secret, String version) {
super(plugin.isDev() ? "http://127.0.0.1:9000/v2/check" : "https://api.pocketvote.io/v2/check", "GET", null);
public VoteCheckTask(PocketVote plugin) {
super(plugin.isDev() ? "http://127.0.0.1:9000/v2/check" : "https://api.pocketvote.io/v2/check", "GET", "VOTE", null);
this.plugin = plugin;
this.identity = identity;
this.secret = secret;
this.version = version;
this.dev = plugin.isDev();

plugin.getLogger().debug("Checking for outstanding votes.");
}

@Override
public void onCompletion(Server server) {
if(!(super.getResult() instanceof TaskResult)) {
server.getLogger().error("Result of " + getClass().getCanonicalName() + " was not an instance of TaskResult.");
server.getLogger().error("[PocketVote] Result of " + getClass().getCanonicalName() + " was not an instance of TaskResult.");
return;
}

Expand Down
5 changes: 4 additions & 1 deletion src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,7 @@ description: Simple, elegant and efficient voting suite.
permissions:
pocketvote.admin:
default: op
description: "Allows user to administer pocketvote"
description: "Allows user to administer pocketvote"
pocketvote.vote:
default: true
description: "Allows a player to use the /vote command"

0 comments on commit f3b4bd9

Please sign in to comment.