mirror of
https://github.com/Coooookies/Grasscutter-MeaMailPlus.git
synced 2024-11-15 23:59:17 +00:00
commmit
This commit is contained in:
commit
ea7abbfc84
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/.idea/
|
||||||
|
/target/
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2022 ButterCookies
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
48
README.zh-CN.md
Normal file
48
README.zh-CN.md
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
# MeaNotice - Grasscutter 定时公告插件
|
||||||
|
MeaNotice 是一个使用于 [Grasscutter](https://github.com/Grasscutters/Grasscutter) 的插件,你可以使用这个插件在游戏内发送定时公告。
|
||||||
|
|
||||||
|
[English](./README.md) | 简体中文
|
||||||
|
|
||||||
|
## 开始
|
||||||
|
### 安装插件
|
||||||
|
1. [下载插件本体](https://github.com/Coooookies/MeaNotice/releases)
|
||||||
|
2. 将插件本体放置在 `服务器根目录/plugins` 目录下
|
||||||
|
3. 启动服务器,插件将会在你的服务器根目录下创建一个 `MeaNotice` 文件夹.
|
||||||
|
```
|
||||||
|
Root
|
||||||
|
│ lib
|
||||||
|
│ keys
|
||||||
|
│ resources
|
||||||
|
│ plugins
|
||||||
|
│ ...
|
||||||
|
└───MeaNotice
|
||||||
|
└───config.json
|
||||||
|
```
|
||||||
|
|
||||||
|
### 配置
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"interval": 30000,
|
||||||
|
"notices": [
|
||||||
|
"Welcome to this server! If you want to learn how to use commands, please type /help in chatroom.",
|
||||||
|
"Hey! Do you need help? Add UID1 as a friend, the admin will help you."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
```
|
||||||
|
说明:
|
||||||
|
interval: 必填项,用于设置定时公告的时间间隔,单位为毫秒,默认为 30000 毫秒(30 秒)。
|
||||||
|
notices: 用于设置定时公告的内容,格式为字符串数组,每条公告都会以上到下顺序发送给玩家。
|
||||||
|
```
|
||||||
|
|
||||||
|
### 命令 & 权限
|
||||||
|
命令:
|
||||||
|
```
|
||||||
|
/meanotice reload
|
||||||
|
重载插件配置
|
||||||
|
```
|
||||||
|
|
||||||
|
权限:
|
||||||
|
```
|
||||||
|
mea.notice | 控制插件功能
|
||||||
|
```
|
69
pom.xml
Normal file
69
pom.xml
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>io.github</groupId>
|
||||||
|
<artifactId>MeaMailPlus</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.8.1</version>
|
||||||
|
<configuration>
|
||||||
|
<source>17</source>
|
||||||
|
<target>17</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>3.2.4</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/resources</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>emu.grasscutter</groupId>
|
||||||
|
<artifactId>Grasscutter-api</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<scope>system</scope>
|
||||||
|
<systemPath>D:/Grasscutter/GrasscutterFork/grasscutter-1.0.3-dev.jar</systemPath>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.gson</groupId>
|
||||||
|
<artifactId>gson</artifactId>
|
||||||
|
<version>2.9.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
76
src/main/java/io/github/gmw/MeaMailPlusCore.java
Normal file
76
src/main/java/io/github/gmw/MeaMailPlusCore.java
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
package io.github.gmw;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.command.CommandMap;
|
||||||
|
import emu.grasscutter.plugin.Plugin;
|
||||||
|
import emu.grasscutter.server.game.GameServerPacketHandler;
|
||||||
|
import io.github.gmw.module.ConfigParser;
|
||||||
|
import io.github.gmw.module.PluginCommand;
|
||||||
|
import io.github.gmw.packetHandler.PlayerBornHook;
|
||||||
|
import io.github.gmw.packetHandler.PlayerJoinHook;
|
||||||
|
import io.github.gmw.module.TaskManager;
|
||||||
|
|
||||||
|
public class MeaMailPlusCore extends Plugin {
|
||||||
|
|
||||||
|
private static MeaMailPlusCore instance;
|
||||||
|
public ConfigParser config;
|
||||||
|
public TaskManager task;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLoad() {
|
||||||
|
this.logger("Loading...");
|
||||||
|
instance = this;
|
||||||
|
|
||||||
|
this.config = new ConfigParser();
|
||||||
|
this.config.loadConfig();
|
||||||
|
this.config.loadTemplates();
|
||||||
|
this.task = new TaskManager();
|
||||||
|
|
||||||
|
this.logger("Loaded!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
CommandMap.getInstance().registerCommand("meamail", new PluginCommand());
|
||||||
|
|
||||||
|
// register packet handler
|
||||||
|
GameServerPacketHandler packetHandler = Grasscutter.getGameServer().getPacketHandler();
|
||||||
|
packetHandler.registerPacketHandler(PlayerJoinHook.class);
|
||||||
|
packetHandler.registerPacketHandler(PlayerBornHook.class);
|
||||||
|
|
||||||
|
this.task.enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
CommandMap.getInstance().unregisterCommand("meamail");
|
||||||
|
this.task.disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MeaMailPlusCore getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reloadConfig() {
|
||||||
|
this.task.disable();
|
||||||
|
this.config.loadConfig();
|
||||||
|
this.config.loadTemplates();
|
||||||
|
this.task.enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void logger(String message) {
|
||||||
|
this.logger(message, "info");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void logger(String message, String type) {
|
||||||
|
if (Grasscutter.getLogger() == null) return;
|
||||||
|
|
||||||
|
String msg = "[MeaMailPlusCore] " + message;
|
||||||
|
switch (type) {
|
||||||
|
case "info" -> Grasscutter.getLogger().info(msg);
|
||||||
|
case "warn" -> Grasscutter.getLogger().warn(msg);
|
||||||
|
case "error" -> Grasscutter.getLogger().error(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
42
src/main/java/io/github/gmw/config/MeaMailConfig.java
Normal file
42
src/main/java/io/github/gmw/config/MeaMailConfig.java
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package io.github.gmw.config;
|
||||||
|
|
||||||
|
public final class MeaMailConfig {
|
||||||
|
public int[] updateTime = {4,0,0};
|
||||||
|
public int[] initialMail = {1001};
|
||||||
|
public int[] birthDayMail = {1004};
|
||||||
|
|
||||||
|
public DailySignInMailTask[] dailySignInMail = {
|
||||||
|
new DailySignInMailTask(1002,0)
|
||||||
|
};
|
||||||
|
|
||||||
|
public DailyRepetitionTask[] dailyRepetitionMail = {
|
||||||
|
new DailyRepetitionTask(1003,0,false, new int[]{12, 0, 0})
|
||||||
|
};
|
||||||
|
|
||||||
|
public static class DailyRepetitionTask extends MailTask {
|
||||||
|
public boolean onlineOnly;
|
||||||
|
public int[] triggerTime;
|
||||||
|
|
||||||
|
public DailyRepetitionTask(int templateId, int minLevel, boolean onlineOnly, int[] triggerTime) {
|
||||||
|
super(templateId, minLevel);
|
||||||
|
this.onlineOnly = onlineOnly;
|
||||||
|
this.triggerTime = triggerTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class DailySignInMailTask extends MailTask {
|
||||||
|
public DailySignInMailTask(int templateId, int minLevel) {
|
||||||
|
super(templateId, minLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class MailTask {
|
||||||
|
public int templateId;
|
||||||
|
public int minLevel; // 0 - 60
|
||||||
|
|
||||||
|
public MailTask(int templateId, int minLevel) {
|
||||||
|
this.templateId = templateId;
|
||||||
|
this.minLevel = minLevel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
32
src/main/java/io/github/gmw/config/MeaMailTemplate.java
Normal file
32
src/main/java/io/github/gmw/config/MeaMailTemplate.java
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package io.github.gmw.config;
|
||||||
|
|
||||||
|
public final class MeaMailTemplate {
|
||||||
|
public int templateId = 0;
|
||||||
|
public String title = "";
|
||||||
|
public String sender = "Server";
|
||||||
|
public long expireTime = 0;
|
||||||
|
|
||||||
|
public long remainTime = 2592000; // 31 days
|
||||||
|
public int importance = 0; // Starred mail, 0 = No star, 1 = Star.
|
||||||
|
public MailBody body = new MailBody();
|
||||||
|
public static class MailBody {
|
||||||
|
public String content = "";
|
||||||
|
public ItemInfo[] items = {};
|
||||||
|
|
||||||
|
public static class ItemInfo {
|
||||||
|
public int id;
|
||||||
|
public int count;
|
||||||
|
public int level;
|
||||||
|
|
||||||
|
public ItemInfo(int id, int count) {
|
||||||
|
this(id, count, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemInfo(int id, int count, int level) {
|
||||||
|
this.id = id;
|
||||||
|
this.count = count;
|
||||||
|
this.level = level;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
191
src/main/java/io/github/gmw/module/ConfigParser.java
Normal file
191
src/main/java/io/github/gmw/module/ConfigParser.java
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
package io.github.gmw.module;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Calendar;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import io.github.gmw.MeaMailPlusCore;
|
||||||
|
import io.github.gmw.config.MeaMailConfig;
|
||||||
|
import io.github.gmw.config.MeaMailTemplate;
|
||||||
|
|
||||||
|
public class ConfigParser {
|
||||||
|
private MeaMailConfig config;
|
||||||
|
private ArrayList<MeaMailTemplate> templates;
|
||||||
|
private final String configPath = "./plugins/MeaMailPlus";
|
||||||
|
private final String templatePath = this.configPath + "/template";
|
||||||
|
private final File configFile = new File( this.configPath + "/config.json");
|
||||||
|
private static final Gson gson = new GsonBuilder().setPrettyPrinting().create();
|
||||||
|
|
||||||
|
public void loadTemplates() {
|
||||||
|
switch (this.createConfigFolder(this.templatePath)){
|
||||||
|
case -1: return;
|
||||||
|
case 0: { // Without Template
|
||||||
|
this.createTemplate();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ArrayList<MeaMailTemplate> templates = new ArrayList<>();
|
||||||
|
File[] files = new File(this.templatePath)
|
||||||
|
.listFiles();
|
||||||
|
|
||||||
|
if (files == null) return; // No Template
|
||||||
|
else {
|
||||||
|
for (File file : files) {
|
||||||
|
try (FileReader fileReader = new FileReader(file)) {
|
||||||
|
MeaMailTemplate template = gson.fromJson(fileReader, MeaMailTemplate.class);
|
||||||
|
templates.add(template); // 加入模板列表
|
||||||
|
MeaMailPlusCore.getInstance()
|
||||||
|
.logger("Loaded template: " + file.getName() + " (TemplateId: " + template.templateId + ")");
|
||||||
|
} catch (Exception e) {
|
||||||
|
MeaMailPlusCore.getInstance()
|
||||||
|
.logger("Unable to load template file: " + file.getName(),"error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.templates = templates;
|
||||||
|
MeaMailPlusCore.getInstance()
|
||||||
|
.logger("Loaded " + templates.size() + " templates. :D");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// get template by templateId
|
||||||
|
public MeaMailTemplate getTemplate(int templateId) {
|
||||||
|
for (MeaMailTemplate template : this.templates) {
|
||||||
|
if (template.templateId == templateId) return template;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createTemplate() {
|
||||||
|
MeaMailTemplate template_initialMail = new MeaMailTemplate();
|
||||||
|
MeaMailTemplate template_dailySignInMail = new MeaMailTemplate();
|
||||||
|
MeaMailTemplate template_dailyRepetitionMail = new MeaMailTemplate();
|
||||||
|
MeaMailTemplate template_birthDayMail = new MeaMailTemplate();
|
||||||
|
|
||||||
|
template_initialMail.templateId = 1001;
|
||||||
|
template_initialMail.remainTime = 2592000; // 一个月后过期
|
||||||
|
template_initialMail.title = "Thank you for using MeaMailPlus!";
|
||||||
|
template_initialMail.sender= "MeaKiritaniIwako";
|
||||||
|
template_initialMail.importance = 1;
|
||||||
|
template_initialMail.body.content =
|
||||||
|
"Hi!\n\n" +
|
||||||
|
"Thank you for using MeaMailPlus! You can use MeaMailPlus to send mail to your friends more conveniently.\r\n\r\n" +
|
||||||
|
"Github HomePage" +
|
||||||
|
"<type=\"browser\" text=\"Github\" href=\"https://discord.gg/T5vZU6UyeG\"/>\r\n" +
|
||||||
|
"Grasscutter Discord" +
|
||||||
|
"<type=\"browser\" text=\"Discord\" href=\"https://discord.gg/T5vZU6UyeG\"/>";
|
||||||
|
template_initialMail.body.items = new MeaMailTemplate.MailBody.ItemInfo[]{
|
||||||
|
new MeaMailTemplate.MailBody.ItemInfo(80544, 1, 20),
|
||||||
|
new MeaMailTemplate.MailBody.ItemInfo(223, 150)
|
||||||
|
};
|
||||||
|
|
||||||
|
template_dailySignInMail.templateId = 1002;
|
||||||
|
template_dailySignInMail.remainTime = 604800; // 1 week
|
||||||
|
template_dailySignInMail.title = "Daily-Bonus";
|
||||||
|
template_dailySignInMail.body.content = "Have a nice day!";
|
||||||
|
template_dailySignInMail.body.items = new MeaMailTemplate.MailBody.ItemInfo[]{
|
||||||
|
new MeaMailTemplate.MailBody.ItemInfo(223, 20),
|
||||||
|
new MeaMailTemplate.MailBody.ItemInfo(224, 20)
|
||||||
|
};
|
||||||
|
|
||||||
|
template_dailyRepetitionMail.templateId = 1003;
|
||||||
|
template_dailyRepetitionMail.remainTime = 1209600; // 2 weeks later
|
||||||
|
template_dailyRepetitionMail.title = "Have a question?";
|
||||||
|
template_dailyRepetitionMail.sender= "TeamDarkshin";
|
||||||
|
template_dailyRepetitionMail.body.content =
|
||||||
|
"Join Grasscutter Discord server to ask questions and get answers:" +
|
||||||
|
"<type=\"browser\" text=\"Discord\" href=\"https://discord.gg/T5vZU6UyeG\"/>";
|
||||||
|
|
||||||
|
template_birthDayMail.templateId = 1004;
|
||||||
|
template_birthDayMail.remainTime = 2592000; // 1 month
|
||||||
|
template_birthDayMail.title = "Best Wishes on Your Birthday";
|
||||||
|
template_birthDayMail.sender = "Mailing System";
|
||||||
|
template_birthDayMail.importance = 1;
|
||||||
|
template_birthDayMail.body.content =
|
||||||
|
"Happy Birthday,Traveler! Please find your gift attached to this message.\r\n" +
|
||||||
|
"Thank you for all your support. We wish you a wonderful day, wherever in this world you may roam.";
|
||||||
|
template_birthDayMail.body.items = new MeaMailTemplate.MailBody.ItemInfo[]{
|
||||||
|
new MeaMailTemplate.MailBody.ItemInfo(118003, 1)
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
this.saveTemplate("InitialMail", template_initialMail);
|
||||||
|
this.saveTemplate("DailySignInMail", template_dailySignInMail);
|
||||||
|
this.saveTemplate("DailyRepetitionMail", template_dailyRepetitionMail);
|
||||||
|
this.saveTemplate("BirthDayMail", template_birthDayMail);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean saveTemplate(String fileName, MeaMailTemplate templateClass) {
|
||||||
|
try (FileWriter file = new FileWriter(this.templatePath + "/" + fileName + ".json")) {
|
||||||
|
file.write(gson.toJson(templateClass));
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// load config.json
|
||||||
|
public void loadConfig() {
|
||||||
|
try (FileReader file = new FileReader(this.configFile)) {
|
||||||
|
this.config = gson.fromJson(file, MeaMailConfig.class);
|
||||||
|
MeaMailPlusCore.getInstance().logger("Config Loaded!");
|
||||||
|
} catch (Exception e) {
|
||||||
|
this.config = new MeaMailConfig();
|
||||||
|
MeaMailPlusCore.getInstance().logger("Basic config creating...");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!saveConfig()) {
|
||||||
|
MeaMailPlusCore.getInstance().logger("Unable to save config file.","error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// save config.json
|
||||||
|
|
||||||
|
public int createConfigFolder(String path) {
|
||||||
|
File dir = new File(path);
|
||||||
|
|
||||||
|
if (!dir.exists() || !dir.isDirectory()) {
|
||||||
|
if(new File(String.valueOf(dir)).mkdirs()) return 0;
|
||||||
|
else return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean saveConfig() {
|
||||||
|
if (this.createConfigFolder(this.configPath) == -1) return false;
|
||||||
|
|
||||||
|
try (FileWriter file = new FileWriter(this.configFile)) {
|
||||||
|
file.write(gson.toJson(this.config));
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MeaMailConfig getConfig() {
|
||||||
|
return this.config;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTomorrowUpdateTime() {
|
||||||
|
// get tomorrow's update time
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
cal.add(Calendar.DATE, 1);
|
||||||
|
cal.set(Calendar.HOUR_OF_DAY, this.config.updateTime[0]);
|
||||||
|
cal.set(Calendar.MINUTE, this.config.updateTime[1]);
|
||||||
|
cal.set(Calendar.SECOND, this.config.updateTime[2]);
|
||||||
|
return cal.getTimeInMillis() / 1000;
|
||||||
|
}
|
||||||
|
}
|
118
src/main/java/io/github/gmw/module/PluginCommand.java
Normal file
118
src/main/java/io/github/gmw/module/PluginCommand.java
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
package io.github.gmw.module;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.command.Command;
|
||||||
|
import emu.grasscutter.command.CommandHandler;
|
||||||
|
import emu.grasscutter.game.player.Player;
|
||||||
|
import io.github.gmw.MeaMailPlusCore;
|
||||||
|
import io.github.gmw.config.MeaMailConfig;
|
||||||
|
import io.github.gmw.config.MeaMailTemplate;
|
||||||
|
import io.github.gmw.utils.MailCore;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@Command(label = "meamail", usage = "meamail help",
|
||||||
|
description = "MeaMailPlusCore command", aliases = {"mmail"}, permission = "meo.mail")
|
||||||
|
|
||||||
|
public class PluginCommand implements CommandHandler {
|
||||||
|
@Override
|
||||||
|
public void execute(Player sender, List<String> args) {
|
||||||
|
switch (args.size()) {
|
||||||
|
default -> // *No args*
|
||||||
|
showHelpList(sender);
|
||||||
|
case 1 -> {
|
||||||
|
switch (args.get(0)) {
|
||||||
|
case "reload" -> {
|
||||||
|
MeaMailPlusCore.getInstance().reloadConfig();
|
||||||
|
if (sender == null)
|
||||||
|
Grasscutter.getLogger().info("[MeaNoticeCore] Reloaded!");
|
||||||
|
else
|
||||||
|
CommandHandler.sendMessage(sender, "MeaNoticeCore config reloaded");
|
||||||
|
}
|
||||||
|
case "help" -> showHelpList(sender);
|
||||||
|
default -> CommandHandler.sendMessage(sender, "Invalid args.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 2 -> {
|
||||||
|
int templateId = Integer.parseInt(args.get(1));
|
||||||
|
MeaMailTemplate template = MeaMailPlusCore.getInstance().config.getTemplate(templateId);
|
||||||
|
|
||||||
|
|
||||||
|
switch (args.get(0)) {
|
||||||
|
case "sendall" -> {
|
||||||
|
if (template == null) {
|
||||||
|
CommandHandler.sendMessage(sender, "Invalid template id.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MailCore.sendMailToAllPlayers(template);
|
||||||
|
CommandHandler.sendMessage(sender, "Mail Sended!");
|
||||||
|
}
|
||||||
|
default -> CommandHandler.sendMessage(sender, "Invalid args.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 3 -> {
|
||||||
|
int templateId = Integer.parseInt(args.get(1));
|
||||||
|
MeaMailTemplate template = MeaMailPlusCore.getInstance().config.getTemplate(templateId);
|
||||||
|
|
||||||
|
switch (args.get(0)) {
|
||||||
|
case "send" -> {
|
||||||
|
if (template == null) {
|
||||||
|
CommandHandler.sendMessage(sender, "Invalid template id.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int uid = Integer.parseInt(args.get(2));
|
||||||
|
CommandHandler.sendMessage(sender, "Mail Sending...");
|
||||||
|
Grasscutter.getGameServer().getPlayers().forEach((index, player) -> {
|
||||||
|
if (player.getUid() == uid) {
|
||||||
|
MailCore.sendMailToPlayer(player, template);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
case "sendall" -> {
|
||||||
|
if (template == null) {
|
||||||
|
CommandHandler.sendMessage(sender, "Invalid template id.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int minLevel = Integer.parseInt(args.get(2));
|
||||||
|
MailCore.sendMailToAllPlayers(template, minLevel);
|
||||||
|
CommandHandler.sendMessage(sender, "Mail Sended!");
|
||||||
|
}
|
||||||
|
case "sendallonline" -> {
|
||||||
|
if (template == null) {
|
||||||
|
CommandHandler.sendMessage(sender, "Invalid template id.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int minLevel = Integer.parseInt(args.get(2));
|
||||||
|
MailCore.sendMailToAllPlayers(template, minLevel, true);
|
||||||
|
CommandHandler.sendMessage(sender, "Mail Sended!");
|
||||||
|
}
|
||||||
|
default -> CommandHandler.sendMessage(sender, "Invalid args.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showHelpList(Player sender) {
|
||||||
|
String[] helpMap = new String[]{
|
||||||
|
"Send Mail:",
|
||||||
|
" /meamail send <templateId> <uid>",
|
||||||
|
" /meamail sendall <templateId> <minLevel>",
|
||||||
|
" /meamail sendallonline <templateId> <minLevel>",
|
||||||
|
// " /meamail welcomemail <uid>",
|
||||||
|
// " /meamail dailymail <uid>",
|
||||||
|
// " /meamail initialmail <uid>",
|
||||||
|
"Other:",
|
||||||
|
" /meamail reload",
|
||||||
|
" /meamail help",
|
||||||
|
};
|
||||||
|
|
||||||
|
for (String text : helpMap) {
|
||||||
|
CommandHandler.sendMessage(sender, text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
76
src/main/java/io/github/gmw/module/TaskManager.java
Normal file
76
src/main/java/io/github/gmw/module/TaskManager.java
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
package io.github.gmw.module;
|
||||||
|
|
||||||
|
import io.github.gmw.MeaMailPlusCore;
|
||||||
|
import io.github.gmw.config.MeaMailConfig;
|
||||||
|
import io.github.gmw.utils.MailCore;
|
||||||
|
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
|
||||||
|
import io.github.gmw.config.MeaMailConfig.DailyRepetitionTask;
|
||||||
|
|
||||||
|
public class TaskManager {
|
||||||
|
private Timer timer;
|
||||||
|
|
||||||
|
private static class dailyBeginTask extends TimerTask {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
// new day
|
||||||
|
MailCore.dailyUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class dailyRepetitionTask extends TimerTask {
|
||||||
|
private DailyRepetitionTask task;
|
||||||
|
|
||||||
|
public dailyRepetitionTask(DailyRepetitionTask task) {
|
||||||
|
this.task = task;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
MailCore.repetitionUpdate(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getTaskStartTime(int hour, int minute, int second) {
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
cal.set(Calendar.HOUR_OF_DAY, hour);
|
||||||
|
cal.set(Calendar.MINUTE, minute);
|
||||||
|
cal.set(Calendar.SECOND, second);
|
||||||
|
|
||||||
|
if (cal.getTime().before(new Date())) {
|
||||||
|
cal.add(Calendar.DATE, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return cal.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void enable() {
|
||||||
|
DailyRepetitionTask[] tasks = MeaMailPlusCore.getInstance().config.getConfig().dailyRepetitionMail;
|
||||||
|
int[] updateTime = MeaMailPlusCore.getInstance().config.getConfig().updateTime;
|
||||||
|
int cycleTime = 1000 * 60 * 60 * 24;
|
||||||
|
|
||||||
|
// create timer and task
|
||||||
|
this.timer = new Timer();
|
||||||
|
this.timer.schedule(
|
||||||
|
new dailyBeginTask(),
|
||||||
|
getTaskStartTime(updateTime[0], updateTime[1], updateTime[2]),
|
||||||
|
cycleTime
|
||||||
|
);
|
||||||
|
|
||||||
|
for(DailyRepetitionTask task : tasks) {
|
||||||
|
this.timer.schedule(
|
||||||
|
new dailyRepetitionTask(task),
|
||||||
|
getTaskStartTime(task.triggerTime[0], task.triggerTime[1], task.triggerTime[2]),
|
||||||
|
cycleTime
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void disable() {
|
||||||
|
this.timer.cancel();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package io.github.gmw.packetHandler;
|
||||||
|
|
||||||
|
import emu.grasscutter.game.player.Player;
|
||||||
|
import emu.grasscutter.net.packet.Opcodes;
|
||||||
|
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||||
|
import emu.grasscutter.server.game.GameSession;
|
||||||
|
import emu.grasscutter.server.packet.recv.HandlerSetPlayerBornDataReq;
|
||||||
|
import io.github.gmw.utils.MailCore;
|
||||||
|
import io.github.gmw.utils.PlayerUtils;
|
||||||
|
|
||||||
|
@Opcodes(PacketOpcodes.SetPlayerBornDataReq)
|
||||||
|
public class PlayerBornHook extends HandlerSetPlayerBornDataReq {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||||
|
super.handle(session, header, payload);
|
||||||
|
int playerUid = session.getAccount().getPlayerUid();
|
||||||
|
|
||||||
|
// 第一次加入
|
||||||
|
if(playerUid != 0) {
|
||||||
|
MailCore.sendInitialMailToPlayer(playerUid);
|
||||||
|
MailCore.sendDailySignInMailToPlayer(playerUid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package io.github.gmw.packetHandler;
|
||||||
|
|
||||||
|
import emu.grasscutter.game.player.Player;
|
||||||
|
import emu.grasscutter.net.packet.Opcodes;
|
||||||
|
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||||
|
import emu.grasscutter.server.packet.recv.HandlerPlayerLoginReq;
|
||||||
|
import emu.grasscutter.server.game.GameSession;
|
||||||
|
import io.github.gmw.utils.MailCore;
|
||||||
|
import io.github.gmw.utils.PlayerUtils;
|
||||||
|
|
||||||
|
@Opcodes(PacketOpcodes.PlayerLoginReq)
|
||||||
|
public class PlayerJoinHook extends HandlerPlayerLoginReq {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||||
|
super.handle(session, header, payload);
|
||||||
|
Player player = session.getPlayer();
|
||||||
|
|
||||||
|
if (player == null) return; // new player
|
||||||
|
if(PlayerUtils.isFirstLoginToday(player)) { // first login today
|
||||||
|
if (PlayerUtils.isPlayerBirthDay(player)) { // is player birthday
|
||||||
|
MailCore.sendBirthDayMailToPlayer(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
// daily mail
|
||||||
|
MailCore.sendDailySignInMailToPlayer(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
177
src/main/java/io/github/gmw/utils/MailCore.java
Normal file
177
src/main/java/io/github/gmw/utils/MailCore.java
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
package io.github.gmw.utils;
|
||||||
|
|
||||||
|
import emu.grasscutter.Grasscutter;
|
||||||
|
import emu.grasscutter.database.DatabaseHelper;
|
||||||
|
import emu.grasscutter.game.player.Player;
|
||||||
|
import emu.grasscutter.game.mail.Mail;
|
||||||
|
import io.github.gmw.MeaMailPlusCore;
|
||||||
|
import io.github.gmw.config.MeaMailConfig;
|
||||||
|
import io.github.gmw.config.MeaMailTemplate;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
||||||
|
public final class MailCore {
|
||||||
|
public static void sendMailToPlayer(Player player, MeaMailTemplate template) {
|
||||||
|
sendMailToPlayer(player, template, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendMailToPlayer(Player player, int templateId) {
|
||||||
|
sendMailToPlayer(player, templateId, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendMailToPlayer(Player player, int templateId, int minLevel) {
|
||||||
|
MeaMailTemplate template = getTemplateById(templateId);
|
||||||
|
if(template == null) {
|
||||||
|
MeaMailPlusCore.getInstance().logger("Template with id " + templateId + " not found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sendMailToPlayer(player, template, minLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendMailToPlayer(Player player, MeaMailTemplate template, int minLevel) {
|
||||||
|
if (player.getLevel() >= minLevel) {
|
||||||
|
player.sendMail(templateToMail(template));
|
||||||
|
MeaMailPlusCore.getInstance().logger("Mail sent to " + player.getUid() + ": " + template.title);
|
||||||
|
} else {
|
||||||
|
MeaMailPlusCore.getInstance().logger("Player " + player.getUid() + " is not level " + minLevel + " and mail was not sent");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Mail templateToMail(MeaMailTemplate mailTemplate) {
|
||||||
|
Mail mail = new Mail();
|
||||||
|
mail.mailContent.content = mailTemplate.body.content;
|
||||||
|
mail.mailContent.title = mailTemplate.title;
|
||||||
|
mail.mailContent.sender = mailTemplate.sender;
|
||||||
|
mail.importance = mailTemplate.importance;
|
||||||
|
|
||||||
|
if (mailTemplate.remainTime == 0) {
|
||||||
|
mail.expireTime = mailTemplate.expireTime;
|
||||||
|
} else {
|
||||||
|
mail.expireTime = (int) Instant.now().getEpochSecond() + mailTemplate.remainTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
mail.itemList = Arrays.stream(mailTemplate.body.items)
|
||||||
|
.map(item -> new Mail.MailItem(item.id, item.count, item.level))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
return mail;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MeaMailConfig getConfig() {
|
||||||
|
return MeaMailPlusCore.getInstance().config.getConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MeaMailTemplate getTemplateById(int id) {
|
||||||
|
return MeaMailPlusCore.getInstance().config.getTemplate(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendMailToAllPlayers(int templateId) {
|
||||||
|
sendMailToAllPlayers(templateId, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendMailToAllPlayers(MeaMailTemplate template) {
|
||||||
|
sendMailToAllPlayers(template, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendMailToAllPlayers(int templateId, int minLevel) {
|
||||||
|
sendMailToAllPlayers(templateId, minLevel, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendMailToAllPlayers(MeaMailTemplate template, int minLevel) {
|
||||||
|
sendMailToAllPlayers(template, minLevel, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendMailToAllPlayers(int templateId, int minLevel, boolean onlineOnly) {
|
||||||
|
MeaMailTemplate template = getTemplateById(templateId);
|
||||||
|
if(template == null) {
|
||||||
|
MeaMailPlusCore.getInstance().logger("Template with id " + templateId + " not found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sendMailToAllPlayers(template, minLevel, onlineOnly);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendMailToAllPlayers(MeaMailTemplate template, int minLevel, boolean onlineOnly) {
|
||||||
|
if (template == null) return;
|
||||||
|
|
||||||
|
List<Player> onlinePlayers = new ArrayList<>();
|
||||||
|
List<Player> offlinePlayers = new ArrayList<>();
|
||||||
|
Grasscutter.getGameServer().getPlayers().forEach((index, player) -> onlinePlayers.add(player));
|
||||||
|
|
||||||
|
if (!onlineOnly) {
|
||||||
|
DatabaseHelper.getAllPlayers().forEach(player -> {
|
||||||
|
if (onlinePlayers.stream().noneMatch(onlinePlayer -> onlinePlayer.getUid() == player.getUid())) {
|
||||||
|
offlinePlayers.add(player);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// two methods to send mail
|
||||||
|
onlinePlayers.forEach(player -> sendMailToPlayer(player, template, minLevel));
|
||||||
|
offlinePlayers.forEach(player -> sendMailToPlayer(player, template, minLevel));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendDailySignInMailToPlayer(int uid) {
|
||||||
|
Grasscutter.getGameServer().getPlayers().forEach((index, player) -> {
|
||||||
|
if (player.getUid() == uid)
|
||||||
|
sendDailySignInMailToPlayer(player);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendDailySignInMailToPlayer(Player player) {
|
||||||
|
MeaMailConfig.DailySignInMailTask[] dailyTasks = getConfig().dailySignInMail;
|
||||||
|
for(MeaMailConfig.DailySignInMailTask task : dailyTasks) {
|
||||||
|
sendMailToPlayer(player, task.templateId, task.minLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendBirthDayMailToPlayer(int uid) {
|
||||||
|
Grasscutter.getGameServer().getPlayers().forEach((index, player) -> {
|
||||||
|
if (player.getUid() == uid)
|
||||||
|
sendBirthDayMailToPlayer(player);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendBirthDayMailToPlayer(Player player) {
|
||||||
|
int[] BirthdayMailTemplateIds = getConfig().birthDayMail;
|
||||||
|
for(int templateId : BirthdayMailTemplateIds) {
|
||||||
|
sendMailToPlayer(player, templateId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendInitialMailToPlayer(int uid) {
|
||||||
|
Grasscutter.getGameServer().getPlayers().forEach((index, player) -> {
|
||||||
|
if (player.getUid() == uid)
|
||||||
|
sendInitialMailToPlayer(player);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendInitialMailToPlayer(Player player) {
|
||||||
|
int[] InitialMailTemplateIds = getConfig().initialMail;
|
||||||
|
for(int templateId : InitialMailTemplateIds) {
|
||||||
|
sendMailToPlayer(player, templateId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void dailyUpdate() {
|
||||||
|
// update daily
|
||||||
|
Grasscutter.getGameServer().getPlayers().forEach((index, player) -> {
|
||||||
|
// birthday mail
|
||||||
|
if (PlayerUtils.isPlayerBirthDay(player)) {
|
||||||
|
sendBirthDayMailToPlayer(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
// daily sign in
|
||||||
|
sendDailySignInMailToPlayer(player);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void repetitionUpdate(MeaMailConfig.DailyRepetitionTask task) {
|
||||||
|
// update daily on time
|
||||||
|
sendMailToAllPlayers(task.templateId, task.minLevel, task.onlineOnly);
|
||||||
|
}
|
||||||
|
}
|
42
src/main/java/io/github/gmw/utils/PlayerUtils.java
Normal file
42
src/main/java/io/github/gmw/utils/PlayerUtils.java
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package io.github.gmw.utils;
|
||||||
|
|
||||||
|
import emu.grasscutter.game.player.Player;
|
||||||
|
import emu.grasscutter.game.player.PlayerBirthday;
|
||||||
|
import io.github.gmw.MeaMailPlusCore;
|
||||||
|
|
||||||
|
import java.util.Calendar;
|
||||||
|
|
||||||
|
public final class PlayerUtils {
|
||||||
|
public static long getPlayerBirthDayTime(Player player) {
|
||||||
|
int[] updateTime = MeaMailPlusCore.getInstance().config.getConfig().updateTime;
|
||||||
|
PlayerBirthday date = player.getBirthday();
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
|
||||||
|
cal.set(Calendar.DAY_OF_MONTH, date.getDay());
|
||||||
|
cal.set(Calendar.MONTH, date.getMonth() - 1);
|
||||||
|
|
||||||
|
cal.set(Calendar.HOUR_OF_DAY, updateTime[0]);
|
||||||
|
cal.set(Calendar.MINUTE, updateTime[1]);
|
||||||
|
cal.set(Calendar.SECOND, updateTime[2]);
|
||||||
|
return cal.getTimeInMillis() / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isPlayerBirthDay(Player player) {
|
||||||
|
if (player.hasBirthday()) {
|
||||||
|
long playerBirthDayTime = getPlayerBirthDayTime(player);
|
||||||
|
long playerEndBirthDayTime = playerBirthDayTime + 24 * 60 * 60;
|
||||||
|
long currentTime = System.currentTimeMillis() / 1000;
|
||||||
|
|
||||||
|
return currentTime >= playerBirthDayTime && currentTime < playerEndBirthDayTime;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isFirstLoginToday(Player player) {
|
||||||
|
long startOfDayTime = MeaMailPlusCore.getInstance().config.getTomorrowUpdateTime() - 24 * 60 * 60;
|
||||||
|
long playerLastActiveTime = player.getProfile().getLastActiveTime();
|
||||||
|
long currentTime = System.currentTimeMillis() / 1000;
|
||||||
|
|
||||||
|
return playerLastActiveTime < startOfDayTime && currentTime >= startOfDayTime;
|
||||||
|
}
|
||||||
|
}
|
10
src/main/resources/plugin.json
Normal file
10
src/main/resources/plugin.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"name": "MeaMailPlus",
|
||||||
|
"description": "A plugin to send some notices to players",
|
||||||
|
"version": "1.0",
|
||||||
|
"mainClass": "io.github.gmw.MeaMailPlusCore",
|
||||||
|
"authors": [
|
||||||
|
"Hell",
|
||||||
|
"ButterCookies"
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user