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

Use EditInteractionResponse consistently to edit interaction messages #3069

Open
wants to merge 166 commits into
base: next
Choose a base branch
from

Conversation

DPlayer234
Copy link

Implements option 2 in #3068. Will still need feedback on whether this is the appropriate approach, but it was simple enough to implement.

This changes CreateInteractionResponse::UpdateMessage and response follow-up edits to use EditInteractionResponse. This makes message edits more consistent across all situations, with the primary intent of being able to keep existing attachments.

For follow-up edits, this should lead to a more consistent interface with the actual Discord docs as well.

Notes

For UpdateMessage, this omits 3 fields: tts (no effect on edits), poll (disallowed), and flags, which is actually needed for "suppress embeds".
While there doesn't seem to be any point in exposing tts and poll*, it appears that Discord respects the "suppress embed" flags even on other edits that are documented as using the Edit Webhook Message format, which itself does not have any flags documented. With this in mind, we could:

  1. Leave it as is and omit the field. (I don't like this.)
  2. Add flags to EditInteractionResponse.
  3. Add a new edit builder for just CreateInteractionResponse::UpdateMessage that only differs insofar that it has a flags field to match the documented API exactly.

*Edit Webhook Message does actually document a poll field, but it is only valid in the defer-then-edit case. This PR doesn't disallow sending polls in any previously supported situation, so adding this field should probably its own PR.

GnomedDev and others added 30 commits November 15, 2024 19:08
…erenity-rs#2646)

This avoids having to allocate to store fixed length (replaced with normal
array) or fixed capacity (replaced with `ArrayVec`) collections as vectors for
the purposes of putting them through the `Request` plumbing.

Slight behavioral change - before, setting `params` to `Some(vec![])`
would still append a question mark to the end of the url. Now, we check
if the params array `is_empty` instead of `is_some`, so the question
mark won't be appended if the params list is empty.

Co-authored-by: Michael Krasnitski <[email protected]>
These are unnecessary. Accepting `impl Into<Arc<T>>` allows passing either `T` or `Arc<T>`.
This trades a heap allocation for messages sent along with thread
creation for `Message`'s inline size dropping from 1176 bytes to 760
bytes,
…l models (serenity-rs#2656)

This shrinks type sizes by a lot; however, it makes the user experience slightly
different:

- `FixedString` must be converted to String with `.into()` or `.into_string()`
  before it can be pushed to, but dereferences to `&str` as is.
- `FixedArray` must be converted to `Vec` with `.into()` or `.into_vec()`
  before it can be pushed to, but dereferences to `&[T]` as is.

The crate of these types is currently a Git dependency, but this is fine for
the `next` branch. It needs some basic testing, which Serenity is perfect for,
before a release will be made to crates.io.
…enity-rs#2668)

This commit:

- switches from `u64` to `i64` in `CreateCommandOption::min_int_value` and
`CreateCommandOption::max_int_value` to accommodate negative integers in
Discord's integer range (between -2^53 and 2^53). Values outside this
range will cause Discord's API to return an error.
- switches from `i32` to `i64` in `CreateCommandOption::add_int_choice` and
`CreateCommandOption::add_int_choice_localized` to accommodate Discord's
complete integer range (between -2^53 and 2^53). Values outside this
range will cause Discord's API to return an error.
This cache was just duplicating information already present in `Guild::members`
and therefore should be removed.

This saves around 700 MBs for my bot (pre-`FixedString`).

This has to refactor `utils::content_safe` to always take a `Guild` instead
of`Cache`, but in practice it was mostly pulling from the guild cache anyway
and this means it is more likely to respect nicknames and other information,
while losing the ability to clean mentions from DMs, which do not matter.
`Embed::fields` previously had to stay as a `Vec` due to `CreateEmbed` wrapping
around it, but by implementing `Serialize` manually we can overwrite the
`Embed::fields` with a normal `Vec`, for a small performance hit on
serialization while saving some space for all stored `Embed`s.
Simply missed these when finding and replacing.
This uses the `bool_to_bitflags` macro to remove boolean (and optional boolean)
fields from structs and pack them into a bitflags invocation, so a struct with
many bools will only use one or two bytes, instead of a byte per bool as is.

This requires using getters and setters for the boolean fields, which changes
user experience and is hard to document, which is a significant downside, but
is such a nice change and will just become more and more efficient as time goes
on.
…rs#2681)

This swaps fields that store `Option<Int>` for `Option<NonMaxInt>` where the
maximum value would be ludicrous. Since `nonmax` uses `NonZero` internally,
this gives us niche optimisations, so model sizes can drop some more.

I have had to include a workaround for [serenity-rs#17] in `optional_string` by making my
own `TryFrom<u64>`, so that should be removable once that issue is fixed.

[serenity-rs#17]: LPGhatguy/nonmax#17
A couple of clippy bugs have been fixed and I have shrunk model
sizes enough to make `clippy::large_enum_variant` go away.
A discord bot library should not be using the tools reserved for low
level OS interaction/data structure libraries.
Discord seems to internally default Ids to 0, which is a bug whenever
exposed, but this makes ID parsing more resilient. I also took the
liberty to remove the `From<NonZero*>` implementations, to prevent future
headaches, as it was impossible to not break public API as we exposed
`NonZero` in `*Id::parse`.
…nity-rs#2694)

This,
1. shrinks the size of Request, when copied around, as it doesn't have
to store the max capacity at all times
2. shrinks llvm-lines (compile time metric) for my bot in debug from
`1,153,519` to `1,131,480` as no monomorphisation has to be performed
for `MAX_PARAMS`.
Follow-up to serenity-rs#2694.

When `Request::params` was made into an ArrayVec, the `Option` around it
was removed in order to avoid having to add a turbofish on `None` to
specify the value of `MAX_PARAMS`. Also, `Request::new` also needed to
be changed so that the value of `MAX_PARAMS` could be inferred. Now that
the field is a slice again, we can wrap it in `Option` again (at no cost
to size, thanks to niche opts).

We ensure we never store the redundant `Some(&[])` by checking for an
empty slice and storing `None` instead. This way, we ensure we never
read an empty slice out of the `Some` variant.
The instrument macros generate 2% of Serenity's release mode llvm-lines,
and are proc-macros so hurt compile time in that way, so this limits
them to opt-in. This commit also fixes the issues that the instrument macro
was hiding, such as results that didn't ever error and missing
documentation.
This signature is hard to use as `None` cannot infer the type of the
generic. I also replaced `Option<u8>` with `Option<NonMaxU8>` as it's
more efficient and will make the user think of the maximum value.
…nity-rs#2698)

This removes inefficient `IntoIterator` generics and instead takes what is
actually required. I also reworked `reorder_channels` to allow for keeping the
generic, as it actually does only just need iterator semantics.
Previously, someone assumed that `Ratelimiter` was going to be cloned, so
put a ton of `Arc`s everywhere. This was unneeded, and before dashmap,
so the buckets were also stored massively inefficiently. This fixes all
that.

I had to shuffle around the `Ratelimit` methods a little bit to return
their sleep time instead of sleeping themselves, so I didn't have to
hold a dashmap lock over an `.await`.
This removes multiple error variants and overall cleans up the codebase
by moving overflow checks into two `ModelError` variants.
Shrinks `size_of::<Error>` from 136 bytes to 64 bytes, while removing unused
variants. This will improve performance for any method returning
`Result<T>` where `T` is less than the size of `Error` as both `Result`'s
`Ok` and `Err` have to be allocated stack space.
The compiler knows best as inlining is quite complicated. This should
help with compile times, significantly.
GnomedDev and others added 26 commits November 15, 2024 19:21
`secrecy` has had major changes in it's transition from `0.8` -> `0.10`
that would make it even less useful than it is now.

This just brings the basic implementation in-house and exposes it
publicly, which is somehow less lines of code that trying to use the
`0.8` API, let alone `0.10`.

---------

Co-authored-by: jamesbt365 <[email protected]>
This is fine to do on next, and fixed a couple things. I also swapped
the `allow`s for `expect`s because why not.
…s#3000)

More type safe, more performant, less reliant on serde_json, what's not
to love!
This is needed for use cases like returning a borrow into the user data
from a function which takes a reference to Context.
This deletes methods which simply pass through to their `id` fields, as
they are:
- Misleading, as a user may do an HTTP call or cache lookup to get a
model just to use it's ID
- Lead to a bunch of maintenance issues when having 2..=4 copies of
every method.
- Hurt compile times, as rustc is having to check signatures, calls,
construct async state machines, and maybe even inline to generate code
multiple times.

For methods which simply only used their `id` field but did not have a
version on their respective ID, they were moved to their ID.

This doesn't have a corresponding deprecation PR to current, as current
still has permission checks and other "helpers" which rely on the model.
This exposes the `bytes` dependency but in turn allows for people to
pass responses directly from reqwest to discord without cloning the
data, as well as allowing reuploading cached data without cloning or
leaking to get a static reference.

The bytes dependency also has to be made non-optional, but this is fine
as it was already due to `aformat` depending on it via `bytestring`.
This separates the the builders for creating versus editing a command,
since it's not possible to change the `type` of a command (in serenity
this is the `kind` field). Also, the `name` field is not required when
editing a command.
Improved wording and removed some sentences that are no longer relevant.
These docs are mostly the ones that were touched by serenity-rs#2988.
Discord documents this as always present, even with Ping interactions.
This follows up on serenity-rs#3037, and also removes the now unnecessary Option
around the GuildChannel param.
Turns out this was always being passed 204, except one case where it
should have been deserialising the `Member` return type anyway. This
fixes both issues.
This allows it to imported via `poise::serenity_prelude` which is often
`use`'d as `serenity`.
This was missing on FullEvent but was present within the event itself.
Values are getting quite close to the u8 limit (193), so let's
preemptively bump this to avoid future breaking changes.
Moves the feature-gated collector methods on `UserId`, `MessageId`, etc.
into four traits:
- `CollectMessages` 
- `CollectReactions`
- `CollectModalInteractions` 
- `CollectComponentInteractions`

This also moves the quick modal machinery into the collector module and defines
a `QuickModal` trait. 

This fully removes any collector feature gates from the model types.
`EditInteractionResponse` is used in `CreateInteractionResponse::UpdateMessage` and for response follow-ups.
`CreateInteractionResponseFollowup::execute`'s `message_id` parameter has also been moved to `EditInteractionResponse`.
@github-actions github-actions bot added model Related to the `model` module. builder Related to the `builder` module. examples Related to Serenity's examples. labels Nov 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
builder Related to the `builder` module. examples Related to Serenity's examples. model Related to the `model` module.
Projects
None yet
Development

Successfully merging this pull request may close these issues.