Skip to content

Commit

Permalink
Catch parsing exception for scheduled events (#2401)
Browse files Browse the repository at this point in the history
  • Loading branch information
MinnDevelopment authored Feb 19, 2023
1 parent f774ba8 commit 8e46689
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 12 deletions.
23 changes: 17 additions & 6 deletions src/main/java/net/dv8tion/jda/internal/entities/EntityBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -201,16 +201,22 @@ private void createScheduledEventPass(GuildImpl guildObj, DataArray array)
{
if (!getJDA().isCacheFlagSet(CacheFlag.SCHEDULED_EVENTS))
return;
SnowflakeCacheViewImpl<ScheduledEvent> eventView = guildObj.getScheduledEventsView();
for (int i = 0; i < array.length(); i++)
{
DataObject object = array.getObject(i);
if (object.isNull("id"))
try
{
LOG.error("Received GUILD_CREATE with a scheduled event with a null ID. JSON: {}", object);
continue;
if (object.isNull("id"))
{
LOG.error("Received GUILD_CREATE with a scheduled event with a null ID. JSON: {}", object);
continue;
}
createScheduledEvent(guildObj, object);
}
catch (ParsingException exception)
{
LOG.error("Received GUILD_CREATE with a scheduled event that failed to parse. JSON: {}", object, exception);
}
createScheduledEvent(guildObj, object);
}
}

Expand Down Expand Up @@ -1023,7 +1029,12 @@ public ScheduledEvent createScheduledEvent(GuildImpl guild, DataObject json)
scheduledEvent.setLocation(json.getString("channel_id"));
break;
case EXTERNAL:
String externalLocation = json.getObject("entity_metadata").getString("location");
String externalLocation;
if (json.isNull("entity_metadata") || json.getObject("entity_metadata").isNull("location"))
externalLocation = "";
else
externalLocation = json.getObject("entity_metadata").getString("location");

scheduledEvent.setLocation(externalLocation);
}
return scheduledEvent;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

package net.dv8tion.jda.internal.handle;

import net.dv8tion.jda.api.entities.*;
import net.dv8tion.jda.api.entities.ScheduledEvent;
import net.dv8tion.jda.api.entities.channel.concrete.StageChannel;
import net.dv8tion.jda.api.entities.channel.concrete.VoiceChannel;
import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
Expand All @@ -28,7 +28,7 @@
import net.dv8tion.jda.internal.entities.ScheduledEventImpl;

import java.time.OffsetDateTime;
import java.util.*;
import java.util.Objects;

public class ScheduledEventUpdateHandler extends SocketHandler
{
Expand Down Expand Up @@ -70,10 +70,11 @@ protected Long handleInternally(DataObject content)
String location = content.getString("channel_id", null);
GuildChannel channel = null;
String oldLocation = event.getLocation();
if (location == null)
location = content.getObject("entity_metadata").getString("location", null);
else

if (location != null)
channel = guild.getGuildChannelById(location);
else // null in some cases due to discord validation bugs
location = content.optObject("entity_metadata").map(o -> o.getString("location", "")).orElse("");

if (!Objects.equals(name, event.getName()))
{
Expand Down Expand Up @@ -107,7 +108,7 @@ protected Long handleInternally(DataObject content)
event.setStatus(status);
getJDA().handleEvent(new ScheduledEventUpdateStatusEvent(getJDA(), responseNumber, event, oldStatus));
}
if (channel == null && location != null && !location.equals(event.getLocation()))
if (channel == null && !location.equals(event.getLocation()))
{
event.setLocation(location);
event.setType(ScheduledEvent.Type.EXTERNAL);
Expand Down

0 comments on commit 8e46689

Please sign in to comment.