@ -40,6 +40,8 @@ DFHACK_PLUGIN("orders");
REQUIRE_GLOBAL ( world ) ;
static const std : : string ORDERS_DIR = " dfhack-config/orders " ;
static command_result orders_command ( color_ostream & out , std : : vector < std : : string > & parameters ) ;
DFhackCExport command_result plugin_init ( color_ostream & out , std : : vector < PluginCommand > & commands )
@ -50,6 +52,8 @@ DFhackCExport command_result plugin_init(color_ostream & out, std::vector<Plugin
orders_command ,
false ,
" orders - Manipulate manager orders \n "
" orders list \n "
" Shows the list of previously exported orders. "
" orders export [name] \n "
" Exports the current list of manager orders to a file named dfhack-config/orders/[name].json. \n "
" orders import [name] \n "
@ -67,6 +71,7 @@ DFhackCExport command_result plugin_shutdown(color_ostream & out)
return CR_OK ;
}
static command_result orders_list_command ( color_ostream & out ) ;
static command_result orders_export_command ( color_ostream & out , const std : : string & name ) ;
static command_result orders_import_command ( color_ostream & out , const std : : string & name ) ;
static command_result orders_clear_command ( color_ostream & out ) ;
@ -88,6 +93,11 @@ static command_result orders_command(color_ostream & out, std::vector<std::strin
return CR_WRONG_USAGE ;
}
if ( parameters [ 0 ] = = " list " )
{
return orders_list_command ( out ) ;
}
if ( parameters [ 0 ] = = " export " & & parameters . size ( ) = = 2 )
{
return orders_export_command ( out , parameters [ 1 ] ) ;
@ -111,6 +121,38 @@ static command_result orders_command(color_ostream & out, std::vector<std::strin
return CR_WRONG_USAGE ;
}
static command_result orders_list_command ( color_ostream & out )
{
// use listdir_recursive instead of listdir even though orders doesn't
// support subdirs so we can identify and ignore subdirs with ".json" names.
// also listdir_recursive will alphabetize the list for us.
std : : map < std : : string , bool > files ;
if ( 0 < Filesystem : : listdir_recursive ( ORDERS_DIR , files , 0 , false ) )
{
out < < COLOR_LIGHTRED < < " Unable to list files in directory: " < < ORDERS_DIR < < std : : endl ;
return CR_FAILURE ;
}
if ( files . empty ( ) )
{
out < < COLOR_YELLOW < < " No exported orders yet. Create manager orders and export them with 'orders export <name>', or copy pre-made orders .json files into " < < ORDERS_DIR < < " . " < < std : : endl ;
return CR_OK ;
}
for ( auto it : files )
{
if ( it . second )
continue ; // skip directories
std : : string name = it . first ;
if ( name . length ( ) < = 5 | | name . rfind ( " .json " ) ! = name . length ( ) - 5 )
continue ; // skip non-.json files
name . resize ( name . length ( ) - 5 ) ;
out < < name < < std : : endl ;
}
return CR_OK ;
}
static bool is_safe_filename ( color_ostream & out , const std : : string & name )
{
if ( name . empty ( ) )
@ -439,9 +481,9 @@ static command_result orders_export_command(color_ostream & out, const std::stri
}
}
Filesystem : : mkdir ( " dfhack-config/orders " ) ;
Filesystem : : mkdir ( ORDERS_DIR ) ;
std : : ofstream file ( " dfhack-config/orders /" + name + " .json " ) ;
std : : ofstream file ( ORDERS_DIR + " /" + name + " .json " ) ;
file < < orders < < std : : endl ;
@ -852,7 +894,7 @@ static command_result orders_import_command(color_ostream & out, const std::stri
return CR_WRONG_USAGE ;
}
const std : : string filename ( " dfhack-config/orders /" + name + " .json " ) ;
const std : : string filename ( ORDERS_DIR + " /" + name + " .json " ) ;
Json : : Value orders ;
{