diff --git a/packages/backend/src/apps/discord/actions/change-scheduled-event/index.js b/packages/backend/src/apps/discord/actions/change-scheduled-event/index.js new file mode 100644 index 00000000..0f4bb2da --- /dev/null +++ b/packages/backend/src/apps/discord/actions/change-scheduled-event/index.js @@ -0,0 +1,120 @@ +import defineAction from '../../../../helpers/define-action.js'; + +export default defineAction({ + name: 'Change a scheduled event', + key: 'changeScheduledEvent', + description: 'Changes a scheduled event', + arguments: [ + { + label: 'Scheduled Event', + key: 'scheduledEventId', + type: 'dropdown', + required: true, + description: '', + variables: false, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listScheduledEvents', + }, + ], + }, + }, + { + label: 'Status', + key: 'status', + type: 'dropdown', + required: false, + description: + 'After the status has been changed to COMPLETED or CANCELED, it becomes immutable and cannot be modified further.', + variables: true, + options: [ + { label: 'SCHEDULED', value: 1 }, + { label: 'ACTIVE', value: 2 }, + { label: 'COMPLETED', value: 3 }, + { label: 'CANCELED', value: 4 }, + ], + }, + { + label: 'Type', + key: 'entityType', + type: 'dropdown', + required: true, + variables: true, + options: [ + { label: 'Stage channel', value: 1 }, + { label: 'Voice channel', value: 2 }, + { label: 'External', value: 3 }, + ], + additionalFields: { + type: 'query', + name: 'getDynamicFields', + arguments: [ + { + name: 'key', + value: 'listScheduledEventFieldsForChange', + }, + { + name: 'parameters.entityType', + value: '{parameters.entityType}', + }, + ], + }, + }, + { + label: 'Name', + key: 'name', + type: 'string', + required: false, + variables: true, + }, + { + label: 'Description', + key: 'description', + type: 'string', + required: false, + variables: true, + }, + { + label: 'Image', + key: 'image', + type: 'string', + required: false, + description: + 'Image as DataURI scheme [data:image/;base64,BASE64_ENCODED__IMAGE_DATA]', + variables: true, + }, + ], + + async run($) { + const data = { + channel_id: $.step.parameters.channel_id, + name: $.step.parameters.name, + scheduled_start_time: $.step.parameters.scheduledStartTime, + scheduled_end_time: $.step.parameters.scheduledEndTime, + description: $.step.parameters.description, + entity_type: $.step.parameters.entityType, + image: $.step.parameters.image, + }; + + const isExternal = $.step.parameters.entityType === 3; + + if (isExternal) { + data.entity_metadata = { + location: $.step.parameters.location, + }; + + data.channel_id = null; + } + + const response = await $.http?.patch( + `/guilds/${$.auth.data.guildId}/scheduled-events/${$.step.parameters.scheduledEventId}`, + data + ); + + $.setActionItem({ raw: response.data }); + }, +}); diff --git a/packages/backend/src/apps/discord/actions/index.js b/packages/backend/src/apps/discord/actions/index.js index 598e7b29..4e9cc625 100644 --- a/packages/backend/src/apps/discord/actions/index.js +++ b/packages/backend/src/apps/discord/actions/index.js @@ -1,4 +1,9 @@ +import changeScheduledEvent from './change-scheduled-event/index.js'; import sendMessageToChannel from './send-message-to-channel/index.js'; import createScheduledEvent from './create-scheduled-event/index.js'; -export default [sendMessageToChannel, createScheduledEvent]; +export default [ + changeScheduledEvent, + sendMessageToChannel, + createScheduledEvent, +]; diff --git a/packages/backend/src/apps/discord/dynamic-data/index.js b/packages/backend/src/apps/discord/dynamic-data/index.js index d6a7cec1..96644a54 100644 --- a/packages/backend/src/apps/discord/dynamic-data/index.js +++ b/packages/backend/src/apps/discord/dynamic-data/index.js @@ -1,4 +1,5 @@ import listChannels from './list-channels/index.js'; +import listScheduledEvents from './list-scheduled-events/index.js'; import listVoiceChannels from './list-voice-channels/index.js'; -export default [listChannels, listVoiceChannels]; +export default [listChannels, listScheduledEvents, listVoiceChannels]; diff --git a/packages/backend/src/apps/discord/dynamic-data/list-scheduled-events/index.js b/packages/backend/src/apps/discord/dynamic-data/list-scheduled-events/index.js new file mode 100644 index 00000000..4cdea329 --- /dev/null +++ b/packages/backend/src/apps/discord/dynamic-data/list-scheduled-events/index.js @@ -0,0 +1,24 @@ +export default { + name: 'List scheduled events', + key: 'listScheduledEvents', + + async run($) { + const scheduledEvents = { + data: [], + error: null, + }; + + const response = await $.http.get( + `/guilds/${$.auth.data.guildId}/scheduled-events` + ); + + scheduledEvents.data = response.data.map((scheduledEvent) => { + return { + value: scheduledEvent.id, + name: scheduledEvent.name, + }; + }); + + return scheduledEvents; + }, +}; diff --git a/packages/backend/src/apps/discord/dynamic-fields/index.js b/packages/backend/src/apps/discord/dynamic-fields/index.js index 889acb3e..9a4d9fcc 100644 --- a/packages/backend/src/apps/discord/dynamic-fields/index.js +++ b/packages/backend/src/apps/discord/dynamic-fields/index.js @@ -1,3 +1,7 @@ import listExternalScheduledEventFields from './list-external-scheduled-event-fields/index.js'; +import listScheduledEventFieldsForChange from './list-scheduled-event-fields-for-change/index.js'; -export default [listExternalScheduledEventFields]; +export default [ + listExternalScheduledEventFields, + listScheduledEventFieldsForChange, +]; diff --git a/packages/backend/src/apps/discord/dynamic-fields/list-scheduled-event-fields-for-change/index.js b/packages/backend/src/apps/discord/dynamic-fields/list-scheduled-event-fields-for-change/index.js new file mode 100644 index 00000000..0d516878 --- /dev/null +++ b/packages/backend/src/apps/discord/dynamic-fields/list-scheduled-event-fields-for-change/index.js @@ -0,0 +1,87 @@ +export default { + name: 'List scheduled event fields for change', + key: 'listScheduledEventFieldsForChange', + + async run($) { + const isExternal = $.step.parameters.entityType === 3; + + if (isExternal) { + return [ + { + label: 'Location', + key: 'location', + type: 'string', + required: true, + description: + 'The location of the event (1-100 characters). This will be omitted if type is NOT EXTERNAL', + variables: true, + }, + { + label: 'Start-Time', + key: 'scheduledStartTime', + type: 'string', + required: false, + description: 'The time the event will start [ISO8601]', + variables: true, + }, + { + label: 'End-Time', + key: 'scheduledEndTime', + type: 'string', + required: true, + description: + 'The time the event will end [ISO8601]. This will be omitted if type is NOT EXTERNAL', + variables: true, + }, + ]; + } + + return [ + { + label: 'Channel', + key: 'channel_id', + type: 'dropdown', + required: true, + description: + 'Pick a voice or stage channel to link the event to. This will be omitted if type is EXTERNAL', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listVoiceChannels', + }, + ], + }, + }, + { + label: 'Location', + key: 'location', + type: 'string', + required: false, + description: + 'The location of the event (1-100 characters). This will be omitted if type is NOT EXTERNAL', + variables: true, + }, + { + label: 'Start-Time', + key: 'scheduledStartTime', + type: 'string', + required: false, + description: 'The time the event will start [ISO8601]', + variables: true, + }, + { + label: 'End-Time', + key: 'scheduledEndTime', + type: 'string', + required: false, + description: + 'The time the event will end [ISO8601]. This will be omitted if type is NOT EXTERNAL', + variables: true, + }, + ]; + }, +}; diff --git a/packages/docs/pages/apps/discord/actions.md b/packages/docs/pages/apps/discord/actions.md index 111a90e0..43bf5146 100644 --- a/packages/docs/pages/apps/discord/actions.md +++ b/packages/docs/pages/apps/discord/actions.md @@ -1,6 +1,8 @@ --- favicon: /favicons/discord.svg items: + - name: Change a scheduled event + desc: Changes a scheduled event. - name: Send a message to channel desc: Sends a message to a specific channel you specify. - name: Create a scheduled event