+<?php\r
+/*\r
+ * @file src/Core/Protocol.php\r
+ */\r
+namespace Friendica\Core;\r
+\r
+use Friendica\Util\Network;\r
+\r
+/**\r
+ * Manage compatibility with federated networks\r
+ *\r
+ * @author Hypolite Petovan <mrpetovan@gmail.com>\r
+ */\r
+class Protocol\r
+{\r
+ const DFRN = 'dfrn'; // Friendica, Mistpark, other DFRN implementations\r
+ const DIASPORA = 'dspr'; // Diaspora\r
+ const DIASPORA2 = 'dspc'; // Diaspora connector\r
+ const STATUSNET = 'stac'; // Statusnet connector\r
+ const OSTATUS = 'stat'; // GNU-social, Pleroma, Mastodon, other OStatus implementations\r
+ const FEED = 'feed'; // RSS/Atom feeds with no known "post/notify" protocol\r
+ const MAIL = 'mail'; // IMAP/POP\r
+ const XMPP = 'xmpp'; // XMPP - Currently unsupported\r
+\r
+ const FACEBOOK = 'face'; // Facebook API\r
+ const LINKEDIN = 'lnkd'; // LinkedIn\r
+ const MYSPACE = 'mysp'; // MySpace - Currently unsupported\r
+ const GPLUS = 'goog'; // Google+\r
+ const PUMPIO = 'pump'; // pump.io\r
+ const TWITTER = 'twit'; // Twitter\r
+ const APPNET = 'apdn'; // app.net - Dead protocol\r
+\r
+ const NEWS = 'nntp'; // Network News Transfer Protocol - Currently unsupported\r
+ const ICALENDAR = 'ical'; // iCalendar - Currently unsupported\r
+ const PNUT = 'pnut'; // pnut.io - Currently unsupported\r
+ const ZOT = 'zot!'; // Zot! - Currently unsupported\r
+\r
+ const PHANTOM = 'unkn'; // Place holder\r
+\r
+ /**\r
+ * Returns the address string for the provided profile URL\r
+ *\r
+ * @param string $profile_url\r
+ * @return string\r
+ * @throws Exception\r
+ */\r
+ public static function getAddrFromProfileUrl($profile_url)\r
+ {\r
+ $network = self::matchByProfileUrl($profile_url, $matches);\r
+\r
+ if ($network === self::PHANTOM) {\r
+ throw new Exception('Unknown network for profile URL: ' . $profile_url);\r
+ }\r
+\r
+ $addr = $matches[2] . '@' . $matches[1];\r
+\r
+ return $addr;\r
+ }\r
+\r
+ /**\r
+ * Guesses the network from a profile URL\r
+ *\r
+ * @param string $profile_url\r
+ * @param array $matches preg_match return array: [0] => Full match [1] => hostname [2] => username\r
+ * @return type\r
+ */\r
+ public static function matchByProfileUrl($profile_url, &$matches = [])\r
+ {\r
+ if (preg_match('=https?://(twitter\.com)/(.*)=ism', $profile_url, $matches)) {\r
+ return self::TWITTER;\r
+ }\r
+\r
+ if (preg_match('=https?://(alpha\.app\.net)/(.*)=ism', $profile_url, $matches)) {\r
+ return self::APPNET;\r
+ }\r
+\r
+ if (preg_match('=https?://(plus\.google\.com)/(.*)=ism', $profile_url, $matches)) {\r
+ return self::GPLUS;\r
+ }\r
+\r
+ if (preg_match('=https?://(.*)/profile/(.*)=ism', $profile_url, $matches)) {\r
+ return self::DFRN;\r
+ }\r
+\r
+ if (preg_match('=https?://(.*)/u/(.*)=ism', $profile_url, $matches)) {\r
+ return self::DIASPORA;\r
+ }\r
+\r
+ if (preg_match('=https?://(.*)/channel/(.*)=ism', $profile_url, $matches)) {\r
+ // RedMatrix/Hubzilla is identified as Diaspora - friendica can't connect directly to it\r
+ return self::DIASPORA;\r
+ }\r
+\r
+ if (preg_match('=https?://(.*)/user/(.*)=ism', $profile_url, $matches)) {\r
+ $statusnet_host = $matches[1];\r
+ $statusnet_user = $matches[2];\r
+ $UserData = Network::fetchUrl('http://' . $statusnet_host . '/api/users/show.json?user_id=' . $statusnet_user);\r
+ $user = json_decode($UserData);\r
+ if ($user) {\r
+ $matches[2] = $user->screen_name;\r
+ return self::STATUSNET;\r
+ }\r
+ }\r
+\r
+ // pumpio (http://host.name/user)\r
+ if (preg_match('=https?://([\.\w]+)/([\.\w]+)$=ism', $profile_url, $matches)) {\r
+ return self::PUMPIO;\r
+ }\r
+\r
+ return self::PHANTOM;\r
+ }\r
+\r
+ /**\r
+ * Returns a formatted mention from a profile URL and a display name\r
+ *\r
+ * @param string $profile_url\r
+ * @param string $display_name\r
+ * @return string\r
+ */\r
+ public static function formatMention($profile_url, $display_name)\r
+ {\r
+ return $display_name . '(' . self::getAddrFromProfileUrl($profile_url) . ')';\r
+ }\r
+}\r