Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions app/Data/Discord/Component/ActionRowData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

declare(strict_types=1);

namespace App\Data\Discord\Component;

use Illuminate\Support\Collection;
use Spatie\LaravelData\Data;
use Spatie\TypeScriptTransformer\Attributes\TypeScript;

#[TypeScript('DiscordActionRowData')]
class ActionRowData extends Data
{
public function __construct(
/** @var Collection<int, ButtonData>|Collection<int, StringCollectorData> */
public readonly Collection $components,
public readonly int $type = 1,
) {}
}
61 changes: 61 additions & 0 deletions app/Data/Discord/Component/ButtonData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php

declare(strict_types=1);

namespace App\Data\Discord\Component;

use App\Enums\DiscordButton;
use Spatie\LaravelData\Data;
use Spatie\TypeScriptTransformer\Attributes\TypeScript;

#[TypeScript('DiscordButtonData')]
class ButtonData extends Data
{
public function __construct(
public readonly DiscordButton $style,
public readonly string $label,
public readonly int $type = 2,
public readonly ?string $custom_id = null,
public readonly ?EmojiData $emoji = null,
public readonly ?string $url = null,
) {}

public static function success(string $custom_id, string $label, ?EmojiData $emoji = null): self
{
return new self(
custom_id: $custom_id,
style: DiscordButton::Success,
label: $label,
emoji: $emoji,
);
}

public static function danger(string $custom_id, string $label, ?EmojiData $emoji = null): self
{
return new self(
custom_id: $custom_id,
style: DiscordButton::Danger,
label: $label,
emoji: $emoji,
);
}

public static function primary(string $custom_id, string $label, ?EmojiData $emoji = null): self
{
return new self(
custom_id: $custom_id,
style: DiscordButton::Primary,
label: $label,
emoji: $emoji,
);
}

public static function link(string $label, string $url): self
{
return new self(
style: DiscordButton::Link,
label: $label,
url: $url,
);
}
}
36 changes: 36 additions & 0 deletions app/Data/Discord/Component/EmojiData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

declare(strict_types=1);

namespace App\Data\Discord\Component;

use App\Models\TicketButton;
use Spatie\LaravelData\Data;
use Spatie\TypeScriptTransformer\Attributes\TypeScript;

#[TypeScript('DiscordEmojiData')]
class EmojiData extends Data
{
public function __construct(
public readonly string $name,
public readonly ?string $id = null,
) {}

public static function fromTicketButton(TicketButton $ticketButton): self
{
if (str_contains($ticketButton->emoji, '<') && str_contains($ticketButton->emoji, '>')) {
$discordEmoji = str_replace('<', '', $ticketButton->emoji);
$discordEmoji = str_replace('>', '', $discordEmoji);
[$emojiName, $emojiId] = explode(':', $discordEmoji);

return new self(
name: $emojiName,
id: $emojiId,
);
}

return new self(
name: $ticketButton->emoji,
);
}
}
23 changes: 23 additions & 0 deletions app/Data/Discord/Component/StringCollectorData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace App\Data\Discord\Component;

use Illuminate\Support\Collection;
use Spatie\LaravelData\Data;
use Spatie\TypeScriptTransformer\Attributes\TypeScript;

#[TypeScript('DiscordStringCollectorData')]
class StringCollectorData extends Data
{
public function __construct(
public readonly string $custom_id,
/** @var Collection<int, StringCollectorOptionData> $options */
public readonly Collection $options,
public readonly string $placeholder,
public readonly int $min_values,
public readonly int $max_values,
public readonly int $type = 3,
) {}
}
29 changes: 29 additions & 0 deletions app/Data/Discord/Component/StringCollectorOptionData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

declare(strict_types=1);

namespace App\Data\Discord\Component;

use App\Models\ApplicationResponse;
use Illuminate\Support\Str;
use Spatie\LaravelData\Data;
use Spatie\TypeScriptTransformer\Attributes\TypeScript;

#[TypeScript('DiscordStringCollectorOptionData')]
class StringCollectorOptionData extends Data
{
public function __construct(
public readonly string $label,
public readonly string $value,
public readonly string $description,
) {}

public static function fromApplicationResponse(ApplicationResponse $applicationResponse): self
{
return new self(
$applicationResponse->name,
"{$applicationResponse->id}",
Str::limit($applicationResponse->response, 90),
);
}
}
23 changes: 23 additions & 0 deletions app/Data/Discord/Embed/EmbedData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace App\Data\Discord\Embed;

use Illuminate\Support\Collection;
use Spatie\LaravelData\Data;
use Spatie\TypeScriptTransformer\Attributes\TypeScript;

#[TypeScript('DiscordEmbedData')]
class EmbedData extends Data
{
public function __construct(
public readonly ?string $title = null,
public readonly ?string $description = null,
public readonly ?string $color = null,
/** @var ?Collection<int, FieldsData> $fields */
public readonly ?Collection $fields = null,
public readonly ?string $timestamp = null,
public readonly ?ThumbnailData $thumbnail = null,
) {}
}
18 changes: 18 additions & 0 deletions app/Data/Discord/Embed/FieldsData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare(strict_types=1);

namespace App\Data\Discord\Embed;

use Spatie\LaravelData\Data;
use Spatie\TypeScriptTransformer\Attributes\TypeScript;

#[TypeScript('DiscordFieldsData')]
class FieldsData extends Data
{
public function __construct(
public readonly string $name,
public readonly string $value,
public readonly ?bool $inline = null,
) {}
}
16 changes: 16 additions & 0 deletions app/Data/Discord/Embed/ThumbnailData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

namespace App\Data\Discord\Embed;

use Spatie\LaravelData\Data;
use Spatie\TypeScriptTransformer\Attributes\TypeScript;

#[TypeScript('DiscordThumbnailData')]
class ThumbnailData extends Data
{
public function __construct(
public readonly string $url,
) {}
}
36 changes: 21 additions & 15 deletions app/Http/Controllers/ApplicationController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
namespace App\Http\Controllers;

use App\Data\ApplicationData;
use App\Data\Discord\Component\ActionRowData;
use App\Data\Discord\Component\ButtonData;
use App\Data\Discord\Embed\EmbedData;
use App\Data\Requests\CreateApplicationRequest;
use App\Data\Requests\DeleteApplicationRequest;
use App\Data\Requests\ReadApplicationRequest;
Expand Down Expand Up @@ -322,28 +325,31 @@ public function sendButton(SendApplicationButtonRequest $request, Application $a
if (! $application->embed_title ||
! $application->embed_description ||
! $application->embed_color ||
! $application->embed_channel_id
! $application->embed_channel_id ||
! $application->embed_button_color ||
! $application->embed_button_text
) {
return false;
}

$data = [
'embeds' => [
[
'title' => $application->embed_title,
'description' => $application->embed_description,
'color' => hexdec(str_replace('#', '', $application->embed_color)),
],
new EmbedData(
title: $application->embed_title,
description: $application->embed_description,
color: (string) hexdec(str_replace('#', '', $application->embed_color)),
),
],
'components' => [
[
'type' => 1,
'components' => [[
'type' => 2, // button
'custom_id' => 'applicationSubmission-start-'.$application->id,
'style' => $application->embed_button_color,
'label' => $application->embed_button_text,
]],
],
new ActionRowData(
components: collect([
new ButtonData(
custom_id: 'applicationSubmission-start-'.$application->id,
style: $application->embed_button_color,
label: $application->embed_button_text,
),
])
),
],
];
$response = Http::discordBot()->post('/channels/'.$application->embed_channel_id.'/messages', $data);
Expand Down
6 changes: 1 addition & 5 deletions app/Http/Controllers/ServerContentController.php
Original file line number Diff line number Diff line change
Expand Up @@ -141,13 +141,9 @@ public function resend(ResendServerContentRequest $request): bool
*/
private function getMessages(string $message, Collection $serverContents): array
{
$mapFunction = function ($data) {
return '- ['.$data['name'].']('.$data['url'].")\n - ".$data['description'];
};

$messages = [
$message,
...array_map($mapFunction, $serverContents->toArray()),
...$serverContents->map(fn ($data) => '- ['.$data['name'].']('.$data['url'].")\n - ".$data['description']),
];
$chunkedMessages = [''];
$key = 0;
Expand Down
Loading