#Const TIMEOUT {{ afktimeout }} 
#Const TIMEOUT_FREQUENCE_CHECK {{ afktimeoutfrequencecheck }}
#Const TIMEOUT_SLEEP_DELAY {{ afktimeoutsleepdelay }}
#Const GRACE_PERIOD {{ afkgraceperiod }}



	Boolean isAfk(){
		if (IsSpectator || IsSpectatorClient) {
			//log("Player is already spectator");
			return False;
		}
		if(InputPlayer == Null) {
			//log("Not AFK, player is null");
			return False;
		}
		if (InputPlayer.IsSpawned == False) {
			//log("Not AFK, player is not spawned");
			return False;
		}
		if (PendingEvents.count > 0) {
			//log("Not AFK, pending events detected.");
			return False;
		}
		if (InputPlayer.InputSteer != 0 || InputPlayer.InputGasPedal != 0 || InputPlayer.InputIsBraking) {
			//log("Not AFK, Input detected");
			return False;
		}
		if (UI == Null){
			//log("UI is not null");
			return False;
		}
		if (UI.UISequence != CUIConfig::EUISequence::Playing && UI.UISequence != CUIConfig::EUISequence::None){
			//log("Not AFK, UI is not playing");
			return False;
		}
		return True;
	}

	Boolean checkAfk(){
		declare endTime = GameTime + TIMEOUT  * 1000;
		while(GameTime < endTime){
				if (!isAfk()){
					return False;
				}
				sleep(TIMEOUT_SLEEP_DELAY);
		}
		return True;
	}

	main(){
		while(True){
			if (IsSpectator || IsSpectatorClient){
				sleep(GRACE_PERIOD * 1000);
				continue;
			}
			if (checkAfk()){
				TriggerPageAction("{{ id }}__Player_AFK");
				sleep(GRACE_PERIOD * 1000);
			} else {
				sleep(TIMEOUT_FREQUENCE_CHECK * 1000);
			}
		}
	}