16 Commits

Author SHA1 Message Date
9e280a3285 add DisplayNameSubstring to map filter 2026-03-24 19:27:41 -07:00
2cdd6874b4 Typo fix
All checks were successful
continuous-integration/drone/push Build is passing
2026-03-01 16:10:29 -05:00
f248c19b07 Add download url endpoint
All checks were successful
continuous-integration/drone/push Build is passing
2026-03-01 16:05:30 -05:00
c400d2d58b Add search and avatar services
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-28 18:04:45 -05:00
0405aba995 fix up mapfixes & submissions
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-28 12:38:22 -08:00
d3f2d336a0 delete python
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-28 12:19:43 -08:00
83ebab1cc6 Create Submissions & Mapfixes Protobufs (#12)
All checks were successful
continuous-integration/drone/push Build is passing
AOR Roblox servers will talk to game-rpc which will use these protobufs to talk to maps-service.

Reviewed-on: #12
Co-authored-by: Rhys Lloyd <krakow20@gmail.com>
Co-committed-by: Rhys Lloyd <krakow20@gmail.com>
2025-12-28 20:17:05 +00:00
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
11 changed files with 224 additions and 55 deletions

View File

@@ -6,7 +6,7 @@ name: generate-go-grpc
steps:
- name: clone-external
image: alpine/git
commands:
commands:
- git clone https://${GIT_USER}:${GIT_PASS}@git.itzana.me/StrafesNET/go-grpc.git
environment:
GIT_USER:
@@ -46,7 +46,7 @@ name: generate-rust-grpc
steps:
- name: clone-external
image: alpine/git
commands:
commands:
- git clone https://${GIT_USER}:${GIT_PASS}@git.itzana.me/StrafesNET/rust-grpc.git
environment:
GIT_USER:
@@ -78,43 +78,3 @@ trigger:
image_pull_secrets:
- dockerconfigjson
---
kind: pipeline
type: docker
name: generate-python-grpc
steps:
- name: clone-external
image: alpine/git
commands:
- git clone https://$GIT_USER:$GIT_PASS@git.itzana.me/StrafesNET/python-grpc.git
environment:
GIT_USER:
from_secret: GIT_USER
GIT_PASS:
from_secret: GIT_PASS
- name: generate
image: registry.itzana.me/strafesnet/tools/python-grpc:latest
commands:
- scripts/python-gen.sh
- name: commit
image: alpine/git
commands:
- cd python-grpc
- git add *
- 'git commit -m "Autogenerated update for ${DRONE_COMMIT_LINK}" || true'
- git push https://$GIT_USER:$GIT_PASS@git.itzana.me/StrafesNET/python-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

View File

@@ -11,6 +11,7 @@ service AuthService {
rpc GetGroupRole(IdMessage) returns (RoleReponse);
rpc ValidateSession(IdMessage) returns (ValidateResponse);
rpc GetAuthMetadata(google.protobuf.Empty) returns (AuthMetadataResponse);
rpc GetAvatars(AvatarListRequest) returns (AvatarListResponse);
}
message IdMessage {
@@ -43,3 +44,16 @@ message AuthMetadataResponse {
string AccountURL = 3;
}
message AvatarListRequest {
repeated uint64 UserIDs = 1;
}
message AvatarItem {
uint64 UserID = 1;
string AvatarURL = 2;
}
message AvatarListResponse {
repeated AvatarItem Avatars = 1;
}

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; }

81
mapfixes.proto Normal file
View File

@@ -0,0 +1,81 @@
syntax = "proto3";
package mapfixes;
option go_package = "git.itzana.me/strafesnet/go-grpc/mapfixes";
service MapfixesService {
rpc Get(MapfixId) returns (MapfixResponse);
rpc GetList(MapfixIdList) returns (MapfixList);
rpc List(ListRequest) returns (MapfixList);
}
message MapfixIdList {
repeated int64 ID = 1;
}
message MapfixId {
int64 ID = 1;
}
enum MapfixStatus {
// Phase: Creation
MapfixStatusUnderConstruction = 0;
MapfixStatusChangesRequested = 1;
// Phase: Review
MapfixStatusSubmitting = 2;
MapfixStatusSubmitted = 3;
// Phase: Testing
MapfixStatusAcceptedUnvalidated = 4; // pending script review, can re-trigger validation
MapfixStatusValidating = 5;
MapfixStatusValidated = 6;
MapfixStatusUploading = 7;
MapfixStatusUploaded = 8; // uploaded to the group, but pending release
MapfixStatusReleasing = 11;
// Phase: Final MapfixStatus
MapfixStatusRejected = 9;
MapfixStatusReleased = 10;
}
message MapfixResponse {
int64 ID = 1;
string DisplayName = 2;
string Creator = 3;
uint32 GameID = 4;
int64 CreatedAt = 5;
int64 UpdatedAt = 6;
uint64 Submitter = 7;
uint64 AssetID = 8;
uint64 AssetVersion = 9;
optional uint64 ValidatedAssetID = 10;
optional uint64 ValidatedAssetVersion = 11;
uint64 TargetAssetID = 12;
MapfixStatus StatusID = 13;
}
message MapfixFilter {
optional MapfixStatus StatusID = 1;
optional string DisplayName = 2;
optional string Creator = 3;
optional uint32 GameID = 4;
optional uint64 Submitter = 5;
}
message MapfixList {
repeated MapfixResponse Mapfixes = 1;
}
message ListRequest {
MapfixFilter Filter = 1;
Pagination Page = 2;
}
message Pagination {
uint32 Size = 1;
uint32 Number = 2;
}
message NullResponse {}

View File

@@ -38,6 +38,7 @@ message MapRequest {
message MapFilter {
optional string DisplayName = 2;
optional int32 GameID = 4;
optional string DisplayNameSubstring = 5;
}
message MapList {

View File

@@ -12,8 +12,11 @@ service MapsService {
rpc Delete(MapId) returns (NullResponse);
rpc List(ListRequest) returns (MapList);
rpc IncrementLoadCount(MapId) returns (NullResponse);
rpc GetSnfmDownloadUrl(MapId) returns (SnfmDownloadUrl);
}
message SnfmDownloadUrl { string Url = 1; }
message MapIdList { repeated int64 ID = 1; }
message MapId { int64 ID = 1; }

View File

@@ -1,6 +0,0 @@
#!/bin/bash
mkdir -p strafesnet
cp *.proto strafesnet/
python3 -m grpc_tools.protoc -I./strafesnet --python_out=./python-grpc/strafesnet --grpc_python_out=./python-grpc/strafesnet *.proto
sed -i 's/^\(import.*pb2\)/from . \1/g' ./python-grpc/strafesnet/*.py

View File

@@ -11,8 +11,12 @@ do
--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/, PartialEq, ::prost::Message)\]/, PartialEq, ::prost::Message, serde::Serialize, serde::Deserialize)\]\n#\[serde(rename_all = \"PascalCase\")\]/g" "$module/$name.rs"
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"

80
submissions.proto Normal file
View File

@@ -0,0 +1,80 @@
syntax = "proto3";
package submissions;
option go_package = "git.itzana.me/strafesnet/go-grpc/submissions";
service SubmissionsService {
rpc Get(SubmissionId) returns (SubmissionResponse);
rpc GetList(SubmissionIdList) returns (SubmissionList);
rpc List(ListRequest) returns (SubmissionList);
}
message SubmissionIdList {
repeated int64 ID = 1;
}
message SubmissionId {
int64 ID = 1;
}
enum SubmissionStatus {
// Phase: Creation
SubmissionStatusUnderConstruction = 0;
SubmissionStatusChangesRequested = 1;
// Phase: Review
SubmissionStatusSubmitting = 2;
SubmissionStatusSubmitted = 3;
// Phase: Testing
SubmissionStatusAcceptedUnvalidated = 4; // pending script review, can re-trigger validation
SubmissionStatusValidating = 5;
SubmissionStatusValidated = 6;
SubmissionStatusUploading = 7;
SubmissionStatusUploaded = 8; // uploaded to the group, but pending release
// Phase: Final SubmissionStatus
SubmissionStatusRejected = 9;
SubmissionStatusReleased = 10;
}
message SubmissionResponse {
int64 ID = 1;
string DisplayName = 2;
string Creator = 3;
uint32 GameID = 4;
int64 CreatedAt = 7;
int64 UpdatedAt = 8;
uint64 Submitter = 9;
uint64 AssetID = 10;
uint64 AssetVersion = 11;
optional uint64 ValidatedAssetID = 12;
optional uint64 ValidatedAssetVersion = 13;
optional uint64 UploadedAssetID = 14;
SubmissionStatus StatusID = 15;
}
message SubmissionFilter {
optional SubmissionStatus StatusID = 1;
optional string DisplayName = 2;
optional string Creator = 3;
optional uint32 GameID = 4;
optional uint64 Submitter = 5;
}
message SubmissionList {
repeated SubmissionResponse Submissions = 1;
}
message ListRequest {
SubmissionFilter Filter = 1;
Pagination Page = 2;
}
message Pagination {
uint32 Size = 1;
uint32 Number = 2;
}
message NullResponse {}

View File

@@ -11,6 +11,7 @@ service UsersService {
rpc Create(UserRequest) returns (IdMessage);
rpc Delete(IdMessage) returns (NullResponse);
rpc List(ListRequest) returns (UserList);
rpc SearchByUsername(SearchByUsernameRequest) returns (UserList);
}
message IdList {
@@ -55,6 +56,11 @@ message Pagination {
int32 Number = 2;
}
message SearchByUsernameRequest {
string Query = 1;
Pagination Page = 2;
}
message NullResponse {
}

View File

@@ -14,9 +14,11 @@ service ValidatorMapfixService {
rpc SetStatusSubmitted(SubmittedRequest) returns (NullResponse);
rpc SetStatusRequestChanges(MapfixID) returns (NullResponse);
rpc SetStatusValidated(MapfixID) returns (NullResponse);
rpc SetStatusFailed(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 {
@@ -27,9 +29,10 @@ service ValidatorSubmissionService {
rpc SetStatusSubmitted(SubmittedRequest) returns (NullResponse);
rpc SetStatusRequestChanges(SubmissionID) returns (NullResponse);
rpc SetStatusValidated(SubmissionID) returns (NullResponse);
rpc SetStatusFailed(SubmissionID) returns (NullResponse);
rpc SetStatusNotValidated(SubmissionID) returns (NullResponse);
rpc SetStatusUploaded(StatusUploadedRequest) returns (NullResponse);
rpc SetStatusReleased(maps_extended.MapCreate) returns (NullResponse);
rpc SetStatusNotUploaded(SubmissionID) returns (NullResponse);
rpc SetStatusReleased(SubmissionReleaseRequest) returns (NullResponse);
}
message MapfixID { uint64 ID = 1; }
@@ -94,18 +97,30 @@ message StatusUploadedRequest {
}
message MapfixReleaseRequest {
uint64 ID = 1;
uint64 AssetVersion = 2;
uint32 Modes = 3;
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;