<?xml version="1.0" encoding="UTF-8"?>
<plugin name="(Inv&amp;k4) Traffic Generator [re]" version_long="21100" version_human="2.1.1" author="Invisionizer, k4r1" website="https://enxf.net/members/by_ix.16167" update_check="https://raw.githubusercontent.com/byIx/tgen/main/checker.php"><hooks><hook type="C" class="\IPS\Dispatcher\Front" filename="tGen"><![CDATA[//<?php

class hook777 extends _HOOK_CLASS_
{
    public function init()
    {
		try
		{
			parent::init();
	
			if ( \IPS\Settings::i()->tGen_enable )
			{
				/* Sessions */
				$sessionTime   = \IPS\Settings::i()->tGen_time;
				$sessionStart  = ( time() - ( $sessionTime * 60 ) );
				$sessionEnd    = ( time() + ( $sessionTime * 60 ) );
				$sessionDelete = ( \IPS\Settings::i()->tGen_delete ) ? \IPS\DB::i()->delete( 'core_sessions', array( 'is_generated=1 AND running_time<?', $sessionStart ) ) : '';
	
				/* Members */
				$membersMax  = ( \IPS\Settings::i()->tGen_random_members ) ? mt_rand( 1, \IPS\Settings::i()->tGen_max_members ) : \IPS\Settings::i()->tGen_max_members;
				$whereMcount = array( array( 'core_sessions.login_type=?', 0 ), array( 'core_sessions.member_id IS NOT NULL' ), array( 'core_sessions.is_generated=?', 1 ) );
		        $membersRun  = \IPS\Db::i()->select( 'max(running_time) as mRun', 'core_sessions', $whereMcount )->first();
	
				if ( $membersRun == NULL || $membersRun < $sessionStart )
				{
					$groups       = array_filter( explode( ',', \IPS\Settings::i()->tGen_groups ) );
					$membersWhere = array( array( 'last_visit<?', $sessionEnd ), array( 'member_posts>=?', \IPS\Settings::i()->tGen_max_posts ) );
	
					if ( \count( $groups ) )
					{
						$membersWhere[] = '(  ( ' . \IPS\Db::i()->in( 'member_group_id', $groups ) . ' ) ) OR (  ( ' . \IPS\Db::i()->in( 'mgroup_others', $groups ) . ' ) )';
					}
	
					$getMembers = \IPS\Db::i()->select( 'core_members.member_id', 'core_members', $membersWhere, 'RAND()', $membersMax )->join( 'core_sessions', 'core_sessions.member_id=core_members.member_id' )->join( 'core_groups', 'core_members.member_group_id=core_groups.g_id' )->setKeyField( 'member_id' );
	
					foreach ( $getMembers as $row )
					{	
						$members = \IPS\Member::load( $row );
	
						if ( !$members->isOnline() )
						{
							$sessionCreated = ( time() + mt_rand( 1, 120 ) );
							$locations      = $this->locationMembers();
							$uAgents        = $this->userAgents();
	
							$data = array( 'id'                   => md5( uniqid( microtime() ) ),
										   'member_name'          => $members->name,
										   'seo_name'             => $members->members_seo_name,
										   'member_id'            => $members->member_id,
										   'ip_address'           => $members->ip_address,
										   'browser'              => $uAgents['browser'],
										   'running_time'         => $sessionCreated,
										   'login_type'           => 0,
										   'member_group'         => $members->member_group_id,
										   'data'                 => $members->data,
										   'current_appcomponent' => $locations['app'],
										   'current_module'       => $locations['module'],
										   'current_controller'   => $locations['controller'],
										   'location_url'         => $locations['url'],
										   'location_lang'        => $locations['lang'],
										   'location_data'        => $locations['location_data'],
										   'current_id'           => $locations['current_id'],
										   'uagent_key'           => $uAgents['key'],
										   'uagent_version'       => $uAgents['version'],
										   'uagent_type'          => $uAgents['type'],
										   'is_generated'         => 1,
										   'generated_expire'     => $sessionEnd
	
							);
	
							\IPS\Db::i()->insert( 'core_sessions', $data );
	
							$achievement = ( \IPS\Settings::i()->tGen_achievements ) ? $members->achievementAction( 'core', 'SessionStartDaily' ) : '';
							$members->last_visit    = $sessionCreated;
							$members->last_activity = $sessionCreated;
							$members->save();
						}	
					}
				}
	
				/* Guest */
				$guestsMax   = ( \IPS\Settings::i()->tGen_random_guests ) ? mt_rand( 1, \IPS\Settings::i()->tGen_max_guests ) : \IPS\Settings::i()->tGen_max_guests;
				$whereGcount = array( array( 'core_sessions.login_type=?', 2 ), array( 'core_sessions.member_id IS NULL' ), array( 'core_sessions.is_generated=?', 1 ) );
				$guestsRun   = \IPS\Db::i()->select( 'max(running_time) as gRun', 'core_sessions', $whereGcount )->first();
	
				if ( $guestsRun == NULL || $guestsRun < $sessionStart )
				{
					$guestsData  = new \IPS\Member;
	
					for ( $i = 0; $i < ( $guestsMax ); $i ++ )
					{
						$sessionCreated = ( time() + mt_rand( 1, 120 ) );
						$locations      = $this->LocationGuests();
						$uAgents        = $this->userAgents();
	
						$data = array( 'id'                   => md5( uniqid( microtime() ) ),
									   'member_name'          => '',
									   'seo_name'             => '',
									   'member_id'            => NULL,
									   'ip_address'           => long2ip( mt_rand() ),
									   'browser'              => $uAgents['browser'],
									   'running_time'         => $sessionCreated,
									   'login_type'           => 2,
									   'member_group'         => \IPS\Settings::i()->guest_group,
									   'data'                 => $guestsData->data,
									   'current_appcomponent' => $locations['app'],
									   'current_module'       => $locations['module'],
									   'current_controller'   => $locations['controller'],
									   'location_url'         => $locations['url'],
									   'location_lang'        => $locations['lang'],
									   'location_data'        => $locations['location_data'],
									   'current_id'           => $locations['current_id'],
									   'uagent_key'           => $uAgents['key'],
									   'uagent_version'       => $uAgents['version'],
									   'uagent_type'          => $uAgents['type'],
									   'is_generated'         => 1,
									   'generated_expire'     => $sessionEnd
						);
	
						\IPS\Db::i()->insert( 'core_sessions', $data );
					}
				}
			}
		}
		catch ( \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
    }
	
    public function locationMembers()
    {
		try
		{
			$locations             = array();
			$locations['generate'] = array( 'index', 'messenger', 'topic' );
			$locations['generate'] = $locations['generate'][array_rand( $locations['generate'] )];
	
			switch ( $locations['generate'] )
			{
				case 'index':
					$locations['url']           = \IPS\Http\Url::internal( "app=forums&module=forums&controller=index", 'front', 'forums' );
					$locations['lang']          = "loc_forums_index";
					$locations['app']           = 'forums';
					$locations['module']        = 'forums';
					$locations['controller']    = 'index';
					$locations['current_id']    = 0;
					$locations['location_data'] = "[]";
					break;
				case 'messenger':
					$locations['url']           = \IPS\Http\Url::internal( "app=core&module=messaging&controller=messenger", NULL, 'messenger' );
					$locations['lang']          = "loc_using_messenger";
					$locations['app']           = 'core';
					$locations['module']        = 'messaging';
					$locations['controller']    = 'messenger';
					$locations['current_id']    = 0;
					$locations['location_data'] = "[]";
					break;
				case 'topic':
					$topic                      = \IPS\Db::i()->select( '*', 'forums_topics', array(), 'RAND()', 1 )->first();
					$locations['url']           = \IPS\Http\Url::internal( "app=forums&module=forums&controller=topic&id={$topic['tid']}", 'front', 'forums_topic', array( $topic['title_seo'] ) );
					$locations['lang']          = "loc_forums_viewing_topic";
					$locations['app']           = 'forums';
					$locations['module']        = 'forums';
					$locations['controller']    = 'topic';
					$locations['current_id']    = $topic['tid'];
					$locations['location_data'] = json_encode( array( $topic['title'] => FALSE ) );
					break;
			}
			return $locations;
		}
		catch ( \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
    }

    public function LocationGuests()
    {
		try
		{
			$locations             = array();
			$locations['generate'] = array( 'index', 'login', 'register', 'topic' );
			$locations['generate'] = $locations['generate'][array_rand( $locations['generate'] )];
	
			switch ( $locations['generate'] )
			{
				case 'index':
					$locations['url']           = \IPS\Http\Url::internal( "app=forums&module=forums&controller=index", 'front', 'forums' );
					$locations['lang']          = "loc_forums_index";
					$locations['app']           = 'forums';
					$locations['module']        = 'forums';
					$locations['controller']    = 'index';
					$locations['current_id']    = 0;
					$locations['location_data'] = "[]";
					break;
				case 'login':
					$locations['url']           = \IPS\Http\Url::internal( "app=core&module=system&controller=login", 'front', 'login' );
					$locations['lang']          = "loc_logging_in";
					$locations['app']           = 'core';
					$locations['module']        = 'system';
					$locations['controller']    = 'login';
					$locations['current_id']    = 0;
					$locations['location_data'] = "[]";
					break;
				case 'register':
					$locations['url']           = \IPS\Http\Url::internal( "app=core&module=system&controller=login", NULL, 'register' );
					$locations['lang']          = "loc_registering";
					$locations['app']           = 'core';
					$locations['module']        = 'system';
					$locations['controller']    = 'register';
					$locations['current_id']    = 0;
					$locations['location_data'] = "[]";
					break;
				case 'topic':
					$topic                      = \IPS\Db::i()->select( '*', 'forums_topics', array(), 'RAND()', 1 )->first();
					$locations['url']           = \IPS\Http\Url::internal( "app=forums&module=forums&controller=topic&id={$topic['tid']}", 'front', 'forums_topic', array( $topic['title_seo'] ) );
					$locations['lang']          = "loc_forums_viewing_topic";
					$locations['app']           = 'forums';
					$locations['module']        = 'forums';
					$locations['controller']    = 'topic';
					$locations['current_id']    = $topic['tid'];
					$locations['location_data'] = json_encode( array( $topic['title'] => FALSE ) );
					break;
			}
			return $locations;
		}
		catch ( \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
    }

    public function userAgents()
    {
		try
		{
			$agents          = array();
			$agents['keys']  = array( 'Chrome', 'Firefox', 'Safari', 'Edge', 'Yandex Browser', 'Opera', 'Chrome', 'Internet Explorer' );
			$agents['value'] = array_rand( $agents['keys'] );
			$agents['key']   = $agents['keys'][$agents['value']];
			$agents['type']  = 'browser';
	
			switch ( $agents['value'] )
			{
				case 0:
					$agents['browser'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5015.0 Safari/537.36'; $agents['version'] = '103.0.5015.0';
					break;
				case 1:
					$agents['browser'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0esr) Gecko/20110101 Firefox/105.0'; $agents['version'] = '105.0';
					break;
				case 2:
					$agents['browser'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15'; $agents['version'] = '15.4';
					break;
				case 3:
					$agents['browser'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36 Edg/102.0.1245.44'; $agents['version'] = '102.0.1245.44';
					break;
				case 4:
					$agents['browser'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 YaBrowser/22.5.0 Yowser/2.5 Safari/537.36'; $agents['version'] = '22.5.0';
					break;
				case 5:
					$agents['browser'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36 OPR/88.0.4412.40'; $agents['version'] = '88.0.4412.40';
					break;
				case 6:
					$agents['browser'] = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36'; $agents['version'] = '100.0.4896.88';
					break;
				case 7:
					$agents['browser'] = 'Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko'; $agents['version'] = '11.0';
					break;
			}
			return $agents;
		}
		catch ( \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
    }
}
]]></hook></hooks><settings><setting><key>tGen_enable</key><default>0</default></setting><setting><key>tGen_delete</key><default>1</default></setting><setting><key>tGen_time</key><default>20</default></setting><setting><key>tGen_achievements</key><default>0</default></setting><setting><key>tGen_random_members</key><default>0</default></setting><setting><key>tGen_max_members</key><default>0</default></setting><setting><key>tGen_groups</key><default/></setting><setting><key>tGen_random_guests</key><default>0</default></setting><setting><key>tGen_max_guests</key><default>0</default></setting><setting><key>tGen_max_posts</key><default>0</default></setting></settings><uninstall><![CDATA[//<?php

if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
    header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
    exit;
}

try
{
    \IPS\Db::i()->dropColumn( 'core_sessions', 'is_generated' );
    \IPS\Db::i()->dropColumn( 'core_sessions', 'generated_expire' );

} catch ( \UnderflowException $e ){}

]]></uninstall><settingsCode><![CDATA[//<?php

$form->addHeader('tGen_main_settings');
$form->add( new \IPS\Helpers\Form\YesNo( 'tGen_enable', \IPS\Settings::i()->tGen_enable, FALSE, array() ) );
$form->add( new \IPS\Helpers\Form\Number( 'tGen_time', \IPS\Settings::i()->tGen_time, FALSE, array( 'min' => 20 ) ) );
$form->add( new \IPS\Helpers\Form\YesNo( 'tGen_delete', \IPS\Settings::i()->tGen_delete, FALSE, array() ) );
$form->addHeader('tGen_members_settings');
$form->add( new \IPS\Helpers\Form\Select( 'tGen_groups', array_filter( explode( ',', \IPS\Settings::i()->tGen_groups ) ), FALSE, array( 'options' => \IPS\Member\Group::groups( $showAdminGroups=TRUE, $showGuestGroups=FALSE ), 'parse' => 'normal', 'multiple' => TRUE ) ) );
$form->add( new \IPS\Helpers\Form\YesNo( 'tGen_achievements', \IPS\Settings::i()->tGen_achievements, FALSE, array() ) );
$form->add( new \IPS\Helpers\Form\YesNo( 'tGen_random_members', \IPS\Settings::i()->tGen_random_members, FALSE, array() ) );
$form->add( new \IPS\Helpers\Form\Number( 'tGen_max_members', \IPS\Settings::i()->tGen_max_members, FALSE, array() ) );
$form->add( new \IPS\Helpers\Form\Number( 'tGen_max_posts', \IPS\Settings::i()->tGen_max_posts, FALSE, array() ) );
$form->addHeader('tGen_guest_settings');
$form->add( new \IPS\Helpers\Form\YesNo( 'tGen_random_guests', \IPS\Settings::i()->tGen_random_guests, FALSE, array() ) );
$form->add( new \IPS\Helpers\Form\Number( 'tGen_max_guests', \IPS\Settings::i()->tGen_max_guests, FALSE, array() ) );

if ( $values = $form->values() )
{
	$form->saveAsSettings();
	return TRUE;
}

return $form;]]></settingsCode><htmlFiles/><cssFiles/><jsFiles/><resourcesFiles/><lang><word key="tGen_main_settings" js="0">General settings</word><word key="tGen_members_settings" js="0">Members Settings</word><word key="tGen_guest_settings" js="0">Guests Settings</word><word key="tGen_enable" js="0">Off/On</word><word key="tGen_enable_desc" js="0">Disabling and enabling traffic generation.</word><word key="tGen_time" js="0">Time interval in minutes</word><word key="tGen_time_desc" js="0">Frequency of traffic generation, every N minutes. (Minimum: 20)</word><word key="tGen_delete" js="0">Automatic deletion of sessions</word><word key="tGen_delete_desc" js="0">Delete expired sessions in the same time interval as the traffic is generated. (If disabled, outdated sessions will be deleted by default by the system within one hour)</word><word key="tGen_groups" js="0">Groups</word><word key="tGen_groups_desc" js="0">Groups whose members will be generated and displayed online.</word><word key="tGen_achievements" js="0">Achievements</word><word key="tGen_achievements_desc" js="0">Take into account daily visits and issue achievements according to the rules of registration and authorization.</word><word key="tGen_random_members" js="0">Random number of members</word><word key="tGen_random_members_desc" js="0">Generating a random number of members within the maximum.</word><word key="tGen_max_members" js="0">Maximum members</word><word key="tGen_max_members_desc" js="0">Maximum number of members, which will be generated and displayed online.</word><word key="tGen_max_posts" js="0">Minimum of messages</word><word key="tGen_max_posts_desc" js="0">The minimum number of messages from members.</word><word key="tGen_random_guests" js="0">Random number of guests</word><word key="tGen_random_guests_desc" js="0">Generating a random number of guests within the maximum.</word><word key="tGen_max_guests" js="0">Maximum guests</word><word key="tGen_max_guests_desc" js="0">Maximum number of guests, which will be generated and displayed online.</word></lang><versions><version long="21100" human="2.1.1"><![CDATA[//<?php

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

class ips_plugins_setup_upg_21100
{
	public function step1()
	{
		try
		{
			if( !\IPS\Db::i()->checkForColumn( 'core_sessions', 'is_generated' ) ) {
				\IPS\Db::i()->addColumn( 'core_sessions', array(
					'name'		=> 'is_generated',
					'type'		=> 'INT',
					'length'	=> 1,
					'null'		=> FALSE,
					'default'	=> 0,
					'comment'	=> ''
				) );
			}

			if( !\IPS\Db::i()->checkForColumn( 'core_sessions', 'generated_expire' ) ) {
				\IPS\Db::i()->addColumn( 'core_sessions', array(
					'name'		=> 'generated_expire',
					'type'		=> 'varchar',
					'length'	=> 20,
					'null'		=> true,
					'default'	=> '',
					'comment'	=> ''
				) );
			}
		} catch( \IPS\Db\Exception $e ) {}

		return TRUE;
	}
}]]></version></versions></plugin>
