From 66946aa76948c20cff8997f53fec770e4b344bc9 Mon Sep 17 00:00:00 2001 From: Filip Hoffmann Date: Sat, 28 Jun 2025 18:56:37 +0200 Subject: [PATCH] start thread in media --- src/grom/channel/guild/forum.gleam | 112 ++++++++++++++- src/grom/channel/guild/media.gleam | 135 ++++++++++++++++++ .../application_command/command_option.gleam | 1 - src/grom/message/attachment.gleam | 10 ++ src/grom/message/embed.gleam | 2 - 5 files changed, 254 insertions(+), 6 deletions(-) diff --git a/src/grom/channel/guild/forum.gleam b/src/grom/channel/guild/forum.gleam index 86bebaa..b2d46b4 100644 --- a/src/grom/channel/guild/forum.gleam +++ b/src/grom/channel/guild/forum.gleam @@ -14,7 +14,6 @@ import grom/file.{type File} import grom/internal/flags import grom/internal/rest import grom/internal/time_duration -import grom/message import grom/message/allowed_mentions.{type AllowedMentions} import grom/message/attachment import grom/message/component.{type Component} @@ -51,10 +50,15 @@ pub opaque type StartThreadMessage { components: Option(List(Component)), sticker_ids: Option(List(String)), attachments: Option(List(attachment.Create)), - flags: Option(List(message.Flag)), + flags: Option(List(StartThreadMessageFlag)), ) } +pub type StartThreadMessageFlag { + SuppressEmbeds + SuppressNotifications +} + pub type Flag { RequiresTag } @@ -81,6 +85,14 @@ pub fn bits_flags() -> List(#(Int, Flag)) { [#(int.bitwise_shift_left(1, 4), RequiresTag)] } +@internal +pub fn bits_start_thread_message_flags() -> List(#(Int, StartThreadMessageFlag)) { + [ + #(int.bitwise_shift_left(1, 2), SuppressEmbeds), + #(int.bitwise_shift_left(1, 12), SuppressNotifications), + ] +} + // DECODERS -------------------------------------------------------------------- @internal @@ -244,7 +256,7 @@ pub fn start_thread_message_to_json(message: StartThreadMessage) -> Json { #( "flags", flags - |> flags.to_int(message.bits_flags()) + |> flags.to_int(bits_start_thread_message_flags()) |> json.int, ), ] @@ -299,3 +311,97 @@ pub fn start_thread( |> json.parse(using: thread.decoder()) |> result.map_error(error.CouldNotDecode) } + +pub fn new_start_thread( + name: String, + message: StartThreadMessage, +) -> StartThread { + StartThread(name, None, None, message, None, None) +} + +pub fn start_thread_with_auto_archive_duration( + start_thread: StartThread, + auto_archive_duration: Duration, +) -> StartThread { + StartThread( + ..start_thread, + auto_archive_duration: Some(auto_archive_duration), + ) +} + +pub fn start_thread_with_rate_limit_per_user( + start_thread: StartThread, + rate_limit_per_user: Duration, +) -> StartThread { + StartThread(..start_thread, rate_limit_per_user: Some(rate_limit_per_user)) +} + +pub fn start_thread_with_applied_tags( + start_thread: StartThread, + ids applied_tags_ids: List(String), +) -> StartThread { + StartThread(..start_thread, applied_tags_ids: Some(applied_tags_ids)) +} + +pub fn start_thread_with_files( + start_thread: StartThread, + files: List(File), +) -> StartThread { + StartThread(..start_thread, files: Some(files)) +} + +pub fn new_start_thread_message() -> StartThreadMessage { + StartThreadMessage(None, None, None, None, None, None, None) +} + +pub fn start_thread_message_with_content( + start_thread_message: StartThreadMessage, + content: String, +) -> StartThreadMessage { + StartThreadMessage(..start_thread_message, content: Some(content)) +} + +pub fn start_thread_message_with_embeds( + start_thread_message: StartThreadMessage, + embeds: List(Embed), +) -> StartThreadMessage { + StartThreadMessage(..start_thread_message, embeds: Some(embeds)) +} + +pub fn start_thread_message_with_allowed_mentions( + start_thread_message: StartThreadMessage, + allowed_mentions: AllowedMentions, +) -> StartThreadMessage { + StartThreadMessage( + ..start_thread_message, + allowed_mentions: Some(allowed_mentions), + ) +} + +pub fn start_thread_message_with_components( + start_thread_message: StartThreadMessage, + components: List(Component), +) -> StartThreadMessage { + StartThreadMessage(..start_thread_message, components: Some(components)) +} + +pub fn start_thread_message_with_stickers( + start_thread_message: StartThreadMessage, + ids sticker_ids: List(String), +) -> StartThreadMessage { + StartThreadMessage(..start_thread_message, sticker_ids: Some(sticker_ids)) +} + +pub fn start_thread_message_with_attachments( + start_thread_message: StartThreadMessage, + attachments: List(attachment.Create), +) -> StartThreadMessage { + StartThreadMessage(..start_thread_message, attachments: Some(attachments)) +} + +pub fn start_thread_message_with_flags( + start_thread_message: StartThreadMessage, + flags: List(StartThreadMessageFlag), +) -> StartThreadMessage { + StartThreadMessage(..start_thread_message, flags: Some(flags)) +} diff --git a/src/grom/channel/guild/media.gleam b/src/grom/channel/guild/media.gleam index c41c2cb..888dc3e 100644 --- a/src/grom/channel/guild/media.gleam +++ b/src/grom/channel/guild/media.gleam @@ -1,4 +1,15 @@ import gleam/int +import gleam/option.{type Option, None} +import gleam/time/duration.{type Duration} +import grom/channel/guild/forum +import grom/channel/guild/thread.{type Thread} +import grom/client.{type Client} +import grom/error.{type Error} +import grom/file.{type File} +import grom/message/allowed_mentions.{type AllowedMentions} +import grom/message/attachment +import grom/message/component.{type Component} +import grom/message/embed.{type Embed} // TYPES ----------------------------------------------------------------------- @@ -7,6 +18,15 @@ pub type Flag { HideMediaDownloadOptions } +pub type StartThread = + forum.StartThread + +pub type StartThreadMessage = + forum.StartThreadMessage + +pub type StartThreadMessageFlag = + forum.StartThreadMessageFlag + // FLAGS ----------------------------------------------------------------------- @internal @@ -16,3 +36,118 @@ pub fn bits_flags() -> List(#(Int, Flag)) { #(int.bitwise_shift_left(1, 15), HideMediaDownloadOptions), ] } + +// PUBLIC API FUNCTIONS -------------------------------------------------------- + +pub fn start_thread( + client: Client, + in channel_id: String, + with start_thread: StartThread, + because reason: Option(String), +) -> Result(Thread, Error) { + forum.start_thread( + client, + in: channel_id, + with: start_thread, + because: reason, + ) +} + +pub fn new_start_thread( + name: String, + message: StartThreadMessage, +) -> StartThread { + forum.new_start_thread(name, message) +} + +pub fn start_thread_with_auto_archive_duration( + start_thread: StartThread, + auto_archive_duration: Duration, +) -> StartThread { + start_thread + |> forum.start_thread_with_auto_archive_duration(auto_archive_duration) +} + +pub fn start_thread_with_rate_limit_per_user( + start_thread: StartThread, + rate_limit_per_user: Duration, +) -> StartThread { + start_thread + |> forum.start_thread_with_rate_limit_per_user(rate_limit_per_user) +} + +pub fn start_thread_with_applied_tags( + start_thread: StartThread, + ids applied_tags_ids: List(String), +) -> StartThread { + start_thread + |> forum.start_thread_with_applied_tags(applied_tags_ids) +} + +pub fn start_thread_with_files( + start_thread: StartThread, + files: List(File), +) -> StartThread { + start_thread + |> forum.start_thread_with_files(files) +} + +pub fn new_start_thread_message() -> StartThreadMessage { + forum.new_start_thread_message() +} + +pub fn start_thread_message_with_content( + start_thread_message: StartThreadMessage, + content: String, +) -> StartThreadMessage { + start_thread_message + |> forum.start_thread_message_with_content(content) +} + +pub fn start_thread_message_with_embeds( + start_thread_message: StartThreadMessage, + embeds: List(Embed), +) -> StartThreadMessage { + start_thread_message + |> forum.start_thread_message_with_embeds(embeds) +} + +pub fn start_thread_message_with_allowed_mentions( + start_thread_message: StartThreadMessage, + allowed_mentions: AllowedMentions, +) -> StartThreadMessage { + start_thread_message + |> forum.start_thread_message_with_allowed_mentions(allowed_mentions) +} + +pub fn start_thread_message_with_components( + start_thread_message: StartThreadMessage, + components: List(Component), +) -> StartThreadMessage { + start_thread_message + |> forum.start_thread_message_with_components(components) +} + +pub fn start_thread_message_with_stickers( + start_thread_message: StartThreadMessage, + ids sticker_ids: List(String), +) -> StartThreadMessage { + start_thread_message + |> forum.start_thread_message_with_stickers(sticker_ids) +} + +pub fn start_thread_message_with_attachments( + start_thread_message: StartThreadMessage, + attachments: List(attachment.Create), +) -> StartThreadMessage { + start_thread_message + |> forum.start_thread_message_with_attachments(attachments) +} + +pub fn start_thread_message_with_flags( + start_thread_message: StartThreadMessage, + flags: List(StartThreadMessageFlag), +) -> StartThreadMessage { + start_thread_message + |> forum.start_thread_message_with_flags(flags) +} diff --git a/src/grom/interaction/application_command/command_option.gleam b/src/grom/interaction/application_command/command_option.gleam index 9b11ae8..f85a971 100644 --- a/src/grom/interaction/application_command/command_option.gleam +++ b/src/grom/interaction/application_command/command_option.gleam @@ -5,7 +5,6 @@ import gleam/dict.{type Dict} import gleam/dynamic/decode import gleam/option.{type Option, None} -import grom/guild import grom/interaction/application_command/choice.{type Choice} // TYPES ----------------------------------------------------------------------- diff --git a/src/grom/message/attachment.gleam b/src/grom/message/attachment.gleam index e65d017..5b8c982 100644 --- a/src/grom/message/attachment.gleam +++ b/src/grom/message/attachment.gleam @@ -121,3 +121,13 @@ pub fn create_to_json(create: Create) -> Json { |> list.flatten |> json.object } + +// PUBLIC API FUNCTIONS -------------------------------------------------------- + +pub fn new_create(filename: String) -> Create { + Create(filename, description: None) +} + +pub fn create_with_description(create: Create, description: String) -> Create { + Create(..create, description: Some(description)) +} diff --git a/src/grom/message/embed.gleam b/src/grom/message/embed.gleam index bd7d013..ad127e5 100644 --- a/src/grom/message/embed.gleam +++ b/src/grom/message/embed.gleam @@ -2,9 +2,7 @@ import gleam/dynamic/decode import gleam/json.{type Json} import gleam/list import gleam/option.{type Option, None, Some} -import gleam/time/duration import gleam/time/timestamp.{type Timestamp} -import grom/guild import grom/internal/time_rfc3339 // TYPES ----------------------------------------------------------------------- -- 2.51.2