Fix discord webhooks (#2412)

This commit is contained in:
JoanFo
2026-06-23 21:40:14 +02:00
committed by GitHub
parent a9cb16e042
commit ab9535eb37
4 changed files with 33 additions and 10 deletions

View File

@@ -64,6 +64,8 @@ class CreateWebhookConfiguration extends CreateRecord
}
$flags = collect($data['flags'] ?? [])->reduce(fn ($carry, $bit) => $carry | $bit, 0);
$selected = data_get($data, 'allowed_mentions', []);
$allowedMentions = $selected ? ['parse' => array_values($selected)] : [];
$tmp = collect([
'username' => data_get($data, 'username'),
@@ -74,7 +76,7 @@ class CreateWebhookConfiguration extends CreateRecord
'embeds' => $embeds,
'thread_name' => data_get($data, 'thread_name'),
'flags' => $flags,
'allowed_mentions' => data_get($data, 'allowed_mentions', []),
'allowed_mentions' => $allowedMentions,
])->filter(fn ($key) => !empty($key))->all();
unset($data['username'], $data['avatar_url'], $data['content'], $data['image'], $data['thumbnail'], $data['embeds'], $data['thread_name'], $data['flags'], $data['allowed_mentions']);

View File

@@ -56,6 +56,8 @@ class EditWebhookConfiguration extends EditRecord
}
$flags = collect($data['flags'] ?? [])->reduce(fn ($carry, $bit) => $carry | $bit, 0);
$selected = data_get($data, 'allowed_mentions', []);
$allowedMentions = $selected ? ['parse' => array_values($selected)] : [];
$tmp = collect([
'username' => data_get($data, 'username'),
@@ -66,7 +68,7 @@ class EditWebhookConfiguration extends EditRecord
'embeds' => $embeds,
'thread_name' => data_get($data, 'thread_name'),
'flags' => $flags,
'allowed_mentions' => data_get($data, 'allowed_mentions', []),
'allowed_mentions' => $allowedMentions,
])->filter(fn ($key) => !empty($key))->all();
unset($data['username'], $data['avatar_url'], $data['content'], $data['image'], $data['thumbnail'], $data['embeds'], $data['thread_name'], $data['flags'], $data['allowed_mentions']);
@@ -110,7 +112,7 @@ class EditWebhookConfiguration extends EditRecord
'embeds' => $embeds,
'thread_name' => data_get($data, 'payload.thread_name'),
'flags' => $flags,
'allowed_mentions' => data_get($data, 'payload.allowed_mentions'),
'allowed_mentions' => data_get($data, 'payload.allowed_mentions.parse'),
])->filter(fn ($key) => !empty($key))->all();
unset($data['payload'], $data['created_at'], $data['updated_at'], $data['deleted_at']);

View File

@@ -51,6 +51,13 @@ class ProcessWebhook implements ShouldQueue
}
}
$data['embeds'] = $embeds;
if (isset($data['flags'])) {
$data['flags'] &= ~(1 << 2);
}
}
if (isset($data['content']) && $data['content'] === '') {
unset($data['content']);
}
}

View File

@@ -175,17 +175,29 @@ class DispatchWebhooks
protected function handleGlobalWebhooks(ActivityLogged $activityLogged): void
{
$eventName = $activityLogged->model->event;
$activityLoggedClass = ActivityLogged::class;
if (!$this->eventIsWatched($eventName)) {
return;
$matchingHooks = collect();
if ($this->eventIsWatched($eventName)) {
$matchingHooks = $matchingHooks->merge(
cache()->rememberForever("webhooks.$eventName", fn () => WebhookConfiguration::query()
->where('scope', WebhookScope::Global)
->whereJsonContains('events', $eventName)
->get())
);
}
$matchingHooks = cache()->rememberForever("webhooks.$eventName", function () use ($eventName) {
return WebhookConfiguration::query()
$matchingHooks = $matchingHooks->merge(
cache()->rememberForever("webhooks.$activityLoggedClass", fn () => WebhookConfiguration::query()
->where('scope', WebhookScope::Global)
->whereJsonContains('events', $eventName)
->get();
});
->whereJsonContains('events', $activityLoggedClass)
->get())
)->unique('id');
if ($matchingHooks->isEmpty()) {
return;
}
$webhookData = $this->buildActivityPayload($activityLogged);