1
mirror of https://github.com/carm-outsource/TimeReward.git synced 2026-06-05 01:08:10 +08:00

feat(time): 尝试支持按日/周/月/总时长判别奖励。

This commit is contained in:
2023-09-02 17:14:00 +08:00
parent e1f4172a7f
commit dd80c5c9f7
24 changed files with 589 additions and 372 deletions
@@ -0,0 +1,37 @@
package cc.carm.plugin.timereward.user;
import cc.carm.plugin.timereward.data.IntervalType;
import cc.carm.plugin.timereward.data.RewardContents;
import cc.carm.plugin.timereward.data.TimeRecord;
import org.jetbrains.annotations.NotNull;
import java.time.Duration;
import java.util.Collections;
import java.util.UUID;
public class LockedRewardData extends UserRewardData {
public LockedRewardData(@NotNull UUID userUUID) {
super(userUUID, TimeRecord.empty(), Collections.emptyMap());
}
@Override
public Duration getOnlineDuration(@NotNull IntervalType type) {
return Duration.ZERO;
}
@Override
public boolean isClaimed(@NotNull RewardContents reward) {
return false;
}
@Override
public boolean isTimeEnough(RewardContents reward) {
return false;
}
@Override
public boolean addClaimedReward(@NotNull RewardContents reward) {
return false;
}
}
@@ -0,0 +1,84 @@
package cc.carm.plugin.timereward.user;
import cc.carm.lib.easyplugin.user.UserData;
import cc.carm.plugin.timereward.data.IntervalType;
import cc.carm.plugin.timereward.data.RewardContents;
import cc.carm.plugin.timereward.data.TimeRecord;
import org.jetbrains.annotations.NotNull;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.UUID;
/**
* 用户奖励数据,用于存储用户的奖励的领取情况。
*/
public class UserRewardData extends UserData<UUID> {
private final @NotNull Map<String, LocalDateTime> claimedRewards; // 记录已领取的奖励ID
private final @NotNull TimeRecord recordTime;
private final @NotNull LocalDateTime joinTime;
public UserRewardData(@NotNull UUID userUUID, @NotNull TimeRecord timeRecord, @NotNull Map<String, LocalDateTime> claimedRewards) {
this(userUUID, claimedRewards, timeRecord, LocalDateTime.now());
}
public UserRewardData(@NotNull UUID userUUID, @NotNull Map<String, LocalDateTime> claimedRewards,
@NotNull TimeRecord recordTime, @NotNull LocalDateTime joinTime) {
super(userUUID);
this.claimedRewards = claimedRewards;
this.recordTime = recordTime;
this.joinTime = joinTime;
}
public @NotNull UUID getUserUUID() {
return getKey();
}
/**
* @return 数据库中的时间记录
*/
public @NotNull TimeRecord getTimeRecord() {
return recordTime;
}
/**
* 得到本次加入游戏的时间
*
* @return 本次加入游戏时间
*/
public @NotNull LocalDateTime getJoinTime() {
return joinTime;
}
/**
* @return 玩家的在线时间周期,需指定周期类型{@link IntervalType}
*/
public Duration getOnlineDuration(@NotNull IntervalType type) {
return type.calculate(getTimeRecord(), getJoinTime());
}
public boolean isTimeEnough(RewardContents reward) {
return getOnlineDuration(reward.getType()).getSeconds() >= reward.getTime();
}
public @NotNull Map<String, LocalDateTime> getClaimedRewards() {
return claimedRewards;
}
public boolean isClaimed(@NotNull RewardContents reward) {
LocalDateTime claimedDate = claimedRewards.get(reward.getRewardID());
if (claimedDate == null) return false;
return !reward.getType().isReclaimable(claimedDate);
}
public boolean addClaimedReward(@NotNull RewardContents reward) {
if (isClaimed(reward)) return false; // 已经领取过了
this.claimedRewards.put(reward.getRewardID(), LocalDateTime.now());
return true;
}
}