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
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

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