#include "editHandlers.h"
#include "avatar.h"
#include "world.h"
#include "stringutil.h"
#include "commandTable.h"
#include "split.h"
#include <iostream>
#include <cstring>
#include <list>
using namespace std;
EditAvatarHandler::EditAvatarHandler( ) {
_edit = NULL;
}
EditAvatarHandler::EditAvatarHandler( Char * avatar, const string &name ) {
string buf;
_edit = new Avatar;
_edit->Set( "name", name );
if ( !_edit->Load() ) {
delete _edit;
_edit = NULL;
avatar->Send( "That user does not exist.\n\r" );
return;
}
_name = _edit->Get( "name" );
buf << "You are now editing [{b" << _edit->Get( "name" ) << "{x]\n\r";
avatar->Send( buf );
}
void EditAvatarHandler::Enter( Avatar * avatar ) {
avatar->Send( "================================\n\r" );
avatar->Send( "=== {WAvatar Editor{x ===\n\r" );
avatar->Send( "=== #help - More Information ===\n\r" );
avatar->Send( "=== #quit - Exits Editor ===\n\r" );
avatar->Send( "================================\n\r" );
}
void EditAvatarHandler::Exit( Avatar * avatar ) {
delete this;
return;
}
void EditAvatarHandler::Handle( Avatar * avatar, const string &input) {
string checked;
string option;
string change;
string buf;
bool command = false;
if ( input.empty () )
return;
checked = input;
for ( string::const_iterator cChar = input.begin(); cChar != input.end(); ++cChar ) {
if ( (*cChar) == '/' && cChar == input.begin() ) {
option = input.substr( 1, input.length() );
if ( !strstr( input.c_str(), "quit" ) ) CommandTable::Instance().Execute( avatar, option );
return;
} else if ( (*cChar) == '#' && cChar == input.begin() ) {
command = true;
option = input.substr( 1, input.length() );
checked = option;
option.erase();
break;
} else if ( ( (*cChar) == '\n' || (*cChar) == '\r' ) && cChar == input.begin() ) {
checked.erase();
break;
}
}
split( checked, option, change );
if ( !strcasecmp( option, "quit" ) && command == true )
{
Avatar * test;
if ( _edit )
{
_edit->Save();
if ( ( test = World::Instance().FindAvatar( _name ) )!= NULL )
{
if ( str_cmp( _edit->Get( "name" ), test->Get( "name" ) ) )
test->Set( "name", _name );
test->Load();
}
_edit = NULL;
}
else
avatar->ExitHandler();
return;
}
else if ( !strcasecmp( option, "abort" ) && command == true )
{
Avatar * test;
if ( _edit )
{
if ( ( test = World::Instance().FindAvatar( _name ) )!= NULL )
{
if ( str_cmp( _edit->Get( "name" ), test->Get( "name" ) ) )
test->Set( "name", _name );
test->Load();
}
_edit = NULL;
}
else
avatar->ExitHandler();
return;
}
else if ( ( !strcasecmp( option, "commands" ) || !strcasecmp( option, "help" ) ) )
{
string buf;
if ( !_edit )
buf << "Enter the name of the user you wish to edit.\n\r";
else
{
buf << "|------------------------------ Help ---------------------------------|\n\r";
buf << "| #commands This help file. |\n\r";
buf << "| #show Shows what you are editing. |\n\r";
buf << "| #quit Quits the Mob Editor and saves the (N)PC |\n\r";
buf << "| #abort Quits the Mob Editor and -doesnt- save the (N)PC |\n\r";
buf << "| #save Save your current progress. |\n\r";
buf << "| #delete Delete the player file you're editing. |\n\r";
buf << "| |\n\r";
buf << "| Editing Commands |\n\r";
buf << "| name <name> Changes the users name. |\n\r";
buf << "| group <group> Changes the users group. |\n\r";
buf << "| password <pass> Changes the users password. |\n\r";
buf << "| title <title> Changes the users title. |\n\r";
buf << "| reply <reply> Changes who the user will reply to. |\n\r";
buf << "| |\n\r";
buf << "| Note: Name changes happen regardless of saving! Be careful when |\n\r";
buf << "| changing names! |\n\r";
buf << "| |\n\r";
buf << "| {R*{x Commands preceded by a {B/{x will be executed as regular commands. |\n\r";
buf << "|---------------------------------------------------------------------|\n\r\n\r";
}
avatar->Send( buf );
return;
}
if ( checked.empty() || ( !strcasecmp( option, "show" ) && command == true ) ) {
if ( _edit ) {
buf << "[name: " << _edit->Get( "name" ) << "]\n\r";
buf << "[group: " << _edit->Get("group") << "]\n\r";
buf << "[password: (hidden)]\n\r";
buf << "[title: " << _edit->Get("title") << "]\n\r";
buf << "[reply: " << _edit->Get("reply") << "]\n\r";
buf << "[login: " << _edit->Get("login") << "]\n\r";
} else {
buf << "You are not currently editing anything.\n\r";
}
avatar->Send( buf );
return;
} else if ( _edit ) {
if ( !strcasecmp( option, "name" ) ) {
string oldName = _edit->Get( "name" );
Avatar * test = new Avatar;
test->Set( "name", change );
if ( strcasecmp( change, oldName ) && test->Load() ) {
avatar->Send( "That name exists already.\n\r" );
delete test;
return;
}
_edit->Set( "name", change );
if ( strcasecmp( change, oldName ) )
_edit->Create();
_edit->Save();
if ( strcasecmp( change, oldName ) ) {
_edit->Set( "name", oldName );
_edit->Delete();
_edit->Set( "name", change );
}
_edit->Load();
if ( ( test = World::Instance().FindAvatar( _name ) )!= NULL ) {
test->Set( "name", _edit->Get( "name" ) );
test->Load();
}
avatar->Send( "Name updated.\n\r" );
return;
} else if ( !strcasecmp( option, "group" ) ) {
_edit->Set( "group", change );
avatar->Send( "Group updated.\n\r" );
return;
} else if ( !strcasecmp( option, "title" ) ) {
_edit->Set( "title", change );
avatar->Send( "Title updated.\n\r" );
return;
} else if ( !strcasecmp( option, "password" ) ) {
_edit->Set( "password", _edit->EncryptPassword( change ) );
avatar->Send( "Password changed.\n\r" );
return;
} else if ( !strcasecmp( option, "reply" ) ) {
_edit->Set( "reply", change );
avatar->Send( "Reply updated.\n\r" );
return;
} else if ( ( !strcasecmp( option, "save" ) && command == true ) ) {
_edit->Save();
Avatar * test;
if ( ( test = World::Instance().FindAvatar( _name ) ) != NULL ) {
test->Set( "name", _edit->Get( "name" ) );
test->Load();
}
avatar->Send( "Player saved.\n\r" );
return;
} else if ( ( !strcasecmp( option, "delete" ) && command == true ) ) {
string buf;
buf << _edit->Get( "name" ) << " has been deleted.\n\r";
_edit->Delete();
delete _edit;
_edit = NULL;
avatar->Send( buf );
return;
}
} else if ( !_edit ) {
_edit = new Avatar;
_edit->Set( "name", option );
if ( !_edit->Load() ) {
delete _edit;
_edit = NULL;
avatar->Send( "That user does not exist.\n\r" );
return;
}
_name = _edit->Get( "name" );
buf << "You are now editing [{b" << _edit->Get( "name" ) << "{x]\n\r";
avatar->Send( buf );
return;
}
if ( command ) {
avatar->Send( "That is an invalid # command. Try #commands\n\r" );
}
}
string EditAvatarHandler::Prompt( Avatar * avatar ) {
return _edit == NULL ? "Enter avatar: " : ">> ";
}