HEX
Server: Apache
System: Linux WWW 6.1.0-40-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.153-1 (2025-09-20) x86_64
User: web11 (1011)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/intranet.kauko.lt/wp-content/plugins/dpProEventCalendar/classes/import-facebook.class.php
<?php
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

class PEC_Import_Events_Facebook {

	/**
	 * Facebook app ID
	 *
	 * @var string
	 */
	public $fb_app_id;

	/**
	 * Facebook app Secret
	 *
	 * @var string
	 */
	public $fb_app_secret;

	/**
	 * Facebook Graph URL
	 *
	 * @var string
	 */
	public $fb_graph_url;

	/**
	 * Facebook Access Token
	 *
	 * @var string
	 */
	private $fb_access_token;

	/**
	 * Initialize the class and set its properties.
	 *
	 * @since    1.0.0
	 */
	public function __construct() 
	{
	
		global $dpProEventCalendar;

		$this->fb_app_id     = isset( $dpProEventCalendar['facebook_app_id'] ) ? $dpProEventCalendar['facebook_app_id'] : '';
		$this->fb_app_secret = isset( $dpProEventCalendar['facebook_app_secret'] ) ? $dpProEventCalendar['facebook_app_secret'] : '';
		$this->fb_graph_url  = 'https://graph.facebook.com/v3.0/';

	}

	/**
	 * Import facebook events by oraganization or facebook page.
	 *
	 * @since  1.0.0
	 * @param  array $event_data  import event data.
	 * @return array/boolean
	 */
	public function import_events( $event_data = array() ) 
	{

		global $dpProEventCalendar_errors;
		$imported_events    = array();
		$facebook_event_ids = array();

		if ( empty( $this->fb_app_id ) || empty( $this->fb_app_secret ) ) 
		{
		
			$dpProEventCalendar_errors[] = __( 'Please insert Facebook app ID and app Secret.', 'dpProEventCalendar' );
			return;
		
		}

		$import_by = isset( $event_data['import_by'] ) ? esc_attr( $event_data['import_by'] ) : '';

		if ( 'facebook_page' === $import_by ) 
		{
		
			$page_username = isset( $event_data['page_username'] ) ? $event_data['page_username'] : '';
		
			if ( empty( $page_username ) ) 
			{
			
				$dpProEventCalendar_errors[] = __( 'Please insert valid Facebook page.', 'dpProEventCalendar' );
				return false;
			
			}
			
			$imported_events = $this->get_events_for_facebook_page( $page_username, 'page' );

			return $imported_events;
			
		} elseif ( 'facebook_group' === $import_by ) {

			$facebook_group_id = isset( $event_data['facebook_group_id'] ) ? $event_data['facebook_group_id'] : '';
			if ( empty( $facebook_group_id ) ) 
			{
			
				$dpProEventCalendar_errors[] = __( 'Please insert valid Facebook Group URL or ID.', 'dpProEventCalendar' );
				return false;
			
			}

			$imported_events = $this->get_events_for_facebook_page( $facebook_group_id, 'group' );

			return $imported_events;
			
		} elseif ( 'facebook_event_id' === $import_by ) {

			$facebook_event_ids = isset( $event_data['event_ids'] ) ? $event_data['event_ids'] : array();
		}
		
		if ( ! empty( $facebook_event_ids ) ) {
			foreach ( $facebook_event_ids as $facebook_event_id ) {
				if ( ! empty( $facebook_event_id ) ) {
					$imported_event = $this->import_event_by_event_id( $facebook_event_id, $event_data );
					return $imported_event;
				}
			}
		}
		return $imported_events;
	}

	/**
	 * Import facebook event by ID.
	 *
	 * @since  1.0.0
	 * @param int   $facebook_event_id Facebook Event ID.
	 * @param array $event_data  import event data.
	 * @return int/boolean
	 */
	public function import_event_by_event_id( $facebook_event_id, $event_data = array() ) 
	{

		global $dpProEventCalendar_errors, $dpProEventCalendar;
		$options       = $dpProEventCalendar;
		$update_events = isset( $options['update_events'] ) ? $options['update_events'] : 'no';

		if ( empty( $facebook_event_id ) || empty( $this->fb_app_id ) || empty( $this->fb_app_secret ) ) {
			if ( empty( $this->fb_app_id ) || empty( $this->fb_app_secret ) ) {
				$dpProEventCalendar_errors[] = esc_attr__( 'Please insert Facebook app ID and app Secret.', 'dpProEventCalendar' );
				return;
			}
			return false;
		}
		if ( empty( $facebook_event_id ) || ! is_numeric( $facebook_event_id ) ) {
			// translators: %s is Facebook event ID.
			$dpProEventCalendar_errors[] = sprintf( esc_attr__( 'Please provide valid Facebook event ID: %s.', 'dpProEventCalendar' ), $facebook_event_id );
			return false;
		}

		$facebook_event_object = $this->get_facebook_event_by_event_id( $facebook_event_id );
		if ( isset( $facebook_event_object->error ) ) {
			// translators: %s is Facebook event ID.
			$dpProEventCalendar_errors[] = sprintf( esc_html__( 'We are not able to access Facebook event: %s. Possible reasons: - App Credentials are wrong - Facebook event is not public or some restrictions are there like age,country etc.', 'dpProEventCalendar' ), $facebook_event_id );
			return false;
		}

		return $facebook_event_object;
	}

	public function get_events_for_facebook_page ( $id, $type )
	{
		
		$facebook_page_id = $id;
		if( $facebook_page_id == '' ){ return array(); }
		$max_events = 10;

		$fields = array(
			'id',
			'name',
			'description',
			'start_time',
			'end_time',
			'event_times',
			'cover',
			'ticket_uri',
			'timezone',
			'place',
		);

		$include_owner = apply_filters( 'dpProEventCalendar_import_owner', false );
		if( $include_owner ){
			$fields[] = 'owner';
		}

		$args = array(
			'limit'       => 999,
			'fields'      => implode(
				',',
				$fields
			)
		);

		if ( $facebook_page_id === 'me' ){
			$args['since'] = current_time('timestamp');
		}else{
			$args['time_filter'] = 'upcoming';
		}

		return $this->get_facebook_response_data(
			$facebook_page_id . '/events',
			array(
				'fields' => implode(
					',',
					$fields
				),
			)
		);

	}

	public function get_my_fb_pages ( )
	{

		$fields = array(
			'id',
			'name',
			'events',
		);

		$include_owner = apply_filters( 'dpProEventCalendar_import_owner', false );
		if( $include_owner ){
			$fields[] = 'owner';
		}

		$args = array(
			'limit'       => 999,
			'fields'      => implode(
				',',
				$fields
			)
		);

		return $this->get_facebook_response_data(
			'me/accounts',
			array(
				'fields' => implode(
					',',
					$fields
				),
			)
		);

	}


	/**
	 * Get access token
	 *
	 * @since 1.0.0
	 * @return string
	 */
	public function get_access_token() {

		if ( ! empty( $this->fb_access_token ) ) {

			return $this->fb_access_token;

		} else {

			$args                       = array(
				'grant_type'    => 'client_credentials',
				'client_id'     => $this->fb_app_id,
				'client_secret' => $this->fb_app_secret,
			);
			$access_token_url           = add_query_arg( $args, $this->fb_graph_url . 'oauth/access_token' );
			$access_token_response      = wp_remote_get( $access_token_url );
			$access_token_response_body = wp_remote_retrieve_body( $access_token_response );
			$access_token_data          = json_decode( $access_token_response_body );
			$access_token               = ! empty( $access_token_data->access_token ) ? $access_token_data->access_token : null;

			$dpProEventCalendar_user_token_options = get_option( 'dpProEventCalendar_user_token_options', array() );

			if ( ! empty( $dpProEventCalendar_user_token_options ) && ! empty( $access_token ) ) 
			{
			
				$authorize_status  = isset( $dpProEventCalendar_user_token_options['authorize_status'] ) ? $dpProEventCalendar_user_token_options['authorize_status'] : 0;
				$user_access_token = isset( $dpProEventCalendar_user_token_options['access_token'] ) ? $dpProEventCalendar_user_token_options['access_token'] : '';
				
				if ( 1 === $authorize_status && ! empty( $user_access_token ) ) 
				{

					$args                       = array(
						'input_token'  => $user_access_token,
						'access_token' => $access_token,
					);
					$access_token_url           = add_query_arg( $args, $this->fb_graph_url . 'debug_token' );
					$access_token_response      = wp_remote_get( $access_token_url );
					$access_token_response_body = wp_remote_retrieve_body( $access_token_response );
					$access_token_data          = json_decode( $access_token_response_body );
					// phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
					if ( ! isset( $access_token_data->error ) && 1 == $access_token_data->data->is_valid ) {
						$access_token = $user_access_token;
					} else {
						$dpProEventCalendar_user_token_options['authorize_status'] = 0;
						update_option( 'dpProEventCalendar_user_token_options', $dpProEventCalendar_user_token_options );
					}
				}
			
			}

			$this->fb_access_token = apply_filters( 'dpProEventCalendar_facebook_access_token', $access_token );
			return $this->fb_access_token;
		}
	}

	/**
	 * Generate Facebook api URL for grab Event.
	 *
	 * @since 1.0.0
	 * @param string $path API Path.
	 * @param array  $query_args Array of query arguments.
	 * @param string $access_token Access Token.
	 * @return string $url Generated URL.
	 */
	public function generate_facebook_api_url( $path = '', $query_args = array(), $access_token = '' ) {
		$query_args = array_merge( $query_args, array( 'access_token' => $this->get_access_token() ) );
		if ( ! empty( $access_token ) ) {
			$query_args['access_token'] = $access_token;
		}
		$url = add_query_arg( $query_args, $this->fb_graph_url . $path );

		return $url;
	}

	/**
	 * Get a facebook object.
	 *
	 * @since 1.0.0
	 * @param int   $event_id Event ID.
	 * @param array $args Arguments array.
	 * @return object $event_data.
	 */
	public function get_facebook_response_data( $event_id, $args = array() ) {
		$url        = $this->generate_facebook_api_url( $event_id, $args );
		$event_data = $this->get_json_response_from_url( $url );
		return $event_data;
	}

	/**
	 * Get a facebook event object
	 *
	 * @since 1.0.0
	 * @param int $event_id Event ID.
	 * @return object
	 */
	public function get_facebook_event_by_event_id( $event_id ) {
		$fields        = array(
			'id',
			'name',
			'description',
			'start_time',
			'end_time',
			'event_times',
			'cover',
			'ticket_uri',
			'timezone',
			'place',
		);
		$include_owner = apply_filters( 'dpProEventCalendar_import_owner', false );
		if ( $include_owner ) {
			$fields[] = 'owner';
		}

		return $this->get_facebook_response_data(
			$event_id,
			array(
				'fields' => implode(
					',',
					$fields
				),
			)
		);
	}

	/**
	 * Get body data from url and return decoded data.
	 *
	 * @since 1.0.0
	 * @param string $url API URL.
	 * @return object $response
	 */
	public function get_json_response_from_url( $url ) {
		$args     = array( 'timeout' => 15 );
		$response = wp_remote_get( $url, $args );
		$response = json_decode( wp_remote_retrieve_body( $response ) );
		return $response;
	}


	/**
	 * Get organizer args for event.
	 *
	 * @since    1.0.0
	 * @param array $facebook_event Facebook event.
	 * @return array
	 */
	public function get_organizer( $facebook_event ) {

		if ( ! isset( $facebook_event->owner->id ) ) {
			return null;
		}

		$organizer_raw_data = $this->get_facebook_response_data(
			$facebook_event->owner->id,
			array(
				'fields' => implode(
					',',
					array(
						'id',
						'name',
						'link',
					)
				),
			)
		);

		if ( ! isset( $organizer_raw_data->id ) ) {
			return null;
		}

		$event_organizer = array(
			'ID'          => isset( $organizer_raw_data->id ) ? $organizer_raw_data->id : '',
			'name'        => isset( $organizer_raw_data->name ) ? $organizer_raw_data->name : '',
			'description' => '',
			'email'       => '',
			'phone'       => isset( $organizer_raw_data->phone ) ? $organizer_raw_data->phone : '',
			'url'         => isset( $organizer_raw_data->link ) ? $organizer_raw_data->link : '',
			'image_url'   => '',
		);
		return $event_organizer;
	}

	/**
	 * Get location args for event
	 *
	 * @since    1.0.0
	 * @param array $facebook_event Facebook event.
	 * @return array
	 */
	public function get_location( $facebook_event ) {

		if ( ! isset( $facebook_event->place->id ) ) {
			return null;
		}
		$event_venue    = $facebook_event->place;
		$event_location = array(
			'ID'           => isset( $facebook_event->place->id ) ? $facebook_event->place->id : '',
			'name'         => isset( $event_venue->name ) ? $event_venue->name : '',
			'description'  => '',
			'address_1'    => isset( $event_venue->location->street ) ? $event_venue->location->street : '',
			'address_2'    => '',
			'city'         => isset( $event_venue->location->city ) ? $event_venue->location->city : '',
			'state'        => isset( $event_venue->location->state ) ? $event_venue->location->state : '',
			'country'      => isset( $event_venue->location->country ) ? $event_venue->location->country : '',
			'zip'          => isset( $event_venue->location->zip ) ? $event_venue->location->zip : '',
			'lat'          => isset( $event_venue->location->latitude ) ? $event_venue->location->latitude : '',
			'long'         => isset( $event_venue->location->longitude ) ? $event_venue->location->longitude : '',
			'full_address' => isset( $event_venue->location->street ) ? $event_venue->location->street : '',
			'url'          => '',
			'image_url'    => '',
		);
		return $event_location;
	}

	/**
	 * Get organizer Name based on Organiser ID.
	 *
	 * @since    1.0.0
	 * @param array   $organizer_id Organizer event.
	 * @param boolean $full_data Need return full data?.
	 * @return array
	 */
	public function get_organizer_name_by_id( $organizer_id, $full_data = false ) {
		global $dpProEventCalendar_errors;
		if ( ! $organizer_id || empty( $organizer_id ) ) {
			return;
		}

		$organizer_raw_data = $this->get_facebook_response_data( $organizer_id, array() );
		if ( isset( $organizer_raw_data->error->message ) ) {
			return false;
		}

		if ( ! isset( $organizer_raw_data->name ) ) {
			return false;
		}

		if ( $full_data ) {
			return $organizer_raw_data;
		}

		$oraganizer_name = isset( $organizer_raw_data->name ) ? $organizer_raw_data->name : '';
		return $oraganizer_name;

	}

	/**
	 * Get UTC offset
	 *
	 * @since    1.0.0
	 * @param string $datetime DateTime.
	 */
	public function get_utc_offset( $datetime ) {
		try {
			$datetime = new DateTime( $datetime );
		} catch ( Exception $e ) {
			return '';
		}

		$timezone = $datetime->getTimezone();
		$offset   = $timezone->getOffset( $datetime ) / 60 / 60;

		if ( $offset >= 0 ) {
			$offset = '+' . $offset;
		}

		return 'UTC' . $offset;
	}
}