51 Commits

Author SHA1 Message Date
0773cba6c7 bot_analyzer: directly accept download url
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-21 17:35:09 -07:00
63ad706dd9 bot_analyzer
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-21 17:02:53 -07:00
8dce6ee1ba validator: remove Submission.SetStatusNotReleased
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-14 18:33:07 -07:00
9a7a123284 validator: add operation success endpoint
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-14 16:55:37 -07:00
e7913b7950 validator: add failure endpoints with a uniform naming convention
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-14 15:59:04 -07:00
6210d5dac9 validator: add SubmissionReleaseRequest
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-13 19:11:00 -07:00
80201e09fd validator: fix MapfixReleaseRequest 2025-08-13 19:10:56 -07:00
4e6ed67dda fix prost codegen
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-13 18:51:11 -07:00
1ed8ffbc3c update sed codegen
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-13 18:28:00 -07:00
e252921e91 validator: submission and mapfix release endpoints (#11)
All checks were successful
continuous-integration/drone/push Build is passing
These endpoints proxy the creation and updation of maps_extended entries, while also updating the relevant submission / mapfix status.

Reviewed-on: #11
Co-authored-by: Rhys Lloyd <krakow20@gmail.com>
Co-committed-by: Rhys Lloyd <krakow20@gmail.com>
2025-08-14 00:49:29 +00:00
eb8d873290 fix maps.Thumbnail
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-06 17:50:02 -07:00
69aa45ffe6 Cut Down Maps Fields (#5)
All checks were successful
continuous-integration/drone/push Build is passing
Remove fields from MapResponse and other structs that will not be used in embedded contexts.

Reviewed-on: #5
Co-authored-by: Rhys Lloyd <krakow20@gmail.com>
Co-committed-by: Rhys Lloyd <krakow20@gmail.com>
2025-08-07 00:39:45 +00:00
889662bc99 maps_extended: IncrementLoadCount function
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-23 19:59:31 -07:00
a9bdcbb1d7 maps_extended: include Modes in MapCreate
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-23 18:17:59 -07:00
5f38e94770 refactor maps_extended
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-21 22:40:45 -07:00
2285e79d6b Maps For maps-service (#6)
All checks were successful
continuous-integration/drone/push Build is passing
New service with extended maps fields.

Reviewed-on: #6
Co-authored-by: Quaternions <krakow20@gmail.com>
Co-committed-by: Quaternions <krakow20@gmail.com>
2025-07-22 05:01:15 +00:00
522731d92a Revert "rename maps to maps_embedded"
All checks were successful
continuous-integration/drone/push Build is passing
This reverts commit 77d88876f6.
2025-07-21 21:55:13 -07:00
b820089a93 Revert "use maps_embedded in times and servers"
All checks were successful
continuous-integration/drone/push Build is passing
This reverts commit d9db4fefb8.
2025-07-21 21:53:53 -07:00
d9db4fefb8 use maps_embedded in times and servers
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-21 21:01:11 -07:00
77d88876f6 rename maps to maps_embedded
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-21 20:08:08 -07:00
d8f3fd54a6 validator: ResourceType enum
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-18 20:32:49 -07:00
0c22f1035e validator: fix SetStatusUploaded
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-17 22:47:11 -07:00
e4d6e3882f validator: fix ScriptFilter
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-17 22:29:47 -07:00
7646d55b34 validator: return ID on Create
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-17 22:08:19 -07:00
3476ecaee0 validator: rename MapFixID -> MapfixID
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-17 21:54:40 -07:00
09d89e2700 Create Dedicated Validator Endpoints (#8)
### Replacing Maps Service `openapi-internal.yaml` With gRPC

These are all the endpoints used by the validator.  The plan is to delete `service_internal` and create `validator_controller` with equivalent gRPC functionality.  This can then be extended in the future for public api & maptest integration by creating new grpc endpoints that the public api & game-rpc talk to.  The gRPC extensions would be separate files (`mapfixes.proto`, `submissions.proto`, `maps.proto`) unlike `validator.proto` which has a bunch of dedicated endpoints that only the validator should use.

### Why?

To reduce the number of exposed apis.  Without this there would need to be 4 (!) exposed apis (validator openapi, web openapi, public api, gRPC for game-rpc), with it, only 2 (web api, gRPC).

### Why didn't you do this in the first place?

I didn't know how.  I think I have a handle on it now.

Reviewed-on: #8
Co-authored-by: Rhys Lloyd <krakow20@gmail.com>
Co-committed-by: Rhys Lloyd <krakow20@gmail.com>
2025-07-17 21:53:59 -07:00
d5bb0a8972 fix bad sed match
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-08 04:38:56 -07:00
cd767e3390 Typo
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-27 22:17:30 -04:00
5b12236c59 Add resource for auditing
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-27 21:38:28 -04:00
4b9803cf66 Add ip for auditing
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-27 21:33:59 -04:00
b8bc25bb8e Fix proto typo
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-27 21:18:18 -04:00
34e63ea6ba Add batch rank rpc
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-27 21:12:49 -04:00
6497b12c5b Add wr list rpc
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-23 23:22:17 -04:00
a1d08b3ea6 Add application owner info
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-22 10:50:47 -04:00
82ca9f2b0c Add dev service
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-22 10:19:28 -04:00
ad8e4ebacf Add auth metadata endpoint
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-21 21:25:50 -04:00
b636336ed2 extend code generation to lib.rs
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-21 06:13:02 -07:00
5641c3a33e generate code in src
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-21 05:59:45 -07:00
ef23f7d07e Add chat mute rpc endpoint
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-21 03:41:14 -04:00
a8135fd45c Add moderation protobuf
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-20 12:14:14 -04:00
05f8a3b57e Support future roblox role changes
All checks were successful
continuous-integration/drone/push Build is passing
2024-11-29 03:11:54 -05:00
fab429fc74 Refine session user response
All checks were successful
continuous-integration/drone/push Build is passing
2024-11-28 23:09:53 -05:00
cc0845f68e Add auth service protobuf
All checks were successful
continuous-integration/drone/push Build is passing
2024-11-28 00:12:09 -05:00
2186c5cb96 Remove Map ID filter (previously it was just 0) (#3)
All checks were successful
continuous-integration/drone/push Build is passing
ID is unused and unwanted for MapFilter.

Reviewed-on: #3
Reviewed-by: itzaname <itzaname@noreply@itzana.me>
Co-authored-by: Quaternions <krakow20@gmail.com>
Co-committed-by: Quaternions <krakow20@gmail.com>
2024-07-22 00:40:43 +00:00
f8d480e834 fix inconsistency (#2)
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #2
Co-authored-by: Quaternions <krakow20@gmail.com>
Co-committed-by: Quaternions <krakow20@gmail.com>
2024-07-19 19:00:53 +00:00
5cfa6745a6 need serde rename or else everything is wrong
All checks were successful
continuous-integration/drone/push Build is passing
we really out here doing codegen
2024-07-18 15:11:53 -07:00
20516bab8d add serde traits to generated code
All checks were successful
continuous-integration/drone/push Build is passing
2024-07-14 08:45:02 -07:00
ed18723ac9 delete unused invocation 2024-07-14 08:42:03 -07:00
f7f9376b4e Add state id filter
All checks were successful
continuous-integration/drone/push Build is passing
2024-03-02 16:52:25 -05:00
65a9abe6d3 Fix rust perms
All checks were successful
continuous-integration/drone/push Build is passing
2024-02-19 23:53:37 -05:00
db2e2e990f Rust grpc builder (#1)
Some checks failed
continuous-integration/drone/push Build is failing
My attempt after reading many online documentations

Reviewed-on: #1
Co-authored-by: Quaternions <krakow20@gmail.com>
Co-committed-by: Quaternions <krakow20@gmail.com>
2024-02-20 04:51:58 +00:00
13 changed files with 521 additions and 9 deletions

View File

@@ -36,6 +36,46 @@ trigger:
ref:
- refs/heads/master
image_pull_secrets:
- dockerconfigjson
---
kind: pipeline
type: docker
name: generate-rust-grpc
steps:
- name: clone-external
image: alpine/git
commands:
- git clone https://${GIT_USER}:${GIT_PASS}@git.itzana.me/StrafesNET/rust-grpc.git
environment:
GIT_USER:
from_secret: GIT_USER
GIT_PASS:
from_secret: GIT_PASS
- name: generate
image: registry.itzana.me/strafesnet/tools/grpc-rust:latest
commands:
- scripts/rust-gen.sh
- name: commit
image: alpine/git
commands:
- cd rust-grpc
- git add *
- 'git commit -m "Autogenerated update for ${DRONE_COMMIT_LINK}" || true'
- git push https://$GIT_USER:$GIT_PASS@git.itzana.me/StrafesNET/rust-grpc.git --all
environment:
GIT_USER:
from_secret: GIT_USER
GIT_PASS:
from_secret: GIT_PASS
trigger:
ref:
- refs/heads/master
image_pull_secrets:
- dockerconfigjson
---

45
auth.proto Normal file
View File

@@ -0,0 +1,45 @@
syntax = "proto3";
option go_package = "git.itzana.me/strafesnet/go-grpc/auth";
package auth;
import "google/protobuf/empty.proto";
service AuthService {
rpc GetSessionUser(IdMessage) returns (SessionUserResponse);
rpc GetGroupRole(IdMessage) returns (RoleReponse);
rpc ValidateSession(IdMessage) returns (ValidateResponse);
rpc GetAuthMetadata(google.protobuf.Empty) returns (AuthMetadataResponse);
}
message IdMessage {
string SessionID = 1;
}
message SessionUserResponse {
uint64 UserID = 1;
string Username = 2;
string AvatarURL = 3;
}
message RoleReponse {
repeated RoleItem Roles = 1;
}
message RoleItem {
string ID = 1;
string DisplayName = 2;
int32 Rank = 3;
}
message ValidateResponse {
bool Valid = 1;
}
message AuthMetadataResponse {
string LoginURL = 1;
string LogoutURL = 2;
string AccountURL = 3;
}

11
bot_analyzer.proto Normal file
View File

@@ -0,0 +1,11 @@
syntax = "proto3";
option go_package = "git.itzana.me/strafesnet/go-grpc/bot_analyzer";
package bot_analyzer;
service BotAnalyzer { rpc Analyze(DownloadUrl) returns (AnalysisResponse); }
message DownloadUrl { string Url = 1; }
message AnalysisResponse { string Analysis = 1; }

36
dev.proto Normal file
View File

@@ -0,0 +1,36 @@
syntax = "proto3";
option go_package = "git.itzana.me/strafesnet/go-grpc/dev";
package dev;
service DevService {
rpc Validate(APIValidationRequest) returns (APIValidationResponse);
}
message APIValidationRequest {
string Service = 1;
string Permission = 2;
string Key = 3;
string IP = 4;
string Resource = 5;
}
message APIValidationResponse {
// Response
bool Valid = 1;
string ErrorMessage = 2;
int32 StatusCode = 3;
// Remaining limits
uint64 RemainingBurst = 4;
uint64 RemainingDaily = 5;
uint64 RemainingMonthly = 6;
// Quota
uint64 BurstLimit = 7;
uint64 BurstDurationSeconds = 8;
uint64 DailyLimit = 9;
uint64 MonthlyLimit = 10;
// Owner info
uint64 UserID = 11;
string Application = 12;
}

View File

@@ -24,23 +24,19 @@ message IdMessage {
message MapResponse {
int64 ID = 1;
string DisplayName = 2;
string Creator = 3;
int32 GameID = 4;
int64 Date = 5;
uint64 Thumbnail = 6;
}
message MapRequest {
int64 ID = 1;
optional string DisplayName = 2;
optional string Creator = 3;
optional int32 GameID = 4;
optional int64 Date = 5;
optional uint64 Thumbnail = 6;
}
message MapFilter {
int64 ID = 1;
optional string DisplayName = 2;
optional string Creator = 3;
optional int32 GameID = 4;
}
@@ -59,5 +55,4 @@ message Pagination {
}
message NullResponse {
}
}

82
maps_extended.proto Normal file
View File

@@ -0,0 +1,82 @@
syntax = "proto3";
option go_package = "git.itzana.me/strafesnet/go-grpc/maps_extended";
package maps_extended;
service MapsService {
rpc Get(MapId) returns (MapResponse);
rpc GetList(MapIdList) returns (MapList);
rpc Update(MapUpdate) returns (NullResponse);
rpc Create(MapCreate) returns (MapId);
rpc Delete(MapId) returns (NullResponse);
rpc List(ListRequest) returns (MapList);
rpc IncrementLoadCount(MapId) returns (NullResponse);
}
message MapIdList { repeated int64 ID = 1; }
message MapId { int64 ID = 1; }
message MapResponse {
int64 ID = 1;
string DisplayName = 2;
string Creator = 3;
uint32 GameID = 4;
int64 Date = 5;
int64 CreatedAt = 6;
int64 UpdatedAt = 7;
uint64 Submitter = 8;
uint64 Thumbnail = 9;
uint64 AssetVersion = 10;
uint32 LoadCount = 11;
uint32 Modes = 12;
}
message MapCreate {
int64 ID = 1;
string DisplayName = 2;
string Creator = 3;
uint32 GameID = 4;
int64 Date = 5;
// int64 CreatedAt = 6;
// int64 UpdatedAt = 7;
uint64 Submitter = 6;
uint64 Thumbnail = 7;
uint64 AssetVersion = 8;
// uint32 LoadCount = 11;
uint32 Modes = 9;
}
message MapUpdate {
int64 ID = 1;
optional string DisplayName = 2;
optional string Creator = 3;
optional uint32 GameID = 4;
optional int64 Date = 5;
optional uint64 Submitter = 6;
optional uint64 Thumbnail = 7;
optional uint64 AssetVersion = 8;
optional uint32 Modes = 9;
}
message MapFilter {
optional string DisplayName = 2;
optional string Creator = 3;
optional uint32 GameID = 4;
optional uint64 Submitter = 5;
}
message MapList { repeated MapResponse Maps = 1; }
message ListRequest {
MapFilter Filter = 1;
Pagination Page = 2;
}
message Pagination {
uint32 Size = 1;
uint32 Number = 2;
}
message NullResponse {}

31
moderation.proto Normal file
View File

@@ -0,0 +1,31 @@
syntax = "proto3";
option go_package = "git.itzana.me/strafesnet/go-grpc/moderation";
package moderation;
import "google/protobuf/struct.proto";
service ModerationService {
rpc SetState(SetStateRequest) returns (Null);
rpc SetMuted(SetMuteRequest) returns (Null);
}
message Null {}
message SetStateRequest {
int64 UserID = 1;
int64 ModeratorID = 2;
int32 ReasonID = 3;
int32 StateID = 4;
}
message SetMuteRequest {
int64 UserID = 1;
int64 ModeratorID = 2;
bool Muted = 3;
optional int64 Duration = 4;
optional int32 ReasonID = 5;
optional string ReasonText = 6;
optional google.protobuf.Struct Metadata = 7;
}

View File

@@ -21,6 +21,7 @@ message GetRequest {
int32 StyleID = 2;
int32 GameID = 3;
int32 ModeID = 4;
repeated int32 StateID = 5;
}
message ListRequest {

33
scripts/rust-gen.sh Executable file
View File

@@ -0,0 +1,33 @@
#!/bin/bash
rm ./rust-grpc/src/lib.rs
for f in *.proto
do
name=$(basename $f .proto)
module=./rust-grpc/src/$name
mkdir -p $module
protoc \
--prost_out=$module \
--tonic_out=$module \
$f
# prost codegen is wrong!
sed -i "s/tonic::codec::ProstCodec/tonic_prost::ProstCodec/g" "$module/$name.tonic.rs"
#I couldn't figure out how to configure protoc to do this
sed -i "s/#\[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)\]/#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)]\n#\[derive(serde::Serialize, serde::Deserialize)\]\n#\[serde(rename_all = \"PascalCase\")\]/g" "$module/$name.rs"
sed -i "s/#\[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)\]/#\[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)\]\n#\[derive(serde::Serialize, serde::Deserialize)\]\n#\[serde(rename_all = \"PascalCase\")\]/g" "$module/$name.rs"
sed -i "s/#\[derive(Clone, PartialEq, ::prost::Message)\]/#\[derive(Clone, PartialEq, ::prost::Message)\]\n#\[derive(serde::Serialize, serde::Deserialize)\]\n#\[serde(rename_all = \"PascalCase\")\]/g" "$module/$name.rs"
sed -i "s/ pub id:/ #\[serde(rename = \"ID\")\]\n pub id:/g" "$module/$name.rs"
sed -i "s/ pub map_id:/ #\[serde(rename = \"MapID\")\]\n pub map_id:/g" "$module/$name.rs"
sed -i "s/ pub time_id:/ #\[serde(rename = \"TimeID\")\]\n pub time_id:/g" "$module/$name.rs"
sed -i "s/ pub file_id:/ #\[serde(rename = \"FileID\")\]\n pub file_id:/g" "$module/$name.rs"
sed -i "s/ pub game_id:/ #\[serde(rename = \"GameID\")\]\n pub game_id:/g" "$module/$name.rs"
sed -i "s/ pub user_id:/ #\[serde(rename = \"UserID\")\]\n pub user_id:/g" "$module/$name.rs"
sed -i "s/ pub mode_id:/ #\[serde(rename = \"ModeID\")\]\n pub mode_id:/g" "$module/$name.rs"
sed -i "s/ pub style_id:/ #\[serde(rename = \"StyleID\")\]\n pub style_id:/g" "$module/$name.rs"
sed -i "s/ pub state_id:/ #\[serde(rename = \"StateID\")\]\n pub state_id:/g" "$module/$name.rs"
sed -i "s/ pub place_id:/ #\[serde(rename = \"PlaceID\")\]\n pub place_id:/g" "$module/$name.rs"
sed -i "s/ pub vip_server_id:/ #\[serde(rename = \"VipServerID\")\]\n pub vip_server_id:/g" "$module/$name.rs"
mv "$module/$name.rs" "$module/mod.rs"
echo "pub mod $name;" >> ./rust-grpc/src/lib.rs
done

View File

@@ -14,7 +14,9 @@ service TimesService {
rpc Delete(IdMessage) returns (NullResponse);
rpc Get(IdMessage) returns (TimeResponse);
rpc List(ListRequest) returns (TimeList);
rpc ListWr(WrListRequest) returns (TimeList);
rpc Rank(IdMessage) returns (RankResponse);
rpc RankBatch(IdListMessage) returns (RankListResponse);
}
message TimeRequest {
@@ -55,13 +57,22 @@ message IdMessage {
int64 ID = 1;
}
message IdListMessage {
repeated int64 ID = 1;
}
message TimeList {
repeated TimeResponse Times = 1;
int64 Total = 2;
}
message RankListResponse {
repeated RankResponse Ranks = 1;
}
message RankResponse {
int64 Rank = 1;
int64 ID = 2;
}
message ListRequest {
@@ -77,6 +88,11 @@ message ListRequest {
uint32 Sort = 4;
}
message WrListRequest {
TimeFilter Filter = 1;
Pagination Page = 2;
}
message Pagination {
int32 Size = 1;
int32 Number = 2;

View File

@@ -27,7 +27,7 @@ message TransactionCreate {
message TransactionUpdate {
string ID = 1;
optional int64 Value = 2;
optional int64 StateID = 3;
optional int32 StateID = 3;
optional google.protobuf.Struct Data = 4;
}

View File

@@ -25,12 +25,14 @@ message UserResponse {
int64 ID = 1;
string Username = 2;
int32 StateID = 3;
bool Muted = 4;
}
message UserRequest {
int64 ID = 1;
optional string Username = 2;
optional int32 StateID = 3;
optional bool Muted = 4;
}
message UserFilter {

220
validator.proto Normal file
View File

@@ -0,0 +1,220 @@
syntax = "proto3";
option go_package = "git.itzana.me/strafesnet/go-grpc/validator";
import "maps_extended.proto";
package validator;
service ValidatorMapfixService {
rpc Create(MapfixCreate) returns (MapfixID);
rpc CreateAuditError(AuditErrorRequest) returns (NullResponse);
rpc CreateAuditChecklist(AuditChecklistRequest) returns (NullResponse);
rpc SetValidatedModel(ValidatedModelRequest) returns (NullResponse);
rpc SetStatusSubmitted(SubmittedRequest) returns (NullResponse);
rpc SetStatusRequestChanges(MapfixID) returns (NullResponse);
rpc SetStatusValidated(MapfixID) returns (NullResponse);
rpc SetStatusNotValidated(MapfixID) returns (NullResponse);
rpc SetStatusUploaded(MapfixID) returns (NullResponse);
rpc SetStatusNotUploaded(MapfixID) returns (NullResponse);
rpc SetStatusReleased(MapfixReleaseRequest) returns (NullResponse);
rpc SetStatusNotReleased(MapfixID) returns (NullResponse);
}
service ValidatorSubmissionService {
rpc Create(SubmissionCreate) returns (SubmissionID);
rpc CreateAuditError(AuditErrorRequest) returns (NullResponse);
rpc CreateAuditChecklist(AuditChecklistRequest) returns (NullResponse);
rpc SetValidatedModel(ValidatedModelRequest) returns (NullResponse);
rpc SetStatusSubmitted(SubmittedRequest) returns (NullResponse);
rpc SetStatusRequestChanges(SubmissionID) returns (NullResponse);
rpc SetStatusValidated(SubmissionID) returns (NullResponse);
rpc SetStatusNotValidated(SubmissionID) returns (NullResponse);
rpc SetStatusUploaded(StatusUploadedRequest) returns (NullResponse);
rpc SetStatusNotUploaded(SubmissionID) returns (NullResponse);
rpc SetStatusReleased(SubmissionReleaseRequest) returns (NullResponse);
}
message MapfixID { uint64 ID = 1; }
message MapfixCreate {
uint32 OperationID = 1;
uint32 GameID = 2;
uint64 AssetOwner = 3;
uint64 AssetID = 4;
uint64 AssetVersion = 5;
uint64 TargetAssetID = 6;
string DisplayName = 7;
string Creator = 8;
string Description = 9;
}
message SubmissionID { uint64 ID = 1; }
message SubmissionCreate {
uint32 OperationID = 1;
uint32 GameID = 2;
uint32 Status = 3;
uint32 Roles = 4;
uint64 AssetOwner = 5;
uint64 AssetID = 6;
uint64 AssetVersion = 7;
string DisplayName = 8;
string Creator = 9;
}
message AuditErrorRequest {
uint64 ID = 1;
string ErrorMessage = 2;
}
message Check {
string Name = 1;
string Summary = 2;
bool Passed = 3;
}
message AuditChecklistRequest {
uint64 ID = 1;
repeated Check CheckList = 2;
}
message ValidatedModelRequest {
uint64 ID = 1;
uint64 ValidatedModelID = 2;
uint64 ValidatedModelVersion = 3;
}
message SubmittedRequest {
uint64 ID = 1;
uint64 ModelVersion = 2;
string DisplayName = 3;
string Creator = 4;
uint32 GameID = 5;
}
message StatusUploadedRequest {
uint64 ID = 1;
uint64 UploadedAssetID = 2;
}
message MapfixReleaseRequest {
uint64 MapfixID = 1;
uint64 TargetAssetID = 2;
uint64 AssetVersion = 3;
uint32 Modes = 4;
}
message SubmissionReleaseRequest {
uint64 SubmissionID = 1;
maps_extended.MapCreate MapCreate = 2;
}
message NullResponse {}
// Operations
service ValidatorOperationService {
rpc Success(OperationSuccessRequest) returns (NullResponse);
rpc Fail(OperationFailRequest) returns (NullResponse);
}
message OperationSuccessRequest {
uint32 OperationID = 1;
string Path = 2;
}
message OperationFailRequest {
uint32 OperationID = 1;
string StatusMessage = 2;
}
message Pagination {
uint32 Size = 1;
uint32 Number = 2;
}
// Scripts
service ValidatorScriptService {
rpc Create(ScriptCreate) returns (ScriptID);
rpc Get(ScriptID) returns (Script);
rpc List(ScriptListRequest) returns (ScriptListResponse);
}
enum ResourceType {
ResourceTypeNone = 0;
ResourceTypeMapfix = 1;
ResourceTypeSubmission = 2;
}
message ScriptCreate {
string Name = 1;
string Source = 2;
ResourceType ResourceType = 3;
optional uint64 ResourceID = 4;
}
message ScriptFilter {
optional string Name = 1;
optional string Source = 2;
optional ResourceType ResourceType = 3;
optional uint64 ResourceID = 4;
optional uint64 Hash = 5;
}
message ScriptListRequest {
ScriptFilter Filter = 1;
Pagination Page = 2;
}
message ScriptID { uint64 ID = 1; }
message Script {
uint64 ID = 1;
uint64 Hash = 2;
string Name = 3;
string Source = 4;
ResourceType ResourceType = 5;
optional uint64 ResourceID = 6;
}
message ScriptListResponse { repeated Script Scripts = 1; }
// ScriptPolicies
service ValidatorScriptPolicyService {
rpc Create(ScriptPolicyCreate) returns (ScriptPolicyID);
rpc List(ScriptPolicyListRequest) returns (ScriptPolicyListResponse);
}
enum Policy {
PolicyNone = 0;
PolicyAllowed = 1;
PolicyBlocked = 2;
PolicyDelete = 3;
PolicyReplace = 4;
}
message ScriptPolicyCreate {
uint64 FromScriptID = 1;
uint64 ToScriptID = 2;
Policy Policy = 3;
}
message ScriptPolicyFilter {
optional uint64 FromScriptHash = 1;
optional uint64 ToScriptID = 2;
optional Policy Policy = 3;
}
message ScriptPolicyListRequest {
ScriptPolicyFilter Filter = 1;
Pagination Page = 2;
}
message ScriptPolicyID { uint64 ID = 1; }
message ScriptPolicy {
uint64 ID = 1;
uint64 FromScriptHash = 2;
uint64 ToScriptID = 3;
Policy Policy = 4;
}
message ScriptPolicyListResponse { repeated ScriptPolicy ScriptPolicies = 1; }