Move cal data from guild settings as should have been done before

Some data related to calendars was saved in guild settings,
this commit now moves it to be in calendar data as it should
have been originally.

This commit needs to be tested, specifically the MySQL changes,
and some related changed to authorization checks
This commit is contained in:
NovaFox161
2021-01-31 12:28:50 -06:00
parent c352e435ef
commit d70add51fa
53 changed files with 631 additions and 1018 deletions

View File

@@ -66,7 +66,7 @@ public class CalendarCreator {
public Mono<PreCalendar> edit(final MessageCreateEvent event, final GuildSettings settings) {
if (!this.hasPreCalendar(settings.getGuildID())) {
return DatabaseManager.getMainCalendar(settings.getGuildID()).flatMap(data ->
CalendarWrapper.getCalendar(data, settings)
CalendarWrapper.getCalendar(data)
.flatMap(calendar -> {
final PreCalendar preCalendar = new PreCalendar(settings.getGuildID(), calendar, true);
preCalendar.setCalendarId(data.getCalendarAddress());
@@ -90,7 +90,7 @@ public class CalendarCreator {
public Mono<PreCalendar> edit(final int calNumber, final MessageCreateEvent event, final GuildSettings settings) {
if (!this.hasPreCalendar(settings.getGuildID())) {
return DatabaseManager.getCalendar(settings.getGuildID(), calNumber).flatMap(data ->
CalendarWrapper.getCalendar(data, settings)
CalendarWrapper.getCalendar(data)
.flatMap(calendar -> {
final PreCalendar preCalendar = new PreCalendar(settings.getGuildID(), calendar, true);
preCalendar.setCalendarId(data.getCalendarAddress());
@@ -136,7 +136,6 @@ public class CalendarCreator {
1, //TODO: Support multi-calendar
confirmed.getId(),
confirmed.getId(),
false,
credId);
final AclRule rule = new AclRule()
@@ -148,7 +147,7 @@ public class CalendarCreator {
return Mono.when(
DatabaseManager.updateCalendar(data),
AclRuleWrapper.insertRule(rule, data, settings)
AclRuleWrapper.insertRule(rule, data)
)
.then(Mono.fromRunnable(() -> this.terminate(settings.getGuildID())))
.thenReturn(response);
@@ -156,7 +155,7 @@ public class CalendarCreator {
} else {
//Editing calendar...
calendar.setId(pre.getCalendarId());
return CalendarWrapper.updateCalendar(calendar, settings, pre.getCalendarData())
return CalendarWrapper.updateCalendar(calendar, pre.getCalendarData())
.flatMap(confirmed -> {
final AclRule rule = new AclRule()
.setScope(new AclRule.Scope().setType("default"))
@@ -165,7 +164,7 @@ public class CalendarCreator {
final CalendarCreatorResponse response = new CalendarCreatorResponse(true, true,
pre.getCreatorMessage(), confirmed);
return AclRuleWrapper.insertRule(rule, pre.getCalendarData(), settings)
return AclRuleWrapper.insertRule(rule, pre.getCalendarData())
.doOnNext(a -> this.terminate(settings.getGuildID()))
.thenReturn(response);
}).defaultIfEmpty(new CalendarCreatorResponse(false, true, pre.getCreatorMessage(), null));

View File

@@ -50,7 +50,7 @@ public class EventCreator {
final PreEvent event = new PreEvent(settings.getGuildID());
this.events.add(event);
return CalendarWrapper.getCalendar(calData, settings)
return CalendarWrapper.getCalendar(calData)
.doOnNext(c -> event.setTimezone(c.getTimeZone()))
.flatMap(c -> EventMessageFormatter.getPreEventEmbed(event, settings))
.flatMap(embed -> Messages.sendMessage(
@@ -72,7 +72,7 @@ public class EventCreator {
this.events.add(event);
return CalendarWrapper.getCalendar(calData, settings)
return CalendarWrapper.getCalendar(calData)
.doOnNext(c -> event.setTimezone(c.getTimeZone()))
.flatMap(c -> EventMessageFormatter.getPreEventEmbed(event, settings))
.flatMap(embed -> Messages.sendMessage(
@@ -89,13 +89,13 @@ public class EventCreator {
public Mono<PreEvent> init(final MessageCreateEvent e, final String eventId, final GuildSettings settings) {
if (!this.hasPreEvent(settings.getGuildID())) {
return DatabaseManager.getCalendar(settings.getGuildID(), 1) //TODO: handle multiple calendars
.flatMap(calData -> EventWrapper.getEvent(calData, settings, eventId)
.flatMap(calData -> EventWrapper.getEvent(calData, eventId)
.flatMap(toCopy -> {
final PreEvent event = new PreEvent(settings.getGuildID(), toCopy);
this.events.add(event);
return CalendarWrapper.getCalendar(calData, settings)
return CalendarWrapper.getCalendar(calData)
.doOnNext(c -> event.setTimezone(c.getTimeZone()))
.flatMap(c -> EventMessageFormatter.getPreEventEmbed(event, settings))
.flatMap(embed -> Messages.sendMessage(
@@ -111,14 +111,14 @@ public class EventCreator {
public Mono<PreEvent> edit(final MessageCreateEvent e, final String eventId, final GuildSettings settings) {
if (!this.hasPreEvent(settings.getGuildID())) {
return DatabaseManager.getCalendar(settings.getGuildID(), 1) //TODO: handle multiple calendars
.flatMap(calData -> EventWrapper.getEvent(calData, settings, eventId)
.flatMap(calData -> EventWrapper.getEvent(calData, eventId)
.flatMap(toEdit -> {
final PreEvent event = new PreEvent(settings.getGuildID(), toEdit);
event.setEditing(true);
this.events.add(event);
return CalendarWrapper.getCalendar(calData, settings)
return CalendarWrapper.getCalendar(calData)
.doOnNext(c -> event.setTimezone(c.getTimeZone()))
.flatMap(c -> EventMessageFormatter.getPreEventEmbed(event, settings))
.flatMap(embed -> Messages.sendMessage(
@@ -160,7 +160,7 @@ public class EventCreator {
if (!pre.getEditing()) {
event.setId(KeyGenerator.generateEventId());
return EventWrapper.createEvent(calData, event, settings)
return EventWrapper.createEvent(calData, event)
.flatMap(confirmed -> {
final EventCreatorResponse response = new EventCreatorResponse(true,
confirmed, pre.getCreatorMessage(), false);
@@ -178,7 +178,7 @@ public class EventCreator {
} else {
event.setId(pre.getEventId());
return EventWrapper.updateEvent(calData, event, settings)
return EventWrapper.updateEvent(calData, event)
.flatMap(confirmed -> {
final EventCreatorResponse response = new EventCreatorResponse(true,
confirmed, pre.getCreatorMessage(), true);

View File

@@ -57,12 +57,12 @@ public class AnnouncementMessageFormatter {
.defaultIfEmpty(new EventData()).cache();
Mono<Boolean> img = eData.filter(EventData::shouldBeSaved)
.flatMap(ed -> ImageUtils.validate(ed.getImageLink(), settings.isPatronGuild()))
.flatMap(ed -> ImageUtils.validate(ed.getImageLink(), settings.getPatronGuild()))
.defaultIfEmpty(false);
return Mono.zip(guild, channelName, eData, img)
.map(TupleUtils.function((g, chanName, ed, hasImg) -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite, g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
@@ -98,7 +98,7 @@ public class AnnouncementMessageFormatter {
spec.setColor(GlobalConst.discalColor);
spec.addField(Messages.getMessage("Embed.Announcement.Info.Enabled", settings), a.getEnabled() + "", true);
if (settings.isDevGuild() || settings.isPatronGuild())
if (settings.getDevGuild() || settings.getPatronGuild())
spec.addField("Publishable", a.getType() + "", true);
}));
}
@@ -111,7 +111,7 @@ public class AnnouncementMessageFormatter {
.map(Announcement::getType)
.filter(t -> t.equals(AnnouncementType.SPECIFIC))
.flatMap(t -> DatabaseManager.getMainCalendar(a.getGuildId()))
.flatMap(cd -> EventWrapper.getEvent(cd, settings, a.getEventId()))
.flatMap(cd -> EventWrapper.getEvent(cd, a.getEventId()))
.defaultIfEmpty(new Event());
Mono<EventData> eData = Mono.just(a)
@@ -121,13 +121,13 @@ public class AnnouncementMessageFormatter {
.defaultIfEmpty(new EventData()).cache();
Mono<Boolean> img = eData.filter(EventData::shouldBeSaved)
.flatMap(ed -> ImageUtils.validate(ed.getImageLink(), settings.isPatronGuild()))
.flatMap(ed -> ImageUtils.validate(ed.getImageLink(), settings.getPatronGuild()))
.defaultIfEmpty(false);
return Mono.zip(guild, event, eData, img)
.map(TupleUtils.function((g, e, ed, hasImg) -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite, g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
@@ -175,7 +175,7 @@ public class AnnouncementMessageFormatter {
.map(Announcement::getType)
.filter(t -> t.equals(AnnouncementType.SPECIFIC))
.flatMap(t -> DatabaseManager.getCalendar(a.getGuildId(), calNum))
.flatMap(cd -> EventWrapper.getEvent(cd, settings, a.getEventId()))
.flatMap(cd -> EventWrapper.getEvent(cd, a.getEventId()))
.defaultIfEmpty(new Event());
Mono<EventData> eData = Mono.just(a)
@@ -185,13 +185,13 @@ public class AnnouncementMessageFormatter {
.defaultIfEmpty(new EventData()).cache();
Mono<Boolean> img = eData.filter(EventData::shouldBeSaved)
.flatMap(ed -> ImageUtils.validate(ed.getImageLink(), settings.isPatronGuild()))
.flatMap(ed -> ImageUtils.validate(ed.getImageLink(), settings.getPatronGuild()))
.defaultIfEmpty(false);
return Mono.zip(guild, event, eData, img)
.map(TupleUtils.function((g, e, ed, hasImg) -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite, g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
@@ -241,7 +241,7 @@ public class AnnouncementMessageFormatter {
Mono<String> startTime = EventMessageFormatter
.getHumanReadableTime(event.getStart(), cd.getCalendarNumber(), false, settings);
Mono<String> timezone = CalendarWrapper.getCalendar(cd, settings)
Mono<String> timezone = CalendarWrapper.getCalendar(cd)
.map(com.google.api.services.calendar.model.Calendar::getTimeZone)
.defaultIfEmpty("TZ Unknown/Error");
@@ -250,12 +250,12 @@ public class AnnouncementMessageFormatter {
.cache();
Mono<Boolean> img = eData.filter(EventData::shouldBeSaved)
.flatMap(ed -> ImageUtils.validate(ed.getImageLink(), settings.isPatronGuild()))
.flatMap(ed -> ImageUtils.validate(ed.getImageLink(), settings.getPatronGuild()))
.defaultIfEmpty(false);
return Mono.zip(guild, startDate, startTime, timezone, eData, img)
.map(TupleUtils.function((g, sDate, sTime, tz, ed, hasImg) -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite, g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
@@ -274,7 +274,7 @@ public class AnnouncementMessageFormatter {
spec.setColor(GlobalConst.discalColor);
}
if (!settings.usingSimpleAnnouncements()) {
if (!settings.getSimpleAnnouncements()) {
spec.setFooter(Messages.getMessage("Embed.Announcement.Announce.ID", "%id%", a.getAnnouncementId().toString(), settings), null);
}
@@ -299,7 +299,7 @@ public class AnnouncementMessageFormatter {
}
spec.addField(Messages.getMessage("Embed.Announcement.Announce.Description", settings), description, true);
}
if (!settings.usingSimpleAnnouncements()) {
if (!settings.getSimpleAnnouncements()) {
spec.addField(Messages.getMessage("Embed.Announcement.Announce.Date", settings), sDate, true);
spec.addField(Messages.getMessage("Embed.Announcement.Announce.Time", settings), sTime, true);
spec.addField(Messages.getMessage("Embed.Announcement.Announce.TimeZone", settings), tz, true);
@@ -317,7 +317,7 @@ public class AnnouncementMessageFormatter {
}
}
if (!settings.usingSimpleAnnouncements())
if (!settings.getSimpleAnnouncements())
spec.addField(Messages.getMessage("Embed.Announcement.Announce.EventID", settings), event.getId(), false);
if (!"None".equalsIgnoreCase(a.getInfo()) && !"".equalsIgnoreCase(a.getInfo()))
spec.addField(Messages.getMessage("Embed.Announcement.Announce.Info", settings), a.getInfo(), false);

View File

@@ -32,7 +32,7 @@ public class CalendarMessageFormatter {
@Deprecated
public static Mono<Consumer<EmbedCreateSpec>> getCalendarLinkEmbed(final Calendar cal, final GuildSettings settings) {
return DisCalClient.getClient().getGuildById(settings.getGuildID()).map(g -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite, g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
@@ -54,7 +54,7 @@ public class CalendarMessageFormatter {
public static Mono<Consumer<EmbedCreateSpec>> getCalendarLinkEmbed(final Calendar cal, final int calNum, final GuildSettings settings) {
return DisCalClient.getClient().getGuildById(settings.getGuildID()).map(g -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite, g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
@@ -76,7 +76,7 @@ public class CalendarMessageFormatter {
public static Mono<Consumer<EmbedCreateSpec>> getPreCalendarEmbed(final PreCalendar calendar, final GuildSettings settings) {
return DisCalClient.getClient().getGuildById(settings.getGuildID()).map(g -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite, g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);

View File

@@ -46,16 +46,16 @@ public class EventMessageFormatter {
final Mono<String> eDate = getHumanReadableDate(event.getEnd(), false, settings);
final Mono<String> eTime = getHumanReadableTime(event.getEnd(), false, settings);
final Mono<Boolean> img = data.filter(EventData::shouldBeSaved)
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.isPatronGuild()))
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.getPatronGuild()))
.defaultIfEmpty(false);
final Mono<String> timezone = DatabaseManager.getMainCalendar(settings.getGuildID())
.flatMap(d -> CalendarWrapper.getCalendar(d, settings))
.flatMap(d -> CalendarWrapper.getCalendar(d))
.map(com.google.api.services.calendar.model.Calendar::getTimeZone)
.defaultIfEmpty("Error/Unknown");
return Mono.zip(guild, data, sDate, sTime, eDate, eTime, img, timezone)
.map(TupleUtils.function((g, ed, startDate, startTime, endDate, endTime, hasImg, tz) -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite, g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
@@ -117,16 +117,16 @@ public class EventMessageFormatter {
final Mono<String> eDate = getHumanReadableDate(event.getEnd(), calNum, false, settings);
final Mono<String> eTime = getHumanReadableTime(event.getEnd(), calNum, false, settings);
final Mono<Boolean> img = data.filter(EventData::shouldBeSaved)
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.isPatronGuild()))
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.getPatronGuild()))
.defaultIfEmpty(false);
final Mono<String> timezone = DatabaseManager.getCalendar(settings.getGuildID(), calNum)
.flatMap(d -> CalendarWrapper.getCalendar(d, settings))
.flatMap(d -> CalendarWrapper.getCalendar(d))
.map(com.google.api.services.calendar.model.Calendar::getTimeZone)
.defaultIfEmpty("Error/Unknown");
return Mono.zip(guild, data, sDate, sTime, eDate, eTime, img, timezone)
.map(TupleUtils.function((g, ed, startDate, startTime, endDate, endTime, hasImg, tz) -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite, g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
@@ -187,13 +187,13 @@ public class EventMessageFormatter {
final Mono<String> date = getHumanReadableDate(event.getStart(), false, settings);
final Mono<String> time = getHumanReadableTime(event.getStart(), false, settings);
final Mono<Boolean> img = data.filter(EventData::shouldBeSaved)
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.isPatronGuild()))
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.getPatronGuild()))
.defaultIfEmpty(false);
return Mono.zip(guild, data, time, date, img)
.map(TupleUtils.function((g, ed, startDate, startTime, hasImg) -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite, g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
@@ -240,13 +240,13 @@ public class EventMessageFormatter {
final Mono<String> date = getHumanReadableDate(event.getStart(), calNum, false, settings);
final Mono<String> time = getHumanReadableTime(event.getOriginalStartTime(), 1, false, settings);
final Mono<Boolean> img = data.filter(EventData::shouldBeSaved)
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.isPatronGuild()))
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.getPatronGuild()))
.defaultIfEmpty(false);
return Mono.zip(guild, data, date, time, img)
.map(TupleUtils.function((g, ed, startData, startTime, hasImg) -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite, g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
@@ -293,12 +293,12 @@ public class EventMessageFormatter {
final Mono<String> eDate = getHumanReadableDate(event.getEndDateTime(), calNum, false, settings);
final Mono<String> eTime = getHumanReadableTime(event.getEndDateTime(), calNum, false, settings);
final Mono<Boolean> img = Mono.justOrEmpty(event.getEventData()).filter(EventData::shouldBeSaved)
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.isPatronGuild()))
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.getPatronGuild()))
.defaultIfEmpty(false);
return Mono.zip(guild, sDate, sTime, eDate, eTime, img)
.map(TupleUtils.function((g, startDate, startTime, endDate, endTime, hasImg) -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite, g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
@@ -364,12 +364,12 @@ public class EventMessageFormatter {
final Mono<String> eDate = getHumanReadableDate(event.getEndDateTime(), false, settings);
final Mono<String> eTime = getHumanReadableTime(event.getEndDateTime(), false, settings);
final Mono<Boolean> img = Mono.justOrEmpty(event.getEventData()).filter(EventData::shouldBeSaved)
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.isPatronGuild()))
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.getPatronGuild()))
.defaultIfEmpty(false);
return Mono.zip(guild, sDate, sTime, eDate, eTime, img)
.map(TupleUtils.function((g, startDate, startTime, endDate, endTime, hasImg) -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite, g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
@@ -436,12 +436,12 @@ public class EventMessageFormatter {
final Mono<String> date = getHumanReadableDate(ecr.getEvent().getStart(), false, settings);
final Mono<String> time = getHumanReadableTime(ecr.getEvent().getStart(), false, settings);
final Mono<Boolean> img = data.filter(EventData::shouldBeSaved)
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.isPatronGuild()))
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.getPatronGuild()))
.defaultIfEmpty(false);
return Mono.zip(guild, data, date, time, img)
.map(TupleUtils.function((g, ed, d, t, hasImg) -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite,
g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
@@ -486,12 +486,12 @@ public class EventMessageFormatter {
final Mono<String> date = getHumanReadableDate(ecr.getEvent().getStart(), calNum, false, settings);
final Mono<String> time = getHumanReadableTime(ecr.getEvent().getStart(), calNum, false, settings);
final Mono<Boolean> img = data.filter(EventData::shouldBeSaved)
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.isPatronGuild()))
.flatMap(d -> ImageUtils.validate(d.getImageLink(), settings.getPatronGuild()))
.defaultIfEmpty(false);
return Mono.zip(guild, data, date, time, img)
.map(TupleUtils.function((g, ed, d, t, hasImg) -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(g.getName(), GlobalConst.discalSite,
g.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
@@ -533,7 +533,7 @@ public class EventMessageFormatter {
return Mono.justOrEmpty(eventDateTime).flatMap(dateTime -> {
if (!preEvent) {
return DatabaseManager.getMainCalendar(settings.getGuildID())
.flatMap(data -> CalendarWrapper.getCalendar(data, settings))
.flatMap(data -> CalendarWrapper.getCalendar(data))
.map(com.google.api.services.calendar.model.Calendar::getTimeZone);
} else {
return Mono.just("UTC");
@@ -561,7 +561,7 @@ public class EventMessageFormatter {
return Mono.justOrEmpty(eventDateTime).flatMap(dateTime -> {
if (!preEvent) {
return DatabaseManager.getCalendar(settings.getGuildID(), calNum)
.flatMap(data -> CalendarWrapper.getCalendar(data, settings))
.flatMap(data -> CalendarWrapper.getCalendar(data))
.map(com.google.api.services.calendar.model.Calendar::getTimeZone);
} else {
return Mono.just("UTC");
@@ -589,7 +589,7 @@ public class EventMessageFormatter {
return Mono.justOrEmpty(eventDateTime).flatMap(dateTime -> {
if (!preEvent) {
return DatabaseManager.getMainCalendar(settings.getGuildID())
.flatMap(data -> CalendarWrapper.getCalendar(data, settings))
.flatMap(data -> CalendarWrapper.getCalendar(data))
.map(com.google.api.services.calendar.model.Calendar::getTimeZone);
} else {
return Mono.just("UTC");
@@ -617,7 +617,7 @@ public class EventMessageFormatter {
return Mono.justOrEmpty(eventDateTime).flatMap(dateTime -> {
if (!preEvent) {
return DatabaseManager.getCalendar(settings.getGuildID(), calNum)
.flatMap(data -> CalendarWrapper.getCalendar(data, settings))
.flatMap(data -> CalendarWrapper.getCalendar(data))
.map(com.google.api.services.calendar.model.Calendar::getTimeZone);
} else {
return Mono.just("UTC");

View File

@@ -57,7 +57,7 @@ public class AnnouncementThread {
final Mono<GuildSettings> s = this.getSettings(a).cache();
final Mono<CalendarData> cd = this.getCalendarData(a).cache();
final Mono<Calendar> se = cd.flatMap(calData -> s.flatMap(gs -> this.getService(gs, calData)));
final Mono<Calendar> se = cd.flatMap(calData -> s.flatMap(gs -> this.getService(calData)));
return Mono.zip(s, cd, se)
.flatMap(function((settings, calData, service) -> {
@@ -92,7 +92,7 @@ public class AnnouncementThread {
Calendar service) {
switch (a.getType()) {
case SPECIFIC:
return EventWrapper.getEvent(calData, settings, a.getEventId())
return EventWrapper.getEvent(calData, a.getEventId())
.switchIfEmpty(DatabaseManager.deleteAnnouncement(a.getAnnouncementId().toString())
.then(Mono.empty())
).flatMap(e -> this.inRangeSpecific(a, e)
@@ -109,14 +109,14 @@ public class AnnouncementThread {
}))
.then();
case UNIVERSAL:
return this.getEvents(settings, calData, service)
return this.getEvents(calData, service)
.flatMapMany(Flux::fromIterable)
.filter(e -> this.isInRange(a, e))
.flatMap(e -> AnnouncementMessageFormatter
.sendAnnouncementMessage(guild, a, e, calData, settings))
.then();
case COLOR:
return this.getEvents(settings, calData, service)
return this.getEvents(calData, service)
.flatMapMany(Flux::fromIterable)
.filter(e -> e.getColorId() != null
&& a.getEventColor().equals(EventColor
@@ -127,7 +127,7 @@ public class AnnouncementThread {
.then();
case RECUR:
return this.getEvents(settings, calData, service)
return this.getEvents(calData, service)
.flatMapMany(Flux::fromIterable)
.filter(e -> e.getId().contains("_") && e.getId().split("_")[0].equals(a.getEventId()))
.filter(e -> this.isInRange(a, e))
@@ -227,21 +227,21 @@ public class AnnouncementThread {
return this.calendars.get(a.getGuildId());
}
private Mono<Calendar> getService(GuildSettings gs, CalendarData cd) {
if (gs.useExternalCalendar()) {
if (!this.customServices.containsKey(gs.getGuildID()))
this.customServices.put(gs.getGuildID(), CalendarAuth.getCalendarService(gs, cd).cache());
private Mono<Calendar> getService(CalendarData cd) {
if (cd.getExternal()) {
if (!this.customServices.containsKey(cd.getGuildId()))
this.customServices.put(cd.getGuildId(), CalendarAuth.getCalendarService(cd).cache());
return this.customServices.get(gs.getGuildID());
return this.customServices.get(cd.getGuildId());
}
return this.discalServices.get(cd.getCredentialId());
}
private Mono<List<Event>> getEvents(GuildSettings gs, CalendarData cd, Calendar service) {
if (!this.allEvents.containsKey(gs.getGuildID())) {
private Mono<List<Event>> getEvents(CalendarData cd, Calendar service) {
if (!this.allEvents.containsKey(cd.getGuildId())) {
Mono<List<Event>> events = EventWrapper.getEvents(cd, service, 15, System.currentTimeMillis()).cache();
this.allEvents.put(gs.getGuildID(), events);
this.allEvents.put(cd.getGuildId(), events);
}
return this.allEvents.get(gs.getGuildID());
return this.allEvents.get(cd.getGuildId());
}
}

View File

@@ -72,7 +72,7 @@ public class AddCalendarCommand implements Command {
@Override
public Mono<Void> issueCommand(final String[] args, final MessageCreateEvent event, final GuildSettings settings) {
return Mono.just(settings)
.filter(s -> s.isDevGuild() || s.isPatronGuild())
.filter(s -> s.getDevGuild() || s.getPatronGuild())
.flatMap(s -> PermissionChecker.hasManageServerRole(event)
.filter(identity -> identity)
.flatMap(ignore -> {
@@ -90,31 +90,29 @@ public class AddCalendarCommand implements Command {
}
});
} else if (args.length == 1) {
return DatabaseManager.getMainCalendar(settings.getGuildID()).hasElement().flatMap(hasCal -> {
if (hasCal) {
return DatabaseManager.getMainCalendar(settings.getGuildID()).flatMap(data -> {
if ("primary".equalsIgnoreCase(data.getCalendarAddress())) {
return Messages.sendMessage(Messages.getMessage("Creator.Calendar.HasCalendar", settings), event);
} else if ("N/a".equalsIgnoreCase(settings.getEncryptedAccessToken())
&& "N/a".equalsIgnoreCase(settings.getEncryptedRefreshToken())) {
} else if ("N/a".equalsIgnoreCase(data.getEncryptedAccessToken())
&& "N/a".equalsIgnoreCase(data.getEncryptedRefreshToken())) {
return Messages.sendMessage(Messages.getMessage("AddCalendar.Select.NotAuth", settings), event);
} else {
return CalendarWrapper.getUsersExternalCalendars(settings)
return CalendarWrapper.getUsersExternalCalendars(data)
.flatMapMany(Flux::fromIterable)
.any(c -> !c.isDeleted() && c.getId().equals(args[0]))
.flatMap(valid -> {
if (valid) {
final CalendarData data = new CalendarData(settings.getGuildID(), 1,
args[0], args[0], true, 0);
//update guild settings to reflect changes...
settings.setUseExternalCalendar(true);
final CalendarData newData = new CalendarData(
data.getGuildId(), 1, args[0], args[0], true, 0,
data.getPrivateKey(), data.getEncryptedAccessToken(),
data.getEncryptedRefreshToken());
//combine db calls and message send to be executed together async
final Mono<Boolean> calInsert = DatabaseManager.updateCalendar(data);
final Mono<Boolean> settingsUpdate = DatabaseManager.updateSettings(settings);
final Mono<Boolean> calInsert = DatabaseManager.updateCalendar(newData);
final Mono<Message> sendMsg = Messages.sendMessage(
Messages.getMessage("AddCalendar.Select.Success", settings), event);
return Mono.when(calInsert, settingsUpdate, sendMsg)
return Mono.when(calInsert, sendMsg)
.thenReturn(GlobalConst.NOT_EMPTY);
} else {
return Messages.sendMessage(Messages

View File

@@ -190,7 +190,7 @@ public class AnnouncementCommand implements Command {
case "colour":
return this.moduleColor(args, event, settings);
case "publish":
if (settings.isDevGuild() || settings.isPatronGuild())
if (settings.getPatronGuild() || settings.getPatronGuild())
return this.modulePublish(event, settings);
else
return Messages.sendMessage(Messages.getMessage("Notification.Patron", settings), event);

View File

@@ -307,7 +307,7 @@ public class CalendarCommand implements Command {
//Test perms and delete calendar...
return PermissionChecker.hasManageServerRole(event)
.filter(identity -> identity)
.flatMap(b -> CalendarUtils.deleteCalendar(calendarData, settings)
.flatMap(b -> CalendarUtils.deleteCalendar(calendarData)
.flatMap(success -> {
if (success) {
return Messages.sendMessage(

View File

@@ -121,7 +121,7 @@ public class DevCommand implements Command {
return Mono.just(Long.valueOf(args[1]))
.map(Snowflake::of)
.flatMap(DatabaseManager::getSettings)
.doOnNext(settings -> settings.setPatronGuild(!settings.isPatronGuild()))
.doOnNext(settings -> settings.setPatronGuild(!settings.getPatronGuild()))
.flatMap(DatabaseManager::updateSettings)
.then(Messages.sendMessage("isPatronGuild value updated! Client's cache needs to be invalidated", event))
.onErrorResume(NumberFormatException.class, e ->
@@ -140,7 +140,7 @@ public class DevCommand implements Command {
return Mono.just(Long.valueOf(args[1]))
.map(Snowflake::of)
.flatMap(DatabaseManager::getSettings)
.doOnNext(settings -> settings.setDevGuild(!settings.isDevGuild()))
.doOnNext(settings -> settings.setDevGuild(!settings.getDevGuild()))
.flatMap(DatabaseManager::updateSettings)
.then(Messages.sendMessage("isDevGuild value updated! Client's cache needs to be invalidated", event))
.onErrorResume(NumberFormatException.class, e ->

View File

@@ -131,7 +131,7 @@ public class DisCalCommand implements Command {
final Mono<Consumer<EmbedCreateSpec>> embedMono = Mono.zip(guildMono, guildCountMono, calCountMono, annCountMono)
.map(TupleUtils.function((guild, guilds, calendars, announcements) -> (EmbedCreateSpec spec) -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(guild.getName(), GlobalConst.discalSite, guild.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
@@ -208,10 +208,10 @@ public class DisCalCommand implements Command {
private Mono<Void> moduleSimpleAnnouncement(final MessageCreateEvent event, final GuildSettings settings) {
return Mono.just(settings)
.doOnNext(s -> s.setSimpleAnnouncements(!s.usingSimpleAnnouncements()))
.doOnNext(s -> s.setSimpleAnnouncements(!s.getSimpleAnnouncements()))
.flatMap(DatabaseManager::updateSettings)
.then(Messages.sendMessage(
Messages.getMessage("DisCal.SimpleAnnouncement", "%value%", settings.usingSimpleAnnouncements() + "", settings)
Messages.getMessage("DisCal.SimpleAnnouncement", "%value%", settings.getSimpleAnnouncements() + "", settings)
, event))
.then();
}
@@ -224,23 +224,23 @@ public class DisCalCommand implements Command {
final Mono<Consumer<EmbedCreateSpec>> embedMono = Mono.zip(guildMono, dRoleMono, dChanMono)
.map(TupleUtils.function((guild, dRole, dChannel) -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(guild.getName(), GlobalConst.discalSite, guild.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
spec.setTitle(Messages.getMessage("Embed.DisCal.Settings.Title", settings));
spec.addField(Messages.getMessage("Embed.DisCal.Settings.ExternalCal", settings), settings.useExternalCalendar() + "", true);
spec.addField(Messages.getMessage("Embed.Discal.Settings.Role", settings), dRole, true);
spec.addField(Messages.getMessage("Embed.DisCal.Settings.Channel", settings), dChannel, false);
spec.addField(Messages.getMessage("Embed.DisCal.Settings.SimpleAnn", settings), settings.usingSimpleAnnouncements() + "", true);
spec.addField(Messages.getMessage("Embed.DisCal.Settings.Patron", settings), settings.isPatronGuild() + "", true);
spec.addField(Messages.getMessage("Embed.DisCal.Settings.Dev", settings), settings.isDevGuild() + "", true);
spec.addField(Messages.getMessage("Embed.DisCal.Settings.SimpleAnn", settings), settings.getSimpleAnnouncements() + "",
true);
spec.addField(Messages.getMessage("Embed.DisCal.Settings.Patron", settings), settings.getPatronGuild() + "", true);
spec.addField(Messages.getMessage("Embed.DisCal.Settings.Dev", settings), settings.getDevGuild() + "", true);
spec.addField(Messages.getMessage("Embed.DisCal.Settings.MaxCal", settings), settings.getMaxCalendars() + "", true);
spec.addField(Messages.getMessage("Embed.DisCal.Settings.Language", settings), settings.getLang(), true);
spec.addField(Messages.getMessage("Embed.DisCal.Settings.Prefix", settings), settings.getPrefix(), true);
//TODO: Add translations...
spec.addField("Using Branding", settings.isBranded() + "", true);
spec.addField("Using Branding", settings.getBranded() + "", true);
spec.setFooter(Messages.getMessage("Embed.DisCal.Info.Patron", settings) + ": https://www.patreon.com/Novafox", null);
spec.setUrl("https://www.discalbot.com/");
spec.setColor(GlobalConst.discalColor);
@@ -250,7 +250,7 @@ public class DisCalCommand implements Command {
}
private Mono<Void> moduleDmAnnouncements(final MessageCreateEvent event, final GuildSettings settings) {
return Mono.just(settings.isDevGuild())
return Mono.just(settings.getDevGuild())
.filter(identity -> identity)
.flatMap(b -> event.getMessage().getAuthorAsMember())
.flatMap(member -> {
@@ -321,13 +321,13 @@ public class DisCalCommand implements Command {
private Mono<Void> moduleBrand(final MessageCreateEvent event, final GuildSettings settings) {
return PermissionChecker.hasDisCalRole(event, settings)
.filter(identity -> identity)
.map(b -> settings.isPatronGuild())
.map(b -> settings.getPatronGuild())
.flatMap(isPatron -> {
if (isPatron) {
settings.setBranded(!settings.isBranded());
settings.setBranded(!settings.getBranded());
return DatabaseManager.updateSettings(settings)
.then(Messages.sendMessage(
Messages.getMessage("DisCal.Brand", "%value%", settings.isBranded() + "", settings),
Messages.getMessage("DisCal.Brand", "%value%", settings.getBranded() + "", settings),
event));
} else {
return Messages.sendMessage(Messages.getMessage("Notification.Patron", settings), event);
@@ -341,4 +341,4 @@ public class DisCalCommand implements Command {
return Messages.sendMessage(Messages.getMessage("DisCal.DashboardLink", "%link%",
GlobalConst.discalDashboardLink, settings), event).then();
}
}
}

View File

@@ -388,7 +388,7 @@ public class EventCommand implements Command {
} else {
//Check if enough args and event exists...
if (args.length == 2) {
return EventWrapper.getEvent(calendarData, settings, args[1])
return EventWrapper.getEvent(calendarData, args[1])
.flatMap(e -> EventMessageFormatter.getEventEmbed(e, calendarData.getCalendarNumber(), settings))
.flatMap(em -> Messages.sendMessage(em, event))
.switchIfEmpty(Messages.sendMessage(Messages.getMessage("Creator.Event.NotFound", settings), event));
@@ -792,7 +792,7 @@ public class EventCommand implements Command {
Messages.getMessage("Creator.Event.Attachment.Delete", settings), em, event))
.doOnNext(pre::setCreatorMessage);
} else {
return ImageUtils.validate(value, settings.isPatronGuild()).flatMap(valid -> {
return ImageUtils.validate(value, settings.getPatronGuild()).flatMap(valid -> {
if (valid) {
final PreEvent preEvent = EventCreator.getCreator().getPreEvent(settings.getGuildID());

View File

@@ -81,7 +81,7 @@ public class EventListCommand implements Command {
} else {
switch (args[0].toLowerCase()) {
case "search":
if (settings.isDevGuild())
if (settings.getDevGuild())
return this.moduleSearch(args, event, settings);
else
return Messages.sendMessage(Messages.getMessage("Notification.Disabled", settings), event);
@@ -103,7 +103,7 @@ public class EventListCommand implements Command {
return Mono.defer(() -> {
if (args.length == 0) {
return DatabaseManager.getMainCalendar(settings.getGuildID()) //TODO: support multi-cal
.flatMap(data -> EventWrapper.getEvents(data, settings, 1, System.currentTimeMillis())
.flatMap(data -> EventWrapper.getEvents(data, 1, System.currentTimeMillis())
.flatMap(events -> {
if (events.isEmpty()) {
return Messages.sendMessage(Messages.getMessage("Event.List.Found.None", settings), event);
@@ -123,7 +123,7 @@ public class EventListCommand implements Command {
return Messages.sendMessage(Messages.getMessage("Event.List.Amount.Under", settings), event);
} else {
return DatabaseManager.getMainCalendar(settings.getGuildID()) //TODO: support multi-cal
.flatMap(data -> EventWrapper.getEvents(data, settings, count, System.currentTimeMillis())
.flatMap(data -> EventWrapper.getEvents(data, count, System.currentTimeMillis())
.flatMap(events -> {
if (events.isEmpty()) {
return Messages.sendMessage(Messages.getMessage("Event.List.Found.None", settings), event);
@@ -164,7 +164,7 @@ public class EventListCommand implements Command {
final long now = System.currentTimeMillis();
final long end = now + GlobalConst.oneDayMs;
return EventWrapper.getEvents(data, settings, 20, now, end).flatMap(events -> {
return EventWrapper.getEvents(data, 20, now, end).flatMap(events -> {
if (events.isEmpty()) {
return Messages.sendMessage(Messages.getMessage("Event.List.Found.None", settings), event);
} else if (events.size() == 1) {
@@ -197,7 +197,7 @@ public class EventListCommand implements Command {
final long start = System.currentTimeMillis() - (GlobalConst.oneDayMs * 14); // 2 weeks ago
final long end = System.currentTimeMillis() + GlobalConst.oneDayMs; // one day from now
return EventWrapper.getEvents(data, settings, start, end).flatMap(events -> {
return EventWrapper.getEvents(data, start, end).flatMap(events -> {
if (events.isEmpty()) {
return Messages.sendMessage("No ongoing events found!", event);
} else {
@@ -230,4 +230,4 @@ public class EventListCommand implements Command {
}
}).then();
}
}
}

View File

@@ -70,11 +70,11 @@ public class LinkCalendarCommand implements Command {
public Mono<Void> issueCommand(final String[] args, final MessageCreateEvent event, final GuildSettings settings) {
//TODO: Support multiple calendars...
return DatabaseManager.getMainCalendar(settings.getGuildID())
.flatMap(calData -> CalendarWrapper.getCalendar(calData, settings)
.flatMap(calData -> CalendarWrapper.getCalendar(calData)
.flatMap(cal -> CalendarMessageFormatter.getCalendarLinkEmbed(cal, calData.getCalendarNumber(), settings)
.flatMap(embed -> Messages.sendMessage(embed, event))
).switchIfEmpty(Messages.sendMessage(Messages.getMessage("Notification.Error.Unknown", settings), event))
).switchIfEmpty(Messages.sendMessage(Messages.getMessage("Creator.Calendar.NoCalendar", settings), event))
.then();
}
}
}

View File

@@ -308,7 +308,7 @@ public class RsvpCommand implements Command {
return Mono.zip(guildMono, onTimeMono, lateMono, undecidedMono, notGoingMono)
.map(TupleUtils.function((guild, onTime, late, undecided, notGoing) -> spec -> {
if (settings.isBranded())
if (settings.getBranded())
spec.setAuthor(guild.getName(), GlobalConst.discalSite, guild.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
else
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
@@ -317,24 +317,16 @@ public class RsvpCommand implements Command {
spec.addField("Event ID", data.getEventId(), false);
final StringBuilder onTimeBuilder = new StringBuilder();
for (final Member u : onTime) {
onTimeBuilder.append(u.getDisplayName()).append(", ");
}
for (final Member u : onTime) onTimeBuilder.append(u.getDisplayName()).append(", ");
final StringBuilder lateBuilder = new StringBuilder();
for (final Member u : late) {
lateBuilder.append(u.getDisplayName()).append(", ");
}
for (final Member u : late) lateBuilder.append(u.getDisplayName()).append(", ");
final StringBuilder unsureBuilder = new StringBuilder();
for (final Member u : undecided) {
unsureBuilder.append(u.getDisplayName()).append(", ");
}
for (final Member u : undecided) unsureBuilder.append(u.getDisplayName()).append(", ");
final StringBuilder notGoingBuilder = new StringBuilder();
for (final Member u : notGoing) {
notGoingBuilder.append(u.getDisplayName()).append(", ");
}
for (final Member u : notGoing) notGoingBuilder.append(u.getDisplayName()).append(", ");
if (onTimeBuilder.toString().isEmpty())
spec.addField("On time", "N/a", true);
@@ -360,4 +352,4 @@ public class RsvpCommand implements Command {
spec.setColor(GlobalConst.discalColor);
}));
}
}
}

View File

@@ -76,36 +76,35 @@ public class TimeCommand implements Command {
//TODO: Support multiple calendars
private Mono<Void> calendarTime(final MessageCreateEvent event, final GuildSettings settings) {
return DatabaseManager.getMainCalendar(settings.getGuildID())
.flatMap(calData ->
CalendarWrapper.getCalendar(calData, settings).flatMap(cal -> {
final LocalDateTime ldt = LocalDateTime.now(ZoneId.of(cal.getTimeZone()));
final DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd hh:mm:ss a");
final String correctTime = fmt.format(ldt);
.flatMap(calData -> CalendarWrapper.getCalendar(calData).flatMap(cal -> {
final LocalDateTime ldt = LocalDateTime.now(ZoneId.of(cal.getTimeZone()));
final DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd hh:mm:ss a");
final String correctTime = fmt.format(ldt);
return event.getGuild().flatMap(guild ->
Messages.sendMessage(embed -> {
if (settings.isBranded()) {
embed.setAuthor(guild.getName(), GlobalConst.discalSite,
guild.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
} else {
embed.setAuthor("DisCal", GlobalConst.discalSite,
GlobalConst.iconUrl);
}
return event.getGuild().flatMap(guild ->
Messages.sendMessage(embed -> {
if (settings.getBranded()) {
embed.setAuthor(guild.getName(), GlobalConst.discalSite,
guild.getIconUrl(Image.Format.PNG).orElse(GlobalConst.iconUrl));
} else {
embed.setAuthor("DisCal", GlobalConst.discalSite,
GlobalConst.iconUrl);
}
embed.setTitle(Messages.getMessage("Embed.Time.Title", settings));
embed.setTitle(Messages.getMessage("Embed.Time.Title", settings));
embed.addField(Messages.getMessage("Embed.Time.Time", settings), correctTime, false);
embed.addField(Messages.getMessage("Embed.Time.Time", settings), correctTime, false);
embed.addField(Messages.getMessage("Embed.Time.TimeZone", settings), cal.getTimeZone(), false);
embed.addField(Messages.getMessage("Embed.Time.TimeZone", settings), cal.getTimeZone(), false);
embed.setFooter(Messages.getMessage("Embed.Time.Footer", settings), null);
embed.setUrl(CalendarMessageFormatter.getCalendarLink(settings.getGuildID(), calData.getCalendarNumber()));
embed.setFooter(Messages.getMessage("Embed.Time.Footer", settings), null);
embed.setUrl(CalendarMessageFormatter.getCalendarLink(settings.getGuildID(), calData.getCalendarNumber()));
embed.setColor(GlobalConst.discalColor);
}, event));
}))
embed.setColor(GlobalConst.discalColor);
}, event));
}))
.switchIfEmpty(Messages.sendMessage(
Messages.getMessage("Creator.Calendar.NoCalendar", settings), event))
.then();
}
}
}

View File

@@ -11,6 +11,7 @@ import org.dreamexposure.discal.core.logger.LogFeed;
import org.dreamexposure.discal.core.logger.object.LogObject;
import org.dreamexposure.discal.core.network.google.Authorization;
import org.dreamexposure.discal.core.object.GuildSettings;
import org.dreamexposure.discal.core.object.calendar.CalendarData;
import org.dreamexposure.discal.core.object.network.google.Poll;
import org.dreamexposure.discal.core.utils.GlobalConst;
import org.dreamexposure.discal.core.wrapper.google.CalendarWrapper;
@@ -181,34 +182,35 @@ public class GoogleExternalAuth {
final JSONObject aprGrant = new JSONObject(responseBody);
//Save credentials securely.
final GuildSettings gs = poll.getSettings();
CalendarData calData = CalendarData.emptyExternal(poll.getSettings().getGuildID());
final AESEncryption encryption = new AESEncryption(gs);
gs.setEncryptedAccessToken(encryption.encrypt(aprGrant.getString("access_token")));
gs.setEncryptedRefreshToken(encryption.encrypt(aprGrant.getString("refresh_token")));
gs.setUseExternalCalendar(true);
final AESEncryption encryption = new AESEncryption(calData);
calData.setEncryptedAccessToken(encryption.encrypt(aprGrant.getString("access_token")));
calData.setEncryptedRefreshToken(encryption.encrypt(aprGrant.getString("refresh_token")));
//Update settings and then we will list the calendars for the user
return DatabaseManager.updateSettings(gs)
.then(CalendarWrapper.getUsersExternalCalendars(gs))
return DatabaseManager.updateCalendar(calData)
.then(CalendarWrapper.getUsersExternalCalendars(calData))
.flatMapMany(Flux::fromIterable)
.map(i -> (Consumer<EmbedCreateSpec>) spec -> {
spec.setAuthor("DisCal", GlobalConst.discalSite, GlobalConst.iconUrl);
spec.setTitle(Messages.getMessage("Embed.AddCalendar.List.Title", gs));
spec.setTitle(Messages.getMessage("Embed.AddCalendar.List.Title", poll.getSettings()));
spec.addField(
Messages.getMessage("Embed.AddCalendar.List.Name", gs),
Messages.getMessage("Embed.AddCalendar.List.Name", poll.getSettings()),
i.getSummary(),
false);
spec.addField(
Messages.getMessage("Embed.AddCalendar.List.TimeZone", gs),
Messages.getMessage("Embed.AddCalendar.List.TimeZone", poll.getSettings()),
i.getTimeZone(),
false);
spec.addField(
Messages.getMessage("Embed.AddCalendar.List.ID", gs),
Messages.getMessage("Embed.AddCalendar.List.ID", poll.getSettings()),
i.getId(),
false);
@@ -216,7 +218,8 @@ public class GoogleExternalAuth {
})
.flatMap(em -> Messages.sendDirectMessage(em, poll.getUser()))
.switchIfEmpty(Messages.sendDirectMessage(
Messages.getMessage("AddCalendar.Auth.Poll.Failure.ListCalendars", gs), poll.getUser()))
Messages.getMessage("AddCalendar.Auth.Poll.Failure.ListCalendars", poll.getSettings()),
poll.getUser()))
.then(Mono.error(new GoogleAuthCancelException()));
} else {
//Unknown network error...

View File

@@ -18,7 +18,6 @@ import com.google.api.services.calendar.CalendarScopes;
import org.dreamexposure.discal.core.crypto.AESEncryption;
import org.dreamexposure.discal.core.network.google.Authorization;
import org.dreamexposure.discal.core.object.BotSettings;
import org.dreamexposure.discal.core.object.GuildSettings;
import org.dreamexposure.discal.core.object.calendar.CalendarData;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -87,7 +86,7 @@ public class CalendarAuth {
private static Mono<Credential> authorize(int credentialId) {
return Mono.fromCallable(() -> {
// Load client secrets.
InputStream in = new FileInputStream(new File("client_secret.json"));
InputStream in = new FileInputStream("client_secret.json");
GoogleClientSecrets clientSecrets = GoogleClientSecrets
.load(JacksonFactory.getDefaultInstance(), new InputStreamReader(in));
@@ -111,13 +110,13 @@ public class CalendarAuth {
}
//TODO: This won't need guild settings eventually once we move the data to calendar data like it should be at
private static Mono<Credential> authorize(GuildSettings g) {
private static Mono<Credential> authorize(CalendarData calData) {
return Mono.fromCallable(() -> {
if ("N/a".equalsIgnoreCase(g.getEncryptedAccessToken()))
if ("N/a".equalsIgnoreCase(calData.getEncryptedAccessToken()))
return null;
AESEncryption encryption = new AESEncryption(g);
String accessToken = Authorization.getAuth().requestNewAccessToken(g, encryption);
AESEncryption encryption = new AESEncryption(calData);
String accessToken = Authorization.getAuth().requestNewAccessToken(calData, encryption);
Credential credential = new GoogleCredential();
credential.setAccessToken(accessToken);
@@ -126,11 +125,10 @@ public class CalendarAuth {
}
//TODO: Remove need for guild settings once we move the relevant data to more appropriate classes
public static Mono<Calendar> getCalendarService(@NotNull GuildSettings g,
@NotNull CalendarData calData) {
public static Mono<Calendar> getCalendarService(@NotNull CalendarData calData) {
return Mono.fromCallable(() -> {
if (g.useExternalCalendar()) {
return authorize(g).map(cred ->
if (calData.getExternal()) {
return authorize(calData).map(cred ->
new Calendar.
Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), cred)
.setApplicationName(APPLICATION_NAME)
@@ -150,8 +148,8 @@ public class CalendarAuth {
.build());
}
public static Mono<Calendar> getExternalCalendarService(GuildSettings settings) {
return authorize(settings).map(cred ->
public static Mono<Calendar> getExternalCalendarService(CalendarData calendarData) {
return authorize(calendarData).map(cred ->
new Calendar.
Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), cred)
.setApplicationName(APPLICATION_NAME)
@@ -209,4 +207,4 @@ public class CalendarAuth {
return this.jsonFactory;
}
}
}
}

View File

@@ -1,6 +1,5 @@
package org.dreamexposure.discal.core.database;
import org.dreamexposure.discal.core.crypto.KeyGenerator;
import org.dreamexposure.discal.core.enums.announcement.AnnouncementModifier;
import org.dreamexposure.discal.core.enums.announcement.AnnouncementType;
import org.dreamexposure.discal.core.enums.event.EventColor;
@@ -160,9 +159,6 @@ public class DatabaseManager {
guildSettingsCache.remove(set.getGuildID());
guildSettingsCache.put(set.getGuildID(), set);
if ("N/a".equalsIgnoreCase(set.getPrivateKey()))
set.setPrivateKey(KeyGenerator.csRandomAlphaNumericString(16));
final String table = String.format("%sguild_settings", settings.getPrefix());
return connect(slave, c -> {
@@ -176,59 +172,48 @@ public class DatabaseManager {
.flatMap(exists -> {
if (exists) {
final String update = "UPDATE " + table
+ " SET EXTERNAL_CALENDAR = ?, PRIVATE_KEY = ?,"
+ " ACCESS_TOKEN = ?, REFRESH_TOKEN = ?,"
+ " CONTROL_ROLE = ?, DISCAL_CHANNEL = ?, SIMPLE_ANNOUNCEMENT = ?,"
+ " SET CONTROL_ROLE = ?, DISCAL_CHANNEL = ?, SIMPLE_ANNOUNCEMENT = ?,"
+ " LANG = ?, PREFIX = ?, PATRON_GUILD = ?, DEV_GUILD = ?,"
+ " MAX_CALENDARS = ?, DM_ANNOUNCEMENTS = ?, 12_HOUR = ?,"
+ " BRANDED = ? WHERE GUILD_ID = ?";
return connect(master, c -> Mono.from(c.createStatement(update)
.bind(0, set.useExternalCalendar())
.bind(1, set.getPrivateKey())
.bind(2, set.getEncryptedAccessToken())
.bind(3, set.getEncryptedRefreshToken())
.bind(4, set.getControlRole())
.bind(5, set.getDiscalChannel())
.bind(6, set.usingSimpleAnnouncements())
.bind(7, set.getLang())
.bind(8, set.getPrefix())
.bind(9, set.isPatronGuild())
.bind(10, set.isDevGuild())
.bind(11, set.getMaxCalendars())
.bind(12, set.getDmAnnouncementsString())
.bind(13, set.useTwelveHour())
.bind(14, set.isBranded())
.bind(15, set.getGuildID().asString())
.bind(0, set.getControlRole())
.bind(1, set.getDiscalChannel())
.bind(2, set.getSimpleAnnouncements())
.bind(3, set.getLang())
.bind(4, set.getPrefix())
.bind(5, set.getPatronGuild())
.bind(6, set.getDevGuild())
.bind(7, set.getMaxCalendars())
.bind(8, set.getDmAnnouncementsString())
.bind(9, set.getTwelveHour())
.bind(10, set.getBranded())
.bind(11, set.getGuildID().asString())
.execute())
).flatMap(res -> Mono.from(res.getRowsUpdated()))
.hasElement()
.thenReturn(true);
} else {
final String insertCommand = "INSERT INTO " + table + "(GUILD_ID, " +
"EXTERNAL_CALENDAR, PRIVATE_KEY, ACCESS_TOKEN, REFRESH_TOKEN, " +
"CONTROL_ROLE, DISCAL_CHANNEL, SIMPLE_ANNOUNCEMENT, LANG, " +
"PREFIX, PATRON_GUILD, DEV_GUILD, MAX_CALENDARS, " +
"DM_ANNOUNCEMENTS, 12_HOUR, BRANDED) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
return connect(master, c -> Mono.from(c.createStatement(insertCommand)
.bind(0, set.getGuildID().asString())
.bind(1, set.useExternalCalendar())
.bind(2, set.getPrivateKey())
.bind(3, set.getEncryptedAccessToken())
.bind(4, set.getEncryptedRefreshToken())
.bind(5, set.getControlRole())
.bind(6, set.getDiscalChannel())
.bind(7, set.usingSimpleAnnouncements())
.bind(8, set.getLang())
.bind(9, set.getPrefix())
.bind(10, set.isPatronGuild())
.bind(11, set.isDevGuild())
.bind(12, set.getMaxCalendars())
.bind(13, set.getDmAnnouncementsString())
.bind(14, set.useTwelveHour())
.bind(15, set.isBranded())
.bind(1, set.getControlRole())
.bind(2, set.getDiscalChannel())
.bind(3, set.getSimpleAnnouncements())
.bind(4, set.getLang())
.bind(5, set.getPrefix())
.bind(6, set.getPatronGuild())
.bind(7, set.getDevGuild())
.bind(8, set.getMaxCalendars())
.bind(9, set.getDmAnnouncementsString())
.bind(10, set.getTwelveHour())
.bind(11, set.getBranded())
.execute())
).flatMap(res -> Mono.from(res.getRowsUpdated()))
.hasElement()
@@ -255,7 +240,8 @@ public class DatabaseManager {
if (exists) {
final String update = "UPDATE " + table
+ " SET CALENDAR_NUMBER = ?, CALENDAR_ID = ?,"
+ " CALENDAR_ADDRESS = ?, EXTERNAL = ?, CREDENTIAL_ID = ?"
+ " CALENDAR_ADDRESS = ?, EXTERNAL = ?, CREDENTIAL_ID = ?,"
+ " PRIVATE_KEY = ?, ACCESS_TOKEN = ?, REFRESH TOKEN = ?"
+ " WHERE GUILD_ID = ?";
return connect(master, c -> Mono.from(c.createStatement(update)
@@ -264,7 +250,10 @@ public class DatabaseManager {
.bind(2, calData.getCalendarAddress())
.bind(3, calData.getExternal())
.bind(4, calData.getCredentialId())
.bind(5, calData.getGuildId().asString())
.bind(5, calData.getPrivateKey())
.bind(6, calData.getEncryptedAccessToken())
.bind(7, calData.getEncryptedRefreshToken())
.bind(8, calData.getGuildId().asString())
.execute())
).flatMap(res -> Mono.from(res.getRowsUpdated()))
.hasElement()
@@ -477,14 +466,12 @@ public class DatabaseManager {
return Mono.from(c.createStatement(query)
.bind(0, APIKey)
.execute());
}).flatMapMany(res -> res.map((row, rowMetadata) -> {
return new UserAPIAccount(
row.get("USER_ID", String.class),
APIKey,
row.get("BLOCKED", Boolean.class),
row.get("TIME_ISSUED", Long.class)
);
}))
}).flatMapMany(res -> res.map((row, rowMetadata) -> new UserAPIAccount(
row.get("USER_ID", String.class),
APIKey,
row.get("BLOCKED", Boolean.class),
row.get("TIME_ISSUED", Long.class)
)))
.next()
.retryWhen(Retry.max(3)
.filter(IllegalStateException.class::isInstance)
@@ -508,39 +495,40 @@ public class DatabaseManager {
.bind(0, guildId.asString())
.execute());
}).flatMapMany(res -> res.map((row, rowMetadata) -> {
final GuildSettings set = new GuildSettings(guildId);
String controlRole = row.get("CONTROL_ROLE", String.class);
String discalChannel = row.get("DISCAL_CHANNEL", String.class);
boolean simpleAnnouncements = row.get("SIMPLE_ANNOUNCEMENT", Boolean.class);
String lang = row.get("LANG", String.class);
String prefix = row.get("PREFIX", String.class);
boolean patron = row.get("PATRON_GUILD", Boolean.class);
boolean dev = row.get("DEV_GUILD", Boolean.class);
int maxCals = row.get("MAX_CALENDARS", Integer.class);
String dmAnnouncementsString = row.get("DM_ANNOUNCEMENTS", String.class);
boolean twelveHour = row.get("12_HOUR", Boolean.class);
boolean branded = row.get("BRANDED", Boolean.class);
set.setUseExternalCalendar(row.get("EXTERNAL_CALENDAR", Boolean.class));
set.setPrivateKey(row.get("PRIVATE_KEY", String.class));
set.setEncryptedAccessToken(row.get("ACCESS_TOKEN", String.class));
set.setEncryptedRefreshToken(row.get("REFRESH_TOKEN", String.class));
set.setControlRole(row.get("CONTROL_ROLE", String.class));
set.setDiscalChannel(row.get("DISCAL_CHANNEL", String.class));
set.setSimpleAnnouncements(row.get("SIMPLE_ANNOUNCEMENT", Boolean.class));
set.setLang(row.get("LANG", String.class));
set.setPrefix(row.get("PREFIX", String.class));
set.setPatronGuild(row.get("PATRON_GUILD", Boolean.class));
set.setDevGuild(row.get("DEV_GUILD", Boolean.class));
set.setMaxCalendars(row.get("MAX_CALENDARS", Integer.class));
set.setDmAnnouncementsFromString(row.get("DM_ANNOUNCEMENTS", String.class));
set.setTwelveHour(row.get("12_HOUR", Boolean.class));
set.setBranded(row.get("BRANDED", Boolean.class));
GuildSettings settings = new GuildSettings(
guildId, controlRole, discalChannel, simpleAnnouncements,
lang, prefix, patron, dev, maxCals, twelveHour, branded
);
settings.setDmAnnouncementsString(dmAnnouncementsString);
//Store in cache...
guildSettingsCache.remove(guildId);
guildSettingsCache.put(guildId, set);
guildSettingsCache.put(guildId, settings);
return set;
return settings;
}))
.next()
.retryWhen(Retry.max(3)
.filter(IllegalStateException.class::isInstance)
.filter(e -> e.getMessage() != null && e.getMessage().contains("Request queue was disposed"))
)
.defaultIfEmpty(new GuildSettings(guildId))
.defaultIfEmpty(GuildSettings.empty(guildId))
.onErrorResume(e -> {
LogFeed.log(LogObject.forException("Failed to get guild settings", e, DatabaseManager.class));
return Mono.just(new GuildSettings(guildId));
return Mono.just(GuildSettings.empty(guildId));
});
}
@@ -559,8 +547,12 @@ public class DatabaseManager {
final String calAddr = row.get("CALENDAR_ADDRESS", String.class);
final boolean external = row.get("EXTERNAL", Boolean.class);
final int credId = row.get("CREDENTIAL_ID", Integer.class);
final String privateKey = row.get("PRIVATE_KEY", String.class);
final String accessToken = row.get("ACCESS_TOKEN", String.class);
final String refreshToken = row.get("REFRESH_TOKEN", String.class);
return new CalendarData(guildId, 1, calId, calAddr, external, credId);
return new CalendarData(guildId, 1, calId, calAddr, external, credId,
privateKey, accessToken, refreshToken);
}))
.next()
.retryWhen(Retry.max(3)
@@ -588,8 +580,12 @@ public class DatabaseManager {
final String calAddr = row.get("CALENDAR_ADDRESS", String.class);
final boolean external = row.get("EXTERNAL", Boolean.class);
final int credId = row.get("CREDENTIAL_ID", Integer.class);
final String privateKey = row.get("PRIVATE_KEY", String.class);
final String accessToken = row.get("ACCESS_TOKEN", String.class);
final String refreshToken = row.get("REFRESH_TOKEN", String.class);
return new CalendarData(guildId, calendarNumber, calId, calAddr, external, credId);
return new CalendarData(guildId, calendarNumber, calId, calAddr, external, credId,
privateKey, accessToken, refreshToken);
}))
.next()
.retryWhen(Retry.max(3)
@@ -612,11 +608,16 @@ public class DatabaseManager {
.execute());
}).flatMapMany(res -> res.map((row, rowMetadata) -> {
final String calId = row.get("CALENDAR_ID", String.class);
final int calNumber = row.get("CALENDAR_NUMBER", Integer.class);
final String calAddr = row.get("CALENDAR_ADDRESS", String.class);
final boolean external = row.get("EXTERNAL", Boolean.class);
final int credId = row.get("CREDENTIAL_ID", Integer.class);
final String privateKey = row.get("PRIVATE_KEY", String.class);
final String accessToken = row.get("ACCESS_TOKEN", String.class);
final String refreshToken = row.get("REFRESH_TOKEN", String.class);
return new CalendarData(guildId, 1, calId, calAddr, external, credId);
return new CalendarData(guildId, calNumber, calId, calAddr, external, credId,
privateKey, accessToken, refreshToken);
}))
.collectList()
.retryWhen(Retry.max(3)
@@ -784,7 +785,8 @@ public class DatabaseManager {
.filter(e -> e.getMessage() != null && e.getMessage().contains("Request queue was disposed"))
)
.onErrorResume(e -> {
LogFeed.log(LogObject.forException("Failed to get all announcements for guild", e, DatabaseManager.class));
LogFeed.log(LogObject.forException("Failed to get all announcements for guild", e,
DatabaseManager.class));
return Mono.just(new ArrayList<>());
});
@@ -989,7 +991,8 @@ public class DatabaseManager {
.filter(e -> e.getMessage() != null && e.getMessage().contains("Request queue was disposed"))
)
.onErrorResume(e -> {
LogFeed.log(LogObject.forException("Failed to get enabled announcements for guild", e, DatabaseManager.class));
LogFeed.log(LogObject.forException("Failed to get enabled announcements for guild", e,
DatabaseManager.class));
return Mono.just(new ArrayList<>());
});
@@ -1046,7 +1049,8 @@ public class DatabaseManager {
}).flatMapMany(Result::getRowsUpdated)
.then(Mono.just(true))
.onErrorResume(e -> {
LogFeed.log(LogObject.forException("Failed to delete announcements for event", e, DatabaseManager.class));
LogFeed.log(LogObject.forException("Failed to delete announcements for event", e,
DatabaseManager.class));
return Mono.just(false);
});
}
@@ -1082,7 +1086,8 @@ public class DatabaseManager {
}).flatMapMany(Result::getRowsUpdated)
.then(Mono.just(true))
.onErrorResume(e -> {
LogFeed.log(LogObject.forException("Failed to delete all event data for guild", e, DatabaseManager.class));
LogFeed.log(LogObject.forException("Failed to delete all event data for guild", e,
DatabaseManager.class));
return Mono.just(false);
});
}
@@ -1098,7 +1103,8 @@ public class DatabaseManager {
}).flatMapMany(Result::getRowsUpdated)
.then(Mono.just(true))
.onErrorResume(e -> {
LogFeed.log(LogObject.forException("Failed to delete all announcements for guild", e, DatabaseManager.class));
LogFeed.log(LogObject.forException("Failed to delete all announcements for guild", e,
DatabaseManager.class));
return Mono.just(false);
});
}

View File

@@ -5,7 +5,7 @@ import org.dreamexposure.discal.core.database.DatabaseManager;
import org.dreamexposure.discal.core.logger.LogFeed;
import org.dreamexposure.discal.core.logger.object.LogObject;
import org.dreamexposure.discal.core.object.BotSettings;
import org.dreamexposure.discal.core.object.GuildSettings;
import org.dreamexposure.discal.core.object.calendar.CalendarData;
import org.dreamexposure.discal.core.object.network.google.ClientData;
import org.dreamexposure.discal.core.utils.CalendarUtils;
import org.dreamexposure.discal.core.utils.GlobalConst;
@@ -54,12 +54,12 @@ public class Authorization {
//TODO: Rewrite this to be reactive
public String requestNewAccessToken(GuildSettings settings, AESEncryption encryption) {
public String requestNewAccessToken(CalendarData calData, AESEncryption encryption) {
try {
RequestBody body = new FormBody.Builder()
.addEncoded("client_id", this.clientData.getClientId())
.addEncoded("client_secret", this.clientData.getClientSecret())
.addEncoded("refresh_token", encryption.decrypt(settings.getEncryptedRefreshToken()))
.addEncoded("refresh_token", encryption.decrypt(calData.getEncryptedRefreshToken()))
.addEncoded("grant_type", "refresh_token")
.build();
@@ -75,8 +75,8 @@ public class Authorization {
JSONObject autoRefreshResponse = new JSONObject(httpResponse.body().string());
//Update Db data.
settings.setEncryptedAccessToken(encryption.encrypt(autoRefreshResponse.getString("access_token")));
DatabaseManager.updateSettings(settings).subscribe();
calData.setEncryptedAccessToken(encryption.encrypt(autoRefreshResponse.getString("access_token")));
DatabaseManager.updateCalendar(calData).subscribe();
//Okay, we can return the access token to be used when this method is called.
return autoRefreshResponse.getString("access_token");
@@ -86,9 +86,7 @@ public class Authorization {
if ("invalid_grant".equalsIgnoreCase(errorBody.getString("error"))) {
// User revoked access to the calendar, delete our reference to it since they need to re-auth anyway
DatabaseManager.getCalendar(settings.getGuildID(), 1)
.flatMap(cd -> CalendarUtils.deleteCalendar(cd, settings))
.subscribe();
CalendarUtils.deleteCalendar(calData).subscribe();
} else {
LogFeed.log(LogObject.forDebug("Error requesting new access token.",
"Status code: " + httpResponse.code() + " | " + httpResponse.message() +
@@ -111,4 +109,4 @@ public class Authorization {
return null;
}
}
}
}

View File

@@ -1,288 +0,0 @@
package org.dreamexposure.discal.core.object;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Collections;
import discord4j.common.util.Snowflake;
/**
* Created by Nova Fox on 11/10/17.
* Website: www.cloudcraftgaming.com
* For Project: DisCal-Discord-Bot
*/
@SuppressWarnings("DuplicatedCode")
public class GuildSettings {
private Snowflake guildID;
//TODO: Move this boolean to calendar data
private boolean externalCalendar;
private String privateKey;
//TODO: Move these to calendar data class because if we allow mutlical this breaks down
private String encryptedAccessToken;
private String encryptedRefreshToken;
private String controlRole;
private String discalChannel;
private boolean simpleAnnouncements;
private String lang;
private String prefix;
private boolean patronGuild;
private boolean devGuild;
private int maxCalendars;
private boolean twelveHour;
private boolean branded;
private final ArrayList<String> dmAnnouncements = new ArrayList<>();
public GuildSettings(final Snowflake _guildId) {
this.guildID = _guildId;
this.externalCalendar = false;
this.privateKey = "N/a";
this.encryptedAccessToken = "N/a";
this.encryptedRefreshToken = "N/a";
this.controlRole = "everyone";
this.discalChannel = "all";
this.simpleAnnouncements = false;
this.lang = "ENGLISH";
this.prefix = "!";
this.patronGuild = false;
this.devGuild = false;
this.maxCalendars = 1;
this.twelveHour = true;
}
//Getters
public Snowflake getGuildID() {
return this.guildID;
}
public boolean useExternalCalendar() {
return this.externalCalendar;
}
public String getPrivateKey() {
return this.privateKey;
}
public String getEncryptedAccessToken() {
return this.encryptedAccessToken;
}
public String getEncryptedRefreshToken() {
return this.encryptedRefreshToken;
}
public String getControlRole() {
return this.controlRole;
}
public String getDiscalChannel() {
return this.discalChannel;
}
public boolean usingSimpleAnnouncements() {
return this.simpleAnnouncements;
}
public String getLang() {
return this.lang;
}
public String getPrefix() {
return this.prefix;
}
public boolean isPatronGuild() {
return this.patronGuild;
}
public boolean isDevGuild() {
return this.devGuild;
}
public int getMaxCalendars() {
return this.maxCalendars;
}
public boolean useTwelveHour() {
return this.twelveHour;
}
public boolean isBranded() {
return this.branded;
}
public ArrayList<String> getDmAnnouncements() {
return this.dmAnnouncements;
}
@SuppressWarnings("Duplicates")
public String getDmAnnouncementsString() {
StringBuilder users = new StringBuilder();
int i = 0;
for (final String sub : this.dmAnnouncements) {
if (i == 0) {
users = new StringBuilder(sub);
} else {
users.append(",").append(sub);
}
i++;
}
return users.toString();
}
//Setters
public void setUseExternalCalendar(final boolean _useExternal) {
this.externalCalendar = _useExternal;
}
public void setPrivateKey(final String _privateKey) {
this.privateKey = _privateKey;
}
public void setEncryptedAccessToken(final String _access) {
this.encryptedAccessToken = _access;
}
public void setEncryptedRefreshToken(final String _refresh) {
this.encryptedRefreshToken = _refresh;
}
public void setControlRole(final String _controlRole) {
this.controlRole = _controlRole;
}
public void setDiscalChannel(final String _discalChannel) {
this.discalChannel = _discalChannel;
}
public void setSimpleAnnouncements(final boolean _simpleAnnouncements) {
this.simpleAnnouncements = _simpleAnnouncements;
}
public void setLang(final String _lang) {
this.lang = _lang;
}
public void setPrefix(final String _prefix) {
this.prefix = _prefix;
}
public void setPatronGuild(final boolean _patronGuild) {
this.patronGuild = _patronGuild;
}
public void setDevGuild(final boolean _devGuild) {
this.devGuild = _devGuild;
}
public void setMaxCalendars(final Integer _maxCalendars) {
this.maxCalendars = _maxCalendars;
}
public void setTwelveHour(final boolean _twelveHour) {
this.twelveHour = _twelveHour;
}
public void setBranded(final boolean _branded) {
this.branded = _branded;
}
public void setDmAnnouncementsFromString(final String userList) {
final String[] subs = userList.split(",");
Collections.addAll(this.dmAnnouncements, subs);
}
public JSONObject toJson() {
final JSONObject data = new JSONObject();
data.put("guild_id", this.guildID.asString());
data.put("external_calendar", this.externalCalendar);
data.put("private_key", this.privateKey);
data.put("access_token", this.encryptedAccessToken);
data.put("refresh_token", this.encryptedRefreshToken);
data.put("control_role", this.controlRole);
data.put("discal_channel", this.discalChannel);
data.put("simple_announcements", this.simpleAnnouncements);
data.put("lang", this.lang);
data.put("prefix", this.prefix);
data.put("patron_guild", this.patronGuild);
data.put("dev_guild", this.devGuild);
data.put("max_calendars", this.maxCalendars);
data.put("twelve_hour", this.twelveHour);
data.put("branded", this.branded);
return data;
}
public JSONObject toJsonSecure() {
final JSONObject data = new JSONObject();
data.put("guild_id", this.guildID.asString());
data.put("external_calendar", this.externalCalendar);
data.put("control_role", this.controlRole);
data.put("discal_channel", this.discalChannel);
data.put("simple_announcement", this.simpleAnnouncements);
data.put("lang", this.lang);
data.put("prefix", this.prefix);
data.put("patron_guild", this.patronGuild);
data.put("dev_guild", this.devGuild);
data.put("max_calendars", this.maxCalendars);
data.put("twelve_hour", this.twelveHour);
data.put("branded", this.branded);
return data;
}
public GuildSettings fromJson(final JSONObject data) {
this.guildID = Snowflake.of(data.getString("guild_id"));
this.externalCalendar = data.getBoolean("external_calendar");
this.privateKey = data.getString("private_key");
this.encryptedAccessToken = data.getString("access_token");
this.encryptedRefreshToken = data.getString("refresh_token");
this.controlRole = data.getString("control_role");
this.discalChannel = data.getString("discal_channel");
this.simpleAnnouncements = data.getBoolean("simple_announcement");
this.lang = data.getString("lang");
this.prefix = data.getString("prefix");
this.patronGuild = data.getBoolean("patron_guild");
this.devGuild = data.getBoolean("dev_guild");
this.maxCalendars = data.getInt("max_calendars");
this.twelveHour = data.getBoolean("twelve_hour");
this.branded = data.getBoolean("branded");
return this;
}
public GuildSettings fromJsonSecure(final JSONObject data) {
this.guildID = Snowflake.of(data.getString("guild_id"));
this.externalCalendar = data.getBoolean("external_calendar");
//privateKey = data.getString("PrivateKey");
//encryptedAccessToken = data.getString("AccessToken");
//encryptedRefreshToken = data.getString("RefreshToken");
this.controlRole = data.getString("control_role");
this.discalChannel = data.getString("discal_channel");
this.simpleAnnouncements = data.getBoolean("simple_announcement");
this.lang = data.getString("lang");
this.prefix = data.getString("prefix");
this.patronGuild = data.getBoolean("patron_guild");
this.devGuild = data.getBoolean("dev_guild");
this.maxCalendars = data.getInt("max_calendars");
this.twelveHour = data.getBoolean("twelve_hours");
this.branded = data.getBoolean("branded");
return this;
}
}

View File

@@ -1,315 +0,0 @@
package org.dreamexposure.discal.core.object.web;
import org.dreamexposure.discal.core.database.DatabaseManager;
import org.dreamexposure.discal.core.exceptions.BotNotInGuildException;
import org.dreamexposure.discal.core.object.BotSettings;
import org.dreamexposure.discal.core.object.GuildSettings;
import org.dreamexposure.discal.core.object.announcement.Announcement;
import org.dreamexposure.discal.core.utils.GuildUtils;
import org.dreamexposure.discal.core.utils.JsonUtil;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import discord4j.common.util.Snowflake;
import discord4j.core.object.entity.Guild;
import discord4j.core.object.entity.Member;
import discord4j.core.object.entity.channel.GuildMessageChannel;
import discord4j.discordjson.json.GuildUpdateData;
import discord4j.discordjson.json.MemberData;
import discord4j.discordjson.possible.Possible;
import discord4j.rest.entity.RestGuild;
import discord4j.rest.util.Image;
import reactor.core.publisher.Mono;
import reactor.function.TupleUtils;
/**
* Created by Nova Fox on 12/19/17.
* Website: www.cloudcraftgaming.com
* For Project: DisCal-Discord-Bot
*/
public class WebGuild {
public static WebGuild fromGuild(final RestGuild g) throws BotNotInGuildException {
final GuildUpdateData data;
try {
data = g.getData().block();
} catch (final Exception e) {
throw new BotNotInGuildException();
}
final Snowflake id = Snowflake.of(data.id());
final String name = data.name();
final String iconUrl = data.icon().orElse("");
final Mono<String> botNick = g.member(Snowflake.of(BotSettings.ID.get()))
.getData()
.map(MemberData::nick)
.map(Possible::flatOpt)
.flatMap(Mono::justOrEmpty)
.defaultIfEmpty("DisCal");
final Mono<GuildSettings> settings = DatabaseManager.getSettings(id).cache();
final Mono<List<WebRole>> roles = settings.flatMapMany(s ->
g.getRoles().map(role -> WebRole.Companion.fromRole(role, s)))
.collectList();
final Mono<List<WebChannel>> webChannels = settings.flatMapMany(s ->
g.getChannels()
.ofType(GuildMessageChannel.class)
.map(channel -> WebChannel.Companion.fromChannel(channel, s)))
.collectList();
final Mono<List<Announcement>> announcements = DatabaseManager.getAnnouncements(id);
final Mono<WebCalendar> calendar = settings.flatMap(s ->
DatabaseManager.getMainCalendar(id)
.flatMap(d -> WebCalendar.Companion.fromCalendar(d, s))
)
.defaultIfEmpty(WebCalendar.Companion.empty());
return Mono.zip(botNick, settings, roles, webChannels, announcements, calendar)
.map(TupleUtils.function((bn, s, r, wc, a, c) -> {
final WebGuild wg = new WebGuild(id.asLong(), name, iconUrl, s, bn, false, false, c);
wg.getChannels().add(WebChannel.Companion.all(s));
wg.getRoles().addAll(r);
wg.getChannels().addAll(wc);
wg.getAnnouncements().addAll(a);
return wg;
})).block();
}
public static WebGuild fromGuild(final Guild g) {
final long id = g.getId().asLong();
final String name = g.getName();
final String iconUrl = g.getIconUrl(Image.Format.PNG).orElse(null);
final Mono<String> botNick = g.getMemberById(Snowflake.of(BotSettings.ID.get()))
.map(Member::getNickname)
.flatMap(Mono::justOrEmpty)
.defaultIfEmpty("DisCal");
final Mono<GuildSettings> settings = DatabaseManager.getSettings(g.getId()).cache();
final Mono<List<WebRole>> roles = settings.flatMapMany(s ->
g.getRoles().map(role -> WebRole.Companion.fromRole(role, s)))
.collectList();
final Mono<List<WebChannel>> webChannels = settings.flatMapMany(s ->
g.getChannels()
.ofType(GuildMessageChannel.class)
.map(channel -> WebChannel.Companion.fromChannel(channel, s)))
.collectList();
final Mono<List<Announcement>> announcements = DatabaseManager.getAnnouncements(g.getId());
final Mono<WebCalendar> calendar = settings.flatMap(s ->
DatabaseManager.getMainCalendar(Snowflake.of(id))
.flatMap(d -> WebCalendar.Companion.fromCalendar(d, s))
);
return Mono.zip(botNick, settings, roles, webChannels, announcements, calendar)
.map(TupleUtils.function((bn, s, r, wc, a, c) -> {
final WebGuild wg = new WebGuild(id, name, iconUrl, s, bn, false, false, c);
wg.getChannels().add(WebChannel.Companion.all(s));
wg.getRoles().addAll(r);
wg.getChannels().addAll(wc);
wg.getAnnouncements().addAll(a);
return wg;
})).block();
}
public static WebGuild fromJson(final JSONObject data) {
final long id = Long.parseLong(data.getString("id"));
final GuildSettings settings = new GuildSettings(
Snowflake.of(id)).fromJson(data.getJSONObject("settings"));
final WebGuild webGuild = new WebGuild(
id,
data.getString("name"),
data.optString("icon_url"),
settings,
data.optString("bot_nick"),
data.getBoolean("manage_server"),
data.getBoolean("discal_role"),
JsonUtil.INSTANCE.decodeFromJSON(WebCalendar.class, data.getJSONObject("calendar")));
final JSONArray jRoles = data.getJSONArray("roles");
for (int i = 0; i < jRoles.length(); i++) {
webGuild.getRoles().add(JsonUtil.INSTANCE.decodeFromJSON(WebRole.class, jRoles.getJSONObject(i)));
}
final JSONArray jChannels = data.getJSONArray("channels");
for (int i = 0; i < jChannels.length(); i++) {
webGuild.getChannels().add(JsonUtil.INSTANCE.decodeFromJSON(WebChannel.class, jChannels.getJSONObject(i)));
}
final JSONArray jAnnouncements = data.getJSONArray("announcements");
for (int i = 0; i < jAnnouncements.length(); i++) {
webGuild.getAnnouncements()
.add(JsonUtil.INSTANCE.decodeFromJSON(Announcement.class, jAnnouncements.getJSONObject(i)));
}
return webGuild;
}
private final long id;
private final String name;
private final String iconUrl;
//Bot settings
private final GuildSettings settings;
private final String botNick;
//User info
private boolean manageServer;
private boolean discalRole;
//Lists and stuffs
private final List<WebRole> roles = new ArrayList<>();
private final List<WebChannel> channels = new ArrayList<>();
private final List<Announcement> announcements = new ArrayList<>();
private final List<String> availableLangs = new ArrayList<>();
private final WebCalendar calendar;
private WebGuild(final long id, final String name, final String iconUrl, final GuildSettings settings, final String botNick,
final boolean manageServer, final boolean discalRole, final WebCalendar calendar) {
this.id = id;
this.name = name;
this.iconUrl = iconUrl;
this.settings = settings;
this.botNick = botNick;
this.manageServer = manageServer;
this.discalRole = discalRole;
this.calendar = calendar;
}
//Getters
public long getId() {
return this.id;
}
public String getName() {
return this.name;
}
public String getIcon() {
return this.iconUrl;
}
public GuildSettings getSettings() {
return this.settings;
}
public String getBotNick() {
return this.botNick;
}
public List<WebRole> getRoles() {
return this.roles;
}
public WebRole getRole(final long id) {
for (final WebRole wr : this.roles) {
if (wr.getId() == id)
return wr;
}
return null;
}
public List<WebChannel> getChannels() {
return this.channels;
}
public WebChannel getChannel(final long id) {
for (final WebChannel wc : this.channels) {
if (wc.getId() == id)
return wc;
}
return null;
}
public List<Announcement> getAnnouncements() {
return this.announcements;
}
public List<String> getAvailableLangs() {
return this.availableLangs;
}
public WebCalendar getCalendar() {
return this.calendar;
}
public boolean isManageServer() {
return this.manageServer;
}
public boolean isDiscalRole() {
return this.discalRole;
}
//Setties
public void setManageServer(final boolean ms) {
this.manageServer = ms;
}
public void setDiscalRole(final boolean dr) {
this.discalRole = dr;
}
public JSONObject toJson(final boolean secure) {
final JSONObject data = new JSONObject();
data.put("id", String.valueOf(this.id));
data.put("name", this.name);
if (this.iconUrl != null)
data.put("icon_url", this.iconUrl);
if (secure)
data.put("settings", this.settings.toJsonSecure());
else
data.put("settings", this.settings.toJson());
if (this.botNick != null && !this.botNick.isEmpty())
data.put("bot_nick", this.botNick);
data.put("manage_server", this.manageServer);
data.put("discal_role", this.discalRole);
final JSONArray jRoles = new JSONArray();
for (final WebRole wr : this.roles) {
jRoles.put(JsonUtil.INSTANCE.encodeToJSON(WebRole.class, wr));
}
data.put("roles", jRoles);
final JSONArray jChannels = new JSONArray();
for (final WebChannel wc : this.channels) {
jChannels.put(JsonUtil.INSTANCE.encodeToJSON(WebChannel.class, wc));
}
data.put("channels", jChannels);
final JSONArray jAnnouncements = new JSONArray();
for (final Announcement a : this.announcements) {
jAnnouncements.put(JsonUtil.INSTANCE.encodeToJSON(Announcement.class, a));
}
data.put("announcements", jAnnouncements);
data.put("calendar", JsonUtil.INSTANCE.encodeToJSON(WebCalendar.class, this.calendar));
//Add data about shard this guild is expected to be on
data.put("shard", GuildUtils.findShard(Snowflake.of(this.getId())));
//Available langs to allow web editing of lang to be possible
data.put("available_langs", this.availableLangs);
return data;
}
}

View File

@@ -1 +0,0 @@
package org.dreamexposure.discal.core.object.web;

View File

@@ -5,7 +5,6 @@ import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import org.dreamexposure.discal.core.database.DatabaseManager;
import org.dreamexposure.discal.core.logger.LogFeed;
import org.dreamexposure.discal.core.logger.object.LogObject;
import org.dreamexposure.discal.core.object.GuildSettings;
import org.dreamexposure.discal.core.object.calendar.CalendarData;
import org.dreamexposure.discal.core.wrapper.google.CalendarWrapper;
@@ -18,37 +17,26 @@ import reactor.core.publisher.Mono;
*/
public class CalendarUtils {
//TODO: Make sure this supports multi calendar support
public static Mono<Boolean> deleteCalendar(final CalendarData data, final GuildSettings settings) {
return CalendarWrapper.deleteCalendar(data, settings)
.then(Mono.just(settings)
.doOnNext(s -> s.setUseExternalCalendar(false))
.doOnNext(s -> s.setEncryptedAccessToken("N/a"))
.doOnNext(s -> s.setEncryptedRefreshToken("N/a"))
.flatMap(s -> Mono.when(
DatabaseManager.updateSettings(s),
DatabaseManager.deleteCalendar(data),
DatabaseManager.deleteAllEventData(s.getGuildID()),
DatabaseManager.deleteAllRSVPData(s.getGuildID()),
DatabaseManager.deleteAllAnnouncementData(settings.getGuildID())
))
).thenReturn(true)
public static Mono<Boolean> deleteCalendar(final CalendarData data) {
return CalendarWrapper.deleteCalendar(data).then(
Mono.when(
DatabaseManager.deleteCalendar(data),
DatabaseManager.deleteAllEventData(data.getGuildId()),
DatabaseManager.deleteAllRSVPData(data.getGuildId()),
DatabaseManager.deleteAllAnnouncementData(data.getGuildId())
)).thenReturn(true)
.doOnError(e -> LogFeed.log(LogObject.forException("Failed to delete calendar", e, CalendarUtils.class)))
.onErrorReturn(false);
}
//TODO: Make sure this supports multi calendar support!!
public static Mono<Boolean> calendarExists(final CalendarData data, final GuildSettings settings) {
return CalendarWrapper.getCalendar(data, settings)
public static Mono<Boolean> calendarExists(final CalendarData data) {
return CalendarWrapper.getCalendar(data)
.hasElement()
.onErrorResume(GoogleJsonResponseException.class, ge -> {
if (ge.getStatusCode() == GlobalConst.STATUS_GONE || ge.getStatusCode() == GlobalConst.STATUS_NOT_FOUND) {
//Calendar does not exist... remove from db...
settings.setUseExternalCalendar(false);
settings.setEncryptedRefreshToken("N/a");
settings.setEncryptedAccessToken("N/a");
return Mono.when(
DatabaseManager.updateSettings(settings),
DatabaseManager.deleteCalendar(data),
DatabaseManager.deleteAllEventData(data.getGuildId()),
DatabaseManager.deleteAllRSVPData(data.getGuildId()),
@@ -62,4 +50,4 @@ public class CalendarUtils {
}
});
}
}
}

View File

@@ -23,7 +23,7 @@ public class EventUtils {
public static Mono<Boolean> deleteEvent(final GuildSettings settings, final String eventId) {
return DatabaseManager.getMainCalendar(settings.getGuildID())
.flatMap(data ->
EventWrapper.deleteEvent(data, settings, eventId)
EventWrapper.deleteEvent(data, eventId)
.then(Mono.when(
DatabaseManager.deleteAnnouncementsForEvent(settings.getGuildID(), eventId),
DatabaseManager.deleteEventData(eventId))
@@ -34,7 +34,7 @@ public class EventUtils {
public static Mono<Boolean> deleteEvent(final GuildSettings settings, final int calNumber, final String eventId) {
return DatabaseManager.getCalendar(settings.getGuildID(), calNumber)
.flatMap(data ->
EventWrapper.deleteEvent(data, settings, eventId)
EventWrapper.deleteEvent(data, eventId)
.then(Mono.when(
DatabaseManager.deleteAnnouncementsForEvent(settings.getGuildID(), eventId),
DatabaseManager.deleteEventData(eventId))
@@ -46,7 +46,7 @@ public class EventUtils {
public static Mono<Boolean> eventExists(final GuildSettings settings, final String eventId) {
return DatabaseManager.getMainCalendar(settings.getGuildID())
.flatMap(data ->
EventWrapper.getEvent(data, settings, eventId)
EventWrapper.getEvent(data, eventId)
.hasElement()
).switchIfEmpty(Mono.just(false));
}
@@ -54,7 +54,7 @@ public class EventUtils {
public static Mono<Boolean> eventExists(final GuildSettings settings, final int calNumber, final String eventId) {
return DatabaseManager.getCalendar(settings.getGuildID(), calNumber)
.flatMap(data ->
EventWrapper.getEvent(data, settings, eventId)
EventWrapper.getEvent(data, eventId)
.hasElement()
).switchIfEmpty(Mono.just(false));
}

View File

@@ -45,20 +45,20 @@ public class TimeUtils {
@Deprecated
public static Mono<Boolean> isInPast(final String eventId, final GuildSettings settings) {
return DatabaseManager.getMainCalendar(settings.getGuildID()).flatMap(data ->
EventWrapper.getEvent(data, settings, eventId)
EventWrapper.getEvent(data, eventId)
.map(TimeUtils::isInPast)
);
}
public static Mono<Boolean> isInPast(final String eventId, final int calNumber, final GuildSettings settings) {
return DatabaseManager.getCalendar(settings.getGuildID(), calNumber).flatMap(data ->
EventWrapper.getEvent(data, settings, eventId)
EventWrapper.getEvent(data, eventId)
.map(TimeUtils::isInPast)
);
}
public static Mono<Boolean> isInPast(final String eventId, final CalendarData data, final GuildSettings settings) {
return EventWrapper.getEvent(data, settings, eventId).map(TimeUtils::isInPast);
public static Mono<Boolean> isInPast(final String eventId, final CalendarData data) {
return EventWrapper.getEvent(data, eventId).map(TimeUtils::isInPast);
}
@@ -102,4 +102,4 @@ public class TimeUtils {
return epochTime + toAdd;
}
}
}

View File

@@ -3,15 +3,14 @@ package org.dreamexposure.discal.core.wrapper.google;
import com.google.api.services.calendar.model.AclRule;
import org.dreamexposure.discal.core.calendar.CalendarAuth;
import org.dreamexposure.discal.core.object.GuildSettings;
import org.dreamexposure.discal.core.object.calendar.CalendarData;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
public class AclRuleWrapper {
public static Mono<AclRule> insertRule(final AclRule rule, final CalendarData data, final GuildSettings settings) {
return CalendarAuth.getCalendarService(settings, data)
public static Mono<AclRule> insertRule(final AclRule rule, final CalendarData data) {
return CalendarAuth.getCalendarService(data)
.flatMap(service -> Mono.fromCallable(() ->
service.acl()
.insert(data.getCalendarId(), rule)

View File

@@ -6,7 +6,6 @@ import com.google.api.services.calendar.model.CalendarListEntry;
import org.dreamexposure.discal.core.calendar.CalendarAuth;
import org.dreamexposure.discal.core.logger.LogFeed;
import org.dreamexposure.discal.core.logger.object.LogObject;
import org.dreamexposure.discal.core.object.GuildSettings;
import org.dreamexposure.discal.core.object.calendar.CalendarData;
import java.io.IOException;
@@ -26,9 +25,8 @@ public class CalendarWrapper {
.onErrorResume(e -> Mono.empty());
}
public static Mono<Calendar> updateCalendar(final Calendar calendar, final GuildSettings settings,
final CalendarData calData) {
return CalendarAuth.getCalendarService(settings, calData)
public static Mono<Calendar> updateCalendar(final Calendar calendar, final CalendarData calData) {
return CalendarAuth.getCalendarService(calData)
.flatMap(service -> Mono.fromCallable(() ->
service.calendars()
.update(calendar.getId(), calendar)
@@ -37,8 +35,8 @@ public class CalendarWrapper {
.onErrorResume(e -> Mono.empty());
}
public static Mono<Calendar> getCalendar(final CalendarData data, final GuildSettings settings) {
return CalendarAuth.getCalendarService(settings, data)
public static Mono<Calendar> getCalendar(final CalendarData data) {
return CalendarAuth.getCalendarService(data)
.flatMap(service -> Mono.fromCallable(() ->
service.calendars()
.get(data.getCalendarAddress())
@@ -48,12 +46,12 @@ public class CalendarWrapper {
.onErrorResume(e -> Mono.empty());
}
public static Mono<Void> deleteCalendar(final CalendarData data, final GuildSettings settings) {
public static Mono<Void> deleteCalendar(final CalendarData data) {
return Mono.just(data)
.filter(cd -> !cd.getExternal())
.filter(cd -> !"primary".equalsIgnoreCase(cd.getCalendarAddress()))
.flatMap(cd ->
CalendarAuth.getCalendarService(settings, data).flatMap(service ->
CalendarAuth.getCalendarService(data).flatMap(service ->
Mono.fromCallable(() -> service.calendars()
.delete(cd.getCalendarAddress())
.execute()
@@ -64,8 +62,8 @@ public class CalendarWrapper {
.then();
}
public static Mono<List<CalendarListEntry>> getUsersExternalCalendars(final GuildSettings settings) {
return CalendarAuth.getExternalCalendarService(settings)
public static Mono<List<CalendarListEntry>> getUsersExternalCalendars(CalendarData calData) {
return CalendarAuth.getExternalCalendarService(calData)
.flatMap(service -> Mono.fromCallable(() ->
service.calendarList()
.list()

View File

@@ -9,7 +9,6 @@ import org.dreamexposure.discal.core.calendar.CalendarAuth;
import org.dreamexposure.discal.core.database.DatabaseManager;
import org.dreamexposure.discal.core.logger.LogFeed;
import org.dreamexposure.discal.core.logger.object.LogObject;
import org.dreamexposure.discal.core.object.GuildSettings;
import org.dreamexposure.discal.core.object.calendar.CalendarData;
import org.dreamexposure.discal.core.utils.GlobalConst;
@@ -21,8 +20,8 @@ import reactor.core.scheduler.Schedulers;
@SuppressWarnings("DuplicatedCode")
public class EventWrapper {
public static Mono<Event> createEvent(final CalendarData data, final Event event, final GuildSettings settings) {
return CalendarAuth.getCalendarService(settings, data).flatMap(service ->
public static Mono<Event> createEvent(final CalendarData data, final Event event) {
return CalendarAuth.getCalendarService(data).flatMap(service ->
Mono.fromCallable(() ->
service.events()
.insert(data.getCalendarId(), event)
@@ -32,12 +31,12 @@ public class EventWrapper {
if (e.getStatusCode() == GlobalConst.STATUS_NOT_FOUND ||
"requiredAccessLevel".equalsIgnoreCase(e.getDetails().getErrors().get(0).getReason())) {
//This is caused by credentials issue. Lets fix it.
LogFeed.log(LogObject.forDebug("Attempting credentials fix...", "Guild Id: " + settings.getGuildID()));
LogFeed.log(LogObject.forDebug("Attempting credentials fix...", "Guild Id: " + data.getGuildId()));
return correctAssignedCredentialId(data).flatMap(success -> {
if (success) {
return DatabaseManager.getCalendar(data.getGuildId(), data.getCalendarNumber())
.flatMap(cd -> createEvent(cd, event, settings));
.flatMap(cd -> createEvent(cd, event));
} else {
return Mono.empty();
}
@@ -49,8 +48,8 @@ public class EventWrapper {
).onErrorResume(e -> Mono.empty());
}
public static Mono<Event> updateEvent(final CalendarData data, final Event event, final GuildSettings settings) {
return CalendarAuth.getCalendarService(settings, data).flatMap(service ->
public static Mono<Event> updateEvent(final CalendarData data, final Event event) {
return CalendarAuth.getCalendarService(data).flatMap(service ->
Mono.fromCallable(() ->
service.events()
.update(data.getCalendarId(), event.getId(), event)
@@ -60,12 +59,12 @@ public class EventWrapper {
if (e.getStatusCode() == GlobalConst.STATUS_NOT_FOUND ||
"requiredAccessLevel".equalsIgnoreCase(e.getDetails().getErrors().get(0).getReason())) {
//This is caused by credentials issue. Lets fix it.
LogFeed.log(LogObject.forDebug("Attempting credentials fix...", "Guild Id: " + settings.getGuildID()));
LogFeed.log(LogObject.forDebug("Attempting credentials fix...", "Guild Id: " + data.getGuildId()));
return correctAssignedCredentialId(data).flatMap(success -> {
if (success) {
return DatabaseManager.getCalendar(data.getGuildId(), data.getCalendarNumber())
.flatMap(cd -> updateEvent(cd, event, settings));
.flatMap(cd -> updateEvent(cd, event));
} else {
return Mono.empty();
}
@@ -76,8 +75,8 @@ public class EventWrapper {
).onErrorResume(e -> Mono.empty());
}
public static Mono<Event> getEvent(final CalendarData data, final GuildSettings settings, final String id) {
return CalendarAuth.getCalendarService(settings, data).flatMap(service ->
public static Mono<Event> getEvent(final CalendarData data, final String id) {
return CalendarAuth.getCalendarService(data).flatMap(service ->
Mono.fromCallable(() ->
service.events()
.get(data.getCalendarAddress(), id)
@@ -86,9 +85,9 @@ public class EventWrapper {
).onErrorResume(e -> Mono.empty()); //Can ignore this, the event just doesn't exist.
}
public static Mono<List<Event>> getEvents(final CalendarData data, final GuildSettings settings, final int amount,
public static Mono<List<Event>> getEvents(final CalendarData data, final int amount,
final long start) {
return CalendarAuth.getCalendarService(settings, data).flatMap(service ->
return CalendarAuth.getCalendarService(data).flatMap(service ->
Mono.fromCallable(() ->
service.events().list(data.getCalendarId())
.setMaxResults(amount)
@@ -115,9 +114,8 @@ public class EventWrapper {
.onErrorResume(e -> Mono.empty());
}
public static Mono<List<Event>> getEvents(final CalendarData data, final GuildSettings settings, final int amount,
final long start, final long end) {
return CalendarAuth.getCalendarService(settings, data).flatMap(service ->
public static Mono<List<Event>> getEvents(CalendarData data, int amount, long start, long end) {
return CalendarAuth.getCalendarService(data).flatMap(service ->
Mono.fromCallable(() ->
service.events().list(data.getCalendarId())
.setMaxResults(amount)
@@ -131,9 +129,9 @@ public class EventWrapper {
).onErrorResume(e -> Mono.empty());
}
public static Mono<List<Event>> getEvents(final CalendarData data, final GuildSettings settings, final long start,
public static Mono<List<Event>> getEvents(final CalendarData data, final long start,
final long end) {
return CalendarAuth.getCalendarService(settings, data).flatMap(service ->
return CalendarAuth.getCalendarService(data).flatMap(service ->
Mono.fromCallable(() ->
service.events().list(data.getCalendarId())
.setTimeMin(new DateTime(start))
@@ -146,8 +144,8 @@ public class EventWrapper {
).onErrorResume(e -> Mono.empty());
}
public static Mono<Void> deleteEvent(final CalendarData data, final GuildSettings settings, final String id) {
return CalendarAuth.getCalendarService(settings, data).flatMap(service ->
public static Mono<Void> deleteEvent(final CalendarData data, final String id) {
return CalendarAuth.getCalendarService(data).flatMap(service ->
Mono.fromCallable(() ->
service.events()
.delete(data.getCalendarAddress(), id)
@@ -156,12 +154,12 @@ public class EventWrapper {
).onErrorResume(GoogleJsonResponseException.class, e -> {
if ("requiredAccessLevel".equalsIgnoreCase(e.getDetails().getErrors().get(0).getReason())) {
//This is caused by credentials issue. Lets fix it.
LogFeed.log(LogObject.forDebug("Attempting credentials fix...", "Guild Id: " + settings.getGuildID()));
LogFeed.log(LogObject.forDebug("Attempting credentials fix...", "Guild Id: " + data.getGuildId()));
return correctAssignedCredentialId(data).flatMap(success -> {
if (success) {
return DatabaseManager.getCalendar(data.getGuildId(), data.getCalendarNumber())
.flatMap(cd -> deleteEvent(cd, settings, id));
.flatMap(cd -> deleteEvent(cd, id));
} else {
return Mono.empty();
}
@@ -199,7 +197,10 @@ public class EventWrapper {
data.getCalendarId(),
data.getCalendarAddress(),
data.getExternal(),
correctCredential);
correctCredential,
data.getPrivateKey(),
data.getEncryptedAccessToken(),
data.getEncryptedRefreshToken());
LogFeed.log(LogObject.forDebug("Corrected credentials issue! Yay!", "Guild ID: " + data.getGuildId()));

View File

@@ -1,14 +1,14 @@
package org.dreamexposure.discal.core.crypto
import org.apache.commons.codec.binary.Base64
import org.dreamexposure.discal.core.`object`.GuildSettings
import org.dreamexposure.discal.core.`object`.calendar.CalendarData
import java.nio.charset.Charset
import java.nio.charset.StandardCharsets
import javax.crypto.Cipher
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec
class AESEncryption(settings: GuildSettings) {
class AESEncryption(calData: CalendarData) {
//Public key, its fine if this is here, I don't even have access to private keys
private val key1: String = "E4B39r8F57F1Csde"
@@ -17,7 +17,7 @@ class AESEncryption(settings: GuildSettings) {
private var cipher: Cipher?
init {
val key2 = settings.privateKey
val key2 = calData.privateKey
this.ivParameterSpec = IvParameterSpec(key1.toByteArray(StandardCharsets.UTF_8))
this.secretKeySpec = SecretKeySpec(key2.toByteArray(StandardCharsets.UTF_8), "AES")

View File

@@ -0,0 +1,56 @@
package org.dreamexposure.discal.core.`object`
import discord4j.common.util.Snowflake
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import org.dreamexposure.discal.core.serializers.SnowflakeAsStringSerializer
@Serializable
data class GuildSettings(
@Serializable(with = SnowflakeAsStringSerializer::class)
@SerialName("guild_id")
val guildID: Snowflake,
@SerialName("control_role")
var controlRole: String = "everyone",
@SerialName("discal_channel")
var discalChannel: String = "all",
@SerialName("simple_announcement")
var simpleAnnouncements: Boolean = false,
var lang: String = "ENGLISH",
var prefix: String = "!",
@SerialName("patron_guild")
var patronGuild: Boolean = false,
@SerialName("dev_guild")
var devGuild: Boolean = false,
@SerialName("max_calendars")
var maxCalendars: Int = 1,
@SerialName("twelve_hour")
var twelveHour: Boolean = true,
var branded: Boolean = false,
) {
val dmAnnouncements: MutableList<String> = mutableListOf()
companion object {
@JvmStatic
fun empty(guildId: Snowflake) = GuildSettings(guildId)
}
fun getDmAnnouncementsString(): String {
val dm = StringBuilder()
for ((i, sub) in this.dmAnnouncements.withIndex()) {
if (i == 0) dm.append(sub)
else dm.append(",").append(sub)
}
return dm.toString()
}
fun setDmAnnouncementsString(dm: String) {
this.dmAnnouncements += dm.split(",")
}
}

View File

@@ -7,5 +7,5 @@ data class CalendarCreatorResponse(
val successful: Boolean,
val edited: Boolean,
val creatorMessage: Message?,
val calendar: Calendar
val calendar: Calendar?
)

View File

@@ -1,16 +1,43 @@
package org.dreamexposure.discal.core.`object`.calendar
import discord4j.common.util.Snowflake
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import org.dreamexposure.discal.core.serializers.SnowflakeAsStringSerializer
import org.dreamexposure.novautils.crypto.KeyGenerator
@Serializable
data class CalendarData(
@Serializable(with = SnowflakeAsStringSerializer::class)
@SerialName("guild_id")
val guildId: Snowflake = Snowflake.of(0),
@SerialName("calendar_number")
val calendarNumber: Int = 0,
@SerialName("calendar_id")
val calendarId: String = "primary",
@SerialName("calendar_address")
val calendarAddress: String = "primary",
val external: Boolean = false,
//secure values that should not be serialized
@Transient
val credentialId: Int = 0,
)
@Transient
var privateKey: String = KeyGenerator.csRandomAlphaNumericString(16),
@Transient
var encryptedAccessToken: String = "N/a",
@Transient
var encryptedRefreshToken: String = "N/a",
) {
constructor(guildId: Snowflake, calendarNumber: Int, calendarId: String, calendarAddress: String, credentialId:
Int) : this(guildId, calendarNumber, calendarId, calendarAddress, false, credentialId)
companion object {
@JvmStatic
fun empty(guildId: Snowflake) = CalendarData(guildId)
@JvmStatic
fun emptyExternal(guildId: Snowflake) = CalendarData(guildId, external = true)
}
}

View File

@@ -58,13 +58,12 @@ data class PreEvent private constructor(
//Here is where I need to fix the display times
//TODO: Get rid of the blocking
val settings = DatabaseManager.getSettings(this.guildId).block()!!
//TODO: Support multi-cal
val data = DatabaseManager.getMainCalendar(this.guildId).block()!!
var cal: Calendar? = null
try {
cal = CalendarWrapper.getCalendar(data, settings).block()
cal = CalendarWrapper.getCalendar(data).block()
} catch (ex: Exception) {
LogFeed.log(LogObject.forException("Failed to get proper date/time for event!", ex, this.javaClass))
}

View File

@@ -25,7 +25,7 @@ data class WebCalendar private constructor(
Mono.just(empty())
else {
val link = "https://www.discalbot.com/embed/calendar/${gs.guildID.asString()}"
CalendarWrapper.getCalendar(cd, gs).map { cal ->
CalendarWrapper.getCalendar(cd).map { cal ->
WebCalendar(
cd.calendarId,
cd.calendarAddress,

View File

@@ -0,0 +1,142 @@
package org.dreamexposure.discal.core.`object`.web
import discord4j.common.util.Snowflake
import discord4j.core.`object`.entity.Guild
import discord4j.core.`object`.entity.Member
import discord4j.core.`object`.entity.channel.GuildMessageChannel
import discord4j.discordjson.json.GuildUpdateData
import discord4j.discordjson.json.MemberData
import discord4j.discordjson.possible.Possible
import discord4j.rest.entity.RestGuild
import discord4j.rest.util.Image
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.builtins.LongAsStringSerializer
import org.dreamexposure.discal.core.`object`.BotSettings
import org.dreamexposure.discal.core.`object`.GuildSettings
import org.dreamexposure.discal.core.`object`.announcement.Announcement
import org.dreamexposure.discal.core.database.DatabaseManager
import org.dreamexposure.discal.core.exceptions.BotNotInGuildException
import org.dreamexposure.discal.core.utils.GuildUtils
import reactor.core.publisher.Mono
import reactor.core.publisher.Mono.justOrEmpty
import reactor.function.TupleUtils
@Serializable
data class WebGuild(
@Serializable(with = LongAsStringSerializer::class)
val id: Long,
val name: String,
@SerialName("icon_url")
val iconUrl: String? = null,
val settings: GuildSettings,
@SerialName("bot_nick")
val botNick: String? = null,
@SerialName("manage_server")
var manageServer: Boolean = false,
@SerialName("discal_role")
var discalRole: Boolean = false,
val calendar: WebCalendar
) {
val roles: MutableList<WebRole> = mutableListOf()
val channels: MutableList<WebChannel> = mutableListOf()
val announcements: MutableList<Announcement> = mutableListOf()
@SerialName("available_langs")
val availableLangs: MutableList<String> = mutableListOf()
val shard = GuildUtils.findShard(Snowflake.of(this.id))
companion object {
@JvmStatic
@Throws(BotNotInGuildException::class)
fun fromGuild(g: RestGuild): Mono<WebGuild> {
return g.data.flatMap { data: GuildUpdateData ->
val id = Snowflake.of(data.id())
val name = data.name()
val ico = data.icon().orElse("")
val botNick = g.member(Snowflake.of(BotSettings.ID.get()))
.data
.map(MemberData::nick)
.map { Possible.flatOpt(it) }
.flatMap { justOrEmpty(it) }
.defaultIfEmpty("DisCal")
val settings = DatabaseManager.getSettings(id).cache()
val roles = settings.flatMapMany { s ->
g.roles.map { role -> WebRole.fromRole(role, s) }
}.collectList()
val webChannels = settings.flatMapMany { s ->
g.channels.ofType(GuildMessageChannel::class.java)
.map { channel -> WebChannel.fromChannel(channel, s) }
}.collectList()
val announcements = DatabaseManager.getAnnouncements(id)
val calendar = settings.flatMap { s ->
DatabaseManager.getMainCalendar(id)
.flatMap { d -> WebCalendar.fromCalendar(d, s) }
}.defaultIfEmpty(WebCalendar.empty())
Mono.zip(botNick, settings, roles, webChannels, announcements, calendar)
.map(TupleUtils.function { bn, s, r, wc, a, c ->
WebGuild(id.asLong(), name, ico, s, bn, manageServer = false, discalRole = false, c).apply {
this.roles.addAll(r)
this.channels.add(WebChannel.all(s))
this.channels.addAll(wc)
this.announcements.addAll(a)
}
})
}.switchIfEmpty(Mono.error(BotNotInGuildException()))
}
@JvmStatic
fun fromGuild(g: Guild): Mono<WebGuild> {
val id = g.id.asLong()
val name = g.name
val icon = g.getIconUrl(Image.Format.PNG).orElse(null)
val botNick = g.getMemberById(Snowflake.of(BotSettings.ID.get()))
.map(Member::getNickname)
.flatMap { justOrEmpty(it) }
.defaultIfEmpty("DisCal")
val settings = DatabaseManager.getSettings(g.id).cache()
val roles = settings.flatMapMany { s ->
g.roles.map { role -> WebRole.fromRole(role, s) }
}.collectList()
val channels = settings.flatMapMany { s ->
g.channels
.ofType(GuildMessageChannel::class.java)
.map { channel -> WebChannel.fromChannel(channel, s) }
}.collectList()
val announcements = DatabaseManager.getAnnouncements(g.id)
val calendar = settings.flatMap { s ->
DatabaseManager.getMainCalendar(Snowflake.of(id))
.flatMap { d -> WebCalendar.fromCalendar(d, s) }
}
return Mono.zip(botNick, settings, roles, channels, announcements, calendar)
.map(TupleUtils.function { bn, s, r, wc, a, c ->
WebGuild(id, name, icon, s, bn, manageServer = false, discalRole = false, c).apply {
this.roles.addAll(r)
this.channels.add(WebChannel.all(s))
this.channels.addAll(wc)
this.announcements.addAll(a)
}
})
}
}
}

View File

@@ -0,0 +1,22 @@
# noinspection SqlResolveForFile
# Add columns for calendar data that will be moved over
ALTER TABLE ${prefix}calendars
ADD COLUMN private_key VARCHAR(16) NOT NULL DEFAULT 'N/a',
ADD COLUMN access_token VARCHAR(65535) NOT NULL DEFAULT 'N/a',
ADD COLUMN refresh_token VARCHAR(65535) NOT NULL DEFAULT 'N/a';
# Copy and move data, setting defaults if not present
UPDATE ${prefix}calendars AS c
LEFT JOIN ${prefix}guild_settings AS g
on c.guild_id = g.guild_id
SET c.private_key = IFNULL(g.private_key, 'N/a'),
c.access_token = IFNULL(g.access_token, 'N/a'),
c.refresh_token = IFNULL(g.refresh_token, 'N/a');
# Delete columns from guild settings as they have now been moved over
ALTER TABLE ${prefix}guild_settings
DROP COLUMN external_calendar,
DROP COLUMN private_key,
DROP COLUMN access_token,
DROP COLUMN refresh_token;

View File

@@ -66,7 +66,7 @@ public class EventEndpoint {
//okay, lets actually get the month's events.
try {
final CalendarData calendarData = DatabaseManager.getMainCalendar(settings.getGuildID()).block();
final Calendar service = CalendarAuth.getCalendarService(settings, calendarData).block();
final Calendar service = CalendarAuth.getCalendarService(calendarData).block();
final Events events = service.events().list(calendarData.getCalendarAddress())
.setTimeMin(new DateTime(startEpoch))
@@ -124,7 +124,7 @@ public class EventEndpoint {
//okay, lets actually get the month's events.
try {
final CalendarData calendarData = DatabaseManager.getMainCalendar(settings.getGuildID()).block();
final Calendar service = CalendarAuth.getCalendarService(settings, calendarData).block();
final Calendar service = CalendarAuth.getCalendarService(calendarData).block();
final Events events = service.events().list(calendarData.getCalendarAddress())
.setTimeMin(new DateTime(startEpoch))
@@ -222,7 +222,7 @@ public class EventEndpoint {
//Okay, time to update the event
try {
final CalendarData calendarData = DatabaseManager.getMainCalendar(settings.getGuildID()).block();
final Calendar service = CalendarAuth.getCalendarService(settings, calendarData).block();
final Calendar service = CalendarAuth.getCalendarService(calendarData).block();
final com.google.api.services.calendar.model.Calendar cal = service.calendars().get(calendarData.getCalendarId()).execute();
@@ -268,7 +268,7 @@ public class EventEndpoint {
body.getString("image")
);
if (!ImageUtils.validate(ed.getImageLink(), settings.isPatronGuild()).block()) {
if (!ImageUtils.validate(ed.getImageLink(), settings.getPatronGuild()).block()) {
final JSONObject respondBody = new JSONObject();
respondBody.put("Message", "Failed to create event!");
respondBody.put("reason", "Invalid image link and/or GIF image not supported.");
@@ -323,7 +323,7 @@ public class EventEndpoint {
try {
final CalendarData calendarData = DatabaseManager.getMainCalendar(settings.getGuildID()).block();
final Calendar service = CalendarAuth.getCalendarService(settings, calendarData).block();
final Calendar service = CalendarAuth.getCalendarService(calendarData).block();
final com.google.api.services.calendar.model.Calendar cal = service.calendars().get(calendarData.getCalendarId()).execute();
@@ -369,7 +369,7 @@ public class EventEndpoint {
body.getString("image")
);
if (!ImageUtils.validate(ed.getImageLink(), settings.isPatronGuild()).block()) {
if (!ImageUtils.validate(ed.getImageLink(), settings.getPatronGuild()).block()) {
final JSONObject respondBody = new JSONObject();
respondBody.put("Message", "Failed to update event!");
respondBody.put("reason", "Invalid image link and/or GIF image not supported.");

View File

@@ -52,14 +52,13 @@ public class GuildEndpoint {
response.setStatus(GlobalConst.STATUS_SUCCESS);
final JSONObject body = new JSONObject();
body.put("external_calendar", settings.useExternalCalendar());
body.put("control_role", settings.getControlRole());
body.put("discal_channel", settings.getDiscalChannel());
body.put("simple_announcement", settings.usingSimpleAnnouncements());
body.put("simple_announcement", settings.getSimpleAnnouncements());
body.put("lang", settings.getLang());
body.put("prefix", settings.getPrefix());
body.put("patron_guild", settings.isPatronGuild());
body.put("dev_guild", settings.isDevGuild());
body.put("patron_guild", settings.getPatronGuild());
body.put("dev_guild", settings.getDevGuild());
body.put("max_calendars", settings.getMaxCalendars());
return body.toString();
@@ -95,18 +94,19 @@ public class GuildEndpoint {
final long guildId = body.getLong("guild_id");
final GuildSettings settings = DatabaseManager.getSettings(Snowflake.of(guildId)).block();
GuildSettings settings = DatabaseManager.getSettings(Snowflake.of(guildId)).block();
if (body.has("control_role"))
settings.setControlRole(body.getString("control_role"));
if (body.has("discal_channel"))
settings.setDiscalChannel(body.getString("discal_channel"));
if (body.has("simple_announcement"))
settings.setSimpleAnnouncements(body.getBoolean("simple_announcement"));
if (body.has("lang"))
settings.setLang(body.getString("lang"));
if (body.has("prefix"))
settings.setPrefix(body.getString("prefix"));
settings = settings.copy(settings.getGuildID(),
body.optString("control_role", settings.getControlRole()),
body.optString("discal_channel", settings.getDiscalChannel()),
body.optBoolean("simple_announcement", settings.getSimpleAnnouncements()),
body.optString("lang", settings.getLang()),
body.optString("prefix", settings.getPrefix()),
settings.getPatronGuild(),
settings.getDevGuild(),
settings.getMaxCalendars(),
settings.getTwelveHour(),
settings.getBranded());
if (DatabaseManager.updateSettings(settings).block()) {
response.setContentType("application/json");

View File

@@ -3,7 +3,6 @@ package org.dreamexposure.discal.server.api.endpoints.v2.calendar;
import org.dreamexposure.discal.core.database.DatabaseManager;
import org.dreamexposure.discal.core.logger.LogFeed;
import org.dreamexposure.discal.core.logger.object.LogObject;
import org.dreamexposure.discal.core.object.GuildSettings;
import org.dreamexposure.discal.core.object.calendar.CalendarData;
import org.dreamexposure.discal.core.object.web.AuthenticationState;
import org.dreamexposure.discal.core.utils.CalendarUtils;
@@ -46,12 +45,11 @@ public class DeleteCalendarEndpoint {
final Snowflake guildId = Snowflake.of(jsonMain.getString("guild_id"));
final int calNumber = jsonMain.getInt("calendar_number");
final GuildSettings settings = DatabaseManager.getSettings(guildId).block();
final CalendarData calendar = DatabaseManager.getCalendar(guildId, calNumber).block();
if (!"primary".equalsIgnoreCase(calendar.getCalendarAddress())) {
if (CalendarUtils.calendarExists(calendar, settings).block()) {
if (CalendarUtils.deleteCalendar(calendar, settings).block()) {
if (CalendarUtils.calendarExists(calendar).block()) {
if (CalendarUtils.deleteCalendar(calendar).block()) {
response.setContentType("application/json");
response.setStatus(GlobalConst.STATUS_SUCCESS);
return JsonUtils.getJsonResponseMessage("Calendar successfully deleted");

View File

@@ -6,7 +6,6 @@ import org.dreamexposure.discal.core.calendar.CalendarAuth;
import org.dreamexposure.discal.core.database.DatabaseManager;
import org.dreamexposure.discal.core.logger.LogFeed;
import org.dreamexposure.discal.core.logger.object.LogObject;
import org.dreamexposure.discal.core.object.GuildSettings;
import org.dreamexposure.discal.core.object.calendar.CalendarData;
import org.dreamexposure.discal.core.object.web.AuthenticationState;
import org.dreamexposure.discal.core.utils.CalendarUtils;
@@ -45,12 +44,11 @@ public class GetCalendarEndpoint {
final Snowflake guildId = Snowflake.of(jsonMain.getString("guild_id"));
final int calNumber = jsonMain.getInt("calendar_number");
final GuildSettings settings = DatabaseManager.getSettings(guildId).block();
final CalendarData calData = DatabaseManager.getCalendar(guildId, calNumber).block();
if (!"primary".equalsIgnoreCase(calData.getCalendarAddress())
&& CalendarUtils.calendarExists(calData, settings).block()) {
final Calendar service = CalendarAuth.getCalendarService(settings, calData).block();
&& CalendarUtils.calendarExists(calData).block()) {
final Calendar service = CalendarAuth.getCalendarService(calData).block();
final com.google.api.services.calendar.model.Calendar cal = service.calendars()
.get(calData.getCalendarAddress())
.execute();

View File

@@ -6,7 +6,6 @@ import org.dreamexposure.discal.core.calendar.CalendarAuth;
import org.dreamexposure.discal.core.database.DatabaseManager;
import org.dreamexposure.discal.core.logger.LogFeed;
import org.dreamexposure.discal.core.logger.object.LogObject;
import org.dreamexposure.discal.core.object.GuildSettings;
import org.dreamexposure.discal.core.object.calendar.CalendarData;
import org.dreamexposure.discal.core.object.web.AuthenticationState;
import org.dreamexposure.discal.core.utils.CalendarUtils;
@@ -45,13 +44,11 @@ public class ListCalendarEndpoint {
final JSONObject jsonMain = new JSONObject(requestBody);
final Snowflake guildId = Snowflake.of(jsonMain.getString("guild_id"));
final GuildSettings settings = DatabaseManager.getSettings(guildId).block();
final JSONArray jCals = new JSONArray();
for (final CalendarData calData : DatabaseManager.getAllCalendars(guildId).block()) {
if (!"primary".equalsIgnoreCase(calData.getCalendarAddress())
&& CalendarUtils.calendarExists(calData, settings).block()) {
final Calendar service = CalendarAuth.getCalendarService(settings, calData).block();
&& CalendarUtils.calendarExists(calData).block()) {
final Calendar service = CalendarAuth.getCalendarService(calData).block();
final com.google.api.services.calendar.model.Calendar cal = service.calendars()
.get(calData.getCalendarAddress())

View File

@@ -6,7 +6,6 @@ import org.dreamexposure.discal.core.calendar.CalendarAuth;
import org.dreamexposure.discal.core.database.DatabaseManager;
import org.dreamexposure.discal.core.logger.LogFeed;
import org.dreamexposure.discal.core.logger.object.LogObject;
import org.dreamexposure.discal.core.object.GuildSettings;
import org.dreamexposure.discal.core.object.calendar.CalendarData;
import org.dreamexposure.discal.core.object.web.AuthenticationState;
import org.dreamexposure.discal.core.utils.CalendarUtils;
@@ -50,12 +49,11 @@ public class UpdateCalendarEndpoint {
final Snowflake guildId = Snowflake.of(jsonMain.getString("guild_id"));
final int calNumber = jsonMain.getInt("calendar_number");
final GuildSettings settings = DatabaseManager.getSettings(guildId).block();
final CalendarData calData = DatabaseManager.getCalendar(guildId, calNumber).block();
if (!"primary".equalsIgnoreCase(calData.getCalendarAddress())
&& CalendarUtils.calendarExists(calData, settings).block()) {
final Calendar service = CalendarAuth.getCalendarService(settings, calData).block();
&& CalendarUtils.calendarExists(calData).block()) {
final Calendar service = CalendarAuth.getCalendarService(calData).block();
final com.google.api.services.calendar.model.Calendar cal = service.calendars()
.get(calData.getCalendarAddress())
.execute();

View File

@@ -64,7 +64,7 @@ public class CreateEventEndpoint {
final GuildSettings settings = DatabaseManager.getSettings(Snowflake.of(guildId)).block();
final CalendarData calData = DatabaseManager.getCalendar(settings.getGuildID(), calNumber).block();
final com.google.api.services.calendar.Calendar service = CalendarAuth.getCalendarService(settings, calData).block();
final com.google.api.services.calendar.Calendar service = CalendarAuth.getCalendarService(calData).block();
final Calendar cal = service.calendars().get(calData.getCalendarId()).execute();
final Event event = new Event();
@@ -97,7 +97,7 @@ public class CreateEventEndpoint {
EventData eventData = new EventData();
if (requestBody.has("image")) {
if (ImageUtils.validate(requestBody.getString("image"), settings.isPatronGuild()).block()) {
if (ImageUtils.validate(requestBody.getString("image"), settings.getPatronGuild()).block()) {
//Link is good...
eventData = new EventData(
Snowflake.of(guildId),

View File

@@ -50,7 +50,7 @@ public class GetEventEndpoint {
final CalendarData calendarData = DatabaseManager.getCalendar(settings.getGuildID(), calNumber).block();
//okay, get the calendar service and then the event
final Calendar service = CalendarAuth.getCalendarService(settings, calendarData).block();
final Calendar service = CalendarAuth.getCalendarService(calendarData).block();
final Event event = service.events().get(calendarData.getCalendarAddress(), eventId).execute();

View File

@@ -63,7 +63,7 @@ public class UpdateEventEndpoint {
final GuildSettings settings = DatabaseManager.getSettings(Snowflake.of(guildId)).block();
final CalendarData calData = DatabaseManager.getCalendar(settings.getGuildID(), calNumber).block();
final com.google.api.services.calendar.Calendar service = CalendarAuth.getCalendarService(settings, calData).block();
final com.google.api.services.calendar.Calendar service = CalendarAuth.getCalendarService(calData).block();
final Calendar cal = service.calendars().get(calData.getCalendarId()).execute();
final Event event = service.events().get(calData.getCalendarId(), eventId).execute();
@@ -96,7 +96,7 @@ public class UpdateEventEndpoint {
event.setRecurrence(Arrays.asList(rr));
}
if (requestBody.has("image")) {
if (ImageUtils.validate(requestBody.getString("image"), settings.isPatronGuild()).block()) {
if (ImageUtils.validate(requestBody.getString("image"), settings.getPatronGuild()).block()) {
//Link is good...
final EventData ed = new EventData(
Snowflake.of(guildId),

View File

@@ -50,7 +50,7 @@ public class ListEventDateEndpoint {
//okay, lets actually get the date's events.
final List<JSONObject> events = DatabaseManager.getCalendar(settings.getGuildID(), calNumber)
.flatMap(calData -> EventWrapper.getEvents(calData, settings, startEpoch, endEpoch))
.flatMap(calData -> EventWrapper.getEvents(calData, startEpoch, endEpoch))
.flatMapMany(Flux::fromIterable)
.map(e -> JsonUtils.convertEventToJson(e, settings))
.collectList()

View File

@@ -51,7 +51,7 @@ public class ListEventMonthEndpoint {
//okay, lets actually get the month's events.
final List<JSONObject> events = DatabaseManager.getCalendar(settings.getGuildID(), calNumber)
.flatMap(calData -> EventWrapper.getEvents(calData, settings, startEpoch, endEpoch))
.flatMap(calData -> EventWrapper.getEvents(calData, startEpoch, endEpoch))
.flatMapMany(Flux::fromIterable)
.map(e -> JsonUtils.convertEventToJson(e, settings))
.collectList()

View File

@@ -50,7 +50,7 @@ public class ListEventOngoingEndpoint {
//okay, lets actually get the date's events.
final List<JSONObject> events = DatabaseManager.getCalendar(settings.getGuildID(), calNumber)
.flatMap(calData -> EventWrapper.getEvents(calData, settings, start, end))
.flatMap(calData -> EventWrapper.getEvents(calData, start, end))
.flatMapMany(Flux::fromIterable)
.filter(e -> e.getStart().getDateTime().getValue() < System.currentTimeMillis())
.filter(e -> e.getEnd().getDateTime().getValue() > System.currentTimeMillis())

View File

@@ -50,7 +50,7 @@ public class ListEventRangeEndpoint {
//okay, lets actually get the range's events.
final List<JSONObject> events = DatabaseManager.getCalendar(settings.getGuildID(), calNumber)
.flatMap(calData -> EventWrapper.getEvents(calData, settings, startEpoch, endEpoch))
.flatMap(calData -> EventWrapper.getEvents(calData, startEpoch, endEpoch))
.flatMapMany(Flux::fromIterable)
.map(e -> JsonUtils.convertEventToJson(e, settings))
.collectList()

View File

@@ -32,7 +32,7 @@ import discord4j.rest.entity.RestMember;
@RequestMapping("/v2/guild/")
public class GetWebGuildEndpoint {
@PostMapping(value = "/get", produces = "application/json")
public String getSettings(final HttpServletRequest request, final HttpServletResponse response, @RequestBody final String requestBody) {
public String getSettings(HttpServletRequest request, HttpServletResponse response, @RequestBody String requestBody) {
//Authenticate...
final AuthenticationState authState = Authentication.authenticate(request);
if (!authState.getSuccess()) {
@@ -48,7 +48,7 @@ public class GetWebGuildEndpoint {
final RestGuild g = DisCalServer.getClient().getGuildById(guildId);
final WebGuild wg = WebGuild.fromGuild(g);
final WebGuild wg = WebGuild.fromGuild(g).block();
final RestMember m = g.member(userId);
@@ -66,7 +66,7 @@ public class GetWebGuildEndpoint {
response.setContentType("application/json");
response.setStatus(GlobalConst.STATUS_SUCCESS);
return wg.toJson(!authState.getFromDiscalNetwork()).toString();
return JsonUtil.INSTANCE.encodeToString(WebGuild.class, wg);
} catch (final BotNotInGuildException e) {
response.setContentType("application/json");
response.setStatus(GlobalConst.STATUS_NOT_FOUND);

View File

@@ -25,7 +25,7 @@ import discord4j.common.util.Snowflake;
@RequestMapping("/v2/guild/settings")
public class GetGuildSettingsEndpoint {
@PostMapping(value = "/get", produces = "application/json")
public String getSettings(final HttpServletRequest request, final HttpServletResponse response, @RequestBody final String requestBody) {
public String getSettings(HttpServletRequest request, HttpServletResponse response, @RequestBody String requestBody) {
//Authenticate...
final AuthenticationState authState = Authentication.authenticate(request);
if (!authState.getSuccess()) {
@@ -43,11 +43,8 @@ public class GetGuildSettingsEndpoint {
response.setContentType("application/json");
response.setStatus(GlobalConst.STATUS_SUCCESS);
if (authState.getFromDiscalNetwork())
return settings.toJson().toString();
else
return settings.toJsonSecure().toString();
return JsonUtil.INSTANCE.encodeToString(GuildSettings.class, settings);
} catch (final JSONException e) {
e.printStackTrace();

View File

@@ -51,41 +51,45 @@ public class UpdateGuildSettingsEndpoint {
final JSONObject body = new JSONObject(requestBody);
final String guildId = body.getString("guild_id");
final GuildSettings settings = DatabaseManager.getSettings(Snowflake.of(guildId)).block();
GuildSettings settings = DatabaseManager.getSettings(Snowflake.of(guildId)).block();
//Handle various things that are allowed to change.
if (body.has("control_role"))
settings.setControlRole(body.getString("control_role"));
String conRole = body.optString("control_role", settings.getControlRole());
String disChannel = settings.getDiscalChannel();
if (body.has("discal_channel")) {
final String id = body.getString("discal_channel");
if ("0".equalsIgnoreCase(id) || "all".equalsIgnoreCase(id))
settings.setDiscalChannel("all");
else
settings.setDiscalChannel(id);
disChannel = "all";
else disChannel = id;
}
if (body.has("simple_announcements"))
settings.setSimpleAnnouncements(body.getBoolean("simple_announcements"));
if (body.has("lang")) {
final String lang = body.getString("lang");
//noinspection unchecked
if (new ArrayList<String>(ReadFile.readAllLangFiles().block().keySet()).contains(lang.toUpperCase()))
settings.setLang(body.getString("lang"));
}
if (body.has("prefix"))
settings.setPrefix(body.getString("prefix"));
boolean simpleAnn = body.optBoolean("simple_announcements", settings.getSimpleAnnouncements());
String lang = body.optString("lang", settings.getLang());
if (!(new ArrayList<String>(ReadFile.readAllLangFiles().block().keySet()).contains(lang.toUpperCase())))
lang = settings.getLang();
String prefix = body.optString("prefix", settings.getPrefix());
boolean patronGuild = settings.getPatronGuild();
boolean devGuild = settings.getDevGuild();
boolean branded = settings.getBranded();
int maxCals = settings.getMaxCalendars();
//TODO: Support changing twelve hour format once implemented
//Allow Official DisCal Shards to change some other things...
if (authState.getFromDiscalNetwork()) {
if (body.has("external_calendar"))
settings.setUseExternalCalendar(body.getBoolean("external_calendar"));
if (body.has("patron_guild"))
settings.setPatronGuild(body.getBoolean("patron_guild"));
if (body.has("dev_guild"))
settings.setDevGuild(body.getBoolean("dev_guild"));
if (body.has("branded"))
settings.setBranded(body.getBoolean("branded"));
patronGuild = body.optBoolean("patron_guild", patronGuild);
devGuild = body.optBoolean("dev_guild", devGuild);
branded = body.optBoolean("branded", branded);
maxCals = body.optInt("max_calendars", maxCals);
}
//Copy the settings and then update the database
settings = settings.copy(
settings.getGuildID(), conRole, disChannel, simpleAnn, lang, prefix,
patronGuild, devGuild, maxCals, settings.getTwelveHour(), branded
);
if (DatabaseManager.updateSettings(settings).block()) {
response.setContentType("application/json");
response.setStatus(GlobalConst.STATUS_SUCCESS);