| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Nonces can actually be almost anything - including booleans - so just
use a Value to represent it since very few users will need it.
This fixes errors like:
```
WARN:serenity::internal::ws_impl: (╯°□°)╯︵ ┻━┻ Error decoding: {"t":"MESSAGE_CREATE","s":12187872,"op":0,"d":{"type":0,"tts":false,"timestamp":"2017-06-01T01:00:00.000000+00:00","pinned":false,"nonce":"","mentions":[{"username":"redacted","id":"redacted","discriminator":"redacted","avatar":"redacted"}],"mention_roles":[],"mention_everyone":false,"id":"redacted","embeds":[],"edited_timestamp":null,"content":"redacted","channel_id":"redacted","author":{"username":"redacted","id":"redacted","discriminator":"redacted","bot":true,"avatar":"redacted"},"attachments":[]}}
ERROR:serenity::client: Shard handler received err: Json(ErrorImpl { code: Message("Unknown i64 value: "), line: 0, column: 0 })
```
and:
```
WARN:serenity::internal::ws_impl: (╯°□°)╯︵ ┻━┻ Error decoding: {"t":"MESSAGE_CREATE","s":1001192,"op":0,"d":{"type":0,"tts":false,"timestamp":"2017-06-01T01:01:01.000000+00:00","pinned":false,"nonce":true,"mentions":[],"mention_roles":[],"mention_everyone":false,"id":"redacted","embeds":[],"edited_timestamp":null,"content":"bork","channel_id":"redacted","author":{"username":"redacted","id":"redacted","discriminator":"redacted","bot":true,"avatar":"redacted"},"attachments":[]}}
ERROR:serenity::client: Shard handler received err: Json(ErrorImpl { code: Message("invalid type: boolean `true`, expected identifier"), line: 0, column: 0 })
```
|
| |
|
|
| |
Embeds can now have a combined textual length of 6000, up from 4000.
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
| |
The 'wait' parameter allows you to specify waiting for the Message to be
sent prior to receiving a response, which will have Discord include the
JSON representation of the Message in the body.
|
| | |
|
| |
|
|
|
|
|
| |
Deprecate `Channel::delete_messages` and `Channel::delete_permission`.
These methods aren't available on all of the variants' types, so they
shouldn't be on the Channel either.
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When made, the `http::send_files` code was duplicated from
`http::send_file`. Instead call `http::send_files`, which provides a
fix for when an, e.g. 4xx status code, is received, and the library
would continue to deserialize the response as usual.
This fixes errors like:
```
Err(Json(ErrorImpl { code: Message("missing field `id`"), line: 1, column: 54 }))
```
Instead returning:
```
Err(Http(InvalidRequest(PayloadTooLarge)))
```
|
| |
|
|
|
|
| |
After the shard handler successfully reconnects a shard, reset the
`last_ack_time` and `last_heartbeat_sent` to avoid going into an
endless reconnection loop.
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
| |
Switch from using `#[doc(hidden)]` to hide some internal functions to
`pub(crate)`.
The library now requires rustc 1.18.
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
| |
The `channel_id` field on Context is no longer required internally, and
is no longer of use to userland as event handlers are given the channel
ID in some way where possible.
`queue` is a remnant from when the Context was the primary way to
interact with the REST API.
|
| |
|
| |
Use the client ID instead of the user ID.
|
| |
|
|
| |
All codepaths result in Some value, so it doesn't need to be optional.
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
| |
Negative message nonces caused deserialization errors, as serde would
not deserialize integers into strings.
To fix this, change `Message::nonce` into an `Option<Snowflake>` from an
`Option<String>`. This new `Snowflake` is a wrapper around an `i64`. Use
a new `I64Visitor` to deserialize i64s, u64s, and strs into the wanted
i64.
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Upgrade `rust-websocket` to v0.20, maintaining use of its sync client.
This indirectly switches from `rust-openssl` v0.7 - which required
openssl-1.0 on all platforms - to `native-tls`, which allows for use of
schannel on Windows, Secure Transport on OSX, and openssl-1.1 on other
platforms.
Additionally, since hyper is no longer even a dependency of
rust-websocket, we can safely and easily upgrade to `hyper` v0.10 and
`multipart` v0.12.
This commit is fairly experimental as it has not been tested on a
long-running bot.
|
| |
|
|
|
|
|
|
|
|
| |
Make read/writes to the stream timeout after 90 seconds to prevent a
potentially infinitely blocked call.
If the timeout is reached, perform a reconnect.
This fixes issues such as intermittent internet issues causing a message
to never be received, and thus infinitely blocking.
|
| |
|
|
|
|
| |
When returning, the Client would return an Ok(()). Instead, return an
error, since there is currently no reason the client would return under
"okay" circumstances.
|
| |
|
|
|
|
|
|
|
|
| |
Instead of running a loop forever, have the client join threads when
they end.
This is currently a poor way of having the client eventually end, but
for now it's a duck-tape solution, as when one shard completely fails to
reboot it's an indicator of a larger issue (invalidated authentication,
intermittent network issues, etc.)
|
| |
|
|
|
| |
The logic for this was duplicated, and can be easily separated into its
own function.
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
| |
Instead of accepting a `&str`, make `User::direct_message` and
`User::dm` accept a `CreateMessage` builder for consistency with related
functions.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Chrono is easier to use than timestamped strings, so they should be
automatically deserialized and available for the user, instead of having
the user deserialize the strings themselves.
These fields have been changed to use a type of `DateTime<FixedOffset>`:
- `ChannelPinsUpdateEvent.last_pin_timestamp`
- `Group.last_pin_timestamp`
- `Guild.joined_at`
- `GuildChannel.last_pin_timestamp`
- `Invite.created_at`
- `Member.joined_at`
- `Message.edited_timestamp
- `Message.timestamp`
- `MessageUpdateEvent.edited_timestamp`
- `MessageUpdateEvent.timestamp`
- `PrivateChannel.last_pin_timestamp`
`Member.joined_at` is now also an `Option`. Previously, if a Guild
Member Update was received for a member not in the cache, a new Member
would be instantiated with a default String value. This is incorrect
behaviour, and has now been replaced with being set to `None` in that
case.
Id methods' `created_at()` method now return a `chrono::NaiveDateTime`
instead of a `time::Timespec`, and `User::created_at` has been updated
to reflect that.
Additionally, drop `time` as a direct dependency and use chrono for
internals.
|
| |
|
|
|
| |
These functions return the user's avatar URL, or their default avatar
URL as a fallback.
|
| | |
|
| |
|
|
|
|
| |
Helper methods such as `GuildChannel::send_files` linked to the
documentation for `ChannelId::send_file`, when they should be linking
to `ChannelId::send_files`.
|
| |
|
|
|
|
| |
Sometimes a user might be working with a buffer of bytes in-memory and
not writing to the disk, so `http::AttachmentType` should accept an
&[u8].
|
| |
|
|
|
| |
With the way AttachmentType is meant to be used by `http::send_files`,
none of the values need to be moved, they only need to be borrowed.
|
| |
|
|
|
| |
Instead of fully qualifying the namespace when using
`std::mem::replace`, use just `mem::replace`.
|
| |
|
|
|
|
| |
The logic for the `User` and `CurrentUser` avatar methods (`avatar_url`,
`default_avatar_url`, `static_avatar_url`) were duplicated, so move the
logic out and have each method simply call the related function.
|
| |
|
|
|
| |
Add `default_avatar_url` to `CurrentUser` to match `User`'s avatar
functions.
|
| |
|
|
|
| |
The method can be used as a shortcut for retrieving a message's channel
from the cache.
|