diff --git a/freifunkmeta.php b/freifunkmeta.php index 4eac73a..d064b74 100644 --- a/freifunkmeta.php +++ b/freifunkmeta.php @@ -3,34 +3,34 @@ Plugin Name: Freifunk Metadata Shortcodes Plugin URI: http://mschuette.name/ Description: Defines shortcodes to display Freifunk metadata -Version: 0.3 +Version: 0.4dev Author: Martin Schuette Author URI: http://mschuette.name/ */ -define('FF_META_DEFAULT_CACHETIME', 15); -define('FF_META_DEFAULT_DIR', 'https://raw.githubusercontent.com/freifunk/directory.api.freifunk.net/master/directory.json'); -define('FF_META_DEFAULT_CITY', 'hamburg'); +define( 'FF_META_DEFAULT_CACHETIME', 15 ); +define( 'FF_META_DEFAULT_DIR', 'https://raw.githubusercontent.com/freifunk/directory.api.freifunk.net/master/directory.json' ); +define( 'FF_META_DEFAULT_CITY', 'hamburg' ); /** * class to fetch and cache data from external URLs */ class FF_Meta_Externaldata { - public function get($url) { - /* gets metadata from URL, handles caching */ - $cachekey = 'ff_metadata_'.hash('crc32', $url); - $cachetime = get_option('ff_meta_cachetime', FF_META_DEFAULT_CACHETIME) * MINUTE_IN_SECONDS; + public function get( $url ) { + /* gets metadata from URL, handles caching */ + $cachekey = 'ff_metadata_'.hash( 'crc32', $url ); + $cachetime = get_option( 'ff_meta_cachetime', FF_META_DEFAULT_CACHETIME ) * MINUTE_IN_SECONDS; - // Caching - if ( false === ( $data = get_transient($cachekey) ) ) { - $http_response = wp_remote_get($url); - $json = wp_remote_retrieve_body($http_response); - $data = json_decode ($json, $assoc = true); - set_transient( $cachekey, $data, $cachetime ); - } - return $data; - } + // Caching + if ( false === ( $data = get_transient( $cachekey ) ) ) { + $http_response = wp_remote_get( $url ); + $json = wp_remote_retrieve_body( $http_response ); + $data = json_decode( $json, $assoc = true ); + set_transient( $cachekey, $data, $cachetime ); + } + return $data; + } } /** @@ -38,22 +38,22 @@ class FF_Meta_Externaldata */ class FF_Directory { - private $directory; + private $directory; - function __construct() { - $ed = new FF_Meta_Externaldata(); - $this->directory = $ed->get(FF_META_DEFAULT_DIR); - } + function __construct() { + $ed = new FF_Meta_Externaldata(); + $this->directory = $ed->get( FF_META_DEFAULT_DIR ); + } - function get_url_by_city($city) { - $val = $this->directory[$city]; + function get_url_by_city( $city ) { + $val = $this->directory[$city]; - if (empty($val)) { - return false; - } else { - return $val; - } - } + if ( empty( $val ) ) { + return false; + } else { + return $val; + } + } } /** @@ -61,49 +61,49 @@ class FF_Directory */ class FF_Community { - public $name; - public $street; - public $zip; - public $city; - public $lon; - public $lat; + public $name; + public $street; + public $zip; + public $city; + public $lon; + public $lat; - /** - * Default constructor from metadata - */ - function __construct($metadata) { - $loc = $metadata['location']; - $this->name = (isset($loc['address']) && isset($loc['address']['Name'])) ? $loc['address']['Name'] : ''; - $this->street = (isset($loc['address']) && isset($loc['address']['Street'])) ? $loc['address']['Street'] : ''; - $this->zip = (isset($loc['address']) && isset($loc['address']['Zipcode'])) ? $loc['address']['Zipcode'] : ''; - $this->city = isset($loc['city']) ? $loc['city'] : ''; - $this->lon = isset($loc['lon']) ? $loc['lon'] : ''; - $this->lat = isset($loc['lat']) ? $loc['lat'] : ''; - } + /** + * Default constructor from metadata + */ + function __construct( $metadata ) { + $loc = $metadata['location']; + $this->name = ( isset( $loc['address'] ) && isset( $loc['address']['Name'] ) ) ? $loc['address']['Name'] : ''; + $this->street = ( isset( $loc['address'] ) && isset( $loc['address']['Street'] ) ) ? $loc['address']['Street'] : ''; + $this->zip = ( isset( $loc['address'] ) && isset( $loc['address']['Zipcode'] ) ) ? $loc['address']['Zipcode'] : ''; + $this->city = isset( $loc['city'] ) ? $loc['city'] : ''; + $this->lon = isset( $loc['lon'] ) ? $loc['lon'] : ''; + $this->lat = isset( $loc['lat'] ) ? $loc['lat'] : ''; + } - /** - * Alternative constructor from city name - */ - static function make_from_city($city) { - // TODO: test - if (false === ($url = $this->dir->get_url_by_city($city))) { - return "\n"; - } - if (false === ($metadata = FF_Meta_Externaldata::get($url))) { - return "\n"; - } - return new FF_Community($metadata); - } + /** + * Alternative constructor from city name + */ + static function make_from_city( $city ) { + // TODO: test + if ( false === ( $url = $this->dir->get_url_by_city( $city ) ) ) { + return "\n"; + } + if ( false === ( $metadata = FF_Meta_Externaldata::get( $url ) ) ) { + return "\n"; + } + return new FF_Community( $metadata ); + } - function format_address() { - if (empty($this->name) || empty($this->street) || empty($this->zip)) { - return ''; - } - // TODO: style address + map as single box - // TODO: once it is "ready" package openlayers.js into the plugin (cf. http://docs.openlayers.org/library/deploying.html) - // TODO: handle missing values (i.e. only name & city) - return '

' . sprintf('%s
%s
%s %s', $this->name, $this->street, $this->zip, $this->city) . '

'; - } + function format_address() { + if ( empty( $this->name ) || empty( $this->street ) || empty( $this->zip ) ) { + return ''; + } + // TODO: style address + map as single box + // TODO: once it is "ready" package openlayers.js into the plugin ( cf. http://docs.openlayers.org/library/deploying.html ) + // TODO: handle missing values ( i.e. only name & city ) + return '

' . sprintf( '%s
%s
%s %s', $this->name, $this->street, $this->zip, $this->city ) . '

'; + } } /** @@ -111,297 +111,297 @@ class FF_Community */ class FF_Meta { - private $dir; + private $dir; - function __construct() { - $this->dir = new FF_Directory(); - } + function __construct() { + $this->dir = new FF_Directory(); + } - function register_stuff() { - if ( ! shortcode_exists('ff_state') ) { - add_shortcode('ff_state', array($this, 'shortcode_handler')); - } - if ( ! shortcode_exists('ff_services') ) { - add_shortcode('ff_services', array($this, 'shortcode_handler')); - } - if ( ! shortcode_exists('ff_contact') ) { - add_shortcode('ff_contact', array($this, 'shortcode_handler')); - } - if ( ! shortcode_exists('ff_location') ) { - add_shortcode('ff_location', array($this, 'shortcode_handler')); - } + function register_stuff() { + if ( ! shortcode_exists( 'ff_state' ) ) { + add_shortcode( 'ff_state', array( $this, 'shortcode_handler' ) ); + } + if ( ! shortcode_exists( 'ff_services' ) ) { + add_shortcode( 'ff_services', array( $this, 'shortcode_handler' ) ); + } + if ( ! shortcode_exists( 'ff_contact' ) ) { + add_shortcode( 'ff_contact', array( $this, 'shortcode_handler' ) ); + } + if ( ! shortcode_exists( 'ff_location' ) ) { + add_shortcode( 'ff_location', array( $this, 'shortcode_handler' ) ); + } - add_action('admin_menu', array($this, 'admin_menu')); - add_action('admin_init', array($this, 'admin_init')); - register_uninstall_hook( __FILE__, array('ff_meta', 'uninstall_hook')); - } + add_action( 'admin_menu', array( $this, 'admin_menu' ) ); + add_action( 'admin_init', array( $this, 'admin_init' ) ); + register_uninstall_hook( __FILE__, array( 'ff_meta', 'uninstall_hook' ) ); + } - function output_ff_state($citydata) { - $state = $citydata['state']; - return sprintf('%s', $state['nodes']); - } + function output_ff_state( $citydata ) { + $state = $citydata['state']; + return sprintf( '%s', $state['nodes'] ); + } - function aux_get_all_locations() { - // gather all location data - if (false === ( $json_locs = get_transient("FF_metadata_json_locs") )) { - $all_locs = array(); - $arr_select = array('lat' => 1, 'lon' => 1); - foreach ($this->dir as $tmp_city => $url) { - try { - $tmp_meta = FF_Meta_Externaldata::get($url); - if (!empty($tmp_meta['location'])) { - $tmp_loc = array_intersect_key($tmp_meta['location'], $arr_select); - $all_locs[$tmp_city] = $tmp_loc; - } - } catch (Exception $e) { - // pass - } - } - $json_locs = json_encode($all_locs); - $cachetime = get_option('FF_meta_cachetime', FF_META_DEFAULT_CACHETIME) * MINUTE_IN_SECONDS; - set_transient("FF_metadata_json_locs", $json_locs, $cachetime); - } - return $json_locs; - } + function aux_get_all_locations() { + // gather all location data + if ( false === ( $json_locs = get_transient( 'FF_metadata_json_locs' ) ) ) { + $all_locs = array(); + $arr_select = array( 'lat' => 1, 'lon' => 1 ); + foreach ( $this->dir as $tmp_city => $url ) { + try { + $tmp_meta = FF_Meta_Externaldata::get( $url ); + if ( ! empty( $tmp_meta['location'] ) ) { + $tmp_loc = array_intersect_key( $tmp_meta['location'], $arr_select ); + $all_locs[$tmp_city] = $tmp_loc; + } + } catch ( Exception $e ) { + // pass + } + } + $json_locs = json_encode( $all_locs ); + $cachetime = get_option( 'FF_meta_cachetime', FF_META_DEFAULT_CACHETIME ) * MINUTE_IN_SECONDS; + set_transient( 'FF_metadata_json_locs', $json_locs, $cachetime ); + } + return $json_locs; + } - function output_ff_location($citydata) { - // normal per-city code - $loc = new FF_Community($citydata); + function output_ff_location( $citydata ) { + // normal per-city code + $loc = new FF_Community( $citydata ); + $outstr = $loc->format_address(); + $json_locs = $this->aux_get_all_locations(); - $outstr = $loc->format_address(); - $json_locs = $this->aux_get_all_locations(); - - if (!empty($loc_name) && !empty($loc_name)) { - $icon_url = plugin_dir_url(__FILE__) . "freifunk_marker.png"; - $outstr .= << EOT; - } - return $outstr; - } + } + return $outstr; + } - function output_ff_services($citydata) { - $outstr = ''; - return $outstr; - } + function output_ff_services( $citydata ) { + $outstr = ''; + return $outstr; + } - function output_ff_contact($citydata) { - $outstr = '

'; - $contact = $citydata['contact']; - // Output -- rather ugly but the data is not uniform, some fields are URIs, some are usernames, ... - if (!empty($contact['email'])) { - $outstr .= sprintf("E-Mail: %s
\n", $contact['email'], $contact['email']); - } - if (!empty($contact['ml'])) { - $outstr .= sprintf("Mailingliste: %s
\n", $contact['ml'], $contact['ml']); - } - if (!empty($contact['irc'])) { - $outstr .= sprintf("IRC: %s
\n", $contact['irc'], $contact['irc']); - } - if (!empty($contact['twitter'])) { - // catch username instead of URI - if ($contact['twitter'][0] === "@") { - $twitter_url = 'http://twitter.com/' . ltrim($contact['twitter'], "@"); - $twitter_handle = $contact['twitter']; - } else { - $twitter_url = $contact['twitter']; - $twitter_handle = '@' . substr($contact['twitter'], strrpos($contact['twitter'], '/') + 1); - } - $outstr .= sprintf("Twitter: %s
\n", $twitter_url, $twitter_handle); - } - if (!empty($contact['facebook'])) { - $outstr .= sprintf("Facebook: %s
\n", $contact['facebook'], $contact['facebook']); - } - if (!empty($contact['googleplus'])) { - $outstr .= sprintf("G+: %s
\n", $contact['googleplus'], $contact['googleplus']); - } - if (!empty($contact['jabber'])) { - $outstr .= sprintf("XMPP: %s
\n", $contact['jabber'], $contact['jabber']); - } - $outstr .= '

'; - return $outstr; - } + function output_ff_contact( $citydata ) { + $outstr = '

'; + $contact = $citydata['contact']; + // Output -- rather ugly but the data is not uniform, some fields are URIs, some are usernames, ... + if ( ! empty( $contact['email'] ) ) { + $outstr .= sprintf( "E-Mail: %s
\n", $contact['email'], $contact['email'] ); + } + if ( ! empty( $contact['ml'] ) ) { + $outstr .= sprintf( "Mailingliste: %s
\n", $contact['ml'], $contact['ml'] ); + } + if ( ! empty( $contact['irc'] ) ) { + $outstr .= sprintf( "IRC: %s
\n", $contact['irc'], $contact['irc'] ); + } + if ( ! empty( $contact['twitter'] ) ) { + // catch username instead of URI + if ( $contact['twitter'][0] === '@' ) { + $twitter_url = 'http://twitter.com/' . ltrim( $contact['twitter'], '@' ); + $twitter_handle = $contact['twitter']; + } else { + $twitter_url = $contact['twitter']; + $twitter_handle = '@' . substr( $contact['twitter'], strrpos( $contact['twitter'], '/' ) + 1 ); + } + $outstr .= sprintf( "Twitter: %s
\n", $twitter_url, $twitter_handle ); + } + if ( ! empty( $contact['facebook'] ) ) { + $outstr .= sprintf( "Facebook: %s
\n", $contact['facebook'], $contact['facebook'] ); + } + if ( ! empty( $contact['googleplus'] ) ) { + $outstr .= sprintf( "G+: %s
\n", $contact['googleplus'], $contact['googleplus'] ); + } + if ( ! empty( $contact['jabber'] ) ) { + $outstr .= sprintf( "XMPP: %s
\n", $contact['jabber'], $contact['jabber'] ); + } + $outstr .= '

'; + return $outstr; + } - function output_ff_list() { - return 'here be some ff_list'; - } - - function shortcode_handler($atts, $content, $shortcode) { - // $atts[0] holds the city name, if given - if (empty($atts[0])) { - $city = get_option('FF_meta_city', FF_META_DEFAULT_CITY); - } else { - $city = $atts[0]; - } + function output_ff_list() { + return 'here be some ff_list'; + } + + function shortcode_handler( $atts, $content, $shortcode ) { + // $atts[0] holds the city name, if given + if ( empty( $atts[0] ) ) { + $city = get_option( 'FF_meta_city', FF_META_DEFAULT_CITY ); + } else { + $city = $atts[0]; + } - if (false === ($cityurl = $this->dir->get_url_by_city($city))) { - return "\n"; - } + if ( false === ( $cityurl = $this->dir->get_url_by_city( $city ) ) ) { + return "\n"; + } - if (false === ($metadata = FF_Meta_Externaldata::get($cityurl))) { - return "\n"; - } + if ( false === ( $metadata = FF_Meta_Externaldata::get( $cityurl ) ) ) { + return "\n"; + } - $outstr = "
"; - switch ($shortcode) { - case 'ff_state': - $outstr .= $this->output_ff_state($metadata); - break; - case 'ff_location': - $outstr .= $this->output_ff_location($metadata); - break; - case 'ff_services': - $outstr .= $this->output_ff_services($metadata); - break; - case 'ff_contact': - $outstr .= $this->output_ff_contact($metadata); - break; - case 'ff_list': - $outstr .= $this->output_ff_list(); - break; - default: - $outstr .= ""; - break; - } - $outstr .= "
"; - return $outstr; - } + $outstr = "
"; + switch ( $shortcode ) { + case 'ff_state': + $outstr .= $this->output_ff_state( $metadata ); + break; + case 'ff_location': + $outstr .= $this->output_ff_location( $metadata ); + break; + case 'ff_services': + $outstr .= $this->output_ff_services( $metadata ); + break; + case 'ff_contact': + $outstr .= $this->output_ff_contact( $metadata ); + break; + case 'ff_list': + $outstr .= $this->output_ff_list(); + break; + default: + $outstr .= ''; + break; + } + $outstr .= '
'; + return $outstr; + } - function admin_menu() { - // Options Page: - add_options_page( - 'FF Meta Plugin', // page title - 'FF Meta', // menu title - 'manage_options', // req'd capability - 'ff_meta_plugin', // menu slug - array ('FF_meta', 'options_page') // callback function - ); - } + function admin_menu() { + // Options Page: + add_options_page( + 'FF Meta Plugin', // page title + 'FF Meta', // menu title + 'manage_options', // req'd capability + 'ff_meta_plugin', // menu slug + array( 'FF_meta', 'options_page' ) // callback function + ); + } - function admin_init() { - register_setting( - 'ff_meta_settings-group', // group name - 'ff_meta_cachetime' // option name - ); - register_setting( - 'ff_meta_settings-group', // group name - 'ff_meta_city' // option name - ); - add_settings_section( - 'ff_meta_section-one', // ID - 'Section One', // Title - array ('FF_Meta', 'section_one_callback'), // callback to fill - 'ff_meta_plugin' // page to display on - ); - add_settings_field( - 'ff_meta_city', // ID - 'Default community', // Title - array ('FF_Meta', 'city_callback'), // callback to fill field - 'ff_meta_plugin', // menu page=slug to display field on - 'ff_meta_section-one', // section to display the field in - array('label_for' => 'ff_meta_city_id') // ID of input element - ); - add_settings_field( - 'ff_meta_cachetime', // ID - 'Cache time', // Title - array ('FF_Meta', 'cachetime_callback'), // callback to fill field - 'ff_meta_plugin', // menu page=slug to display field on - 'ff_meta_section-one', // section to display the field in - array('label_for' => 'ff_meta_cachetime_id') // ID of input element - ); - } + function admin_init() { + register_setting( + 'ff_meta_settings-group', // group name + 'ff_meta_cachetime' // option name + ); + register_setting( + 'ff_meta_settings-group', // group name + 'ff_meta_city' // option name + ); + add_settings_section( + 'ff_meta_section-one', // ID + 'Section One', // Title + array( 'FF_Meta', 'section_one_callback' ), // callback to fill + 'ff_meta_plugin' // page to display on + ); + add_settings_field( + 'ff_meta_city', // ID + 'Default community', // Title + array( 'FF_Meta', 'city_callback' ), // callback to fill field + 'ff_meta_plugin', // menu page=slug to display field on + 'ff_meta_section-one', // section to display the field in + array( 'label_for' => 'ff_meta_city_id' ) // ID of input element + ); + add_settings_field( + 'ff_meta_cachetime', // ID + 'Cache time', // Title + array( 'FF_Meta', 'cachetime_callback' ), // callback to fill field + 'ff_meta_plugin', // menu page=slug to display field on + 'ff_meta_section-one', // section to display the field in + array( 'label_for' => 'ff_meta_cachetime_id' ) // ID of input element + ); + } - function section_one_callback() { - echo 'This Plugin provides shortcodes to display information from the Freifunk meta.json.'; - } + function section_one_callback() { + echo 'This Plugin provides shortcodes to display information from the Freifunk meta.json.'; + } - function cachetime_callback() { - $time = get_option( 'ff_meta_cachetime', FF_META_DEFAULT_CACHETIME ); - echo " minutes" - ."

Data from external URLs is cached for this number of minutes.

"; - } + function cachetime_callback() { + $time = get_option( 'ff_meta_cachetime', FF_META_DEFAULT_CACHETIME ); + echo " minutes'. + "

Data from external URLs is cached for this number of minutes.

"; + } - function city_callback() { - if (false === ($directory = FF_Meta_Externaldata::get ( FF_META_DEFAULT_DIR ))) { - // TODO: error handling - return; - } - $default_city = get_option( 'ff_meta_city', FF_META_DEFAULT_CITY ); + function city_callback() { + if ( false === ( $directory = FF_Meta_Externaldata::get( FF_META_DEFAULT_DIR ) ) ) { + // TODO: error handling + return; + } + $default_city = get_option( 'ff_meta_city', FF_META_DEFAULT_CITY ); - echo ""; - echo "

This is the default city parameter.

"; - } + echo "'; + echo "

This is the default city parameter.

"; + } - function options_page() { - ?> -
-

Freifunk Meta Plugin Options

-
- - - -
-
- +
+

Freifunk Meta Plugin Options

+
+ + + +
+
+