*
* This plugin uses Facebook Graph API v2.7.
*
*/
// must be run within Dokuwiki
if(!defined('DOKU_INC')) die();
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'syntax.php');
// Syntax parameters
define( "FB_WALL_APPLICATION_ID", "appid" ); // Facebook application id
define( "FB_WALL_SECRET", "secret" ); // Facebook secret
define( "FB_WALL_FAN_PAGE_ID", "fanpageid" ); // Facebook page id
define( "FB_WALL_SHOW_AS", "showAs" ); // Allow alternate displaying of the status messages
define( "FB_WALL_FROM_DATE", "from" ); // date from which to include the status message
define( "FB_WALL_TO_DATE", "to" ); // date to which to include status messages
define( "FB_WALL_NR_ENTRIES", "numberOfEntries" ); // maximum number of entries
define( "FB_WALL_SORT", "sort" ); // Sort by create date ASC or DESC
define( "FB_WALL_LIMIT", "limit" ); // Limit size of the description by number of chars
// Configuration parameters
define( "FB_WALL_DATE_FORMAT", "dformat" ); // Date format
define( "FB_WALL_TIME_FORMAT", "tformat" ); // Time format
define( "FB_WALL_TEMPLATE", "template" ); // Template
define( "FB_WALL_PICTURE_MAX_WIDTH", "maxWidth" ); // Maximum allowed width for attachment picture
define( "FB_WALL_PICTURE_MAX_HEIGHT", "maxHeight" ); // Maximum allowed height for attachment picture
/**
* This plugin retrieves facebook status messages and displays them in HTML.
*
* Usage: {{facebookwall#appid=1234&secret=12345&fanpageid=12345&showAs=default}}
*
*/
class syntax_plugin_facebookwall extends DokuWiki_Syntax_Plugin
{
function getInfo() {
return array(
'author' => 'J. Drost-Tenfelde',
'email' => 'info@drost-tenfelde.de',
'date' => '2012-02-09',
'name' => 'facebookwall',
'desc' => 'Displays status messages on a facebook wall',
'url' => 'http://www.drost-tenfelde.de/?id=dokuwiki:plugins:facebookwall',
);
}
// implement necessary Dokuwiki_Syntax_Plugin methods
function getType() {
return 'substition';
}
function getSort() {
return 42;
}
function connectTo($mode) {
$this->Lexer->addSpecialPattern('\{\{facebookwall.*?\}\}',$mode,'plugin_facebookwall');
}
function getData($url) {
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
/**
* parse parameters from the {{facebookwall#...}} tag.
* @return an array that will be passed to the renderer function
*/
function handle($match, $state, $pos, &$handler) {
$match = substr($match, 15, -2);
parse_str($match, $params);
// Make sure the necessary data is set
if ( !$params[FB_WALL_APPLICATION_ID] ) {
$this->error = $this->getLang('error_appid_not_set');
}
if ( !$params[FB_WALL_SECRET] ) {
$this->error = $this->getLang('error_secret_not_set');
}
if ( !$params[FB_WALL_FAN_PAGE_ID] ) {
$this->error = $this->getLang('error_fanpageid_not_set');
}
if ( !$params[FB_WALL_SHOW_AS] ) {
$params[FB_WALL_SHOW_AS] = 'default';
}
if ( !$params[FB_WALL_LIMIT] ) {
$params[FB_WALL_LIMIT] = 0;
}
// Max width
$maxWidth = $this->getConf( FB_WALL_PICTURE_MAX_WIDTH );
if ( !isset($maxWidth ) || $maxWidth == '' ) {
$maxWidth = 999;
}
$params[FB_WALL_PICTURE_MAX_WIDTH] = $maxWidth;
// Max height
$maxHeight = $this->getConf( FB_WALL_PICTURE_MAX_HEIGHT );
if ( !isset($maxHeight) || $maxHeight== '' ) {
$maxHeight = 0;
}
$params[FB_WALL_PICTURE_MAX_HEIGHT] = $maxHeight;
// Get the appropriate display template
$template = $this->getConf( $params[FB_WALL_SHOW_AS] );
if ( !isset($template ) || $template == '' ) {
$template = $this->getConf('default');
}
$params[FB_WALL_TEMPLATE] = $template;
// Get the FROM_DATE parameter
if ($params[FB_WALL_FROM_DATE] == 'today') {
$from = time();
}
else if (preg_match('#(\d\d)/(\d\d)/(\d\d\d\d)#', $params[FB_WALL_FROM_DATE], $fromDate)) {
// must be MM/dd/yyyy
$from = mktime(0, 0, 0, $fromDate[1], $fromDate[2], $fromDate[3]);
}
else if (preg_match('/\d+/', $params[FB_WALL_FROM_DATE])) {
$from = $params[FB_WALL_FROM_DATE];
}
$params[FB_WALL_FROM_DATE] = $from;
// Get the to parameter
if ($params[FB_WALL_TO_DATE] == 'today') {
$to = mktime(24, 0, 0, date("m") , date("d"), date("Y"));
}
else if (preg_match('#(\d\d)/(\d\d)/(\d\d\d\d)#', $params[FB_WALL_TO_DATE], $toDate)) {
// must be MM/dd/yyyy
$to = mktime(0, 0, 0, $toDate[1], $toDate[2], $toDate[3]);
}
else if (preg_match('/\d+/', $params[FB_WALL_TO_DATE])) {
$to = $params[FB_WALL_TO_DATE];
}
$params[FB_WALL_TO_DATE] = $to;
// Sorting
if ( !$params[FB_WALL_SORT ] ) {
$params[FB_WALL_SORT ] = 'DESC';
}
else {
if ( $params[FB_WALL_SORT] != 'ASC') {
$params[FB_WALL_SORT ] = 'DESC';
}
}
return $params;
}
/**
* Retrieves the facebook events and parses them to HTML.
*/
function render($mode, &$renderer, $data) {
global $conf;
$info = $this->getInfo();
$content = '';
if ($mode == 'xhtml') {
// Catch errors
if ($this->error) {
$renderer->doc .= 'Error in Plugin '.$info['name'].': '.$this->error;
return;
}
// Get the facebook information
$fb_app_id = $data[FB_WALL_APPLICATION_ID];
$fb_secret = $data[FB_WALL_SECRET];
$fb_page_id = $data[FB_WALL_FAN_PAGE_ID];
// Get the access token using app-id and secret
$token_url ="https://graph.facebook.com/oauth/access_token?client_id={$fb_app_id}&client_secret={$fb_secret}&grant_type=client_credentials";
$token_data = $this->getData( $token_url );
$elements = split("=", $token_data );
if ( count($elements) < 2) {
$renderer->doc .= 'Access token could not be retrieved for Plugin '.$info['name'].': '.$this->error;
return;
}
$fb_access_token = $elements[1];
// Get the date format
$date_format = $this->getConf(FB_WALL_DATE_FORMAT);
$time_format = $this->getConf(FB_WALL_TIME_FORMAT);
$datetime_format = $date_format.' '.$time_format;
$numberOfEntries = $data[FB_WALL_NR_ENTRIES];
// Get the time offset
//$offset = $this->get_timezone_offset( "America/Los_Angeles" );
$offset = 0;
$fields = "id,message,picture,link,name,description,type,icon,created_time,from,object_id";
$limit = $numberOfEntries + 5;
$json_link = "https://graph.facebook.com/{$fb_page_id}/feed?access_token={$fb_access_token}&fields={$fields}&limit={$limit}";
$json = $this->getData( $json_link);
//$objects = json_decode($json, true, 512, JSON_BIGINT_AS_STRING);
$objects = json_decode($json, true);
// count the number of wallposts
$post_count = count($objects['data']);
// Loop through the events
for ($post_index = 0; $post_index < $post_count; $post_index++) {
$post = $objects['data'][$post_index];
$entry = $data[FB_WALL_TEMPLATE];
// If no message was provided, skip to the next
if ( !$post['message'] ) {
continue;
}
// If the date is lower than the from date, skip to the next
if ( isset($data[FB_WALL_FROM_DATE]) && ($post['created_time'] < $data[FB_WALL_FROM_DATE] ) ) {
continue;
}
// If the date is higher than the to data, skip to the next
if ( $data[FB_WALL_TO_DATE] && ($post['created_time'] > $data[FB_WALL_TO_DATE] )) {
continue;
}
// Limit?
if ( isset( $data[FB_WALL_LIMIT]) && ($data[FB_WALL_LIMIT] > 0 ) ) {
if ( strlen( $post['message'] ) > $data[FB_WALL_LIMIT] ) {
$post['message_short'] = substr( $post['message'], 0, $data[FB_WALL_LIMIT] ).'...';
// Find the first occurance of a space
$index = strrpos ( $post['message_short'], ' ' );
$post['message_short'] = substr( $post['message_short'], 0, $index ).'...';
$post['message'] = substr( $post['message_short'], 0, $index ).'...';
}
}
else {
$post['message_short'] = substr( $post['message'], 0, 150 ).'...';
$index = strrpos ( $post['message_short'], ' ' );
$post['message_short'] = substr( $post['message_short'], 0, $index ).'...';
}
// Process the message
$post['message'] = str_replace("\r\n", '
', $post['message'] );
$post['message'] = str_replace("\n", '
', $post['message'] );
$post['message_short'] = str_replace("\r\n", '
', $post['message_short'] );
$post['message_short'] = str_replace("\n", '
', $post['message_short'] );
$entry = str_replace('{message}', $post['message'], $entry );
$entry = str_replace('{message_short}', $post['message_short'], $entry );
// Replace tags in template
$entry = str_replace('{date}', date( $date_format, strtotime($post['created_time'])), $entry );
$entry = str_replace('{time}', date( $time_format, strtotime($post['created_time'])), $entry );
$entry = str_replace('{datetime}', date( $datetime_format, strtotime($post['created_time'])), $entry );
$entry = str_replace('{timestamp}', $post['created_time'], $entry );
$pic = $post['picture'];
// Add a fix for urls with get parameters
if ( strpos($pic, '?') > 0 )
{
$pic .= '&.png';
}
$entry = str_replace('{image}', $pic, $entry );
// Url
$post_id = $post['id'];
$post_values = explode( "_", $post_id);
$post_url = "http://www.facebook.com/".$post_values[0]."/posts/".$post_values[1];
$entry = str_replace('{url}', $post_url, $entry );
$entry = str_replace('{more}', '[['.$post_url.'|'.$this->getLang('read_more').']]', $entry );
// Add the entry to the content
$content .= $entry;
$numberOfEntries--;
if ( $numberOfEntries == 0 ) {
break;
}
}
//$renderer->doc .= $ret;
$html = p_render($mode, p_get_instructions( $content ), $info );
$renderer->doc .= $html;
return true;
}
return false;
}
function get_timezone_offset($remote_tz, $origin_tz = null) {
if($origin_tz === null) {
if(!is_string($origin_tz = date_default_timezone_get())) {
return false; // A UTC timestamp was returned -- bail out!
}
}
$origin_dtz = new DateTimeZone($origin_tz);
$remote_dtz = new DateTimeZone($remote_tz);
$origin_dt = new DateTime("now", $origin_dtz);
$remote_dt = new DateTime("now", $remote_dtz);
$offset = $origin_dtz->getOffset($origin_dt) - $remote_dtz->getOffset($remote_dt);
return $offset;
}
/**
* Makes a linked image.
*
* @href link
* @alt tooltip
* @src location of the image
* @data configuration parameters for the plugin.
* @conf DokuWiki configuration.
*
* @return HTML code with linked image.
*/
function makeImage( $href, $alt, $src, $data, $conf) {
$html = '';
$html .= ' 0 || $data[FB_WALL_PICTURE_MAX_HEIGHT] > 0) {
$html .= ' style="';
if ( $data[FB_WALL_PICTURE_MAX_WIDTH] > 0 ) {
$html .= 'max-width: '.$data[FB_WALL_PICTURE_MAX_WIDTH].'px !important;';
}
if ( $data[FB_WALL_PICTURE_MAX_HEIGHT] > 0 ) {
$html .= 'max-height: '.$data[FB_WALL_PICTURE_MAX_HEIGHT].'px !important;';
}
$html .= '"';
}
$html .= '/>';
$html .= '';
return $html;
}
}
?>