From a18b91b73ef7f42c21c0cadfd2c2d816bd7428e4 Mon Sep 17 00:00:00 2001 From: friendica Date: Mon, 14 Nov 2011 19:13:54 -0800 Subject: [PATCH] improved makefile dependencies checking, posterous connector --- Makefile | 15 +-- buildtgz | 22 ++++ posterous.tgz | Bin 0 -> 4387 bytes posterous/posterous-api.php | 248 ++++++++++++++++++++++++++++++++++++ posterous/posterous.css | 16 +++ posterous/posterous.php | 187 +++++++++++++++++++++++++++ 6 files changed, 475 insertions(+), 13 deletions(-) create mode 100755 buildtgz create mode 100644 posterous.tgz create mode 100644 posterous/posterous-api.php create mode 100644 posterous/posterous.css create mode 100644 posterous/posterous.php diff --git a/Makefile b/Makefile index 0780ee67..8dd9f543 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,4 @@ -# Build addons packages -SRC = buglink fortunate nsfw sniper uhremotestorage \ - calc impressum oembed statusnet widgets \ - communityhome js_upload piwik tictac wppost \ - convert ldapauth poormancron tumblr \ - facebook membersince randplace twitter -DESTS = $(addsuffix .tgz,$(SRC)) +all: + @./buildtgz -all: $(DESTS) - -%.tgz: % - @echo -n Creating $@... - @tar czf $@ $< - @echo " Done." \ No newline at end of file diff --git a/buildtgz b/buildtgz new file mode 100755 index 00000000..dec535dd --- /dev/null +++ b/buildtgz @@ -0,0 +1,22 @@ +#!/bin/sh +# Make doesn't handle subdirs very well +# without providing a Makefile in each one. +# So we will just manually find any source +# directories which contain any files that +# are newer than are .tgz file and rebuild +# it if any are found + +SUBDIRS=`ls -d [a-z]*/ | tr -d /` +for a in $SUBDIRS; do + TGZ=$a.tgz + if [[ ! -f $TGZ ]]; then + echo "Building: " $TGZ + tar zcvf $TGZ $a + else + TOUCHED=`find $a -cnewer $TGZ` + if [[ -n $TOUCHED ]]; then + echo "Building: " $TGZ + tar zcvf $TGZ $a + fi + fi +done diff --git a/posterous.tgz b/posterous.tgz new file mode 100644 index 0000000000000000000000000000000000000000..cbb5c24e26e7bc6cf19f19416864fc6ff4a978c0 GIT binary patch literal 4387 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 dKkH}xte^F>e%8user = $user; + $this->pass = $pass; + } + + /* Reading Methods - http://posterous.com/api/reading */ + function getsites() { + $api_method = 'getsites'; + $xml = $this->_call( $api_method ); + return $xml; + } + + function readposts($args) { + $api_method = 'readposts'; + + $valid_args = array('hostname','site_id','num_posts','page','tag'); + $method_args = $this->_validate($args, $valid_args); + + $xml = $this->_call( $api_method, $method_args ); + return $xml; + } + + function gettags($args) { + $api_method = 'gettags'; + + $valid_args = array('hostname','site_id'); + $method_args = $this->_validate($args, $valid_args); + + $xml = $this->_call( $api_method, $method_args ); + return $xml; + } + + /* Posting Methods - http://posterous.com/api/posting */ + function newpost($args) { + $api_method = 'newpost'; + + if (!$this->_auth()) { + throw new PosterousException('Posterous API call "' . $api_method . '" requires authentication.'); + } + + $valid_args = array('site_id','media','title','body','autopost','private','date','tags','source','sourceLink'); + $method_args = $this->_validate($args, $valid_args); + + $xml = $this->_call( $api_method, $method_args ); + return $xml; + } + + function updatepost($args) { + $api_method = 'updatepost'; + + if (!$this->_auth()) { + throw new PosterousException('Posterous API call "' . $api_method . '" requires authentication.'); + } + + $valid_args = array('post_id','media','title','body'); + $method_args = $this->_validate($args, $valid_args); + + $xml = $this->_call( $api_method, $method_args ); + return $xml; + } + + function newcomment($args) { + $api_method = 'newcomment'; + + $valid_args = array('post_id','comment','name','email','date'); + $method_args = $this->_validate($args, $valid_args); + + $xml = $this->_call( $api_method, $method_args ); + return $xml; + } + + /* Post.ly Methods - http://posterous.com/api/postly */ + + function getpost($args) { + $api_method = 'getpost'; + + $valid_args = array('id'); + $method_args = $this->_validate($args, $valid_args); + + $xml = $this->_call( $api_method, $method_args ); + return $xml; + } + + /* Twitter Methods - http://posterous.com/api/twitter */ + function upload() { + $api_method = 'upload'; + + $valid_args = array('username','password','media','message','body','source','sourceLink'); + $method_args = $this->_validate( $args, $method_args ); + + $xml = $this->_call( $api_method, $method_args ); + return $xml; + } + + function uploadAndPost() { + $api_method = 'uploadAndPost'; + + $valid_args = array('username','password','media','message','body','source','sourceLink'); + $method_args = $this->_validate( $args, $method_args ); + + $xml = $this->_call( $api_method, $method_args ); + return $xml; + } + + + /* Helper Functions */ + private function _call($api_method, $method_args = NULL) { + $method_url = POSTEROUS_API_URL . $api_method; + + $user = $this->user(); + $pass = $this->pass(); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $method_url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($ch, CURLOPT_HEADER, false); + curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + + if (isset($user) && isset($pass) && $user != '' && $pass != '') { + curl_setopt($ch, CURLOPT_USERPWD, $user . ':' . $pass); + } + + curl_setopt($ch, CURLOPT_POST, 1); + + if ( is_array($method_args) && !empty($method_args) ) { + curl_setopt($ch, CURLOPT_POSTFIELDS, $method_args); + } + + $data = curl_exec($ch); + //$response_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); + curl_close($ch); + + $xml = ''; + try { + $xml = new SimpleXMLElement($data); + + $response_status = $xml['stat']; + if ($response_status == 'ok') { + return $xml; + } + elseif ($response_status == 'fail') { + throw new PosterousException('Error Code ' . $xml->err['code'] . ': ' . $xml->err['msg']); + } + else { + throw new PosterousException('Error: Invalid Posterous response status.'); + } + } + catch (Exception $e) { + throw $e; + } + } + + private function _validate($args, $valid_args) { + $method_args = array(); + foreach($args as $key => $value) { + if( in_array($key, $valid_args) ) { + $method_args[$key] = $value; + } + } + + return $method_args; + } + + private function _auth() { + //checks if object has user & password, does not verify w/ Posterous + if (isset($this->user) && isset($this->pass) && $this->user != '' && $this->pass != '') { + return TRUE; + } + else { + return FALSE; + } + } + + /* Getters & Setters */ + function user($user = NULL) { + if ($user) { + $this->user = $user; + } + return $this->user; + } + + function pass($pass = NULL) { + if ($pass) { + $this->pass = $pass; + } + return $this->pass; + } +} + +?> diff --git a/posterous/posterous.css b/posterous/posterous.css new file mode 100644 index 00000000..06202aa5 --- /dev/null +++ b/posterous/posterous.css @@ -0,0 +1,16 @@ + +#posterous-enable-label, #posterous-username-label, #posterous-password-label, #posterous-bydefault-label { + float: left; + width: 200px; + margin-top: 10px; +} + +#posterous-checkbox, #posterous-username, #posterous-password, #posterous-bydefault { + float: left; + margin-top: 10px; +} + +#posterous-submit { + margin-top: 15px; +} + diff --git a/posterous/posterous.php b/posterous/posterous.php new file mode 100644 index 00000000..639042b8 --- /dev/null +++ b/posterous/posterous.php @@ -0,0 +1,187 @@ + + */ + +function posterous_install() { + register_hook('post_local', 'addon/posterous/posterous.php', 'posterous_post_local'); + register_hook('notifier_normal', 'addon/posterous/posterous.php', 'posterous_send'); + register_hook('jot_networks', 'addon/posterous/posterous.php', 'posterous_jot_nets'); + register_hook('connector_settings', 'addon/posterous/posterous.php', 'posterous_settings'); + register_hook('connector_settings_post', 'addon/posterous/posterous.php', 'posterous_settings_post'); + +} +function posterous_uninstall() { + unregister_hook('post_local', 'addon/posterous/posterous.php', 'posterous_post_local'); + unregister_hook('notifier_normal', 'addon/posterous/posterous.php', 'posterous_send'); + unregister_hook('jot_networks', 'addon/posterous/posterous.php', 'posterous_jot_nets'); + unregister_hook('connector_settings', 'addon/posterous/posterous.php', 'posterous_settings'); + unregister_hook('connector_settings_post', 'addon/posterous/posterous.php', 'posterous_settings_post'); +} + + +function posterous_jot_nets(&$a,&$b) { + if(! local_user()) + return; + + $pstr_post = get_pconfig(local_user(),'posterous','post'); + if(intval($pstr_post) == 1) { + $pstr_defpost = get_pconfig(local_user(),'posterous','post_by_default'); + $selected = ((intval($pstr_defpost) == 1) ? ' checked="checked" ' : ''); + $b .= '
' + . t('Post to Posterous') . '
'; + } +} + + +function posterous_settings(&$a,&$s) { + + if(! local_user()) + return; + + /* Add our stylesheet to the page so we can make our settings look nice */ + + $a->page['htmlhead'] .= '' . "\r\n"; + + /* Get the current state of our config variables */ + + $enabled = get_pconfig(local_user(),'posterous','post'); + + $checked = (($enabled) ? ' checked="checked" ' : ''); + + $def_enabled = get_pconfig(local_user(),'posterous','post_by_default'); + + $def_checked = (($def_enabled) ? ' checked="checked" ' : ''); + + $pstr_username = get_pconfig(local_user(), 'posterous', 'posterous_username'); + $pstr_password = get_pconfig(local_user(), 'posterous', 'posterous_password'); + + + /* Add some HTML to the existing form */ + + $s .= '
'; + $s .= '

' . t('Posterous Post Settings') . '

'; + $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; + + $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; + + $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; + + $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; + + /* provide a submit button */ + + $s .= '
'; + +} + + +function posterous_settings_post(&$a,&$b) { + + if(x($_POST,'posterous-submit')) { + + set_pconfig(local_user(),'posterous','post',intval($_POST['posterous'])); + set_pconfig(local_user(),'posterous','post_by_default',intval($_POST['posterous_bydefault'])); + set_pconfig(local_user(),'posterous','posterous_username',trim($_POST['posterous_username'])); + set_pconfig(local_user(),'posterous','posterous_password',trim($_POST['posterous_password'])); + + } + +} + +function posterous_post_local(&$a,&$b) { + + // This can probably be changed to allow editing by pointing to a different API endpoint + + if($b['edit']) + return; + + if((! local_user()) || (local_user() != $b['uid'])) + return; + + if($b['private'] || $b['parent']) + return; + + $pstr_post = intval(get_pconfig(local_user(),'posterous','post')); + + $pstr_enable = (($pstr_post && x($_REQUEST,'posterous_enable')) ? intval($_REQUEST['posterous_enable']) : 0); + + if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'posterous','post_by_default'))) + $pstr_enable = 1; + + if(! $pstr_enable) + return; + + if(strlen($b['postopts'])) + $b['postopts'] .= ','; + $b['postopts'] .= 'posterous'; +} + + + + +function posterous_send(&$a,&$b) { + + if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited'])) + return; + + if(! strstr($b['postopts'],'posterous')) + return; + + if($b['parent'] != $b['id']) + return; + + + $pstr_username = get_pconfig($b['uid'],'posterous','posterous_username'); + $pstr_password = get_pconfig($b['uid'],'posterous','posterous_password'); + $pstr_blog = 'http://www.posterous.com/api/write'; + + if($pstr_username && $pstr_password && $pstr_blog) { + + require_once('include/bbcode.php'); + require_once('posterous-api.php'); + $tag_arr = array(); + $tags = ''; + $x = preg_match_all('/\#\[(.*?)\](.*?)\[/',$b['tag'],$matches,PREG_SET_ORDER); + + if($x) { + foreach($matches as $mtch) { + $tag_arr[] = $mtch[2]; + } + } + if(count($tag_arr)) + $tags = implode(',',$tag_arr); + + + $params = array( + 'title' => (($b['title']) ? $b['title'] : t('Post from Friendica')), + 'type' => 'regular', + 'autopost' => 1, + 'source' => 'Friendica', + 'is_private' => false, + 'tags' => $tags, + 'body' => bbcode($b['body']) + ); + + $api = new PosterousAPI($pstr_username,$pstr_password); + + $result = $api->newpost($params); + logger('posterous_send: ' . $result); + } +} +