#include <list>
#include "smysql.h"
#include "commands.h"
#include "commandTable.h"
#include "avatar.h"
#include "world.h"
#include "handler.h"
#include "editHandlers.h"
#include "stringutil.h"
#include "split.h"
#include "timestamp.h"
#include "log.h"
#include "room.h"
using namespace std;
CmdWest::CmdWest()
{
SetName( "west" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdWest::Execute( Char* avatar, const string &args )
{
Room *r = NULL;
Room *prev = NULL;
string s;
if ( !avatar->_room )
return false;
r = (avatar->_room->GetExit("west"));
prev = avatar->_room;
if ( r == NULL && ((r = avatar->_room->GetExit("w")) == NULL ))
{
avatar->Send( "There is no exit in that direction!\n\r");
return false;
}
avatar->Send( "You leave to the west.\n\r");
s << avatar->Get("name") << " arrives from the east.\n\r";
r->Broadcast(s);
r->InsertAvatar( avatar );
s = "";
s << avatar->Get("name") << " leaves to the west.\n\r";
prev->Broadcast(s);
return true;
}
CmdEast::CmdEast()
{
SetName( "east" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdEast::Execute( Char* avatar, const string &args )
{
Room *r = NULL;
Room *prev = NULL;
string s;
if ( !avatar->_room )
return false;
r = avatar->_room->GetExit("east");
prev = avatar->_room;
if ( r == NULL && ((r = avatar->_room->GetExit("e")) == NULL ))
{
avatar->Send( "There is no exit in that direction!\n\r");
return false;
}
avatar->Send( "You leave to the east.\n\r");
s << avatar->Get("name") << " arrives from the west.\n\r";
r->Broadcast(s);
r->InsertAvatar( avatar );
s = "";
s << avatar->Get("name") << " leaves to the east.\n\r";
prev->Broadcast(s);
return true;
}
CmdNorth::CmdNorth()
{
SetName( "north" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdNorth::Execute( Char* avatar, const string &args )
{
Room *r = NULL;
Room *prev = NULL;
string s;
if ( !avatar->_room )
return false;
r = avatar->_room->GetExit("north");
prev = avatar->_room;
if ( r == NULL && (r = avatar->_room->GetExit("n")) == NULL )
{
avatar->Send( "There is no exit in that direction!\n\r");
return false;
}
avatar->Send( "You leave to the north.\n\r");
s << avatar->Get("name") << " arrives from the south.\n\r";
r->Broadcast(s);
r->InsertAvatar( avatar );
s = "";
s << avatar->Get("name") << " leaves to the north.\n\r";
prev->Broadcast(s);
return true;
}
CmdSouth::CmdSouth()
{
SetName( "south" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdSouth::Execute( Char* avatar, const string &args )
{
Room *r = NULL;
Room *prev = NULL;
string s;
if ( !avatar->_room )
return false;
r = avatar->_room->GetExit("south");
prev = avatar->_room;
if ( r == NULL && ((r = avatar->_room->GetExit("s")) == NULL ))
{
avatar->Send( "There is no exit in that direction!\n\r");
return false;
}
avatar->Send( "You leave to the south.\n\r");
s << avatar->Get("name") << " arrives from the north.\n\r";
r->Broadcast(s);
r->InsertAvatar( avatar );
s = "";
s << avatar->Get("name") << " leaves to the south.\n\r";
prev->Broadcast(s);
return true;
}
CmdNorthEast::CmdNorthEast()
{
SetName( "northeast" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdNorthEast::Execute( Char* avatar, const string &args )
{
Room *r = NULL;
Room *prev = NULL;
string s;
if ( !avatar->_room )
return false;
r = avatar->_room->GetExit("northeast");
prev = avatar->_room;
if ( r == NULL && ((r = avatar->_room->GetExit("ne")) == NULL ))
{
avatar->Send( "There is no exit in that direction!\n\r");
return false;
}
avatar->Send( "You leave to the northeast.\n\r");
s << avatar->Get("name") << " arrives from the southwest.\n\r";
r->Broadcast(s);
r->InsertAvatar( avatar );
s = "";
s << avatar->Get("name") << " leaves to the northeast.\n\r";
prev->Broadcast(s);
return true;
}
CmdNorthWest::CmdNorthWest()
{
SetName( "northwest" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdNorthWest::Execute( Char* avatar, const string &args )
{
Room *r = NULL;
Room *prev = NULL;
string s;
if ( !avatar->_room )
return false;
r = avatar->_room->GetExit("northwest");
prev = avatar->_room;
if ( r == NULL && ((r = avatar->_room->GetExit("nw")) == NULL ) )
{
avatar->Send( "There is no exit in that direction!\n\r");
return false;
}
avatar->Send( "You leave to the northwest.\n\r");
s << avatar->Get("name") << " arrives from the southeast.\n\r";
r->Broadcast(s);
r->InsertAvatar( avatar );
s = "";
s << avatar->Get("name") << " leaves to the northwest.\n\r";
prev->Broadcast(s);
return true;
}
CmdSouthEast::CmdSouthEast()
{
SetName( "southeast" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdSouthEast::Execute( Char* avatar, const string &args )
{
Room *r = NULL;
Room *prev = NULL;
string s;
if ( !avatar->_room )
return false;
r = avatar->_room->GetExit("southeast");
prev = avatar->_room;
if ( r == NULL && ((r = avatar->_room->GetExit("se")) == NULL ) )
{
avatar->Send( "There is no exit in that direction!\n\r");
return false;
}
avatar->Send( "You leave to the southeast.\n\r");
s << avatar->Get("name") << " arrives from the northwest.\n\r";
r->Broadcast(s);
r->InsertAvatar( avatar );
s = "";
s << avatar->Get("name") << " leaves to the southeast.\n\r";
prev->Broadcast(s);
return true;
}
CmdSouthWest::CmdSouthWest()
{
SetName( "southwest" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdSouthWest::Execute( Char* avatar, const string &args )
{
Room *r = NULL;
Room *prev = NULL;
string s;
if ( !avatar->_room )
return false;
r = avatar->_room->GetExit("southwest");
prev = avatar->_room;
if ( r == NULL && ((r = avatar->_room->GetExit("sw")) == NULL ))
{
avatar->Send( "There is no exit in that direction!\n\r");
return false;
}
avatar->Send( "You leave to the southwest.\n\r");
s << avatar->Get("name") << " arrives from the northeast.\n\r";
r->Broadcast(s);
r->InsertAvatar( avatar );
s = "";
s << avatar->Get("name") << " leaves to the southwest.\n\r";
prev->Broadcast(s);
return true;
}
CmdHelp::CmdHelp()
{
SetName( "help" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdHelp::Execute( Char* avatar, const string &args )
{
Help* help = NULL;
string s;
if ( args.empty() )
{
return true;
}
if ( ((help = World::Instance().FindHelp(args)) == NULL) ||
(avatar->Get("group").find( help->Get("perm") ) == string::npos))
{
s << "\n\rNo help file with name '" << args << "' was found.\n\r";
avatar->Send(s);
return false;
}
s << "\n\r~-~-~-( " << help->Get("name") << " )~-~-~-\n\r";
s << help->Get("text");
s << "\n\r\n\r";
s << "--------------------\n\r";
s << "Author: " << help->Get("author") << "\n\r";
s << "Created: " << help->Get("creation_date") << "\n\r";
s << "Last Updated: " << help->Get("last_update") << "\n\r\n\r";
avatar->Send(s);
return true;
}
CmdLook::CmdLook()
{
SetName( "look" );
SetGroup("player");
SetEnabled( true );
}
bool CmdLook::Execute( Char* avatar, const string &args )
{
string s, title;
RoomMap rmap;
if ( !avatar )
return false;
else if ( !avatar->_room ) return false;
rmap = avatar->_room->GetExits();
s << "\n\r~-~-~-( " << avatar->_room->Get("name") << " )~-~-~-\n\r";
s << avatar->_room->Get("description") << "\n\r\n\r";
s << "\n\r\n\r{c";
for ( list<Char*>::const_iterator x = avatar->_room->_charList.begin(); x != avatar->_room->_charList.end(); x++ )
{
if ( (*x) == avatar )
continue;
s << (*x)->Get("name");
if ( !(title = (*x)->Get("title")).empty() )
s << "," << title << "\n\r";
}
s << "\n\r{WExits: ";
for ( RoomMap::const_iterator i = rmap.begin(); i != rmap.end(); i++ )
s << " " << i->first;
s << "\n\r\n\r";
avatar->Send(s);
return true;
}
CmdSay::CmdSay( )
{
SetName( "say" );
SetShortcut( "'" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdSay::Execute( Char * avatar, const string &args ) {
string args1;
string buf;
if ( args.empty() )
return true;
if ( args.length() > 500 ) {
args1.append( args, 0, 500 );
} else {
args1 = args;
}
buf << "<" << avatar->Get( "name" ) << "> " << args1 << "{x\n\r";
avatar->_room->Broadcast( buf );
return true;
}
CmdWho::CmdWho( )
{
SetName( "who" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdWho::Execute( Char * avatar, const string &args ) {
string buf,countt, title;
int count = 0;
list< Avatar *>::iterator a_it;
for ( a_it = World::Instance()._avatarList.begin(); a_it != World::Instance()._avatarList.end(); ++a_it, count++ )
{
if ( (*a_it)->GetStatus() != CONNECTED )
continue;
buf << "> " << (*a_it)->Get( "name" );
if ( !(title = (*a_it)->Get( "title" )).empty())
buf << "," << title;
buf << "{x\n\r";
}
countt << count;
if ( count > 1 )
buf.insert( 0, "-- " + countt + " Players --\n\r" );
else
buf.insert( 0, "-- " + countt + " Player --\n\r" );
avatar->Send( buf );
return true;
}
CmdQuit::CmdQuit( ) {
SetName( "quit" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdQuit::Execute( Char * avatar, const string &args ) {
string buf;
buf << "## " << avatar->Get( "name" ) << " has disconnected.\n\r";
World::Instance().Broadcast( buf, WCONNECTED );
avatar->SetDisconnected( true );
return true;
}
CmdSave::CmdSave( ) {
SetName( "save" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdSave::Execute( Char * avatar, const string &args ) {
avatar->Save( );
avatar->Send( "You have been saved.\n\r" );
return true;
}
CmdEmote::CmdEmote( ) {
SetName( "emote" );
SetShortcut( "." );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdEmote::Execute( Char * avatar, const string &args ) {
string buf;
char buf2[MAX_BUFFER];
if ( args.empty() ) {
avatar->Send( "What do you wish to emote?\n\r" );
return true;
}
if ( args[0] != ',' && args[0] != '\'' ) {
buf2[0] = ' ';
strcpy( buf2+1, args.c_str() );
} else {
strcpy( buf2, args.c_str() );
}
buf << avatar->Get( "name" ) << buf2 << "\n\r";
World::Instance().Broadcast( buf, WCONNECTED );
return true;
}
CmdTitle::CmdTitle( ) {
SetName( "title" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdTitle::Execute( Char * avatar, const string &args ) {
avatar->Set( "title", args );
avatar->Send( "Title set.\n\r" );
return true;
}
CmdPrompt::CmdPrompt( ) {
SetName( "prompt" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdPrompt::Execute( Char * avatar, const string &args ) {
string buf;
if ( args.empty() ) {
buf << "Syntax: prompt <newprompt>\n\r{WCurrent Prompt: " << avatar->Get( "prompt" ) << "{x\n\r";
avatar->Send( buf );
return true;
}
for ( string::const_iterator cChar = args.begin(); cChar != args.end(); ++cChar ) {
if ( (*cChar) == '%' ) {
++cChar;
switch ( (*cChar) ) {
case 'R':
case 'T':
case 's':
case 'c':
case '%':
break;
default:
buf << "Invalid escape code: " << (*cChar) << "\n\r";
avatar->Send( buf );
return true;
}
}
}
buf = args;
avatar->Set( "prompt", buf );
avatar->Save();
return true;
}
CmdCommands::CmdCommands( ) {
SetName( "commands" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdCommands::Execute( Char * avatar, const string &args )
{
string group = avatar->Get("group");
list< Command *>::iterator it;
int f = 0;
avatar->Send( "\t\t-- Commands -- \n\r" );
if ( group.length() > 6 ) avatar->Send( "\n\rPlayer Commands:\n\r");
for ( it = CommandTable::Instance()._commands.begin(); it != CommandTable::Instance()._commands.end(); ++it )
{
if ( (*it)->_group == "player" && ( (*it)->_enabled == true ) )
{
if ( f == 0 )
avatar->Send( " %-15s", (*it)->_name.c_str() );
else
avatar->Send( "%-15s", (*it)->_name.c_str() );
f++;
if ( f == 5 )
{
avatar->Send( "\n\r" );
f = 0;
}
}
}
if ( group.length() > 6 )
{
if ( group.find("enforcer") != string::npos )
{
avatar->Send( "\n\n\rEnforcer Commands:\n\r");
f = 0;
for ( it = CommandTable::Instance()._commands.begin(); it != CommandTable::Instance()._commands.end(); ++it )
{
if ( (*it)->_group == "enforcer" && ( (*it)->_enabled == true ) )
{
if ( f == 0 )
avatar->Send( " %-15s", (*it)->_name.c_str() );
else
avatar->Send( "%-15s", (*it)->_name.c_str() );
f++;
if ( f == 5 )
{
avatar->Send( "\n\r" );
f = 0;
}
}
} }
if ( group.find("imp") != string::npos )
{
avatar->Send( "\n\n\rImplementor Commands:\n\r");
f = 0;
for ( it = CommandTable::Instance()._commands.begin(); it != CommandTable::Instance()._commands.end(); ++it )
{
if ( (*it)->_group == "imp" && ( (*it)->_enabled == true ) )
{
if ( f == 0 )
avatar->Send( " %-15s", (*it)->_name.c_str() );
else
avatar->Send( "%-15s", (*it)->_name.c_str() );
f++;
if ( f == 5 )
{
avatar->Send( "\n\r" );
f = 0;
}
}
} }
}
avatar->Send( "{x\n\r" );
return true;
}
CmdDelete::CmdDelete( ) {
SetName( "delete" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdDelete::Execute( Char* avatar, const string &args ) {
string buf;
if ( args.empty() ) {
avatar->Send( "Syntax: delete <password>\n\r" );
return true;
}
if ( avatar->VerifyPassword( args ) ) {
buf << "## " << avatar->Get( "name" ) << " has disconnected.\n\r";
World::Instance().Broadcast( buf, WCONNECTED );
avatar->Delete();
avatar->SetDisconnected( true );
} else {
avatar->Send( "That password is not correct.\n\r" );
}
return true;
}
CmdPassword::CmdPassword( ) {
SetName( "password" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdPassword::Execute( Char* avatar, const string &args ) {
string buf;
string oldPassword;
string newPassword;
if ( args.empty() ) {
avatar->Send( "Syntax: password <oldpassword> <newpassword>\n\r" );
return true;
}
split( args, oldPassword, newPassword );
if ( avatar->VerifyPassword( oldPassword ) ) {
avatar->Set( "password", avatar->EncryptPassword( newPassword ) );
avatar->Send( "Your password has been changed.\n\r" );
} else {
avatar->Send( "The old password is incorrect.\n\r" );
}
return true;
}
CmdTell::CmdTell( ) {
SetName( "tell" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdTell::Execute( Char* avatar, const string &args ) {
string name;
string arg;
string message;
Char * target;
split( args, name, arg );
if ( ( target = World::Instance().FindChar( name ) ) == NULL ) {
avatar->Send( "That target cannot be found.\n\r" );
return false;
}
message << "[From: " << avatar->Get( "name" ) << "] " << arg << "\n\r";
target->Send( message );
target->Set( "reply", avatar->Get( "name" ) );
message.erase();
message << "[To: " << target->Get( "name" ) << "] " << arg << "\n\r";
avatar->Send( message );
return true;
}
CmdReply::CmdReply( ) {
SetName( "reply" );
SetShortcut( ";" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdReply::Execute( Char* avatar, const string &args ) {
string name;
string message;
Char * target;
if ( ( target = World::Instance().FindChar( avatar->Get( "reply" ) ) ) == NULL ) {
avatar->Send( "That target cannot be found.\n\r" );
return false;
}
message << "[From: " << avatar->Get( "name" ) << "] " << args << "\n\r";
target->Send( message );
target->Set( "reply", avatar->Get( "name" ) );
message.erase();
message << "[To: " << target->Get( "name" ) << "] " << args << "\n\r";
avatar->Send( message );
return true;
}
CmdBuzz::CmdBuzz( ) {
SetName( "buzz" );
SetGroup( "player" );
SetEnabled( true );
}
bool CmdBuzz::Execute( Char * avatar, const string &args ) {
string name;
string arg;
string message;
Char * target;
split( args, name, arg );
if ( ( target = World::Instance().FindChar( name ) ) == NULL ) {
avatar->Send( "That target cannot be found.\n\r" );
return false;
};
message << "\n\r\a{RYou have been buzzed by {W" << avatar->Get( "name" ) << "{R at {W" << Timestamp::Instance().GetDateTime() << "{R.{x\a\n\r";
target->Send( message );
avatar->Send( "Your target has been buzzed!\n\r" );
return true;
}
CmdHedit::CmdHedit()
{
SetName("hedit");
SetGroup( "imp" );
SetEnabled( true );
}
bool CmdHedit::Execute( Char * avatar, const string &args )
{
if ( !args.empty() )
avatar->StackHandler( new EditHelpHandler( avatar, args ) );
else
avatar->StackHandler( new EditHelpHandler );
return true;
}
CmdRedit::CmdRedit()
{
SetName("redit");
SetGroup( "imp" );
SetEnabled( true );
}
bool CmdRedit::Execute( Char * avatar, const string &args )
{
if ( !args.empty() )
avatar->StackHandler( new EditRoomHandler( avatar, args ) );
else
avatar->StackHandler( new EditRoomHandler );
return true;
}
CmdEdit::CmdEdit( )
{
SetName("medit");
SetGroup("imp");
SetEnabled( true );
}
bool CmdEdit::Execute( Char * avatar, const string &args ) {
if ( !args.empty() )
avatar->StackHandler( new EditAvatarHandler( avatar, args ) );
else
avatar->StackHandler( new EditAvatarHandler );
return true;
}
CmdShutdown::CmdShutdown( )
{
SetName( "shutdown" );
SetGroup( "imp" );
SetEnabled( true );
}
bool CmdShutdown::Execute( Char* avatar, const string &args )
{
string buf;
buf << "## Kaladea is being shutdown.\n\r";
World::Instance().Broadcast( buf, WCONNECTED );
World::Instance().Die();
return true;
}
CmdReboot::CmdReboot( )
{
SetName( "reboot" );
SetGroup( "imp" );
SetEnabled( true );
}
bool CmdReboot::Execute( Char* avatar, const string &args )
{
World::Instance().Copyover();
return true;
}
CmdDisable::CmdDisable( )
{
SetName( "disable" );
SetGroup( "imp" );
SetEnabled( true );
}
bool CmdDisable::Execute( Char * avatar, const string &args )
{
list< Command *>::iterator it;
string command;
string query;
split( args, command );
if ( args.empty() ) {
Mysql::LMAP::iterator command_info;
Mysql::RESULT::iterator commands;
query << "SELECT * FROM disabled_commands";
if ( !Mysql::Instance().Load( query.c_str() ) ) {
avatar->Send( "There are no disabled commands.\n\r" );
return true;
}
query.erase();
query << " -- Disabled Commands -- \n\r";
for ( commands = Mysql::Instance()._info.begin(); commands != Mysql::Instance()._info.end(); ++commands ) {
command_info = (*commands).find( "command" );
query << "[" << command_info->second << " ";
command_info = (*commands).find("disabler");
query << command_info->second << "]\n\r";
}
avatar->Send( query );
return true;
}
for ( it = CommandTable::Instance()._commands.begin(); it != CommandTable::Instance()._commands.end(); ++it ) {
if ( str_cmp( (*it)->_name, command ) ) {
if ( (*it)->_enabled == true ) {
(*it)->_enabled = false;
query << "INSERT INTO disabled_commands SET command='" << (*it)->_name << "', disabler='" << avatar->Get( "name" ) << "' ";
if ( !Mysql::Instance().Query( query.c_str() ) ) {
return false;
}
avatar->Send( "Command disabled.\n\r" );
} else {
(*it)->_enabled = true;
query << "DELETE FROM disabled_commands WHERE command='" << (*it)->_name << "'";
if ( !Mysql::Instance().Query( query.c_str() ) ) {
return false;
}
avatar->Send( "Command enabled.\n\r" );
}
return true;
}
}
avatar->Send( "That command does not exist.\n\r" );
return true;
}
CmdSockets::CmdSockets( ) {
SetName("sockets");
SetGroup("enforcer");
SetEnabled( true );
}
bool CmdSockets::Execute( Char * avatar, const string &args ) {
string buf;
list< Avatar * >::iterator it;
buf << "\t\t-- Sockets --\n\r";
for ( it = World::Instance()._avatarList.begin(); it != World::Instance()._avatarList.end(); ++it ) {
buf << (*it)->Get( "name" ) << ": " << (*it)->GetSocket()->GetSocketIP() << " (descriptor: " << (*it)->GetSocket()->GetDescriptor() << ")\n\r";
}
avatar->Send( buf );
return true;
}
CmdDisconnect::CmdDisconnect( ) {
SetName("disconnect");
SetGroup("enforcer");
SetEnabled( true );
}
bool CmdDisconnect::Execute( Char * avatar, const string &args ) {
string starget;
string arguments;
Avatar * target;
if ( args.empty() ) {
avatar->Send( "Syntax: disconnect <player>\n\r" );
return false;
}
split ( args, starget, arguments );
if ( ( target = World::Instance().FindAvatar( starget ) ) == NULL ) {
avatar->Send( "That target cannot be found.\n\r" );
return false;
}
if ( ((target->Get("group")).length() > 6) && ((avatar->Get("group")).find("imp") == string::npos ) )
{
string s;
s << "IMM ABUSE: " << avatar->Get("name") << " tried to disconnect " << target->Get("name") << ".";
glog( s.c_str() ); avatar->Send( "You cannot do that to fellow staff members!\n\r");
s = "";
s << avatar->Get("name") << " tried to disconnect you!\n\r";
target->Send( s );
return false;
}
target->SetDisconnected( true );
avatar->Send( "Your target has been disconnected.\n\r" );
return true;
}
CmdChangeCmdGroup::CmdChangeCmdGroup( )
{
SetName("changeperm"); SetGroup("imp");
SetEnabled( true );
}
bool CmdChangeCmdGroup::Execute( Char * avatar, const string &args )
{
string name, s, arg;
Avatar *target = NULL;
if( args.empty() )
{
avatar->Send("Syntax: changeperm <player> <perms>\n\r");
avatar->Send("Possible perms (in order): player, admin, enforcer\n\r");
return false;
}
split( args, name, arg );
if ( (target = World::Instance().FindAvatar(name)) == NULL )
{
avatar->Send("Target not found.\n\r" );
return false;
}
if ( arg.empty() )
{
avatar->Send("They must have -some- permission.\n\r" );
return false;
}
if ( arg.find( "imp" ) != string::npos )
{
string s;
s << "IMM WARNING: " << avatar->Get("name") << "(IP: " << avatar->GetSocket()->GetSocketIP()
<< ") tried to change permissions of " << target->Get("name") << "(IP: " << target->GetSocket()->GetSocketIP()
<< ") to " << arg << ".";
glog( s.c_str() );
avatar->Send("Implementors must be added manually!\n\r" );
return false;
}
target->Set( "group", arg );
target->Save();
s = "\n\rYour command permissions have been changed by ";
s << avatar->Get("name") << "!\n\r";
s << "\n\rThey are now:\n\r" << arg << "\n\r";
target->Send(s);
s = "\n\r";
s << target->Get("name") << "'s permissions changed to:\n\r" << arg << "\n\r";
avatar->Send(s);
}