Get rid of meta toolname for MCP handlers
This commit is contained in:
@@ -21,8 +21,8 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="create_anim_blueprint_asset"))
|
||||
class UMCPHandler_CreateAnimBlueprint : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_CreateAnimBlueprintAsset : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -135,8 +135,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="list_anim_slot_names"))
|
||||
class UMCPHandler_ListAnimSlots : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_ListAnimSlotNames : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -193,8 +193,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="list_anim_sync_groups"))
|
||||
class UMCPHandler_ListSyncGroups : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_ListAnimSyncGroups : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -251,8 +251,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="create_blend_space_asset"))
|
||||
class UMCPHandler_CreateBlendSpace : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_CreateBlendSpaceAsset : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -347,8 +347,8 @@ struct FBlendSpaceSampleEntry
|
||||
float Y = 0.0f;
|
||||
};
|
||||
|
||||
UCLASS(meta=(ToolName="set_blend_space_sample_points"))
|
||||
class UMCPHandler_SetBlendSpaceSamples : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_SetBlendSpaceSamplePoints : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="delete_asset"))
|
||||
UCLASS()
|
||||
class UMCPHandler_DeleteAsset : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -169,7 +169,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="rename_asset"))
|
||||
UCLASS()
|
||||
class UMCPHandler_RenameAsset : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -247,7 +247,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="backup_asset"))
|
||||
UCLASS()
|
||||
class UMCPHandler_BackupAsset : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -286,7 +286,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="restore_asset"))
|
||||
UCLASS()
|
||||
class UMCPHandler_RestoreAsset : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="list_blueprint_components"))
|
||||
UCLASS()
|
||||
class UMCPHandler_ListBlueprintComponents : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -107,7 +107,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="add_blueprint_component"))
|
||||
UCLASS()
|
||||
class UMCPHandler_AddBlueprintComponent : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -272,7 +272,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="remove_blueprint_component"))
|
||||
UCLASS()
|
||||
class UMCPHandler_RemoveBlueprintComponent : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="diff_two_blueprints"))
|
||||
UCLASS()
|
||||
class UMCPHandler_DiffTwoBlueprints : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
// HandleGetPinInfo — detailed information about a specific pin
|
||||
// ============================================================
|
||||
|
||||
UCLASS(meta=(ToolName="get_pin_details"))
|
||||
class UMCPHandler_GetPinInfo : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_GetPinDetails : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -133,8 +133,8 @@ public:
|
||||
// HandleCheckPinCompatibility — pre-flight check for connect_pins
|
||||
// ============================================================
|
||||
|
||||
UCLASS(meta=(ToolName="check_pin_connection_compatibility"))
|
||||
class UMCPHandler_CheckPinCompatibility : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_CheckPinConnectionCompatibility : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -255,8 +255,8 @@ public:
|
||||
// HandleListClasses — discover available UClasses
|
||||
// ============================================================
|
||||
|
||||
UCLASS(meta=(ToolName="search_unreal_classes"))
|
||||
class UMCPHandler_ListClasses : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_SearchUnrealClasses : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -378,8 +378,8 @@ public:
|
||||
// HandleListFunctions — list Blueprint-callable functions on a class
|
||||
// ============================================================
|
||||
|
||||
UCLASS(meta=(ToolName="list_class_functions"))
|
||||
class UMCPHandler_ListFunctions : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_ListClassFunctions : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -495,8 +495,8 @@ public:
|
||||
// HandleListProperties — list properties on a class
|
||||
// ============================================================
|
||||
|
||||
UCLASS(meta=(ToolName="list_class_properties"))
|
||||
class UMCPHandler_ListProperties : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_ListClassProperties : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -583,7 +583,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="show_commands"))
|
||||
UCLASS()
|
||||
class UMCPHandler_ShowCommands : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -607,8 +607,7 @@ public:
|
||||
if (Class->HasAnyClassFlags(CLASS_Abstract)) continue;
|
||||
const IMCPHandler* Handler = Cast<IMCPHandler>(Class->GetDefaultObject());
|
||||
if (!Handler) continue;
|
||||
const FString& ToolName = Class->GetMetaData(TEXT("ToolName"));
|
||||
if (ToolName.IsEmpty()) continue;
|
||||
FString ToolName = MCPUtils::GetToolName(Class);
|
||||
Handlers.Add({ToolName, Class});
|
||||
}
|
||||
Handlers.Sort();
|
||||
|
||||
@@ -28,7 +28,7 @@ struct FDispatcherParamEntry
|
||||
FString Type;
|
||||
};
|
||||
|
||||
UCLASS(meta=(ToolName="add_event_dispatcher"))
|
||||
UCLASS()
|
||||
class UMCPHandler_AddEventDispatcher : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -161,7 +161,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="list_event_dispatchers"))
|
||||
UCLASS()
|
||||
class UMCPHandler_ListEventDispatchers : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="reparent_blueprint"))
|
||||
UCLASS()
|
||||
class UMCPHandler_ReparentBlueprint : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -119,8 +119,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="create_blueprint_asset"))
|
||||
class UMCPHandler_CreateBlueprint : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_CreateBlueprintAsset : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -249,8 +249,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="create_blueprint_graph"))
|
||||
class UMCPHandler_CreateGraph : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_CreateBlueprintGraph : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -369,8 +369,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="delete_blueprint_graph"))
|
||||
class UMCPHandler_DeleteGraph : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_DeleteBlueprintGraph : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -458,8 +458,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="rename_blueprint_graph"))
|
||||
class UMCPHandler_RenameGraph : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_RenameBlueprintGraph : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="list_blueprint_interfaces"))
|
||||
UCLASS()
|
||||
class UMCPHandler_ListBlueprintInterfaces : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -71,7 +71,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="add_blueprint_interface"))
|
||||
UCLASS()
|
||||
class UMCPHandler_AddBlueprintInterface : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -210,7 +210,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="remove_blueprint_interface"))
|
||||
UCLASS()
|
||||
class UMCPHandler_RemoveBlueprintInterface : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="create_material_instance_asset"))
|
||||
class UMCPHandler_CreateMaterialInstance : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_CreateMaterialInstanceAsset : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -127,7 +127,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="set_material_instance_parameter"))
|
||||
UCLASS()
|
||||
class UMCPHandler_SetMaterialInstanceParameter : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -366,8 +366,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="dump_material_instance_parameters"))
|
||||
class UMCPHandler_GetMaterialInstanceParameters : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_DumpMaterialInstanceParameters : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -611,7 +611,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="reparent_material_instance"))
|
||||
UCLASS()
|
||||
class UMCPHandler_ReparentMaterialInstance : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -58,8 +58,8 @@ extern int32 TryAddMaterialExpressionSEH(
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="create_material_asset"))
|
||||
class UMCPHandler_CreateMaterial : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_CreateMaterialAsset : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -177,7 +177,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="set_material_property"))
|
||||
UCLASS()
|
||||
class UMCPHandler_SetMaterialProperty : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -387,7 +387,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="add_material_expression"))
|
||||
UCLASS()
|
||||
class UMCPHandler_AddMaterialExpression : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -579,7 +579,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="delete_material_expression"))
|
||||
UCLASS()
|
||||
class UMCPHandler_DeleteMaterialExpression : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -712,8 +712,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="connect_material_expression_pins"))
|
||||
class UMCPHandler_ConnectMaterialPins : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_ConnectMaterialExpressionPins : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -880,8 +880,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="disconnect_material_expression_pin"))
|
||||
class UMCPHandler_DisconnectMaterialPin : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_DisconnectMaterialExpressionPin : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -1010,8 +1010,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="set_material_expression_property"))
|
||||
class UMCPHandler_SetExpressionValue : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_SetMaterialExpressionProperty : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -1293,8 +1293,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="set_material_expression_position"))
|
||||
class UMCPHandler_MoveMaterialExpression : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_SetMaterialExpressionPosition : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -1413,8 +1413,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="create_material_function_asset"))
|
||||
class UMCPHandler_CreateMaterialFunction : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_CreateMaterialFunctionAsset : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="list_material_assets"))
|
||||
class UMCPHandler_ListMaterials : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_ListMaterialAssets : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -87,8 +87,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="dump_material"))
|
||||
class UMCPHandler_GetMaterial : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_DumpMaterial : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -343,8 +343,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="dump_material_expression_graph"))
|
||||
class UMCPHandler_GetMaterialGraph : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_DumpMaterialExpressionGraph : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -401,8 +401,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="describe_material_in_english"))
|
||||
class UMCPHandler_DescribeMaterial : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_DescribeMaterialInEnglish : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -609,8 +609,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="search_within_materials"))
|
||||
class UMCPHandler_SearchMaterials : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_SearchWithinMaterials : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -710,7 +710,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="find_material_references"))
|
||||
UCLASS()
|
||||
class UMCPHandler_FindMaterialReferences : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -758,8 +758,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="list_material_function_assets"))
|
||||
class UMCPHandler_ListMaterialFunctions : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_ListMaterialFunctionAssets : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -795,8 +795,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="dump_material_function"))
|
||||
class UMCPHandler_GetMaterialFunction : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_DumpMaterialFunction : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -886,8 +886,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="compile_material"))
|
||||
class UMCPHandler_ValidateMaterial : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_CompileMaterial : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ struct FMoveNodeEntry
|
||||
};
|
||||
|
||||
|
||||
UCLASS(meta=(ToolName="set_node_positions"))
|
||||
UCLASS()
|
||||
class UMCPHandler_SetNodePositions : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -138,7 +138,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="duplicate_nodes_in_graph"))
|
||||
UCLASS()
|
||||
class UMCPHandler_DuplicateNodesInGraph : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -302,7 +302,7 @@ struct FSpawnNodeEntry
|
||||
};
|
||||
|
||||
|
||||
UCLASS(meta=(ToolName="spawn_nodes_in_graph"))
|
||||
UCLASS()
|
||||
class UMCPHandler_SpawnNodesInGraph : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -429,7 +429,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="get_node_comment"))
|
||||
UCLASS()
|
||||
class UMCPHandler_GetNodeComment : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -468,7 +468,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="set_node_comment"))
|
||||
UCLASS()
|
||||
class UMCPHandler_SetNodeComment : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -524,7 +524,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="delete_node_from_graph"))
|
||||
UCLASS()
|
||||
class UMCPHandler_DeleteNodeFromGraph : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -610,7 +610,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="replace_function_calls_in_blueprint"))
|
||||
UCLASS()
|
||||
class UMCPHandler_ReplaceFunctionCallsInBlueprint : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -861,7 +861,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="refresh_all_nodes_in_graph"))
|
||||
UCLASS()
|
||||
class UMCPHandler_RefreshAllNodesInGraph : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -960,7 +960,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="change_struct_node_type"))
|
||||
UCLASS()
|
||||
class UMCPHandler_ChangeStructNodeType : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -1187,7 +1187,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="set_class_default_value"))
|
||||
UCLASS()
|
||||
class UMCPHandler_SetClassDefaultValue : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -1354,7 +1354,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="search_spawnable_node_types"))
|
||||
UCLASS()
|
||||
class UMCPHandler_SearchSpawnableNodeTypes : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -17,8 +17,8 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="change_function_parameter_type"))
|
||||
class UMCPHandler_ChangeFunctionParamType : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_ChangeFunctionParameterType : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -208,7 +208,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="remove_function_parameter"))
|
||||
UCLASS()
|
||||
class UMCPHandler_RemoveFunctionParameter : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -347,7 +347,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="add_function_parameter"))
|
||||
UCLASS()
|
||||
class UMCPHandler_AddFunctionParameter : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -35,7 +35,7 @@ struct FSetPinDefaultEntry
|
||||
};
|
||||
|
||||
|
||||
UCLASS(meta=(ToolName="set_pin_default_values"))
|
||||
UCLASS()
|
||||
class UMCPHandler_SetPinDefaultValues : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -154,7 +154,7 @@ struct FConnectPinsEntry
|
||||
};
|
||||
|
||||
|
||||
UCLASS(meta=(ToolName="connect_blueprint_pins"))
|
||||
UCLASS()
|
||||
class UMCPHandler_ConnectBlueprintPins : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -274,7 +274,7 @@ struct FDisconnectPinEntry
|
||||
};
|
||||
|
||||
|
||||
UCLASS(meta=(ToolName="disconnect_blueprint_pins"))
|
||||
UCLASS()
|
||||
class UMCPHandler_DisconnectBlueprintPins : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -26,8 +26,8 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="list_blueprint_assets"))
|
||||
class UMCPHandler_List : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_ListBlueprintAssets : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -93,8 +93,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="dump_blueprint"))
|
||||
class UMCPHandler_GetBlueprint : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_DumpBlueprint : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -121,8 +121,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="dump_blueprint_graph"))
|
||||
class UMCPHandler_GetGraph : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_DumpBlueprintGraph : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -177,8 +177,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="search_within_blueprints"))
|
||||
class UMCPHandler_Search : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_SearchWithinBlueprints : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -313,8 +313,8 @@ public:
|
||||
// HandleTestSave — load a Blueprint and save it unmodified (diagnostic)
|
||||
// ============================================================
|
||||
|
||||
UCLASS(meta=(ToolName="test_save_blueprint_package"))
|
||||
class UMCPHandler_TestSave : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_TestSaveBlueprintPackage : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -356,8 +356,8 @@ public:
|
||||
// HandleFindReferences — find all Blueprints referencing an asset
|
||||
// ============================================================
|
||||
|
||||
UCLASS(meta=(ToolName="find_asset_references"))
|
||||
class UMCPHandler_FindReferences : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_FindAssetReferences : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -417,8 +417,8 @@ public:
|
||||
// HandleSearchByType — find all usages of a type across blueprints
|
||||
// ============================================================
|
||||
|
||||
UCLASS(meta=(ToolName="search_type_usage_in_blueprints"))
|
||||
class UMCPHandler_SearchByType : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_SearchTypeUsageInBlueprints : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="add_anim_state_to_machine"))
|
||||
class UMCPHandler_AddAnimState : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_AddAnimStateToMachine : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -119,8 +119,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="remove_anim_state_from_machine"))
|
||||
class UMCPHandler_RemoveAnimState : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_RemoveAnimStateFromMachine : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -187,8 +187,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="add_anim_state_transition"))
|
||||
class UMCPHandler_AddAnimTransition : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_AddAnimStateTransition : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -276,8 +276,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="set_anim_transition_rule"))
|
||||
class UMCPHandler_SetTransitionRule : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_SetAnimTransitionRule : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -379,8 +379,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="set_anim_state_animation"))
|
||||
class UMCPHandler_SetStateAnimation : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_SetAnimStateAnimation : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -460,8 +460,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="set_anim_state_blend_space"))
|
||||
class UMCPHandler_SetStateBlendSpace : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_SetAnimStateBlendSpace : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
|
||||
@@ -33,8 +33,8 @@ struct FStructPropertyEntry
|
||||
FString Type;
|
||||
};
|
||||
|
||||
UCLASS(meta=(ToolName="create_struct_asset"))
|
||||
class UMCPHandler_CreateStruct : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_CreateStructAsset : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -142,8 +142,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="create_enum_asset"))
|
||||
class UMCPHandler_CreateEnum : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_CreateEnumAsset : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -220,7 +220,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="add_struct_field"))
|
||||
UCLASS()
|
||||
class UMCPHandler_AddStructField : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
@@ -286,7 +286,7 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="remove_struct_field"))
|
||||
UCLASS()
|
||||
class UMCPHandler_RemoveStructField : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="compile_blueprint"))
|
||||
UCLASS()
|
||||
class UMCPHandler_CompileBlueprint : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="change_blueprint_variable_type"))
|
||||
class UMCPHandler_ChangeVariableType : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_ChangeBlueprintVariableType : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -200,8 +200,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="add_blueprint_variable"))
|
||||
class UMCPHandler_AddVariable : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_AddBlueprintVariable : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -288,8 +288,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="remove_blueprint_variable"))
|
||||
class UMCPHandler_RemoveVariable : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_RemoveBlueprintVariable : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -359,8 +359,8 @@ public:
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
UCLASS(meta=(ToolName="set_blueprint_variable_metadata"))
|
||||
class UMCPHandler_SetVariableMetadata : public UObject, public IMCPHandler
|
||||
UCLASS()
|
||||
class UMCPHandler_SetBlueprintVariableMetadata : public UObject, public IMCPHandler
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
|
||||
@@ -420,15 +420,10 @@ void FMCPServer::BuildMCPHandlerRegistry()
|
||||
{
|
||||
continue;
|
||||
}
|
||||
const FString& ToolName = Class->GetMetaData(TEXT("ToolName"));
|
||||
if (ToolName.IsEmpty())
|
||||
{
|
||||
UE_LOG(LogTemp, Warning, TEXT("BlueprintMCP: %s has no ToolName meta — skipping."), *Class->GetName());
|
||||
continue;
|
||||
}
|
||||
FString ToolName = MCPUtils::GetToolName(Class);
|
||||
if (MCPHandlerRegistry.Contains(ToolName))
|
||||
{
|
||||
UE_LOG(LogTemp, Warning, TEXT("BlueprintMCP: Duplicate ToolName '%s' on %s — skipping."), *ToolName, *Class->GetName());
|
||||
UE_LOG(LogTemp, Warning, TEXT("BlueprintMCP: Duplicate tool name '%s' on %s — skipping."), *ToolName, *Class->GetName());
|
||||
continue;
|
||||
}
|
||||
MCPHandlerRegistry.Add(ToolName, Class);
|
||||
|
||||
@@ -1499,6 +1499,21 @@ bool MCPUtils::PopulateFromJson(
|
||||
return true;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// GetToolName — derive tool name from handler class name
|
||||
// ============================================================
|
||||
|
||||
FString MCPUtils::GetToolName(UClass* HandlerClass)
|
||||
{
|
||||
FString Name = HandlerClass->GetName();
|
||||
int32 UnderscoreIdx;
|
||||
if (Name.FindChar(TEXT('_'), UnderscoreIdx))
|
||||
{
|
||||
return Name.Mid(UnderscoreIdx + 1);
|
||||
}
|
||||
return Name;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// FormatPropertyType — human-readable type name for a UPROPERTY
|
||||
// ============================================================
|
||||
@@ -1527,7 +1542,7 @@ void MCPUtils::FormatCommandHelp(UClass* HandlerClass, FStringBuilderBase& Resul
|
||||
const IMCPHandler* Handler = Cast<IMCPHandler>(HandlerClass->GetDefaultObject());
|
||||
if (!Handler) return;
|
||||
|
||||
const FString& ToolName = HandlerClass->GetMetaData(TEXT("ToolName"));
|
||||
FString ToolName = GetToolName(HandlerClass);
|
||||
|
||||
// Command signature line
|
||||
Result.Append(ToolName);
|
||||
|
||||
@@ -200,6 +200,8 @@ public:
|
||||
static bool PopulateFromJson(UStruct* StructType, void* Container, const FJsonObject* Json, MCPErrorCallback Error);
|
||||
|
||||
// ----- Command help -----
|
||||
// Derive tool name from handler class name: "MCPHandler_FooBar" → "FooBar"
|
||||
static FString GetToolName(UClass* HandlerClass);
|
||||
static FString FormatPropertyType(FProperty* Prop);
|
||||
static void FormatCommandHelp(UClass* HandlerClass, FStringBuilderBase& Result);
|
||||
|
||||
|
||||
@@ -1,66 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Human-friendly MCP test client.
|
||||
|
||||
Usage: python3 tools/mcp-test.py command=show_commands
|
||||
python3 tools/mcp-test.py command=list_blueprint_assets filter=lx
|
||||
python3 tools/mcp-test.py command=show_commands verbose=true
|
||||
"""
|
||||
|
||||
import sys
|
||||
import json
|
||||
import socket
|
||||
|
||||
HOST = "localhost"
|
||||
PORT = 9847
|
||||
TIMEOUT = 120
|
||||
|
||||
def main():
|
||||
msg = {}
|
||||
for arg in sys.argv[1:]:
|
||||
key, _, value = arg.partition("=")
|
||||
if value.lower() == "true":
|
||||
value = True
|
||||
elif value.lower() == "false":
|
||||
value = False
|
||||
else:
|
||||
try:
|
||||
value = int(value)
|
||||
except ValueError:
|
||||
pass
|
||||
msg[key] = value
|
||||
|
||||
if not msg:
|
||||
print("Usage: python3 tools/mcp-test.py command=show_commands")
|
||||
sys.exit(1)
|
||||
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.settimeout(TIMEOUT)
|
||||
try:
|
||||
sock.connect((HOST, PORT))
|
||||
except (ConnectionRefusedError, socket.timeout, OSError) as e:
|
||||
print(f"Cannot connect to {HOST}:{PORT} — is the editor running?")
|
||||
sys.exit(1)
|
||||
|
||||
sock.sendall((json.dumps(msg) + "\n").encode())
|
||||
|
||||
result = b""
|
||||
while True:
|
||||
chunk = sock.recv(65536)
|
||||
if not chunk:
|
||||
break
|
||||
result += chunk
|
||||
if b"\0" in result:
|
||||
break
|
||||
|
||||
sock.close()
|
||||
result = result[:result.index(b"\0")].decode() if b"\0" in result else result.decode()
|
||||
|
||||
try:
|
||||
parsed = json.loads(result)
|
||||
print(json.dumps(parsed, indent=2))
|
||||
except json.JSONDecodeError:
|
||||
print(result)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user