From 5509fd216694083fab6869f7f1ee101c0a4232d7 Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Sat, 5 Apr 2025 12:23:13 -0700 Subject: [PATCH 01/11] rbx_asset: context fields should be private --- rbx_asset/src/cloud.rs | 4 ++-- rbx_asset/src/cookie.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index e94c1aa..3e743a6 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -328,8 +328,8 @@ impl ApiKey{ #[derive(Clone)] pub struct CloudContext{ - pub api_key:String, - pub client:reqwest::Client, + api_key:String, + client:reqwest::Client, } impl CloudContext{ diff --git a/rbx_asset/src/cookie.rs b/rbx_asset/src/cookie.rs index f09223d..8547086 100644 --- a/rbx_asset/src/cookie.rs +++ b/rbx_asset/src/cookie.rs @@ -338,8 +338,8 @@ impl Cookie{ } #[derive(Clone)] pub struct CookieContext{ - pub cookie:String, - pub client:reqwest::Client, + cookie:String, + client:reqwest::Client, } impl CookieContext{ From d125829a003ff940888bec744b4b620c4203e4f2 Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Sat, 5 Apr 2025 12:23:39 -0700 Subject: [PATCH 02/11] rbx_asset: rename CloudContext & CookieContext to Context --- rbx_asset/src/cloud.rs | 8 ++++---- rbx_asset/src/cookie.rs | 4 ++-- src/main.rs | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index 3e743a6..f52fff2 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -31,7 +31,7 @@ pub struct AssetOperation{ operation:RobloxOperation, } impl AssetOperation{ - pub async fn try_get_asset(&self,context:&CloudContext)->Result<AssetResponse,AssetOperationError>{ + pub async fn try_get_asset(&self,context:&Context)->Result<AssetResponse,AssetOperationError>{ serde_json::from_value( self.operation .try_get_reponse(context).await @@ -286,7 +286,7 @@ impl RobloxOperation{ None=>self.path.as_deref()?.get(11..), } } - pub async fn try_get_reponse(&self,context:&CloudContext)->Result<serde_json::Value,OperationError>{ + pub async fn try_get_reponse(&self,context:&Context)->Result<serde_json::Value,OperationError>{ context.get_asset_operation(GetAssetOperationRequest{ operation_id:self.operation_id() .ok_or(OperationError::NoOperationId)? @@ -327,12 +327,12 @@ impl ApiKey{ } #[derive(Clone)] -pub struct CloudContext{ +pub struct Context{ api_key:String, client:reqwest::Client, } -impl CloudContext{ +impl Context{ pub fn new(api_key:ApiKey)->Self{ Self{ api_key:api_key.get(), diff --git a/rbx_asset/src/cookie.rs b/rbx_asset/src/cookie.rs index 8547086..dbf046d 100644 --- a/rbx_asset/src/cookie.rs +++ b/rbx_asset/src/cookie.rs @@ -337,12 +337,12 @@ impl Cookie{ } } #[derive(Clone)] -pub struct CookieContext{ +pub struct Context{ cookie:String, client:reqwest::Client, } -impl CookieContext{ +impl Context{ pub fn new(cookie:Cookie)->Self{ Self{ cookie:cookie.get(), diff --git a/src/main.rs b/src/main.rs index 9d4c79b..ba89009 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,8 +2,8 @@ use std::{io::Read,path::PathBuf}; use clap::{Args,Parser,Subcommand}; use anyhow::{anyhow,Result as AResult}; use futures::StreamExt; -use rbx_asset::cloud::{ApiKey,CloudContext}; -use rbx_asset::cookie::{Cookie,CookieContext,AssetVersion,CreationsItem}; +use rbx_asset::cloud::{ApiKey,Context as CloudContext}; +use rbx_asset::cookie::{Cookie,Context as CookieContext,AssetVersion,CreationsItem}; type AssetID=u64; type AssetIDFileMap=Vec<(AssetID,PathBuf)>; From 64e4887b83415e66f6aeb1c19a69d2252a91bc9b Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Sat, 5 Apr 2025 12:59:24 -0700 Subject: [PATCH 03/11] rbx_asset: use #[serde(default)] instead of Option<Vec<_>> --- rbx_asset/src/cloud.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index f52fff2..4510243 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -156,7 +156,8 @@ pub struct AssetResponse{ pub revisionId:String,//u64 pub moderationResult:ModerationResult, pub icon:Option<String>, - pub previews:Option<Vec<Preview>>, + #[serde(default)] + pub previews:Vec<Preview>, } #[allow(nonstandard_style,dead_code)] pub struct GetAssetVersionRequest{ From fb9dd8660d864dc3912dfc0a10d41798f0a17732 Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Sat, 5 Apr 2025 12:59:44 -0700 Subject: [PATCH 04/11] rbx_asset: deduplicate common code --- rbx_asset/src/cloud.rs | 21 +-------------------- rbx_asset/src/cookie.rs | 21 +-------------------- rbx_asset/src/lib.rs | 21 ++++++++++++++++++++- 3 files changed, 22 insertions(+), 41 deletions(-) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index 4510243..30ee5f3 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -1,4 +1,4 @@ -use crate::ResponseError; +use crate::{ResponseError,ReaderType,maybe_gzip_decode,read_readable}; #[derive(Debug,serde::Deserialize,serde::Serialize)] #[allow(nonstandard_style,dead_code)] @@ -297,25 +297,6 @@ impl RobloxOperation{ } } -//idk how to do this better -enum ReaderType<R:std::io::Read>{ - GZip(flate2::read::GzDecoder<std::io::BufReader<R>>), - Raw(std::io::BufReader<R>), -} -fn maybe_gzip_decode<R:std::io::Read>(input:R)->std::io::Result<ReaderType<R>>{ - let mut buf=std::io::BufReader::new(input); - let peek=std::io::BufRead::fill_buf(&mut buf)?; - match &peek[0..2]{ - b"\x1f\x8b"=>Ok(ReaderType::GZip(flate2::read::GzDecoder::new(buf))), - _=>Ok(ReaderType::Raw(buf)), - } -} -fn read_readable(mut readable:impl std::io::Read)->std::io::Result<Vec<u8>>{ - let mut contents=Vec::new(); - readable.read_to_end(&mut contents)?; - Ok(contents) -} - #[derive(Clone)] pub struct ApiKey(String); impl ApiKey{ diff --git a/rbx_asset/src/cookie.rs b/rbx_asset/src/cookie.rs index dbf046d..7ad53f2 100644 --- a/rbx_asset/src/cookie.rs +++ b/rbx_asset/src/cookie.rs @@ -1,4 +1,4 @@ -use crate::ResponseError; +use crate::{ResponseError,ReaderType,maybe_gzip_decode,read_readable}; #[derive(Debug)] pub enum PostError{ @@ -306,25 +306,6 @@ pub struct UserInventoryPageResponse{ pub data:Vec<UserInventoryItem>, } -//idk how to do this better -enum ReaderType<R:std::io::Read>{ - GZip(flate2::read::GzDecoder<std::io::BufReader<R>>), - Raw(std::io::BufReader<R>), -} -fn maybe_gzip_decode<R:std::io::Read>(input:R)->std::io::Result<ReaderType<R>>{ - let mut buf=std::io::BufReader::new(input); - let peek=std::io::BufRead::fill_buf(&mut buf)?; - match &peek[0..2]{ - b"\x1f\x8b"=>Ok(ReaderType::GZip(flate2::read::GzDecoder::new(buf))), - _=>Ok(ReaderType::Raw(buf)), - } -} -fn read_readable(mut readable:impl std::io::Read)->std::io::Result<Vec<u8>>{ - let mut contents=Vec::new(); - readable.read_to_end(&mut contents)?; - Ok(contents) -} - #[derive(Clone)] pub struct Cookie(String); impl Cookie{ diff --git a/rbx_asset/src/lib.rs b/rbx_asset/src/lib.rs index 7728978..c41ff74 100644 --- a/rbx_asset/src/lib.rs +++ b/rbx_asset/src/lib.rs @@ -20,7 +20,7 @@ impl std::fmt::Display for ResponseError{ } impl std::error::Error for ResponseError{} // lazy function to draw out meaningful info from http response on failure -pub async fn response_ok(response:reqwest::Response)->Result<reqwest::Response,ResponseError>{ +pub(crate) async fn response_ok(response:reqwest::Response)->Result<reqwest::Response,ResponseError>{ let status_code=response.status(); if status_code.is_success(){ Ok(response) @@ -35,3 +35,22 @@ pub async fn response_ok(response:reqwest::Response)->Result<reqwest::Response,R })) } } + +//idk how to do this better +pub(crate) enum ReaderType<R:std::io::Read>{ + GZip(flate2::read::GzDecoder<std::io::BufReader<R>>), + Raw(std::io::BufReader<R>), +} +pub(crate) fn maybe_gzip_decode<R:std::io::Read>(input:R)->std::io::Result<ReaderType<R>>{ + let mut buf=std::io::BufReader::new(input); + let peek=std::io::BufRead::fill_buf(&mut buf)?; + match &peek[0..2]{ + b"\x1f\x8b"=>Ok(ReaderType::GZip(flate2::read::GzDecoder::new(buf))), + _=>Ok(ReaderType::Raw(buf)), + } +} +pub(crate) fn read_readable(mut readable:impl std::io::Read)->std::io::Result<Vec<u8>>{ + let mut contents=Vec::new(); + readable.read_to_end(&mut contents)?; + Ok(contents) +} From 71cae5c0894d93a847a2ed353d5e705e0ec0cd32 Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Sat, 5 Apr 2025 13:09:25 -0700 Subject: [PATCH 05/11] rbx_asset: cloud: tweak asset info requests, remove get_asset --- rbx_asset/src/cloud.rs | 31 +++++-------------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index 30ee5f3..9e2f89d 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -119,7 +119,7 @@ impl std::error::Error for UpdateError{} struct GetAssetOperationRequest{ operation_id:String, } -pub struct GetAssetInfoRequest{ +pub struct GetAssetLatestRequest{ pub asset_id:u64, } /* @@ -164,11 +164,6 @@ pub struct GetAssetVersionRequest{ pub asset_id:u64, pub version:u64, } -#[allow(nonstandard_style,dead_code)] -pub struct GetAssetRequest{ - pub asset_id:u64, - pub version:Option<u64>, -} #[derive(Debug)] pub enum GetError{ ParseError(url::ParseError), @@ -394,7 +389,7 @@ impl Context{ ).await.map_err(GetError::Response)? .json::<RobloxOperation>().await.map_err(GetError::Reqwest) } - pub async fn get_asset_info(&self,config:GetAssetInfoRequest)->Result<AssetResponse,GetError>{ + pub async fn get_asset_info(&self,config:GetAssetLatestRequest)->Result<AssetResponse,GetError>{ let raw_url=format!("https://apis.roblox.com/assets/v1/assets/{}",config.asset_id); let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::ParseError)?; @@ -403,30 +398,14 @@ impl Context{ ).await.map_err(GetError::Response)? .json::<AssetResponse>().await.map_err(GetError::Reqwest) } - pub async fn get_asset_version(&self,config:GetAssetVersionRequest)->Result<Vec<u8>,GetError>{ + pub async fn get_asset_version_info(&self,config:GetAssetVersionRequest)->Result<AssetResponse,GetError>{ let raw_url=format!("https://apis.roblox.com/assets/v1/assets/{}/versions/{}",config.asset_id,config.version); let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::ParseError)?; - let body=crate::response_ok( + crate::response_ok( self.get(url).await.map_err(GetError::Reqwest)? ).await.map_err(GetError::Response)? - .bytes().await.map_err(GetError::Reqwest)?; - - match maybe_gzip_decode(&mut std::io::Cursor::new(body)){ - Ok(ReaderType::GZip(readable))=>read_readable(readable), - Ok(ReaderType::Raw(readable))=>read_readable(readable), - Err(e)=>Err(e), - }.map_err(GetError::IO) - } - pub async fn get_asset(&self,config:GetAssetRequest)->Result<Vec<u8>,GetError>{ - let version=match config.version{ - Some(version)=>version, - None=>self.get_asset_info(GetAssetInfoRequest{asset_id:config.asset_id}).await?.revisionId.parse().unwrap(), - }; - self.get_asset_version(GetAssetVersionRequest{ - asset_id:config.asset_id, - version, - }).await + .json::<AssetResponse>().await.map_err(GetError::Reqwest) } pub async fn get_asset_versions(&self,config:AssetVersionsRequest)->Result<AssetVersionsResponse,AssetVersionsError>{ let raw_url=format!("https://apis.roblox.com/assets/v1/assets/{}/versions",config.asset_id); From 302603998eca94b2980017fb9671fb4336b6c606 Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Sat, 5 Apr 2025 13:09:59 -0700 Subject: [PATCH 06/11] rbx_asset: cloud: implement new asset-delivery-api --- rbx_asset/src/cloud.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index 9e2f89d..2c8f659 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -407,6 +407,36 @@ impl Context{ ).await.map_err(GetError::Response)? .json::<AssetResponse>().await.map_err(GetError::Reqwest) } + pub async fn get_asset(&self,config:GetAssetLatestRequest)->Result<Vec<u8>,GetError>{ + let raw_url=format!("https://apis.roblox.com/asset-delivery-api/v1/assetId/{}",config.asset_id); + let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::ParseError)?; + + let body=crate::response_ok( + self.get(url).await.map_err(GetError::Reqwest)? + ).await.map_err(GetError::Response)? + .bytes().await.map_err(GetError::Reqwest)?; + + match maybe_gzip_decode(&mut std::io::Cursor::new(body)){ + Ok(ReaderType::GZip(readable))=>read_readable(readable), + Ok(ReaderType::Raw(readable))=>read_readable(readable), + Err(e)=>Err(e), + }.map_err(GetError::IO) + } + pub async fn get_asset_version(&self,config:GetAssetVersionRequest)->Result<Vec<u8>,GetError>{ + let raw_url=format!("https://apis.roblox.com/asset-delivery-api/v1/assetId/{}/version/{}",config.asset_id,config.version); + let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::ParseError)?; + + let body=crate::response_ok( + self.get(url).await.map_err(GetError::Reqwest)? + ).await.map_err(GetError::Response)? + .bytes().await.map_err(GetError::Reqwest)?; + + match maybe_gzip_decode(&mut std::io::Cursor::new(body)){ + Ok(ReaderType::GZip(readable))=>read_readable(readable), + Ok(ReaderType::Raw(readable))=>read_readable(readable), + Err(e)=>Err(e), + }.map_err(GetError::IO) + } pub async fn get_asset_versions(&self,config:AssetVersionsRequest)->Result<AssetVersionsResponse,AssetVersionsError>{ let raw_url=format!("https://apis.roblox.com/assets/v1/assets/{}/versions",config.asset_id); let url=reqwest::Url::parse(raw_url.as_str()).map_err(AssetVersionsError::ParseError)?; From 99077cf467f0ad2f48408a918366dac94392bcd6 Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Sat, 5 Apr 2025 13:11:05 -0700 Subject: [PATCH 07/11] rbx_asset: v0.4.0 --- Cargo.lock | 2 +- rbx_asset/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 978e0ae..bcc8b08 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1293,7 +1293,7 @@ dependencies = [ [[package]] name = "rbx_asset" -version = "0.3.4" +version = "0.4.0" dependencies = [ "chrono", "flate2", diff --git a/rbx_asset/Cargo.toml b/rbx_asset/Cargo.toml index 42ee64b..5ea80c4 100644 --- a/rbx_asset/Cargo.toml +++ b/rbx_asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rbx_asset" -version = "0.3.4" +version = "0.4.0" edition = "2021" publish = ["strafesnet"] repository = "https://git.itzana.me/StrafesNET/asset-tool" From 4d26e7ad19b7395686a81758a9a895108bec49fb Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Sat, 5 Apr 2025 14:21:57 -0700 Subject: [PATCH 08/11] rbx_asset: discover asset location --- rbx_asset/src/cloud.rs | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index 2c8f659..dd7c2f2 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -178,6 +178,23 @@ impl std::fmt::Display for GetError{ } impl std::error::Error for GetError{} +#[derive(Debug,serde::Deserialize)] +#[allow(nonstandard_style,dead_code)] +pub struct AssetLocation{ + // this field is private so users cannot mutate it + location:String, + pub requestId:String, + pub IsHashDynamic:bool, + pub IsCopyrightProtected:bool, + pub isArchived:bool, + pub assetTypeId:u32, +} +impl AssetLocation{ + pub fn location(&self)->&str{ + &self.location + } +} + pub struct AssetVersionsRequest{ pub asset_id:u64, pub cursor:Option<String>, @@ -407,31 +424,33 @@ impl Context{ ).await.map_err(GetError::Response)? .json::<AssetResponse>().await.map_err(GetError::Reqwest) } - pub async fn get_asset(&self,config:GetAssetLatestRequest)->Result<Vec<u8>,GetError>{ + pub async fn get_asset_location(&self,config:GetAssetLatestRequest)->Result<AssetLocation,GetError>{ let raw_url=format!("https://apis.roblox.com/asset-delivery-api/v1/assetId/{}",config.asset_id); let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::ParseError)?; - let body=crate::response_ok( + crate::response_ok( self.get(url).await.map_err(GetError::Reqwest)? ).await.map_err(GetError::Response)? - .bytes().await.map_err(GetError::Reqwest)?; - - match maybe_gzip_decode(&mut std::io::Cursor::new(body)){ - Ok(ReaderType::GZip(readable))=>read_readable(readable), - Ok(ReaderType::Raw(readable))=>read_readable(readable), - Err(e)=>Err(e), - }.map_err(GetError::IO) + .json().await.map_err(GetError::Reqwest) } - pub async fn get_asset_version(&self,config:GetAssetVersionRequest)->Result<Vec<u8>,GetError>{ + pub async fn get_asset_version_location(&self,config:GetAssetVersionRequest)->Result<AssetLocation,GetError>{ let raw_url=format!("https://apis.roblox.com/asset-delivery-api/v1/assetId/{}/version/{}",config.asset_id,config.version); let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::ParseError)?; + crate::response_ok( + self.get(url).await.map_err(GetError::Reqwest)? + ).await.map_err(GetError::Response)? + .json().await.map_err(GetError::Reqwest) + } + pub async fn get_asset(&self,config:&AssetLocation)->Result<Vec<u8>,GetError>{ + let url=reqwest::Url::parse(config.location.as_str()).map_err(GetError::ParseError)?; + let body=crate::response_ok( self.get(url).await.map_err(GetError::Reqwest)? ).await.map_err(GetError::Response)? .bytes().await.map_err(GetError::Reqwest)?; - match maybe_gzip_decode(&mut std::io::Cursor::new(body)){ + match maybe_gzip_decode(std::io::Cursor::new(body)){ Ok(ReaderType::GZip(readable))=>read_readable(readable), Ok(ReaderType::Raw(readable))=>read_readable(readable), Err(e)=>Err(e), From a8163014adcff3db48c79099f54109006cb9a91b Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Sat, 5 Apr 2025 14:23:26 -0700 Subject: [PATCH 09/11] rbx_asset: v0.4.1 --- Cargo.lock | 2 +- rbx_asset/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bcc8b08..db3fd1b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1293,7 +1293,7 @@ dependencies = [ [[package]] name = "rbx_asset" -version = "0.4.0" +version = "0.4.1" dependencies = [ "chrono", "flate2", diff --git a/rbx_asset/Cargo.toml b/rbx_asset/Cargo.toml index 5ea80c4..def6404 100644 --- a/rbx_asset/Cargo.toml +++ b/rbx_asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rbx_asset" -version = "0.4.0" +version = "0.4.1" edition = "2021" publish = ["strafesnet"] repository = "https://git.itzana.me/StrafesNET/asset-tool" From 0196f47374d7fbd4c6e1ae03de34d201589d6504 Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Sat, 5 Apr 2025 14:53:32 -0700 Subject: [PATCH 10/11] rbx_asset: description is optional --- rbx_asset/src/cloud.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index dd7c2f2..f65c7aa 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -149,7 +149,7 @@ pub struct AssetResponse{ pub assetId:String,//u64 wrapped in quotes wohoo!! pub assetType:AssetType, pub creationContext:CreationContext, - pub description:String, + pub description:Option<String>, pub displayName:String, pub path:String, pub revisionCreateTime:chrono::DateTime<chrono::Utc>, From 45c1e52c0f22acd1d07e27e3aa7c7f9b7a622f50 Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Sat, 5 Apr 2025 14:53:47 -0700 Subject: [PATCH 11/11] rbx_asset: v0.4.2 --- Cargo.lock | 2 +- rbx_asset/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index db3fd1b..3f60a23 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1293,7 +1293,7 @@ dependencies = [ [[package]] name = "rbx_asset" -version = "0.4.1" +version = "0.4.2" dependencies = [ "chrono", "flate2", diff --git a/rbx_asset/Cargo.toml b/rbx_asset/Cargo.toml index def6404..e652476 100644 --- a/rbx_asset/Cargo.toml +++ b/rbx_asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rbx_asset" -version = "0.4.1" +version = "0.4.2" edition = "2021" publish = ["strafesnet"] repository = "https://git.itzana.me/StrafesNET/asset-tool"