2014-01-13 01:30:01 +01:00
< ? php
/**
* Name : Diaspora Post Connector
* Description : Post to Diaspora
2017-01-11 01:34:13 +01:00
* Version : 0.2
2014-01-13 01:30:01 +01:00
* Author : Michael Vogel < heluecht @ pirati . ca >
*/
2018-01-22 20:03:11 +01:00
require_once 'addon/diaspora/Diaspora_Connection.php' ;
2017-01-11 01:34:13 +01:00
2018-07-24 01:04:06 +02:00
use Friendica\App ;
2018-03-05 03:58:58 +01:00
use Friendica\Content\Text\BBCode ;
2018-12-26 08:28:16 +01:00
use Friendica\Core\Hook ;
2018-10-30 00:40:18 +01:00
use Friendica\Core\Logger ;
2020-05-07 06:16:40 +02:00
use Friendica\Core\Renderer ;
use Friendica\Core\Session ;
2018-07-20 14:20:48 +02:00
use Friendica\Database\DBA ;
2019-04-04 16:14:55 +02:00
use Friendica\Core\Worker ;
2019-12-16 00:47:24 +01:00
use Friendica\DI ;
2021-05-01 10:59:14 +02:00
use Friendica\Model\Post ;
2017-11-07 00:55:24 +01:00
2018-07-24 01:04:06 +02:00
function diaspora_install ()
{
2018-12-26 08:28:16 +01:00
Hook :: register ( 'hook_fork' , 'addon/diaspora/diaspora.php' , 'diaspora_hook_fork' );
Hook :: register ( 'post_local' , 'addon/diaspora/diaspora.php' , 'diaspora_post_local' );
Hook :: register ( 'notifier_normal' , 'addon/diaspora/diaspora.php' , 'diaspora_send' );
Hook :: register ( 'jot_networks' , 'addon/diaspora/diaspora.php' , 'diaspora_jot_nets' );
Hook :: register ( 'connector_settings' , 'addon/diaspora/diaspora.php' , 'diaspora_settings' );
Hook :: register ( 'connector_settings_post' , 'addon/diaspora/diaspora.php' , 'diaspora_settings_post' );
2014-01-13 01:30:01 +01:00
}
2018-07-24 01:04:06 +02:00
2019-03-25 03:44:50 +01:00
function diaspora_jot_nets ( App $a , array & $jotnets_fields )
2018-07-24 01:04:06 +02:00
{
if ( ! local_user ()) {
return ;
}
2020-01-18 16:50:56 +01:00
if ( DI :: pConfig () -> get ( local_user (), 'diaspora' , 'post' )) {
2019-03-25 03:44:50 +01:00
$jotnets_fields [] = [
'type' => 'checkbox' ,
'field' => [
'diaspora_enable' ,
2020-01-18 20:52:33 +01:00
DI :: l10n () -> t ( 'Post to Diaspora' ),
2020-01-18 16:50:56 +01:00
DI :: pConfig () -> get ( local_user (), 'diaspora' , 'post_by_default' )
2019-03-25 03:44:50 +01:00
]
];
2018-07-24 01:04:06 +02:00
}
2014-01-13 01:30:01 +01:00
}
2021-11-21 23:10:13 +01:00
function diaspora_settings ( App $a , array & $data )
2018-07-24 01:04:06 +02:00
{
2021-11-21 23:10:13 +01:00
if ( ! local_user ()) {
2014-01-18 22:06:41 +01:00
return ;
2018-07-24 01:04:06 +02:00
}
2014-01-18 22:06:41 +01:00
2021-11-21 23:10:13 +01:00
$enabled = DI :: pConfig () -> get ( local_user (), 'diaspora' , 'post' , false );
$def_enabled = DI :: pConfig () -> get ( local_user (), 'diaspora' , 'post_by_default' );
2014-01-13 01:30:01 +01:00
2021-11-21 23:10:13 +01:00
$handle = DI :: pConfig () -> get ( local_user (), 'diaspora' , 'handle' );
2020-01-18 16:50:56 +01:00
$password = DI :: pConfig () -> get ( local_user (), 'diaspora' , 'password' );
2021-11-21 23:10:13 +01:00
$aspect = DI :: pConfig () -> get ( local_user (), 'diaspora' , 'aspect' );
2014-01-13 01:30:01 +01:00
2021-11-21 23:10:13 +01:00
$info = '' ;
2020-05-07 06:16:40 +02:00
$error = '' ;
if ( Session :: get ( 'my_address' )) {
$info = DI :: l10n () -> t ( 'Please remember: You can always be reached from Diaspora with your Friendica handle <strong>%s</strong>. ' , Session :: get ( 'my_address' ));
$info .= DI :: l10n () -> t ( 'This connector is only meant if you still want to use your old Diaspora account for some time. ' );
$info .= DI :: l10n () -> t ( 'However, it is preferred that you tell your Diaspora contacts the new handle <strong>%s</strong> instead.' , Session :: get ( 'my_address' ));
2017-01-11 01:34:13 +01:00
}
2014-01-13 01:30:01 +01:00
2020-05-07 06:16:40 +02:00
$aspect_select = '' ;
2017-06-09 03:20:27 +02:00
if ( $handle && $password ) {
2017-01-11 01:34:13 +01:00
$conn = new Diaspora_Connection ( $handle , $password );
$conn -> logIn ();
2020-05-07 06:16:40 +02:00
$rawAspects = $conn -> getAspects ();
if ( $rawAspects ) {
$availableAspects = [
'all_aspects' => DI :: l10n () -> t ( 'All aspects' ),
2021-11-21 23:10:13 +01:00
'public' => DI :: l10n () -> t ( 'Public' ),
2020-05-07 06:16:40 +02:00
];
foreach ( $rawAspects as $rawAspect ) {
$availableAspects [ $rawAspect -> id ] = $rawAspect -> name ;
}
$aspect_select = [ 'aspect' , DI :: l10n () -> t ( 'Post to aspect:' ), $aspect , '' , $availableAspects ];
2021-11-21 23:10:13 +01:00
$info = DI :: l10n () -> t ( 'Connected with your Diaspora account <strong>%s</strong>' , $handle );
2020-05-07 06:16:40 +02:00
} else {
2021-11-21 23:10:13 +01:00
$info = '' ;
2020-05-07 06:16:40 +02:00
$error = DI :: l10n () -> t ( " Can't login to your Diaspora account. Please check handle (in the format user@domain.tld) and password. " );
2017-01-11 01:34:13 +01:00
}
}
2014-01-13 01:30:01 +01:00
2021-11-21 23:10:13 +01:00
$t = Renderer :: getMarkupTemplate ( 'connector_settings.tpl' , 'addon/diaspora/' );
$html = Renderer :: replaceMacros ( $t , [
'$l10n' => [
'info_header' => DI :: l10n () -> t ( 'Information' ),
'error_header' => DI :: l10n () -> t ( 'Error' ),
],
'$info' => $info ,
'$error' => $error ,
'$enabled' => [ 'enabled' , DI :: l10n () -> t ( 'Enable Diaspora Post Addon' ), $enabled ],
'$handle' => [ 'handle' , DI :: l10n () -> t ( 'Diaspora handle' ), $handle , null , null , 'placeholder="user@domain.tld"' ],
'$password' => [ 'password' , DI :: l10n () -> t ( 'Diaspora password' ), '' , DI :: l10n () -> t ( 'Privacy notice: Your Diaspora password will be stored unencrypted to authenticate you with your Diaspora pod. This means your Friendica node administrator can have access to it.' )],
'$aspect_select' => $aspect_select ,
'$post_by_default' => [ 'post_by_default' , DI :: l10n () -> t ( 'Post to Diaspora by default' ), $def_enabled ],
2020-05-07 06:16:40 +02:00
]);
2021-11-21 23:10:13 +01:00
$data = [
'connector' => 'diaspora' ,
'title' => DI :: l10n () -> t ( 'Diaspora Export' ),
'image' => 'images/diaspora-logo.png' ,
'enabled' => $enabled ,
'html' => $html ,
];
2014-01-13 01:30:01 +01:00
}
2018-07-24 01:04:06 +02:00
function diaspora_settings_post ( App $a , & $b )
{
if ( ! empty ( $_POST [ 'diaspora-submit' ])) {
2020-05-07 06:16:40 +02:00
DI :: pConfig () -> set ( local_user (), 'diaspora' , 'post' , intval ( $_POST [ 'enabled' ]));
if ( intval ( $_POST [ 'enabled' ])) {
if ( isset ( $_POST [ 'handle' ])) {
DI :: pConfig () -> set ( local_user (), 'diaspora' , 'handle' , trim ( $_POST [ 'handle' ]));
DI :: pConfig () -> set ( local_user (), 'diaspora' , 'password' , trim ( $_POST [ 'password' ]));
}
if ( ! empty ( $_POST [ 'aspect' ])) {
DI :: pConfig () -> set ( local_user (), 'diaspora' , 'aspect' , trim ( $_POST [ 'aspect' ]));
DI :: pConfig () -> set ( local_user (), 'diaspora' , 'post_by_default' , intval ( $_POST [ 'post_by_default' ]));
}
} else {
DI :: pConfig () -> delete ( local_user (), 'diaspora' , 'password' );
}
2014-01-13 01:30:01 +01:00
}
}
2018-11-10 17:20:19 +01:00
function diaspora_hook_fork ( & $a , & $b )
{
if ( $b [ 'name' ] != 'notifier_normal' ) {
return ;
}
$post = $b [ 'data' ];
if ( $post [ 'deleted' ] || $post [ 'private' ] || ( $post [ 'created' ] !== $post [ 'edited' ]) ||
! strstr ( $post [ 'postopts' ], 'diaspora' ) || ( $post [ 'parent' ] != $post [ 'id' ])) {
$b [ 'execute' ] = false ;
return ;
}
}
2018-07-24 01:04:06 +02:00
function diaspora_post_local ( App $a , array & $b )
{
2017-09-06 18:16:33 +02:00
if ( $b [ 'edit' ]) {
2014-01-13 01:30:01 +01:00
return ;
2017-09-06 18:16:33 +02:00
}
2014-01-13 01:30:01 +01:00
2017-09-06 18:16:33 +02:00
if ( ! local_user () || ( local_user () != $b [ 'uid' ])) {
2014-01-13 01:30:01 +01:00
return ;
2017-09-06 18:16:33 +02:00
}
2014-01-13 01:30:01 +01:00
2017-09-06 18:16:33 +02:00
if ( $b [ 'private' ] || $b [ 'parent' ]) {
2014-01-13 01:30:01 +01:00
return ;
2017-09-06 18:16:33 +02:00
}
2014-01-13 01:30:01 +01:00
2020-01-18 16:50:56 +01:00
$diaspora_post = intval ( DI :: pConfig () -> get ( local_user (), 'diaspora' , 'post' ));
2014-01-13 01:30:01 +01:00
2018-11-30 15:11:56 +01:00
$diaspora_enable = (( $diaspora_post && ! empty ( $_REQUEST [ 'diaspora_enable' ])) ? intval ( $_REQUEST [ 'diaspora_enable' ]) : 0 );
2014-01-13 01:30:01 +01:00
2020-01-18 16:50:56 +01:00
if ( $b [ 'api_source' ] && intval ( DI :: pConfig () -> get ( local_user (), 'diaspora' , 'post_by_default' ))) {
2014-01-13 01:30:01 +01:00
$diaspora_enable = 1 ;
2017-09-06 18:16:33 +02:00
}
2014-01-13 01:30:01 +01:00
2017-09-06 18:16:33 +02:00
if ( ! $diaspora_enable ) {
return ;
}
if ( strlen ( $b [ 'postopts' ])) {
$b [ 'postopts' ] .= ',' ;
}
2014-01-13 01:30:01 +01:00
2017-09-06 18:16:33 +02:00
$b [ 'postopts' ] .= 'diaspora' ;
2014-01-13 01:30:01 +01:00
}
2018-07-24 01:04:06 +02:00
function diaspora_send ( App $a , array & $b )
{
2019-12-16 00:47:24 +01:00
$hostname = DI :: baseUrl () -> getHostname ();
2014-01-13 01:30:01 +01:00
2021-10-21 08:04:27 +02:00
Logger :: notice ( 'diaspora_send: invoked' );
2014-01-13 01:30:01 +01:00
2018-07-24 01:04:06 +02:00
if ( $b [ 'deleted' ] || $b [ 'private' ] || ( $b [ 'created' ] !== $b [ 'edited' ])) {
2014-01-13 01:30:01 +01:00
return ;
2018-01-10 04:27:40 +01:00
}
2014-01-13 01:30:01 +01:00
2018-07-24 01:04:06 +02:00
if ( ! strstr ( $b [ 'postopts' ], 'diaspora' )) {
2014-01-13 01:30:01 +01:00
return ;
2018-01-10 04:27:40 +01:00
}
2014-01-13 01:30:01 +01:00
2018-07-24 01:04:06 +02:00
if ( $b [ 'parent' ] != $b [ 'id' ]) {
2014-01-13 01:30:01 +01:00
return ;
2018-01-10 04:27:40 +01:00
}
2014-01-13 01:30:01 +01:00
2021-05-01 10:59:14 +02:00
$b [ 'body' ] = Post\Media :: addAttachmentsToBody ( $b [ 'uri-id' ], $b [ 'body' ]);
2017-11-26 00:56:18 +01:00
// Dont't post if the post doesn't belong to us.
// This is a check for forum postings
2018-07-20 14:20:48 +02:00
$self = DBA :: selectFirst ( 'contact' , [ 'id' ], [ 'uid' => $b [ 'uid' ], 'self' => true ]);
2018-07-24 01:04:06 +02:00
2017-11-26 00:56:18 +01:00
if ( $b [ 'contact-id' ] != $self [ 'id' ]) {
return ;
}
2021-10-21 08:04:27 +02:00
Logger :: info ( 'diaspora_send: prepare posting' );
2014-01-13 01:30:01 +01:00
2020-01-18 16:50:56 +01:00
$handle = DI :: pConfig () -> get ( $b [ 'uid' ], 'diaspora' , 'handle' );
$password = DI :: pConfig () -> get ( $b [ 'uid' ], 'diaspora' , 'password' );
$aspect = DI :: pConfig () -> get ( $b [ 'uid' ], 'diaspora' , 'aspect' );
2014-01-13 01:30:01 +01:00
2017-01-11 01:34:13 +01:00
if ( $handle && $password ) {
2021-10-21 08:04:27 +02:00
Logger :: info ( 'diaspora_send: all values seem to be okay' );
2014-01-13 01:30:01 +01:00
$title = $b [ 'title' ];
$body = $b [ 'body' ];
// Insert a newline before and after a quote
$body = str_ireplace ( " [quote " , " \n \n [quote " , $body );
$body = str_ireplace ( " [/quote] " , " [/quote] \n \n " , $body );
// Removal of tags and mentions
// #-tags
$body = preg_replace ( '/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i' , '#$2' , $body );
// @-mentions
$body = preg_replace ( '/@\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i' , '@$2' , $body );
// remove multiple newlines
do {
$oldbody = $body ;
2018-07-24 01:04:06 +02:00
$body = str_replace ( " \n \n \n " , " \n \n " , $body );
} while ( $oldbody != $body );
2014-01-13 01:30:01 +01:00
// convert to markdown
2018-03-05 03:58:58 +01:00
$body = BBCode :: toMarkdown ( $body );
2014-01-13 01:30:01 +01:00
// Adding the title
2018-07-24 01:04:06 +02:00
if ( strlen ( $title )) {
2014-01-13 01:30:01 +01:00
$body = " ## " . html_entity_decode ( $title ) . " \n \n " . $body ;
2018-07-24 01:04:06 +02:00
}
2014-01-13 01:30:01 +01:00
2018-07-24 01:04:06 +02:00
require_once " addon/diaspora/diasphp.php " ;
2014-01-13 01:30:01 +01:00
try {
2021-10-21 08:04:27 +02:00
Logger :: info ( 'diaspora_send: prepare' );
2017-01-11 01:34:13 +01:00
$conn = new Diaspora_Connection ( $handle , $password );
2021-10-21 08:04:27 +02:00
Logger :: info ( 'diaspora_send: try to log in ' . $handle );
2017-01-11 01:34:13 +01:00
$conn -> logIn ();
2021-10-21 08:04:27 +02:00
Logger :: info ( 'diaspora_send: try to send ' . $body );
2014-01-13 01:30:01 +01:00
2017-01-11 01:34:13 +01:00
$conn -> provider = $hostname ;
$conn -> postStatusMessage ( $body , $aspect );
2014-01-13 01:30:01 +01:00
2021-10-21 08:04:27 +02:00
Logger :: notice ( 'diaspora_send: success' );
2014-01-13 01:30:01 +01:00
} catch ( Exception $e ) {
2021-10-21 08:04:27 +02:00
Logger :: notice ( " diaspora_send: Error submitting the post: " . $e -> getMessage ());
2014-01-13 01:30:01 +01:00
2021-10-21 08:04:27 +02:00
Logger :: info ( 'diaspora_send: requeueing ' . $b [ 'uid' ]);
2014-01-13 01:30:01 +01:00
2019-04-04 16:14:55 +02:00
Worker :: defer ();
2014-01-13 01:30:01 +01:00
}
}
}