From 11c56871e7e38f63c579b1130d3066d11437d4b6 Mon Sep 17 00:00:00 2001 From: Lee Willis Date: Fri, 1 Feb 2013 22:35:07 +0000 Subject: [PATCH 1/2] Initial checkin --- README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 From 89cad96fd9cd059a7e466ce0340466f4db506f6e Mon Sep 17 00:00:00 2001 From: Lee Willis Date: Fri, 1 Feb 2013 23:44:31 +0000 Subject: [PATCH 2/2] 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 .= '

'; + + } + $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