This should add ability to limit RSVPs

This commit is contained in:
NovaFox161
2021-02-04 22:38:49 -06:00
parent 9f45b5d4af
commit a853cbeee8
6 changed files with 580 additions and 477 deletions

View File

@@ -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(", ");

View File

@@ -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;
}))

View File

@@ -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)

View File

@@ -0,0 +1,2 @@
ALTER TABLE ${prefix}rsvp
ADD COLUMN 'limit' INT(11) NOT NULL DEFAULT -1;

View File

@@ -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