Skip to content

Commit f3b4bd9

Browse files
Add /vote top
1 parent 8777eaf commit f3b4bd9

File tree

7 files changed

+118
-27
lines changed

7 files changed

+118
-27
lines changed

src/main/java/io/pocketvote/PocketVote.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import cn.nukkit.scheduler.TaskHandler;
55
import cn.nukkit.utils.ConfigSection;
66
import cn.nukkit.utils.TextFormat;
7+
import io.pocketvote.cmd.VoteCommand;
78
import io.pocketvote.listener.VoteListener;
89
import io.pocketvote.cmd.PocketVoteCommand;
910
import io.pocketvote.task.ExpireVotesTask;
@@ -55,7 +56,6 @@ public void onEnable() {
5556
/*
5657
* List of things I need to do.
5758
* TODO: Add GURU support.
58-
* TODO: Add TopVoter
5959
* TODO: Add Vote link.
6060
* TODO: Add diagnose.
6161
* TODO: Add heartbeat.
@@ -77,6 +77,7 @@ public void onEnable() {
7777

7878
getServer().getPluginManager().registerEvents(new VoteListener(plugin), plugin);
7979
getServer().getCommandMap().register("pocketvote", new PocketVoteCommand(plugin));
80+
getServer().getCommandMap().register("vote", new VoteCommand(plugin));
8081

8182
/* Register tasks */
8283
tasks = new ArrayList<>();
@@ -168,7 +169,7 @@ public VoteManager getVoteManager() {
168169
return vm;
169170
}
170171

171-
public void updateConfig() {
172+
private void updateConfig() {
172173
if(plugin.getConfig().getInt("version", 1) == 1) {
173174
getLogger().info(TextFormat.YELLOW + "Migrating config to version 2.");
174175
getConfig().set("multi-server.enabled", false);
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.pocketvote.cmd;
2+
3+
import cn.nukkit.command.Command;
4+
import cn.nukkit.command.CommandSender;
5+
import cn.nukkit.command.PluginIdentifiableCommand;
6+
import cn.nukkit.plugin.Plugin;
7+
import cn.nukkit.utils.TextFormat;
8+
import io.pocketvote.PocketVote;
9+
import io.pocketvote.task.TopVoterTask;
10+
11+
public class VoteCommand extends Command implements PluginIdentifiableCommand {
12+
13+
private PocketVote plugin;
14+
15+
public VoteCommand(PocketVote plugin) {
16+
super("vote", "PocketVote vote command", "/vote [top]", new String[]{"v"});
17+
this.plugin = plugin;
18+
}
19+
20+
@Override
21+
public boolean execute(CommandSender sender, String s, String[] args) {
22+
if(!sender.hasPermission("pocketvote.vote")) {
23+
sender.sendMessage(TextFormat.RED + "You do not have permission to use /vote.");
24+
return true;
25+
}
26+
if(args.length > 0 && args[0].equalsIgnoreCase("TOP")) {
27+
plugin.getServer().getScheduler().scheduleAsyncTask(plugin, new TopVoterTask(plugin, sender.getName()));
28+
return true;
29+
}
30+
return false; // TODO: Add vote link here when "top" is not specified.
31+
}
32+
33+
@Override
34+
public Plugin getPlugin() {
35+
return plugin;
36+
}
37+
}

src/main/java/io/pocketvote/task/ApiRequest.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,22 @@ public class ApiRequest extends AsyncTask {
2121

2222
private String url;
2323
private String method;
24+
private String action;
2425
private HashMap<String, String> postFields;
2526
private String identity;
2627
private String secret;
2728
private String version;
2829

29-
public ApiRequest(String url, String method, HashMap<String, String> postFields) {
30+
public ApiRequest(String url, String method, String action, HashMap<String, String> postFields) {
3031
this.url = url;
3132
this.method = method;
33+
this.action = action;
3234
this.postFields = postFields;
3335
this.identity = PocketVote.getPlugin().identity;
3436
this.secret = PocketVote.getPlugin().secret;
3537
this.version = PocketVote.getPlugin().getDescription().getVersion();
3638
}
3739

38-
/*@Override
39-
public void onRun() {
40-
// Overridden by the extending class.
41-
}*/
42-
4340
@Override
4441
public void onRun() {
4542
HttpURLConnection con;
@@ -93,10 +90,14 @@ public void onRun() {
9390
return;
9491
}
9592

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

102103
setResult(result);

src/main/java/io/pocketvote/task/SchedulerTask.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@
66
public class SchedulerTask extends Task {
77

88
private PocketVote plugin;
9-
private String version;
109

1110
public SchedulerTask(PocketVote plugin) {
1211
this.plugin = plugin;
13-
this.version = plugin.getDescription().getVersion();
1412
}
1513

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

2018
if(!plugin.multiserver || plugin.multiserverRole.equalsIgnoreCase("master")) {
2119
if(plugin.secret != null && !plugin.secret.isEmpty() && plugin.identity != null && !plugin.identity.isEmpty()) {
22-
plugin.getServer().getScheduler().scheduleAsyncTask(plugin, new VoteCheckTask(plugin, plugin.identity, plugin.secret, version));
20+
plugin.getServer().getScheduler().scheduleAsyncTask(plugin, new VoteCheckTask(plugin));
2321
} else {
2422
plugin.getLogger().critical("Please finish configuring PocketVote, then restart your server.");
2523
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package io.pocketvote.task;
2+
3+
import cn.nukkit.Server;
4+
import cn.nukkit.command.CommandSender;
5+
import cn.nukkit.command.ConsoleCommandSender;
6+
import cn.nukkit.utils.TextFormat;
7+
import com.fasterxml.jackson.databind.JsonNode;
8+
import io.pocketvote.PocketVote;
9+
import io.pocketvote.data.TaskResult;
10+
11+
public class TopVoterTask extends ApiRequest {
12+
13+
private final String player;
14+
15+
public TopVoterTask(PocketVote plugin, String player) {
16+
super(plugin.isDev() ? "http://127.0.0.1:9000/v2/top/10" : "https://api.pocketvote.io/v2/top/10", "GET", "TOP", null);
17+
this.player = player;
18+
19+
plugin.getLogger().debug("Getting top voters.");
20+
}
21+
22+
@Override
23+
public void onCompletion(Server server) {
24+
CommandSender player = this.player.equalsIgnoreCase("CONSOLE") ? new ConsoleCommandSender() : server.getPlayer(this.player);
25+
if(player == null) return;
26+
27+
if(!(super.getResult() instanceof TaskResult) || !hasResult() || !(getResult() instanceof TaskResult)) {
28+
player.sendMessage(TextFormat.RED + "Failed to retrieve top voters. Try again later.");
29+
server.getLogger().error("[PocketVote] Result of " + getClass().getCanonicalName() + " was not an instance of TaskResult.");
30+
return;
31+
}
32+
33+
TaskResult result = (TaskResult) getResult();
34+
35+
if(result.hasError()) {
36+
player.sendMessage(TextFormat.RED + "An error occurred while contacting the PocketVote servers, please try again later.");
37+
server.getLogger().error("[PocketVote] TopVoterTask: " + result.getMessage());
38+
return;
39+
}
40+
41+
if(!result.hasPayload() || !result.getRawPayload().isArray()) {
42+
server.getLogger().debug("[PocketVote] TopVoterTask: No payload or payload was not an array.");
43+
return;
44+
}
45+
46+
player.sendMessage(TextFormat.AQUA + "### Current top 10 voters ###");
47+
int rank = 1;
48+
boolean color = true;
49+
50+
for(final JsonNode vote : result.getRawPayload()) {
51+
player.sendMessage("" + (color ? TextFormat.WHITE : TextFormat.GRAY) + rank + ". " + vote.get("player").asText() + " (" + vote.get("votes").asInt() + ")");
52+
rank++;
53+
color = !color;
54+
}
55+
56+
if(result.getRawPayload().size() == 0) player.sendMessage(TextFormat.GRAY + "No voters found, start voting!");
57+
}
58+
59+
}

src/main/java/io/pocketvote/task/VoteCheckTask.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,26 +25,18 @@
2525
public class VoteCheckTask extends ApiRequest {
2626

2727
private PocketVote plugin;
28-
private String identity;
29-
private String secret;
30-
private String version;
31-
private boolean dev;
3228

33-
public VoteCheckTask(PocketVote plugin, String identity, String secret, String version) {
34-
super(plugin.isDev() ? "http://127.0.0.1:9000/v2/check" : "https://api.pocketvote.io/v2/check", "GET", null);
29+
public VoteCheckTask(PocketVote plugin) {
30+
super(plugin.isDev() ? "http://127.0.0.1:9000/v2/check" : "https://api.pocketvote.io/v2/check", "GET", "VOTE", null);
3531
this.plugin = plugin;
36-
this.identity = identity;
37-
this.secret = secret;
38-
this.version = version;
39-
this.dev = plugin.isDev();
4032

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

4436
@Override
4537
public void onCompletion(Server server) {
4638
if(!(super.getResult() instanceof TaskResult)) {
47-
server.getLogger().error("Result of " + getClass().getCanonicalName() + " was not an instance of TaskResult.");
39+
server.getLogger().error("[PocketVote] Result of " + getClass().getCanonicalName() + " was not an instance of TaskResult.");
4840
return;
4941
}
5042

src/main/resources/plugin.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,7 @@ description: Simple, elegant and efficient voting suite.
77
permissions:
88
pocketvote.admin:
99
default: op
10-
description: "Allows user to administer pocketvote"
10+
description: "Allows user to administer pocketvote"
11+
pocketvote.vote:
12+
default: true
13+
description: "Allows a player to use the /vote command"

0 commit comments

Comments
 (0)