Merge branch 'main' into feat/elasticsearch
Signed-off-by: Zomatree <me@zomatree.live>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-bonfire"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
license = "AGPL-3.0-or-later"
|
||||
edition = "2021"
|
||||
publish = false
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-coalesced"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
edition = "2021"
|
||||
license = "MIT"
|
||||
authors = ["Paul Makles <me@insrt.uk>", "Zomatree <me@zomatree.live>"]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-config"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
edition = "2021"
|
||||
license = "MIT"
|
||||
authors = ["Paul Makles <me@insrt.uk>"]
|
||||
@@ -38,4 +38,4 @@ sentry = { version = "0.31.5", optional = true }
|
||||
sentry-anyhow = { version = "0.38.1", optional = true }
|
||||
|
||||
# Core
|
||||
revolt-result = { version = "0.12.0", path = "../result", optional = true }
|
||||
revolt-result = { version = "0.12.1", path = "../result", optional = true }
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-database"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
edition = "2021"
|
||||
license = "AGPL-3.0-or-later"
|
||||
authors = ["Paul Makles <me@insrt.uk>"]
|
||||
@@ -32,19 +32,19 @@ default = ["mongodb", "async-std-runtime", "tasks"]
|
||||
|
||||
[dependencies]
|
||||
# Core
|
||||
revolt-config = { version = "0.12.0", path = "../config", features = [
|
||||
revolt-config = { version = "0.12.1", path = "../config", features = [
|
||||
"report-macros",
|
||||
] }
|
||||
revolt-result = { version = "0.12.0", path = "../result" }
|
||||
revolt-models = { version = "0.12.0", path = "../models", features = [
|
||||
revolt-result = { version = "0.12.1", path = "../result" }
|
||||
revolt-models = { version = "0.12.1", path = "../models", features = [
|
||||
"validator",
|
||||
] }
|
||||
revolt-presence = { version = "0.12.0", path = "../presence" }
|
||||
revolt-permissions = { version = "0.12.0", path = "../permissions", features = [
|
||||
revolt-presence = { version = "0.12.1", path = "../presence" }
|
||||
revolt-permissions = { version = "0.12.1", path = "../permissions", features = [
|
||||
"serde",
|
||||
"bson",
|
||||
] }
|
||||
revolt-parser = { version = "0.12.0", path = "../parser" }
|
||||
revolt-parser = { version = "0.12.1", path = "../parser" }
|
||||
|
||||
# Utility
|
||||
log = "0.4"
|
||||
|
||||
@@ -46,8 +46,7 @@ auto_derived!(
|
||||
width: isize,
|
||||
height: isize,
|
||||
thumbhash: Option<Vec<u8>>,
|
||||
#[serde(default)]
|
||||
animated: bool,
|
||||
animated: Option<bool>,
|
||||
},
|
||||
/// File is a video with specific dimensions
|
||||
Video { width: isize, height: isize },
|
||||
|
||||
@@ -17,6 +17,12 @@ pub trait AbstractAttachmentHashes: Sync + Send {
|
||||
/// Update an attachment hash nonce value.
|
||||
async fn set_attachment_hash_nonce(&self, hash: &str, nonce: &str) -> Result<()>;
|
||||
|
||||
/// Updates the attachments animated metadata value.
|
||||
///
|
||||
/// The primary use for this is to update the metadata for existing uploaded files, this
|
||||
/// can only be used for images.
|
||||
async fn set_attachment_hash_animated(&self, hash: &str, animated: bool) -> Result<()>;
|
||||
|
||||
/// Delete attachment hash by id.
|
||||
async fn delete_attachment_hash(&self, id: &str) -> Result<()>;
|
||||
}
|
||||
|
||||
@@ -48,6 +48,29 @@ impl AbstractAttachmentHashes for MongoDb {
|
||||
.map_err(|_| create_database_error!("update_one", COL))
|
||||
}
|
||||
|
||||
/// Updates the attachments animated metadata value.
|
||||
///
|
||||
/// The primary use for this is to update the metadata for existing uploaded files, this
|
||||
/// can only be used for images.
|
||||
async fn set_attachment_hash_animated(&self, hash: &str, animated: bool) -> Result<()> {
|
||||
self.col::<FileHash>(COL)
|
||||
.update_one(
|
||||
doc! {
|
||||
"_id": hash,
|
||||
"metadata.type": "Image",
|
||||
"metadata.animated": { "$exists": false },
|
||||
},
|
||||
doc! {
|
||||
"$set": {
|
||||
"metadata.animated": animated
|
||||
}
|
||||
},
|
||||
)
|
||||
.await
|
||||
.map(|_| ())
|
||||
.map_err(|_| create_database_error!("update_one", COL))
|
||||
}
|
||||
|
||||
/// Delete attachment hash by id.
|
||||
async fn delete_attachment_hash(&self, id: &str) -> Result<()> {
|
||||
query!(self, delete_one_by_id, COL, id).map(|_| ())
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
use revolt_result::Result;
|
||||
|
||||
use crate::FileHash;
|
||||
use crate::ReferenceDb;
|
||||
use crate::{FileHash, Metadata, ReferenceDb};
|
||||
|
||||
use super::AbstractAttachmentHashes;
|
||||
|
||||
@@ -39,6 +38,29 @@ impl AbstractAttachmentHashes for ReferenceDb {
|
||||
}
|
||||
}
|
||||
|
||||
/// Updates the attachments animated metadata value.
|
||||
///
|
||||
/// The primary use for this is to update the metadata for existing uploaded files, this
|
||||
/// can only be used for images.
|
||||
async fn set_attachment_hash_animated(&self, hash: &str, animated: bool) -> Result<()> {
|
||||
let mut hashes = self.file_hashes.lock().await;
|
||||
if let Some(FileHash {
|
||||
metadata:
|
||||
Metadata::Image {
|
||||
animated: Some(animated_metadata),
|
||||
..
|
||||
},
|
||||
..
|
||||
}) = hashes.get_mut(hash)
|
||||
{
|
||||
*animated_metadata = animated;
|
||||
|
||||
Ok(())
|
||||
} else {
|
||||
Err(create_error!(NotFound))
|
||||
}
|
||||
}
|
||||
|
||||
/// Delete attachment hash by id.
|
||||
async fn delete_attachment_hash(&self, id: &str) -> Result<()> {
|
||||
let mut file_hashes = self.file_hashes.lock().await;
|
||||
|
||||
@@ -731,7 +731,7 @@ impl Message {
|
||||
},
|
||||
member.map(Into::into),
|
||||
),
|
||||
Some(author),
|
||||
Some(author.clone()),
|
||||
channel.to_owned().into(),
|
||||
)
|
||||
.await,
|
||||
@@ -739,7 +739,11 @@ impl Message {
|
||||
self.clone(),
|
||||
match channel {
|
||||
Channel::DirectMessage { recipients, .. }
|
||||
| Channel::Group { recipients, .. } => recipients.clone(),
|
||||
| Channel::Group { recipients, .. } => recipients
|
||||
.iter()
|
||||
.filter(|uid| *uid != author.id())
|
||||
.cloned()
|
||||
.collect(),
|
||||
Channel::TextChannel { .. } => {
|
||||
self.mentions.clone().unwrap_or_default()
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-files"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
edition = "2021"
|
||||
license = "AGPL-3.0-or-later"
|
||||
authors = ["Paul Makles <me@insrt.uk>"]
|
||||
@@ -27,10 +27,10 @@ typenum = "1.17.0"
|
||||
aws-config = "1.5.5"
|
||||
aws-sdk-s3 = { version = "1.46.0", features = ["behavior-version-latest"] }
|
||||
|
||||
revolt-config = { version = "0.12.0", path = "../config", features = [
|
||||
revolt-config = { version = "0.12.1", path = "../config", features = [
|
||||
"report-macros",
|
||||
] }
|
||||
revolt-result = { version = "0.12.0", path = "../result" }
|
||||
revolt-result = { version = "0.12.1", path = "../result" }
|
||||
|
||||
# image processing
|
||||
jxl-oxide = { workspace = true }
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-models"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
edition = "2021"
|
||||
license = "MIT"
|
||||
authors = ["Paul Makles <me@insrt.uk>"]
|
||||
@@ -21,8 +21,8 @@ default = ["serde", "partials", "rocket"]
|
||||
|
||||
[dependencies]
|
||||
# Core
|
||||
revolt-config = { version = "0.12.0", path = "../config" }
|
||||
revolt-permissions = { version = "0.12.0", path = "../permissions" }
|
||||
revolt-config = { version = "0.12.1", path = "../config" }
|
||||
revolt-permissions = { version = "0.12.1", path = "../permissions" }
|
||||
|
||||
# Utility
|
||||
regex = "1.11"
|
||||
|
||||
@@ -51,7 +51,7 @@ auto_derived!(
|
||||
width: usize,
|
||||
height: usize,
|
||||
thumbhash: Option<Vec<u8>>,
|
||||
animated: bool,
|
||||
animated: Option<bool>,
|
||||
},
|
||||
/// File is a video with specific dimensions
|
||||
Video { width: usize, height: usize },
|
||||
|
||||
@@ -391,6 +391,7 @@ auto_derived!(
|
||||
);
|
||||
|
||||
/// Message Author Abstraction
|
||||
#[derive(Clone)]
|
||||
pub enum MessageAuthor<'a> {
|
||||
User(&'a User),
|
||||
Webhook(&'a Webhook),
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-parser"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
edition = "2021"
|
||||
license = "MIT"
|
||||
authors = ["Zomatree <me@zomatree.live>", "Paul Makles <me@insrt.uk>"]
|
||||
|
||||
@@ -262,7 +262,7 @@ mod tests {
|
||||
)
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
assert_eq!(output.len(), 6);
|
||||
assert_eq!(output.len(), 7);
|
||||
assert_eq!(output[0], MessageToken::CodeblockMarker(1));
|
||||
assert_eq!(
|
||||
output[1],
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-permissions"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
edition = "2021"
|
||||
license = "MIT"
|
||||
authors = ["Paul Makles <me@insrt.uk>"]
|
||||
@@ -22,7 +22,7 @@ async-std = { version = "1.8.0", features = ["attributes"] }
|
||||
|
||||
[dependencies]
|
||||
# Core
|
||||
revolt-result = { version = "0.12.0", path = "../result" }
|
||||
revolt-result = { version = "0.12.1", path = "../result" }
|
||||
|
||||
# Utility
|
||||
auto_ops = "0.3.0"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-presence"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
edition = "2021"
|
||||
license = "AGPL-3.0-or-later"
|
||||
authors = ["Paul Makles <me@insrt.uk>"]
|
||||
@@ -17,7 +17,7 @@ redis-is-patched = []
|
||||
async-std = { version = "1.8.0", features = ["attributes"] }
|
||||
|
||||
# Config for loading Redis URI
|
||||
revolt-config = { version = "0.12.0", path = "../config" }
|
||||
revolt-config = { version = "0.12.1", path = "../config" }
|
||||
|
||||
[dependencies]
|
||||
# Utility
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-ratelimits"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
authors = ["Zomatree <me@zomatree.live>", "Paul Makles <me@insrt.uk>"]
|
||||
@@ -18,9 +18,9 @@ axum = ["dep:axum", "revolt-database/axum-impl"]
|
||||
default = ["rocket", "axum"]
|
||||
|
||||
[dependencies]
|
||||
revolt-database = { version = "0.12.0", path = "../database" }
|
||||
revolt-result = { version = "0.12.0", path = "../result" }
|
||||
revolt-config = { version = "0.12.0", path = "../config" }
|
||||
revolt-database = { version = "0.12.1", path = "../database" }
|
||||
revolt-result = { version = "0.12.1", path = "../result" }
|
||||
revolt-config = { version = "0.12.1", path = "../config" }
|
||||
|
||||
rocket = { version = "0.5.1", optional = true }
|
||||
revolt_rocket_okapi = { version = "0.10.0", optional = true }
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-result"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
edition = "2021"
|
||||
license = "MIT"
|
||||
authors = ["Paul Makles <me@insrt.uk>"]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-crond"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
license = "AGPL-3.0-or-later"
|
||||
authors = ["Paul Makles <me@insrt.uk>"]
|
||||
edition = "2021"
|
||||
@@ -17,7 +17,7 @@ log = "0.4"
|
||||
tokio = { version = "1" }
|
||||
|
||||
# Core
|
||||
revolt-database = { version = "0.12.0", path = "../../core/database" }
|
||||
revolt-result = { version = "0.12.0", path = "../../core/result" }
|
||||
revolt-config = { version = "0.12.0", path = "../../core/config" }
|
||||
revolt-files = { version = "0.12.0", path = "../../core/files" }
|
||||
revolt-database = { version = "0.12.1", path = "../../core/database" }
|
||||
revolt-result = { version = "0.12.1", path = "../../core/result" }
|
||||
revolt-config = { version = "0.12.1", path = "../../core/config" }
|
||||
revolt-files = { version = "0.12.1", path = "../../core/files" }
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
[package]
|
||||
name = "revolt-pushd"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
edition = "2021"
|
||||
license = "AGPL-3.0-or-later"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
revolt-result = { version = "0.12.0", path = "../../core/result" }
|
||||
revolt-config = { version = "0.12.0", path = "../../core/config", features = [
|
||||
revolt-result = { version = "0.12.1", path = "../../core/result" }
|
||||
revolt-config = { version = "0.12.1", path = "../../core/config", features = [
|
||||
"report-macros",
|
||||
"anyhow",
|
||||
] }
|
||||
revolt-database = { version = "0.12.0", path = "../../core/database" }
|
||||
revolt-models = { version = "0.12.0", path = "../../core/models", features = [
|
||||
revolt-database = { version = "0.12.1", path = "../../core/database" }
|
||||
revolt-models = { version = "0.12.1", path = "../../core/models", features = [
|
||||
"validator",
|
||||
] }
|
||||
revolt-presence = { version = "0.12.0", path = "../../core/presence", features = [
|
||||
revolt-presence = { version = "0.12.1", path = "../../core/presence", features = [
|
||||
"redis-is-patched",
|
||||
] }
|
||||
revolt-parser = { version = "0.12.0", path = "../../core/parser" }
|
||||
revolt-parser = { version = "0.12.1", path = "../../core/parser" }
|
||||
|
||||
anyhow = { version = "1.0.98" }
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-voice-ingress"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
license = "AGPL-3.0-or-later"
|
||||
edition = "2021"
|
||||
publish = false
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-delta"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
license = "AGPL-3.0-or-later"
|
||||
authors = ["Paul Makles <paulmakles@gmail.com>"]
|
||||
edition = "2018"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-autumn"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
edition = "2021"
|
||||
license = "AGPL-3.0-or-later"
|
||||
publish = false
|
||||
@@ -45,16 +45,16 @@ tracing = "0.1"
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||
|
||||
# Core crates
|
||||
revolt-files = { version = "0.12.0", path = "../../core/files" }
|
||||
revolt-config = { version = "0.12.0", path = "../../core/config" }
|
||||
revolt-database = { version = "0.12.0", path = "../../core/database", features = [
|
||||
revolt-files = { version = "0.12.1", path = "../../core/files" }
|
||||
revolt-config = { version = "0.12.1", path = "../../core/config" }
|
||||
revolt-database = { version = "0.12.1", path = "../../core/database", features = [
|
||||
"axum-impl",
|
||||
] }
|
||||
revolt-result = { version = "0.12.0", path = "../../core/result", features = [
|
||||
revolt-result = { version = "0.12.1", path = "../../core/result", features = [
|
||||
"utoipa",
|
||||
"axum",
|
||||
] }
|
||||
revolt-ratelimits = { version = "0.12.0", path = "../../core/ratelimits", features = ["axum"] }
|
||||
revolt-ratelimits = { version = "0.12.1", path = "../../core/ratelimits", features = ["axum"] }
|
||||
|
||||
# Axum / web server
|
||||
tempfile = "3.12.0"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use std::{
|
||||
io::{Cursor, Read},
|
||||
io::{Cursor, Read, Write},
|
||||
time::Duration,
|
||||
};
|
||||
|
||||
@@ -15,9 +15,10 @@ use lazy_static::lazy_static;
|
||||
use revolt_config::{config, report_internal_error};
|
||||
use revolt_database::{iso8601_timestamp::Timestamp, Database, FileHash, Metadata, User};
|
||||
use revolt_files::{
|
||||
create_thumbnail, decode_image, fetch_from_s3, upload_to_s3, AUTHENTICATION_TAG_SIZE_BYTES,
|
||||
create_thumbnail, decode_image, fetch_from_s3, is_animated, upload_to_s3,
|
||||
AUTHENTICATION_TAG_SIZE_BYTES,
|
||||
};
|
||||
use revolt_result::{create_error, Error, Result};
|
||||
use revolt_result::{create_error, Error, Result, ToRevoltError};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use sha2::Digest;
|
||||
use tempfile::NamedTempFile;
|
||||
@@ -25,7 +26,9 @@ use tokio::time::Instant;
|
||||
use tower_http::cors::{AllowHeaders, Any, CorsLayer};
|
||||
use utoipa::ToSchema;
|
||||
|
||||
use crate::{exif::strip_metadata, metadata::generate_metadata, mime_type::determine_mime_type, AppState};
|
||||
use crate::{
|
||||
exif::strip_metadata, metadata::generate_metadata, mime_type::determine_mime_type, AppState,
|
||||
};
|
||||
|
||||
/// Build the API router
|
||||
pub async fn router() -> Router<AppState> {
|
||||
@@ -380,7 +383,30 @@ async fn fetch_preview(
|
||||
|
||||
let hash = file.as_hash(&db).await?;
|
||||
|
||||
let is_animated = matches!(hash.metadata, Metadata::Image { animated: true, .. });
|
||||
let mut data = None;
|
||||
|
||||
// If animated is unset, check the file contents to see if it is animated and update the filehash
|
||||
let is_animated = match &hash.metadata {
|
||||
Metadata::Image {
|
||||
animated: Some(value),
|
||||
..
|
||||
} => *value,
|
||||
Metadata::Image { animated: None, .. } => {
|
||||
let file_data = retrieve_file_by_hash(&hash).await?;
|
||||
|
||||
let mut named_file = NamedTempFile::new().to_internal_error()?;
|
||||
named_file.write(&file_data).to_internal_error()?;
|
||||
|
||||
data = Some(file_data);
|
||||
|
||||
// If it fails for some reason, set it to not be animated
|
||||
let animated = is_animated(&named_file, &hash.content_type).unwrap_or(false);
|
||||
db.set_attachment_hash_animated(&hash.id, animated).await?;
|
||||
|
||||
animated
|
||||
}
|
||||
_ => false,
|
||||
};
|
||||
|
||||
// Only process image files and don't process GIFs if not avatar or icon
|
||||
if !matches!(hash.metadata, Metadata::Image { .. })
|
||||
@@ -392,7 +418,11 @@ async fn fetch_preview(
|
||||
}
|
||||
|
||||
// Original image data
|
||||
let data = retrieve_file_by_hash(&hash).await?;
|
||||
let data = if let Some(data) = data {
|
||||
data
|
||||
} else {
|
||||
retrieve_file_by_hash(&hash).await?
|
||||
};
|
||||
|
||||
// Read image and create thumbnail
|
||||
let data = create_thumbnail(
|
||||
|
||||
@@ -37,7 +37,7 @@ pub fn generate_metadata(f: &NamedTempFile, mime_type: &str) -> Metadata {
|
||||
thumbhash::rgba_to_thumb_hash(width as usize, height as usize, &rgba)
|
||||
})
|
||||
.ok(),
|
||||
animated: is_animated(f, mime_type).unwrap_or(false),
|
||||
animated: is_animated(f, mime_type).or(Some(false)),
|
||||
})
|
||||
.unwrap_or_default()
|
||||
} else if mime_type.starts_with("video/") {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-gifbox"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
edition = "2021"
|
||||
license = "AGPL-3.0-or-later"
|
||||
publish = false
|
||||
@@ -17,19 +17,19 @@ tokio = { version = "1.0", features = ["full"] }
|
||||
reqwest = { version = "0.12", features = ["json"] }
|
||||
|
||||
# Core crates
|
||||
revolt-config = { version = "0.12.0", path = "../../core/config" }
|
||||
revolt-models = { version = "0.12.0", path = "../../core/models" }
|
||||
revolt-result = { version = "0.12.0", path = "../../core/result", features = [
|
||||
revolt-config = { version = "0.12.1", path = "../../core/config" }
|
||||
revolt-models = { version = "0.12.1", path = "../../core/models" }
|
||||
revolt-result = { version = "0.12.1", path = "../../core/result", features = [
|
||||
"utoipa",
|
||||
"axum",
|
||||
] }
|
||||
revolt-coalesced = { version = "0.12.0", path = "../../core/coalesced", features = [
|
||||
revolt-coalesced = { version = "0.12.1", path = "../../core/coalesced", features = [
|
||||
"queue",
|
||||
] }
|
||||
revolt-database = { version = "0.12.0", path = "../../core/database", features = [
|
||||
revolt-database = { version = "0.12.1", path = "../../core/database", features = [
|
||||
"axum-impl",
|
||||
] }
|
||||
revolt-ratelimits = { version = "0.12.0", path = "../../core/ratelimits", features = [
|
||||
revolt-ratelimits = { version = "0.12.1", path = "../../core/ratelimits", features = [
|
||||
"axum",
|
||||
] }
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "revolt-january"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
edition = "2021"
|
||||
license = "AGPL-3.0-or-later"
|
||||
publish = false
|
||||
@@ -33,13 +33,13 @@ tracing = "0.1"
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||
|
||||
# Core crates
|
||||
revolt-config = { version = "0.12.0", path = "../../core/config" }
|
||||
revolt-models = { version = "0.12.0", path = "../../core/models" }
|
||||
revolt-result = { version = "0.12.0", path = "../../core/result", features = [
|
||||
revolt-config = { version = "0.12.1", path = "../../core/config" }
|
||||
revolt-models = { version = "0.12.1", path = "../../core/models" }
|
||||
revolt-result = { version = "0.12.1", path = "../../core/result", features = [
|
||||
"utoipa",
|
||||
"axum",
|
||||
] }
|
||||
revolt-files = { version = "0.12.0", path = "../../core/files" }
|
||||
revolt-files = { version = "0.12.1", path = "../../core/files" }
|
||||
|
||||
# Axum / web server
|
||||
axum = { version = "0.7.5" }
|
||||
|
||||
Reference in New Issue
Block a user