Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Slack-Discord extra feature #176

Merged
merged 17 commits into from
Aug 30, 2023
Merged
1 change: 1 addition & 0 deletions app/Http/Requests/UserFormRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public function rules()
'use_captcha' => 'boolean',
'slack_webhook_url' => 'url|nullable',
'discord_webhook_url' => 'url|nullable',
'notification_settings' => 'nullable',

// Customization
'theme' => ['required',Rule::in(Form::THEMES)],
Expand Down
1 change: 1 addition & 0 deletions app/Http/Resources/FormResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public function toArray($request)
'notification_emails' => $this->notification_emails,
'slack_webhook_url' => $this->slack_webhook_url,
'discord_webhook_url' => $this->discord_webhook_url,
'notification_settings' => $this->notification_settings,
'removed_properties' => $this->removed_properties,
'last_edited_human' => $this->updated_at?->diffForHumans(),
'seo_meta' => $this->seo_meta
Expand Down
9 changes: 4 additions & 5 deletions app/Models/Forms/Form.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ class Form extends Model
'notifications_include_submission',
'slack_webhook_url',
'discord_webhook_url',
'notification_settings',

// integrations
'webhook_url',
Expand Down Expand Up @@ -83,10 +84,7 @@ class Form extends Model

// Security & Privacy
'can_be_indexed',
'password',

// Custom SEO
'seo_meta'
'password'
];

protected $casts = [
Expand All @@ -95,7 +93,8 @@ class Form extends Model
'closes_at' => 'datetime',
'tags' => 'array',
'removed_properties' => 'array',
'seo_meta' => 'object'
'seo_meta' => 'object',
'notification_settings' => 'object'
];

protected $appends = [
Expand Down
99 changes: 51 additions & 48 deletions app/Service/Forms/Webhooks/DiscordHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
namespace App\Service\Forms\Webhooks;

use App\Service\Forms\FormSubmissionFormatter;
use Illuminate\Support\Str;
use Vinkla\Hashids\Facades\Hashids;
use Illuminate\Support\Arr;

class DiscordHandler extends AbstractWebhookHandler
{
Expand All @@ -20,58 +21,60 @@ protected function getWebhookUrl(): ?string

protected function getWebhookData(): array
{
$submissionString = "";
$formatter = (new FormSubmissionFormatter($this->form, $this->data))->outputStringsOnly();
$settings = (array) Arr::get((array)$this->form->notification_settings, 'discord', []);
$externalLinks = [];
if(Arr::get($settings, 'link_open_form', true)){
$externalLinks[] = '[**🔗 Open Form**](' . $this->form->share_url . ')';
}
if(Arr::get($settings, 'link_edit_form', true)){
$editFormURL = url('forms/' . $this->form->slug . '/show');
$externalLinks[] = '[**✍️ Edit Form**](' . $editFormURL . ')';
}
if (Arr::get($settings, 'link_edit_submission', true) && $this->form->editable_submissions) {
$submissionId = Hashids::encode($this->data['submission_id']);
$externalLinks[] = '[**✍️ ' . $this->form->editable_submissions_button_text . '**](' . $this->form->share_url . '?submission_id=' . $submissionId . ')';
}

foreach ($formatter->getFieldsWithValue() as $field) {
$tmpVal = is_array($field['value']) ? implode(",", $field['value']) : $field['value'];
$submissionString .= "**" . ucfirst($field['name']) . "**: `" . $tmpVal . "`\n";
$color = hexdec(str_replace('#', '', $this->form->color));
$blocks = [];
if(Arr::get($settings, 'include_submission_data', true)){
$submissionString = "";
$formatter = (new FormSubmissionFormatter($this->form, $this->data))->outputStringsOnly();
foreach ($formatter->getFieldsWithValue() as $field) {
$tmpVal = is_array($field['value']) ? implode(",", $field['value']) : $field['value'];
$submissionString .= "**" . ucfirst($field['name']) . "**: " . $tmpVal . "\n";
}
$blocks[] = [
"type" => "rich",
"color" => $color,
"description" => $submissionString
];
}

$form_name = $this->form->title;
$formURL = url("forms/" . $this->form->slug . "/show/submissions");
if(Arr::get($settings, 'views_submissions_count', true)){
$countString = '**👀 Views**: ' . (string)$this->form->views_count . " \n";
$countString .= '**🖊️ Submissions**: ' . (string)$this->form->submissions_count;
$blocks[] = [
"type" => "rich",
"color" => $color,
"description" => $countString
];
}

if(count($externalLinks) > 0){
$blocks[] = [
"type" => "rich",
"color" => $color,
"description" => implode(' - ', $externalLinks)
];
}

return [
"content" => "@here We have received a new submission for **$form_name**",
"username" => config('app.name'),
"avatar_url" => asset('img/logo.png'),
"tts" => false,
"embeds" => [
[
"title" => "🔗 Go to $form_name",

"type" => "rich",

"description" => $submissionString,

"url" => $formURL,

"color" => hexdec(str_replace('#', '', $this->form->color)),

"footer" => [
"text" => config('app.name'),
"icon_url" => asset('img/logo.png'),
],

"author" => [
"name" => config('app.name'),
"url" => config('app.url'),
],

"fields" => [
[
"name" => "Views 👀",
"value" => (string)$this->form->views_count,
"inline" => true
],
[
"name" => "Submissions 🖊️",
"value" => (string)$this->form->submissions_count,
"inline" => true
]
]
]
]
'content' => 'New submission for your form **' . $this->form->title . '**',
'tts' => false,
'username' => config('app.name'),
'avatar_url' => asset('img/logo.png'),
'embeds' => $blocks
];
}

Expand Down
96 changes: 59 additions & 37 deletions app/Service/Forms/Webhooks/SlackHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
namespace App\Service\Forms\Webhooks;

use App\Service\Forms\FormSubmissionFormatter;
use Illuminate\Support\Str;
use Vinkla\Hashids\Facades\Hashids;
use Illuminate\Support\Arr;

class SlackHandler extends AbstractWebhookHandler
{
Expand All @@ -21,48 +21,70 @@ protected function getWebhookUrl(): ?string

protected function getWebhookData(): array
{
$submissionString = '';
$formatter = (new FormSubmissionFormatter($this->form, $this->data))->outputStringsOnly();
foreach ($formatter->getFieldsWithValue() as $field) {
$tmpVal = is_array($field['value']) ? implode(',', $field['value']) : $field['value'];
$submissionString .= '>*' . ucfirst($field['name']) . '*: ' . $tmpVal . " \n";
$settings = (array) Arr::get((array)$this->form->notification_settings, 'slack', []);
$externalLinks = [];
if(Arr::get($settings, 'link_open_form', true)){
$externalLinks[] = '*<' . $this->form->share_url . '|🔗 Open Form>*';
}
if(Arr::get($settings, 'link_edit_form', true)){
$editFormURL = url('forms/' . $this->form->slug . '/show');
$externalLinks[] = '*<' . $editFormURL . '|✍️ Edit Form>*';
}
if (Arr::get($settings, 'link_edit_submission', true) && $this->form->editable_submissions) {
$submissionId = Hashids::encode($this->data['submission_id']);
$externalLinks[] = '*<' . $this->form->share_url . '?submission_id=' . $submissionId . '|✍️ ' . $this->form->editable_submissions_button_text . '>*';
}

$formURL = url('forms/' . $this->form->slug);
$editFormURL = url('forms/' . $this->form->slug . '/show');
$submissionId = Hashids::encode($this->data['submission_id']);
$externalLinks = [
'*<' . $formURL . '|🔗 Open Form>*',
'*<' . $editFormURL . '|✍️ Edit Form>*'
$blocks = [
[
'type' => 'section',
'text' => [
'type' => 'mrkdwn',
'text' => 'New submission for your form *' . $this->form->title . '*',
]
]
];
if ($this->form->editable_submissions) {
$externalLinks[] = '*<' . $this->form->share_url . '?submission_id=' . $submissionId . '|✍️ ' . $this->form->editable_submissions_button_text . '>*';

if(Arr::get($settings, 'include_submission_data', true)){
$submissionString = '';
$formatter = (new FormSubmissionFormatter($this->form, $this->data))->outputStringsOnly();
foreach ($formatter->getFieldsWithValue() as $field) {
$tmpVal = is_array($field['value']) ? implode(',', $field['value']) : $field['value'];
$submissionString .= '>*' . ucfirst($field['name']) . '*: ' . $tmpVal . " \n";
}
$blocks[] = [
'type' => 'section',
'text' => [
'type' => 'mrkdwn',
'text' => $submissionString,
]
];
}

if(Arr::get($settings, 'views_submissions_count', true)){
$countString = '*👀 Views*: ' . (string)$this->form->views_count . " \n";
$countString .= '*🖊️ Submissions*: ' . (string)$this->form->submissions_count;
$blocks[] = [
'type' => 'section',
'text' => [
'type' => 'mrkdwn',
'text' => $countString,
]
];
}

if(count($externalLinks) > 0){
$blocks[] = [
'type' => 'section',
'text' => [
'type' => 'mrkdwn',
'text' => implode(' ', $externalLinks),
]
];
}

return [
'blocks' => [
[
'type' => 'section',
'text' => [
'type' => 'mrkdwn',
'text' => 'New submission for your form *<' . $formURL . '|' . $this->form->title . ':>*',
],
],
[
'type' => 'section',
'text' => [
'type' => 'mrkdwn',
'text' => $submissionString,
],
],
[
'type' => 'section',
'text' => [
'type' => 'mrkdwn',
'text' => implode(' ', $externalLinks),
],
],
],
'blocks' => $blocks
];
}

Expand Down
2 changes: 2 additions & 0 deletions database/factories/FormFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ public function definition()
'password' => false,
'tags' => [],
'slack_webhook_url' => null,
'discord_webhook_url' => null,
'notification_settings' => [],
'editable_submissions_button_text' => 'Edit submission',
'confetti_on_submission' => false,
'seo_meta' => [],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('forms', function (Blueprint $table) {
$table->json('notification_settings')->default('{}')->nullable(true);
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('forms', function (Blueprint $table) {
$table->dropColumn('notification_settings');
});
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -28,23 +28,29 @@
<toggle-switch-input name="notifies_discord" :form="form" class="mt-4"
label="Receive a Discord notification on submission"
/>
<text-input v-if="form.notifies_discord" name="discord_webhook_url" :form="form" class="mt-4"
label="Discord webhook url" help="help"
>
<template #help>
Receive a discord message on each form submission.
<a href="https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks" target="_blank">Click here</a> to learn how to get a discord webhook url.
</template>
</text-input>
<template v-if="form.notifies_discord">
<text-input name="discord_webhook_url" :form="form" class="mt-4"
label="Discord webhook url" help="help"
>
<template #help>
Receive a discord message on each form submission.
<a href="https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks" target="_blank">Click
here</a> to learn how to get a discord webhook url.
</template>
</text-input>
<h4 class="font-bold mt-4">Discord message actions</h4>
<form-notifications-message-actions v-model="form.notification_settings.discord" />
</template>
</modal>
</div>
</template>

<script>
import ProTag from '../../../../../common/ProTag.vue'
import FormNotificationsMessageActions from './FormNotificationsMessageActions.vue'

export default {
components: { ProTag },
components: { ProTag, FormNotificationsMessageActions },
props: {},
data () {
return {
Expand Down
Loading