18 Commits

Author SHA1 Message Date
4d36c3b9b8 Merge pull request 'put git behind feature flag to prevent openssl woes' (#23) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
Reviewed-on: #23
2025-08-26 04:03:59 +00:00
d8a65d9d91 Merge pull request 'asset-tool: use rustls' (#22) from staging into master
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #22
2025-08-26 03:59:29 +00:00
395eee9a19 Merge pull request 'fix deploy' (#21) from staging into master
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #21
2025-08-26 03:56:43 +00:00
cec7307acc Merge pull request 'fix deploy' (#20) from staging into master
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #20
2025-08-26 03:53:26 +00:00
7800a70b80 Merge pull request 'Deploy Updates' (#19) from staging into master
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #19
2025-08-26 03:44:23 +00:00
10a50948fc Merge pull request 'asset tool v0.4.12 update rbx-dom' (#16) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #16
2025-05-01 00:26:28 +00:00
2987a6b321 Merge pull request 'v0.4.4 api tweaks' (#15) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #15
2025-04-11 01:29:34 +00:00
ad8e1865f3 Merge pull request 'rbx_asset: cloud: implement new asset-delivery-api' (#14) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #14
2025-04-06 22:23:12 +00:00
27deef3dd6 Merge pull request 'UploadResponse.AssetVersion + add continue to DownloadUserInventoryJson' (#13) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #13
2025-04-04 20:56:56 +00:00
89a478eaac Merge pull request 'asset-tool: add AssetDetails + DownloadVersionV2' (#11) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #11
2025-04-03 22:54:41 +00:00
d6adc1da45 Merge pull request 'v0.4.9 roblox error in body' (#10) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #10
2025-02-11 21:54:11 +00:00
e89edf287f Merge pull request 'v0.4.8 better errors' (#9) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #9
2025-01-17 10:59:21 +00:00
4ffeaa5784 Merge pull request 'v0.4.7 user inventory + git fix' (#8) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
Reviewed-on: #8
2024-10-01 20:10:30 +00:00
607f964928 Merge pull request 'add documentation, update dependencies' (#6) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #6
2024-09-17 04:44:30 +00:00
8dc7c96f2d Merge pull request 'Create multiple assets concurrently' (#5) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
Reviewed-on: #5
2024-08-17 18:00:27 +00:00
68d751f81f Merge pull request 'use old api for download, error on http status' (#4) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #4
2024-07-16 18:21:06 +00:00
c2052be036 Merge pull request 'use old api for compile-upload-asset' (#3) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
Reviewed-on: #3
2024-07-10 17:18:05 +00:00
2e9485dea6 Merge pull request 'add old asset upload api' (#2) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #2
2024-07-10 16:45:17 +00:00
8 changed files with 526 additions and 531 deletions

948
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
workspace = { members = ["rbx_asset", "rox_compiler"] }
[package]
name = "asset-tool"
version = "0.5.1"
version = "0.5.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -11,11 +11,12 @@ anyhow = "1.0.75"
clap = { version = "4.4.2", features = ["derive"] }
futures = "0.3.30"
git2 = { version = "0.20.0", optional = true }
lazy-regex = "3.1.0"
rbx_asset = { path = "rbx_asset", features = ["gzip", "rustls-tls"], default-features = false }
rbx_binary = "2.0.0"
rbx_dom_weak = "4.0.0"
rbx_reflection_database = "2.0.1"
rbx_xml = "2.0.0"
rbx_binary = "1.0.0"
rbx_dom_weak = "3.0.0"
rbx_reflection_database = "1.0.3"
rbx_xml = "1.0.0"
rox_compiler = { path = "rox_compiler" }
serde_json = "1.0.111"
tokio = { version = "1.35.1", features = ["macros", "rt-multi-thread", "fs"] }

View File

@@ -1,3 +1,3 @@
FROM alpine:3.22 AS runtime
COPY /target/x86_64-unknown-linux-musl/release/asset-tool /usr/local/bin/
ENTRYPOINT ["/usr/local/bin/asset-tool"]
COPY /target/x86_64-unknown-linux-musl/release/asset-tool /
ENTRYPOINT ["/asset-tool"]

View File

@@ -3,13 +3,14 @@ use crate::util::{serialize_u64,deserialize_u64,response_ok};
use crate::types::{ResponseError,MaybeGzippedBytes};
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
pub enum AssetType{
Audio,
Decal,
Model,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct CreateAssetRequest{
pub assetType:AssetType,
pub creationContext:CreationContext,
@@ -55,7 +56,7 @@ impl std::fmt::Display for CreateError{
impl std::error::Error for CreateError{}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct UpdateAssetRequest{
pub assetId:u64,
pub displayName:Option<String>,
@@ -64,41 +65,42 @@ pub struct UpdateAssetRequest{
//woo nested roblox stuff
#[derive(Clone,Debug,serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub enum Creator{
userId(#[serde(deserialize_with="deserialize_u64",serialize_with="serialize_u64")]u64),
groupId(#[serde(deserialize_with="deserialize_u64",serialize_with="serialize_u64")]u64),
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct CreationContext{
pub creator:Creator,
pub expectedPrice:Option<u64>,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
pub enum ModerationState{
Reviewing,
Rejected,
Approved,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct ModerationResult{
pub moderationState:ModerationState,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct Preview{
pub asset:String,
pub altText:String,
}
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct UpdatePlaceRequest{
pub universeId:u64,
pub placeId:u64,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct UpdatePlaceResponse{
pub versionNumber:u64,
}
@@ -144,7 +146,7 @@ pub struct GetAssetLatestRequest{
}
*/
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct AssetResponse{
//u64 wrapped in quotes wohoo!!
#[serde(deserialize_with="deserialize_u64")]
@@ -164,6 +166,7 @@ pub struct AssetResponse{
#[serde(default)]
pub previews:Vec<Preview>,
}
#[allow(nonstandard_style,dead_code)]
pub struct GetAssetVersionRequest{
pub asset_id:u64,
pub version:u64,
@@ -194,13 +197,13 @@ impl AssetLocation{
}
#[derive(Debug,serde::Deserialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct AssetMetadata{
pub metadataType:u32,
pub value:String,
}
#[derive(Debug,serde::Deserialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct AssetLocationInfo{
pub location:Option<AssetLocation>,
pub requestId:String,
@@ -216,7 +219,7 @@ pub struct AssetVersionsRequest{
pub cursor:Option<String>,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct AssetVersion{
pub Id:u64,
pub assetId:u64,
@@ -228,7 +231,7 @@ pub struct AssetVersion{
pub isPublished:bool,
}
#[derive(Debug,serde::Deserialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct AssetVersionsResponse{
pub previousPageCursor:Option<String>,
pub nextPageCursor:Option<String>,
@@ -252,12 +255,13 @@ pub struct InventoryPageRequest{
pub cursor:Option<String>,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
pub struct InventoryItem{
pub id:u64,
pub name:String,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct InventoryPageResponse{
pub totalResults:u64,//up to 50
pub filteredKeyword:Option<String>,//""
@@ -295,7 +299,7 @@ impl std::fmt::Display for OperationError{
}
impl std::error::Error for OperationError{}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
struct RobloxOperation{
pub path:Option<String>,
pub metadata:Option<String>,

View File

@@ -15,7 +15,7 @@ impl std::fmt::Display for PostError{
impl std::error::Error for PostError{}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct CreateRequest{
pub name:String,
pub description:String,
@@ -43,7 +43,7 @@ impl std::fmt::Display for CreateError{
}
impl std::error::Error for CreateError{}
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct UploadRequest{
pub assetid:u64,
pub name:Option<String>,
@@ -73,15 +73,17 @@ impl std::fmt::Display for UploadError{
}
impl std::error::Error for UploadError{}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct UploadResponse{
pub AssetId:u64,
pub AssetVersion:u64,
}
#[allow(nonstandard_style,dead_code)]
pub struct GetAssetDetailsRequest{
pub asset_id:u64,
}
#[allow(nonstandard_style,dead_code)]
pub struct GetAssetRequest{
pub asset_id:u64,
pub version:Option<u64>,
@@ -116,13 +118,13 @@ impl std::fmt::Display for GetAssetV2Error{
impl std::error::Error for GetAssetV2Error{}
#[derive(serde::Deserialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct GetAssetV2AssetMetadata{
pub metadataType:u32,
pub value:String,
}
#[derive(serde::Deserialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct GetAssetV2Location{
pub assetFormat:String,// "source"
location:String,// this value is private so users cannot mutate it
@@ -135,7 +137,7 @@ impl GetAssetV2Location{
}
}
#[derive(serde::Deserialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct GetAssetV2Info{
pub locations:Vec<GetAssetV2Location>,
pub requestId:String,
@@ -160,7 +162,7 @@ pub enum CreatorType{
#[derive(Debug)]
#[derive(serde::Deserialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct Creator{
pub Id:u64,
pub Name:String,
@@ -171,7 +173,7 @@ pub struct Creator{
#[derive(Debug)]
#[derive(serde::Deserialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct AssetDetails{
pub TargetId:u64,
pub ProductType:Option<String>,
@@ -207,7 +209,7 @@ pub struct AssetVersionsPageRequest{
pub cursor:Option<String>,
}
#[derive(serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct AssetVersion{
pub Id:u64,
pub assetId:u64,
@@ -219,7 +221,7 @@ pub struct AssetVersion{
pub isPublished:bool,
}
#[derive(serde::Deserialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct AssetVersionsPageResponse{
pub previousPageCursor:Option<String>,
pub nextPageCursor:Option<String>,
@@ -255,12 +257,13 @@ pub struct CreationsPageRequest{
pub cursor:Option<String>,
}
#[derive(serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
pub struct CreationsItem{
pub id:u64,
pub name:String,
}
#[derive(serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct CreationsPageResponse{
pub totalResults:u64,//up to 50
pub filteredKeyword:Option<String>,//""
@@ -279,14 +282,14 @@ pub struct UserInventoryPageRequest{
}
#[derive(serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct UserInventoryItemOwner{
pub userId:u64,
pub username:String,
pub buildersClubMembershipType:String,
}
#[derive(serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct UserInventoryItem{
pub userAssetId:u64,
pub assetId:u64,
@@ -298,7 +301,7 @@ pub struct UserInventoryItem{
pub updated:chrono::DateTime<chrono::Utc>,
}
#[derive(serde::Deserialize,serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style,dead_code)]
pub struct UserInventoryPageResponse{
pub previousPageCursor:Option<String>,
pub nextPageCursor:Option<String>,
@@ -321,13 +324,13 @@ impl std::fmt::Display for SetAssetsPermissionsError{
impl std::error::Error for SetAssetsPermissionsError{}
#[derive(serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style)]
struct AssetPermissions{
assetId:u64,
grantToDependencies:bool,//true
}
#[derive(serde::Serialize)]
#[expect(nonstandard_style)]
#[allow(nonstandard_style)]
struct SetAssetsPermissions<'a>{
subjectType:&'a str,// "Universe"
subjectId:&'a str,// "4422715291"

View File

@@ -10,8 +10,8 @@ authors = ["Rhys Lloyd <krakow20@gmail.com>"]
[dependencies]
futures = "0.3.30"
regex = { version = "1.11.3", default-features = false, features = ["unicode-perl"] }
lazy-regex = "3.1.0"
rayon = "1.8.0"
rbx_dom_weak = "4.0.0"
rbx_xml = "2.0.0"
rbx_dom_weak = "3.0.0"
rbx_xml = "1.0.0"
tokio = { version = "1.35.1", features = ["fs"] }

View File

@@ -28,16 +28,6 @@ impl std::fmt::Display for PropertiesOverride{
}
}
#[macro_export]
macro_rules! lazy_regex{
($r:literal)=>{{
use regex::Regex;
use std::sync::LazyLock;
static RE:LazyLock<Regex>=LazyLock::new(||Regex::new($r).unwrap());
&RE
}};
}
pub(crate) fn sanitize(s:&str)->std::borrow::Cow<'_,str>{
lazy_regex!(r"[^A-Za-z0-9.-]").replace_all(s,"_")
lazy_regex::regex!(r"[^A-Za-z0-9.-]").replace_all(s,"_")
}

View File

@@ -2,7 +2,6 @@ use std::path::{Path,PathBuf};
use futures::{StreamExt, TryStreamExt};
use tokio::io::AsyncReadExt;
use crate::lazy_regex;
use crate::common::{sanitize,Style,PropertiesOverride};
//holy smokes what am I doing lmao
@@ -203,7 +202,7 @@ impl ScriptWithOverrides{
let mut count=0;
for line in source.lines(){
//only string type properties are supported atm
if let Some(captures)=lazy_regex!(r#"^\-\-\s*Properties\.([A-Za-z]\w*)\s*\=\s*"(\w+)"$"#)
if let Some(captures)=lazy_regex::regex!(r#"^\-\-\s*Properties\.([A-Za-z]\w*)\s*\=\s*"(\w+)"$"#)
.captures(line){
count+=line.len();
match &captures[1]{
@@ -340,7 +339,7 @@ impl CompileNode{
//reject goobers
let is_goober=matches!(style,Some(Style::Rojo));
let (ext_len,file_discernment)={
if let Some(captures)=lazy_regex!(r"^.*(\.module\.lua|\.client\.lua|\.server\.lua)$")
if let Some(captures)=lazy_regex::regex!(r"^.*(\.module\.lua|\.client\.lua|\.server\.lua)$")
.captures(file_name.as_str()){
let ext=&captures[1];
(ext.len(),match ext{
@@ -354,7 +353,7 @@ impl CompileNode{
".server.lua"=>FileDiscernment::Script(ScriptHint::Script),
_=>panic!("Regex failed"),
})
}else if let Some(captures)=lazy_regex!(r"^.*(\.rbxmx|\.lua)$")
}else if let Some(captures)=lazy_regex::regex!(r"^.*(\.rbxmx|\.lua)$")
.captures(file_name.as_str()){
let ext=&captures[1];
(ext.len(),match ext{