Skip to content

Commit

Permalink
Code improvements.
Browse files Browse the repository at this point in the history
  • Loading branch information
imDMK committed Oct 10, 2023
1 parent 6ef32e5 commit 5254110
Show file tree
Hide file tree
Showing 8 changed files with 127 additions and 73 deletions.
8 changes: 5 additions & 3 deletions src/main/java/com/github/imdmk/automessage/AutoMessage.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.github.imdmk.automessage.notification.NotificationSender;
import com.github.imdmk.automessage.notification.NotificationType;
import com.github.imdmk.automessage.notification.implementation.bossbar.audience.BossBarAudienceManager;
import com.github.imdmk.automessage.notification.implementation.bossbar.audience.BossBarAudienceService;
import com.github.imdmk.automessage.notification.implementation.bossbar.audience.BossBarAudienceTask;
import com.github.imdmk.automessage.notification.task.AutoNotificationTask;
import com.github.imdmk.automessage.scheduler.TaskScheduler;
Expand Down Expand Up @@ -71,17 +72,18 @@ public AutoMessage(Plugin plugin) {
BossBarAudienceManager bossBarAudienceManager = new BossBarAudienceManager();

/* Services */
BossBarAudienceService bossBarAudienceService = new BossBarAudienceService(bossBarAudienceManager);
UpdateService updateService = new UpdateService(plugin.getDescription());

/* Adventure */
this.bukkitAudiences = BukkitAudiences.create(plugin);
this.notificationSender = new NotificationSender(this.bukkitAudiences, bossBarAudienceManager);
this.notificationSender = new NotificationSender(this.bukkitAudiences);

/* Tasks */
TaskScheduler taskScheduler = new TaskSchedulerImpl(plugin, this.server);

taskScheduler.runTimerAsync(new AutoNotificationTask(this.pluginConfiguration, this.notificationSender), 0L, DurationUtil.toTicks(this.pluginConfiguration.autoMessagesDelay));
taskScheduler.runTimerAsync(new BossBarAudienceTask(bossBarAudienceManager), 0L, DurationUtil.toTicks(Duration.ofSeconds(1)));
taskScheduler.runTimerAsync(new AutoNotificationTask(this.pluginConfiguration, this.notificationSender, bossBarAudienceService), 0L, DurationUtil.toTicks(this.pluginConfiguration.autoMessagesDelay));
taskScheduler.runTimerAsync(new BossBarAudienceTask(bossBarAudienceManager, bossBarAudienceService), 0L, DurationUtil.toTicks(Duration.ofSeconds(1)));

/* Listeners */
Stream.of(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
import com.github.imdmk.automessage.notification.implementation.SubTitleNotification;
import com.github.imdmk.automessage.notification.implementation.TitleNotification;
import com.github.imdmk.automessage.notification.implementation.bossbar.BossBarNotification;
import com.github.imdmk.automessage.notification.implementation.bossbar.audience.BossBarAudience;
import com.github.imdmk.automessage.notification.implementation.bossbar.audience.BossBarAudienceManager;
import com.github.imdmk.automessage.text.Formatter;
import com.github.imdmk.automessage.util.ComponentUtil;
import net.kyori.adventure.audience.Audience;
Expand All @@ -18,33 +16,40 @@
public class NotificationSender {

private final AudienceProvider audienceProvider;
private final BossBarAudienceManager bossBarAudienceManager;

public NotificationSender(AudienceProvider audienceProvider, BossBarAudienceManager bossBarAudienceManager) {
public NotificationSender(AudienceProvider audienceProvider) {
this.audienceProvider = audienceProvider;
this.bossBarAudienceManager = bossBarAudienceManager;
}

public void broadcast(Notification notification) {
Audience audience = this.audienceProvider.players();

this.sendNotification(audience, notification, null);
public Audience audiencePlayers() {
return this.audienceProvider.players();
}

public void sendNotification(CommandSender sender, Notification notification) {
public void sendNotification(CommandSender sender, Notification notification, Formatter formatter) {
Audience audience = this.createAudience(sender);

this.sendNotification(audience, notification, null);
this.sendNotification(audience, notification, formatter);
}

public void sendNotification(CommandSender sender, Notification notification, Formatter formatter) {
public void sendNotification(CommandSender sender, Notification notification) {
Audience audience = this.createAudience(sender);

this.sendNotification(audience, notification, formatter);
this.sendNotification(audience, notification);
}

public void sendNotification(Audience audience, Notification notification, Formatter formatter) {
Component message = ComponentUtil.deserialize(this.format(notification.message(), formatter));
Component message = ComponentUtil.deserialize(formatter.format(notification.message()));

processNotification(audience, notification, message);
}

public void sendNotification(Audience audience, Notification notification) {
Component message = ComponentUtil.deserialize(notification.message());

processNotification(audience, notification, message);
}

private void processNotification(Audience audience, Notification notification, Component message) {
NotificationType type = notification.type();

switch (type) {
Expand All @@ -70,12 +75,9 @@ public void sendNotification(Audience audience, Notification notification, Forma
case BOSS_BAR -> {
BossBarNotification bossBarNotification = (BossBarNotification) notification;

BossBar bossBar = BossBar.bossBar(message, bossBarNotification.progress(), bossBarNotification.color(), bossBarNotification.overlay());
BossBar bossBar = bossBarNotification.create(message);

audience.showBossBar(bossBar);

BossBarAudience bossBarAudience = new BossBarAudience(bossBar, audience, bossBarNotification);
this.bossBarAudienceManager.add(bossBarAudience);
}

case DISABLED -> {
Expand All @@ -85,15 +87,7 @@ public void sendNotification(Audience audience, Notification notification, Forma
}
}

private String format(String message, Formatter formatter) {
if (formatter == null) {
return message;
}

return formatter.format(message);
}

public Audience createAudience(CommandSender sender) {
private Audience createAudience(CommandSender sender) {
if (sender instanceof Player player) {
return this.audienceProvider.player(player.getUniqueId());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,29 @@

import com.github.imdmk.automessage.notification.Notification;
import com.github.imdmk.automessage.notification.NotificationType;
import com.github.imdmk.automessage.util.ComponentUtil;
import com.github.imdmk.automessage.util.DurationUtil;
import com.github.imdmk.automessage.util.StringUtil;
import net.kyori.adventure.bossbar.BossBar;
import net.kyori.adventure.text.Component;

import java.time.Duration;

public record BossBarNotification(String message, Duration time, float progress, boolean timeChangesProgress, BossBar.Color color,
BossBar.Overlay overlay) implements Notification {
public record BossBarNotification(String message, Duration time, float progress,
BossBar.Color color, BossBar.Overlay overlay) implements Notification {

public BossBar create() {
Component name = ComponentUtil.deserialize(this.message);
float replacedProgress = this.progress < 0.0F ? BossBar.MAX_PROGRESS : this.progress;

return BossBar.bossBar(name, replacedProgress, this.color, this.overlay);
}

public BossBar create(Component name) {
float replacedProgress = this.progress < 0.0F ? BossBar.MAX_PROGRESS : this.progress;

return BossBar.bossBar(name, replacedProgress, this.color, this.overlay);
}

@Override
public NotificationType type() {
Expand All @@ -22,7 +37,6 @@ public String format() {
+ StringUtil.NEW_LINE + StringUtil.GRAY_COLOR + "name: " + this.message
+ StringUtil.NEW_LINE + StringUtil.GRAY_COLOR + "time: " + DurationUtil.toHumanReadable(this.time)
+ StringUtil.NEW_LINE + StringUtil.GRAY_COLOR + "progress: " + this.progress
+ StringUtil.NEW_LINE + StringUtil.GRAY_COLOR + "timeChangesProgress: " + this.timeChangesProgress
+ StringUtil.NEW_LINE + StringUtil.GRAY_COLOR + "color: " + this.color.name()
+ StringUtil.NEW_LINE + StringUtil.GRAY_COLOR + "overlay: " + this.overlay.name();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
import java.time.Duration;
import java.time.Instant;

public record BossBarAudience(BossBar bossBar, Audience audience, Duration time, Instant endOfBossBar, boolean timeChangesProgress) {
public record BossBarAudience(Audience audience, BossBar bossBar, Instant endOfBossBar, Duration time, float progress) {

public BossBarAudience(BossBar bossBar, Audience audience, BossBarNotification notification) {
this(bossBar, audience, notification.time(), Instant.now().plus(notification.time()), notification.timeChangesProgress());
public BossBarAudience(Audience audience, BossBar bossBar, BossBarNotification notification) {
this(audience, bossBar, Instant.now().plus(notification.time()), notification.time(), notification.progress());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

public class BossBarAudienceManager {

private final HashSet<BossBarAudience> bossBarAudiences = new HashSet<>();
private final Set<BossBarAudience> bossBarAudiences = new HashSet<>();

public void add(BossBarAudience bossBarAudience) {
this.bossBarAudiences.add(bossBarAudience);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.github.imdmk.automessage.notification.implementation.bossbar.audience;

import com.github.imdmk.automessage.notification.implementation.bossbar.BossBarNotification;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.bossbar.BossBar;

import java.time.Duration;
import java.time.Instant;

public class BossBarAudienceService {

private final BossBarAudienceManager bossBarAudienceManager;

public BossBarAudienceService(BossBarAudienceManager bossBarAudienceManager) {
this.bossBarAudienceManager = bossBarAudienceManager;
}

public void update(BossBarAudience bossBarAudience) {
BossBar bossBar = bossBarAudience.bossBar();

Instant now = Instant.now();
Instant endOfBossBar = bossBarAudience.endOfBossBar();

if (now.isAfter(endOfBossBar)) {
this.hide(bossBarAudience);
return;
}

float audienceProgress = bossBarAudience.progress();

if (audienceProgress < 0.0F) {
Duration between = Duration.between(now, endOfBossBar);
Duration audienceTime = bossBarAudience.time();

float difference = (float) between.toMillis() / audienceTime.toMillis();
float progress = Math.max(0.0F, Math.min(1.0F, difference));

bossBar.progress(progress);
}
}

public BossBarAudience create(Audience audience, BossBarNotification notification) {
BossBar bossBar = notification.create();
BossBarAudience bossBarAudience = new BossBarAudience(audience, bossBar, notification);

this.bossBarAudienceManager.add(bossBarAudience);
return bossBarAudience;
}

public void hide(BossBarAudience bossBarAudience) {
Audience audience = bossBarAudience.audience();
BossBar bossBar = bossBarAudience.bossBar();

audience.hideBossBar(bossBar);
this.bossBarAudienceManager.remove(bossBarAudience);
}
}
Original file line number Diff line number Diff line change
@@ -1,43 +1,19 @@
package com.github.imdmk.automessage.notification.implementation.bossbar.audience;

import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.bossbar.BossBar;

import java.time.Duration;
import java.time.Instant;

public class BossBarAudienceTask implements Runnable {

private final BossBarAudienceManager bossBarAudienceManager;
private final BossBarAudienceService bossBarAudienceService;

public BossBarAudienceTask(BossBarAudienceManager bossBarAudienceManager) {
public BossBarAudienceTask(BossBarAudienceManager bossBarAudienceManager, BossBarAudienceService bossBarAudienceService) {
this.bossBarAudienceManager = bossBarAudienceManager;
this.bossBarAudienceService = bossBarAudienceService;
}

@Override
public void run() {
for (BossBarAudience bossBarAudience : this.bossBarAudienceManager.getBossBarAudiences()) {
Audience audience = bossBarAudience.audience();
BossBar bossBar = bossBarAudience.bossBar();

Instant now = Instant.now();
Instant endOfBossBar = bossBarAudience.endOfBossBar();

if (now.isAfter(endOfBossBar)) {
audience.hideBossBar(bossBar);
this.bossBarAudienceManager.remove(bossBarAudience);
return;
}

if (bossBarAudience.timeChangesProgress()) {
Duration between = Duration.between(now, endOfBossBar);
Duration time = bossBarAudience.time();

float difference = (float) between.toMillis() / time.toMillis();
float progress = Math.max(0.0F, Math.min(1.0F, difference));

bossBar.progress(progress);
}
this.bossBarAudienceService.update(bossBarAudience);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,27 @@
import com.github.imdmk.automessage.configuration.implementation.PluginConfiguration;
import com.github.imdmk.automessage.notification.Notification;
import com.github.imdmk.automessage.notification.NotificationSender;
import com.github.imdmk.automessage.notification.implementation.bossbar.BossBarNotification;
import com.github.imdmk.automessage.notification.implementation.bossbar.audience.BossBarAudienceService;
import com.github.imdmk.automessage.notification.settings.NotificationSettings;
import com.github.imdmk.automessage.util.CollectionUtil;
import net.kyori.adventure.audience.Audience;

import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;

public class AutoNotificationTask implements Runnable {

private final PluginConfiguration pluginConfiguration;
private final NotificationSender notificationSender;
private final BossBarAudienceService bossBarAudienceService;

private final AtomicInteger position = new AtomicInteger(0);

public AutoNotificationTask(PluginConfiguration pluginConfiguration, NotificationSender notificationSender) {
public AutoNotificationTask(PluginConfiguration pluginConfiguration, NotificationSender notificationSender, BossBarAudienceService bossBarAudienceService) {
this.pluginConfiguration = pluginConfiguration;
this.notificationSender = notificationSender;
this.bossBarAudienceService = bossBarAudienceService;
}

@Override
Expand All @@ -32,10 +36,17 @@ public void run() {
return;
}

this.selectNotification().ifPresent(this.notificationSender::broadcast);
Audience audience = this.notificationSender.audiencePlayers();
Notification notification = this.selectNotification();

this.notificationSender.sendNotification(audience, notification);

if (notification instanceof BossBarNotification bossBarNotification) {
this.bossBarAudienceService.create(audience, bossBarNotification);
}
}

private Optional<Notification> selectNotification() {
private Notification selectNotification() {
NotificationSettings.AutoMessageMode autoMessageMode = this.pluginConfiguration.autoMessagesMode;
List<Notification> autoMessages = this.pluginConfiguration.autoMessages;

Expand All @@ -45,13 +56,13 @@ private Optional<Notification> selectNotification() {
};
}

private Optional<Notification> selectRandomNotification(List<Notification> notifications) {
return CollectionUtil.getRandom(notifications);
private Notification selectRandomNotification(List<Notification> notifications) {
return CollectionUtil.getRandom(notifications).orElseThrow();
}

private Optional<Notification> selectNextNotification(List<Notification> notifications) {
private Notification selectNextNotification(List<Notification> notifications) {
int position = this.position.getAndIncrement() % notifications.size();

return CollectionUtil.select(notifications, position);
return CollectionUtil.select(notifications, position).orElseThrow();
}
}

0 comments on commit 5254110

Please sign in to comment.