get_bearer_token($client_id, $client_secret, $code, get_admin_url() . '?instance_type=' . $instance_type);
                    break;
                  case 'pixelfed':
                    update_option('fediembedi-pixelfed-token', 'nada');
                    $instance = get_option('fediembedi-pixelfed-instance');
                    $client = new \FediClient($instance);
                    $token = $client->get_bearer_token($client_id, $client_secret, $code, get_admin_url() . '?instance_type=' . $instance_type);
                    break;
                }
                if (isset($token->error)) {
                    //TODO: Proper error message
                    update_option(
                        'fediembedi-notice',
                        serialize(
                            array(
                                'message' => 'FediEmbedi : ' . __("Can't log you in.", 'fediembedi') .
                                '
' . __('Instance message', 'fediembedi') . ' : ' . $token->error_description . '
',
                                'class' => 'error',
                            )
                        )
                    );
                    unset($token);
                    switch ($instance_type) {
                      case 'mastodon':
                        update_option('fediembedi-mastodon-token', '');
                        break;
                      case 'pixelfed':
                        update_option('fediembedi-pixelfed-token', '');
                        break;
                    }
                } else {
                    switch ($instance_type) {
                      case 'mastodon':
                        update_option('fediembedi-mastodon-client-id', $client_id);//
                        update_option('fediembedi-mastodon-client-secret', $client_secret);//
                        update_option('fediembedi-mastodon-token', $token->access_token);
                        break;
                      case 'pixelfed':
                        update_option('fediembedi-pixelfed-client-id', $client_id);//
                        update_option('fediembedi-pixelfed-client-secret', $client_secret);//
                        update_option('fediembedi-pixelfed-token', $token->access_token);
                        break;
                    }
                }
                $redirect_url = get_admin_url() . 'options-general.php?page=fediembedi';
            } else {
                //Probably hack or bad refresh, redirect to homepage
                $redirect_url = home_url();
            }
            wp_redirect($redirect_url);
            exit;
        }
        $mastodon_token = get_option('fediembedi-mastodon-token');
        $pixelfed_token = get_option('fediembedi-pixelfed-token');
    }
    /*
     *  Widget
     */
    public function fediembedi_widget() {
      //Mastodon
      include(plugin_dir_path(__FILE__) . 'fediembedi-mastodon-widget.php' );
      register_widget( 'FediEmbedi_Mastodon' );
      if(empty(get_option('fediembedi-mastodon-token'))){
        unregister_widget( 'FediEmbedi_Mastodon' );
      }
      //Pixelfed
      include(plugin_dir_path(__FILE__) . 'fediembedi-pixelfed-widget.php' );
      register_widget( 'FediEmbedi_Pixelfed' );
      if(empty(get_option('fediembedi-pixelfed-token'))){
        unregister_widget( 'FediEmbedi_Pixelfed' );
      }
      //PeerTube
      include(plugin_dir_path(__FILE__) . 'fediembedi-peertube-widget.php' );
    	register_widget( 'FediEmbedi_PeerTube' );
    }
    public function mastodon_shortcode($atts){
      //fedi instance
  		$fedi_instance = get_option('fediembedi-mastodon-instance');
  		$access_token = get_option('fediembedi-mastodon-token');
  		$client = new \FediClient($fedi_instance, $access_token);
  		$cred = $client->verify_credentials($access_token);
      $atts = shortcode_atts( array(
        'only_media' => false,
        'pinned' => false,
        'exclude_replies' => false,
        'max_id' => null,
        'since_id' => null,
        'min_id' => null,
        'limit' => 5,
        'exclude_reblogs' => false,
        'show_header' => true,
        'height' => '100%',
      ), $atts, 'mastodon' );
      //getStatus from remote instance
      $status = $client->getStatus($atts['only_media'], $atts['pinned'], $atts['exclude_replies'], null, null, null, $atts['limit'], $atts['exclude_reblogs']);
      //if(WP_DEBUG_DISPLAY === true): echo 'Mastodon
'; var_dump($status); echo '
Pixelfed
'; var_dump($client->getStatus($atts)); echo '
PeerTube
'; var_dump($status); echo '
 static_url}\">", $string);
      }
      return $string;
    }
    public function enqueue_styles($hook)
    {
        global $post;
        if( is_active_widget( false, false, 'mastodon') || is_active_widget( false, false, 'pixelfed') || ( is_a( $post, 'WP_Post' ) && ( has_shortcode( $post->post_content, 'mastodon') || has_shortcode( $post->post_content, 'pixelfed') ) ) ) {
            wp_enqueue_script( 'resize-sensor', plugin_dir_url( __FILE__ ) . 'assets/ResizeSensor.js', array(), 'css-element-queries-1.2.2' );
            wp_enqueue_script( 'element-queries', plugin_dir_url( __FILE__ ) . 'assets/ElementQueries.js', array('resize-sensor'), 'css-element-queries-1.2.2' );
        }
        if( is_active_widget( false, false, 'mastodon')  || ( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'mastodon') ) ) {
            wp_enqueue_style( 'mastodon', plugin_dir_url( __FILE__ ) . 'assets/mastodon.css', array(), filemtime(plugin_dir_path( __FILE__ ) . 'assets/mastodon.css') );
        }
        if( is_active_widget( false, false, 'pixelfed')  || ( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'pixelfed') )  ) {
            wp_enqueue_style( 'bootstrap', plugin_dir_url( __FILE__ ) . 'assets/bootstrap/css/bootstrap.min.css', array(), '4.4.1' );
            wp_enqueue_style( 'pixelfed', plugin_dir_url( __FILE__ ) . 'assets/pixelfed.css', array(), filemtime(plugin_dir_path( __FILE__ ) . 'assets/pixelfed.css') );
        }
        if( is_active_widget( false, false, 'peertube')  || ( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'peertube') ) ) {
            wp_enqueue_style( 'peertube', plugin_dir_url( __FILE__ ) . 'assets/peertube.css', array(), filemtime(plugin_dir_path( __FILE__ ) . 'assets/mastodon.css') );
        }
    }
    public function enqueue_scripts($hook)
    {
      global $pagenow;
      $infos = get_plugin_data(__FILE__);
      if ($pagenow == "options-general.php") {
          //We might be on settings page <-- Do you know a bette solution to get if we are in our own settings page?
          $plugin_url = plugin_dir_url(__FILE__);
          //wp_enqueue_script('settings_page', $plugin_url . 'assets/settings_page.js', array('jquery'), $infos['Version'], true);
      }
    }
    /**
     * Configuration_page
     *
     * Add the configuration page menu
     *
     * @return void
     */
    public function configuration_page()
    {
        add_options_page(
            'FediEmbedi',
            'FediEmbedi',
            'manage_options',
            'fediembedi',
            array($this, 'show_configuration_page')
        );
    }
    /**
     * Show_configuration_page
     *
     * Content of the configuration page
     *
     * @throws Exception The exception.
     * @return void
     */
    public function show_configuration_page()
    {
        wp_enqueue_style('fediembedi-configuration', plugin_dir_url(__FILE__) . 'style.css');
        if (isset($_GET['fediembedi-disconnect'])) {
          switch ($_GET['fediembedi-disconnect']) {
            case 'mastodon':
              update_option('fediembedi-mastodon-token', '');
              break;
            case 'pixelfed':
              update_option('fediembedi-pixelfed-token', '');
              break;
          }
        }
        $mastodon_instance = null;
        $mastodon_token = get_option('fediembedi-mastodon-token');
        $pixelfed_instance = null;
        $pixelfed_token = get_option('fediembedi-pixelfed-token');
        if (isset($_POST['save'])) {
            $is_valid_nonce = wp_verify_nonce($_POST['_wpnonce'], 'fediembedi-configuration');
            if ($is_valid_nonce) {
                $instance = esc_url($_POST['instance']);
                $instance_type = esc_attr($_POST['instance_type']);
                $client = new \FediClient($instance);
                $redirect_url = get_admin_url() . '?instance_type=' . $instance_type;
                $auth_url = $client->register_app($redirect_url);
                if ($auth_url == "ERROR") {
                    update_option(
                        'fediembedi-notice',
                        serialize(
                            array(
                                'message' => 'FediEmbedi : ' . __('The given instance url belongs to an unrecognized service!', 'fediembedi'),
                                'class' => 'error',
                            )
                        )
                    );
                } else {
                    if (empty($instance)) {
                        update_option(
                            'fediembedi-notice',
                            serialize(
                                array(
                                    'message' => 'FediEmbedi : ' . __('Please set your instance before you connect !', 'fediembedi'),
                                    'class' => 'error',
                                )
                            )
                        );
                    } else {
                        switch ($instance_type) {
                          case 'mastodon':
                            update_option('fediembedi-mastodon-client-id', $client->get_client_id());
                            update_option('fediembedi-mastodon-client-secret', $client->get_client_secret());
                            update_option('fediembedi-mastodon-instance', $instance);
                            $mastodon_account = $client->verify_credentials($mastodon_token);
                            $account = $mastodon_account;
                            break;
                          case 'pixelfed':
                            update_option('fediembedi-pixelfed-client-id', $client->get_client_id());
                            update_option('fediembedi-pixelfed-client-secret', $client->get_client_secret());
                            update_option('fediembedi-pixelfed-instance', $instance);
                            $pixelfed_account = $client->verify_credentials($pixelfed_token);
                            $account = $pixelfed_account;
                            break;
                        }
                        //$account = $client->verify_credentials($token);
                        if (is_null($account) || isset($account->error)) {
                            echo '';
                            echo __('Redirect to ', 'fediembedi') . $instance;
                            exit;
                        }
                        //Inform user that save was successfull
                        update_option(
                            'fediembedi-notice',
                            serialize(
                                array(
                                    'message' => 'FediEmbedi : ' . __('Configuration successfully saved!', 'fediembedi'),
                                    'class' => 'success',
                                )
                            )
                        );
                    }
                }
                $this->admin_notices();
            }
        }
        if (!empty($mastodon_token)) {
            $mastodon_instance = get_option('fediembedi-mastodon-instance');
            $client = new \FediClient($mastodon_instance);
            $mastodon_account = $client->verify_credentials($mastodon_token);
        }
        if (!empty($pixelfed_token)) {
            $pixelfed_instance = get_option('fediembedi-pixelfed-instance');
            $client = new \FediClient($pixelfed_instance);
            $pixelfed_account = $client->verify_credentials($pixelfed_token);
        }
        include 'fediembedi-settings-form.tpl.php';
    }
    /**
     * Admin_notices
     * Show the notice (error or info)
     *
     * @return void
     */
    public function admin_notices()
    {
        $notice = unserialize(get_option('fediembedi-notice'));
        if (is_array($notice)) {
            echo '
static_url}\">", $string);
      }
      return $string;
    }
    public function enqueue_styles($hook)
    {
        global $post;
        if( is_active_widget( false, false, 'mastodon') || is_active_widget( false, false, 'pixelfed') || ( is_a( $post, 'WP_Post' ) && ( has_shortcode( $post->post_content, 'mastodon') || has_shortcode( $post->post_content, 'pixelfed') ) ) ) {
            wp_enqueue_script( 'resize-sensor', plugin_dir_url( __FILE__ ) . 'assets/ResizeSensor.js', array(), 'css-element-queries-1.2.2' );
            wp_enqueue_script( 'element-queries', plugin_dir_url( __FILE__ ) . 'assets/ElementQueries.js', array('resize-sensor'), 'css-element-queries-1.2.2' );
        }
        if( is_active_widget( false, false, 'mastodon')  || ( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'mastodon') ) ) {
            wp_enqueue_style( 'mastodon', plugin_dir_url( __FILE__ ) . 'assets/mastodon.css', array(), filemtime(plugin_dir_path( __FILE__ ) . 'assets/mastodon.css') );
        }
        if( is_active_widget( false, false, 'pixelfed')  || ( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'pixelfed') )  ) {
            wp_enqueue_style( 'bootstrap', plugin_dir_url( __FILE__ ) . 'assets/bootstrap/css/bootstrap.min.css', array(), '4.4.1' );
            wp_enqueue_style( 'pixelfed', plugin_dir_url( __FILE__ ) . 'assets/pixelfed.css', array(), filemtime(plugin_dir_path( __FILE__ ) . 'assets/pixelfed.css') );
        }
        if( is_active_widget( false, false, 'peertube')  || ( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'peertube') ) ) {
            wp_enqueue_style( 'peertube', plugin_dir_url( __FILE__ ) . 'assets/peertube.css', array(), filemtime(plugin_dir_path( __FILE__ ) . 'assets/mastodon.css') );
        }
    }
    public function enqueue_scripts($hook)
    {
      global $pagenow;
      $infos = get_plugin_data(__FILE__);
      if ($pagenow == "options-general.php") {
          //We might be on settings page <-- Do you know a bette solution to get if we are in our own settings page?
          $plugin_url = plugin_dir_url(__FILE__);
          //wp_enqueue_script('settings_page', $plugin_url . 'assets/settings_page.js', array('jquery'), $infos['Version'], true);
      }
    }
    /**
     * Configuration_page
     *
     * Add the configuration page menu
     *
     * @return void
     */
    public function configuration_page()
    {
        add_options_page(
            'FediEmbedi',
            'FediEmbedi',
            'manage_options',
            'fediembedi',
            array($this, 'show_configuration_page')
        );
    }
    /**
     * Show_configuration_page
     *
     * Content of the configuration page
     *
     * @throws Exception The exception.
     * @return void
     */
    public function show_configuration_page()
    {
        wp_enqueue_style('fediembedi-configuration', plugin_dir_url(__FILE__) . 'style.css');
        if (isset($_GET['fediembedi-disconnect'])) {
          switch ($_GET['fediembedi-disconnect']) {
            case 'mastodon':
              update_option('fediembedi-mastodon-token', '');
              break;
            case 'pixelfed':
              update_option('fediembedi-pixelfed-token', '');
              break;
          }
        }
        $mastodon_instance = null;
        $mastodon_token = get_option('fediembedi-mastodon-token');
        $pixelfed_instance = null;
        $pixelfed_token = get_option('fediembedi-pixelfed-token');
        if (isset($_POST['save'])) {
            $is_valid_nonce = wp_verify_nonce($_POST['_wpnonce'], 'fediembedi-configuration');
            if ($is_valid_nonce) {
                $instance = esc_url($_POST['instance']);
                $instance_type = esc_attr($_POST['instance_type']);
                $client = new \FediClient($instance);
                $redirect_url = get_admin_url() . '?instance_type=' . $instance_type;
                $auth_url = $client->register_app($redirect_url);
                if ($auth_url == "ERROR") {
                    update_option(
                        'fediembedi-notice',
                        serialize(
                            array(
                                'message' => 'FediEmbedi : ' . __('The given instance url belongs to an unrecognized service!', 'fediembedi'),
                                'class' => 'error',
                            )
                        )
                    );
                } else {
                    if (empty($instance)) {
                        update_option(
                            'fediembedi-notice',
                            serialize(
                                array(
                                    'message' => 'FediEmbedi : ' . __('Please set your instance before you connect !', 'fediembedi'),
                                    'class' => 'error',
                                )
                            )
                        );
                    } else {
                        switch ($instance_type) {
                          case 'mastodon':
                            update_option('fediembedi-mastodon-client-id', $client->get_client_id());
                            update_option('fediembedi-mastodon-client-secret', $client->get_client_secret());
                            update_option('fediembedi-mastodon-instance', $instance);
                            $mastodon_account = $client->verify_credentials($mastodon_token);
                            $account = $mastodon_account;
                            break;
                          case 'pixelfed':
                            update_option('fediembedi-pixelfed-client-id', $client->get_client_id());
                            update_option('fediembedi-pixelfed-client-secret', $client->get_client_secret());
                            update_option('fediembedi-pixelfed-instance', $instance);
                            $pixelfed_account = $client->verify_credentials($pixelfed_token);
                            $account = $pixelfed_account;
                            break;
                        }
                        //$account = $client->verify_credentials($token);
                        if (is_null($account) || isset($account->error)) {
                            echo '';
                            echo __('Redirect to ', 'fediembedi') . $instance;
                            exit;
                        }
                        //Inform user that save was successfull
                        update_option(
                            'fediembedi-notice',
                            serialize(
                                array(
                                    'message' => 'FediEmbedi : ' . __('Configuration successfully saved!', 'fediembedi'),
                                    'class' => 'success',
                                )
                            )
                        );
                    }
                }
                $this->admin_notices();
            }
        }
        if (!empty($mastodon_token)) {
            $mastodon_instance = get_option('fediembedi-mastodon-instance');
            $client = new \FediClient($mastodon_instance);
            $mastodon_account = $client->verify_credentials($mastodon_token);
        }
        if (!empty($pixelfed_token)) {
            $pixelfed_instance = get_option('fediembedi-pixelfed-instance');
            $client = new \FediClient($pixelfed_instance);
            $pixelfed_account = $client->verify_credentials($pixelfed_token);
        }
        include 'fediembedi-settings-form.tpl.php';
    }
    /**
     * Admin_notices
     * Show the notice (error or info)
     *
     * @return void
     */
    public function admin_notices()
    {
        $notice = unserialize(get_option('fediembedi-notice'));
        if (is_array($notice)) {
            echo '' . $notice['message'] . '