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 00000000..cbb5c24e Binary files /dev/null and b/posterous.tgz differ diff --git a/posterous/posterous-api.php b/posterous/posterous-api.php new file mode 100644 index 00000000..b9dd7d9c --- /dev/null +++ b/posterous/posterous-api.php @@ -0,0 +1,248 @@ +user = $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); + } +} +