//------------------------------------------------------------------------------
// Revenge Of The Cats: Ethernet
// Copyright notices are in the file named COPYING.
//------------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// Torque Game Engine 
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// Server side message commands
//-----------------------------------------------------------------------------

function messageClient(%client, %msgType, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13)
{
	commandToClient(%client, 'ServerMessage', %msgType, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13);
}

function messageTeam(%team, %msgType, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13)
{
	%count = ClientGroup.getCount();
	for(%cl= 0; %cl < %count; %cl++)
	{
		%recipient = ClientGroup.getObject(%cl);
	  if(%recipient.team == %team)
			messageClient(%recipient, %msgType, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13);
	}
}

function messageTeamExcept(%client, %msgType, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13)
{
	%team = %client.team;
	%count = ClientGroup.getCount();
	for(%cl= 0; %cl < %count; %cl++)
	{
		%recipient = ClientGroup.getObject(%cl);
	  if((%recipient.team == %team) && (%recipient != %client))
			messageClient(%recipient, %msgType, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13);
	}
}

function messageAll(%msgType, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13)
{
	%count = ClientGroup.getCount();
	for(%cl = 0; %cl < %count; %cl++)
	{
		%client = ClientGroup.getObject(%cl);
		messageClient(%client, %msgType, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13);
	}
}

function messageAllExcept(%client, %team, %msgtype, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13)
{  
	//can exclude a client, a team or both. A -1 value in either field will ignore that exclusion, so
	//messageAllExcept(-1, -1, $Mesblah, 'Blah!'); will message everyone (since there shouldn't be a client -1 or client on team -1).
	%count = ClientGroup.getCount();
	for(%cl= 0; %cl < %count; %cl++)
	{
		%recipient = ClientGroup.getObject(%cl);
		if((%recipient != %client) && (%recipient.team != %team))
			messageClient(%recipient, %msgType, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13);
	}
}


//---------------------------------------------------------------------------
// Server side client chat'n
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// silly spam protection...
$SPAM_PROTECTION_PERIOD	  = 10000;
$SPAM_MESSAGE_THRESHOLD	  = 4;
$SPAM_PENALTY_PERIOD		  = 10000;
$SPAM_MESSAGE					= '\c3FLOOD PROTECTION:\cr You must wait another %1 seconds.';

function GameConnection::spamMessageTimeout(%this)
{
	if(%this.spamMessageCount > 0)
		%this.spamMessageCount--;
}

function GameConnection::spamReset(%this)
{
	%this.isSpamming = false;
}

function spamAlert(%client)
{
	if($Pref::Server::FloodProtectionEnabled != true)
		return(false);

	if(!%client.isSpamming && (%client.spamMessageCount >= $SPAM_MESSAGE_THRESHOLD))
	{
		%client.spamProtectStart = getSimTime();
		%client.isSpamming = true;
		%client.schedule($SPAM_PENALTY_PERIOD, spamReset);
	}

	if(%client.isSpamming)
	{
		%wait = mFloor(($SPAM_PENALTY_PERIOD - (getSimTime() - %client.spamProtectStart)) / 1000);
		messageClient(%client, "", $SPAM_MESSAGE, %wait);
		return(true);
	}

	%client.spamMessageCount++;
	%client.schedule($SPAM_PROTECTION_PERIOD, spamMessageTimeout);
	return(false);
}


//---------------------------------------------------------------------------

function chatMessageClient( %client, %sender, %voiceTag, %voicePitch, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10 )
{
	//see if the client has muted the sender
	if ( !%client.muted[%sender] )
	{
		commandToClient( %client, 'ChatMessage', %sender, %voiceTag, %voicePitch,
			%msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10 );
		%client.play2D(ChatMessageSound);
	}
}

function chatMessageTeam( %sender, %team, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10 )
{
	if ( ( %msgString $= "" ) || spamAlert( %sender ) )
		return;
	
	%count = ClientGroup.getCount();
	
	for ( %i = 0; %i < %count; %i++ )
	{
		%obj = ClientGroup.getObject( %i );
		if ( %obj.team == %sender.team )
			chatMessageClient( %obj, %sender, %sender.voiceTag, %sender.voicePitch, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10 );
	}
}

function chatMessageAll( %sender, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10 )
{
	if ( ( %msgString $= "" ) || spamAlert( %sender ) )
		return;
		
	%count = ClientGroup.getCount();
	
	for ( %i = 0; %i < %count; %i++ )
	{
		%obj = ClientGroup.getObject( %i );
		
		if(%sender.team != 0)
			chatMessageClient( %obj, %sender, %sender.voiceTag, %sender.voicePitch, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10 );
		else
		{
			// message sender is an observer -- only send message to other observers
			if(%obj.team == %sender.team)
				chatMessageClient( %obj, %sender, %sender.voiceTag, %sender.voicePitch, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10 );
		}
	}
}

