mirror of
https://github.com/DreamExposure/DisCal-Discord-Bot.git
synced 2026-01-25 05:18:27 -06:00
This should add ability to limit RSVPs
This commit is contained in:
@@ -8,6 +8,7 @@ import org.dreamexposure.discal.core.object.command.CommandInfo;
|
||||
import org.dreamexposure.discal.core.object.event.RsvpData;
|
||||
import org.dreamexposure.discal.core.utils.EventUtils;
|
||||
import org.dreamexposure.discal.core.utils.GlobalConst;
|
||||
import org.dreamexposure.discal.core.utils.PermissionChecker;
|
||||
import org.dreamexposure.discal.core.utils.TimeUtils;
|
||||
import org.dreamexposure.discal.core.utils.UserUtils;
|
||||
|
||||
@@ -70,6 +71,7 @@ public class RsvpCommand implements Command {
|
||||
info.getSubCommands().put("unsure", "Marks that you may or may not go to event");
|
||||
info.getSubCommands().put("remove", "Removes your RSVP from the event");
|
||||
info.getSubCommands().put("list", "Lists who has RSVPed to event");
|
||||
info.getSubCommands().put("limit", "Sets the amount of people that can RSVP to the event, -1 to disable");
|
||||
|
||||
return info;
|
||||
}
|
||||
@@ -98,6 +100,14 @@ public class RsvpCommand implements Command {
|
||||
return this.moduleRemove(args, event, settings);
|
||||
case "list":
|
||||
return this.moduleList(args, event, settings);
|
||||
case "limit":
|
||||
return PermissionChecker.hasDisCalRole(event, settings)
|
||||
.flatMap(has -> {
|
||||
if (has)
|
||||
return this.moduleLimit(args, event, settings);
|
||||
else
|
||||
return Messages.sendMessage(Messages.getMessage("Notification.Perm.CONTROL_ROLE", settings), event);
|
||||
});
|
||||
default:
|
||||
return Messages.sendMessage(Messages.getMessage("Notification.Args.InvalidSubCmd", settings), event);
|
||||
}
|
||||
@@ -117,12 +127,15 @@ public class RsvpCommand implements Command {
|
||||
return TimeUtils.isInPast(eventId, settings).flatMap(inPast -> {
|
||||
if (!inPast) {
|
||||
return DatabaseManager.getRsvpData(settings.getGuildID(), eventId)
|
||||
.filter(data -> data.hasRoom(mem.getId().asString()))
|
||||
.doOnNext(data -> data.removeCompletely(mem.getId().asString()))
|
||||
.doOnNext(data -> data.getGoingOnTime().add(mem.getId().asString()))
|
||||
.flatMap(data -> DatabaseManager.updateRsvpData(data)
|
||||
.then(this.getRsvpEmbed(data, settings))
|
||||
.flatMap(embed -> Messages.sendMessage(
|
||||
Messages.getMessage("RSVP.going.success", settings), embed, event))
|
||||
).switchIfEmpty(Messages.sendMessage("You cannot RSVP to the event as the" +
|
||||
" max number of people are already attending", event)
|
||||
);
|
||||
} else {
|
||||
return Messages
|
||||
@@ -151,12 +164,15 @@ public class RsvpCommand implements Command {
|
||||
return TimeUtils.isInPast(eventId, settings).flatMap(inPast -> {
|
||||
if (!inPast) {
|
||||
return DatabaseManager.getRsvpData(settings.getGuildID(), eventId)
|
||||
.filter(data -> data.hasRoom(mem.getId().asString()))
|
||||
.doOnNext(data -> data.removeCompletely(mem.getId().asString()))
|
||||
.doOnNext(data -> data.getGoingLate().add(mem.getId().asString()))
|
||||
.flatMap(data -> DatabaseManager.updateRsvpData(data)
|
||||
.then(this.getRsvpEmbed(data, settings))
|
||||
.flatMap(embed -> Messages.sendMessage(
|
||||
Messages.getMessage("RSVP.late.success", settings), embed, event))
|
||||
).switchIfEmpty(Messages.sendMessage("You cannot RSVP to the event as the" +
|
||||
" max number of people are already attending", event)
|
||||
);
|
||||
} else {
|
||||
return Messages
|
||||
@@ -276,6 +292,45 @@ public class RsvpCommand implements Command {
|
||||
}).then();
|
||||
}
|
||||
|
||||
//!rsvp limit <event-id> <limit>
|
||||
private Mono<Void> moduleLimit(String[] args, MessageCreateEvent event, GuildSettings settings) {
|
||||
return Mono.defer(() -> {
|
||||
if (args.length == 3) {
|
||||
return Mono.just(args[1]).flatMap(eventId -> EventUtils.eventExists(settings, eventId)
|
||||
.flatMap(exists -> {
|
||||
if (exists) {
|
||||
return TimeUtils.isInPast(eventId, settings).flatMap(inPast -> {
|
||||
if (!inPast) {
|
||||
//Okay, finally, we can change the limit
|
||||
try {
|
||||
int newLimit = Integer.parseInt(args[2]);
|
||||
return DatabaseManager.getRsvpData(settings.getGuildID(), eventId)
|
||||
.doOnNext(data -> data.setLimit(newLimit))
|
||||
.flatMap(data -> DatabaseManager.updateRsvpData(data)
|
||||
.then(this.getRsvpEmbed(data, settings))
|
||||
.flatMap(embed -> Messages.sendMessage("RSVP Limit changed", embed, event))
|
||||
);
|
||||
} catch (NumberFormatException e) {
|
||||
return Messages.sendMessage(Messages.getMessage("Notification.Args.Value" +
|
||||
".Integer", settings), event);
|
||||
}
|
||||
} else {
|
||||
return Messages.sendMessage(Messages.getMessage("Notifications.Event.InPast",
|
||||
settings), event);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
return Messages.sendMessage(Messages.getMessage("Notifications.Event.NotExist", settings),
|
||||
event);
|
||||
}
|
||||
}));
|
||||
} else {
|
||||
return Messages.sendMessage("Limit command uses the following format: `!rsvp limit <event-id> " +
|
||||
"<#limit>", event);
|
||||
}
|
||||
}).then();
|
||||
}
|
||||
|
||||
|
||||
private Mono<Void> moduleList(final String[] args, final MessageCreateEvent event, final GuildSettings settings) {
|
||||
return Mono.defer(() -> {
|
||||
@@ -315,6 +370,10 @@ public class RsvpCommand implements Command {
|
||||
|
||||
spec.setTitle(Messages.getMessage("Embed.RSVP.List.Title", settings));
|
||||
spec.addField("Event ID", data.getEventId(), false);
|
||||
if (data.getLimit() > -1)
|
||||
spec.addField("Max Respondents", data.getCurrentCount() + "/" + data.getLimit(), true);
|
||||
else
|
||||
spec.addField("Max Respondents", "Unlimited", true);
|
||||
|
||||
final StringBuilder onTimeBuilder = new StringBuilder();
|
||||
for (final Member u : onTime) onTimeBuilder.append(u.getDisplayName()).append(", ");
|
||||
|
||||
@@ -421,7 +421,8 @@ public class DatabaseManager {
|
||||
+ " GOING_ON_TIME = ?,"
|
||||
+ " GOING_LATE = ?,"
|
||||
+ " NOT_GOING = ?,"
|
||||
+ " UNDECIDED = ?"
|
||||
+ " UNDECIDED = ?,"
|
||||
+ " 'LIMIT' = ?"
|
||||
+ " WHERE EVENT_ID = ?";
|
||||
|
||||
return connect(master, c -> Mono.from(c.createStatement(update)
|
||||
@@ -430,15 +431,16 @@ public class DatabaseManager {
|
||||
.bind(2, data.getGoingLateString())
|
||||
.bind(3, data.getNotGoingString())
|
||||
.bind(4, data.getUndecidedString())
|
||||
.bind(5, data.getEventId())
|
||||
.bind(5, data.getLimit())
|
||||
.bind(6, data.getEventId())
|
||||
.execute())
|
||||
).flatMap(res -> Mono.from(res.getRowsUpdated()))
|
||||
.thenReturn(true);
|
||||
} else {
|
||||
final String insertCommand = "INSERT INTO " + table +
|
||||
"(GUILD_ID, EVENT_ID, EVENT_END, GOING_ON_TIME, GOING_LATE, " +
|
||||
"NOT_GOING, UNDECIDED)" +
|
||||
" VALUES (?, ?, ?, ?, ?, ?, ?)";
|
||||
"NOT_GOING, UNDECIDED, `LIMIT`)" +
|
||||
" VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
|
||||
|
||||
return connect(master, c -> Mono.from(c.createStatement(insertCommand)
|
||||
.bind(0, data.getGuildId().asString())
|
||||
@@ -448,6 +450,7 @@ public class DatabaseManager {
|
||||
.bind(4, data.getGoingLateString())
|
||||
.bind(5, data.getNotGoingString())
|
||||
.bind(6, data.getUndecidedString())
|
||||
.bind(7, data.getLimit())
|
||||
.execute())
|
||||
).flatMap(res -> Mono.from(res.getRowsUpdated()))
|
||||
.thenReturn(true);
|
||||
@@ -699,6 +702,7 @@ public class DatabaseManager {
|
||||
data.setGoingLateFromString(row.get("GOING_LATE", String.class));
|
||||
data.setNotGoingFromString(row.get("NOT_GOING", String.class));
|
||||
data.setUndecidedFromString(row.get("UNDECIDED", String.class));
|
||||
data.setLimit(row.get("LIMIT", Integer.class));
|
||||
|
||||
return data;
|
||||
}))
|
||||
|
||||
@@ -16,6 +16,8 @@ data class RsvpData(
|
||||
@SerialName("event_end")
|
||||
var eventEnd: Long = 0
|
||||
|
||||
var limit: Int = -1
|
||||
|
||||
@SerialName("on_time")
|
||||
val goingOnTime: MutableList<String> = mutableListOf()
|
||||
|
||||
@@ -83,6 +85,14 @@ data class RsvpData(
|
||||
this.undecided += strList.split(",")
|
||||
}
|
||||
|
||||
fun getCurrentCount() = this.goingOnTime.size + this.goingLate.size
|
||||
|
||||
fun hasRoom(userId: String): Boolean {
|
||||
return if (limit == -1 || getCurrentCount() + 1 <= limit) true
|
||||
//Check if they are in a list that counts toward limit, if true, that means they will fit in the event
|
||||
else goingOnTime.contains(userId) || goingLate.contains(userId)
|
||||
}
|
||||
|
||||
//Functions
|
||||
fun removeCompletely(userId: String) {
|
||||
this.goingOnTime.remove(userId)
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE ${prefix}rsvp
|
||||
ADD COLUMN 'limit' INT(11) NOT NULL DEFAULT -1;
|
||||
@@ -50,32 +50,10 @@ public class UpdateRsvpEndpoint {
|
||||
|
||||
final RsvpData rsvp = DatabaseManager.getRsvpData(Snowflake.of(guildId), eventId).block();
|
||||
|
||||
//Handle additions...
|
||||
if (requestBody.has("to_add")) {
|
||||
final JSONObject jToAdd = requestBody.getJSONObject("to_add");
|
||||
if (jToAdd.has("on_time")) {
|
||||
final JSONArray ar = jToAdd.getJSONArray("on_time");
|
||||
for (int i = 0; i < jToAdd.length(); i++)
|
||||
rsvp.getGoingOnTime().add(ar.getString(i));
|
||||
}
|
||||
if (jToAdd.has("late")) {
|
||||
final JSONArray ar = jToAdd.getJSONArray("late");
|
||||
for (int i = 0; i < jToAdd.length(); i++)
|
||||
rsvp.getGoingLate().add(ar.getString(i));
|
||||
}
|
||||
if (jToAdd.has("not_going")) {
|
||||
final JSONArray ar = jToAdd.getJSONArray("not_going");
|
||||
for (int i = 0; i < jToAdd.length(); i++)
|
||||
rsvp.getNotGoing().add(ar.getString(i));
|
||||
}
|
||||
if (jToAdd.has("undecided")) {
|
||||
final JSONArray ar = jToAdd.getJSONArray("undecided");
|
||||
for (int i = 0; i < jToAdd.length(); i++)
|
||||
rsvp.getUndecided().add(ar.getString(i));
|
||||
}
|
||||
}
|
||||
//Handle limit change
|
||||
rsvp.setLimit(requestBody.optInt("limit", rsvp.getLimit()));
|
||||
|
||||
//handle removals...
|
||||
//handle removals... (We do this first just in case they are using the limit)
|
||||
if (requestBody.has("to_remove")) {
|
||||
final JSONObject jToRemove = requestBody.getJSONObject("to_remove");
|
||||
if (jToRemove.has("on_time")) {
|
||||
@@ -100,6 +78,43 @@ public class UpdateRsvpEndpoint {
|
||||
}
|
||||
}
|
||||
|
||||
//Handle additions...
|
||||
if (requestBody.has("to_add")) {
|
||||
final JSONObject jToAdd = requestBody.getJSONObject("to_add");
|
||||
if (jToAdd.has("on_time")) {
|
||||
final JSONArray ar = jToAdd.getJSONArray("on_time");
|
||||
for (int i = 0; i < jToAdd.length(); i++) {
|
||||
if (rsvp.hasRoom(ar.getString(i))) {
|
||||
rsvp.removeCompletely(ar.getString(i));
|
||||
rsvp.getGoingOnTime().add(ar.getString(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (jToAdd.has("late")) {
|
||||
final JSONArray ar = jToAdd.getJSONArray("late");
|
||||
for (int i = 0; i < jToAdd.length(); i++) {
|
||||
if (rsvp.hasRoom(ar.getString(i))) {
|
||||
rsvp.removeCompletely(ar.getString(i));
|
||||
rsvp.getGoingLate().add(ar.getString(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (jToAdd.has("not_going")) {
|
||||
final JSONArray ar = jToAdd.getJSONArray("not_going");
|
||||
for (int i = 0; i < jToAdd.length(); i++) {
|
||||
rsvp.removeCompletely(ar.getString(i));
|
||||
rsvp.getNotGoing().add(ar.getString(i)); //Limit not needed here
|
||||
}
|
||||
}
|
||||
if (jToAdd.has("undecided")) {
|
||||
final JSONArray ar = jToAdd.getJSONArray("undecided");
|
||||
for (int i = 0; i < jToAdd.length(); i++) {
|
||||
rsvp.removeCompletely(ar.getString(i));
|
||||
rsvp.getUndecided().add(ar.getString(i)); //Limit also not needed here
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (DatabaseManager.updateRsvpData(rsvp).block()) {
|
||||
response.setContentType("application/json");
|
||||
response.setStatus(GlobalConst.STATUS_SUCCESS);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user