From 5942482690fcd368c26f2560cbaaaf0121b908d5 Mon Sep 17 00:00:00 2001 From: DerKlobold Date: Sun, 26 Nov 2023 18:56:50 +0100 Subject: [PATCH 1/4] feat: list discord voice channel dynamic data adds a helper function to provide dynamic data of voice and stage channels of a discord server --- .../src/apps/discord/dynamic-data/index.ts | 3 +- .../dynamic-data/list-voice-channels/index.ts | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/apps/discord/dynamic-data/list-voice-channels/index.ts diff --git a/packages/backend/src/apps/discord/dynamic-data/index.ts b/packages/backend/src/apps/discord/dynamic-data/index.ts index fae496fc..e018fb62 100644 --- a/packages/backend/src/apps/discord/dynamic-data/index.ts +++ b/packages/backend/src/apps/discord/dynamic-data/index.ts @@ -1,3 +1,4 @@ import listChannels from './list-channels'; +import listVoiceChannels from './list-voice-channels'; -export default [listChannels]; +export default [listChannels, listVoiceChannels]; diff --git a/packages/backend/src/apps/discord/dynamic-data/list-voice-channels/index.ts b/packages/backend/src/apps/discord/dynamic-data/list-voice-channels/index.ts new file mode 100644 index 00000000..74bad388 --- /dev/null +++ b/packages/backend/src/apps/discord/dynamic-data/list-voice-channels/index.ts @@ -0,0 +1,34 @@ +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; + +export default { + name: 'List voice channels', + key: 'listVoiceChannels', + + async run($: IGlobalVariable) { + const channels: { + data: IJSONObject[]; + error: IJSONObject | null; + } = { + data: [], + error: null, + }; + + const response = await $.http.get( + `/guilds/${$.auth.data.guildId}/channels` + ); + + channels.data = response.data + .filter((channel: IJSONObject) => { + // filter in voice and stage channels only + return channel.type === 2 || channel.type === 13; + }) + .map((channel: IJSONObject) => { + return { + value: channel.id, + name: channel.name, + }; + }); + + return channels; + }, +}; From a81c5164fc0d96df15cf8d2e9b70c9dce6964213 Mon Sep 17 00:00:00 2001 From: DerKlobold Date: Sun, 26 Nov 2023 18:58:09 +0100 Subject: [PATCH 2/4] feat: discord createNewEvent action adds the action of creating a new event on a discord server. provides some sort of logic-check to make sure the correct fields have been filled, depending of the type given. --- .../discord/actions/create-new-event/index.ts | 152 ++++++++++++++++++ .../backend/src/apps/discord/actions/index.ts | 3 +- 2 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/apps/discord/actions/create-new-event/index.ts diff --git a/packages/backend/src/apps/discord/actions/create-new-event/index.ts b/packages/backend/src/apps/discord/actions/create-new-event/index.ts new file mode 100644 index 00000000..aff73256 --- /dev/null +++ b/packages/backend/src/apps/discord/actions/create-new-event/index.ts @@ -0,0 +1,152 @@ +import defineAction from '../../../../helpers/define-action'; + +export default defineAction({ + name: 'Create a new event', + key: 'createNewEvent', + description: 'Creates a new event', + arguments: [ + { + label: 'Type', + key: 'entity_type', + type: 'dropdown' as const, + required: true, + description: 'The name of the event.', + variables: true, + options: [ + {label: 'Stage-Channel', value: 1}, + {label: 'Voicechannel', value: 2}, + {label: 'External', value: 3} + ] + }, + { + label: 'Privacy level', + key: 'privacy_level', + type: 'dropdown' as const, + required: true, + description: 'The privacy level of the event', + variables: true, + options: [ + {label: 'Public', value: 1}, + {label: 'Private', value: 2} + ], + }, + { + label: 'Name', + key: 'name', + type: 'string' as const, + required: true, + description: 'The name of the event.', + variables: true, + }, + { + label: 'Description', + key: 'description', + type: 'string' as const, + required: false, + description: 'The description of the event.', + variables: true, + }, + { + label: 'Start-Time', + key: 'scheduled_start_time', + type: 'string' as const, + required: true, + description: 'The time the event will start [ISO8601]', + variables: true, + }, + { + label: 'End-Time', + key: 'scheduled_end_time', + type: 'string' as const, + required: false, + description: 'The time the event will end [ISO8601]. This will be cleared if type is NOT EXTERNAL', + variables: true, + }, + { + label: 'Channel', + key: 'channel_id', + type: 'dropdown' as const, + required: false, + description: 'Pick a voice or stage channel to link the event to. This will be cleared if type is EXTERNAL', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listVoiceChannels', + }, + ], + }, + }, + { + label: 'Location', + key: 'location', + type: 'string' as const, + required: false, + description: 'The location of the event (1-100 characters). This will be cleared if type is NOT EXTERNAL', + variables: true, + }, + { + label: 'Image', + key: 'image', + type: 'string' as const, + required: false, + description: 'Image as DataURI scheme [data:image/;base64,BASE64_ENCODED__IMAGE_DATA]', + variables: true, + }, + ], + + async run($) { + + type entity_metadata = { + location: string + } + + type guild_event = { + channel_id: number, + name: string, + privacy_level: number, + scheduled_start_time: string, + scheduled_end_time?: string, + description?: string, + entity_type?: number, + entity_metadata?: entity_metadata, + image?: string, //data:image/jpeg;base64,BASE64_ENCODED_JPEG_IMAGE_DATA + } + + + const data : guild_event = { + channel_id: $.step.parameters.channel_id as number, + name: $.step.parameters.name as string, + privacy_level: $.step.parameters.privacy_level as number, + scheduled_start_time: $.step.parameters.scheduled_start_time as string, + scheduled_end_time: $.step.parameters.scheduled_end_time as string, + description: $.step.parameters.description as string, + entity_type: $.step.parameters.entity_type as number, + image: $.step.parameters.image as string, + }; + + // modifications depending on whether event type is set to EXTERNAL or not + if($.step.parameters.entity_type === 3) { + // entity_metadata must not be added unless type is EXTERNAL + const entity_metadata = { + location: $.step.parameters.location as string, + } + // add metadata, clear channel if EXTERNAL + data.entity_metadata = entity_metadata; + data.channel_id = null; + } else { + // clear end_time if it's not EXTERNAL + data.scheduled_end_time = null; + } + + const response = await $.http?.post( + `/guilds/${$.auth.data.guildId}/scheduled-events`, + data + ); + + $.setActionItem({ raw: response.data }); + }, +}); diff --git a/packages/backend/src/apps/discord/actions/index.ts b/packages/backend/src/apps/discord/actions/index.ts index ef5fef9b..bfac3994 100644 --- a/packages/backend/src/apps/discord/actions/index.ts +++ b/packages/backend/src/apps/discord/actions/index.ts @@ -1,3 +1,4 @@ import sendMessageToChannel from './send-message-to-channel'; +import createNewEvent from './create-new-event'; -export default [sendMessageToChannel]; +export default [sendMessageToChannel, createNewEvent]; \ No newline at end of file From 36f991b6f9376761a9c5ea7b82af7c36dd0e7dc4 Mon Sep 17 00:00:00 2001 From: DerKlobold Date: Sun, 26 Nov 2023 18:59:01 +0100 Subject: [PATCH 3/4] feat: discord createNewEvent action in docs adds a simple entry in the docs for the createNewEvent action --- packages/docs/pages/apps/discord/actions.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/docs/pages/apps/discord/actions.md b/packages/docs/pages/apps/discord/actions.md index f5798168..2e9913c9 100644 --- a/packages/docs/pages/apps/discord/actions.md +++ b/packages/docs/pages/apps/discord/actions.md @@ -3,6 +3,8 @@ favicon: /favicons/discord.svg items: - name: Send a message to channel desc: Sends a message to a specific channel you specify. + - name: Create a new event + desc: Creates a new server event. ---