From fab12dfba52269473704a156ab22881dc9a0105f Mon Sep 17 00:00:00 2001 From: lucha <lucha@paranoici.org> Date: Mon, 25 Jun 2018 21:44:32 +0200 Subject: [PATCH] [auto] plugin: autopost-to-mastodon --- .../MastodonOAuthPHP/.gitignore | 1 + .../MastodonOAuthPHP/README.md | 237 ++++++++++++ .../MastodonOAuthPHP/autoload.php | 18 + .../MastodonOAuthPHP/composer.json | 24 ++ .../MastodonOAuthPHP/example.php | 65 ++++ .../theCodingCompany/HttpRequest.php | 201 ++++++++++ .../theCodingCompany/Mastodon.php | 239 ++++++++++++ .../theCodingCompany/oAuth.php | 219 +++++++++++ .../autopost-to-mastodon/ajax_handler.php | 119 ++++++ .../autopost-to-mastodon/css/settingsPage.css | 23 ++ .../autopost-to-mastodon/enque_scripts.php | 37 ++ .../autopost-to-mastodon/generalNotices.php | 12 + .../internationalization.php | 6 + .../plugins/autopost-to-mastodon/js/ajax.js | 135 +++++++ .../autopost-to-mastodon/js/formValidation.js | 12 + .../languages/autopost-to-mastodon-de_DE.mo | Bin 0 -> 4342 bytes .../languages/autopost-to-mastodon-de_DE.po | 170 +++++++++ .../languages/autopost-to-mastodon-fr_FR.mo | Bin 0 -> 3606 bytes .../languages/autopost-to-mastodon-fr_FR.po | 129 +++++++ .../plugins/autopost-to-mastodon/license.txt | 339 +++++++++++++++++ .../mastodon_autopost.php | 50 +++ .../autopost-to-mastodon/post_meta_box.php | 69 ++++ .../publish_post_notification.php | 134 +++++++ .../plugins/autopost-to-mastodon/readme.txt | 128 +++++++ .../autopost-to-mastodon/settings_page.php | 357 ++++++++++++++++++ 25 files changed, 2724 insertions(+) create mode 100644 wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/.gitignore create mode 100644 wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/README.md create mode 100644 wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/autoload.php create mode 100644 wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/composer.json create mode 100644 wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/example.php create mode 100644 wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/theCodingCompany/HttpRequest.php create mode 100644 wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/theCodingCompany/Mastodon.php create mode 100644 wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/theCodingCompany/oAuth.php create mode 100644 wp-content/plugins/autopost-to-mastodon/ajax_handler.php create mode 100644 wp-content/plugins/autopost-to-mastodon/css/settingsPage.css create mode 100644 wp-content/plugins/autopost-to-mastodon/enque_scripts.php create mode 100644 wp-content/plugins/autopost-to-mastodon/generalNotices.php create mode 100644 wp-content/plugins/autopost-to-mastodon/internationalization.php create mode 100644 wp-content/plugins/autopost-to-mastodon/js/ajax.js create mode 100644 wp-content/plugins/autopost-to-mastodon/js/formValidation.js create mode 100644 wp-content/plugins/autopost-to-mastodon/languages/autopost-to-mastodon-de_DE.mo create mode 100644 wp-content/plugins/autopost-to-mastodon/languages/autopost-to-mastodon-de_DE.po create mode 100644 wp-content/plugins/autopost-to-mastodon/languages/autopost-to-mastodon-fr_FR.mo create mode 100644 wp-content/plugins/autopost-to-mastodon/languages/autopost-to-mastodon-fr_FR.po create mode 100644 wp-content/plugins/autopost-to-mastodon/license.txt create mode 100644 wp-content/plugins/autopost-to-mastodon/mastodon_autopost.php create mode 100644 wp-content/plugins/autopost-to-mastodon/post_meta_box.php create mode 100644 wp-content/plugins/autopost-to-mastodon/publish_post_notification.php create mode 100644 wp-content/plugins/autopost-to-mastodon/readme.txt create mode 100644 wp-content/plugins/autopost-to-mastodon/settings_page.php diff --git a/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/.gitignore b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/.gitignore new file mode 100644 index 000000000..2a551b3a1 --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/.gitignore @@ -0,0 +1 @@ +test_code.php diff --git a/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/README.md b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/README.md new file mode 100644 index 000000000..675648136 --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/README.md @@ -0,0 +1,237 @@ +# MastodonOAuthPHP +PHP Library for Mastodon REST API + +## What's in it? + +* App creation. +* Full oAuth implementation to authorize your App by users. +* Create and get authorization token, access token, client_id, client_secret and bearer token. +* Authenticate users +* Get user information +* Get user followers and following +* Get user status +* Post status update + + +## Installation using Composer + +``` +composer require thecodingcompany/php-mastodon +``` + +## Questions and example? + +Yes, mail me at: vangelier at hotmail dot com +Contact me on #Twitter @digital_human +Contact me on #Mastodon https://mastodon.social/@digitalhuman + +## Get started + +### Step 1 + +First step is you need to create a so called App. This app represents your 'service'. With this app you provide services to users or use Mastodon for other reasons. + +To create an App is as simple as: + +``` +<?php +/** + * Intellectual Property of #Mastodon + * + * @copyright (c) 2017, #Mastodon + * @author V.A. (Victor) Angelier <victor@thecodingcompany.se> + * @version 1.0 + * @license http://www.apache.org/licenses/GPL-compatibility.html GPL + * + */ +require_once("autoload.php"); + +$t = new \theCodingCompany\Mastodon(); + +/** + * Create a new App and get the client_id and client_secret + */ +$token_info = $t->createApp("MyCoolAppName", "http://www.internet.com"); + +$serializedData = serialize($token_info); + +// save the special tokens to a file, so you don't lose them +file_put_contents('mastodon_creds', $serializedData); // this will save it in the same folder as this file +?> +``` + +The parameter ```$token_info``` now has your 'client_id' and 'client_secret'. This information is important for the rest of your life ;). Store it in a file, DB or array. You need this everytime you communicate with Mastodon. + +### Step 2 + +Now you (your app) wants to provide services to a user. For this the user needs to authorize your app. Else you can't help him/her. To do this you need to redirect the user, with your tokens to Mastodon and ask for permission so to say. And example: + +``` +<?php +/** + * Intellectual Property of #Mastodon + * + * @copyright (c) 2017, #Mastodon + * @author V.A. (Victor) Angelier <victor@thecodingcompany.se> + * @version 1.0 + * @license http://www.apache.org/licenses/GPL-compatibility.html GPL + * + */ +require_once("autoload.php"); + +$recoveredData = file_get_contents('mastodon_creds'); + +// unserializing to get actual array +$recoveredArray = unserialize($recoveredData); + +$t = new \theCodingCompany\Mastodon(); + +/** + * We now have a client_id and client_secret. Set the domain and provide the library with your App's client_id and secret. + */ +$t->setMastodonDomain("mastodon.social"); // Set the mastodon domain, you can remove this line if you're using mastodon.social as it's the default + +$t->setCredentials($recoveredArray); // use the keys from the file we stored in Step 1 + +/** +* Now that is set we can get the Authorization URL and redirect the user to Mastodon +* After the user approves your App, it will return with an Access Token. +*/ +$auth_url = $t->getAuthUrl(); +header("Location: {$auth_url}", true); +exit; + +``` + +### Step 3 + +So you now have 3 tokens. The client_id, client_secret and the users access_token. Now exchange the access token for a bearer token and you are done. Save these tokens! + +``` +<?php +/** + * Intellectual Property of #Mastodon + * + * @copyright (c) 2017, #Mastodon + * @author V.A. (Victor) Angelier <victor@thecodingcompany.se> + * @version 1.0 + * @license http://www.apache.org/licenses/GPL-compatibility.html GPL + * + */ +require_once("autoload.php"); + +$recoveredData = file_get_contents('mastodon_creds'); + +// unserializing to get actual array +$recoveredArray = unserialize($recoveredData); + +$t = new \theCodingCompany\Mastodon(); + +/** + * We now have a client_id and client_secret. Set the domain and provide the library with your App's client_id and secret. + */ +$t->setMastodonDomain("mastodon.social"); // Set the mastodon domain, you can remove this line if you're using mastodon.social as it's the default + +$t->setCredentials(recoveredArray); // use the keys from the file we stored in Step 1 + +$token_info = $t->getAccessToken("7c47d0c636314a1dff21reryyy5edf91884856dc0f78148f848d475136"); //The access token you received in step 2 from the user. + +/** + * The above '$token_info' will now give you a bearer token (If successfull), you also need to store that and keep it safe! + * +*/ +``` + +## Step 4 + +To then post a status, you just do this: + +``` +require_once("autoload.php"); + +$t = new \theCodingCompany\Mastodon(); + +$t->setMastodonDomain(website address); // change this to whatever Mastodon instance you're using, or remove it entirely if you're using mastodon.social (as it's the default) + +$t->setCredentials($credentials); // where $credentials are your "client_id", "client_secret" and "bearer" in the form of an array with those exact names (from what you got in the earlier steps) + +$t->postStatus('API Test - PLZ ignore <3'); +``` + +## Full code overview options etc + +``` +<?php +/** + * Intellectual Property of #Mastodon + * + * @copyright (c) 2017, #Mastodon + * @author V.A. (Victor) Angelier <victor@thecodingcompany.se> + * @version 1.0 + * @license http://www.apache.org/licenses/GPL-compatibility.html GPL + * + */ +require_once("autoload.php"); + +$t = new \theCodingCompany\Mastodon(); + +/** + * Create a new App and get the client_id and client_secret + */ +$token_info = $t->createApp("MyCoolAppName", "http://www.internet.com"); + + +//Get the authorization url +$auth_url = $t->getAuthUrl(); +/* + * 1) Send the above URL '$auth_url' to the user. The need to authorize your App. + * 2) When they authorized your app, they will receive a token. The authorization token. + * 3) Put the authorization token in the request below to exchange it for a bearer token. + */ + +//Request the bearer token +$token_info = $t->getAccessToken("7c47d0c636314a1dff21reryyy5edf91884856dc0f78148f848d475136"); + +/** + * The above '$token_info' will now be an array with the info like below. (If successfull) + * No these are not real, your right. + * + { + "client_id": "87885c2bf1a9d9845345345318d1eeeb1e48bb676aa747d3216adb96f07", + "client_secret": "a1284899df5250bd345345f5fb971a5af5c520ca2c3e4ce10c203f81c6", + "bearer": "77e0daa7f252941ae8343543653454f4de8ca7ae087caec4ba85a363d5e08de0d" + } + */ + +/** + * Authenticate a user by username and password and receive the bearer token + */ +$bearer_token = $t->authUser("vangelier@hotmail.com", "MySecretP@ssW0rd"); + +/** + * Get the userinfo by authentication + */ + +$user_info = $t->getUser("vangelier@hotmail.com", "MySecretP@ssW0rd"); + +/** + * Get user followers / following + */ +$followers = $t->authenticate("vangelier@hotmail.com", "MySecretP@ssW0rd") + ->getFollowers(); + +/** + * Get user statusses + */ +$statusses = $t->authenticate("vangelier@hotmail.com", "MySecretP@ssW0rd") + ->getStatuses(); + + +/** +* Post status update +*/ + +$status = $t->authenticate("vangelier@hotmail.com", "MySecretP@ssW0rd") + ->postStatus("Text status update"); + +``` diff --git a/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/autoload.php b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/autoload.php new file mode 100644 index 000000000..6d701147d --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/autoload.php @@ -0,0 +1,18 @@ +<?php +/** + * Intellectual Property of #Mastodon + * + * @copyright (c) 2017, #Mastodon + * @author V.A. (Victor) Angelier <victor@thecodingcompany.se> + * @version 1.0 + * @license http://www.apache.org/licenses/GPL-compatibility.html GPL + * + */ +define('CLASS_DIR', __DIR__); +set_include_path(get_include_path().PATH_SEPARATOR.CLASS_DIR); + +spl_autoload_register(function($name){ + //For namespaces we replace \ with / to correct the Path + $filename = str_replace("\\", "/", $name); + require_once "{$filename}.php"; +}); \ No newline at end of file diff --git a/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/composer.json b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/composer.json new file mode 100644 index 000000000..0363c4262 --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/composer.json @@ -0,0 +1,24 @@ +{ + "name": "thecodingcompany/php-mastodon", + "type": "library", + "description": "Mastodon PHP library oAuth and API", + "keywords": ["php","mastodon","api","oauth"], + "homepage": "https://github.com/TheCodingCompany/MastodonOAuthPHP", + "license": "MIT", + "authors": [ + { + "name": "Victor Angelier", + "email": "vangelier@hotmail.com", + "homepage": "https://www.thecodingcompany.se", + "role": "Founder" + } + ], + "require": { + "php": ">=5.6.0" + }, + "autoload": { + "psr-4": { + "theCodingCompany\\": "theCodingCompany/" + } + } +} diff --git a/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/example.php b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/example.php new file mode 100644 index 000000000..f63145221 --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/example.php @@ -0,0 +1,65 @@ +<?php +/** + * Intellectual Property of #Mastodon + * + * @copyright (c) 2017, #Mastodon + * @author V.A. (Victor) Angelier <victor@thecodingcompany.se> + * @version 1.0 + * @license http://www.apache.org/licenses/GPL-compatibility.html GPL + * + */ +require_once("autoload.php"); + +$t = new \theCodingCompany\Mastodon(); + +/** + * Create a new App and get the client_id and client_secret + */ +$token_info = $t->createApp("MyCoolAppName", "http://www.internet.com"); + + +//Get the authorization url +$auth_url = $t->getAuthUrl(); +/* + * 1) Send the above URL '$auth_url' to the user. The need to authorize your App. + * 2) When they authorized your app, they will receive a token. The authorization token. + * 3) Put the authorization token in the request below to exchange it for a bearer token. + */ + +//Request the bearer token +$token_info = $t->getAccessToken("7c47d0c636314a1dff21reryyy5edf91884856dc0f78148f848d475136"); + +/** + * The above '$token_info' will now be an array with the info like below. (If successfull) + * No these are not real, your right. + * + { + "client_id": "87885c2bf1a9d9845345345318d1eeeb1e48bb676aa747d3216adb96f07", + "client_secret": "a1284899df5250bd345345f5fb971a5af5c520ca2c3e4ce10c203f81c6", + "bearer": "77e0daa7f252941ae8343543653454f4de8ca7ae087caec4ba85a363d5e08de0d" + } + */ + +/** + * Authenticate a user by username and password and receive the bearer token + */ +$bearer_token = $t->authUser("vangelier@hotmail.com", "MySecretP@ssW0rd"); + +/** + * Get the userinfo by authentication + */ + +$user_info = $t->getUser("vangelier@hotmail.com", "MySecretP@ssW0rd"); + +/** + * Get user followers / following + */ +$followers = $t->authenticate("vangelier@hotmail.com", "MySecretP@ssW0rd") + ->getFollowers(); + +/** + * Get user statusses + */ +$statusses = $t->authenticate("vangelier@hotmail.com", "MySecretP@ssW0rd") + ->getStatuses(); + diff --git a/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/theCodingCompany/HttpRequest.php b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/theCodingCompany/HttpRequest.php new file mode 100644 index 000000000..dec805202 --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/theCodingCompany/HttpRequest.php @@ -0,0 +1,201 @@ +<?php +/** + * Intellectual Property of #Mastodon + * + * @copyright (c) 2017, #Mastodon + * @author V.A. (Victor) Angelier <victor@thecodingcompany.se> + * @version 1.0 + * @license http://www.apache.org/licenses/GPL-compatibility.html GPL + * + */ +namespace theCodingCompany; + +/** + * HTTP Request object finetune for High Security + */ +final class HttpRequest +{ + /** + * Holds our base path. In most cases this is just /, but it can be /api for example + * @var string + */ + private static $base_path = "/"; + + /** + * Base URL without leading / + * @var string + */ + private static $base_url = ""; + + /** + * Holds our instance + * @var array + */ + private static $instance = array(); + + /** + * Enable debugging + * @var bool + */ + private static $debug = false; + + /** + * Construct new HttpRequest + * @param string $base_url Base url like http://api.website.com without leading / + * @param string $base_path Base path like, / or /api + */ + protected function __construct($base_url = "", $base_path = "/") { + self::$base_path = $base_path; + self::$base_url = $base_url; + } + protected function __clone(){} + protected function __wakeup(){} + + /** + * Singleton design pattern + * @param string $base_url The full FQDN url. http://api.domainname.com + * @param string $base_path The endpoint. We start at / + * @return HttpRequest instance + */ + public static function Instance($base_url = "", $base_path = "/"){ + $cls = get_called_class(); + if(!isset(self::$instance[$cls])){ + self::$instance[$cls] = new HttpRequest($base_url, $base_path); + } + return self::$instance[$cls]; + } + + /** + * HTTP POST request + * @param string $path + * @param array $parameters + * @param array $headers + * @return bool + */ + public static function Post($path = "", $parameters = array(), $headers = array()){ + //Sen the request and return response + $post_data = json_encode($parameters); + return self::http_request( + "POST", + self::$base_url.self::$base_path.$path, + $headers, + $post_data + ); + } + + /** + * HTTP GET request + * @param string $path + * @param array $parameters + * @param array $headers + * @return bool + */ + public static function Get($path = "", $parameters = array(), $headers = array()){ + //Sen the request and return response + + return self::http_request( + "GET", + self::$base_url.self::$base_path.$path, + $headers, + $parameters + ); + } + + /** + * Buikd the HTTP request + * @param string $method GET|POST + * @param string $url + * @param array $headers + * @param array $parameters + * @return boolean + */ + + private static function http_request($method = "GET", $url = "", $headers = array(), $parameters = array()) { + + + //Check if we have parameters to post + if (count($parameters) > 0 && is_array($parameters)) { + $content = ""; + foreach($parameters as $k => $v) { + $content .= "&".urlencode($k)."=" . urlencode($v); + } + + // Strip first & sign + $content = substr($content, 1); + + // If the method is get, append to the URL + if ($method == "GET") { + $url .= "?" . $content; + $body = ""; + } + // Otherwise, post in the content + else { + $body = $content; + } + } + elseif ($parameters) { + $body = $parameters; + } + + + $args = array( + 'method' => $method, + 'headers' => $headers, + 'body' => $body, + 'timeout' => '30', + 'httpversion' => '1.1' + ); + + + $response = wp_remote_request( $url, $args ); + $body = wp_remote_retrieve_body($response); + + + if (is_wp_error($response)) { + $error = "<pre>" . print_r(error_get_last(), true) . "</pre>"; + $error .= "<pre>Error Found ( ".$response->get_error_message()." )</pre>"; + + if(self::$debug){ print_r($error); } + return $error; + } + else{ + //Debug the response/url + self::debug_response($url, null); + + if (($json = \json_decode($body, true)) !== NULL) { + return $json; + } + else { + return $body; + } + } + + } + + /** + * Debug method for response analyzing + * @param string $url + * @param resource $context + */ + private static function debug_response($url, $context){ + //Get and debug headers + if(self::$debug){ + //Get meta data for debugging + $fp = @fopen($url, "r", false, $context); + if($fp){ + $req_headers = stream_get_meta_data($fp); + if(isset($req_headers["wrapper_data"])){ + echo "<pre>".print_r($req_headers["wrapper_data"], true)."</pre>"; + }else{ + echo "<pre>".print_r($req_headers, true)."</pre>"; + } + } + echo "<pre>Check host alive headers<br/>\r\n"; + $headers = @get_headers($url); + if($headers !== FALSE){ + print_r($headers); + } + echo "</pre>"; + } + } +} diff --git a/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/theCodingCompany/Mastodon.php b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/theCodingCompany/Mastodon.php new file mode 100644 index 000000000..53eeebd3a --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/theCodingCompany/Mastodon.php @@ -0,0 +1,239 @@ +<?php +/** + * Intellectual Property of #Mastodon + * + * @copyright (c) 2017, #Mastodon + * @author V.A. (Victor) Angelier <victor@thecodingcompany.se> + * @version 1.0 + * @license http://www.apache.org/licenses/GPL-compatibility.html GPL + * + */ +namespace theCodingCompany; + +use \theCodingCompany\HttpRequest; + +/** + * Mastodon main class + */ +class Mastodon +{ + //Mastodon oAuth + use \theCodingCompany\oAuth; + + /** + * Holds our current user_id for :id in API calls + * @var string + */ + private $mastodon_user_id = null; + + /** + * Holds our current userinfo + * @var array + */ + private $mastodon_userinfo = null; + + /** + * Construct new Mastodon class + */ + public function __construct($domainname = "mastodon.social") { + + //Set the domain name to use + $this->setMastodonDomain($domainname); + } + + /** + * Create an App and get client_id and client_secret + * @param string $name + * @param string $website_url + * @return array|bool + */ + public function createApp($name, $website_url){ + if(!empty($name) && !empty($website_url)){ + + //Set our info + $this->app_config["client_name"] = $name; + $this->app_config["website"] = $website_url; + + return $this->getAppConfig(); + } + return false; + } + + /** + * Authenticate the user + * @param string $username + * @param string $password + * @return $this + */ + public function authenticate($username = null, $password = null) { + $this->authUser($username, $password); + + //Set current working userid + $this->mastodon_userinfo = $this->getUser(); + + return $this; //For method chaining + } + + /** + * Post a new status to your {visibility} timeline + * @param string $text + * @param string $visibility + * @return HttpRequest | bool + */ + public function postStatus($text = "", $visibility = "public", $in_reply_to_id = null){ + if($this->getCredentials()){ + + $headers = $this->getHeaders(); + + //Create our object + $http = HttpRequest::Instance($this->getApiURL()); + $status = $http::Post( + "api/v1/statuses", + array( + "status" => $text, + "visibility" => $visibility, + "in_reply_to_id" => $in_reply_to_id + ), + $headers + ); + return $status; + } + return false; + } + + /** + * Get mastodon user + */ + public function getUser(){ + if(empty($this->mastodon_userinfo)){ + //Create our object + $http = HttpRequest::Instance($this->getApiURL()); + $user_info = $http::Get( + "api/v1/accounts/verify_credentials", + null, + $this->getHeaders() + ); + if(is_array($user_info) && isset($user_info["username"])){ + $this->mastodon_user_id = (int)$user_info["id"]; + return $user_info; + }else{ + echo "Authentication or authorization failed\r\n"; + } + } + return $this->mastodon_userinfo; + } + + /** + * Get current user's followers + */ + public function getFollowers(){ + if($this->mastodon_user_id > 0){ + + //Create our object + $http = HttpRequest::Instance($this->getApiURL()); + $accounts = $http::Get( + "api/v1/accounts/{$this->mastodon_user_id}/followers", + null, + $this->getHeaders() + ); + if(is_array($accounts) && count($accounts) > 0){ + return $accounts; + } + + } + return false; + } + + /** + * Get current user's following + */ + public function getFollowing(){ + if($this->mastodon_user_id > 0){ + + //Create our object + $http = HttpRequest::Instance($this->getApiURL()); + $accounts = $http::Get( + "api/v1/accounts/{$this->mastodon_user_id}/following", + null, + $this->getHeaders() + ); + if(is_array($accounts) && count($accounts) > 0){ + return $accounts; + } + + } + return false; + } + + /** + * Get current user's statuses + */ + public function getStatuses(){ + if($this->mastodon_user_id > 0){ + + //Create our object + $http = HttpRequest::Instance($this->getApiURL()); + $statusses = $http::Get( + "api/v1/accounts/{$this->mastodon_user_id}/statuses", + null, + $this->getHeaders() + ); + if(is_array($statusses) && count($statusses) > 0){ + return $statusses; + } + + } + return false; + } + + /** + * Get current user's notifications. If $since_id is provided, will only get the items + * after since_id. + * + */ + public function getNotifications($since_id = null){ + if($this->mastodon_user_id > 0){ + + //Create our object + $http = HttpRequest::Instance($this->getApiURL()); + + $notifications = $http::Get( + "api/v1/notifications", + ($since_id != null ? array('since_id'=>$since_id) : null), + $this->getHeaders() + ); + + if(is_array($notifications) && count($notifications) > 0){ + return $notifications; + } + } + return false; + } + + /** + * Clears the user's notifications. Returns true if successful. + * + */ + public function clearNotifications(){ + if($this->mastodon_user_id > 0){ + + //Create our object + $http = HttpRequest::Instance($this->getApiURL()); + + $clear_result = $http::Post( + "api/v1/notifications/clear", + null, + $this->getHeaders() + ); + + if(is_array($clear_result)) { + return true; + } + else { + return false; + } + } + return false; + } + +} diff --git a/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/theCodingCompany/oAuth.php b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/theCodingCompany/oAuth.php new file mode 100644 index 000000000..56a0e048e --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/MastodonOAuthPHP/theCodingCompany/oAuth.php @@ -0,0 +1,219 @@ +<?php +/** + * Intellectual Property of #Mastodon + * + * @copyright (c) 2017, #Mastodon + * @author V.A. (Victor) Angelier <victor@thecodingcompany.se> + * @version 1.0 + * @license http://www.apache.org/licenses/GPL-compatibility.html GPL + * + */ +namespace theCodingCompany; + +use theCodingCompany\HttpRequest; + +/** + * oAuth class for use at Mastodon + */ +trait oAuth +{ + + /** + * Our API to use + * @var string + */ + private $mastodon_api_url = "mastodon.social"; + + /** + * Default headers for each request + * @var array + */ + private $headers = array( + "Content-Type" => "application/json; charset=utf-8", + "Accept" => "*/*" + ); + + /** + * Holds our client_id and secret + * @var array + */ + private $credentials = array( + "client_id" => "", + "client_secret" => "", + "bearer" => "" + ); + + /** + * App config + * @var array + */ + private $app_config = array( + "client_name" => "MastoTweet", + "redirect_uris" => "urn:ietf:wg:oauth:2.0:oob", + "scopes" => "read write", + "website" => "https://www.thecodingcompany.se" + ); + + /** + * Set credentials + * @var array + **/ + public function setCredentials(array $credentials) + { + $this->credentials = $credentials; + } + + /** + * Set credentials + * @return array + **/ + public function getCredentials() + { + return $this->credentials; + } + + /** + * Get the API endpoint + * @return string + */ + public function getApiURL(){ + return "https://{$this->mastodon_api_url}"; + } + + /** + * Get Request headers + * @return array + */ + public function getHeaders(){ + if(isset($this->credentials["bearer"])){ + $this->headers["Authorization"] = "Bearer {$this->credentials["bearer"]}"; + } + return $this->headers; + } + + /** + * Start at getting or creating app + */ + public function getAppConfig(){ + //Get singleton instance + $http = HttpRequest::Instance("https://{$this->mastodon_api_url}"); + $config = $http::post( + "api/v1/apps", //Endpoint + $this->app_config, + $this->headers + ); + //Check and set our credentials + if(!empty($config) && isset($config["client_id"]) && isset($config["client_secret"])){ + $this->credentials['client_id'] = $config['client_id']; + $this->credentials['client_secret'] = $config['client_secret']; + return $this->credentials; + }else{ + return false; + } + } + + /** + * Set the correct domain name + * @param string $domainname + */ + public function setMastodonDomain($domainname = ""){ + if(!empty($domainname)){ + $this->mastodon_api_url = $domainname; + } + } + + /** + * Create authorization url + */ + public function getAuthUrl(){ + if(is_array($this->credentials) && isset($this->credentials["client_id"])){ + + //Return the Authorization URL + return "https://{$this->mastodon_api_url}/oauth/authorize/?".http_build_query(array( + "response_type" => "code", + "redirect_uri" => "urn:ietf:wg:oauth:2.0:oob", + "scope" => "read write", + "client_id" => $this->credentials["client_id"] + )); + } + return false; + } + + /** + * Handle our bearer token info + * @param array $token_info + * @return string | boolean + */ + private function _handle_bearer($token_info = null){ + if(!empty($token_info) && isset($token_info["access_token"])){ + + //Add to our credentials + $this->credentials["bearer"] = $token_info["access_token"]; + + return $token_info["access_token"]; + } + return false; + } + + /** + * Get access token + * @param string $auth_code + * @return string | bool + */ + public function getAccessToken($auth_code = ""){ + + if(is_array($this->credentials) && isset($this->credentials["client_id"])){ + + //Request access token in exchange for our Authorization token + $http = HttpRequest::Instance("https://{$this->mastodon_api_url}"); + $token_info = $http::Post( + "oauth/token", + array( + "grant_type" => "authorization_code", + "redirect_uri" => "urn:ietf:wg:oauth:2.0:oob", + "client_id" => $this->credentials["client_id"], + "client_secret" => $this->credentials["client_secret"], + "code" => $auth_code + ), + $this->headers + ); + + //Save our token info + return $this->_handle_bearer($token_info); + } + return false; + } + + /** + * Authenticate a user by username and password + * @param string $username usernam@domainname.com + * @param string $password The password + * @return bool + */ + private function authUser($username = null, $password = null){ + if(!empty($username) && stristr($username, "@") !== FALSE && !empty($password)){ + + + if(is_array($this->credentials) && isset($this->credentials["client_id"])){ + + //Request access token in exchange for our Authorization token + $http = HttpRequest::Instance("https://{$this->mastodon_api_url}"); + $token_info = $http::Post( + "oauth/token", + array( + "grant_type" => "password", + "client_id" => $this->credentials["client_id"], + "client_secret" => $this->credentials["client_secret"], + "username" => $username, + "password" => $password, + "scope" => "read write" + ), + $this->headers + ); + + return $this->credentials["bearer"] = $token_info["access_token"]; + } + } + return false; + } +} diff --git a/wp-content/plugins/autopost-to-mastodon/ajax_handler.php b/wp-content/plugins/autopost-to-mastodon/ajax_handler.php new file mode 100644 index 000000000..17799798a --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/ajax_handler.php @@ -0,0 +1,119 @@ +<?php +add_action('wp_ajax_get_bearer', 'mastodon_autopost_get_bearer_ajax_handler'); +function mastodon_autopost_get_bearer_ajax_handler() { + check_ajax_referer('connection_example'); + + //Testsend + global $mastodon_api; + + + //Mastodon User Settings + $token = $_POST['token']; + + + $recoveredData = get_option('mastodon_creds'); + $url = get_option('mastodon_url'); + + // unserializing to get actual array + $recoveredArray = (array) json_decode($recoveredData); + + + + $mastodon_api->setMastodonDomain($url); // Set the mastodon domain, you can remove this line if you're using mastodon.social as it's the default + + $mastodon_api->setCredentials($recoveredArray); + + //Get bearer + $bearer = $mastodon_api->getAccessToken($token); + + + + if($bearer){ + $recoveredArray['bearer'] = $bearer; + $serializedData = json_encode($recoveredArray); + update_option( 'mastodon_creds', $serializedData ); + + echo '{"status":"0", "action":"getBearer"}'; + }else{ + echo '{"status":"-1", "action":"getBearer", "mastodonResponse": '.json_encode($bearer).', "phpVersion": "'.phpversion().'", "wordpressVersion":"'.get_bloginfo('version').'", "wordpressLanguage":"'.get_bloginfo('language').'"}'; + } + + wp_die(); // all ajax handlers should die when finished +} + +add_action('wp_ajax_test_connection', 'mastodon_autopost_ajax_handler'); +function mastodon_autopost_ajax_handler() { + check_ajax_referer('connection_example'); + + //Testsend + global $mastodon_api; + + $url = get_option('mastodon_url'); +; + $recoveredData = get_option('mastodon_creds'); +; + // unserializing to get actual array + $recoveredArray = (array) json_decode($recoveredData); + + + + $mastodon_api->setMastodonDomain($url); // Set the mastodon domain, you can remove this line if you're using mastodon.social as it's the default + + $mastodon_api->setCredentials($recoveredArray); + + //Post Data + $title = esc_html__('This is my first toot with the Autopost to Mastodon Wordpress Plugin', 'autopost-to-mastodon'); + $permalink = "https://wordpress.org/plugins/autopost-to-mastodon/"; + + + //Testpost + $response = $mastodon_api->postStatus($title . " " . $permalink); + + + if(isset($response['id'])){ + echo '{"status":"0", "action":"testConnection", "serverURL": "'.$response['url'].'"}'; + }else{ + echo '{"status":"-1", "action":"testConnection", "mastodonResponse": '.json_encode($response).', "phpVersion": "'.phpversion().'", "wordpressVersion":"'.get_bloginfo('version').'", "wordpressLanguage":"'.get_bloginfo('language').'"}'; + } + + + wp_die(); // all ajax handlers should die when finished +} + +add_action('wp_ajax_user_auth', 'mastodon_autopost_userAuth_ajax_handler'); +function mastodon_autopost_userAuth_ajax_handler() { + check_ajax_referer('connection_example'); + + //Testsend + global $mastodon_api; + + $url = $_POST['serverURL']; + + //Set the send url + $mastodon_api->setMastodonDomain($url); + + //Create mastodon app + $token_info = $mastodon_api->createApp("Wordpress Mastodon Autopost", "https://wordpress.org/plugins/autopost-to-mastodon/"); + + echo $serializedData; + + if($token_info){ + $serializedData = json_encode($token_info); + + // save the special tokens to a file, so you don't lose them + update_option( 'mastodon_creds', $serializedData ); + update_option( 'mastodon_url', $url ); + + $mastodon_api->setCredentials($token_info); + + //Get the auth url + $auth_url = $mastodon_api ->getAuthUrl(); + + + echo '{"status":"0", "action":"userAuth", "authUrl": "'.$auth_url.'", "phpVersion": "'.phpversion().'", "wordpressVersion":"'.get_bloginfo('version').'", "wordpressLanguage":"'.get_bloginfo('language').'"}'; + }else{ + echo '{"status":"-1", "action":"registerApp", "phpVersion": "'.phpversion().'", "wordpressVersion":"'.get_bloginfo('version').'", "wordpressLanguage":"'.get_bloginfo('language').'"}'; + } + wp_die(); // all ajax handlers should die when finished +} +?> \ No newline at end of file diff --git a/wp-content/plugins/autopost-to-mastodon/css/settingsPage.css b/wp-content/plugins/autopost-to-mastodon/css/settingsPage.css new file mode 100644 index 000000000..f17aa47e7 --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/css/settingsPage.css @@ -0,0 +1,23 @@ +@keyframes glowing { + 0% { box-shadow: 0 0 5px rgba(0,115,170,1)} + 50% { box-shadow: 0 0 10px rgba(0,0,0,1)} + 100% { box-shadow: 0 0 5px rgba(0,115,170,1)} +} + +p.submit{ + margin: 0; + padding: 0; +} + +#testConnectionButton{ + margin-left: 5px; +} + +#testConnectionMessage, #mAuthMessage{ + font-weight: bold; + padding: 5px; +} + +#tokenEnterForm{ + display: none; +} \ No newline at end of file diff --git a/wp-content/plugins/autopost-to-mastodon/enque_scripts.php b/wp-content/plugins/autopost-to-mastodon/enque_scripts.php new file mode 100644 index 000000000..37cd38981 --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/enque_scripts.php @@ -0,0 +1,37 @@ +<?php +//Ajax Handler for testing the connection to server +add_action('admin_enqueue_scripts', 'mastodon_autopost_enqueue'); +function mastodon_autopost_enqueue($hook) { + if( 'settings_page_mastodon-settings-page' != $hook) return; + + wp_enqueue_style( 'settings-style', plugins_url( '/css/settingsPage.css', __FILE__ )); + + //Form buttons + wp_enqueue_script( 'validation-script', + plugins_url( '/js/formValidation.js', __FILE__ ), + array('jquery') + ); + + //Ajax + wp_enqueue_script( 'ajax-script', + plugins_url( '/js/ajax.js', __FILE__ ), + array('jquery') + ); + + $connection_nonce = wp_create_nonce('connection_example'); + wp_localize_script('ajax-script', 'my_ajax_obj', array( + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'nonce' => $connection_nonce, + )); + + wp_localize_script('ajax-script', 'notifications_obj', array( + 'notFound' => esc_html__('Mastodon instance not found! Is the URL correct?', 'autopost-to-mastodon'), + 'typeinpopup' => esc_html__('Please login again and copy the shown code into the popup.', 'autopost-to-mastodon'), + 'uncaught' => esc_html__('Uncaught Mastodon error! Please contact the developer.', 'autopost-to-mastodon'), + 'errorDataMsg' => esc_html__('Please include the following data in your email:', 'autopost-to-mastodon'), + 'errorData' => esc_html__('Error Data:', 'autopost-to-mastodon'), + 'ok' => esc_html__('Test Toot successfully tooted to Mastodon!', 'autopost-to-mastodon'), + 'testmsg' => esc_html__('By clicking the "Test Settings" Button the following toot will be tooted to your Mastodon profile:', 'autopost-to-mastodon').' "'.esc_html__('This is my first toot with the Autopost to Mastodon Wordpress Plugin', 'autopost-to-mastodon').' https://wordpress.org/plugins/autopost-to-mastodon/"' + )); +} + ?> diff --git a/wp-content/plugins/autopost-to-mastodon/generalNotices.php b/wp-content/plugins/autopost-to-mastodon/generalNotices.php new file mode 100644 index 000000000..f5a974a2e --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/generalNotices.php @@ -0,0 +1,12 @@ +<?php + add_action( 'admin_notices', 'updateLoginInfo' ); + + function updateLoginInfo(){ + if(get_option('mastodon_instance_url') == ""){ + echo '<div class="notice notice-error is-dismissible"> + <p>'.esc_html__('Seems like you are not logged into Mastodon Autopost! Please check your login!', 'autopost-to-mastodon'). ' - <a href="' . get_bloginfo('wpurl') . '/wp-admin/admin.php?page=mastodon-settings-page">'.esc_attr__('Settings', 'autopost-to-mastodon').'</a></p> + </div>'; + } + } + + ?> \ No newline at end of file diff --git a/wp-content/plugins/autopost-to-mastodon/internationalization.php b/wp-content/plugins/autopost-to-mastodon/internationalization.php new file mode 100644 index 000000000..66648c3ea --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/internationalization.php @@ -0,0 +1,6 @@ +<?php +function mastodon_autopost_load_plugin_textdomain() { + load_plugin_textdomain( 'autopost-to-mastodon', FALSE, basename( dirname( __FILE__ ) ) . '/languages' ); +} +add_action( 'plugins_loaded', 'mastodon_autopost_load_plugin_textdomain' ); +?> \ No newline at end of file diff --git a/wp-content/plugins/autopost-to-mastodon/js/ajax.js b/wp-content/plugins/autopost-to-mastodon/js/ajax.js new file mode 100644 index 000000000..66c1a5046 --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/js/ajax.js @@ -0,0 +1,135 @@ +jQuery(document).ready(function($) { //wrapper + $("#testConnectionButton").click(function() { //event + $("input").css("border", ""); + $("#testConnectionButton").css("animation", "glowing 2000ms infinite"); + $('#mAuthMessage').fadeOut('slow'); + + + console.log("Testconnection start request."); + + $.post(my_ajax_obj.ajax_url, { //POST request + _ajax_nonce: my_ajax_obj.nonce, //nonce + action: "test_connection" //action + }, function(data) { + console.log("Testconnection Serverresponse: "+data); + $("#testConnectionButton").css("animation", ""); + + var jsonResponse = JSON.parse(data); + + if(jsonResponse.status == "0"){ + $('#testConnectionMessage').html(notifications_obj.ok + "<br><a href='"+jsonResponse.serverURL+"' target='_blank'>"+jsonResponse.serverURL+"</a>"); + }else{ + $('#testConnectionMessage').html(notifications_obj.uncaught + ". 'mastodonautopost@l1am0.eu' <br>"+notifications_obj.errorDataMsg+"<br>"+notifications_obj.errorData+" <input value='"+data+"' onclick='this.select();'>" ); + } + + }); + + }); + + $("#userAuthButton").click(function() { //event + var serverURL = $("input[name=mastodon_instance_url]").val(); + $("input").css("border", ""); + $("#userAuthButton").css("animation", "glowing 2000ms infinite"); + + $("#tokenEnterForm").fadeOut('slow'); + $('#testConnectionButton').attr('disabled', true); + $("#testConnectionMessage").fadeOut('slow'); + $('#testConnectionMessage').html(""); + $('#mAuthMessage').fadeOut('slow'); + + console.log("User Auth start request. ServerURL:"+serverURL); + + $.post(my_ajax_obj.ajax_url, { //POST request + _ajax_nonce: my_ajax_obj.nonce, //nonce + action: "user_auth", //action + serverURL: serverURL //data + }, function(data) { + $("#userAuthButton").css("animation", ""); + console.log("User auth response: "+data); + var jsonResponse = JSON.parse(data); + + if(jsonResponse.status == "0"){ + $('#tokenPopupURL').attr('href',jsonResponse.authUrl); + $('#tokenPopupURL').html(jsonResponse.authUrl); + $("#tokenEnterForm").fadeIn('slow'); + $("input[name='mastodon_server_token']").attr('value',''); + + window.open(data, '_blank'); + }else{ + $("input[name=mastodon_server_url]").css("border", "2px solid red") + $('#mAuthMessage').html(notifications_obj.notFound); + $("#mAuthMessage").fadeIn('slow'); + } + }); + + }); + + + $("#getBearerButton").click(function() { //event + var token = $("input[name=mastodon_server_token]").val(); + $("input").css("border", ""); + $("#getBearerButton").css("animation", "glowing 2000ms infinite"); + + console.log("GetBearer start request."); + + $.post(my_ajax_obj.ajax_url, { //POST request + _ajax_nonce: my_ajax_obj.nonce, //nonce + action: "get_bearer", //action + token: token //action + }, function(data) { + $("#getBearerButton").css("animation", ""); + console.log("GetBearer response: "+data); + + var jsonResponse = JSON.parse(data); + + if(jsonResponse.status == "0"){ + $("#tokenEnterForm").fadeOut('slow'); + $('#testConnectionButton').attr('disabled', false); + $('#testConnectionMessage').html(notifications_obj.testmsg); + $("#testConnectionMessage").fadeIn('slow'); + $('#mAuthMessage').fadeOut('slow'); + + + }else{ + $('#mAuthMessage').html(notifications_obj.uncaught + ". 'mastodonautopost@l1am0.eu' <br>"+notifications_obj.errorDataMsg+"<br>"+notifications_obj.errorData+" <input value='"+data+"' onclick='this.select();'>" ); + $('#mAuthMessage').fadeIn('slow'); + $('#testConnectionButton').attr('disabled', true); + $("#testConnectionMessage").fadeOut('slow'); + $("#tokenEnterForm").fadeOut('slow'); + $('#testConnectionMessage').html(""); + } + }); + }); +}); + +const getBearer = (token) =>{ + $("input").css("border", ""); + $("#userAuthButton").css("animation", "glowing 2000ms infinite"); + + $.post(my_ajax_obj.ajax_url, { //POST request + _ajax_nonce: my_ajax_obj.nonce, //nonce + action: "get_bearer", //action + token: token //action + }, function(data) { + $("#userAuthButton").css("animation", ""); + if(data == 0){ + $('#testConnectionButton').attr('disabled', false); + $('#testConnectionMessage').html(notifications_obj.testmsg); + + }else{ + $('#mAuthMessage').html(notifications_obj.uncaught); + $('#testConnectionButton').attr('disabled', true); + $('#testConnectionMessage').html(""); + } + }); + +} + +const isValidUrl = (string) => { + try { + new URL(string); + return true; + } catch (_) { + return false; + } +} \ No newline at end of file diff --git a/wp-content/plugins/autopost-to-mastodon/js/formValidation.js b/wp-content/plugins/autopost-to-mastodon/js/formValidation.js new file mode 100644 index 000000000..30e4bad25 --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/js/formValidation.js @@ -0,0 +1,12 @@ +jQuery(document).ready(function($) { + //Enable login button + $("input[name=mastodon_instance_url]").keyup(function(){ + if($(this).val().length !=0){ + $('#userAuthButton').attr('disabled', false); + } + else + { + $('#userAuthButton').attr('disabled', true); + } + }); +}); \ No newline at end of file diff --git a/wp-content/plugins/autopost-to-mastodon/languages/autopost-to-mastodon-de_DE.mo b/wp-content/plugins/autopost-to-mastodon/languages/autopost-to-mastodon-de_DE.mo new file mode 100644 index 0000000000000000000000000000000000000000..f1d628c17df9b5c5d3683b309d1b7006f610cd5b GIT binary patch literal 4342 zcmca7#4?qEfq}u4fq_AWfq~%&BLjmw0|P@2GXp~i0|P?`3j>1$0|Ucd76t}B1_p+2 zEDQ|13=9mctPBiE3=9mytPBjY3=9lqtPBi73=9lYSRwkCvobKSGcYi`XJue;VqjqS z&dR_b$H2f~#m2zE%D})7$;QCI&A`AA&ju0ChVr}E7#M6B7#OCpF))ZQFfd$UV_@K5 zU|@L3#=yYBz`*bcs{cD11A`y~1H)f71_mhx1_pk1h&fv93=9Sg3=E#^3=B*R3=CE5 z3=EtM3=FmG5OdnuA?8njsyoNdz+lP1!0?})fx(D@fx(i4fk6!9e+~u)eg+1HW)21h z0R{$!$s7>>Ea6~aU}IolSi`}<Aj-hNu$coA9w#{%7=joW7_LM0X>l?zaDn{G39;9e z6Qa(KlYv2tfq@~0lYzm7fq|i&6A~V0I3eM2i4$V)Jx&G&VFm_<cbp6iW(*7rOk5Ci zEV&@z?Zm~vz|6qFkif;jkjKElkix~lpvb_$aG49@-mhE`{cPL}3@Ho@3{u<>`Fd_h zJT2sg#M2gTh=2ZYGcfowFfcIlFfd3nFfau3K*aNTAm)|vFfgcs+{?qjz{9}6u$G5` z!I^=9VHXc19RBe@+$X{di6>cJh`*G0A@QWa%fKKH3J+e0|D$*zX|5Hjem5_~+ylH2 zbI$TIFxW6KFkIt>_+OZhfx()Afx(N9fkB&rfuW5Lk}fy#LELwm50YN)@Il=Dkq;7{ zKlm6JBpDbOSoj$j#2FYE<oFpF5*Zj6%=jVdXYfPfX)Qk_es(~`kMTp&!)<;B1~&!< z20j6Ze?kQy=0*!Z{FN>MNiUTG&~zmL$tULoAmMUX0Fn+r3qZmTlt=VH84ij;c>%;U zVPIg;Wq`O5<X(`NJ_95zgYu0ANPvNXK><pGC?ycV0C5K>&Oqq}l(s<e14;{^@CM}} zO$JDqg7PUyiw-C~F)%O~f;dnNO5-3VC@+E1tvV=AF+jo^l<!m+7#P%`Wduka2!qm} zF^B=hpmG9~H$eFZBm~MIpfUhdwt(`WG6MqxBLgIyLGqyd1}XzU<%)u9UP)?^LP<ud zLP>shYMw$`QGPC%TaaH+TA-)knTFsgWELyr<(DYr7o_H8=A|o?Wfo_afTh#&b8_;_ zL1LvvISh_D#rX;)`5={f3IX}WB?_ShDTyVi434EG8L4?CnaPPInfZAPPNkI!xv2_? z3cesor%Hw7oXq5GkSQSdD21dJmna0MmXu`Xr57tHIF*)^<maJT2ezd=GbcwO3FL$P zlGGH1l6-~A{L&(Y+{EIN{FMAWg@U5|w9K4TD+cHMytK^p(xOzbDFHd9>6v*7PN^A* zWtsU!=(736B_N^V%#_q3g@VMQlFa1Hf<%yG^fXfS()AR=GfOfQN{SNmigUoi3YjGe znRzAo3W<67B^jwj3OR{+>7|M3shS{jN>cMc=9T88fWt5`IXShs7{iT<3XVmo3aPn? znK=rHc_|77iN(d``9&!T$@xV^smUew3@%{bDdc2krz-fueCSwOl3$QtTw>4Q3ew5| ziPaELj6&I<5XBb546a2*`9%sYi6x0v3~u>F3h9sl2Zs>Y=KRtU9fiyi^<st0+=Bd~ zlEl0cP!MM%mZd7B=jW#=6s4ABrj{2oxaZ_2CFVdP+#|6#qa-oCm;ui4$;``U@X1fl z%wxcCHl_$X-myq!7AxfEDY$2rWRxZ$q%-r1OA_;vQ^BE|mS38eqNw0m4E9E7kPjmK z{PG$63sUpI>60M<8oUevIjM=osS4?tWvQSfnU<QGl9ZU7t&ovl4oOU@6$Pn9nW-QP zlJh~4n3M_%kD~mt)D)QR%)I2B(iBMILga{)#F9jX%si+upy;uJX~+QuheBd{VrCvV zwv+P<D#0!;&d4v%Q%KHFNrj{+Q0##-Bur;PQGQt_)T+ef<owdS5`~o1lEloMVuiGP zNQN#>Eh<Yb(t~L!N-TjmtpJ?v8PJnIIHQ*2!xI%lKv8BHC}RecCgo%%GX#P3=jSPe z=NF|E6r~my>*W`vGX#T@0W6a;1gECv7DLizWqzqbVi6=da`MyDQ&S*b!H9fC1!&+W zXQU=)gS`*VzTm)7WC#ZP0+Ak|{LmmD2Dr5-B?SYR7Xm7Nic7({EUh#rrxG0DkkSF> z1Vx6BjLc$Csg_%*kd|3g3`*GfB?{%>jGd9H0LxaO^bXU6@V^2i1Q|jyOL9^fz!tjY z7v(0FK-giK#hFQ&IhiGuU_QFlp?S%PrRf<Zh$0{rloJu5k)KzRm<%aiQ&P)PbMgy7 zkr|qolUZDnn!*qc&4(o!iFw(e^aU$*$`dQ?86s1Q8QfEoQu7pwGgB2(Qu7qRg@Hn1 zX|X~|YOX>6sB~9I&CJtNa7)a|DOM=XOwLe9Ni2rS<YgvjlqekDmX?;6TB4AYT3ni( z0W~Zsv!o<dAuT^AJvA>SRUtezsW>$gT(~D^C?ut3f=mV505A6;L7xXH{!22`GOIFE zi%Rp-8Qe3I6mm0*6!JhtSxG9$bqr3anYjwypo%~tu{2FV$rY5bQ*&}k^U^`SNG&c& z%~Mh+&n!w&02Rz|cOYUNq%9>iGY_7U6#~E&fI@mIsEkZ4v10IsRs@-;MX3;9gY$$! zSZYy5VophF9s@WxWFsldWAMn#NmIzpEJ4;#RjN>yT9lMpT%1~zr=U@#=cEUTixiN_ z!39N$;BY&<Cn>e4IJKlIHBXblGY@13qU3_QE;~OjuOw9g67uP(u&^&rElNqvQ&b4f z%u7*#mRBVTrFkg|;G$k38&ol5m)JA-CZ-pcD5R7kybVjf_6)ANzKNMR4A3-?U6NS_ z@_8Ow5^)BVH<&2|QAMQYSuup>D&(eS6oG;&sVFtGq%<#Gp{i6NEi(_4%8Eg*OfM}- zRd7lzPb~t;rsjd-wKzE=Cow%8lq6H2HAO0wstS}8f(TZa?-eqOOTbA9Qez+-i%{wb zt~;vWVV_nC@{FQ_Cn!KOQx!lJ2t1tqQZw_wIU1Th@?f<{34;?jYotR{wHvGwDF<ai zP}YJZGI)Y1QGi6QLUv+a9#nJM;XR;q9t_fwiImM;5=&C^KuOCpqbL;`^{JV8R#0u= z5*Cu#!8tj#C@;0N1e6uQNhLeK036})(f}0IdQiO}_oif~DmX&w5l~AlPa!3>SOHSh z7K2QIsZ9dMDsrBI)gy?k<5-#oPJ=1n#uuoC2Fg$1%7o$Yw6wI;ypo*E<SYhA3IXN% zG(@2au2fKBRH3*aH8VLQwJ49l6;w{8W|Sxt=Y!IeLSjy_Liyn(MbMH7l662u5WKKX z&CE+r1qDuto&qFxz*(`N=<uF2sIJTmkbczK2E_reDhO2Nph}?d6iUEl6H@h4URsor zs*qZgmY<$e1o8to8N%HLD~=QyToOUGP>Dh=sMJa=Dh4&l!SxBav`Nh+z9LEmW%B$I z1>}k-7*v)gB^G6;W|lC(A_p8d2p5FrC8dH=A;@O91Hny0MQFHza<^+<NqJ^+c1~)M xLN=&+$}Rz?Dh5B04GQV0;Hs&F!7(o-wWvHbvm`SeR3VfUC8nq5F?c01000|6(Ch#J literal 0 HcmV?d00001 diff --git a/wp-content/plugins/autopost-to-mastodon/languages/autopost-to-mastodon-de_DE.po b/wp-content/plugins/autopost-to-mastodon/languages/autopost-to-mastodon-de_DE.po new file mode 100644 index 000000000..2dfa75aaa --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/languages/autopost-to-mastodon-de_DE.po @@ -0,0 +1,170 @@ +#German Translation +#for Mastdon Autopost Wordpress Plugin + +#: post_meta_box.php +msgid "Mastodon Autopost" +msgstr "Mastodon Autopost" + +msgid "Post to Mastodon" +msgstr "Auf Mastdodon tooten" + +#: settings_page.php +msgid "Server Settings" +msgstr "Server Einstellungen" + +msgid "Server URL" +msgstr "Server URL" + +msgid "Email" +msgstr "E-Mail" + +msgid "Password" +msgstr "Passwort" + +msgid "Plugin Behavior" +msgstr "Plugin Verhalten" + +msgid "Also toot on Post Update" +msgstr "Auch bei einem Post Update tooten" + +msgid "Please provide the account details for the server." +msgstr "Bitte gib die Accountdaten des Servers ein." + +msgid "Configure the Plugin Behavior" +msgstr "Konfiguriere das Plugin Verhalten" + +msgid "Mastodon Autopost Settings" +msgstr "Mastodon Autopost Einstellungen" + +msgid "Settings" +msgstr "Einstellungen" + +msgid "Test Settings" +msgstr "Einstellungen testen" + +msgid "Configure the Post" +msgstr "Post konfigurieren" + +msgid "Global Post Hashtags" +msgstr "Globale Post Hashtags" + +msgid "Save Settings" +msgstr "Einstellungen speichern" + +msgid "Do you like Mastodon Autopost?" +msgstr "Magst du Mastodon Autopost?" + +msgid "Yes" +msgstr "Ja" + +msgid "Please rate the plugin" +msgstr "Bitte bewerte das Plugin" + +msgid "For getting the word out, it's important to have good reviews" +msgstr "Um mehr Verbreitung zu finden sind gute Bewertungen ausschlaggebend" + +msgid "Rate on Wordpress.org" +msgstr "Bewerte auf Wordpress.org" + +msgid "Consider participating.(e.g. With translating it into another language)" +msgstr "Hilf mit das Plugin zu verbessern (z.B. in andere Sprachen übersetzen)" + +msgid "Mastodon Autopost is on Github" +msgstr "Mastodon Autopost ist auf Github zu finden" + +msgid "Want to thank in another way?" +msgstr "Anderweitig beitragen" + +msgid "Buy me a Mate" +msgstr "Gib mir ne Mate aus" + +msgid "No" +msgstr "Nein" + +msgid "Please give me feedback how your experience could be improved" +msgstr "Bitte gib mir Feedback wie das Plugin verbessert werden kann" + +msgid "Authentication" +msgstr "Authetifizierung" + +msgid "Login" +msgstr "Login" + +msgid "Toot Visibility" +msgstr "Toot Sichtbarkeit" + +msgid "Toot Format" +msgstr "Toot Format" + +msgid "Public" +msgstr "Öffentlicj" + +msgid "Unlisted" +msgstr "Nicht gelistet" + +msgid "Private" +msgstr "Privat" + +msgid "Title" +msgstr "Titel" + +msgid "Content" +msgstr "Inhalt" + +msgid "Link" +msgstr "Link" + +msgid "Hashtags" +msgstr "Hashtags" + +msgid "Enter Token" +msgstr "Token aktivieren" + +msgid" Enter the token from the popup. If the popup is not opening visit the following url" +msgstr "Geben sie den Token aus dem Popup ein. Falls sich das Popup nicht öffnet besuchen sie bitte folgende Webseite" + +#Toot Feedback + +msgid "Tooted to Mastodon!" +msgstr "Auf Mastodon gepostet!" + +msgid "Mastodon instance not found! Is the URL correct?" +msgstr "Mastodon Instanz nicht gefunden! Ist die URL korrekt?" + +msgid "Could not access mastodon profile! Are email and password correct?" +msgstr "Mastodon Profil konnte nicht geöffnet werden! Sind Passwort und Email korrekt?" + +msgid "Uncaught mastodon error! Please contact the developer." +msgstr "Unbekannter Mastodon Error! Bitte den Entwickler kontaktieren" + +msgid "Test Toot successfully tooted to Mastodon!" +msgstr "Test Toot wurde erfoglreich auf Mastodon gepostet!" + +msgid "Open toot" +msgstr "Toot öffnen" + +#general notice +msgid "Seems like you are not logged into Mastodon Autopost! Please check the your login!" +msgstr "Es sieht so aus als wären sie nicht bei Mastodon eingeloggt. Bitte überprüfen sie ihren login!" + +#Test Toot + +msgid "This is my first toot with the Autopost to Mastodon Wordpress Plugin" +msgstr "Das ist mein erster Toot mit dem Autopost to Mastodon Wordpress Plugin" + +msgid "By clicking the \"Test Settings\" Button the following toot will be tooted to your mastodon profile:" +msgstr "Beim Klick auf \"Einstellungen Testen\" wird der folgende Test Toot auf dein Mastodon Profil gepostet:" + +#javascript localization + +msgid "Enter the token from the popup" +msgstr "Geben sie den Code aus dem Popup ein." + +msgid "Please login again and copy the shown code into the popup" +msgstr "Bitte loggen sie sich erneut ein und kopieren sie den Code." + +msgid "Please include the following data in your email:" +msgstr "Bitte fügen Sie die folgende Daten in Ihre Email ein:" + +msgid "Error Data:" +msgstr "Error Daten:" diff --git a/wp-content/plugins/autopost-to-mastodon/languages/autopost-to-mastodon-fr_FR.mo b/wp-content/plugins/autopost-to-mastodon/languages/autopost-to-mastodon-fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..a1ebd3b27b5b33bacc3fb709ce29fd93dbd002cc GIT binary patch literal 3606 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/autopost-to-mastodon/languages/autopost-to-mastodon-fr_FR.po b/wp-content/plugins/autopost-to-mastodon/languages/autopost-to-mastodon-fr_FR.po new file mode 100644 index 000000000..d371be4ef --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/languages/autopost-to-mastodon-fr_FR.po @@ -0,0 +1,129 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.2\n" +"Last-Translator: agentcobra <agentcobra@free.fr>\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: fr_FR\n" + +# French Translation +# for Mastdon Autopost Wordpress Plugin + +#: post_meta_box.php +msgid "Mastodon Autopost" +msgstr "Mastodon Autopost" + +msgid "Post to Mastodon" +msgstr "Envoyé sur Mastodon" + +#: settings_page.php +msgid "Server Settings" +msgstr "Paramètres du serveur" + +msgid "Server URL" +msgstr "Adresse URL du serveur" + +msgid "Email" +msgstr "Courriel" + +msgid "Password" +msgstr "Mot de passe" + +msgid "Plugin Behavior" +msgstr "Comportement du plugin" + +msgid "Also toot on Post Update" +msgstr "Poueter aussi lors des mise à jour d'article" + +msgid "" +"Please provide the account details for the server. The server URL should " +"include http or https and a trailing slash. e.g. http://mastodon.social/" +msgstr "" +"Merci de fournir les informations de connexion du serveur. L'adresse " +"doit contenir http ou https et un slash. exemple : http://mastodon." +"social/" + +msgid "Configure the Plugin Behavior" +msgstr "Configurer le comportement du plugin" + +msgid "Mastodon Autopost Settings" +msgstr "Paramètres de Mastodon Autopost" + +msgid "Settings" +msgstr "Paramètres" + +msgid "Test Settings" +msgstr "Paramètres de test" + +msgid "Configure the Post" +msgstr "Configurer le poste" + +msgid "Global Post Hashtags" +msgstr "Globale Post Hashtags" + +msgid "Save Settings" +msgstr "Enregistrer les paramètres" + +msgid "Aimez-vous GNUsocial Autopost?" +msgstr "Magst du GNUsocial Autopost?" + +msgid "Yes" +msgstr "Oui" + +msgid "Please rate the plugin" +msgstr "Veuillez noter le plugin" + +msgid "For getting the word out, it's important to have good reviews" +msgstr "Pour faire passer le mot, il est important d'avoir de bonnes critiques." + +msgid "Rate on Wordpress.org" +msgstr "Tarif sur Wordpress.org" + +msgid "Consider participating.(e.g. With translating it into another language)" +msgstr "Envisagez de participer (p.ex. Avec la traduction dans une autre langue)" + +msgid "Mastodon Autopost is on Github" +msgstr "Mastodon Autopost est sur Github" + +msgid "Vous voulez remercier autrement?" +msgstr "Anderweitig beitragen" + +msgid "Buy me a Mate" +msgstr "Achète-moi un thé" + +msgid "No" +msgstr "No" + +msgid "Please give me feedback how your experience could be improved" +msgstr "Veuillez me faire part de vos commentaires sur la façon dont votre expérience pourrait être améliorée" + +#Toot Feedback + +msgid "Tooted to Mastodon!" +msgstr "Poueté sur Mastodon !" + +msgid "Mastodon instance not found! Is the URL correct?" +msgstr "Mastodon instance introuvable! L'URL est-elle correcte?" + +msgid "Could not access mastodon profile! Are email and password correct?" +msgstr "Impossible d'accéder au profil mastodonte! Le courriel et le mot de passe sont-ils corrects?" + +msgid "Uncaught mastodon error! Please contact the developer." +msgstr "Erreur de mastodonte non détectée! Veuillez contacter le développeur." + +msgid "Test Toot successfully tooted to Mastodon!" +msgstr "Testez Toot avec succès sur Mastodon!" + +#Test Toot + +msgid "This is my first toot with the Autopost to Mastodon Wordpress Plugin" +msgstr "C'est mon premier toot avec le plugin Autopost to Mastodon Wordpress Plugin" + +msgid "By clicking the \"Test Settings\" Button the following toot will be tooted to your mastodon profile:" +msgstr "En cliquant sur le bouton \"Paramètres de test\", le toot suivant sera ajouté à votre profil de mastodon:" \ No newline at end of file diff --git a/wp-content/plugins/autopost-to-mastodon/license.txt b/wp-content/plugins/autopost-to-mastodon/license.txt new file mode 100644 index 000000000..23cb79033 --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/license.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/> + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/wp-content/plugins/autopost-to-mastodon/mastodon_autopost.php b/wp-content/plugins/autopost-to-mastodon/mastodon_autopost.php new file mode 100644 index 000000000..7f5bcb999 --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/mastodon_autopost.php @@ -0,0 +1,50 @@ +<?php +/** +* Plugin Name: Mastodon Autopost +* Plugin URI: https://github.com/L1am0/mastodon_wordpress_autopost +* Description: A Wordpress Plugin that automatically posts your new articles to Mastodon +* Version: 2.1 +* Author: L1am0 +* Author URI: http://www.l1am0.eu +* License: GPL2 +* Text Domain: autopost-to-mastodon +* Domain Path: /languages +*/ + + +//Wordpress Security function + defined( 'ABSPATH' ) or die( 'No script kiddies please!' ); + +//Plugin internationalization hook + require("internationalization.php"); + +//Get the mastodon api + require_once("MastodonOAuthPHP/theCodingCompany/HttpRequest.php"); + require_once("MastodonOAuthPHP/theCodingCompany/oAuth.php"); + require_once("MastodonOAuthPHP/theCodingCompany/Mastodon.php"); + + global $mastodon_api; + $mastodon_api = new \theCodingCompany\Mastodon(); + +//Enque js + require("enque_scripts.php"); + +//Settings Page of Plugin + require("settings_page.php"); + +//Meta box for single page - so choose for autopost + require("post_meta_box.php"); + +//Published Post Notification with actually sending the post + require("publish_post_notification.php"); + + global $mastodon_post_handler; + $mastodon_post_handler = new mastodon_post_handler(); + +//Ajax response handler + require("ajax_handler.php"); + +//Show login error messages + require("generalNotices.php"); + + diff --git a/wp-content/plugins/autopost-to-mastodon/post_meta_box.php b/wp-content/plugins/autopost-to-mastodon/post_meta_box.php new file mode 100644 index 000000000..6d17747b3 --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/post_meta_box.php @@ -0,0 +1,69 @@ +<?php +// register the meta box +add_action( 'add_meta_boxes', 'mastodon_autopost_metabox' ); +function mastodon_autopost_metabox() { + add_meta_box( + 'mastodon_autopost_metabox', // this is HTML id of the box on edit screen + esc_attr__('Mastodon Autopost', 'autopost-to-mastodon'), // title of the box + 'mastodon_autopost_metabox_content', // function to be called to display the checkboxes, see the function below + 'post', // on which edit screen the box should appear + 'normal', // part of page where the box should appear + 'default' // priority of the box + ); + + add_meta_box( + 'mastodon_autopost_metabox', // this is HTML id of the box on edit screen + esc_attr__('Mastodon Autopost', 'autopost-to-mastodon'), // title of the box + 'mastodon_autopost_metabox_content', // function to be called to display the checkboxes, see the function below + 'page', // on which edit screen the box should appear + 'normal', // part of page where the box should appear + 'default' // priority of the box + ); +} + +// display the metabox +function mastodon_autopost_metabox_content() { + // nonce field for security check, you can have the same + wp_nonce_field( plugin_basename( __FILE__ ), 'mastodon_autopost_nonce' ); + + $checked = ''; + if(get_post_meta( get_the_ID(), 'autopost_this_post', true) == null || get_post_meta( get_the_ID(), 'autopost_this_post', true)){ + if(get_post_meta(get_the_ID(), 'mastodonAutopostPublishedNoRetoot', true)){ + update_post_meta( get_the_ID(), 'autopost_this_post', 0 ); + get_post_meta(get_the_ID(), 'mastodonAutopostPublishedNoRetoot', false); + }else{ + $checked = 'checked'; + } + } + echo '<label><input type="checkbox" name="autopost_this_post" id="autopost_this_post" value="1" '.$checked.'/>'. esc_attr__('Post to Mastodon', 'autopost-to-mastodon').'</label>'; +} + +// save data from checkboxes +function mastodon_autopost_metabox_field_data() { + + // check if this isn't an auto save + if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) + return; + + // security check + if (!isset($_POST['mastodon_autopost_nonce']) || !wp_verify_nonce( $_POST['mastodon_autopost_nonce'], plugin_basename( __FILE__ ) ) ) + return; + + // further checks if you like, + // for example particular user, role or maybe post type in case of custom post types + + // now store data in custom fields based on checkboxes selected + if (isset( $_POST['autopost_this_post'] ) && $_POST['autopost_this_post'] == 1) + update_post_meta( get_the_ID(), 'autopost_this_post', 1 ); + else + update_post_meta( get_the_ID(), 'autopost_this_post', 0 ); + +} + +//save data hooks - publish_post(9) to get executed before sending the toot + add_action( 'save_post', 'mastodon_autopost_metabox_field_data',9 ); + add_action( 'publish_post', 'mastodon_autopost_metabox_field_data',9 ); + add_action( 'publish_page', 'mastodon_autopost_metabox_field_data',9 ); + + +?> \ No newline at end of file diff --git a/wp-content/plugins/autopost-to-mastodon/publish_post_notification.php b/wp-content/plugins/autopost-to-mastodon/publish_post_notification.php new file mode 100644 index 000000000..7f47ca72f --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/publish_post_notification.php @@ -0,0 +1,134 @@ +<?php +//Wordpress Security function + defined( 'ABSPATH' ) or die( 'No script kiddies please!' ); + +class mastodon_post_handler{ + + //Setup the api_handöer + function __construct() { + // //Add wordpress hook + add_action( 'publish_post', array(&$this, 'mastodon_post_published_notification'), 10, 2 ); + add_action( 'publish_page', array(&$this, 'mastodon_post_published_notification'), 10, 2 ); + add_action( 'admin_notices', array(&$this, 'post_send') ); + + } + //Form the success message + function post_send() { + switch (get_post_meta( get_the_ID(), 'mastodonAutopostPostNotification', true )) { + /*case 404: + echo '<div class="notice notice-error is-dismissible"> + <p>'.esc_html__('Mastodon instance not found! Is the URL correct?', 'autopost-to-mastodon'). ' - <a href="' . get_bloginfo('wpurl') . '/wp-admin/admin.php?page=mastodon-settings-page">'.esc_attr__('Settings', 'autopost-to-mastodon').'</a></p> + </div>'; + update_post_meta( get_the_ID(), 'mastodonAutopostPostNotification', 0); + break; + case 401: + echo '<div class="notice notice-error is-dismissible"> + <p>'.esc_html__('Could not access Mastodon profile! Are email and password correct?', 'autopost-to-mastodon'). ' - <a href="' . get_bloginfo('wpurl') . '/wp-admin/admin.php?page=mastodon-settings-page">'.esc_attr__('Settings', 'autopost-to-mastodon').'</a></p> + </div>'; + update_post_meta( get_the_ID(), 'mastodonAutopostPostNotification', 0); + break;*/ + case 999: + + $mResponse = get_post_meta( get_the_ID(), 'mastodonAutopostMastdonResponse', true ); + $mData = '{"status":"-1", "action":"postStatus", "mastodonResponse": '.json_encode($mResponse).', "phpVersion": "'.phpversion().'", "wordpressVersion":"'.get_bloginfo('version').'", "wordpressLanguage":"'.get_bloginfo('language').'"}'; + + echo "<div class='notice notice-error is-dismissible'> + <p>".esc_html__("Uncaught Mastodon error! Please contact the developer.", "autopost-to-mastodon")." 'mastodonautopost@l1am0.eu'<br>".esc_html__("Please include the following data in your email:", "autopost-to-mastodon")."<br>".esc_html__("Error Data:", "autopost-to-mastodon")." <input value='".$mData."' onclick='this.select();'></p></div>"; + + /*. ' - <a href="' . get_bloginfo('wpurl') . '/wp-admin/admin.php?page=mastodon-settings-page">'.esc_attr__('Settings', 'autopost-to-mastodon').'</a></p> + </div>';*/ + update_post_meta( get_the_ID(), 'mastodonAutopostPostNotification', 0); + break; + case 200: + echo '<div class="notice notice-success is-dismissible"> + <p>'.esc_html__('Tooted to Mastodon!', 'autopost-to-mastodon'). ' <a href="'.get_post_meta( get_the_ID(), 'mastodonAutopostLastSuccessfullPostURL', true ).'" target="_blank">'.esc_html__('Open toot', 'autopost-to-mastodon'). '.</a></p> + </div>'; + update_post_meta( get_the_ID(), 'mastodonAutopostPostNotification', 0); + break; + } + } + + +// Set up a post published notification + function mastodon_post_published_notification( $ID, $post ) { + //Only publish on new post or if the setting for publishing updates is set + //if ((get_post_meta( $ID, 'autopost_this_post', true) == null || get_post_meta( $ID, 'autopost_this_post', true)) && ($post->post_date == $post->post_modified || get_option('mastodon_post_on_update') == "1")){ + if(get_post_meta( $ID, 'autopost_this_post', true) || (get_post_meta( $ID, 'autopost_this_post', true) == null && ($post->post_date == $post->post_modified || get_option('mastodon_post_on_update') == "1"))){ + //Get Global API Object + global $mastodon_api; + + //Post Data + $title = $post->post_title; + $hashtags = get_option('mastodon_post_hashtags'); + $permalink = get_permalink( $ID ); + $content = wp_trim_words($post->post_content); + $post_tags = get_the_tags($post->ID); + $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); + } + + + //Behavior + $visibility = get_option('mastodon_post_visibility'); + $postFormat = get_option('mastodon_post_format'); + + //mastodon login fu + $url = get_option('mastodon_url');; + $recoveredData = get_option('mastodon_creds'); + // unserializing to get actual array + $recoveredArray = (array) json_decode($recoveredData); + $mastodon_api->setMastodonDomain($url); // Set the mastodon domain, you can remove this line if you're using mastodon.social as it's the default + $mastodon_api->setCredentials($recoveredArray); + + + //Craft the Post + //Depending of the set post format in settings + switch ($postFormat) { + case 1: + //Title Link and Image + $titleLen = strlen($title); + $permaLinkLen = strlen($permalink); + $hashtagsLen = strlen($hashtags); + $posttagsLen = strlen($post_tags_content); + $contetMaxLen = 500 - 7 - $titleLen - $permaLinkLen - $posttagsLen - $hashtagsLen; + + $shortContent = substr($content,0,$contetMaxLen); + + $postContentLong = $title . "\n". $shortContent." ...\n". $permalink . "\n" . $post_tags_content . "\n" . $hashtags; + $postContent = substr($postContentLong,0,500); + break; + + default: + //Only title and link + $postContentLong = $title . "\n" . $permalink . "\n" . $post_tags_content . "\n" . $hashtags; + $postContent = substr($postContentLong,0,500); + break; + } + + //Actually send the post + $postResp = $mastodon_api->postStatus($postContent, $visibility); + + if(get_option('mastodon_post_on_update') == "1"){ + update_post_meta( $ID, 'mastodonAutopostPublishedNoRetoot', false); + }else{ + update_post_meta( $ID, 'mastodonAutopostPublishedNoRetoot', true); + } + + if(isset($postResp['id'])){ + update_post_meta( $ID, 'mastodonAutopostPostNotification', 200); + update_post_meta( $ID, 'mastodonAutopostLastSuccessfullPostURL', $postResp['url']); + }else{ + update_post_meta( $ID, 'mastodonAutopostPostNotification', 999); + update_post_meta( $ID, 'mastodonAutopostMastdonResponse', $postResp); + } + + } + } + + +} +?> diff --git a/wp-content/plugins/autopost-to-mastodon/readme.txt b/wp-content/plugins/autopost-to-mastodon/readme.txt new file mode 100644 index 000000000..43a5d4f16 --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/readme.txt @@ -0,0 +1,128 @@ +=== Mastodon Autopost === +Contributors: l1am0 +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.2 +Stable tag: 2.10 +License: GPLv2 +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! + +== Description == + +A Wordpress Plugin that automatically posts your new articles to Mastodon. The best: It is set and forget! + +With GNUsocial Autopost your post always get automatically posted to your Mastodon account. + +There are two formats available: +Post title + Post URL + Hashtags +Post title + Post Excerpt + Post URL + Hashtags + +Find the plugin settings: Settings > Mastodon Autpost Settings + +Just set your credentials and your post preference and lean back. The rest is done in the background and you don't have to care about it. + +For any questions, do not hesitate to contact me: +* Mail: mastodonautopost@l1am0.eu +* XMPP: l1am0@trashserver.net +* Mastodon: chaos.social/@l1am0 + +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/l1am0/donate) <3 + +== Frequently Asked Questions == + += Can I decide per post if I want to autopost it? = + +Yes. Since version 1.1 you see a settings box in every post. + += Does the plugin send you my login data? = + +The plugin never transmits any data to me, or anyone else than the mastodon node you set in the settings! + +== Screenshots == + +1. Mastodon Autopost settings page + +== Changelog == + += 2.1 = +* Also toot post hashtags (Thanks to [jops](https://mastodon.bida.im/@jops)) + += 2.0.9 = +* Added spanish translation + += 2.0.4 = +* Evaluates content HTML before tooting it +* Changed to official naming convention "Mastodon" +* Requires now minimum version 4.6 for translations via [the translation page](https://translate.wordpress.org/projects/wp-plugins/autopost-to-mastodon) + += 2.0.3 = +* Changed to wordpress HTTP library + += 2.0.2 = +* Add proper error messages + += 2.0.1 = +* Removed token prompt in favor of nativ div + += 2.0.0.2 = +* OAuth server communication bug + += 2.0.0.1 = +* Fixed ajax server data bug + += 2.0 = +* Changed backend libary +* Now working with oauth +* OTP and 2FA working +* Different post formats available +* Set post visibility +* Suggest mastodon server +* Works now also with pages +* Test settings working again +* The toot notification shows the url of the tooted post +* For syndication: The plugin attaches the posted url to the post meta data. The tag is "mastodonAutopostLastSuccessfullPostURL" + += 1.3 = +* Improved Feedback on post toot +* Test Settings button, to check server settings +* Global Hashtags that get added to every toot +* Minor UX improvements += 1.1.0.4 = +* Fixed settings page bug += 1.1.0.3 = +* Added information to settings page += 1.1.0.2 = +* Updated translation: Français += 1.1.0.1 = +* New translation: Français += 1.1 = +* Decide per post if you want to toot it to mastodon += 1.0.1 & 1.0.1.5 = +* Added easy method for internationalization (get_text) +* New translation: Deutsch += 1.0.1 & 1.0.1.1 = +* Show notfication if post gets tooted += 1.0 = +* Inital Plugin +* New Functions: post on update, post only on publishing + +== Credits == + += Mastodon PHP API = +This project is using the [MastodonOAauthPHP libary](https://github.com/TheCodingCompany/MastodonOAuthPHP) + += Graphics = +Thanks to +* [Ricardo Gomez Angel](https://unsplash.com/search/wall?photo=2WCT3mg5zlY) - Background Image (CC0) +* [Flaticon](http://www.flaticon.com/free-icon/send_309395)- icon used in the logo (Flaticon Basis License) +* [Wikipedia](https://commons.wikimedia.org/wiki/File:msatodon-logo.svg) - Mastodon logo used in the logo (CC0) +* Bastien Ho & agentcobra - French translation and internationalization help +* jorgesumle - Spanish translation + + += Idea = +Special thanks to [Chris Riding](http://www.chrisridings.com/gnu-social-wordpress-plugin/) for inspiring this plugin with his original gnusocial project (GPLv2) diff --git a/wp-content/plugins/autopost-to-mastodon/settings_page.php b/wp-content/plugins/autopost-to-mastodon/settings_page.php new file mode 100644 index 000000000..a7231a393 --- /dev/null +++ b/wp-content/plugins/autopost-to-mastodon/settings_page.php @@ -0,0 +1,357 @@ +<?php +//Wordpress Security function + defined( 'ABSPATH' ) or die( 'No script kiddies please!' ); + + +//Register the settings + function mastodon_settings_init() { + // register the settings values to wordpress + register_setting('mastodon', 'mastodon_instance_url'); + register_setting('mastodon', 'mastodon_post_visibility'); + register_setting('mastodon', 'mastodon_post_format'); + register_setting('mastodon', 'mastodon_post_on_update'); + register_setting('mastodon', 'mastodon_post_hashtags'); + + // register a new section in the "gnusocial-settings-page" page + add_settings_section( + 'mastodon_help_func', + '', + 'mastodon_help_func', + 'mastodon-settings-page' + ); + + // register a new section in the "mastodon-settings-page" page + add_settings_section( + 'mastodon_server_settings_server_section', + esc_attr__('Server Settings', 'autopost-to-mastodon'), + 'mastodon_server_settings_description_func', + 'mastodon-settings-page' + ); + + // register a new field SERVER URL + add_settings_field( + 'mastodon_server_url_field', + '1. '.esc_attr__('Authentication', 'autopost-to-mastodon'), + 'mastodon_server_url_func', + 'mastodon-settings-page', + 'mastodon_server_settings_server_section' + ); + + + // register a new field email + add_settings_field( + 'mastodon_email_field', + '2. '.esc_attr__('Test', 'autopost-to-mastodon'), + 'mastodon_user_auth_func', + 'mastodon-settings-page', + 'mastodon_server_settings_server_section' + ); + + + // register a new section in the "mastodon-settings-page" page + add_settings_section( + 'mastodon_post_section', + esc_attr__('Configure the Post', 'autopost-to-mastodon'), + 'mastodon_post_description_func', + 'mastodon-settings-page' + ); + + // register a new field SERVER URL + add_settings_field( + 'mastodon_post_hashtags', + esc_attr__('Global Post Hashtags', 'autopost-to-mastodon'), + 'mastodon_post_hashtags', + 'mastodon-settings-page', + 'mastodon_post_section' + ); + // register a new field SERVER URL + add_settings_field( + 'mastodon_post_visibility', + esc_attr__('Toot Visibility', 'autopost-to-mastodon'), + 'mastodon_post_visibility', + 'mastodon-settings-page', + 'mastodon_post_section' + ); + // register a new field SERVER URL + add_settings_field( + 'mastodon_post_format', + esc_attr__('Toot Format', 'autopost-to-mastodon'), + 'mastodon_post_format', + 'mastodon-settings-page', + 'mastodon_post_section' + ); + + // register a new section in the "mastodon-settings-page" page + add_settings_section( + 'mastodon_behavior_section', + esc_attr__('Configure the Plugin Behavior', 'autopost-to-mastodon'), + 'mastodon_behavior_description_func', + 'mastodon-settings-page' + ); + + // register a new field SERVER URL + add_settings_field( + 'mastodon_post_on_update_field', + esc_attr__('Also toot on Post Update', 'autopost-to-mastodon'), + 'mastodon_post_on_update_func', + 'mastodon-settings-page', + 'mastodon_behavior_section' + ); + } + +/** + * Donate + */ + + function mastodon_help_func() + { + ?> + <div style="border:2px dashed #000; padding: 1%;"> + <h2><?php esc_html_e('Do you like Mastodon Autopost?','autopost-to-mastodon');?></h2> + + <h4><?php esc_html_e('Yes','autopost-to-mastodon');?>!</h4> + * <b><?php esc_html_e('Please rate the plugin','autopost-to-mastodon');?>!</b> <?php esc_html_e("For getting the word out, it's important to have good reviews",'autopost-to-mastodon');?>: <a href="https://wordpress.org/plugins/autopost-to-mastodon/" target="_blank"><?php esc_html_e('Rate on Wordpress.org','autopost-to-mastodon');?></a><br> + * <?php esc_html_e('Consider participating (e.g. translating it into another language)','autopost-to-mastodon');?>: <a href="https://github.com/L1am0/mastodon_wordpress_autopost" target="_blank"><?php esc_html_e('Mastodon Autopost is on GitHub','autopost-to-mastodon');?></a><br> + * <?php esc_html_e('Want to thank in another way?','autopost-to-mastodon');?>: <a href="http://l1am0.eu/donate.php?p=map" target="_blank"><?php esc_html_e('Buy me a Mate','autopost-to-mastodon');?></a><br><a href="https://liberapay.com/l1am0/donate" target="_blank"><img alt="Donate using Liberapay" src="<?=WP_PLUGIN_URL;?>/autopost-to-mastodon/img/donate.svg"></a> + <h4><?php esc_html_e('No','autopost-to-mastodon');?></h4> + * <?php esc_html_e('Please give me feedback how your experience could be improved','autopost-to-mastodon');?>: <a href="mailto:mastodonautopost@l1am0.eu">mastodonautopost@l1am0.eu</a> + </div> + <?php + } + + + +/** + * Server Settings + */ + +// Section Title + function mastodon_server_settings_description_func() + { + esc_html_e('Please provide the account details for the server.', 'autopost-to-mastodon'); + } + +// Server URL + function mastodon_server_url_func() + { + //Autocomplete instances + $mInstancesArray = ["mastodon.xyz","awoo.space","social.tchncs.de","animalliberation.social","socially.constructed.space","icosahedron.website","hostux.social","social.diskseven.com","social.gestaltzerfall.net","social.imirhil.fr","sdfn-01.ninjawedding.org","aleph.land","masto.themimitoof.fr","social.ballpointcarrot.net","manowar.social","share.elouworld.org","7nw.eu","maly.io","mastodon.gougere.fr","social.alex73630.xyz","social.lkw.tf","social.wxcafe.net","oc.todon.fr","hex.bz","social.apreslanu.it","social.tcit.fr","fern.surgeplay.com","octodon.social","witches.town","pouet.yolops.net","social.nasqueron.org","mastodon.hasameli.com","mastodon.lertsenem.com","mastodon.club","anticapitalist.party","social.atypique.net","rafting.io","social.snargol.com","mastodon.cloud","masto.raildecake.fr","pouet.it","rich.gop","adney.land","mstdn.io","botsin.space","m.sl-network.fr","mastodon.top","toot.cafe","mastodon.partipirate.org","status.dissidence.ovh","social.nervestaple.com","mastodon.tetaneutral.net","social.jdiez.me","social.glados.ch","schuppentier.org","mastodon.rocks","mastodon.technology","mastodon.cc","social.targaryen.house","hitb-masto.herokuapp.com","securitymastod.one","cybre.space","toot.cat","mastodon.opportunis.me","from.komic.eu","techn.ical.ist","unixcorn.xyz","cmpwn.com","niu.moe","bibeogaem.zone","mastodon.roflcopter.fr","mastodon.peshane.net","mastodon.elao.com","im-in.space","social.taker.fr","dancingbanana.party","mstdn.fr","oreka.online","toot-lab.reclaim.technology","occitanie.social","masto.io","tootplanet.space","mastodon.at","slime.global","igouv.fr","mastodon.land","mastodon.dremtech.fr","boitam.eu","ecurie.social","social.troll.academy","mastodon.blue","social.d0p1.eu","social.lasanha.org","meow.social","tiny.tilde.website","tusk.social","tali.t0k.org","mastodon.kujiu.org","social.homunyan.com","social.numerama.com","mastodon.tedomum.net","mastodon.rainbownerds.de","social.etc-services.de","mastodon.patallan.com.au","mamot.fr","mastodon.zaclys.com","mastodon.open.legal","social.imchip.be","mastodon.kawaiyume.net","mastodonfrance.com","mastodon.me.uk","fierce-reef-65367.herokuapp.com","antisocial.narinimous.fr","masto.quad.moe","manx.social","social.infranix.eu","mastadon.tescher.me","mastodon.mpy.ovh","cmu.party","infosec.exchange","mastodon.cgx.me","social.adlerweb.info","fo0bar.org","masto.dog","mastodon.indie.host","mastodon.host","ca-os.com","darksocial.party","bookwitty.social","mastodon.chaosfield.at","toot.gibberfish.org","myriad.social","webcommunity.club","freeradical.zone","tinnies.club","social.depertat.net","kosmos.social","tooting.intensifi.es","mastoton.fi","mastodon.fun","mastodon.hackerlab.fr","social.weho.st","metal.odon.space","anti.energy","mastodon.pe","tescher.me","mamout.xyz","shelter.moe","social.nah.re","oulipo.social","queer.party","a.weirder.earth","brrrt.eu","mastodon.codingfield.com","mastodon.qowala.org","ika.moe","masto.pt","vulpine.club","mst3k.interlinked.me","toot.berlin","mastodon.migennes.net","social.mastodon.com.au","mastodon.not-enough.space","oldbytes.space","social.svallee.fr","freehold.earth","toot.aquilenet.fr","masto.svnet.fr","mastodon.zombocloud.com","mastodon.weaponvsac.space","scifi.fyi","capitalism.party","myfreckle.com","mastodon.sandwich.net","mastodon.thegraveyard.org","nodotsam.xyz","status.pointless.one","eunivers.social","soc.ialis.me","loutre.info","pouet.meutel.net","mastodon.cemea.org","diaspodon.fr","masto.fdlibre.eu","functional.cafe","mastodon.pirateparty.be","mastodon.hk","ostatus.renken.is","bapp.me","party.personal.pizza","bne.social","social.noostache.fr","m.g3l.org","social.devloprog.org","pouets.ovh","miaou.drycat.fr","mastodon.org.uk","tooot.im","geeks.one","social.nassi.me","apoil.org","mastodon.ar.al","noagendasocial.com","cafe.des-blogueurs.org","social.csswg.org","atomicfridge.net","mastodon.cusae.com","glitch.social","mastodon.co.nz","mastodon.jamesmwright.com","simstim.club","masto.ninja","mastodon.transneptune.net","framapiaf.org","mastodon.lu","spanner.works","mstdn.nl","resistodon.com","bloodandthunderleviathan.herokuapp.com","mastodon.acc.umu.se","mastodon.triofan.com","sys.kawi.fr","trunk.mad-scientist.club","nsfw.finance","teamtk.eu","mastodon.yoyo.org","mstdn.maud.io","wogan.im","mastodon.scuttle.org","betterletter.io","pdx.social","friloux.me","un.lobi.to","h.kher.nl","yso.pet","social.sitedethib.com","mammouth.cafe","pachyder.me","mastodon.eliotberriot.com","social.devio.us","mastodon.hugopoi.net","s.maximeborg.es","toot.tzim.net","mastodon.le-palantir.com","mastodon.unfollow.today","x0r.be","mastodon.yokohama","mastodon.lachman.tk","mastodon.9net.org","m.gandi.social","chabant.social","mammut.space","scotland.computer","snabeltann.no","chitter.xyz","cn.tootist.net","mstdn.jp","mastodon.papey.fr","mastodon.technosorcery.net","toot.lmorchard.com","social.rbs.io","mastodon.nzoss.nz","social.logilab.org","mastodon.scot","mastodon.juggler.jp","pouet.panglossoft.fr","mastodon.groningendigitalcity.com","bonn.social","toot.love","sns.gdgd.jp.net","toot.memtech.website","computerfairi.es","kirakiratter.com","nrd.li","mastodon.un-zero-un.net","mstdn.club","m6n.jp","wellness.so","mstdn.social","kyoto-citygrid.org","mastodon.jtwp470.net","toot.yukimochi.jp","mastodon.sakaki333.com","g0v.social","myles.life","chaos.social","corrigan.moe","mstdn.poyo.me","mastodon.u4u.org","mastodonti.co","mastodon.zeguigui.com","tablegame.mstdn.cloud","lovelive-anime.tk","mstdn.barippi.com","oransns.com","dolphin.town","mstdn.blue","socialgame.mstdn.cloud","hojiro.herokuapp.com","mastodon.eastback.co.jp","m6n.onsen.tech","m.sighash.info","comm.cx","delusion.ariela.jp","pawoo.net","mstdn.cc","pao.moe","mstdn-workers.com","mastodon.2502.net","mstdn.kemono-friends.info","reseau.education","mstdn.neigepluie.net","mstdn.otofu.xyz","www.mstddntfdn.online","interfesse.net","mstdn.cf","ekimemo.info","mstdn.taiha.net","yoshis.woolly.world","social.katarpilar.com","mastodon.motcha.tech","otoya.space","inari.opencocon.org","md.ggtea.org","m4570.xyz","cksv.jp","frootmig.net","mastodon.minicube.net","tenforward.social","pleasehug.me","wsup.social","don.tacostea.net","mstdn.syui.cf","niwatoriman.me","mastodon.art","mstdn.mobilehackerz.jp","mustardon.tokyo","mstdn.omaera.org","mastodon.maromaro.co.jp","mstdn.onosendai.jp","faux.io","mastodon.sylphid.jp","gbtdn.tokyo","kero.ccsakura.jp","mast.moe","social.java.nrw","social.myconan.net","such.social","mstdn.misosi.ru","mastd.me","mstdn.firstforest.jp","mstdn.anontown.com","mastodon-omoshiro.com","mstdn.neriko.net","mastodon.huma-num.fr","imastodon.net","m.u7fa9.org","mast.tokyo","mastodon.zenfolie.org","mastodon.dereferenced.org","now.kibousoft.co.jp","mstdn.yuyat.jp","ephemeral.glitch.social","toot.kashishokunin.com","mstdn.hokkaido.jp","mstdn.uec.tokyo","7144.party","don.wakamesoba98.net","minidon.bacardi55.org","mstdn.nametaketakewo.net","gamecreate.mstdn.cloud","m.rweekly.org","mastodon.chotto.moe","mstdn.techdrive.top","mastodon.toycode.com","mastodon.centiworks.com","mastodon.titoux.info","mastodon.lithium03.info","vmrpc.net","mst.ongstar.jp","mdn.hinaloe.net","mstdn.gaijinsize.com","mastodon.hekki.info","yontengop.com","mstdn.nakayuki.net","mastodon.hakoai.com","toot.oekaki.st","bitcoinadon.social","dq10.online","social.nofftopia.com","m.v.nu","mstdn.noritsuna.jp","kerokero.rororo.xyz","mastodon.zunda.ninja","z-socialgame.mstdn.cloud","4com.jp","vocalodon.net","gensokyo.cloud","ika.queloud.net","don.chakuriki.net","mastdn.lovesaemi.daemon.asia","i.write.codethat.sucks","spooky.pizza","ecodigital.social","jp-mstdn.com","mastodon.iot.tokyo","mstdn.soysoftware.net","chitose.moe","kinky.business","mstdn.nemsia.org","xn--zck4ad5f2e.jp","mellified.men","toot.redmine.jp","mastodon.yuritopia.net","castodon.jp","mstdn.cafe","ostatus.isidai.com","waraiotoko.net","mstdn.masuei.net","mstdn.sanin.club","mstdn-jp.site","social.qunagi.net","mstdn.9uelle.jp","mastodon.burnworks.com","vkdn.jp","mstdn.osaka","kemonodon.club","mastodoom.social","toot.pm","m.loovto.net","social.irrwitz.com","mstdn.ht164.jp","insoumis.social","wandering.shop","don.mfz.jp","pritter.tk","ifrit.gaia.ff14-mstdn.xyz","tokyo.mastodon-servers.net","horiedon.com","mstdn.yjsnpi.nu","vastodon.com","mstdn.nanamachi.net","takahashi.social","mastodon.undernet.uy","mstdn.tinko.club","otajodon.com","mstdn-d.info","mstdn.madpainter.info","manhole.club","sn.angry.im","mastodont.cat","otogamer.me","moe.neon.moe","japaon.cf","mstdn.syoriken.org","gigamastodon.com","domdom.tokyo","yudetarou.club","aidon.club","m.massy.city","pouet.couchet.org","mstdn.mechkey.jp","catdon.life","mstdn.ernix.jp","mstdn.awa.sfc.keio.ac.jp","unnerv.jp","is.a.qute.dog","mastodon.29lab.jp","mstdn.serv-ops.com","mstdn.ropo.jp","mastodon.robotstart.info","mastodon.p2pquake.net","gunmastodon.com","twingyeo.kr","mastodon.crazynewworld.net","mastodon-srv.gq","eletusk.club","mstdn.nere9.help","mastodon.etalab.gouv.fr","yukari.cloud","mastodon.machique.st","ery.kr","don.techfeed.io","avidol.jp","oriwebdon.com","friends.nico","mastodon.gifclip.info","mdn.crows.tokyo","social.spiwit.net","djanzu.tokyo","toot.tibidoo.com","mstdn.fm","mstdn.togawa.cs.waseda.ac.jp","mastodon.to","tusk.schoollibraries.net","fgochiho.vip","m.okadajp.org","mstdn.awm.jp","mstdn.guru","mastd.racing","mastodon.ka0.co","mastodon.m0t0k1ch1.com","elephant.bike","mstdn.okumin.com","gadget.inpocket.net","ro-mastodon.puyo.jp","mstdn.golf","omanko.porn","tuner.1242.com","funfunmstdn.tokyo","mastodon.poker","mstdn.creatorsnight.com","don.msng.info","social.celabs.com","3.nu","mstdn.kaonikki.tokyo","mastodon.mnetwork.co.kr","iamastodon.gifu.jp","vapers.jp","mastodon.ingress-enl.jp","social.dropbear.xyz","mstdn.glorificatio.org","noupti.me","mastodon.niu.ne.jp","social.oupsman.fr","aqua-graphic.blue","mastodol.jp","mastodon.crazypanda.fr","mstdn-football.jp","mstdn-kanazawa.jp","mstdn.voyage","ranobe.net","mimumedon.com","mastodon.nara.jp","mikumikudance.cloud","mastodons.jp","md.yutasan.co","mastdon.amazedkoumei.com","mist.so","madomadon.net","mstdn.klg-tree.jp","mastodon.sngsk.info","photodn.net","haruhi-mstdn.club","pouet.chouech.org","dtp-mstdn.jp","md.jigensha.info","mangadon.net","mathtodon.com","pouet.dachary.org","mastodoll.net","mastodon.cosmicanimal.jp","society.oftrolls.com","mi.pede.rs","fanfare.horse","mastodon.expert","bookn.me","mastodon.crossfamilyweb.com","taruntarun.net","im.notreal.pw","happy-social-life.fudanchii.net","mstdn.hyogo.jp","social.alifein.tech","siege.rhino.cards","mstdn.mx","tetsugaku.place","mstdn.niigata.jp","technologeek.me","mn.kitetu.com","linuxrocks.online","mevo.xyz","august-don.site","mstdn.fy.to","mastodon.oita.jp","t.d65.xyz","ofuton.io","don.ekesete.net","social.kimamass.com","mastodon.lavergne.online","mrt.al","anime.mstdn.cloud","mstdn.fukuoka.jp","ffxiv-mastodon.com","ekuro.jp","mastodon.muage.org","mastodon.snowandtweet.jp","sldon.jp","engineered.space","hamtter.net","elict.net","jojomonvr.com","babuu.club","mi5.jp","mstdn.studio","mastodon.mfjt.jp","mastodon.linuxquimper.org","himastdon.club","open2.ch","cigarcabin.com","biwakodon.com","masatodon.click","kirby-fans.com","kabutodon.com","mastodon.sdf.org","jstd.me","saigodon.jp","sunshinegardens.org","mastodon.lemarchand.io","tutut.delire.party","charafre.noela.moe","syachiku.net","m.uncate.org","mammut.zasha.style","nishinomiya.in.net","summoners-riftodon.jp","mstdn-ac.ryukyu","mathtod.online","wizfox.jp","mental.social","chofudon.tokyo","yomidon.okinawa","shadowverse-mstdn.jp","eizodon.jp","teo.taiha.net","social.hyuki.net","social.matsuuratomoya.com","mastodon.850mb.net","mstdn.toaruhetare.net","fx-don.net","jeunesse.media","don.rabbit-house.me","babymetal.party","veah.cocoa.moe","mstdn.goziline.com","keiba.social","mstdn.gots9713.xyz","baraag.net","tusk.what.re","mofu.kemo.no","chibi.kemo.no","ediot.social","xn--wmq.jp","wowsdon.xyz","mstdn.superspeed-fall.com","www.nekotodon.com","eigadon.net","mstdn.i-red.info","niigata.minnna.xyz","recode.macro.tokyo","mastodon.training","mastodon.sail42.fr","clacks.link","s.ovalerio.net","under-bank.blue","mstdn.dasoran.net","kirapower.ichigo-hoshimiya.com","tekkadon.manimani.cc","mastodon.uy","mastodon.fyi","mstdn.it-infra.jp","mstdn.yantene.net","mstdn.debate.info-labs.jp","mstdn.monster-girl.homelinux.net","mstdn.hanabi-life.net","pso2.club","precure.ml","mstdn.idolhack.com","yakyudon.net","mastodon.bitbank.cc","mstdn-vn.com","shigadon.com","mstdn.nagasaki.jp","don.akashi.cloud","mastodon.oss.nagoya","matchdon.com","konkat.jp","leaf.style","mastodon.noraworld.jp","animefun.jp","39sounds.net","urawareds.org","friends.tennis","sakaba.space","mastodon.osaka","www.mofgao.space","mstdn.lalafell.org","pachi.house","kmmtn.com","forexdon.org","mastodon.nl","go-newbie.club","home.aqraf.tokyo","jitakudon.com","flower.afn.social","kakudon.com","mstdn.ipz.jp","lgbt.io","masatodon.jp","mastodon.aquarla.net","mstdn.trashkids.org","noisebridge.social","mstdn.kwmr.me","mastodonchile.club","social.coop","dhtls.net","social.paco.to","mstdn-minpaku.jp","dartsdon.jp","umastodon.jp","emojidon.global","social.konosuke.jp","mastodon.macsnet.cz","scholar.social","tvdon.rt-trend.jp","mstdn-bike.net","kurage.cc","ostatus.yajamon.xyz","fudanshi.org","shkval.net","mastodon.mit.edu","mathstodon.xyz","social.vincentux.fr","mastodon.on-o.com","ostatus.shade3d.jp","donsuke.biz","mammout.bzh","mikado-city.jp","catdon.jp","tsuruga.net","dramadon.net","o.kagucho.net","everydon.com","livers.jp","mediartodon.net","mastodon.medieval.jp","ostatus.taiyolab.com","status.bcarlin.net","social.tinysubversions.com","utodon.jp","toot.forumanalogue.fr","toot.matereal.eu","mstdn.lyker.jp","mayodon.club","xmstdn.com","carma.red","nomlishdon.racing-lagoon.info","mastodon.izzz.fr","risingsun.red","mastodon.gargantia.fr","fr.osm.social","social.touha.me","mastodon.social","trickle.ink","mstdn2017.club","kitty.town","urvogel.club","mstdngirls.net","pouet.apdu.fr","mastodon.swordlogic.com","nagayodon.com","mastodon-lyontech.fr","mstdn.okinawa.jp","naos.crypto.church","mastodon.3bk.jp","mel.social","mastodos.com","cosp.la","warubure.online","masatodon.com","mstdn.ytgrsua4.net","ashikaga.link","training-fitness.fun","lilydon.com","todon.nl","ngndn.jp","mastodon.randulo.com","mr.am","mastodon.fu-jp.net","introvert.party","mstdn.hisurga.com","mastodon.matrix.org","elekk.xyz","toot.psyco.fr","lomo.mstdn.tokyo","xn--zckuao5dze.jp","podcast.style","forum.manga.tokyo","hydroxyquinol.net","hige.alterna-cloud.com","killmi.st","mastodon.shuuten.org","voe.social","mastodon.teamblackberry.jp","mstdn.sanin.link","mastodon.plein.org","mastodon.fishing","mstdn-babymetal.com","mstdn-uragi.jp","kancolle-yokosuka.xyz","spod.ca","mstdn.tako774.net","mstdn.b-shock.org","mstdn.a-tak.com","hfukuchi.masto.host","mstdn.zuyadon.tk","mastodon.iut-larochelle.fr","mstdn.chordwiki.org","mastodon.internot.no","kurakake.net","gundam.masto.host","nice.toote.rs","cuttlefi.sh","cookdon.com","ue4-mstdn.tokyo","mastodon.partecipa.digital","mstdn.onl","toot.blue","shimaidon.net","mastodon.aventer.biz","don.h3z.jp","gamelinks007.net","mstdn.felice.biz","mstdn.felice.biz.","ostatus.blessedgeeks.org","jpnews.site","social.ponyfrance.net","sandbox.skoji.jp","saitama-stdn.com","equestria.social","mastodon.neilcastelino.com","www.ksu-mastodon.com","social.over-world.org","labotadon.net","mastodon.kebree.fr","selfy.army","unityjp-mastodon.tokyo","scalie.club","kaisendon.asmodeus.red","mastodon.nestegg.net","mstdn.wildtree.jp","natudon-outdoor.net","toot.ordinarius-fectum.net","foodon.jp","basstdn.jp","ieji.de","writing.exchange","sanam.xyz","subculdon.com","monstodon.info","pochi46.com","clodostr.at","mstdn.yoshimov.com","mastodon.infra.de","john-mastodon.scalingo.io","mastodon.latransition.org","mstdn.tokyocameraclub.com","insolente.im","janogdon.net","musicdn.jp","redwombat.social","rugdon.fun","banthamilk.blue","mstdn.okayama.jp","solo-outdon.club","ostatus.blessedgeeks.jp","s.brined.fish","mstdoujin.net","emacs.li","compass-community.f5.si","uldhaar.dk","mastodon.potager.org","social.noff.co","765ml.com","botdon.net","mastodon.lignux.com","gingadon.com","danshudon.jp","mstdn.kyoto","mastodon.home.js4.in","lfsr.net","nicra.fr","glamdon.com","moeism.me","mastodon.dissem.ch","chiawase.tokyo","social.alabasta.net","mastodon.wakayama.jp","mastodon.acc.sunet.se","natudon-fishing.net","don.matchy.jp","mstdn18.jp","tgp.jp","mediadon.jp","doll.social","mostodon.info","mstdn.taiyaki.online","queer.town","mastedm.club","miestodon.com","social.pueseso.club","md.paoon.social","moseisley.club","east.mstdn.tokyo","mastodon.diglateam3.com","hckr.no","ukrainian.social","mastodon.scoffoni.net","durel.org","social.bluecore.net","aigisdon.net","moe.cat","mstdn.kanagu.info","sldon.com","mstdn.fujii-yuji.net","mastodon.moshsh-mate.com","party.ochakai.moe","social.arbleizez.bzh","nandon.cc","social.lafermenumerique.com","mstdn.kwmr.info","m.moriya.faith","m.pira.jp","cocoronavi.net","mastodon.e217.net","mstdnsrv.moe.hm","mstdn.bizocean.co.jp","mastodon.redbrick.dcu.ie","nfg.zone","the.wired.sehol.se","sakoku.jp","mastodon.jpages.eu","coales.co","kemono-friends.masto.host","social.conglomer.net","matitodon.com","acg.mn","thinkers.ac","mastodon.ftfl.ca","gonsphere.tk","qiitadon.com","tvdon.tv","lou.lt","mstdn.aquaplus.jp","obitsudon.midyuki.net","mastodon.beerfactory.org","tegedon.net","aruk.as","mast.eu.org","mstdn.ibaraki.jp","plasticmodels.tokyo","mastodon.gza.jp","yamastodon.jp","kabudon.jp","m6n.kigurumi.fun","imaginair.es","quizdon.com","575don.club","mast.kaikretschmann.de","nagoyadon.jp","googoldon.net","mstdn.imoimo.xyz","chibadon.jp","social.pretzlaff.co","mstdn.mini4wd-engineer.com","gamba.osaka.jp","christodon.com","gamejam.site","angel.innolan.net","m.geraffel.net","mastodonargentina.club","mstd.tokyo","chorus.space","mastodon.mrtino.eu","social.backtick.town","mastodon.dotopia.dk","mstdn.mochiwasa.xyz","techdon.info","mastodon.kitamurakz.com","rikadon.club","social.48bin.net","social.strog.org","mastodon.matcha-soft.com","mastodon.osyakasyama.me","mdx.ggtea.org","t.con.sh","nobody.social","w3c.social","kurosawa-ruby.xyz","blackice.online","toot.plus.yt","theferret.social","learn-english.site","deep-learning.site","mammouth.inframed.net","mastodon.evolix.org","bcn-users.degica.com","real-escape.jp","elephant.bluecore.net","hodl.city","malfunctioning.technology","music.pawoo.net","ipv6.social.konosuke.jp","gonext.gg","mastodonte.me","orlando.community","yukarin.club","persadon.com","mastodon.starrevolution.org","claristdon.net","gdrsocial.it","m.socialjustice.engineering","mstdn.asami.red","mastodon.horde.net.br","rubber.social","ziroh.be","raccoon.network","photog.social","nerds.party","social.chinwag.im","wasteland.pro","mstdn.dyndns.org","hokutodon.co","anitwitter.moe","gelt.cz","kashiwadon.net","julika.jp","animedon.tk","kaisendon.masto.host","social.chilliet.eu","borderline.mooo.info","sdmesh.social","fur.cloud","social.wiuwiu.de","metalhead.club","this.mouse.rocks","catgram.jp","kawasaki-city.social","mastodon.capitaines.fr","foresdon.jp","monsterpit.net","kirishimalab21.xyz","social.arnip.org","bookwor.ms","succ.faith","msdn.yourrhythm.jp","anarchism.space","iwatedon.net","kiminona.co","mastodon.com.pl","ika.julika.jp","cybr.es","mstdn.miyazaki.jp","edge.mstdn.jp","guimik.fr","wug.fun","mstdn.lalafell.org.","mstdn.phonolo.gy","haupt.bahnhof.cz","mastodonian.city","spladoon.yuzulia.com","toot.ordinarius-fectum.net.","iyher.club","touhey.org","esperanto.masto.host","social.mecanis.me","mstdn.cygnan.com","jubi.life","social.mochi.academy","mastodon.therianthro.pe","phirat.club","toot.si","instance.business","acid.wtf","idolish7.fun","ykzts.technology","lordinateur.tech","social.fractalco.re","pleroma.soykaf.com","manhater.io","epsilon.social","mangadon.info","nantes.social","reallygay.party","mastodon.kosebamse.com","fosstodon.org","togart.de","social.treyssatvincent.fr","cosi.town","mstdn.lesamarien.fr","cervidae.space","chirpi.de","kokokokko.com","social.sakamoto.gq","hearthtodon.com","asonix.dog","jesusinthe.club","handon.club","ichiji.social","cmx.im","pokemon.mastportal.info","mastodon.productionservers.net","intersect.hackershack.net","legfr.social","ilove.mochi.academy","masto.donte.com.br","t.b612.me","chiji.space","overthinking.club","social.talk.coffee","nulled.red","tootcn.com","esp.community","puter.games","mast.tayori.org","mstdn.ryanak.xyz","mstdn.thenetherlands.jp","swift.language.jp","knzk.me","birdsite.link","md.cryo.jp","social.ntic.fr","qdon.space","playvicious.social","moose.land","drg.im","voluntary.world","creative.rabbinicorn.com","ipno.us","mstdn.se","syui.ml","tomitodon.huideyeren.info","mattips.online","mastodon.floripa.br","assortedflotsam.com","toot.cerebralab.com","hitlers.win","mess.casa","soscet.network","bangdream.space","m.hxbus.net","ltch.fr","occult.camp","wkfg.me","mao.daizhige.org","trans.town","toot.chat","mastodon.yamaken.jp","sigint.sx","mastodon.kamunagara.org","mastodon.hong.io","uri.life","iscute.ovh","haxors.com","mastodon.mail.at","mastodon.baeck.at","mastodonserver.se","mstdn.ephemeral-arcadia.jp","social.sdr.haus","rumia.xyz","canislupus.im","toot.okaris.de","dragon.style","feralkin.com","muenster.im","www.chatalk.club","chikuwa.sweak.net","dutchxs.com","mstdn.zoddo.fr","m.paulbutler.org","mammut.buzz","mn.ms","rthelp.rta.vn","android-user.club","mastodon.rta.vn","mstdn.m4sk.in","nokotaro.com","social.netzkombinat.su","gldon.hostdon.jp","mastodon.funigtor.fr","m.devolio.net","scicomm.xyz","md.xps2.net","ali.delbertbeta.cc","robloxcommunity.social","chaosphere.hostdon.jp","gamers.social","bigdoinks.online","mastodon.gamedev.place","squid.cafe","stoneartprod.xyz","unique-inet.tokyo","tech.lgbt","pnw.social","planet.moe","hispagatos.space","hodl.social","cofe.social","social.lab.cultura.gov.br","wxw.moe","mastodon.lolisandstuff.moe","mastodon.sergal.org","libertarian.chat","not.phrack.fyi","sozial.derguhl.de","cutie.space","ancr.club","newtype.institute","0.unicomplex.co","mast.datamol.org","cuddleso.me","kirishima.cloud","mastodon.sk","kalebporter.club","empathytech.net","gouhuoapp.com","chablis.social","zerohack.xyz","m.bonzoesc.net","social.buffalomesh.net","mastodon.garbage-juice.com","wales2600.com","social.cofe.space","weebs.moe","social.koyu.space","mstdn-nct.com","mastodon.microdata.co.uk","toot.kif.rocks","campaign.openworlds.info","fivewords.uk","mastodon.schlenz.ruhr","mastodon.waffle.tech","mstdn.kigurumi.fun","ma.luna.fyi","mstdn.xn--q9jyb4c","furry.wtf","sckc.stream","social.tuto-craft.com","schlechter.host","social.chinwag.org","cb.ku.cx","high.cat","queer.cloud","ruhr.social","the.resize.club","social.tilde.team","hackers.social","toot.timecube.club","mstdn.xn--h1ahnbk7d.xn--p1ai","salty.vet","yuzulia.xyz","fla.red","mastodon.retrodigital.net","tootme.de","social.that.world","zenet.work","frell.co","m.moe.cat","mastodon.radiofreerobotron.net","masto.cryptoworld.is","bsd.network","gazette.live","republikrenyonez.sytes.net","mamut.social","eldritchworld.nom.es","mastdc.com","gamemaking.social","theboss.tech","mastodonten.de","m.hitorino.moe","el-ktm.com","mastodon.daiko.fr","mastodon.desord.re","bam.yt","toot.iwh12.jp","steamstdn.com","tobane.m.to","innocent.yukimochi.io","doronko.club","3dscapture.net","mastodon.immae.eu","retro.social","hikarin.m.to","p.kokolor.es","don.mamemo.online","social.eyesight.jp","mst.idsdt.com","john.town","pleroma.knzk.me","poils.pachyderme.net","fox.masto.host","fsdon.com","mstdn.monappy.jp","pcgame.jp","beer.m.to","v22017122292958322.goodsrv.de","mir.hostdon.jp","kamiyacho.net","darkest-timeline.com","dev.glitch.social","oxidized.systems","pom.masto.host","pouet.chapril.org","rainyman.jp","nightmare.zone","muwiter.m.to","dnfc.fun","mstdn.haru2036.com","atdotatdotat.at","oyakodon.m.to","paku.m.to","mstdn.mimikun.jp","mstdn.jp.net","mstdn.prfm.jp","pico8.social","social.denkbrettl.org","kttsakaba.net","mstdn.ntk.so","typing.sexy","howl.m.to","cxt.masto.host","mushroomkingdomdon.m.to","rungirls.run","thezombie.net","ostatus.yoh2.ddo.jp","social.elbmatsch.de","themepark.m.to","social.farend.co.jp","sc.sigmaris.info","mastodon-techdrive-staging.herokuapp.com","mstdn.albormentum.com","squope.net","mstdn.image-space.info","beyblader.top","md.regastream.com","huwa.m.to","azuchi.m.to","unkomaker.m.to","mastodon.prostreamers.net","anisodon.jp","mastodon.recurse.com","torus1111.m.to","thechurchofmemes.com","mastodon.binatang.nl","digilife.club","xn--kckk1cy297bor8a.jp","m.livetube.cc","resistance.hostdon.jp","hwdon.jp","mirohli.m.to","m.tatapa.org","tokotodon.m.to","mstdn.precure.fun","lab.oresys.nagoya","edge.taruntarun.net","taketodon.com","ple.ggtea.org","arm.m.to","m.rutan.info","mst.m544.net","omoch.m.to","puredon.matcha-soft.com","oidemasetodon.com","social.hideo54.com","don.m2hq.net","masto.tech","ehr.m.to","pom.m.to","sukadon.m.to","md.rhythmania.net","xxx.m.to","neumann.m.to","kiwaitsu.m.to","md.arg.vc","ore.m.to","napear.m.to","toot.lain.moe","josephburnett.social","toot.wiredpunch.com","asnas.m.to","typrout.ml","pleroma.kazuhiko.kitamura.name","mastodon.suncha.biz","pleroma.nakanod.net","morningcross.m.to","setl.ist","ohmidon.m.to","nonsta.m.to","iwami-mastodon.herokuapp.com","mag-mstdn.tki.jp","kiraako.work","nadesiko-users.info","pleroma.kitamurakz.com","mountainpeoples.m.to","ma.strangeworld.jp","estpls.m.to","shadowverdon.m.to","unidon.asmodeus.red","bangdream.m.to","local.iwamidon.tech","vawn.m.to","c2bdon.net","kent.m.to","scp.m.to","mastodon.gion.me","pleroma.playground.ws","mastodon.hakai-macaron.com","mastodon.sinkuu.xyz","mastodon-toyama.xyz","sabowl.m.to","mstdn.shizuoka.jp","kagerw.m.to","unity.m.to","mstdn.kemonox.jp","pantadoon.m.to","mastodon.lndvll.se","teatime.afternoonrobot.co.uk","mstdn.a-apple.net","md.net-p.org","mastodont.herokuapp.com","mastodon.lerelaisdupatriote.fr","snap.photo","paradise.engineering","hemohemo.m.to","mstdn.sk","lux.blue","soogle.m.to","yougaku20c.m.to","social.ash.bzh","hdhdhd.m.to","planner.social","yume.social","alpc-island.m.to","mstdn.yamachan.org","vegetadon.tokyo","mastodon.atikoro.net","pleroma.vocalodon.net","pompom.m.to","newtro.club","c-don.net","nerdica.net","mercury.social","h.ftqq.com","whiskycat.m.to","flashfic.stream","mstdn.bari-ikutsu.com","mdon.ee","weird.tf","playingwithworms.org.uk","mast.iankelling.org","mast.udon.moe","m.sirousa.me","cathuman.m.to","akashiensis.com","mastodon.babycastles.com","masto.fine.moe","japanweather.m.to","fnordica.de","mastodon.forza7.jp","m.themsp.org","raven.dog","ojitabi.club","bloodmountain.herokuapp.com","humuu.m.to","mcr.cool","clashroyalemastodon.com","mastodon.technick.org","rettiwtkcuf.social","social.korot.ru","mastodon.z27.ch","mstdn.mk39.xyz","newyorkdon.net","maron.blue","semi.m.to","friendica.me","comico.m.to","myc.m.to","fvhp-run.herokuapp.com","md.gloon.jp","mastodon.deafpros.com","negipan.m.to","cyber.cafe","gla.fit","cat.m.to","akiba-fan.com","znark.us","pouet.coazergues.info","quod.pl","nonsensoleum.net","igreally.social","mstdn.wood-built21.net","io.bennyp.org","knkr.m.to","social.gaos.org","mstdn.centossrv.com","okinawa-mstdn.okinawa","social.willistonschools.org","kernel32.de","arrowp5210.m.to","mstdn.naruh.com","mmodon.online","ascraeus.org","suku.m.to","mstdn.sh","mastodon.digitalkr.am","droogz.razvrat.org","msd.alohaloa.com","social.icewind.nl","mastodon.anti-globalism.org","mastodon.danbruno.net","motorsports.m.to","nanasi.m.to","sweettitties.scalingo.io","social.xmob.me","m.sysi.work","tooru.m.to","mastodon.nakanod.net","jonproulx.com","fukuoka.m.to","syui-ml.herokuapp.com","micro.koray.al","kimonosou.tokyo","mastodon.bertel-numerique.re","mastodon.newtown.chiba.jp","mstdn-kr.com","mastodon.spdns.org","comicsofcolor.club","miblog.life","758.fm","tantor.online","testodon.herokuapp.com","social.historyhorde.com","route66.social","co-mastdn.ga","mikuspot.net","raim0713.m.to","bona.space","nildon.com","toot.playground.ws","remicck.club","mstdn.ninja","mstdn.nahcnuj.work","mastodon-jp.org","mastodon.ebiryu.tech","millionimas.m.to","sisuclub.com","potaodon.audio","siidon.lab-kadokawa.com","ktstdn.m.to","pokedon.org","mstdn.yyuuiikk.org","awaodori.tokyo","yamagadon.com","beyblade.m.to","social.device5.co.uk","the-hash.m.to","mstdn.liliso.com","fam.vermeulen.id.au","talk.econudes.org","wabi.m.to","crusaders.m.to","fuzjkodon.m.to","otomachi.m.to","kkczjpn.m.to","nt50tec.m.to","magenta.click","owata.m.to","indyjp.club","mstdn-ent.com","api.m.to","yumejo.m.to","km-connect.org","metaller.m.to","mana9356.m.to","mofu.m.to","hyoga9f.m.to","zenyasai.g-fukurowl.club","00x.club","ysfh.m.to","mstdn-newprofession.jp","mstdn1.ssc-web.net","mstdn.sastudio.jp","hsgw.m.to","junkhub.org","mastodoooooon.herokuapp.com","walrein.m.to","syamuwatching.m.to","boyslove.jp","plrm.ht164.jp","oniko-branch.moe","v-hills.m.to","mogumogucombo.m.to","test.afn.social","atasinti.hostdon.jp","chicken.m.to","nutria.m.to","qtdon.m.to","mstdn.takanory.jp","home.m.to","stcpt.com","sw-mastodon.herokuapp.com","35o.poker","mastodon.chilos.jp","koya.m.to","mazzo.masto.host","mstdn.bitzeny.link","social.jp-mstdn.com","pan2.m.to","mobtodon.m.to","www.azuki-zenzai.net","gradiect.m.to","test.animedon.tk","miso.social","fehacking.xyz","sio.masto.host","uncensored.masto.host","balkan.fedive.rs","yutacar.info","servercan.xyz","odaidon.m.to","mst.k7mc.xyz","tokyoidolfestival.m.to","helloproject.m.to","igreally.masto.host","kancolle.social","mstdn.alnair.blue","nikatsudon.m.to","motodn.jp","turezure.m.to","basil.asria.jp","md.tret.jp","tera.m.to","kuncheff.social","tty.pw","xn--n8jycee5a4lmeyevltfzc2sja1jw105ewz3i.club","mstdn.s7t.de","taconiji.m.to","tibibibimbap.m.to","m.anyhu.gs","mastochizuru.xyz","nejiamasi.com","mastoidoljp.m.to","chat.cdstm.ch","social.ioserv.space","cornix.hostdon.jp","pangeon.jp","mstdn.ikasekai.com","friendica.sonatagreen.com","pachyderm.herokuapp.com","hqpf.site","guu.so","karakara.m.to","boss.taxi","satzcoal.com","listen.gallery","vidja.social","qatuno.de","toots.benpro.fr","timshomepage.net","empty.cafe","tooter.masto.host","mst-roa.m544.net","icmstdn.com","m.umbriel.fr","mastodon.mattjon.es","teacoffee.life","lianiis.m.to","makerdon.org","selfcare.masto.host","mastodon.dregin.com","crunchywatch.uk","voluntaryaction.network","sarubobo.red","cooperdon.com","mstdn.okin-jp.net","st.foresdon.jp","test.tegedon.net","piano.masto.host","bicyclemstdn.jp","social.gwadalug.org","happy-oss.y-zu.org","layer8.space","hub.sakuragawa.moe","mastodon.hakimus.de","blabla.maravitti.fr","mastodon.nekomimi.jp","postdon.com","mastodon.mocademia.jp","neritodon.xyz","sizedon.com","msyk.m.to","naf.m.to","sagatodon.m.to","mstdn.new-game.pw","md.sencic.com","toot.host","meow.m.to","t.cypv4.com","elephant-bike.herokuapp.com","t.unihubs.com","mastodon.starling.zone","mstdn-heroku.herokuapp.com","kokuchidon.net","mastodon.dominicdewolfe.com","aws.afn.social","social.literati.org","m.mtjm.eu","basictomonokai.m.to","mastodon.dustinwilson.com","mastodon.thequietplace.social","ostatus.lardbucket.org","hi.spooky.camp","mastodon.owls.io","pleroma.firechicken.net","social.timshomepage.net","social.ra-phi.ch","social.qwerjk.com","mastodon.h-sund.nu","social.lamowski.net","theoria.m.to","pleroma.distsn.org","mstdn.kitamurakz.com","nitic-mstdn.hostdon.jp","w3.freechinaweibo.com","toot.turbo.chat","coders.social","relativity.cafe","ps.s10y.eu","donphan.social","djs.social","mstdn.userzap.de","xn--69aa8bzb.xn--y9a3aq","ultrix.me","hax0rz.lol","sleeping.town","soc.freedombone.net","www.freechinaweibo.com","betoviet.m.to","mtn.gnlk.ovh","glaceon.social","mstdn.syoshida.org","social.mofu2charger-listenradio.net","linaro.tech","cosplay.m.to","digitalsoup.eu","social.symphonie-of-code.fr","kyunkyun.moe","mastodon.mynameisivan.ru","tecce.club","social.dxlb.nl","cmx.famousedu.com","hakomas.cf","dev.kirishima.cloud","dance-dance-dance.space","smj.m.to","yuikaoridon.m.to","mastodon.gamecircle.nova.0am.jp"]; + + + // get the value of the setting we've registered with register_setting() + $setting = get_option('mastodon_instance_url'); + // output the field + ?> + <input type="text" placeholder="mastodon.social" list="mInstances" name="mastodon_instance_url" value="<?= isset($setting) ? esc_attr($setting) : ''; ?>"> + + <?php + //Autocomplete + echo '<datalist id="mInstances">'; + foreach($mInstancesArray as $row => $singleInstance){ + echo '<option value="'.$singleInstance.'" />'; + + } + echo '</datalist>'; + + $buttonEnabled = $setting != "" ? "" : "disabled"; + + echo '<input id="userAuthButton" type="button" value="'.esc_html__('Login', 'autopost-to-mastodon').'" class="button" '.$buttonEnabled.'>'; + echo '<div id="mAuthMessage"></div>'; + ?> + <div id="tokenEnterForm"> + <div> + <input type="text" placeholder="fokwnmf3lwfd2sdfa2le3dwlsdmq32324we321fw" name="mastodon_server_token"> + <input id="getBearerButton" type="button" value="<?=esc_html__('Enter Token', 'autopost-to-mastodon');?>" class="button"> + </div> + <div> + <?=esc_html__('Enter the token from the popup. If the popup is not opening visit the following url', 'autopost-to-mastodon');?>: + </div> + <div> + <a href="" id="tokenPopupURL" target="_blank"></a> + </div> + </div> + <?php + + } + +// email + function mastodon_user_auth_func() + { + // get the value of the setting we've registered with register_setting() + $setting = get_option('mastodon_creds'); + // output the field + /* + <input type="text" name="mastodon_token" placeholder="sk9f3cb61a03778fa4f67hx215dd1b29bc12053fa4953daa55dd9178224e1d1be" value="<?= isset($setting) ? esc_attr($setting) : ''; ?>">*/ + + $buttonEnabled = ($setting != "") ? "" : "disabled"; + $testmsg = ($setting == "") ? "" : esc_html__('By clicking the "Test Settings" Button the following toot will be tooted to your Mastodon profile:', 'autopost-to-mastodon').' "'.esc_html__('This is my first toot with the Autopost to Mastodon Wordpress Plugin', 'autopost-to-mastodon').' https://wordpress.org/plugins/autopost-to-mastodon/"'; + + echo '<input id="testConnectionButton" type="button" value="'.esc_html__('Test Settings', 'autopost-to-mastodon').'" class="button" '.$buttonEnabled.'>'; + echo '<div id="testConnectionMessage">'.$testmsg.'</div>'; + } + + + + +/** + * Behavior Settings + */ + +// Section Title + function mastodon_behavior_description_func() + { + //xesc_html_e('Configure the Plugin Behavior', 'autopost-to-mastodon'); + } + +// Server URL + function mastodon_post_on_update_func() + { + // get the value of the setting we've registered with register_setting() + $setting = get_option('mastodon_post_on_update'); + // output the field + ?> + + <input type="checkbox" id="mastodon_post_on_update" name="mastodon_post_on_update" value="1" <?php echo checked( 1, $setting, false ) ?>/> + + <?php + } + +/** + * Post Settings + */ + +// Section Title + function mastodon_post_description_func() + { + //xesc_html_e('Configure the Plugin Behavior', 'autopost-to-mastodon'); + } + +// Hastags + function mastodon_post_hashtags() + { + // get the value of the setting we've registered with register_setting() + $setting = get_option('mastodon_post_hashtags'); + // output the field + ?> + + <input type="text" name="mastodon_post_hashtags" placeholder="#wordpress #autopost #magic" value="<?= isset($setting) ? esc_attr($setting) : ''; ?>"> + + <?php + } + + // visibility + function mastodon_post_visibility() + { + // get the value of the setting we've registered with register_setting() + $setting = get_option('mastodon_post_visibility'); + // output the field + ?> + + <input type="radio" name="mastodon_post_visibility" value="public" <?= $setting== "" || $setting=="public" ? 'checked' : ''; ?>> <?=esc_html("Public");?><br> + <input type="radio" name="mastodon_post_visibility" value="unlisted" <?= $setting=="unlisted" ? 'checked' : ''; ?>> <?=esc_html("Unlisted");?><br> + <input type="radio" name="mastodon_post_visibility" value="private" <?= $setting=="private" ? 'checked' : ''; ?>> <?=esc_html("Private");?> + + <?php + } + + // post format + function mastodon_post_format() + { + // get the value of the setting we've registered with register_setting() + $setting = get_option('mastodon_post_format'); + // output the field + ?> + + <input type="radio" name="mastodon_post_format" value="0" <?= $setting=="" || $setting=="0" ? 'checked' : ''; ?>> <?php echo esc_html("Title") . " ".esc_html("Link")." ".esc_html("Hashtags");?><br> + <input type="radio" name="mastodon_post_format" value="1" <?= $setting=="1" ? 'checked' : ''; ?>> <?php echo esc_html("Title") . " ".esc_html("Content")." ".esc_html("Link")." ".esc_html("Hashtags");?><br> + + <?php + } + + + + +//Add Settings Actions + add_action('admin_init', 'mastodon_settings_init'); + + + + +//Add the plugin menu to settings menu + function mastodon_menu() { + add_options_page( + "Mastodon Autopost Settings", + esc_attr__('Mastodon Autopost Settings', 'autopost-to-mastodon'), + "administrator", + "mastodon-settings-page", + 'mastodon_settings_page' + ); + } + +//Wordpress Standart Settings page + function mastodon_settings_page() { + // check user capabilities + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + + + + + /* add error/update messages + + // check if the user have submitted the settings + // wordpress will add the "settings-updated" $_GET parameter to the url + if ( isset( $_GET['settings-updated'] ) ) { + // add settings saved message with the class of "updated" + add_settings_error( 'wporg_messages', 'wporg_message', __( 'Settings Saved', 'wporg' ), 'updated' ); + } + + // show error/update messages + settings_errors( 'wporg_messages' );*/ + ?> + <div class="wrap"> + <h1><?php echo esc_html( get_admin_page_title() ); ?></h1> + <form action="options.php" method="post"> + <?php + // output security fields for the registered setting "wporg" + settings_fields( 'mastodon' ); + // output setting sections and their fields + // (sections are registered for "wporg", each field is registered to a specific section) + do_settings_sections( 'mastodon-settings-page' ); + + // output save settings button + echo '<input name="submit" id="submit" class="button button-primary" value="'.esc_html__('Save Settings', 'autopost-to-mastodon').'" type="submit">'; + //Test settings button + echo '<div style="float:clear;"></div>'; + ?> + </form> + </div> + <?php + } + +//Register menu + add_action('admin_menu', 'mastodon_menu'); + +/* +//Shortcut to settings page + add_filter('plugin_action_links', 'mastodon_autopost_menu_shortcut', 10, 2); + +function mastodon_autopost_menu_shortcut($links, $file) { + + + if (is_admin()) { + // The "page" query string value must be equal to the slug + // of the Settings admin page we defined earlier, which in + // this case equals "myplugin-settings". + $settings_link = '<a href="' . get_bloginfo('wpurl') . '/wp-admin/admin.php?page=mastodon-settings-page">'.esc_attr__('Settings', 'autopost-to-mastodon').'</a>'; + array_unshift($links, $settings_link); + } + + return $links; +} + +*/ + +?> -- GitLab