From 7595b51ee856e6c27962cd9c3ea2841b417aed0d Mon Sep 17 00:00:00 2001 From: lucha <lucha@paranoici.org> Date: Sun, 30 Dec 2018 13:22:20 -0800 Subject: [PATCH] [auto] plugin: autopost-to-mastodon 3.2.6 --- .../plugins/autopost-to-mastodon/form.tpl.php | 4 +- .../mastodon_autopost.php | 1102 +++++++++-------- .../plugins/autopost-to-mastodon/readme.txt | 24 +- 3 files changed, 577 insertions(+), 553 deletions(-) diff --git a/wp-content/plugins/autopost-to-mastodon/form.tpl.php b/wp-content/plugins/autopost-to-mastodon/form.tpl.php index c44a438c7..e86d566ac 100644 --- a/wp-content/plugins/autopost-to-mastodon/form.tpl.php +++ b/wp-content/plugins/autopost-to-mastodon/form.tpl.php @@ -13,8 +13,8 @@ define("ADVANCED_VIEW",false); <a href="https://github.com/simonfrey/mastodon_wordpress_autopost" target="_blank" class="github-icon" target="_blank"> <svg aria-hidden="true" class="octicon octicon-mark-github" height="32" version="1.1" viewBox="0 0 16 16" width="32"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg> </a> - - <a href="https://liberapay.com/Mastodon-Auto-Share-Team/donate" target="_blank"><img src="<?php echo plugins_url( 'img/donate.svg', __FILE__ );?>"></a> + + <a href="https://paypal.me/51edpo" target="_blank"><img src="<?php echo plugins_url( 'img/paypal.png', __FILE__ );?>" style="height:30px;"></a> <a href="https://patreon.com/simonfrey" target="_blank"><img src="<?php echo plugins_url( 'img/patron.png', __FILE__ );?>" style="height:30px;"></a> <a href="https://liberapay.com/Mastodon-Auto-Share-Team/donate" target="_blank"><img src="<?php echo plugins_url( 'img/donate.svg', __FILE__ );?>"></a> <br> <br> <?php if(ACCOUNT_CONNECTED): ?> diff --git a/wp-content/plugins/autopost-to-mastodon/mastodon_autopost.php b/wp-content/plugins/autopost-to-mastodon/mastodon_autopost.php index 6a8e6f025..04f2ae31c 100644 --- a/wp-content/plugins/autopost-to-mastodon/mastodon_autopost.php +++ b/wp-content/plugins/autopost-to-mastodon/mastodon_autopost.php @@ -1,547 +1,555 @@ -<?php -/** -* Plugin Name: Mastodon Autopost -* Plugin URI: https://github.com/simonfrey/mastodon_wordpress_autopost -* Description: A Wordpress Plugin that automatically posts your new articles to Mastodon -* Version: 3.2.2 -* Author: L1am0 -* Author URI: http://www.simon-frey.eu -* License: GPL2 -* Text Domain: autopost-to-mastodon -* Domain Path: /languages -*/ - - -require_once 'client.php'; - - -class autopostToMastodon -{ - public function __construct(){ - add_action( 'plugins_loaded', array($this, 'init' ) ); - add_action( 'admin_enqueue_scripts', array($this, 'enqueue_scripts' ) ); - add_action( 'admin_menu', array($this, 'configuration_page' ) ); - add_action( 'save_post', array($this, 'toot_post' ) ); - add_action( 'admin_notices', array($this, 'admin_notices' ) ); - add_action( 'add_meta_boxes', array($this, 'add_metabox' ) ); - add_action( 'publish_future_post', array($this, 'toot_scheduled_post') ); - add_action( 'wp_ajax_get_toot_preview', array($this,'get_toot_preview_ajax_handler' )); - - } - - /** - * Init - * - * Plugin initialization - * - * @return void - */ - public function init(){ - $plugin_dir = basename( dirname( __FILE__ ) ); - load_plugin_textdomain( 'autopost-to-mastodon', false, $plugin_dir . '/languages' ); - - if(isset($_GET['code'])){ - $code = $_GET['code']; - $client_id = get_option('autopostToMastodon-client-id'); - $client_secret = get_option('autopostToMastodon-client-secret'); - - if(!empty($code) && !empty($client_id) && !empty($client_secret)) - { - echo __( 'Authentification, please wait', 'autopost-to-mastodon' ) . '...'; - - update_option( 'autopostToMastodon-token', 'nada' ); - - $instance = get_option( 'autopostToMastodon-instance' ); - $client = new Client($instance); - $token = $client->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' => '<strong>Mastodon Autopost</strong> : ' . __( "Can't log you in.", 'autopost-to-mastodon' ) . - '<p><strong>' . __( 'Instance message', 'autopost-to-mastodon' ) . '</strong> : ' . $token->error_description . '</p>', - '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' => '<strong>Mastodon Autopost</strong> : ' . __( 'Please login to your mastodon account!', 'autopost-to-mastodon' ) . '<a href="'.get_admin_url() . 'options-general.php?page=autopost-to-mastodon"> '. __( 'Go to Mastodon Autopost Settings', 'autopost-to-mastodon' ).'</a>', - '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 ); - - } - if ( in_array( $pagenow, [ 'post-new.php', 'post.php' ] ) ) { - $plugin_url = plugin_dir_url( __FILE__ ); - wp_enqueue_script( 'toot_editor', $plugin_url . 'js/toot_editor.js', array('jquery'), $infos['Version'], true ); - - $title_nonce = wp_create_nonce( 'mastodonNonce' ); - wp_localize_script( 'toot_editor', 'ajax_obj', array( - 'ajax_url' => admin_url( 'admin-ajax.php' ), - 'nonce' => $title_nonce - ) ); - } - } - - /** - * Configuration_page - * - * Add the configuration page menu - * - * @return void - */ - public function configuration_page() { - add_options_page( - 'Mastodon Autopost', - 'Mastodon Autopost', - 'install_plugins', - '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' => '<strong>Mastodon Autopost</strong> : ' . __( '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' => '<strong>Mastodon Autopost</strong> : ' . __( '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' ); - } - - update_option( 'autopostToMastodon-content-warning', sanitize_textarea_field( $content_warning ) ); - - $account = $client->verify_credentials($token); - - if( isset( $account->error ) ){ - echo '<meta http-equiv="refresh" content="0; url=' . $auth_url . '" />'; - echo __( 'Redirect to ', 'autopost-to-mastodon' ) . $instance; - exit; - } - - //Inform user that save was successfull - update_option( - 'autopostToMastodon-notice', - serialize( - array( - 'message' => '<strong>Mastodon Autopost</strong> : ' . __( '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'); - - 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' => '<strong>Mastodon Autopost</strong> : ' . __( '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->error ) ) { - update_option( - 'autopostToMastodon-notice', - serialize( - array( - 'message' => '<strong>Mastodon Autopost</strong> : ' . __( 'Sorry, can\'t send toot !', 'autopost-to-mastodon' ) . - '<p><strong>' . __( 'Instance message', 'autopost-to-mastodon' ) . '</strong> : ' . $toot->error . '</p>', - 'class' => 'error', - ) - ) - ); - } else { - update_option( - 'autopostToMastodon-notice', - serialize( - array( - 'message' => '<strong>Mastodon Autopost</strong> : ' . __( 'Toot successfully sent !', 'autopost-to-mastodon' ). ' <a href="'.$toot->url.'" target="_blank">'. __('View Toot', 'autopost-to-mastodon') .'</a>', - '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 = get_post_meta($post_id, 'autopostToMastodon-toot', true); - - $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 '<div class="notice notice-' . sanitize_html_class( $notice['class'] ) . ' is-dismissible"><p>' . $notice['message'] . '</p></div>'; - update_option( 'autopostToMastodon-notice', null ); - } - } - - /** - * Add_metabox - * - * @return void - */ - public function add_metabox() { - add_meta_box( - 'autopostToMastodon_metabox', - 'Mastodon Autopost', - array($this, 'metabox'), - ['post', 'page'], - 'side', - 'high' - ); - } - - /** - * Metabox - * - * @param WP_Post $post the current post. - * @return void - */ - public function metabox( $post ) { - if ( $post->post_title == '' && $post->post_content == ''){ - $status = ('on' == (string) get_option('autopostToMastodon-postOnStandard', true)); - }else{ - $status = ('on' == (string) get_post_meta( $post->ID, 'autopostToMastodon-post-status', 'off' )); - } - - $checked = ( $status ) ? 'checked' : ''; - - echo '<div style="margin: 20px 0;"><input ' . $checked . ' type="checkbox" name="toot_on_mastodon" id="toot_on_mastodon" value="on">' . - '<label for="toot_on_mastodon">' . __( 'Toot on Mastodon', 'autopost-to-mastodon' ) . '</label></div>'; - - } - - - - - public function get_toot_preview_ajax_handler() { - check_ajax_referer( 'mastodonNonce' ); - - $return = array( - 'message' => $this->getTootFromTemplate($_POST['post_ID']) - ); - - wp_send_json( $return); - } - - private function getTootFromTemplate($id){ - - $post = get_post( $id ); - $toot_size = (int) get_option( 'autopostToMastodon-toot-size', 500 ); - - - $message_template = get_option( 'autopostToMastodon-message', "[title]\n[excerpt]\n[permalink]\n[tags]" ); - - //Replace title - $post_title = html_entity_decode(get_the_title( $id ), ENT_COMPAT, 'UTF-8'); - $message_template = str_replace("[title]", $post_title, $message_template); - - //Replace permalink - $post_permalink = get_the_permalink( $id); - $message_template = str_replace("[permalink]", $post_permalink, $message_template); - - //Replace tags - $post_tags = html_entity_decode(get_the_tags($post->ID ), ENT_COMPAT, 'UTF-8'); - $post_tags_content = ''; - if ( $post_tags ) { - foreach( $post_tags as $tag ) { - $post_tags_content = $post_tags_content . '#'. preg_replace('/\s+/', '',$tag->name). ' ' ; - } - $post_tags_content = trim($post_tags_content); - } - $message_template = str_replace("[tags]", $post_tags_content, $message_template); - - //Replace excerpt - $post_content_long = wp_trim_words($post->post_content); - $post_content_long = strip_shortcodes($post_content_long); - $post_content_long = html_entity_decode($post_content_long,ENT_COMPAT, 'UTF-8'); - $post_content_long = str_replace("...", "",$post_content_long); - - $excerpt_len = $toot_size - strlen($message_template) + 9 - 5; - - $post_excerpt = substr($post_content_long,0,$excerpt_len) ."[...]"; - - $message_template = str_replace("[excerpt]", $post_excerpt, $message_template); - - - return substr($message_template,0,$toot_size); - } - - private function sendTestToot(){ - $instance = get_option( 'autopostToMastodon-instance' ); - $access_token = get_option('autopostToMastodon-token'); - $mode = 'public'; - - $client = new Client($instance, $access_token); - //TODO: Add propper message - $message=__("This is my first post with Mastodon Autopost for Wordpress",'autopost-to-mastodon'). " - https://wordpress.org/plugins/autopost-to-mastodon/"; - $media=null; - $toot = $client->postStatus($message, $mode, $media); - - if ( isset( $toot->error ) ) { - update_option( - 'autopostToMastodon-notice', - serialize( - array( - 'message' => '<strong>Mastodon Autopost</strong> : ' . __( 'Sorry, can\'t send toot !', 'autopost-to-mastodon' ) . - '<p><strong>' . __( 'Instance message', 'autopost-to-mastodon' ) . '</strong> : ' . $toot->error . '</p>', - 'class' => 'error', - ) - ) - ); - } else { - update_option( - 'autopostToMastodon-notice', - serialize( - array( - 'message' => '<strong>Mastodon Autopost</strong> : ' . __( 'Toot successfully sent !', 'autopost-to-mastodon' ). ' <a href="'.$toot->url.'" target="_blank">'. __('View Toot', 'autopost-to-mastodon') .'</a>', - 'class' => 'success', - ) - ) - ); - } - $this->admin_notices(); - } -} - -$autopostToMastodon = new autopostToMastodon(); +<?php +/** + * Plugin Name: Mastodon Autopost + * Plugin URI: https://github.com/simonfrey/mastodon_wordpress_autopost + * Description: A Wordpress Plugin that automatically posts your new articles to Mastodon + * Version: 3.2.6 + * Author: L1am0 + * Author URI: http://www.simon-frey.eu + * License: GPL2 + * Text Domain: autopost-to-mastodon + * Domain Path: /languages + */ + +require_once 'client.php'; + +class autopostToMastodon +{ + public function __construct() + { + add_action('plugins_loaded', array($this, 'init')); + add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts')); + add_action('admin_menu', array($this, 'configuration_page')); + add_action('save_post', array($this, 'toot_post')); + add_action('admin_notices', array($this, 'admin_notices')); + add_action('add_meta_boxes', array($this, 'add_metabox')); + add_action('publish_future_post', array($this, 'toot_scheduled_post')); + add_action('wp_ajax_get_toot_preview', array($this, 'get_toot_preview_ajax_handler')); + + } + + /** + * Init + * + * Plugin initialization + * + * @return void + */ + public function init() + { + $plugin_dir = basename(dirname(__FILE__)); + load_plugin_textdomain('autopost-to-mastodon', false, $plugin_dir . '/languages'); + + if (isset($_GET['code'])) { + $code = $_GET['code']; + $client_id = get_option('autopostToMastodon-client-id'); + $client_secret = get_option('autopostToMastodon-client-secret'); + + if (!empty($code) && !empty($client_id) && !empty($client_secret)) { + echo __('Authentification, please wait', 'autopost-to-mastodon') . '...'; + + update_option('autopostToMastodon-token', 'nada'); + + $instance = get_option('autopostToMastodon-instance'); + $client = new Client($instance); + $token = $client->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' => '<strong>Mastodon Autopost</strong> : ' . __("Can't log you in.", 'autopost-to-mastodon') . + '<p><strong>' . __('Instance message', 'autopost-to-mastodon') . '</strong> : ' . $token->error_description . '</p>', + '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' => '<strong>Mastodon Autopost</strong> : ' . __('Please login to your mastodon account!', 'autopost-to-mastodon') . '<a href="' . get_admin_url() . 'options-general.php?page=autopost-to-mastodon"> ' . __('Go to Mastodon Autopost Settings', 'autopost-to-mastodon') . '</a>', + '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); + + } + if (in_array($pagenow, ['post-new.php', 'post.php'])) { + $plugin_url = plugin_dir_url(__FILE__); + wp_enqueue_script('toot_editor', $plugin_url . 'js/toot_editor.js', array('jquery'), $infos['Version'], true); + + $title_nonce = wp_create_nonce('mastodonNonce'); + wp_localize_script('toot_editor', 'ajax_obj', array( + 'ajax_url' => admin_url('admin-ajax.php'), + 'nonce' => $title_nonce, + )); + } + } + + /** + * 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' => '<strong>Mastodon Autopost</strong> : ' . __('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' => '<strong>Mastodon Autopost</strong> : ' . __('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'); + } + + update_option('autopostToMastodon-content-warning', sanitize_textarea_field($content_warning)); + + $account = $client->verify_credentials($token); + + if (isset($account->error)) { + echo '<meta http-equiv="refresh" content="0; url=' . $auth_url . '" />'; + echo __('Redirect to ', 'autopost-to-mastodon') . $instance; + exit; + } + + //Inform user that save was successfull + update_option( + 'autopostToMastodon-notice', + serialize( + array( + 'message' => '<strong>Mastodon Autopost</strong> : ' . __('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'); + + 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' => '<strong>Mastodon Autopost</strong> : ' . __('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->error)) { + update_option( + 'autopostToMastodon-notice', + serialize( + array( + 'message' => '<strong>Mastodon Autopost</strong> : ' . __('Sorry, can\'t send toot !', 'autopost-to-mastodon') . + '<p><strong>' . __('Instance message', 'autopost-to-mastodon') . '</strong> : ' . $toot->error . '</p>', + 'class' => 'error', + ) + ) + ); + } else { + update_option( + 'autopostToMastodon-notice', + serialize( + array( + 'message' => '<strong>Mastodon Autopost</strong> : ' . __('Toot successfully sent !', 'autopost-to-mastodon') . ' <a href="' . $toot->url . '" target="_blank">' . __('View Toot', 'autopost-to-mastodon') . '</a>', + '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 '<div class="notice notice-' . sanitize_html_class($notice['class']) . ' is-dismissible"><p>' . $notice['message'] . '</p></div>'; + update_option('autopostToMastodon-notice', null); + } + } + + /** + * Add_metabox + * + * @return void + */ + public function add_metabox() + { + add_meta_box( + 'autopostToMastodon_metabox', + 'Mastodon Autopost', + array($this, 'metabox'), + ['post', 'page'], + 'side', + 'high' + ); + } + + /** + * Metabox + * + * @param WP_Post $post the current post. + * @return void + */ + public function metabox($post) + { + if ($post->post_title == '' && $post->post_content == '') { + $status = ('on' == (string) get_option('autopostToMastodon-postOnStandard', true)); + } else { + $status = ('on' == (string) get_post_meta($post->ID, 'autopostToMastodon-post-status', 'off')); + } + + $checked = ($status) ? 'checked' : ''; + + echo '<div style="margin: 20px 0;"><input ' . $checked . ' type="checkbox" name="toot_on_mastodon" id="toot_on_mastodon" value="on">' . + '<label for="toot_on_mastodon">' . __('Toot on Mastodon', 'autopost-to-mastodon') . '</label></div>'; + + } + + public function get_toot_preview_ajax_handler() + { + check_ajax_referer('mastodonNonce'); + + $return = array( + 'message' => $this->getTootFromTemplate($_POST['post_ID']), + ); + + wp_send_json($return); + } + + private function getTootFromTemplate($id) + { + + $post = get_post($id); + $toot_size = (int) get_option('autopostToMastodon-toot-size', 500); + + $message_template = get_option('autopostToMastodon-message', "[title]\n[excerpt]\n[permalink]\n[tags]"); + + //Replace title + $post_title = html_entity_decode(get_the_title($id), ENT_COMPAT, 'UTF-8'); + $message_template = str_replace("[title]", $post_title, $message_template); + + //Replace permalink + $post_permalink = get_the_permalink($id); + $message_template = str_replace("[permalink]", $post_permalink, $message_template); + + //Replace tags + $post_tags = get_the_tags($id); + + if (sizeof($post_tags) > 0) { + $post_tags_content = ''; + if ($post_tags) { + foreach ($post_tags as $tag) { + $post_tags_content = $post_tags_content . '#' . preg_replace('/\s+/', '', html_entity_decode($tag->name, ENT_COMPAT, 'UTF-8')) . ' '; + } + $post_tags_content = trim($post_tags_content); + } + $message_template = str_replace("[tags]", $post_tags_content, $message_template); + } + + //Replace excerpt + $post_content_long = $post->post_content; + if ($wp_version[0] == "5"){ + $post_content_long = excerpt_remove_blocks($post_content_long); + } + $post_content_long = wp_strip_all_tags($post_content_long); + $post_content_long = strip_shortcodes($post_content_long); + $post_content_long = html_entity_decode($post_content_long, ENT_COMPAT, 'UTF-8'); + //$post_content_long = str_replace("...", "",$post_content_long); + + $excerpt_len = $toot_size - strlen($message_template) + 9 - 5; + + $post_excerpt = substr($post_content_long, 0, $excerpt_len); + + $message_template = str_replace("[excerpt]", $post_excerpt, $message_template); + + return substr($message_template, 0, $toot_size); + } + + private function sendTestToot() + { + $instance = get_option('autopostToMastodon-instance'); + $access_token = get_option('autopostToMastodon-token'); + $mode = 'public'; + + $client = new Client($instance, $access_token); + //TODO: Add propper message + $message = __("This is my first post with Mastodon Autopost for Wordpress", 'autopost-to-mastodon') . " - https://wordpress.org/plugins/autopost-to-mastodon/"; + $media = null; + $toot = $client->postStatus($message, $mode, $media); + + if (isset($toot->error)) { + update_option( + 'autopostToMastodon-notice', + serialize( + array( + 'message' => '<strong>Mastodon Autopost</strong> : ' . __('Sorry, can\'t send toot !', 'autopost-to-mastodon') . + '<p><strong>' . __('Instance message', 'autopost-to-mastodon') . '</strong> : ' . $toot->error . '</p>', + 'class' => 'error', + ) + ) + ); + } else { + update_option( + 'autopostToMastodon-notice', + serialize( + array( + 'message' => '<strong>Mastodon Autopost</strong> : ' . __('Toot successfully sent !', 'autopost-to-mastodon') . ' <a href="' . $toot->url . '" target="_blank">' . __('View Toot', 'autopost-to-mastodon') . '</a>', + 'class' => 'success', + ) + ) + ); + } + $this->admin_notices(); + } +} + +$autopostToMastodon = new autopostToMastodon(); diff --git a/wp-content/plugins/autopost-to-mastodon/readme.txt b/wp-content/plugins/autopost-to-mastodon/readme.txt index f3fe9e91b..738117b56 100644 --- a/wp-content/plugins/autopost-to-mastodon/readme.txt +++ b/wp-content/plugins/autopost-to-mastodon/readme.txt @@ -2,10 +2,10 @@ Contributors: l1am0, Hellexis Tags: mastodon, Mastodon, Mastdon Autopost, federated web, GNU social, statusnet, social web, social media, auto post Requires at least: 4.6 -Tested up to: 4.9.4 -Stable tag: 3.2.2 +Tested up to: 5.0 +Stable tag: 3.2.6 License: GPLv2 -Donate link: https://liberapay.com/Mastodon-Auto-Share-Team/donate +Donate link: https://patreon.com/simonfrey License URI: http://www.gnu.org/licenses/gpl-2.0.html A Wordpress Plugin that automatically posts your new articles to Mastodon. The best: It is set and forget! @@ -26,7 +26,7 @@ For any questions, do not hesitate to contact me: Do you want to help translating this plugin in your language? [Visit the translation page](https://translate.wordpress.org/projects/wp-plugins/autopost-to-mastodon) -Please consider donating via [Liberapay](https://liberapay.com/Mastodon-Auto-Share-Team/donate) <3 +Please consider donating via [Patreon](https://patreon.com/simonfrey), [PayPal](https://paypal.me/51edpo) or [Liberapay](https://liberapay.com/Mastodon-Auto-Share-Team/donate) <3 == Frequently Asked Questions == @@ -46,6 +46,22 @@ The plugin never transmits any data to me, or anyone else than the mastodon node == Changelog == += 3.2.6 = +* Change permission for settings page to manage_options + += 3.2.5 = +* 5.0 Fix: Post only the tags of the post + += 3.2.4 = +* Add version check to prevent call to undefined 5.0 function + += 3.2.3 = +* fixup for tags +* remove hardcoded `[...]` from post excerpt +* different excerpt function +* Works with 5.0 and Gutenberg Editor +* Create future toot the moment it gets tooted (not upfront) + = 3.2.2 = * revert change -- GitLab