Compare commits

...

8 Commits
1.4 ... main

Author SHA1 Message Date
55f7cabd26 Merge remote-tracking branch 'origin/main' 2024-04-03 23:58:44 +03:00
05c0199eb2 fix comment in plugin like in readme 2024-04-03 23:58:33 +03:00
MeexReay
b3e26fa1c2
Merge pull request #1 from n3tael/patch-1
fix(readme): the comment in the example config is not correct
2024-04-03 23:52:25 +03:00
Bogdan
d0635b57e7
fix(readme): the comment in the example config is not correct 2024-04-03 21:10:27 +03:00
c0fc86c812 fix site 2024-03-25 00:59:10 +03:00
522cdee07f fix send reward urls 2024-03-24 19:00:24 +03:00
2406415923 reload command 2024-03-24 15:13:18 +03:00
8bb3f05d17 1.4.1 2024-03-24 15:09:25 +03:00
9 changed files with 261 additions and 106 deletions

View File

@ -30,7 +30,7 @@ vote: # Награда за голос
# Каждый параметр наград не обязателен, но не должен использоваться больше 1 раза # Каждый параметр наград не обязателен, но не должен использоваться больше 1 раза
# Указывать предмет вот так: "{название_предмета} {кол_во}" # Указывать предмет вот так: "{название_предмета} {кол_во}"
add_comment: # Награда за удаление отзыва add_comment: # Награда за добавление отзыва
vault: 10 vault: 10
message: "Спасибо за отзыв!" message: "Спасибо за отзыв!"
# Тут могут использоваться все параметры из наград за голоса # Тут могут использоваться все параметры из наград за голоса
@ -49,6 +49,12 @@ message_formatting: "ampersand" # Изменить тип форматирова
# json: {"text": "Сообщение", "color": "red"} # json: {"text": "Сообщение", "color": "red"}
``` ```
## Права
```
froggy_monitor_reward.command.reload - Право на команду /reload
```
## Как это работает ## Как это работает
```mermaid ```mermaid

30
pom.xml
View File

@ -6,7 +6,7 @@
<groupId>ru.froggymonitor</groupId> <groupId>ru.froggymonitor</groupId>
<artifactId>rewardplugin</artifactId> <artifactId>rewardplugin</artifactId>
<version>1.4</version> <version>1.4.3</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>FroggyMonitorReward</name> <name>FroggyMonitorReward</name>
@ -89,16 +89,14 @@
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.MilkBowl</groupId> <groupId>net.kyori</groupId>
<artifactId>VaultAPI</artifactId> <artifactId>adventure-api</artifactId>
<version>1.7</version> <version>4.16.0</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>me.clip</groupId> <groupId>net.kyori</groupId>
<artifactId>placeholderapi</artifactId> <artifactId>adventure-text-minimessage</artifactId>
<version>2.11.5</version> <version>4.16.0</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
@ -111,14 +109,16 @@
<version>4.16.0</version> <version>4.16.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>com.github.MilkBowl</groupId>
<artifactId>adventure-text-minimessage</artifactId> <artifactId>VaultAPI</artifactId>
<version>4.16.0</version> <version>1.7</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>me.clip</groupId>
<artifactId>adventure-api</artifactId> <artifactId>placeholderapi</artifactId>
<version>4.16.0</version> <version>2.11.5</version>
<scope>provided</scope>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -5,16 +5,19 @@ import net.md_5.bungee.api.chat.BaseComponent;
import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.block.data.type.TripwireHook;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.io.File; import java.io.*;
import java.io.IOException; import java.net.HttpURLConnection;
import java.net.URI; import java.net.URI;
import java.net.URL;
import java.net.http.HttpClient; import java.net.http.HttpClient;
import java.net.http.HttpRequest; import java.net.http.HttpRequest;
import java.net.http.HttpResponse; import java.net.http.HttpResponse;
@ -62,6 +65,11 @@ public final class Main extends JavaPlugin implements Listener {
public boolean has_placeholderapi; public boolean has_placeholderapi;
public boolean has_vault; public boolean has_vault;
public String bind_host;
public int bind_port;
public ReloadCommand reload_command;
@Override @Override
public void onEnable() { public void onEnable() {
has_vault = setupEconomy(); has_vault = setupEconomy();
@ -69,6 +77,8 @@ public final class Main extends JavaPlugin implements Listener {
me = this; me = this;
reload_command = new ReloadCommand();
conf = new UnrealConfig(this, "config.yml"); conf = new UnrealConfig(this, "config.yml");
vote_page = "/api/vote"; vote_page = "/api/vote";
@ -84,6 +94,9 @@ public final class Main extends JavaPlugin implements Listener {
add_comment_reward = new Reward("add_comment", (Map<String, Object>) conf.get("add_comment")); add_comment_reward = new Reward("add_comment", (Map<String, Object>) conf.get("add_comment"));
del_comment_reward = new Reward("del_comment", (Map<String, Object>) conf.get("del_comment")); del_comment_reward = new Reward("del_comment", (Map<String, Object>) conf.get("del_comment"));
bind_host = (String) conf.get("bind_host");
bind_port = ((Number) conf.get("bind_port")).intValue();
httpClient = HttpClient.newHttpClient(); httpClient = HttpClient.newHttpClient();
sendRewardUrls(); sendRewardUrls();
@ -92,11 +105,7 @@ public final class Main extends JavaPlugin implements Listener {
loadCache(); loadCache();
site = new SitePart( site = new SitePart(bind_host,bind_port,0);
(String) conf.get("bind_host"),
((Number) conf.get("bind_port")).intValue(),
0);
site.start(); site.start();
getServer().getPluginManager().registerEvents(this,this); getServer().getPluginManager().registerEvents(this,this);
@ -104,8 +113,20 @@ public final class Main extends JavaPlugin implements Listener {
@Override @Override
public void onDisable() { public void onDisable() {
saveCache(); tryCatchIgnore(() -> {
site.stop(); saveCache();
site.stop();
});
}
public interface tryCatchRunnable {
public void run() throws Throwable;
}
public void tryCatchIgnore(tryCatchRunnable r) {
try {
r.run();
} catch (Throwable ignored) {}
} }
@EventHandler @EventHandler
@ -172,21 +193,41 @@ public final class Main extends JavaPlugin implements Listener {
public HttpClient httpClient; public HttpClient httpClient;
public void sendRewardUrls() { public void sendRewardUrls() {
String start_url = "http://"+external_host+":"+site.port; String start_url = "http://"+external_host+":"+bind_port;
String body = "{\"secret_token\": \""+secret_token+"\", "+ String body = "{\"secret_token\": \""+secret_token+"\", "+
"\"vote_url\": \""+start_url+vote_page+"\", "+ "\"vote_url\": \""+start_url+vote_page+"\", "+
"\"comment_url\": \""+start_url+comment_page+"\"}"; "\"comment_url\": \""+start_url+comment_page+"\"}";
try { try {
httpClient.send(HttpRequest.newBuilder() URL url = new URL("http://froggymonitor.ru/api/set_reward_urls");
.POST(HttpRequest.BodyPublishers.ofString(body)) HttpURLConnection connection = (HttpURLConnection) url.openConnection();
.uri(URI.create("https://froggymonitor.ru/api/set_reward_urls")) connection.setRequestMethod("POST");
.build(), HttpResponse.BodyHandlers.ofString());
} catch (IOException e) { connection.setRequestProperty("Content-Type", "application/json");
throw new RuntimeException(e); connection.setRequestProperty("Content-Length", Integer.toString(body.getBytes().length));
} catch (InterruptedException e) {
throw new RuntimeException(e); connection.setUseCaches(false);
connection.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
wr.writeBytes(body);
wr.close();
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
StringBuilder response = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
} }
} }

View File

@ -1,20 +1,20 @@
package ru.froggymonitor.rewardplugin; package ru.froggymonitor.rewardplugin;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import net.kyori.adventure.text.serializer.json.JSONComponentSerializer; import net.kyori.adventure.text.serializer.json.JSONComponentSerializer;
import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.chat.ComponentSerializer; import net.md_5.bungee.chat.ComponentSerializer;
public enum MessageFormatting { public enum MessageFormatting {
AMPERSAND("ampersand", (str) -> LegacyComponentSerializer.legacyAmpersand().deserialize(str)), AMPERSAND("ampersand", (str) -> TextComponent.fromLegacyText(str.replace("&", "§"))),
SECTION("section", (str) -> LegacyComponentSerializer.legacySection().deserialize(str)), SECTION("section", (str) -> TextComponent.fromLegacyText(str)),
MINIMESSAGE("minimessage", (str) -> (TextComponent) MiniMessage.miniMessage().deserialize(str)), MINIMESSAGE("minimessage", (str) -> kyoriToBungee((net.kyori.adventure.text.TextComponent) MiniMessage.miniMessage().deserialize(str))),
JSON("json", (str) -> (TextComponent) JSONComponentSerializer.json().deserialize(str)); JSON("json", (str) -> ComponentSerializer.parse(str));
public interface MessageFormat { public interface MessageFormat {
TextComponent format(String input); BaseComponent[] format(String input);
} }
private MessageFormat format_func; private MessageFormat format_func;
@ -29,7 +29,7 @@ public enum MessageFormatting {
} }
public BaseComponent[] format(String str) { public BaseComponent[] format(String str) {
return ComponentSerializer.parse(JSONComponentSerializer.json().serialize(format_func.format(str))); return format_func.format(str);
} }
public static MessageFormatting getFormatting(String name) { public static MessageFormatting getFormatting(String name) {
@ -40,4 +40,12 @@ public enum MessageFormatting {
} }
return SECTION; return SECTION;
} }
public static BaseComponent[] kyoriToBungee(net.kyori.adventure.text.TextComponent text) {
return ComponentSerializer.parse(JSONComponentSerializer.json().serialize(text));
}
public static net.kyori.adventure.text.TextComponent bungeeToKyori(BaseComponent[] text) {
return (net.kyori.adventure.text.TextComponent) JSONComponentSerializer.json().deserialize(ComponentSerializer.toString(text));
}
} }

View File

@ -0,0 +1,51 @@
package ru.froggymonitor.rewardplugin;
import org.bukkit.Bukkit;
import org.bukkit.command.*;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
public class ReloadCommand implements CommandExecutor, TabCompleter {
public PluginCommand pluginCommand;
public ReloadCommand() {
pluginCommand = Main.me.getCommand("reload");
pluginCommand.setTabCompleter(this);
pluginCommand.setExecutor(this);
}
public List<String> onTabComplete(CommandSender sender,
Command command,
String alias,
String[] args) {
return new ArrayList<>();
}
public boolean onCommand(CommandSender sender,
Command command,
String alias,
String[] args) {
try {
Main.me.onDisable();
Main.me.onEnable();
for (Player p : Bukkit.getOnlinePlayers())
Main.me.onJoin(new PlayerJoinEvent(p, ""));
sender.sendMessage("Плагин успешно перезагружен");
return true;
} catch (Exception e) {
StringWriter buffer = new StringWriter();
PrintWriter writer = new PrintWriter(buffer);
e.printStackTrace(writer);
sender.sendMessage(buffer.toString());
}
sender.sendMessage("При выполнении команды возникла неизвестная ошибка");
return true;
}
}

View File

@ -6,6 +6,7 @@ import org.bukkit.Material;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -23,42 +24,66 @@ public class Reward {
} }
public void execute(String nickname) { public void execute(String nickname) {
Player player = Bukkit.getPlayer(nickname); new BukkitRunnable() {
public void run() {
Player player = Bukkit.getPlayer(nickname);
if (player != null) { if (player != null) {
later(player); later(player);
} else { } else {
Main.me.cache.put(nickname, name); Main.me.cache.put(nickname, name);
} }
OfflinePlayer offlinePlayer = player != null ? player : Main.getOfflinePlayer(nickname); OfflinePlayer offlinePlayer = player != null ? player : Main.getOfflinePlayer(nickname);
if (offlinePlayer != null) { if (offlinePlayer != null) {
if (data.containsKey("vault")) { if (data.containsKey("vault")) {
Main.me.giveVault(offlinePlayer, try {
((Number) data.get("vault")).doubleValue()); Main.me.giveVault(offlinePlayer,
} ((Number) data.get("vault")).doubleValue());
if (data.containsKey("commands")) { } catch (Exception e) {
for (String c : new ArrayList<>((List<String>) data.get("commands"))) { e.printStackTrace();
if (c.startsWith("/")) c = c.substring(1); }
getServer().dispatchCommand(getServer().getConsoleSender(),PlaceholderAPI.setPlaceholders(offlinePlayer, c)); }
if (data.containsKey("commands")) {
try {
for (String c : new ArrayList<>((List<String>) data.get("commands"))) {
if (c.startsWith("/")) c = c.substring(1);
getServer().dispatchCommand(getServer().getConsoleSender(),PlaceholderAPI.setPlaceholders(offlinePlayer, c));
}
} catch (Exception e) {
e.printStackTrace();
}
}
} }
} }
} }.runTask(Main.me);
} }
public void later(Player player) { public void later(Player player) {
if (data.containsKey("item")) { if (data.containsKey("item")) {
String[] ss = ((String)data.get("item")).split(" "); try {
ItemStack item = new ItemStack(Material.valueOf(ss[0].toUpperCase()), ss.length == 1 ? 1 : Integer.parseInt(ss[1])); String[] ss = ((String)data.get("item")).split(" ");
player.getInventory().addItem(item); ItemStack item = new ItemStack(Material.valueOf(ss[0].toUpperCase()), ss.length == 1 ? 1 : Integer.parseInt(ss[1]));
player.getInventory().addItem(item);
} catch (Exception e) {
e.printStackTrace();
}
} }
if (data.containsKey("message")) { if (data.containsKey("message")) {
player.spigot().sendMessage(Main.me.formatMessage(player, (String) data.get("message"))); try {
player.spigot().sendMessage(Main.me.formatMessage(player, (String) data.get("message")));
} catch (Exception e) {
e.printStackTrace();
}
} }
if (data.containsKey("as_player")) { if (data.containsKey("as_player")) {
for (String c : new ArrayList<>((List<String>) data.get("as_player"))) { try {
player.chat(c); for (String c : new ArrayList<>((List<String>) data.get("as_player"))) {
player.chat(c);
}
} catch (Exception e) {
e.printStackTrace();
} }
} }
} }

View File

@ -4,12 +4,24 @@ import com.google.common.base.Charsets;
import com.google.common.hash.Hashing; import com.google.common.hash.Hashing;
import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.HttpServer;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.Map; import java.util.Map;
import static org.bukkit.Bukkit.getServer;
public class SitePart extends FormDataHandler { public class SitePart extends FormDataHandler {
public HttpServer server; public HttpServer server;
@ -51,62 +63,66 @@ public class SitePart extends FormDataHandler {
String method = e.getRequestMethod(); String method = e.getRequestMethod();
String path = e.getRequestURI().getPath(); String path = e.getRequestURI().getPath();
if (method.equals("GET")) { try {
if (path.equals(Main.me.vote_page)) { if (method.equals("GET")) {
if (params.containsKey("nickname") && if (path.equals(Main.me.vote_page)) {
params.containsKey("timestamp") && if (params.containsKey("nickname") &&
params.containsKey("secret")) { params.containsKey("timestamp") &&
String nickname = (String) params.get("nickname"); params.containsKey("secret")) {
String timestamp = (String) params.get("timestamp"); String nickname = (String) params.get("nickname");
String secret = (String) params.get("secret"); String timestamp = (String) params.get("timestamp");
String secret = (String) params.get("secret");
if (sha256(nickname + timestamp + Main.me.secret_token).equals(secret)) { String secret_gen = sha256(nickname + timestamp + Main.me.secret_token);
Main.me.vote_reward.execute(nickname);
response = "ok";
status_code = 200;
if (Main.me.enable_logs) Main.me.getLogger().info("Reward \"vote\" gave to player "+nickname); if (secret_gen.equals(secret)) {
Main.me.vote_reward.execute(nickname);
response = "ok";
status_code = 200;
if (Main.me.enable_logs) Main.me.getLogger().info("Reward \"vote\" gave to player "+nickname);
}
} }
} } else if (path.equals(Main.me.comment_page)) {
} else if (path.equals(Main.me.comment_page)) { if (params.containsKey("nickname") &&
if (params.containsKey("nickname") && params.containsKey("type") &&
params.containsKey("type") && params.containsKey("username") &&
params.containsKey("username") && params.containsKey("timestamp") &&
params.containsKey("timestamp") && params.containsKey("secret")) {
params.containsKey("secret")) { String type = (String) params.get("type");
String type = (String) params.get("type"); String username = (String) params.get("username");
String username = (String) params.get("username"); String nickname = (String) params.get("nickname");
String nickname = (String) params.get("nickname"); String timestamp = (String) params.get("timestamp");
String timestamp = (String) params.get("timestamp"); String secret = (String) params.get("secret");
String secret = (String) params.get("secret");
if (sha256(username + nickname + timestamp + Main.me.secret_token).equals(secret)) { String secret_gen = sha256(username + nickname + timestamp + Main.me.secret_token);
if (type.equals("insert")) {
Main.me.add_comment_reward.execute(nickname);
response = "ok"; if (secret_gen.equals(secret)) {
status_code = 200; if (type.equals("insert")) {
Main.me.add_comment_reward.execute(nickname);
if (Main.me.enable_logs) Main.me.getLogger().info("Reward \"add_comment\" gave to player "+nickname); response = "ok";
} else if (type.equals("delete")) { status_code = 200;
Main.me.del_comment_reward.execute(nickname);
response = "ok"; if (Main.me.enable_logs) Main.me.getLogger().info("Reward \"add_comment\" gave to player "+nickname);
status_code = 200; } else if (type.equals("delete")) {
Main.me.del_comment_reward.execute(nickname);
if (Main.me.enable_logs) Main.me.getLogger().info("Reward \"del_comment\" gave to player "+nickname); response = "ok";
status_code = 200;
if (Main.me.enable_logs) Main.me.getLogger().info("Reward \"del_comment\" gave to player "+nickname);
}
} }
} }
} }
} }
}
try {
e.sendResponseHeaders(status_code, response.length()); e.sendResponseHeaders(status_code, response.length());
OutputStream os = e.getResponseBody(); OutputStream os = e.getResponseBody();
os.write(response.getBytes()); os.write(response.getBytes());
} catch (IOException ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
} }

View File

@ -19,7 +19,7 @@ vote: # Награда за голос
# Каждый параметр наград не обязателен, но не должен использоваться больше 1 раза # Каждый параметр наград не обязателен, но не должен использоваться больше 1 раза
# Указывать предмет вот так: "{название_предмета} {кол_во}" # Указывать предмет вот так: "{название_предмета} {кол_во}"
add_comment: # Награда за удаление отзыва add_comment: # Награда за добавление отзыва
vault: 10 vault: 10
message: "Спасибо за отзыв!" message: "Спасибо за отзыв!"
# Тут могут использоваться все параметры из наград за голоса # Тут могут использоваться все параметры из наград за голоса

View File

@ -6,3 +6,11 @@ authors: [ FroggyMonitor ]
description: FroggyMonitor plugin that rewards votes and comments description: FroggyMonitor plugin that rewards votes and comments
website: https://froggymonitor.ru website: https://froggymonitor.ru
softdepend: [ PlaceholderAPI, Vault ] softdepend: [ PlaceholderAPI, Vault ]
commands:
reload:
description: Перезагрузка плагина
permission: froggy_monitor_reward.command.reload
permissions:
froggy_monitor_reward.command.reload:
default: op