///////////////////////////////////////////////////////////
///////////////// Have an itch? Scratch it! ///////////////
///////////////////////// SCRATCH /////////////////////////
/////////////////////  A MUD  Server   ////////////////////
///////////////////// By: Jared Devall ////////////////////
/////////////////////      Thanks:     ////////////////////
/////////////////////  DIKU/Merc/ROM   ////////////////////
///////////////////// Aetas/Deus Gang  ////////////////////
/////////////////////       Beej       ////////////////////
///////////////////////////////////////////////////////////

#include <sys/time.h>
#include <time.h>
#include "timer.h"  

using namespace std;
 
Timer::Timer( int interval, int times ) {
	_interval = interval;
	_times = times;
 
    _enabled = true;
 
    Reset();
}

bool Timer::Fire() {
	// Always stop firing if execution fails.
    if ( !Execute() )
    	return false;

    // If we start with a negative or 0 time, we will fire
    // indefinately.
    if ( _times <= 0 ) {
		Reset();
 	   return true;
    }

    // Not an indefinite loop, so only stop firing when
    // our time counter has reached 0.
    if ( --_times == 0 )
    	return false;
 
	// We will fire again!
    Reset();
	return true;
}
 
void Timer::Reset() {
	_when = GetTime() + _interval;;
}

ustime_t Timer::GetTime() {
    timeval t;
    gettimeofday( &t, NULL );
    return ustime_t( t.tv_sec) << 32 | t.tv_usec;
}