Skip to content

Commit a0be5ee

Browse files
author
Urpagin
committed
Additions & Fixes
Added night/day cycle in Discord bot RPC, fixed 'null' player in Discord /deaths, added players total playtime in Discord /deaths
1 parent fe94f62 commit a0be5ee

6 files changed

Lines changed: 81 additions & 16 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ plugins {
55
}
66

77
group = 'net.urpagin'
8-
version = '1.2.0'
8+
version = '1.2.1'
99

1010
var jdaVersion = "5.0.0-beta.24"
1111

src/main/java/net/urpagin/discordlink/DiscordInterface.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import net.dv8tion.jda.api.requests.GatewayIntent;
1010
import net.urpagin.discordlink.discord.listeners.DiscordCommandListener;
1111
import net.urpagin.discordlink.discord.listeners.DiscordMessageListener;
12+
import net.urpagin.discordlink.minecraft.listeners.TimeWatcher;
1213
import org.bukkit.Bukkit;
1314
import org.bukkit.Server;
1415
import org.bukkit.plugin.java.JavaPlugin;
@@ -55,17 +56,26 @@ public void initializeBot() {
5556
}
5657

5758
public static void updateActivityPlaying() {
58-
Server server = Bukkit.getServer(); // Get server instance
5959
Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, () -> {
60-
int onlinePlayers = server.getOnlinePlayers().size();
61-
int maxPlayers = server.getMaxPlayers();
62-
String plural = (onlinePlayers > 1) ? "players" : "player";
63-
String activityMessage = String.format("\uD83C\uDF1F %d/%d %s online!", onlinePlayers, maxPlayers, plural);
60+
String activityMessage = getActivityMessage();
6461
api.getPresence().setActivity(Activity.customStatus(activityMessage));
6562
}, 20L); // Delay the task by 20 ticks (1 second)
6663
// When a player quits it's not registered when no waiting is done.
6764
}
6865

66+
private static String getActivityMessage() {
67+
Server server = Bukkit.getServer(); // Get server instance
68+
69+
int onlinePlayers = server.getOnlinePlayers().size();
70+
int maxPlayers = server.getMaxPlayers();
71+
boolean isDay = TimeWatcher.isDay();
72+
73+
String timeEmoji = (isDay) ? "☀\uFE0F" : "\uD83C\uDF19"; // Either sun or crescent moon emoji.
74+
String playerPlural = (onlinePlayers > 1) ? "players" : "player";
75+
return String.format("%s %d/%d %s online!", timeEmoji, onlinePlayers, maxPlayers, playerPlural);
76+
}
77+
78+
6979
public boolean sendMessageToChannel(String content) {
7080
if (content.length() > DISCORD_MAX_MESSAGE_LENGTH) return false;
7181
content = content.strip();

src/main/java/net/urpagin/discordlink/DiscordLink.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public void onEnable() {
2828
getServer().getPluginManager().registerEvents(new MinecraftPlayerQuitListener(), this);
2929
getServer().getPluginManager().registerEvents(new MinecraftPlayerDeathListener(), this);
3030
getServer().getPluginManager().registerEvents(new MinecraftPlayerConnectionTracker(), this);
31+
new TimeWatcher(this.getServer().getWorlds().getFirst()).runTaskTimer(this, 0L, 80L); // Every 4 seconds
3132

3233
discord = new DiscordInterface(this, ReadConfig.getBotToken(), ReadConfig.getDiscordChannelId());
3334

src/main/java/net/urpagin/discordlink/discord/listeners/DiscordCommandListener.java

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -113,48 +113,68 @@ private String getDeathsString() {
113113
Map<String, UUID> allPlayerNames = new HashMap<>();
114114

115115
// Add offline players name & UUID to the set!
116-
for (OfflinePlayer p : Bukkit.getServer().getOfflinePlayers())
116+
for (OfflinePlayer p : Bukkit.getServer().getOfflinePlayers()) {
117+
if (!p.hasPlayedBefore() || p.getName() == null)
118+
continue;
117119
allPlayerNames.put(p.getName(), p.getUniqueId());
120+
}
118121
// Add online players name & UUID to the set!
119-
for (Player p : Bukkit.getServer().getOnlinePlayers())
122+
for (Player p : Bukkit.getServer().getOnlinePlayers()) {
120123
allPlayerNames.put(p.getName(), p.getUniqueId());
124+
}
121125

122126
if (allPlayerNames.isEmpty()) {
123127
return String.format("%s No one died! Yet... %s", SMILE_EMOJI, WICKED_IMP_EMOJI);
124128
}
125129

126130
// Map of username to death count
127-
Map<String, Integer> playersDeathCount = new HashMap<>();
131+
Map<UUID, Integer> playersDeathCount = new HashMap<>();
128132
for (Map.Entry<String, UUID> entry : allPlayerNames.entrySet()) {
129-
String playerName = entry.getKey();
130133
UUID playerId = entry.getValue();
131134
OfflinePlayer p = Bukkit.getOfflinePlayer(playerId);
132-
playersDeathCount.put(playerName, p.getStatistic(Statistic.DEATHS));
135+
playersDeathCount.put(playerId, p.getStatistic(Statistic.DEATHS));
133136
}
134137

135138
// Sorting death count by descending order
136-
Map<String, Integer> sortedByDeathCount = playersDeathCount.entrySet().stream()
139+
Map<UUID, Integer> sortedByDeathCount = playersDeathCount.entrySet().stream()
137140
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
138141
.collect(Collectors.toMap(
139142
Map.Entry::getKey,
140143
Map.Entry::getValue,
141144
(oldValue, newValue) -> oldValue,
142145
LinkedHashMap::new));
143146

147+
144148
StringBuilder response = new StringBuilder();
145149
response.append(String.format("## %s Deaths Leaderboard %s\n", SKULL_EMOJI, SKULL_EMOJI));
146150
String firstPlaceEmoji = String.format(" %s%s%s", CROSSBONES_EMOJI, CROSSBONES_EMOJI, CROSSBONES_EMOJI);
147-
for (Map.Entry<String, Integer> entry : sortedByDeathCount.entrySet()) {
148-
String playerName = entry.getKey();
151+
for (Map.Entry<UUID, Integer> entry : sortedByDeathCount.entrySet()) {
152+
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(entry.getKey());
153+
String playerName = offlinePlayer.getName();
149154
int deathCount = entry.getValue();
150155
String plural = (deathCount > 1) ? "times" : "time";
151-
response.append("- ").append(playerName).append(" died **").append(deathCount).append("** ").append(plural).append(firstPlaceEmoji).append("\n");
156+
String totalHoursPlayed = getHoursFromTicks(offlinePlayer.getStatistic(Statistic.PLAY_ONE_MINUTE)) + "h";
157+
response.append("- ")
158+
.append(playerName)
159+
.append(" died **")
160+
.append(deathCount)
161+
.append("** ")
162+
.append(plural)
163+
.append(firstPlaceEmoji)
164+
.append(" (")
165+
.append(totalHoursPlayed)
166+
.append(")\n");
152167
firstPlaceEmoji = "";
153168
}
154169

155170
return response.toString();
156171
}
157172

173+
private long getHoursFromTicks(int ticks) {
174+
return ticks / 20 / 60 / 60; // Because 20 ticks is 1 second.
175+
}
176+
177+
158178
private void handleBecomeAGod(SlashCommandInteractionEvent event) {
159179
String response = String.format("%s%s%s%s blud be trippin frfr %s%s%s", MAN_SPEAKING_EMOJI, MAN_SPEAKING_EMOJI, FIRE_EMOJI, FIRE_EMOJI, SKULL_EMOJI, SKULL_EMOJI, SKULL_EMOJI);
160180
replyToEvent(event, response);

src/main/java/net/urpagin/discordlink/minecraft/listeners/MinecraftChatListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public void onChat(AsyncPlayerChatEvent event) {
6060
// ---- now process chat message ----
6161

6262
String playerHealthString = getPlayerHealthString(event.getPlayer());
63-
String discordMessage = "";
63+
String discordMessage;
6464

6565
if (playerHealthString.isEmpty()) {
6666
discordMessage = String.format("**<%s>** %s", playerName, message);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package net.urpagin.discordlink.minecraft.listeners;
2+
3+
import net.urpagin.discordlink.DiscordInterface;
4+
import org.bukkit.World;
5+
import org.bukkit.scheduler.BukkitRunnable;
6+
7+
public class TimeWatcher extends BukkitRunnable {
8+
private static World world;
9+
private boolean wasDay;
10+
11+
public TimeWatcher(World world) {
12+
TimeWatcher.world = world;
13+
this.wasDay = isDaytime(world.getTime());
14+
}
15+
16+
private static boolean isDaytime(long time) {
17+
return time >= 0 && time < 12300;
18+
}
19+
20+
public static boolean isDay() {
21+
return isDaytime(world.getTime());
22+
}
23+
24+
@Override
25+
public void run() {
26+
boolean isDay = isDaytime(world.getTime());
27+
28+
if (isDay == wasDay)
29+
return;
30+
wasDay = isDay;
31+
32+
DiscordInterface.updateActivityPlaying();
33+
}
34+
}

0 commit comments

Comments
 (0)