/**************************************************************************/
// scripts.cpp - src file for scripting commands written by Celrion
/***************************************************************************
* The Dawn of Time v1.69r (c)1997-2004 Michael Garratt *
* >> A number of people have contributed to the Dawn codebase, with the *
* majority of code written by Michael Garratt - www.dawnoftime.org *
* >> To use this source code, you must fully comply with the dawn license *
* in licenses.txt... In particular, you may not remove this copyright *
* notice. *
**************************************************************************/
#include "include.h"
#include "scripts.h"
SCRIPT_DATA *script_list;
/**************************************************************************/
//Create script_data GIO lookup table
GIO_START(SCRIPT_DATA)
GIO_STRH(script_name, "Script_Name ")
GIO_STRH(auth_users, "Authorized_Users ")
GIO_FINISH
/**************************************************************************/
//Loads up the script database
void load_script_db( void )
{
logf("===Loading script database from %s...", SCRIPTS_FILE);
if(file_exists(SCRIPTS_FILE)){
GIOLOAD_LIST(script_list, SCRIPT_DATA, SCRIPTS_FILE);
}else{
logf("Scripts database file not present - "
"this is normal if no scripts have been defined.");
}
log_string ("load_script_db(): finished");
}
/**************************************************************************/
//Save the script database
void save_script_db( void )
{
logf("save_script_db(): saving script database to %s", SCRIPTS_FILE);
GIOSAVE_LIST(script_list, SCRIPT_DATA, SCRIPTS_FILE, true);
}
/**************************************************************************/
//Returns pointer to script_data node
script_data *find_script_node( char *name )
{
script_data *node;
for (node = script_list; node; node = node->next)
{
if ( !strcmp ( name, node->script_name ) )
return node;
}
return NULL;
}
/**************************************************************************/
// Creates a node of type script_data
script_data *create_script_node( char_data *ch, char *scriptname, char *name )
{
script_data *node;
static script_data zero_node;
node = new script_data;
*node = zero_node;
// add the new node to the head of the script_list
node->next = script_list;
script_list = node;
smash_tilde(scriptname);
node->script_name=str_dup(scriptname);
if( name )
{
node->auth_users=str_dup(name);
ch->printlnf("A new script named %s has been added, with %s as an authorized user.",
node->script_name, node->auth_users);
}
else
{
node->auth_users=str_dup("None");
ch->printlnf("A new script named '%s' has been added.", node->script_name);
}
save_script_db();
return node;
}
/**************************************************************************/
// if it returns NULL the scriptname is valid
// otherwise it returns a text message stating why it isn't valid
char *is_valid_scriptname(char *scriptname)
{
static char result[MSL];
char *bad_characters=";<>`1[]``'\\/$|";
if (has_whitespace(scriptname)){
sprintf(result,"The script filename can not have any whitespace "
"characters in it!`1try again:`1");
return result;
}
{ // check for the bad characters
int i;
for(i=0; bad_characters[i];i++){
if(count_char(scriptname, bad_characters[i])>0){
sprintf(result,"%c is not an allowed character allowed in a script name -"
"try again.`1", bad_characters[i]);
return result;
}
}
}
return NULL;
}
/**************************************************************************/
void do_addscript( char_data *ch, char *argument )
{
script_data *node;
char scriptname[MIL], filename[MIL], immname[MIL], buf[MIL];
argument = one_argument( argument, scriptname );
one_argument( argument, immname );
if (IS_NULLSTR(scriptname))
{
ch->println("syntax: Addscript <script name> [immortal name]");
return;
}
// ensure the scriptname wont stuff things up
{
char *sresult=is_valid_scriptname(scriptname);
if(sresult){
ch->printf(sresult);
return;
}
}
node = find_script_node(scriptname);
sprintf(filename, "%s%s", SCRIPTS_DIR, scriptname);
if (IS_NULLSTR(immname))
{
if(node)
{
ch->printlnf("The script %s already exists!", node->script_name);
return;
}
else
{
if ( !file_exists(filename) )
{
ch->printlnf("There is no script named '%s' in the scripts directory.", scriptname);
{
char bufcommand[MSL],buf2[MSL];
BUFFER *output;
output= new_buf();
#ifdef unix
sprintf( bufcommand,"ls " SCRIPTS_DIR " -al -t");
#else
sprintf( bufcommand,"dir " SCRIPTS_DIR );
#endif
sprintf( buf2,"\r\n`?%s`x",
makef_titlebar("SCRIPTS DIR - Piping:`x %s", bufcommand));
add_buf(output,buf2);
add_buf(output,get_piperesult(bufcommand));
sprintf( buf2,"`^%s`x", makef_titlebar("-"));
add_buf(output,buf2);
ch->sendpage(buf_string(output));
free_buf(output);
}
return;
}
create_script_node( ch, scriptname, NULL );
return;
}
}
else
{
immname[0] = UPPER( immname[0] );
if (!node)
{
if ( !file_exists(filename) )
{
ch->printlnf("There is no script named '%s' in the scripts directory.", scriptname);
{
char bufcommand[MSL],buf2[MSL];
BUFFER *output;
output= new_buf();
#ifdef unix
sprintf( bufcommand,"ls " SCRIPTS_DIR " -al -t");
#else
sprintf( bufcommand,"dir " SCRIPTS_DIR );
#endif
sprintf( buf2,"\r\n`?%s`x",
makef_titlebar("SCRIPTS DIR - Piping:`x %s", bufcommand));
add_buf(output,buf2);
add_buf(output,get_piperesult(bufcommand));
sprintf( buf2,"`^%s`x", makef_titlebar("-"));
add_buf(output,buf2);
ch->sendpage(buf_string(output));
free_buf(output);
}
return;
}
create_script_node( ch, scriptname, immname );
return;
}
if ( is_exact_name( immname, node->auth_users ) )
{
ch->printlnf("%s is already an authorized user of this script.", immname);
return;
}
buf[0] = '\0';
if ( strstr( node->auth_users, "None" ) != '\0' )
{
node->auth_users = string_replace( node->auth_users, "None", "" );
node->auth_users = ltrim_string(rtrim_string( node->auth_users ));
}
if ( node->auth_users[0] != '\0' )
{
strcat( buf, node->auth_users );
strcat( buf, " " );
}
strcat( buf, immname );
free_string( node->auth_users );
node->auth_users = string_proper( str_dup( buf ) );
ch->printlnf("Authorized User added to script. Current authorized users:\r\n%s",
node->auth_users );
save_script_db();
return;
}
}
/**************************************************************************/
void do_delscript( char_data *ch, char *argument )
{
char scriptname[MIL], immname[MIL];
script_data *node = NULL, *previous = NULL, *current = NULL;
if( IS_NULLSTR( argument ) )
{
ch->println("Syntax: delscript <script_name> [authorized_users]");
ch->println("With an authorized users name, it will just remove the user,");
ch->println("Without a user listed at all, it will remove the script entirely.");
return;
}
argument = one_argument( argument, scriptname );
one_argument( argument, immname );
node = find_script_node(scriptname);
if( !node )
{
ch->printlnf("There is no script named '%s' in the script database.", scriptname );
return;
}
if( IS_NULLSTR( immname ) )
{
ch->printlnf("%s has been removed from the scripts database.", node->script_name );
if( node == script_list ) // Stripping from head of list
script_list = script_list->next;
else
{
previous = script_list;
for( current = script_list->next; current; current = current->next)
if ( node == current )
break;
previous = current;
}
if( current )
previous->next = current->next;
}
else
{
immname[0] = UPPER( immname[0] );
if ( !is_exact_name( immname, node->auth_users ) )
{
ch->printlnf("%s is not an authorized user of this script.", immname );
return;
}
if ( strstr( node->auth_users, immname ) != '\0' ){
node->auth_users = string_replace( node->auth_users, immname, "\0" );
node->auth_users = ltrim_string(rtrim_string( node->auth_users ));
if ( node->auth_users[0] == '\0' )
{
free_string( node->auth_users );
node->auth_users = str_dup( "None" );
}
ch->printlnf("%s has been removed from authorized users.", immname );
ch->printlnf("Current authorized users:\r\n%s", node->auth_users);
}else{
ch->println("bug");
}
}
save_script_db();
return;
}
/**************************************************************************/
void do_listscripts( char_data *ch, char *argument )
{
script_data *node;
int count = 1;
char scriptname[MIL];
if( IS_NULLSTR( argument ) )
{
ch->titlebar("Scripts - All");
for( node = script_list; node; node = node->next, count++)
{
ch->printlnf("%-2d - `#`CScript name:`^ %s", count, node->script_name );
ch->printlnf(" `#`CUsers:`^ %s", node->auth_users );
}
}else{
one_argument( argument, scriptname );
node = find_script_node( scriptname );
if( node )
{
ch->printlnf("`#`CScript name:`^ %s", node->script_name);
ch->printlnf("`#`CUsers:`^ %s", node->auth_users);
}
else
ch->printlnf("There was no script named '%s' found.", scriptname );
}
return;
}
/**************************************************************************/
void do_runscript( char_data *ch, char *argument )
{
script_data *node;
char filename[MIL], scriptname[MIL];
one_argument( argument, scriptname );
if( !str_cmp( TRUE_CH(ch)->name, "none")){
ch->println("You can't run scripts if your name is 'None'!");
return;
}
if( IS_NULLSTR( argument ) )
{
ch->printf("syntax: runscript <scriptname>\r\n"
"You may run any of the following scripts:\r\n");
for( node = script_list; node; node = node->next)
{
if ( !is_exact_name( TRUE_CH(ch)->name, node->auth_users ) ){
continue;
}
ch->printlnf("`#`CScript name:`^ %s", node->script_name );
if(IS_ADMIN(ch)){
ch->printlnf(" `#`CUsers:`^ %s", node->auth_users );
}
}
return;
}
node = find_script_node(scriptname);
if ( !node )
{
ch->printlnf("There is no script named '%s' in the database.", scriptname );
return;
}
if ( !is_exact_name( TRUE_CH(ch)->name, node->auth_users ) )
{
ch->println("You're not authorized to run that script.");
return;
}
sprintf(filename, "%s%s", SCRIPTS_DIR, scriptname);
#ifdef unix
strcat(filename, " &");
#endif
system(filename);
ch->printlnf("Script %s successfully run!", scriptname );
return;
}
/**************************************************************************/