get_bearer_token($client_id, $client_secret, $code, get_admin_url()); if (isset($token->error)) { print_r($token); //TODO: Propper error message update_option( 'autopostToMastodon-notice', serialize( array( 'message' => 'Mastodon Autopost : ' . __("Can't log you in.", 'autopost-to-mastodon') . '
' . __('Instance message', 'autopost-to-mastodon') . ' : ' . $token->error_description . '
', 'class' => 'error', ) ) ); unset($token); update_option('autopostToMastodon-token', ''); } else { update_option('autopostToMastodon-client-id', ''); update_option('autopostToMastodon-client-secret', ''); update_option('autopostToMastodon-token', $token->access_token); } $redirect_url = get_admin_url() . 'options-general.php?page=autopost-to-mastodon'; } else { //Probably hack or bad refresh, redirect to homepage $redirect_url = home_url(); } wp_redirect($redirect_url); exit; } $token = get_option('autopostToMastodon-token'); if (empty($token)) { update_option( 'autopostToMastodon-notice', serialize( array( 'message' => 'Mastodon Autopost : ' . __('Please login to your mastodon account!', 'autopost-to-mastodon') . ' ' . __('Go to Mastodon Autopost Settings', 'autopost-to-mastodon') . '', 'class' => 'error', ) ) ); } } /** * Enqueue_scripts * * @return void */ 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 . 'js/settings_page.js', array('jquery'), $infos['Version'], true); } } /** * Configuration_page * * Add the configuration page menu * * @return void */ public function configuration_page() { add_options_page( 'Mastodon Autopost', 'Mastodon Autopost', 'manage_options', 'autopost-to-mastodon', 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('autopostToMastodon-configuration', plugin_dir_url(__FILE__) . 'style.css'); if (isset($_GET['disconnect'])) { update_option('autopostToMastodon-token', ''); } elseif (isset($_GET['testToot'])) { $this->sendTestToot(); } $token = get_option('autopostToMastodon-token'); if (isset($_POST['save'])) { $is_valid_nonce = wp_verify_nonce($_POST['_wpnonce'], 'autopostToMastodon-configuration'); if ($is_valid_nonce) { $instance = esc_url($_POST['instance']); $message = stripslashes($_POST['message']); $content_warning = $_POST['content_warning']; $client = new Client($instance); $redirect_url = get_admin_url(); $auth_url = $client->register_app($redirect_url); if ($auth_url == "ERROR") { update_option( 'autopostToMastodon-notice', serialize( array( 'message' => 'Mastodon Autopost : ' . __('The given instance url belongs to no valid mastodon instance !', 'autopost-to-mastodon'), 'class' => 'error', ) ) ); } else { if (empty($instance)) { update_option( 'autopostToMastodon-notice', serialize( array( 'message' => 'Mastodon Autopost : ' . __('Thank you to set your Mastodon instance before connect !', 'autopost-to-mastodon'), 'class' => 'error', ) ) ); } else { update_option('autopostToMastodon-client-id', $client->get_client_id()); update_option('autopostToMastodon-client-secret', $client->get_client_secret()); update_option('autopostToMastodon-instance', $instance); update_option('autopostToMastodon-message', sanitize_textarea_field($message)); update_option('autopostToMastodon-mode', sanitize_text_field($_POST['mode'])); update_option('autopostToMastodon-toot-size', (int) $_POST['size']); if (isset($_POST['autopost_standard'])) { update_option('autopostToMastodon-postOnStandard', 'on'); } else { update_option('autopostToMastodon-postOnStandard', 'off'); } if (isset($_POST['cats_as_tags'])) { update_option('autopostToMastodon-catsAsTags', 'on'); } else { update_option('autopostToMastodon-catsAsTags', 'off'); } // get all post types $args = array( 'public' => true, ); $output = 'names'; $operator = 'and'; $post_types = get_post_types( $args, $output, $operator ); // check post for content type configs foreach ( $post_types as $post_type ) { if (isset($_POST[$post_type]) ? $_POST[$post_type] : "off" == "on") { update_option("autopostToMastodon-post_types-$post_type", 'on'); } else { update_option("autopostToMastodon-post_types-$post_type", 'off'); } } update_option('autopostToMastodon-content-warning', sanitize_textarea_field($content_warning)); $account = $client->verify_credentials($token); if (isset($account->error)) { echo ''; echo __('Redirect to ', 'autopost-to-mastodon') . $instance; exit; } //Inform user that save was successfull update_option( 'autopostToMastodon-notice', serialize( array( 'message' => 'Mastodon Autopost : ' . __('Configuration successfully saved !', 'autopost-to-mastodon'), 'class' => 'success', ) ) ); } } $this->admin_notices(); } } $instance = get_option('autopostToMastodon-instance'); if (!empty($token)) { $client = new Client($instance); $account = $client->verify_credentials($token); } $message = get_option('autopostToMastodon-message', "[title]\n[excerpt]\n[permalink]\n[tags]"); $mode = get_option('autopostToMastodon-mode', 'public'); $toot_size = get_option('autopostToMastodon-toot-size', 500); $content_warning = get_option('autopostToMastodon-content-warning', ''); $autopost = get_option('autopostToMastodon-postOnStandard', 'on'); $cats_as_tags = get_option('autopostToMastodon-catsAsTags', 'on'); $post_types = []; // get all post types $args = array( 'public' => true, ); $output = 'names'; $operator = 'and'; $wp_post_types = get_post_types( $args, $output, $operator ); // add form context data for post type options foreach ( $wp_post_types as $post_type ) { $post_types[$post_type] = get_option("autopostToMastodon-post_types-$post_type", 'on'); } include 'form.tpl.php'; } /** * Toot_post * Post the toot * * @param int $id The post ID. * @return void */ public function toot_post($id) { $post = get_post($id); $thumb_url = get_the_post_thumbnail_url($id, 'medium_large'); //Don't change the resolution ! $toot_size = (int) get_option('autopostToMastodon-toot-size', 500); $toot_on_mastodon_option = false; $cw_content = (string) get_option('autopostToMastodon-content-warning', ''); $toot_on_mastodon_option = isset($_POST['toot_on_mastodon']); if ($toot_on_mastodon_option) { update_post_meta($id, 'autopostToMastodon-post-status', 'on'); } else { if (get_post_meta($id, 'autopostToMastodon-post-status', true) == 'on') { update_post_meta($id, 'autopostToMastodon-post-status', 'off'); } } if ($toot_on_mastodon_option) { $message = $this->getTootFromTemplate($id); if (!empty($message)) { //Save the toot, for scheduling if ($post->post_status == 'future') { update_post_meta($id, 'autopostToMastodon-toot', $message); if ($thumb_url) { $thumb_path = str_replace(get_site_url(), get_home_path(), $thumb_url); update_post_meta($id, 'autopostToMastodon-toot-thumbnail', $thumb_path); } update_option( 'autopostToMastodon-notice', serialize( array( 'message' => 'Mastodon Autopost : ' . __('Toot saved for schedule !', 'autopost-to-mastodon'), 'class' => 'info', ) ) ); } else if ($post->post_status == 'publish') { $instance = get_option('autopostToMastodon-instance'); $access_token = get_option('autopostToMastodon-token'); $mode = get_option('autopostToMastodon-mode', 'public'); $client = new Client($instance, $access_token); if ($thumb_url) { $thumb_path = str_replace(get_site_url(), get_home_path(), $thumb_url); $attachment = $client->create_attachment($thumb_path); if (is_object($attachment)) { $media = $attachment->id; } } $toot = $client->postStatus($message, $mode, $media, $cw_content); update_post_meta($id, 'autopostToMastodon-post-status', 'off'); add_action('admin_notices', 'autopostToMastodon_notice_toot_success'); if (isset($toot->errors)) { update_option( 'autopostToMastodon-notice', serialize( array( 'message' => 'Mastodon Autopost : ' . __('Sorry, can\'t send toot !', 'autopost-to-mastodon') . '' . __('Instance message', 'autopost-to-mastodon') . ' : ' . json_encode($toot->errors) . '
', 'class' => 'error', ) ) ); } else { update_option( 'autopostToMastodon-notice', serialize( array( 'message' => 'Mastodon Autopost : ' . __('Toot successfully sent !', 'autopost-to-mastodon') . ' ' . __('View Toot', 'autopost-to-mastodon') . '', 'class' => 'success', ) ) ); //Save the toot url for syndication update_post_meta($id, 'autopostToMastodonshare-lastSuccessfullTootURL', $toot->url); } } } } } /** * Toot_scheduled_post * @param integer $post_id */ public function toot_scheduled_post($post_id) { $instance = get_option('autopostToMastodon-instance'); $access_token = get_option('autopostToMastodon-token'); $mode = get_option('autopostToMastodon-mode', 'public'); $message = $this->getTootFromTemplate($post_id); if (!empty($message)) { $thumb_url = get_the_post_thumbnail_url($post_id); $thumb_path = get_post_meta($post_id, 'autopostToMastodon-toot-thumbnail', true); $client = new Client($instance, $access_token); if ($thumb_url && $thumb_path) { $attachment = $client->create_attachment($thumb_path); if (is_object($attachment)) { $media = $attachment->id; } } $toot = $client->postStatus($message, $mode, $media); } } /** * Admin_notices * Show the notice (error or info) * * @return void */ public function admin_notices() { $notice = unserialize(get_option('autopostToMastodon-notice')); if (is_array($notice)) { echo '' . $notice['message'] . '
' . __('Instance message', 'autopost-to-mastodon') . ' : ' . $toot->error . '
', 'class' => 'error', ) ) ); } else { update_option( 'autopostToMastodon-notice', serialize( array( 'message' => 'Mastodon Autopost : ' . __('Toot successfully sent !', 'autopost-to-mastodon') . ' ' . __('View Toot', 'autopost-to-mastodon') . '', 'class' => 'success', ) ) ); } $this->admin_notices(); } } $autopostToMastodon = new autopostToMastodon();