From 89cad96fd9cd059a7e466ce0340466f4db506f6e Mon Sep 17 00:00:00 2001
From: Lee Willis
Date: Fri, 1 Feb 2013 23:44:31 +0000
Subject: [PATCH] Initial commit
---
github-oembed.php | 262 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 262 insertions(+)
create mode 100644 github-oembed.php
diff --git a/github-oembed.php b/github-oembed.php
new file mode 100644
index 0000000..46a06c4
--- /dev/null
+++ b/github-oembed.php
@@ -0,0 +1,262 @@
+get_key();
+ $oembed_url = add_query_arg ( array ( 'github_oembed' => $key ), $oembed_url);
+ wp_oembed_add_provider ( '#https?://github.com/.*#i', $oembed_url, true );
+
+ }
+
+
+
+ /**
+ * Generate a unique key that can be used on our requests to stop others
+ * hijacking our internal oEmbed API
+ * @return string The site key
+ */
+ private function get_key() {
+
+ $key = get_option ( 'github_oembed_key' );
+
+ if ( ! $key ) {
+ $key = md5 ( time() . rand ( 0,65535 ) );
+ add_option ( 'github_oembed_key', $key, '', 'yes' );
+ }
+
+ return $key;
+
+ }
+
+
+
+ /**
+ * Check whether this is an oembed request, handle if it is
+ * Ignore it if not.
+ * Insert rant here about WP's lack of a front-end AJAX handler.
+ */
+ public function maybe_handle_oembed() {
+
+ if ( isset ( $_GET['github_oembed'] ) ) {
+ return $this->handle_oembed();
+ }
+
+ }
+
+
+
+ /**
+ * Handle an oembed request
+ */
+ public function handle_oembed() {
+
+ // Check this request is valid
+ if ( $_GET['github_oembed'] != $this->get_key() ) {
+ header ( 'HTTP/1.0 403 Forbidden' );
+ die ( 'Sad Octocat is sad.' );
+ }
+
+ // Check we have the required information
+ $url = isset ( $_REQUEST['url'] ) ? $_REQUEST['url'] : null;
+ $format = isset ( $_REQUEST['format'] ) ? $_REQUEST['format'] : null;
+
+ if ( ! empty ( $format ) && $format != 'json' ) {
+ header ( 'HTTP/1.0 501 Not implemented' );
+ die ( 'This octocat only does json' );
+ }
+
+ if ( ! $url ) {
+ header ( 'HTTP/1.0 404 Not Found' );
+ die ( 'Octocat is lost, and afraid' );
+ }
+
+ if ( preg_match ( '#https?://github.com/([^/]*)/([^/]*)/?$#i', $url, $matches ) && ! empty ( $matches[2] ) ) {
+
+ $this->oembed_github_repo ( $matches[1], $matches[2] );
+
+ } elseif ( preg_match ( '#https?://github.com/([^/]*)/?$#i', $url, $matches ) ) {
+
+ $this->oembed_github_author ( $matches[1] );
+
+ }
+
+ }
+
+
+
+ /**
+ * Retrieve the information from github for a repo, and
+ * output it as an oembed response
+ */
+ private function oembed_github_repo ( $owner, $repository ) {
+
+ $repository = trim ( $repository, '/' );
+
+ $results = wp_remote_get( "https://api.github.com/repos/$owner/$repository", $args = array (
+ 'user-agent' => 'WordPress Github oEmbed plugin - https://github.com/leewillis77/wp-github-oembed' ) );
+
+ if ( is_wp_error( $results ) ||
+ ! isset ( $results['response']['code'] ) ||
+ $results['response']['code'] != '200' ) {
+ header ( 'HTTP/1.0 404 Not Found' );
+ die ( 'Octocat is lost, and afraid' );
+ }
+
+ $repo = json_decode ( $results['body'] );
+
+ $results = wp_remote_get( "https://api.github.com/repos/$owner/$repository/commits", $args = array (
+ 'user-agent' => 'WordPress Github oEmbed plugin - https://github.com/leewillis77/wp-github-oembed' ) );
+
+ if ( is_wp_error( $results ) ||
+ ! isset ( $results['response']['code'] ) ||
+ $results['response']['code'] != '200' ) {
+ header ( 'HTTP/1.0 404 Not Found' );
+ die ( 'Octocat is lost, and afraid' );
+ }
+
+ $commits = json_decode ( $results['body'] );
+
+ $response = new stdClass();
+ $response->type = 'rich';
+ $response->width = '10';
+ $response->height = '10';
+ $response->version = '1.0';
+ $response->title = $repo->description;
+
+ // @TODO This should all be templated
+ $response->html = ''.esc_html($repo->description)."
";
+ $response->html .= esc_html($repo->html_url)."
";
+ $response->html .= esc_html($repo->forks_count)." forks.
";
+ $response->html .= esc_html($repo->open_issues_count)." open issues.
";
+
+ if ( count ( $commits ) ) {
+
+ $cnt = 0;
+ $response->html .= 'Recent commits:';
+ $response->html .= '
';
+
+ foreach ( $commits as $commit ) {
+
+ if ($cnt > 4)
+ break;
+
+ $response->html .= '- ';
+ $response->html .= ''.esc_html($commit->commit->message).", ";
+ $response->html .= esc_html($commit->commit->committer->name);
+ $response->html .= '
';
+
+ $cnt++;
+
+ }
+
+ $response->html .= '
';
+
+ }
+ $response->html .= '
';
+
+ header ( 'Content-Type: application/json' );
+ echo json_encode ( $response );
+ die();
+
+ }
+
+
+
+ /**
+ * Retrieve the information from github for an author, and output
+ * it as an oembed response
+ */
+ private function oembed_github_author ( $owner ) {
+
+ $owner = trim ( $owner, '/' );
+
+ $results = wp_remote_get( "https://api.github.com/users/$owner", $args = array (
+ 'user-agent' => 'WordPress Github oEmbed plugin - https://github.com/leewillis77/wp-github-oembed' ) );
+
+ if ( is_wp_error( $results ) ||
+ ! isset ( $results['response']['code'] ) ||
+ $results['response']['code'] != '200' ) {
+ header ( 'HTTP/1.0 404 Not Found' );
+ die ( 'Octocat is lost, and afraid' );
+ }
+
+ $owner_info = json_decode ( $results['body'] );
+
+ $response = new stdClass();
+ $response->type = 'rich';
+ $response->width = '10';
+ $response->height = '10';
+ $response->version = '1.0';
+ $response->title = $owner_info->name;
+
+ // @TODO This should all be templated
+ $response->html = ''.esc_html($owner)."
";
+ $response->html .= esc_html($owner_info->public_repos).' repositories, ';
+ $response->html .= esc_html($owner_info->followers).' followers.
';
+
+ header ( 'Content-Type: application/json' );
+ echo json_encode ( $response );
+ die();
+
+ }
+
+}
+
+$github_oembed = new github_oembed();
\ No newline at end of file