Compare commits
No commits in common. "main" and "1.2" have entirely different histories.
2
.gitignore
vendored
2
.gitignore
vendored
@ -110,4 +110,4 @@ buildNumber.properties
|
|||||||
.flattened-pom.xml
|
.flattened-pom.xml
|
||||||
|
|
||||||
# Common working directory
|
# Common working directory
|
||||||
run/
|
run/
|
||||||
|
82
README.md
82
README.md
@ -1,75 +1,45 @@
|
|||||||
# FroggyMonitorReward
|
# FroggyMonitorReward
|
||||||
Плагин для награды игроков за голоса и отзывы на FroggyMonitor\
|
Плагин для награды игроков за голоса и отзывы на FroggyMonitor
|
||||||
Он сам изменяет URL'ы для поощрения на мониторинге, самим не надо ничего делать\
|
|
||||||
Поддерживает PlaceholderAPI и Vault
|
Плагин запускает сайт,
|
||||||
|
на который будут приходить запросы от
|
||||||
|
FroggyMonitor на поощрение игрока,
|
||||||
|
плагин их читает и выполняет действие из конфига
|
||||||
|
|
||||||
[Скачать](https://github.com/MeexReay/FroggyMonitorReward/releases/latest)
|
[Скачать](https://github.com/MeexReay/FroggyMonitorReward/releases/latest)
|
||||||
|
|
||||||
## Конфиг
|
## Конфиг
|
||||||
Конфигурационный файл плагина по умолчанию выглядит так
|
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
bind_host: 0.0.0.0 # Локальный IP адрес сервера (обычно такой же как и в server.properties)
|
site_host: localhost # IP адрес для сайта
|
||||||
bind_port: 8080 # Свободный порт для сайта (потребуется открыть его на хостинге)
|
site_port: 8080 # Порт для сайта
|
||||||
|
site_backlog: 0 # Максимальное кол-во подключений одновременно
|
||||||
external_host: example.com # Внешний IP адрес или домен сервера
|
|
||||||
|
|
||||||
secret_token: "ваш_секретный_токен" # Секретный токен с FroggyMonitor
|
secret_token: "ваш_секретный_токен" # Секретный токен с FroggyMonitor
|
||||||
|
|
||||||
|
comment_page: "/api/comment" # Страница для награды за отзыв
|
||||||
|
vote_page: "/api/vote" # Страница для награды за голос
|
||||||
|
|
||||||
|
# Что указать в FroggyMonitor?
|
||||||
|
# В URL для поощрения за отзыв:
|
||||||
|
# http://{ip_сервера}:{site_port}{comment_page}
|
||||||
|
# -> http://example.com:8080/api/comment
|
||||||
|
# В URL для поощрения за голос:
|
||||||
|
# http://{ip_сервера}:{site_port}{vote_page}
|
||||||
|
# -> http://example.com:8080/api/vote
|
||||||
|
# Также возможно понадобится открыть порт на хосте
|
||||||
|
|
||||||
vote: # Награда за голос
|
vote: # Награда за голос
|
||||||
vault: 10 # Выдать валюту
|
vault: 10 # Выдать валюту (необяз.)
|
||||||
item: "diamond 10" # Выдать предмет (забрать предмет нельзя)
|
item: "diamond 10" # Выдать предмет (необяз.) (забрать предмет нельзя)
|
||||||
message: "Спасибо за голос!" # Отправить сообщение
|
message: "Спасибо за голос!" # Отправить сообщение (необяз.)
|
||||||
commands: # Исполнить команды
|
commands: # Исполнить команды (необяз.)
|
||||||
- "/title {player_name} subtitle на FroggyMonitor"
|
- "/title {player_name} subtitle на FroggyMonitor"
|
||||||
- "/title {player_name} title Спасибо за отзыв!"
|
- "/title {player_name} title Спасибо за отзыв!"
|
||||||
as_player: # Исполнить команды или написать сообщение в чат от лица игрока
|
|
||||||
- "Я проголосовал за сервер и получил награду"
|
|
||||||
- "/me купит себе ламборгини на 10$ с награды"
|
|
||||||
|
|
||||||
# Каждый параметр наград не обязателен, но не должен использоваться больше 1 раза
|
|
||||||
# Указывать предмет вот так: "{название_предмета} {кол_во}"
|
|
||||||
|
|
||||||
add_comment: # Награда за добавление отзыва
|
add_comment: # Награда за добавление отзыва
|
||||||
vault: 10
|
vault: 10
|
||||||
message: "Спасибо за отзыв!"
|
message: "Спасибо за отзыв!"
|
||||||
# Тут могут использоваться все параметры из наград за голоса
|
|
||||||
|
|
||||||
del_comment: # Награда за удаление отзыва
|
del_comment: # Награда за удаление отзыва
|
||||||
vault: -10
|
vault: -10 # Снять валюту
|
||||||
# Тут могут использоваться все параметры из наград за голоса
|
|
||||||
|
|
||||||
enable_logs: true # Включить логи плагина (true/false); true - вкл; false - выкл
|
|
||||||
|
|
||||||
message_formatting: "ampersand" # Изменить тип форматирования сообщений
|
|
||||||
# Типы форматирования:
|
|
||||||
# ampersand: &cСообщение
|
|
||||||
# section: §cСообщение
|
|
||||||
# minimessage: <red>Сообщение</red>
|
|
||||||
# json: {"text": "Сообщение", "color": "red"}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Права
|
|
||||||
|
|
||||||
```
|
|
||||||
froggy_monitor_reward.command.reload - Право на команду /reload
|
|
||||||
```
|
|
||||||
|
|
||||||
## Как это работает
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
sequenceDiagram
|
|
||||||
participant FroggyMonitor
|
|
||||||
participant Сервер
|
|
||||||
participant Сайт
|
|
||||||
participant Плагин
|
|
||||||
participant Vault
|
|
||||||
Сервер-->>Плагин: Запуск плагина
|
|
||||||
Плагин-->>Сайт: Запуск сайта
|
|
||||||
FroggyMonitor->>Сайт: Игрок проголосовал за сервер
|
|
||||||
Сайт->>Плагин: Голос игрока
|
|
||||||
Плагин->>Vault: Выдать валюту
|
|
||||||
Плагин->>Сервер: Выдать предмет
|
|
||||||
Плагин->>Сервер: Отправить сообщение
|
|
||||||
Плагин->>Сервер: Выполнить команды
|
|
||||||
```
|
```
|
||||||
|
22
pom.xml
22
pom.xml
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<groupId>ru.froggymonitor</groupId>
|
<groupId>ru.froggymonitor</groupId>
|
||||||
<artifactId>rewardplugin</artifactId>
|
<artifactId>rewardplugin</artifactId>
|
||||||
<version>1.4.3</version>
|
<version>1.2</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>FroggyMonitorReward</name>
|
<name>FroggyMonitorReward</name>
|
||||||
@ -88,26 +88,6 @@
|
|||||||
<version>1.13.1-R0.1-SNAPSHOT</version>
|
<version>1.13.1-R0.1-SNAPSHOT</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>net.kyori</groupId>
|
|
||||||
<artifactId>adventure-api</artifactId>
|
|
||||||
<version>4.16.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>net.kyori</groupId>
|
|
||||||
<artifactId>adventure-text-minimessage</artifactId>
|
|
||||||
<version>4.16.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>net.kyori</groupId>
|
|
||||||
<artifactId>adventure-text-serializer-legacy</artifactId>
|
|
||||||
<version>4.16.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>net.kyori</groupId>
|
|
||||||
<artifactId>adventure-text-serializer-gson</artifactId>
|
|
||||||
<version>4.16.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.MilkBowl</groupId>
|
<groupId>com.github.MilkBowl</groupId>
|
||||||
<artifactId>VaultAPI</artifactId>
|
<artifactId>VaultAPI</artifactId>
|
||||||
|
@ -1,28 +1,27 @@
|
|||||||
package ru.froggymonitor.rewardplugin;
|
package ru.froggymonitor.rewardplugin;
|
||||||
|
|
||||||
import me.clip.placeholderapi.PlaceholderAPI;
|
|
||||||
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.Material;
|
||||||
import org.bukkit.OfflinePlayer;
|
import org.bukkit.OfflinePlayer;
|
||||||
import org.bukkit.block.data.type.TripwireHook;
|
import org.bukkit.configuration.MemorySection;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
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.PlayerCommandPreprocessEvent;
|
||||||
import org.bukkit.event.player.PlayerJoinEvent;
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
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.*;
|
import java.io.File;
|
||||||
import java.net.HttpURLConnection;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.nio.file.Path;
|
||||||
import java.net.URL;
|
|
||||||
import java.net.http.HttpClient;
|
|
||||||
import java.net.http.HttpRequest;
|
|
||||||
import java.net.http.HttpResponse;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public final class Main extends JavaPlugin implements Listener {
|
public final class Main extends JavaPlugin implements Listener {
|
||||||
public static Main me;
|
public static Main me;
|
||||||
@ -46,66 +45,45 @@ public final class Main extends JavaPlugin implements Listener {
|
|||||||
|
|
||||||
public String secret_token;
|
public String secret_token;
|
||||||
|
|
||||||
public String external_host;
|
public String comment_page;
|
||||||
|
public String vote_page;
|
||||||
public boolean enable_logs;
|
|
||||||
public MessageFormatting message_formatting;
|
|
||||||
|
|
||||||
public Reward vote_reward;
|
public Reward vote_reward;
|
||||||
public Reward add_comment_reward;
|
public Reward add_comment_reward;
|
||||||
public Reward del_comment_reward;
|
public Reward del_comment_reward;
|
||||||
|
|
||||||
public String vote_page;
|
|
||||||
public String comment_page;
|
|
||||||
|
|
||||||
public Map<String, String> cache;
|
|
||||||
|
|
||||||
public File cache_file;
|
|
||||||
|
|
||||||
public boolean has_placeholderapi;
|
|
||||||
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();
|
if (!setupEconomy()) {
|
||||||
has_placeholderapi = Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null;
|
getLogger().severe("[FroggyMonitorReward] - Disabled due to no Vault dependency found!");
|
||||||
|
getServer().getPluginManager().disablePlugin(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") == null) {
|
||||||
|
getLogger().severe("[FroggyMonitorReward] - Disabled due to no PlaceholderAPI dependency found!");
|
||||||
|
getServer().getPluginManager().disablePlugin(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
me = this;
|
me = this;
|
||||||
|
|
||||||
reload_command = new ReloadCommand();
|
|
||||||
|
|
||||||
conf = new UnrealConfig(this, "config.yml");
|
conf = new UnrealConfig(this, "config.yml");
|
||||||
|
|
||||||
vote_page = "/api/vote";
|
|
||||||
comment_page = "/api/comment";
|
|
||||||
|
|
||||||
secret_token = (String) conf.get("secret_token");
|
secret_token = (String) conf.get("secret_token");
|
||||||
external_host = (String) conf.get("external_host");
|
|
||||||
|
|
||||||
enable_logs = (Boolean) conf.get("enable_logs");
|
comment_page = (String) conf.get("comment_page");
|
||||||
message_formatting = MessageFormatting.getFormatting((String) conf.get("message_formatting"));
|
vote_page = (String) conf.get("vote_page");
|
||||||
|
|
||||||
vote_reward = new Reward("vote", (Map<String, Object>) conf.get("vote"));
|
vote_reward = new Reward((Map<String, Object>) conf.get("vote"));
|
||||||
add_comment_reward = new Reward("add_comment", (Map<String, Object>) conf.get("add_comment"));
|
add_comment_reward = new Reward((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((Map<String, Object>) conf.get("del_comment"));
|
||||||
|
|
||||||
bind_host = (String) conf.get("bind_host");
|
site = new SitePart(
|
||||||
bind_port = ((Number) conf.get("bind_port")).intValue();
|
(String) conf.get("site_host"),
|
||||||
|
((Number) conf.get("site_port")).intValue(),
|
||||||
|
((Number) conf.get("site_backlog")).intValue());
|
||||||
|
|
||||||
httpClient = HttpClient.newHttpClient();
|
|
||||||
|
|
||||||
sendRewardUrls();
|
|
||||||
|
|
||||||
cache_file = new File(getDataFolder().getPath(), "cache");
|
|
||||||
|
|
||||||
loadCache();
|
|
||||||
|
|
||||||
site = new SitePart(bind_host,bind_port,0);
|
|
||||||
site.start();
|
site.start();
|
||||||
|
|
||||||
getServer().getPluginManager().registerEvents(this,this);
|
getServer().getPluginManager().registerEvents(this,this);
|
||||||
@ -113,72 +91,7 @@ public final class Main extends JavaPlugin implements Listener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
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
|
|
||||||
public void onJoin(PlayerJoinEvent e) {
|
|
||||||
Player p = e.getPlayer();
|
|
||||||
String n = p.getName();
|
|
||||||
|
|
||||||
if (cache.containsKey(n)) {
|
|
||||||
switch (cache.get(n)) {
|
|
||||||
case ("vote") -> vote_reward.later(p);
|
|
||||||
case ("add_comment") -> add_comment_reward.later(p);
|
|
||||||
case ("del_comment") -> del_comment_reward.later(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
Main.me.cache.remove(n);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void saveCache() {
|
|
||||||
if (cache.isEmpty()) {
|
|
||||||
cache_file.delete();
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
if (!cache_file.exists())
|
|
||||||
cache_file.createNewFile();
|
|
||||||
|
|
||||||
StringBuilder text = new StringBuilder();
|
|
||||||
for (Map.Entry<String, String> e : cache.entrySet())
|
|
||||||
text.append(e.getKey()).append("=").append(e.getValue()).append("\n");
|
|
||||||
|
|
||||||
Files.writeString(cache_file.toPath(), text.toString());
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void loadCache() {
|
|
||||||
cache = new HashMap<>();
|
|
||||||
|
|
||||||
if (cache_file.exists()) {
|
|
||||||
try {
|
|
||||||
String text = Files.readString(cache_file.toPath());
|
|
||||||
|
|
||||||
for (String s : text.split("\n")) {
|
|
||||||
String[] ss = s.split("=");
|
|
||||||
cache.put(ss[0], ss[1]);
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static OfflinePlayer getOfflinePlayer(String name) {
|
public static OfflinePlayer getOfflinePlayer(String name) {
|
||||||
@ -189,53 +102,4 @@ public final class Main extends JavaPlugin implements Listener {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpClient httpClient;
|
|
||||||
|
|
||||||
public void sendRewardUrls() {
|
|
||||||
String start_url = "http://"+external_host+":"+bind_port;
|
|
||||||
|
|
||||||
String body = "{\"secret_token\": \""+secret_token+"\", "+
|
|
||||||
"\"vote_url\": \""+start_url+vote_page+"\", "+
|
|
||||||
"\"comment_url\": \""+start_url+comment_page+"\"}";
|
|
||||||
|
|
||||||
try {
|
|
||||||
URL url = new URL("http://froggymonitor.ru/api/set_reward_urls");
|
|
||||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
|
||||||
connection.setRequestMethod("POST");
|
|
||||||
|
|
||||||
connection.setRequestProperty("Content-Type", "application/json");
|
|
||||||
connection.setRequestProperty("Content-Length", Integer.toString(body.getBytes().length));
|
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public BaseComponent[] formatMessage(Player player, String text) {
|
|
||||||
return Main.me.message_formatting.format(has_placeholderapi ? PlaceholderAPI.setPlaceholders(player, text) : text);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void giveVault(OfflinePlayer player, double amount) {
|
|
||||||
if (has_vault) econ.depositPlayer(player, amount);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
package ru.froggymonitor.rewardplugin;
|
|
||||||
|
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
|
||||||
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
|
||||||
import net.kyori.adventure.text.serializer.json.JSONComponentSerializer;
|
|
||||||
import net.md_5.bungee.api.chat.BaseComponent;
|
|
||||||
import net.md_5.bungee.api.chat.TextComponent;
|
|
||||||
import net.md_5.bungee.chat.ComponentSerializer;
|
|
||||||
|
|
||||||
public enum MessageFormatting {
|
|
||||||
AMPERSAND("ampersand", (str) -> TextComponent.fromLegacyText(str.replace("&", "§"))),
|
|
||||||
SECTION("section", (str) -> TextComponent.fromLegacyText(str)),
|
|
||||||
MINIMESSAGE("minimessage", (str) -> kyoriToBungee((net.kyori.adventure.text.TextComponent) MiniMessage.miniMessage().deserialize(str))),
|
|
||||||
JSON("json", (str) -> ComponentSerializer.parse(str));
|
|
||||||
|
|
||||||
public interface MessageFormat {
|
|
||||||
BaseComponent[] format(String input);
|
|
||||||
}
|
|
||||||
|
|
||||||
private MessageFormat format_func;
|
|
||||||
private String name;
|
|
||||||
MessageFormatting(String name, MessageFormat format) {
|
|
||||||
this.name = name;
|
|
||||||
this.format_func = format;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BaseComponent[] format(String str) {
|
|
||||||
return format_func.format(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static MessageFormatting getFormatting(String name) {
|
|
||||||
for (MessageFormatting f : values()) {
|
|
||||||
if (f.getName().startsWith(name.toLowerCase())) {
|
|
||||||
return f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,7 +6,6 @@ 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;
|
||||||
@ -15,75 +14,38 @@ import java.util.Map;
|
|||||||
import static org.bukkit.Bukkit.getServer;
|
import static org.bukkit.Bukkit.getServer;
|
||||||
|
|
||||||
public class Reward {
|
public class Reward {
|
||||||
public String name;
|
|
||||||
public Map<String,Object> data;
|
public Map<String,Object> data;
|
||||||
|
|
||||||
public Reward(String name, Map<String,Object> data) {
|
public Reward(Map<String,Object> data) {
|
||||||
this.data = data;
|
this.data = data;
|
||||||
this.name = name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void execute(String nickname) {
|
public void execute(String nickname) {
|
||||||
new BukkitRunnable() {
|
Player player = Bukkit.getPlayer(nickname);
|
||||||
public void run() {
|
|
||||||
Player player = Bukkit.getPlayer(nickname);
|
|
||||||
|
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
later(player);
|
if (data.containsKey("item")) {
|
||||||
} else {
|
|
||||||
Main.me.cache.put(nickname, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
OfflinePlayer offlinePlayer = player != null ? player : Main.getOfflinePlayer(nickname);
|
|
||||||
|
|
||||||
if (offlinePlayer != null) {
|
|
||||||
if (data.containsKey("vault")) {
|
|
||||||
try {
|
|
||||||
Main.me.giveVault(offlinePlayer,
|
|
||||||
((Number) data.get("vault")).doubleValue());
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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) {
|
|
||||||
if (data.containsKey("item")) {
|
|
||||||
try {
|
|
||||||
String[] ss = ((String)data.get("item")).split(" ");
|
String[] ss = ((String)data.get("item")).split(" ");
|
||||||
ItemStack item = new ItemStack(Material.valueOf(ss[0].toUpperCase()), ss.length == 1 ? 1 : Integer.parseInt(ss[1]));
|
ItemStack item = new ItemStack(Material.valueOf(ss[0].toUpperCase()), ss.length == 1 ? 1 : Integer.parseInt(ss[1]));
|
||||||
player.getInventory().addItem(item);
|
player.getInventory().addItem(item);
|
||||||
} catch (Exception e) {
|
}
|
||||||
e.printStackTrace();
|
if (data.containsKey("message")) {
|
||||||
|
player.sendMessage(PlaceholderAPI.setPlaceholders(player, (String) data.get("message")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (data.containsKey("message")) {
|
|
||||||
try {
|
OfflinePlayer offlinePlayer = player != null ? player : Main.getOfflinePlayer(nickname);
|
||||||
player.spigot().sendMessage(Main.me.formatMessage(player, (String) data.get("message")));
|
|
||||||
} catch (Exception e) {
|
if (offlinePlayer != null) {
|
||||||
e.printStackTrace();
|
if (data.containsKey("vault")) {
|
||||||
|
Main.me.econ.depositPlayer(offlinePlayer,
|
||||||
|
((Number) data.get("vault")).doubleValue());
|
||||||
}
|
}
|
||||||
}
|
if (data.containsKey("commands")) {
|
||||||
if (data.containsKey("as_player")) {
|
for (String c : new ArrayList<>((List<String>) data.get("commands"))) {
|
||||||
try {
|
if (c.startsWith("/")) c = c.substring(1);
|
||||||
for (String c : new ArrayList<>((List<String>) data.get("as_player"))) {
|
getServer().dispatchCommand(getServer().getConsoleSender(),PlaceholderAPI.setPlaceholders(offlinePlayer, c));
|
||||||
player.chat(c);
|
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,35 +3,21 @@ package ru.froggymonitor.rewardplugin;
|
|||||||
import com.google.common.base.Charsets;
|
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.HttpHandler;
|
||||||
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.nio.charset.StandardCharsets;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
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;
|
||||||
|
|
||||||
public String host;
|
|
||||||
public int port;
|
|
||||||
|
|
||||||
public SitePart(String host, int port, int backlog) {
|
public SitePart(String host, int port, int backlog) {
|
||||||
this.host = host;
|
|
||||||
this.port = port;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
server = HttpServer.create(new InetSocketAddress(host,port),backlog);
|
server = HttpServer.create(new InetSocketAddress(host,port),backlog);
|
||||||
server.createContext("/",this);
|
server.createContext("/",this);
|
||||||
@ -43,8 +29,6 @@ public class SitePart extends FormDataHandler {
|
|||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
server.start();
|
server.start();
|
||||||
|
|
||||||
if (Main.me.enable_logs) Main.me.getLogger().info("Site started at "+host+":"+port);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop() {
|
||||||
@ -63,66 +47,58 @@ public class SitePart extends FormDataHandler {
|
|||||||
String method = e.getRequestMethod();
|
String method = e.getRequestMethod();
|
||||||
String path = e.getRequestURI().getPath();
|
String path = e.getRequestURI().getPath();
|
||||||
|
|
||||||
try {
|
// System.out.println(response+" "+status_code+" "+path+" "+method);
|
||||||
if (method.equals("GET")) {
|
|
||||||
if (path.equals(Main.me.vote_page)) {
|
|
||||||
if (params.containsKey("nickname") &&
|
|
||||||
params.containsKey("timestamp") &&
|
|
||||||
params.containsKey("secret")) {
|
|
||||||
String nickname = (String) params.get("nickname");
|
|
||||||
String timestamp = (String) params.get("timestamp");
|
|
||||||
String secret = (String) params.get("secret");
|
|
||||||
|
|
||||||
String secret_gen = sha256(nickname + timestamp + Main.me.secret_token);
|
if (method.equals("GET")) {
|
||||||
|
if (path.equals(Main.me.vote_page)) {
|
||||||
|
if (params.containsKey("nickname") &&
|
||||||
|
params.containsKey("timestamp") &&
|
||||||
|
params.containsKey("secret")) {
|
||||||
|
String nickname = (String) params.get("nickname");
|
||||||
|
String timestamp = (String) params.get("timestamp");
|
||||||
|
String secret = (String) params.get("secret");
|
||||||
|
|
||||||
|
if (sha256(nickname + timestamp + Main.me.secret_token).equals(secret)) {
|
||||||
|
Main.me.vote_reward.execute(nickname);
|
||||||
|
response = "ok";
|
||||||
|
status_code = 200;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (path.equals(Main.me.comment_page)) {
|
||||||
|
if (params.containsKey("nickname") &&
|
||||||
|
params.containsKey("type") &&
|
||||||
|
params.containsKey("username") &&
|
||||||
|
params.containsKey("timestamp") &&
|
||||||
|
params.containsKey("secret")) {
|
||||||
|
String type = (String) params.get("type");
|
||||||
|
String username = (String) params.get("username");
|
||||||
|
String nickname = (String) params.get("nickname");
|
||||||
|
String timestamp = (String) params.get("timestamp");
|
||||||
|
String secret = (String) params.get("secret");
|
||||||
|
|
||||||
|
if (sha256(username + nickname + timestamp + Main.me.secret_token).equals(secret)) {
|
||||||
|
if (type.equals("insert")) {
|
||||||
|
Main.me.add_comment_reward.execute(nickname);
|
||||||
|
|
||||||
if (secret_gen.equals(secret)) {
|
|
||||||
Main.me.vote_reward.execute(nickname);
|
|
||||||
response = "ok";
|
response = "ok";
|
||||||
status_code = 200;
|
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 \"vote\" gave to player "+nickname);
|
response = "ok";
|
||||||
}
|
status_code = 200;
|
||||||
}
|
|
||||||
} else if (path.equals(Main.me.comment_page)) {
|
|
||||||
if (params.containsKey("nickname") &&
|
|
||||||
params.containsKey("type") &&
|
|
||||||
params.containsKey("username") &&
|
|
||||||
params.containsKey("timestamp") &&
|
|
||||||
params.containsKey("secret")) {
|
|
||||||
String type = (String) params.get("type");
|
|
||||||
String username = (String) params.get("username");
|
|
||||||
String nickname = (String) params.get("nickname");
|
|
||||||
String timestamp = (String) params.get("timestamp");
|
|
||||||
String secret = (String) params.get("secret");
|
|
||||||
|
|
||||||
String secret_gen = sha256(username + nickname + timestamp + Main.me.secret_token);
|
|
||||||
|
|
||||||
if (secret_gen.equals(secret)) {
|
|
||||||
if (type.equals("insert")) {
|
|
||||||
Main.me.add_comment_reward.execute(nickname);
|
|
||||||
|
|
||||||
response = "ok";
|
|
||||||
status_code = 200;
|
|
||||||
|
|
||||||
if (Main.me.enable_logs) Main.me.getLogger().info("Reward \"add_comment\" gave to player "+nickname);
|
|
||||||
} else if (type.equals("delete")) {
|
|
||||||
Main.me.del_comment_reward.execute(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 (Exception ex) {
|
} catch (IOException ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,38 +1,28 @@
|
|||||||
bind_host: 0.0.0.0 # Локальный IP адрес сервера (обычно такой же как и в server.properties)
|
site_host: localhost # IP адрес для сайта
|
||||||
bind_port: 8080 # Свободный порт для сайта (потребуется открыть его на хостинге)
|
site_port: 8080 # Порт для сайта
|
||||||
|
site_backlog: 0 # Максимальное кол-во подключений одновременно
|
||||||
external_host: example.com # Внешний IP адрес или домен сервера
|
|
||||||
|
|
||||||
secret_token: "ваш_секретный_токен" # Секретный токен с FroggyMonitor
|
secret_token: "ваш_секретный_токен" # Секретный токен с FroggyMonitor
|
||||||
|
|
||||||
|
comment_page: "/api/comment" # Страница для награды за отзыв
|
||||||
|
vote_page: "/api/vote" # Страница для награды за голос
|
||||||
|
|
||||||
|
# Что указать в FroggyMonitor?
|
||||||
|
# В URL для поощрения за отзыв: http://{ip_сервера}:{site_port}{comment_page} -> http://example.com:8080/api/comment
|
||||||
|
# В URL для поощрения за голос: http://{ip_сервера}:{site_port}{vote_page} -> http://example.com:8080/api/vote
|
||||||
|
# Также возможно понадобится открыть порт на хосте
|
||||||
|
|
||||||
vote: # Награда за голос
|
vote: # Награда за голос
|
||||||
vault: 10 # Выдать валюту
|
vault: 10 # Выдать валюту (необяз.)
|
||||||
item: "diamond 10" # Выдать предмет (забрать предмет нельзя)
|
item: "diamond 10" # Выдать предмет (необяз.) (забрать предмет нельзя)
|
||||||
message: "Спасибо за голос!" # Отправить сообщение
|
message: "Спасибо за голос!" # Отправить сообщение (необяз.)
|
||||||
commands: # Исполнить команды
|
commands: # Исполнить команды (необяз.)
|
||||||
- "/title {player_name} subtitle на FroggyMonitor"
|
- "/title {player_name} subtitle на FroggyMonitor"
|
||||||
- "/title {player_name} title Спасибо за отзыв!"
|
- "/title {player_name} title Спасибо за отзыв!"
|
||||||
as_player: # Исполнить команды или написать сообщение в чат от лица игрока
|
|
||||||
- "Я проголосовал за сервер и получил награду"
|
|
||||||
- "/me купит себе ламборгини на 10$ с награды"
|
|
||||||
|
|
||||||
# Каждый параметр наград не обязателен, но не должен использоваться больше 1 раза
|
add_comment: # Награда за удаление отзыва
|
||||||
# Указывать предмет вот так: "{название_предмета} {кол_во}"
|
|
||||||
|
|
||||||
add_comment: # Награда за добавление отзыва
|
|
||||||
vault: 10
|
vault: 10
|
||||||
message: "Спасибо за отзыв!"
|
message: "Спасибо за отзыв!"
|
||||||
# Тут могут использоваться все параметры из наград за голоса
|
|
||||||
|
|
||||||
del_comment: # Награда за удаление отзыва
|
del_comment: # Награда за удаление отзыва
|
||||||
vault: -10
|
vault: -10 # Снять валюту
|
||||||
# Тут могут использоваться все параметры из наград за голоса
|
|
||||||
|
|
||||||
enable_logs: true # Включить логи плагина (true/false); true - вкл; false - выкл
|
|
||||||
|
|
||||||
message_formatting: "ampersand" # Изменить тип форматирования сообщений
|
|
||||||
# Типы форматирования:
|
|
||||||
# ampersand: &cСообщение
|
|
||||||
# section: §cСообщение
|
|
||||||
# minimessage: <red>Сообщение</red>
|
|
||||||
# json: {"text": "Сообщение", "color": "red"}
|
|
@ -5,12 +5,4 @@ api-version: 1.13
|
|||||||
authors: [ FroggyMonitor ]
|
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
|
|
Loading…
Reference in New Issue
Block a user