mirror of
https://github.com/bytedream/untisbot-discord.git
synced 2025-05-09 20:25:09 +02:00
Simplified timetable
command; stats
and help
commands rebased
This commit is contained in:
parent
575058f541
commit
5d4e5e634c
@ -13,6 +13,7 @@ import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
|
||||
import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
||||
import org.bytedream.untis4j.Session;
|
||||
import org.bytedream.untis4j.UntisUtils;
|
||||
import org.bytedream.untis4j.responseObjects.Klassen;
|
||||
import org.bytedream.untis4j.responseObjects.Teachers;
|
||||
import org.bytedream.untis4j.responseObjects.TimeUnits;
|
||||
@ -97,26 +98,23 @@ public class DiscordCommandListener extends ListenerAdapter {
|
||||
if (args.length < 3) {
|
||||
Session session = allUntisSessions.get(guildId);
|
||||
LocalDate now = LocalDate.now();
|
||||
Short classId = null;
|
||||
LocalDate date = null;
|
||||
Short classId = data.getKlasseId();
|
||||
LocalDate date = now;
|
||||
|
||||
if (data.getServer() == null && data.getSchool() == null) {
|
||||
channel.sendMessage("Please set your data with the `data` command first, before you use this command. Type `" + data.getPrefix() + "help data` to get information").queue();
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.length == 0) {
|
||||
classId = data.getKlasseId();
|
||||
date = now;
|
||||
} else {
|
||||
if (args.length != 0) {
|
||||
for (String arg : args) {
|
||||
if (date == null) {
|
||||
if (date.equals(now)) {
|
||||
Integer number = null;
|
||||
try {
|
||||
number = Integer.parseInt(arg);
|
||||
} catch (NumberFormatException ignore) {
|
||||
}
|
||||
if (number != null && number <= 31 && number >= 1) {
|
||||
if (number != null && number > 1 && number < 31) {
|
||||
date = LocalDate.of(now.getYear(), now.getMonth(), number);
|
||||
continue;
|
||||
} else if (arg.contains(".")) {
|
||||
@ -142,14 +140,15 @@ public class DiscordCommandListener extends ListenerAdapter {
|
||||
}
|
||||
}
|
||||
}
|
||||
System.out.println("sss");
|
||||
try {
|
||||
classId = (short) session.getKlassen().findByName(arg).getId();
|
||||
} catch (IOException e) {
|
||||
logger.warn(guildId + " ran into an exception while trying to receive classes for a timetable", e);
|
||||
channel.sendMessage("Couldn't search the class. Try again (later) or contact my author <@650417934073593886>, if the problem won't go away").queue();
|
||||
return;
|
||||
} catch (NullPointerException e) {
|
||||
channel.sendMessage("Couldn't find any class with the name '" + arg + "'").queue();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -172,35 +171,39 @@ public class DiscordCommandListener extends ListenerAdapter {
|
||||
put("date", finalDate.format(DateTimeFormatter.ofPattern("dd.MM.yyyy")));
|
||||
}}));
|
||||
|
||||
LinkedHashMap<LocalTime, ArrayList<Timetable.Lesson>> lessons = new LinkedHashMap<>();
|
||||
boolean noMultiples = true;
|
||||
LocalTime lastStartTime = LocalTime.MIN;
|
||||
boolean multipleLessonAtOnce = false;
|
||||
TreeMap<LocalTime, ArrayList<Timetable.Lesson>> lessons = new TreeMap<>();
|
||||
try {
|
||||
for (Timetable.Lesson lesson : Timetable.sortByStartTime(allUntisSessions.get(guildId).getTimetableFromKlasseId(date, date, classId))) {
|
||||
lessons.putIfAbsent(lesson.getStartTime(), new ArrayList<>());
|
||||
lessons.get(lesson.getStartTime()).add(lesson);
|
||||
if (lastStartTime.equals(lesson.getStartTime())) {
|
||||
multipleLessonAtOnce = true;
|
||||
}
|
||||
if (lastStartTime.equals(lesson.getStartTime())) noMultiples = false;
|
||||
lastStartTime = lesson.getStartTime();
|
||||
}
|
||||
if (multipleLessonAtOnce) {
|
||||
for (ArrayList<Timetable.Lesson> listLessons: lessons.values()) {
|
||||
for (Timetable.Lesson lesson: listLessons) {
|
||||
embedBuilder.addField(Utils.advancedFormat(language.getString("timetable-lesson-title"), new HashMap<String, Object>() {{
|
||||
for (int i = 0; i < lessons.size(); i++) {
|
||||
ArrayList<Timetable.Lesson> listLessons = (ArrayList<Timetable.Lesson>) lessons.values().toArray()[i];
|
||||
for (Timetable.Lesson lesson: (ArrayList<Timetable.Lesson>) lessons.values().toArray()[i]) {
|
||||
String additional = "";
|
||||
if (lesson.getCode() == UntisUtils.LessonCode.CANCELLED) {
|
||||
additional = "~~";
|
||||
}
|
||||
embedBuilder.addField(additional + Utils.advancedFormat(language.getString("timetable-lesson-title"), new HashMap<String, Object>() {{
|
||||
put("lesson-number", lesson.getTimeUnitObject().getName());
|
||||
put("start-time", lesson.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")));
|
||||
put("end-time", lesson.getEndTime().format(DateTimeFormatter.ofPattern("HH:mm")));
|
||||
}}), Utils.advancedFormat(language.getString("timetable-teachers"), new HashMap<String, Object>() {{
|
||||
}}) + additional, additional + Utils.advancedFormat(language.getString("timetable-teachers"), new HashMap<String, Object>() {{
|
||||
put("teachers", String.join(", ", lesson.getTeachers().getFullNames()));
|
||||
}}) + "\n" + Utils.advancedFormat(language.getString("timetable-subjects"), new HashMap<String, Object>() {{
|
||||
put("subjects", String.join(", ", lesson.getSubjects().getLongNames()));
|
||||
}}) + "\n" + Utils.advancedFormat(language.getString("timetable-rooms"), new HashMap<String, Object>() {{
|
||||
put("rooms", String.join(", ", lesson.getRooms().getLongNames()));
|
||||
}}), listLessons.size() > 1);
|
||||
}}) + additional, noMultiples || listLessons.size() > 1);
|
||||
}
|
||||
if (listLessons.size() == 2 && i + 1 != lessons.size()) {
|
||||
embedBuilder.addBlankField(true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/*int halfSize = (int) Math.ceil((lessons.values().size() / 2));
|
||||
for (int i = 0; i <= halfSize; i++) {
|
||||
int j = i + 1;
|
||||
@ -229,21 +232,6 @@ public class DiscordCommandListener extends ListenerAdapter {
|
||||
|
||||
embedBuilder.addBlankField(true);
|
||||
}*/
|
||||
for (ArrayList<Timetable.Lesson> listLesson: lessons.values()) {
|
||||
Timetable.Lesson lesson = listLesson.get(0);
|
||||
embedBuilder.addField(Utils.advancedFormat(language.getString("timetable-lesson-title"), new HashMap<String, Object>() {{
|
||||
put("lesson-number", lesson.getTimeUnitObject().getName());
|
||||
put("start-time", lesson.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")));
|
||||
put("end-time", lesson.getEndTime().format(DateTimeFormatter.ofPattern("HH:mm")));
|
||||
}}), Utils.advancedFormat(language.getString("timetable-teachers"), new HashMap<String, Object>() {{
|
||||
put("teachers", String.join(", ", lesson.getTeachers().getFullNames()));
|
||||
}}) + "\n" + Utils.advancedFormat(language.getString("timetable-subjects"), new HashMap<String, Object>() {{
|
||||
put("subjects", String.join(", ", lesson.getSubjects().getLongNames()));
|
||||
}}) + "\n" + Utils.advancedFormat(language.getString("timetable-rooms"), new HashMap<String, Object>() {{
|
||||
put("rooms", String.join(", ", lesson.getRooms().getLongNames()));
|
||||
}}), true);
|
||||
}
|
||||
}
|
||||
channel.sendMessage(embedBuilder.build()).queue();
|
||||
} catch (IOException e) {
|
||||
logger.warn(guildId + " ran into an exception while trying to receive a timetable", e);
|
||||
@ -258,11 +246,8 @@ public class DiscordCommandListener extends ListenerAdapter {
|
||||
Data.Stats stats = statsDataConnector.get(guildId);
|
||||
|
||||
EmbedBuilder embedBuilder = new EmbedBuilder();
|
||||
if (guildName.trim().endsWith("s")) {
|
||||
embedBuilder.setTitle(guild.getName() + " untis status");
|
||||
} else {
|
||||
embedBuilder.setTitle(guild.getName() + "'s untis status");
|
||||
}
|
||||
if (guildName.trim().endsWith("s")) embedBuilder.setTitle(guild.getName() + " untis status");
|
||||
else embedBuilder.setTitle(guild.getName() + "'s untis status");
|
||||
|
||||
ArrayList<String> mostMissedTeachers = new ArrayList<>();
|
||||
short missedLessons = 0;
|
||||
@ -283,17 +268,29 @@ public class DiscordCommandListener extends ListenerAdapter {
|
||||
}
|
||||
|
||||
String timetableChecking;
|
||||
String dataSet;
|
||||
if (data.isCheckActive()) {
|
||||
timetableChecking = "\uD83D\uDFE2 Active";
|
||||
embedBuilder.setColor(Color.GREEN);
|
||||
} else {
|
||||
timetableChecking = "\uD83D\uDD34 Inactive";
|
||||
embedBuilder.setFooter("To start timetable checking, type `" + data.getPrefix() + "set-data <username> <password> <loginpage url>` - type `" + data.getPrefix() + "help` for more details");
|
||||
embedBuilder.setColor(Color.RED);
|
||||
}
|
||||
if (data.getUsername() != null && data.getServer() != null && data.getSchool() != null) {
|
||||
dataSet = "✅ Set";
|
||||
if (!data.isCheckActive()) {
|
||||
embedBuilder.setFooter("The timetable checker is deactivated. Type `" + data.getPrefix() + "start` - use `" + data.getPrefix() + "help start` for more details");
|
||||
}
|
||||
}
|
||||
else {
|
||||
dataSet = "❌ Not set";
|
||||
embedBuilder.setFooter("To set your data, type `" + data.getPrefix() + "set-data <username> <password> <loginpage url>` - use `" + data.getPrefix() + "help data` for more details");
|
||||
}
|
||||
|
||||
embedBuilder.addField("Timetable checking", timetableChecking, true);
|
||||
embedBuilder.addField("Data status", dataSet, true);
|
||||
//embedBuilder.addField("Checking interval", data.getSleepTime() / 60000 + " minutes", true);
|
||||
embedBuilder.addField("Total timetable requests", String.valueOf(stats.getTotalRequests()), true);
|
||||
//embedBuilder.addField("Total timetable requests", String.valueOf(stats.getTotalRequests()), true);
|
||||
embedBuilder.addField("Total lessons checked", String.valueOf(stats.getTotalLessons()), true);
|
||||
embedBuilder.addField("Total weeks checked", String.valueOf((int) (Math.floor((float) stats.getTotalDays() / 7))), true);
|
||||
embedBuilder.addField("Total cancelled lessons", String.valueOf(stats.getTotalCancelledLessons()), true);
|
||||
@ -441,6 +438,7 @@ public class DiscordCommandListener extends ListenerAdapter {
|
||||
if (data.isCheckActive()) {
|
||||
channel.sendMessage("Timetable listening already started").queue();
|
||||
} else {
|
||||
guildDataConnector.update(guildId, null, null, null, null, null, null, null, null, null, true, null);
|
||||
runTimetableChecker(guild);
|
||||
logger.info(guildName + " started timetable listening");
|
||||
channel.sendMessage("✅ Timetable listening has been started").queue();
|
||||
@ -452,6 +450,7 @@ public class DiscordCommandListener extends ListenerAdapter {
|
||||
case "stop": // `stop` command
|
||||
if (args.length == 0) {
|
||||
if (data.isCheckActive()) {
|
||||
guildDataConnector.update(guildId, null, null, null, null, null, null, null, null, null, false, null);
|
||||
Timer timer = allTimetableChecker.get(guildId);
|
||||
allTimetableChecker.remove(guildId);
|
||||
timer.cancel();
|
||||
@ -465,7 +464,9 @@ public class DiscordCommandListener extends ListenerAdapter {
|
||||
channel.sendMessage("Wrong number of arguments were given (expected 0, got " + args.length + "), type `" + data.getPrefix() + "help stop` for help").queue();
|
||||
}
|
||||
break;
|
||||
case "help": // is handled in DiscordCommandListener.onMessageReceived()
|
||||
case "help":
|
||||
case "info":
|
||||
case "infos": // is handled in DiscordCommandListener.onMessageReceived()
|
||||
return;
|
||||
default:
|
||||
channel.sendMessage("Unknown command").queue();
|
||||
@ -542,6 +543,8 @@ public class DiscordCommandListener extends ListenerAdapter {
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
i++;
|
||||
daysToCheck++;
|
||||
} catch (NullPointerException e) {
|
||||
i++;
|
||||
}
|
||||
|
||||
for (; i <= daysToCheck; i++) {
|
||||
@ -756,31 +759,38 @@ public class DiscordCommandListener extends ListenerAdapter {
|
||||
String message = event.getMessage().getContentDisplay().trim().toLowerCase();
|
||||
MessageChannel channel = event.getChannel();
|
||||
|
||||
String prefix;
|
||||
if (message.contains("help")) { // `help` command
|
||||
String[] commands = new String[]{"help", "info"};
|
||||
|
||||
String prefix = null;
|
||||
String command = "";
|
||||
String[] args = null;
|
||||
|
||||
for (String cmd: commands) {
|
||||
if (message.contains(cmd)) {
|
||||
if (event.isFromGuild()) {
|
||||
prefix = guildDataConnector.get(event.getGuild().getIdLong()).getPrefix();
|
||||
if (!event.getMessage().getContentDisplay().startsWith(prefix + "help")) {
|
||||
System.out.println("sss");
|
||||
if (!event.getMessage().getContentDisplay().startsWith(prefix + cmd)) {
|
||||
return;
|
||||
}
|
||||
} else if (message.equals("help") || message.startsWith("help ")) {
|
||||
} else if (message.equals(cmd) || message.startsWith(cmd + " ")) {
|
||||
prefix = "";
|
||||
} else {
|
||||
return;
|
||||
continue;
|
||||
}
|
||||
command = cmd;
|
||||
String[] splitMessage = message.substring(prefix.length()).split(" ");
|
||||
args = Arrays.copyOfRange(splitMessage, 1, splitMessage.length);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
String[] splitMessage = message.substring(prefix.length()).split(" ");
|
||||
String[] args = Arrays.copyOfRange(splitMessage, 1, splitMessage.length);
|
||||
switch (command) {
|
||||
case "help": // `help [command] command`
|
||||
if (args.length < 2) {
|
||||
String help = "Use `" + prefix + "help <command>` to get help / information about a command.\n\n" +
|
||||
"All available commands are:\n" +
|
||||
"`channel` `clear` `data` `help` `language` `prefix` `stats` `start` `stop` `timetable`";
|
||||
if (args.length > 1) {
|
||||
channel.sendMessage("Wrong number of arguments are given (expected 0 or 1, got " + splitMessage.length + "). " + help).queue();
|
||||
} else if (args.length == 0) {
|
||||
"`channel` • `clear` • `data` • `info` • `help` • `language` • `prefix` • `stats` • `start` • `stop` • `timetable`";
|
||||
if (args.length == 0) {
|
||||
channel.sendMessage(help).queue();
|
||||
} else {
|
||||
String title;
|
||||
@ -807,6 +817,11 @@ public class DiscordCommandListener extends ListenerAdapter {
|
||||
example = "`data myname secure https://example.webuntis.com/WebUntis/?school=example#/basic/main 12AB`";
|
||||
default_ = "`en`";
|
||||
break;
|
||||
case "info":
|
||||
title = "`info` command";
|
||||
description = "Displays information about the bot";
|
||||
example = "`info`";
|
||||
break;
|
||||
case "help":
|
||||
title = "`help <command>` command";
|
||||
description = "Displays help to a given command";
|
||||
@ -862,6 +877,33 @@ public class DiscordCommandListener extends ListenerAdapter {
|
||||
embedBuilder.setFooter("`<>` = required; `[]` = optional");
|
||||
channel.sendMessage(embedBuilder.build()).queue();
|
||||
}
|
||||
} else {
|
||||
channel.sendMessage("Wrong number of arguments were given (expected 0 or 1, got " + args.length + "), type `" + prefix + "help help` for help").queue();
|
||||
}
|
||||
break;
|
||||
case "info":
|
||||
if (args.length == 0) {
|
||||
EmbedBuilder infoBuilder = new EmbedBuilder();
|
||||
infoBuilder.setTitle("Untis information");
|
||||
infoBuilder.setThumbnail("https://cdn.discordapp.com/avatars/768841979433451520/2742868bb029952ee00514a01f84b65b.webp?size=512");
|
||||
infoBuilder.setDescription("<@768841979433451520> is a java programmed discord bot, which uses the [WebUntis](https://webuntis.com/) " +
|
||||
"timetable software to receive the timetable for a specific date, " +
|
||||
"automatically send messages when the timetable from a given account or class changes, " +
|
||||
"displays total cancelled lessons etc., and more!");
|
||||
infoBuilder.setColor(new Color(255, 165, 0));
|
||||
infoBuilder.addField("\uD83D\uDCDDAuthor", "[<@650417934073593886>](https://discordapp.com/users/650417934073593886)", true);
|
||||
infoBuilder.addField("✨Version", "[v1.1](https://github.com/ByteDream/untisbot-discord/releases/tag/v1.1)", true);
|
||||
infoBuilder.addField("❓Help", "`" + prefix + "help`", true);
|
||||
infoBuilder.addField("❤️️Source / GitHub", "[Source code!](https://github.com/ByteDream/untisbot-discord)", true);
|
||||
//infoBuilder.addField("Total guilds (server)", String.valueOf(guildDataConnector.getAll().size()), true);
|
||||
infoBuilder.addField("\uD83D\uDCC8Vote", "[Vote!](https://top.gg/bot/768841979433451520/vote)", true);
|
||||
infoBuilder.addField("\uD83D\uDD10️Data encryption algorithm", "[AES-256](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)", true);
|
||||
channel.sendMessage(infoBuilder.build()).queue();
|
||||
} else {
|
||||
channel.sendMessage("Wrong number of arguments were given (expected 0, got " + args.length + "), type `" + prefix + "help info` for help").queue();
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
t.setName("Message handler");
|
||||
t.start();
|
||||
|
Loading…
x
Reference in New Issue
Block a user