Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions src/client/java/net/legitimoose/bot/chat/GameChatHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,7 @@
import net.legitimoose.bot.discord.DiscordBot;
import net.legitimoose.bot.discord.command.MsgCommand;
import net.legitimoose.bot.discord.command.ReplyCommand;
import net.legitimoose.bot.scraper.Ban;
import net.legitimoose.bot.scraper.Player;
import net.legitimoose.bot.scraper.Rank;
import net.legitimoose.bot.scraper.Scraper;
import net.legitimoose.bot.scraper.*;
import net.legitimoose.bot.util.DiscordUtil;
import net.legitimoose.bot.util.DiscordWebhook;
import net.legitimoose.bot.util.DiscordWebhook.Embed;
Expand Down Expand Up @@ -210,9 +207,8 @@ public void handleSwitchMessage(SwitchMatcher transfer, DiscordWebhook webhook,

public void handleJoinMessage(JoinMatcher join, DiscordWebhook webhook) {
Instant time = Instant.now();
MongoCollection<Player> players = Scraper.getInstance().db.getCollection("players", Player.class);
String username = join.getUsername();
Player dbPlayer = players.find(eq("name", username)).first();
Player dbPlayer = Database.getPlayers().find(eq("name", username)).first();

String uuid = McUtil.getUuidOrThrow(username);
int days;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Updates;
import net.legitimoose.bot.scraper.Database;
import net.legitimoose.bot.scraper.Player;
import net.legitimoose.bot.scraper.Scraper;

Expand All @@ -15,7 +16,6 @@
import static com.mongodb.client.model.Filters.eq;

public class BlockCommands {
private static final MongoCollection<Player> coll = Scraper.getInstance().db.getCollection("players", Player.class);

public static void register(CommandDispatcher<CommandSource> dispatcher) {
// Block
Expand All @@ -24,14 +24,14 @@ public static void register(CommandDispatcher<CommandSource> dispatcher) {
.executes(context -> {
CommandSource source = context.getSource();
String blocked = context.getArgument("username", String.class);
coll.updateOne(eq("name", source.username()), Updates.set("blocked", List.of(blocked)));
Database.getPlayers().updateOne(eq("name", source.username()), Updates.set("blocked", List.of(blocked)));
source.sendMessage("Blocked @" + blocked + " from sending you messages");
return Command.SINGLE_SUCCESS;
}))
.then(LiteralArgumentBuilder.<CommandSource>literal("list")
.executes(context -> {
CommandSource source = context.getSource();
List<String> blockedPlayers = coll.find(eq("name", source.username())).first().blocked();
List<String> blockedPlayers = Database.getPlayers().find(eq("name", source.username())).first().blocked();
source.sendMessage("Blocked players:<br>" + String.join("<br>", blockedPlayers));
return Command.SINGLE_SUCCESS;
})));
Expand All @@ -41,7 +41,7 @@ public static void register(CommandDispatcher<CommandSource> dispatcher) {
.executes(context -> {
CommandSource source = context.getSource();
String blocked = context.getArgument("username", String.class);
coll.updateOne(eq("name", source.username()), Updates.pull("blocked", blocked));
Database.getPlayers().updateOne(eq("name", source.username()), Updates.pull("blocked", blocked));
source.sendMessage("Unblocked @" + blocked + " from sending you messages");
return Command.SINGLE_SUCCESS;
})));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,38 +8,38 @@
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;
import net.legitimoose.bot.scraper.Database;
import net.legitimoose.bot.scraper.Player;
import net.legitimoose.bot.scraper.Scraper;

import static com.mongodb.client.model.Filters.eq;
import static com.mongodb.client.model.Sorts.descending;

public class StreakCommand {
public static final MongoCollection<Player> players = Scraper.getInstance().db.getCollection("players", Player.class);

public static void register(CommandDispatcher<CommandSource> dispatcher) {
dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("streak")
.then(LiteralArgumentBuilder.<CommandSource>literal("on")
.executes(context -> {
Player player = players.find(eq("name", context.getSource().username())).first();
Player player = Database.getPlayers().find(eq("name", context.getSource().username())).first();
assert player != null;
if (player.streak().notifications() == true) {
context.getSource().sendMessage("Your streak notifications are already enabled!");
} else {
players.updateOne(eq("name", context.getSource().username()), Updates.set("streak.notify", true));
Database.getPlayers().updateOne(eq("name", context.getSource().username()), Updates.set("streak.notify", true));
context.getSource().sendMessage("Enabled streak notifications!");
}
return Command.SINGLE_SUCCESS;
}))

.then(LiteralArgumentBuilder.<CommandSource>literal("off")
.executes(context -> {
Player player = players.find(eq("name", context.getSource().username())).first();
Player player = Database.getPlayers().find(eq("name", context.getSource().username())).first();
assert player != null;
if (player.streak().notifications() == false) {
context.getSource().sendMessage("Your streak notifications are already disabled!");
} else {
players.updateOne(eq("name", context.getSource().username()), Updates.set("streak.notify", false));
Database.getPlayers().updateOne(eq("name", context.getSource().username()), Updates.set("streak.notify", false));
context.getSource().sendMessage("Disabled streak notifications!");
}
return Command.SINGLE_SUCCESS;
Expand All @@ -48,7 +48,7 @@ public static void register(CommandDispatcher<CommandSource> dispatcher) {
.then(RequiredArgumentBuilder.<CommandSource, String>argument("username", StringArgumentType.string())
.executes(context -> {
String username = context.getArgument("username", String.class);
Player player = players.find(eq("name", username)).first();
Player player = Database.getPlayers().find(eq("name", username)).first();
if (player == null) {
context.getSource().sendMessage("Player not found!");
return Command.SINGLE_SUCCESS;
Expand All @@ -70,7 +70,7 @@ public static void register(CommandDispatcher<CommandSource> dispatcher) {
}))

.executes(context -> {
Player player = players.find(eq("name", context.getSource().username())).first();
Player player = Database.getPlayers().find(eq("name", context.getSource().username())).first();
assert player != null;
context.getSource().sendMessage("Your current login streak is " + player.streak().days() + " day(s)");
return Command.SINGLE_SUCCESS;
Expand All @@ -80,7 +80,7 @@ public static void register(CommandDispatcher<CommandSource> dispatcher) {
private static String getLeaderboardString(int page) {
StringBuilder lbString = new StringBuilder("<br>");
int i = 1;
for (Player player : players.find(Filters.exists("streak.days")).sort(descending("streak.days", "last_joined")).skip((page - 1) * 5).limit(5)) {
for (Player player : Database.getPlayers().find(Filters.exists("streak.days")).sort(descending("streak.days", "last_joined")).skip((page - 1) * 5).limit(5)) {
lbString.append((page - 1) * 5 + i).append(". ").append(player.name()).append(" - ").append(player.streak().days()).append(" day(s)");
if (i < 5) {
lbString.append("<br>");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package net.legitimoose.bot.discord.command;

import com.mongodb.client.MongoCollection;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.legitimoose.bot.scraper.Database;
import net.legitimoose.bot.scraper.Player;
import net.legitimoose.bot.scraper.Scraper;
import net.legitimoose.bot.util.DiscordUtil;
import net.legitimoose.bot.util.McUtil;
import net.minecraft.client.Minecraft;
Expand All @@ -15,7 +14,6 @@
import static com.mongodb.client.model.Filters.regex;

public class MsgCommand extends ListenerAdapter {
private static final MongoCollection<Player> coll = Scraper.getInstance().db.getCollection("players", Player.class);

public static final Map<String, Long> lastSent = new HashMap<>();

Expand All @@ -24,7 +22,7 @@ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
if (!event.getName().equals("msg")) return;
String message = event.getOption("message").getAsString();
String player = event.getOption("player").getAsString();
Player playerObj = coll.find(regex("name", player, "i")).first();
Player playerObj = Database.getPlayers().find(regex("name", player, "i")).first();
if (playerObj == null || playerObj.blocked().contains(event.getUser().getName())) {
event.reply("Failed to send, player has blocked you or does not exist.").setEphemeral(true).queue();
return;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package net.legitimoose.bot.discord.command;

import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Filters;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.legitimoose.bot.scraper.Database;
import net.legitimoose.bot.scraper.Player;
import net.legitimoose.bot.scraper.Scraper;

public class StreakCommand extends ListenerAdapter {
private final MongoCollection<Player> players = Scraper.getInstance().db.getCollection("players", Player.class);

@Override
public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
Expand All @@ -18,7 +16,7 @@ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
String player = event.getOption("player").getAsString();
event.deferReply().queue();

Player dbPlayer = players.find(Filters.eq("name", player)).first();
Player dbPlayer = Database.getPlayers().find(Filters.eq("name", player)).first();
if (dbPlayer == null) {
event.getHook().sendMessage("Could not find a player named " + player).queue();
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.legitimoose.bot.scraper.Database;
import net.legitimoose.bot.scraper.Player;

import static com.mongodb.client.model.Sorts.descending;
import static net.legitimoose.bot.chat.command.StreakCommand.players;

public class StreakLeaderboardHandler extends ListenerAdapter {
static int maxId = 0;
Expand Down Expand Up @@ -46,7 +46,7 @@ public void onButtonInteraction(ButtonInteractionEvent event) {
private String getLeaderboardString(int page) {
StringBuilder lbString = new StringBuilder();
int i = 1;
for (Player player : players.find(Filters.exists("streak.days")).sort(descending("streak.days", "last_joined")).skip((page - 1) * 5).limit(5)) {
for (Player player : Database.getPlayers().find(Filters.exists("streak.days")).sort(descending("streak.days", "last_joined")).skip((page - 1) * 5).limit(5)) {
lbString.append((page - 1) * 5 + i).append(". ").append(player.name()).append(" - ").append(player.streak().days()).append(" day(s)").append('\n');
i++;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.mongodb.client.MongoCollection;
import net.legitimoose.bot.scraper.Database;
import net.legitimoose.bot.scraper.Player;
import net.legitimoose.bot.scraper.Rank;
import net.legitimoose.bot.scraper.Scraper;
Expand All @@ -18,7 +19,6 @@

public class PlayerEndpoint {
private final Pattern glistPattern = Pattern.compile("\\[(.*)] \\(\\d*\\): (.*)");
private final MongoCollection<Player> players = Scraper.getInstance().db.getCollection("players", Player.class);

public JsonArray handleRequest() {
JsonArray response = new JsonArray();
Expand All @@ -36,7 +36,7 @@ public JsonArray handleRequest() {
JsonObject player = new JsonObject();
try {
String uuid = McUtil.getUuid(user);
Player dbPlayer = players.find(eq("uuid", uuid)).first();
Player dbPlayer = Database.getPlayers().find(eq("uuid", uuid)).first();
Rank rank;
if (dbPlayer == null) {
rank = Rank.Unknown;
Expand Down Expand Up @@ -75,7 +75,7 @@ public JsonObject handleRequest(String uuid) {
if (!McUtil.getUuid(user).equals(uuid)) {
continue;
}
Player dbPlayer = players.find(eq("uuid", uuid)).first();
Player dbPlayer = Database.getPlayers().find(eq("uuid", uuid)).first();
Rank rank;
if (dbPlayer == null) {
rank = Rank.Unknown;
Expand Down
5 changes: 1 addition & 4 deletions src/client/java/net/legitimoose/bot/scraper/Ban.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package net.legitimoose.bot.scraper;

import com.mongodb.client.MongoCollection;
import net.legitimoose.bot.util.McUtil;

public record Ban(
Expand Down Expand Up @@ -45,8 +44,6 @@ public static void writePermBan(long banTime, String bannedPlayer, String modera
}

private void write() {
MongoCollection<Ban> bans = Scraper.getInstance().db.getCollection("bans", Ban.class);

bans.insertOne(this);
Database.getBans().insertOne(this);
}
}
54 changes: 54 additions & 0 deletions src/client/java/net/legitimoose/bot/scraper/Database.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package net.legitimoose.bot.scraper;

import static net.legitimoose.bot.LegitimooseBot.CONFIG;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

public class Database {

private static Database instance;

private static final String DATABASE_NAME = "legitimooseapi";

private static final MongoClient mongoClient =
MongoClients.create(CONFIG.getString("mongoUri"));

private final MongoDatabase database =
mongoClient.getDatabase(DATABASE_NAME);

private MongoCollection<World> worlds;
private MongoCollection<Player> players;
private MongoCollection<Document> stats;
private MongoCollection<Ban> bans;

private Database() {
worlds = database.getCollection("worlds", World.class);
players = database.getCollection("players", Player.class);
stats = database.getCollection("stats");
bans = database.getCollection("bans", Ban.class);
}

private static Database getInstance() {
return instance == null ? (instance = new Database()) : instance;
}

public static MongoCollection<Player> getPlayers() {
return getInstance().players;
}

public static MongoCollection<World> getWorlds() {
return getInstance().worlds;
}

public static MongoCollection<Document> getStats() {
return getInstance().stats;
}

public static MongoCollection<Ban> getBans() {
return getInstance().bans;
}

}
5 changes: 1 addition & 4 deletions src/client/java/net/legitimoose/bot/scraper/Player.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package net.legitimoose.bot.scraper;

import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.UpdateOptions;
import com.mongodb.client.model.Updates;
import org.bson.BsonDateTime;
Expand All @@ -25,8 +24,6 @@ public record Streak(Integer days, @BsonProperty("notify") Boolean notifications

}
public void write() {
MongoCollection<Player> players = Scraper.getInstance().db.getCollection("players", Player.class);

Bson updates =
Updates.combine(
Updates.set("uuid", this.uuid),
Expand All @@ -35,6 +32,6 @@ public void write() {
Updates.set("blocked", this.blocked),
Updates.set("streak", this.streak),
Updates.set("last_joined", new BsonDateTime(this.last_joined.toEpochMilli())));
players.updateOne(eq("uuid", this.uuid), updates, new UpdateOptions().upsert(true));
Database.getPlayers().updateOne(eq("uuid", this.uuid), updates, new UpdateOptions().upsert(true));
}
}
13 changes: 3 additions & 10 deletions src/client/java/net/legitimoose/bot/scraper/Scraper.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@
import com.mojang.brigadier.context.CommandContextBuilder;
import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.serialization.JsonOps;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.*;
import net.legitimoose.bot.LegitimooseBotClient;
import net.legitimoose.bot.util.DiscordUtil;
Expand Down Expand Up @@ -46,15 +43,11 @@ public class Scraper {

private volatile boolean scrapeOverride = false;

private final MongoClient mongoClient = MongoClients.create(CONFIG.getString("mongoUri"));
private final DiscordWebhook errorWebhook = new DiscordWebhook(CONFIG.getString("errorWebhook"));

private final Pattern jamScorePattern = Pattern.compile("^CategoryScore\\(rank=(.*), score=(.*)\\)");
private final Pattern ownerNamePattern = Pattern.compile("^by (?:[^|]+\\|\\s*)?(.+)");

public final MongoDatabase db = mongoClient.getDatabase("legitimooseapi");
private final MongoCollection<World> coll = db.getCollection("worlds", World.class);

private void waitSeconds(int time) {
try {
TimeUnit.SECONDS.sleep(time);
Expand Down Expand Up @@ -98,12 +91,12 @@ private void error(String message, Exception exception) throws IOException, URIS
public void scrape() {
if (!CONFIG.getBoolean("scrape", true)) return;
Minecraft client = Minecraft.getInstance();
MongoCollection<Document> stats = db.getCollection("stats");
MongoCollection<Document> stats = Database.getStats();
stats.createIndex(Indexes.descending("timestamp"));
List<IndexModel> indexes = new ArrayList<>();
indexes.add(new IndexModel(Indexes.ascending("world_uuid")));
indexes.add(new IndexModel(Indexes.ascending("last_scraped_ms"), new IndexOptions().expireAfter(24L, TimeUnit.HOURS)));
coll.createIndexes(indexes);
Database.getWorlds().createIndexes(indexes);

// Please ignore the nulls. Only the 'input' is actually used
CommandContext context = new CommandContextBuilder(null, null, null, 1).build("/find ");
Expand Down Expand Up @@ -317,7 +310,7 @@ private void bulkUpsert(List<World> worlds) {
}

if (!operations.isEmpty()) {
coll.bulkWrite(operations);
Database.getWorlds().bulkWrite(operations);
}
LOGGER.info("Bulk wrote {} worlds", operations.size());
}
Expand Down