Make Checker Framework.

This commit is contained in:
bʰedoh₂ swé 2025-03-16 20:19:58 +05:00
parent fb97f45087
commit 06298c5da9
7 changed files with 68 additions and 38 deletions

View File

@ -14,48 +14,56 @@ import com.google.gson.Gson;
import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonReader;
import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.JDABuilder;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.emotilt.antiplatka.command.types.Command; import ru.emotilt.antiplatka.command.types.Command;
import ru.emotilt.antiplatka.handler.Handler; import ru.emotilt.antiplatka.handler.Handler;
public class Bot { public class Bot {
public static Config config; public static @NotNull Config config = readConfig();
private static Command[] commandsArray;
private static final HashMap<String, Command> commands = new HashMap<>(); private static final HashMap<String, Command> commands = new HashMap<>();
public static ListenerAdapter[] events;
private static JDA jda;
private static final Logger logger = LoggerFactory.getLogger(Bot.class); private static final Logger logger = LoggerFactory.getLogger(Bot.class);
private static final Handler<Command> commandHandler = new Handler<>(Command.class, private static final Handler<Command> commandHandler = new Handler<>(Command.class,
"ru.emotilt.antiplatka.command"); "ru.emotilt.antiplatka.command");
private static Command[] commandsArray = commandHandler.get();
private static final Handler<ListenerAdapter> eventHandler = new Handler<>(ListenerAdapter.class, private static final Handler<ListenerAdapter> eventHandler = new Handler<>(ListenerAdapter.class,
"ru.emotilt.antiplatka.event"); "ru.emotilt.antiplatka.event");
public static ListenerAdapter[] events = eventHandler.get();
public static void main(String[] args) throws IOException, InterruptedException { private static JDA jda =
File file = new File("./config.json"); JDABuilder.create(config.token, GatewayIntent.getIntents(33411))
try (FileReader reader = new FileReader(file)) {
JsonReader jsonreader = new JsonReader(reader);
Gson gson = new Gson();
config = gson.fromJson(jsonreader, Config.class);
config.enforceValidity();
}
logger.info("Successfully loaded config!");
commandsArray = commandHandler.get();
events = eventHandler.get();
jda = JDABuilder.create(config.token, GatewayIntent.getIntents(33411))
.disableCache(CacheFlag.ACTIVITY, CacheFlag.EMOJI, CacheFlag.STICKER, .disableCache(CacheFlag.ACTIVITY, CacheFlag.EMOJI, CacheFlag.STICKER,
CacheFlag.CLIENT_STATUS, CacheFlag.ONLINE_STATUS, CacheFlag.SCHEDULED_EVENTS) CacheFlag.CLIENT_STATUS, CacheFlag.ONLINE_STATUS, CacheFlag.SCHEDULED_EVENTS)
.addEventListeners((Object[]) events) .addEventListeners((Object[]) events)
.build(); .build();
jda.awaitReady();
public static void main(String[] args) throws InterruptedException {
jda.awaitReady();
registerCommands(); registerCommands();
} }
private static Config readConfig() {
File file = new File("./config.json");
Config cfg;
try (FileReader reader = new FileReader(file)) {
JsonReader jsonreader = new JsonReader(reader);
Gson gson = new Gson();
cfg = gson.fromJson(jsonreader, Config.class);
Objects.requireNonNull(cfg).enforceValidity();
} catch (IOException e) {
throw new ExceptionInInitializerError(e);
}
logger.info("Successfully loaded config!");
return cfg;
}
private static void registerCommands() { private static void registerCommands() {
logger.info("Loading commands..."); logger.info("Loading commands...");
Guild guild = Objects.requireNonNull(jda.getGuildById(config.guildId)); Guild guild = Objects.requireNonNull(jda.getGuildById(config.guildId));

View File

@ -1,18 +1,29 @@
package ru.emotilt.antiplatka; package ru.emotilt.antiplatka;
import java.util.HashMap;
import java.util.Objects; import java.util.Objects;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class Config { public class Config {
public static class PollDurations {
public final int mute;
public final int kick;
public final int add;
PollDurations(int mute, int kick, int add) {
this.add = add;
this.kick = kick;
this.mute = mute;
}
}
public final @NotNull String token; public final @NotNull String token;
public final @NotNull String guildId; public final @NotNull String guildId;
public final int threshold; public final int threshold;
public final @NotNull HashMap<String, Integer> pollDurations; public final @NotNull PollDurations pollDurations;
public final @NotNull String muteRoleId; public final @NotNull String muteRoleId;
Config(@NotNull String token, @NotNull String guildId, int threshold, HashMap<String, Integer> pollDurations, Config(@NotNull String token, @NotNull String guildId, int threshold, PollDurations pollDurations,
String muteRoleId) { String muteRoleId) {
this.token = token; this.token = token;
this.guildId = guildId; this.guildId = guildId;
@ -21,10 +32,11 @@ public class Config {
this.muteRoleId = muteRoleId; this.muteRoleId = muteRoleId;
} }
public void enforceValidity() { public Config enforceValidity() {
Objects.requireNonNull(token); Objects.requireNonNull(token);
Objects.requireNonNull(guildId); Objects.requireNonNull(guildId);
Objects.requireNonNull(pollDurations); Objects.requireNonNull(pollDurations);
Objects.requireNonNull(muteRoleId); Objects.requireNonNull(muteRoleId);
return this;
} }
} }

View File

@ -33,7 +33,7 @@ public class PollMute extends Command {
Member member = Objects.requireNonNull(Objects.requireNonNull(interaction.getOption("member")).getAsMember()); Member member = Objects.requireNonNull(Objects.requireNonNull(interaction.getOption("member")).getAsMember());
BotPollMute.Builder pollbuilder = new BotPollMute.Builder(member, BotPollMute.Builder pollbuilder = new BotPollMute.Builder(member,
Duration.ofMinutes(Bot.config.pollDurations.get("mute"))); Duration.ofMinutes(Bot.config.pollDurations.mute));
interaction interaction
.reply(pollbuilder.buildMessage(String.format("Голосование за мут %s", member.getAsMention())).build()) .reply(pollbuilder.buildMessage(String.format("Голосование за мут %s", member.getAsMention())).build())

View File

@ -2,6 +2,9 @@ package ru.emotilt.antiplatka.event;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.hooks.ListenerAdapter;
import java.util.Objects;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import ru.emotilt.antiplatka.Bot; import ru.emotilt.antiplatka.Bot;
@ -10,6 +13,6 @@ public class OnSlashCommandInteractionEvent extends ListenerAdapter {
@Override @Override
public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) { public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) {
super.onSlashCommandInteraction(event); super.onSlashCommandInteraction(event);
Bot.getCommands().get(event.getFullCommandName()).execute(event); Objects.requireNonNull(Bot.getCommands().get(event.getFullCommandName())).execute(event);
} }
} }

View File

@ -10,6 +10,7 @@ import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
@ -22,7 +23,7 @@ public class Handler<T> {
this.packageName = packageName; this.packageName = packageName;
} }
@SuppressWarnings("unchecked") @SuppressWarnings({"unchecked", "return"})
public T[] get() { public T[] get() {
try { try {
List<Class<?>> classes = scanPackage(packageName); List<Class<?>> classes = scanPackage(packageName);
@ -44,7 +45,7 @@ public class Handler<T> {
private List<Class<?>> scanPackage(String packageName) throws IOException, ClassNotFoundException { private List<Class<?>> scanPackage(String packageName) throws IOException, ClassNotFoundException {
List<Class<?>> classes = new ArrayList<>(); List<Class<?>> classes = new ArrayList<>();
String packagePath = packageName.replace('.', '/'); String packagePath = packageName.replace('.', '/');
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); ClassLoader classLoader = Objects.requireNonNull(Thread.currentThread().getContextClassLoader());
Enumeration<URL> resources = classLoader.getResources(packagePath); Enumeration<URL> resources = classLoader.getResources(packagePath);
while (resources.hasMoreElements()) { while (resources.hasMoreElements()) {

View File

@ -2,10 +2,13 @@ package ru.emotilt.antiplatka.poll;
import java.time.Duration; import java.time.Duration;
import java.util.Date; import java.util.Date;
import java.util.Objects;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.jetbrains.annotations.Nullable;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
@ -16,11 +19,11 @@ import net.dv8tion.jda.api.utils.messages.MessagePollData;
import ru.emotilt.antiplatka.Bot; import ru.emotilt.antiplatka.Bot;
public abstract class BotPoll { public abstract class BotPoll {
public final Message message; public final @Nullable Message message;
// TODO: Create an abstraction for targets. This means that it can have any // TODO: Create an abstraction for targets. This means that it can have any
// targets except the user. // targets except the user.
public final Member targetUser; public final Member targetUser;
public final MessageChannel channel; public final @Nullable MessageChannel channel;
public final Date start; public final Date start;
public final Duration voteDuration; public final Duration voteDuration;
@ -28,7 +31,8 @@ public abstract class BotPoll {
public abstract String getEndAnnouncementText(boolean success); public abstract String getEndAnnouncementText(boolean success);
public BotPoll(Message message, Member targetUser, MessageChannel channel, Date start, Duration voteDuration) { @SuppressWarnings("method.invocation")
public BotPoll(@Nullable Message message, Member targetUser, @Nullable MessageChannel channel, Date start, Duration voteDuration) {
this.message = message; this.message = message;
this.targetUser = targetUser; this.targetUser = targetUser;
this.channel = channel; this.channel = channel;
@ -44,7 +48,7 @@ public abstract class BotPoll {
* *
* @param message A message containing a poll. * @param message A message containing a poll.
*/ */
public void schedule(Message message) { public void schedule(@Nullable Message message) {
if (isShort()) { if (isShort()) {
ExecutorService executorService = Executors.newSingleThreadExecutor(); ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(() -> { executorService.submit(() -> {
@ -54,7 +58,7 @@ public abstract class BotPoll {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
message.endPoll().queue(); Objects.requireNonNull(message).endPoll().queue();
}); });
executorService.shutdown(); executorService.shutdown();
} }
@ -67,9 +71,9 @@ public abstract class BotPoll {
@SuppressWarnings("unused") @SuppressWarnings("unused")
public static abstract class Builder<T extends Builder<T>> { public static abstract class Builder<T extends Builder<T>> {
protected Message message = null; protected @Nullable Message message = null;
protected Member targetUser; protected Member targetUser;
protected MessageChannel channel = null; protected @Nullable MessageChannel channel = null;
protected Date start = new Date(); protected Date start = new Date();
protected Duration voteDuration; protected Duration voteDuration;

View File

@ -3,6 +3,8 @@ package ru.emotilt.antiplatka.poll;
import java.time.Duration; import java.time.Duration;
import java.util.Date; import java.util.Date;
import org.jetbrains.annotations.Nullable;
import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Message;
@ -46,7 +48,7 @@ public class BotPollMute extends BotPoll {
} }
} }
public BotPollMute(Message message, Member targetUser, MessageChannel channel, Date start, Duration voteDuration) { public BotPollMute(@Nullable Message message, Member targetUser, @Nullable MessageChannel channel, Date start, Duration voteDuration) {
super(message, targetUser, channel, start, voteDuration); super(message, targetUser, channel, start, voteDuration);
} }
} }