2015-10-11 21:07:40 +02:00
< ? php
2017-11-26 03:30:56 +01:00
2015-10-11 21:07:40 +02:00
/**
* Name : IFTTT Receiver
* Description : Receives a post from https :// ifttt . com / and distributes it .
* Version : 0.1
* Author : Michael Vogel < https :// pirati . ca / profile / heluecht >
*/
2017-11-26 03:30:56 +01:00
use Friendica\App ;
2020-07-14 16:17:17 +02:00
use Friendica\Content\PageInfo ;
2018-12-26 08:28:16 +01:00
use Friendica\Core\Hook ;
2018-10-30 00:40:18 +01:00
use Friendica\Core\Logger ;
2018-08-11 22:40:48 +02:00
use Friendica\Core\Protocol ;
2018-07-20 14:20:48 +02:00
use Friendica\Database\DBA ;
2019-12-16 01:05:14 +01:00
use Friendica\DI ;
2018-06-16 08:46:25 +02:00
use Friendica\Model\Item ;
2020-12-13 14:07:12 +01:00
use Friendica\Model\Post ;
2018-11-08 17:45:19 +01:00
use Friendica\Util\Strings ;
2017-11-07 00:55:24 +01:00
2017-11-26 03:30:56 +01:00
function ifttt_install ()
{
2018-12-26 08:28:16 +01:00
Hook :: register ( 'connector_settings' , 'addon/ifttt/ifttt.php' , 'ifttt_settings' );
Hook :: register ( 'connector_settings_post' , 'addon/ifttt/ifttt.php' , 'ifttt_settings_post' );
2015-10-11 21:07:40 +02:00
}
2017-11-26 03:30:56 +01:00
function ifttt_module ()
{
2015-10-11 21:07:40 +02:00
}
2017-11-26 03:30:56 +01:00
function ifttt_content ()
{
2015-10-11 21:07:40 +02:00
2017-11-26 03:30:56 +01:00
}
function ifttt_settings ( App $a , & $s )
{
if ( ! local_user ()) {
return ;
}
2015-10-11 21:07:40 +02:00
2020-01-18 16:50:56 +01:00
$key = DI :: pConfig () -> get ( local_user (), 'ifttt' , 'key' );
2015-10-11 21:07:40 +02:00
if ( ! $key ) {
2018-11-08 17:45:19 +01:00
$key = Strings :: getRandomHex ( 20 );
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( local_user (), 'ifttt' , 'key' , $key );
2015-10-11 21:07:40 +02:00
}
$s .= '<span id="settings_ifttt_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_ifttt_expanded\'); openClose(\'settings_ifttt_inflated\');">' ;
2020-01-18 20:52:33 +01:00
$s .= '<img class="connector" src="addon/ifttt/ifttt.png" /><h3 class="connector">' . DI :: l10n () -> t ( 'IFTTT Mirror' ) . '</h3>' ;
2017-11-26 03:30:56 +01:00
$s .= '</span>' ;
$s .= '<div id="settings_ifttt_expanded" class="settings-block" style="display: none;">' ;
$s .= '<span class="fakelink" onclick="openClose(\'settings_ifttt_expanded\'); openClose(\'settings_ifttt_inflated\');">' ;
2020-01-18 20:52:33 +01:00
$s .= '<img class="connector" src="addon/ifttt/ifttt.png" /><h3 class="connector">' . DI :: l10n () -> t ( 'IFTTT Mirror' ) . '</h3>' ;
2017-11-26 03:30:56 +01:00
$s .= '</span>' ;
$s .= '<div id="ifttt-configuration-wrapper">' ;
2020-01-18 20:52:33 +01:00
$s .= '<p>' . DI :: l10n () -> t ( 'Create an account at <a href="http://www.ifttt.com">IFTTT</a>. Create three Facebook recipes that are connected with <a href="https://ifttt.com/maker">Maker</a> (In the form "if Facebook then Maker") with the following parameters:' ) . '</p>' ;
2015-10-11 21:07:40 +02:00
$s .= '<h4>URL</h4>' ;
2021-08-09 17:29:26 +02:00
$s .= '<p>' . DI :: baseUrl () -> get () . '/ifttt/' . $a -> getUserNickname () . '</p>' ;
2015-10-11 21:07:40 +02:00
$s .= '<h4>Method</h4>' ;
$s .= '<p>POST</p>' ;
$s .= '<h4>Content Type</h4>' ;
$s .= '<p>application/x-www-form-urlencoded</p>' ;
2020-01-18 20:52:33 +01:00
$s .= '<h4>' . DI :: l10n () -> t ( 'Body for "new status message"' ) . '</h4>' ;
2017-11-26 03:30:56 +01:00
$s .= '<p><code>' . htmlentities ( 'key=' . $key . '&type=status&msg=<<<{{Message}}>>>&date=<<<{{UpdatedAt}}>>>&url=<<<{{PageUrl}}>>>' ) . '</code></p>' ;
2020-01-18 20:52:33 +01:00
$s .= '<h4>' . DI :: l10n () -> t ( 'Body for "new photo upload"' ) . '</h4>' ;
2017-11-26 03:30:56 +01:00
$s .= '<p><code>' . htmlentities ( 'key=' . $key . '&type=photo&link=<<<{{Link}}>>>&image=<<<{{ImageSource}}>>>&msg=<<<{{Caption}}>>>&date=<<<{{CreatedAt}}>>>&url=<<<{{PageUrl}}>>>' ) . '</code></p>' ;
2020-01-18 20:52:33 +01:00
$s .= '<h4>' . DI :: l10n () -> t ( 'Body for "new link post"' ) . '</h4>' ;
2017-11-26 03:30:56 +01:00
$s .= '<p><code>' . htmlentities ( 'key=' . $key . '&type=link&link=<<<{{Link}}>>>&title=<<<{{Title}}>>>&msg=<<<{{Message}}>>>&description=<<<{{Description}}>>>&date=<<<{{CreatedAt}}>>>&url=<<<{{PageUrl}}>>>' ) . '</code></p>' ;
$s .= '</div><div class="clear"></div>' ;
$s .= '<div id="ifttt-rekey-wrapper">' ;
2020-01-18 20:52:33 +01:00
$s .= '<label id="ifttt-rekey-label" for="ifttt-checkbox">' . DI :: l10n () -> t ( 'Generate new key' ) . '</label>' ;
2017-11-26 03:30:56 +01:00
$s .= '<input id="ifttt-checkbox" type="checkbox" name="ifttt-rekey" value="1" />' ;
$s .= '</div><div class="clear"></div>' ;
2015-10-11 21:07:40 +02:00
2020-01-18 20:52:33 +01:00
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="ifttt-submit" class="settings-submit" value="' . DI :: l10n () -> t ( 'Save Settings' ) . '" /></div>' ;
2017-11-26 03:30:56 +01:00
$s .= '</div>' ;
2015-10-11 21:07:40 +02:00
}
2017-11-26 03:30:56 +01:00
function ifttt_settings_post ()
{
2018-11-30 15:11:56 +01:00
if ( ! empty ( $_POST [ 'ifttt-submit' ]) && isset ( $_POST [ 'ifttt-rekey' ])) {
2020-01-18 16:56:45 +01:00
DI :: pConfig () -> delete ( local_user (), 'ifttt' , 'key' );
2017-11-26 03:30:56 +01:00
}
2015-10-11 21:07:40 +02:00
}
2017-11-26 03:30:56 +01:00
function ifttt_post ( App $a )
{
2021-07-25 14:29:43 +02:00
if ( DI :: args () -> getArgc () != 2 ) {
2015-10-11 21:07:40 +02:00
return ;
2017-11-26 03:30:56 +01:00
}
2015-10-11 21:07:40 +02:00
2021-07-25 14:29:43 +02:00
$nickname = DI :: args () -> getArgv ()[ 1 ];
2015-10-11 21:07:40 +02:00
2018-07-20 14:20:48 +02:00
$user = DBA :: selectFirst ( 'user' , [ 'uid' ], [ 'nickname' => $nickname ]);
2018-07-21 14:46:13 +02:00
if ( ! DBA :: isResult ( $user )) {
2018-10-30 14:48:09 +01:00
Logger :: log ( 'User ' . $nickname . ' not found.' , Logger :: DEBUG );
2015-10-11 21:07:40 +02:00
return ;
}
2017-11-26 03:30:56 +01:00
$uid = $user [ 'uid' ];
2015-10-11 21:07:40 +02:00
2018-10-30 14:48:09 +01:00
Logger :: log ( 'Received a post for user ' . $uid . ' from ifttt ' . print_r ( $_REQUEST , true ), Logger :: DEBUG );
2015-10-11 21:07:40 +02:00
2017-11-26 03:30:56 +01:00
if ( ! isset ( $_REQUEST [ 'key' ])) {
2018-10-30 00:40:18 +01:00
Logger :: log ( 'No key found.' );
2015-10-11 21:07:40 +02:00
return ;
}
2017-11-26 03:30:56 +01:00
$key = $_REQUEST [ 'key' ];
2015-10-11 21:07:40 +02:00
// Check the key
2020-01-18 16:50:56 +01:00
if ( $key != DI :: pConfig () -> get ( $uid , 'ifttt' , 'key' )) {
2018-10-30 14:48:09 +01:00
Logger :: log ( 'Invalid key for user ' . $uid , Logger :: DEBUG );
2015-10-11 21:07:40 +02:00
return ;
}
2018-01-15 14:15:33 +01:00
$item = [];
2015-10-11 21:07:40 +02:00
2017-11-26 03:30:56 +01:00
if ( isset ( $_REQUEST [ 'type' ])) {
$item [ 'type' ] = $_REQUEST [ 'type' ];
}
2015-10-11 21:07:40 +02:00
2018-01-15 14:15:33 +01:00
if ( ! in_array ( $item [ 'type' ], [ 'status' , 'link' , 'photo' ])) {
2018-10-30 14:48:09 +01:00
Logger :: log ( 'Unknown item type ' . $item [ 'type' ], Logger :: DEBUG );
2015-10-11 21:07:40 +02:00
return ;
}
2017-11-26 03:30:56 +01:00
if ( isset ( $_REQUEST [ 'link' ])) {
$item [ 'link' ] = trim ( $_REQUEST [ 'link' ]);
}
if ( isset ( $_REQUEST [ 'image' ])) {
$item [ 'image' ] = trim ( $_REQUEST [ 'image' ]);
}
if ( isset ( $_REQUEST [ 'title' ])) {
$item [ 'title' ] = trim ( $_REQUEST [ 'title' ]);
}
if ( isset ( $_REQUEST [ 'msg' ])) {
$item [ 'msg' ] = trim ( $_REQUEST [ 'msg' ]);
}
if ( isset ( $_REQUEST [ 'description' ])) {
$item [ 'description' ] = trim ( $_REQUEST [ 'description' ]);
}
if ( isset ( $_REQUEST [ 'date' ])) {
$item [ 'date' ] = date ( 'c' , strtotime ( $date = str_replace ( ' at ' , ', ' , $_REQUEST [ 'date' ])));
}
if ( isset ( $_REQUEST [ 'url' ])) {
$item [ 'url' ] = trim ( $_REQUEST [ 'url' ]);
}
if (( substr ( $item [ 'msg' ], 0 , 3 ) == '<<<' ) && ( substr ( $item [ 'msg' ], - 3 , 3 ) == '>>>' )) {
$item [ 'msg' ] = substr ( $item [ 'msg' ], 3 , - 3 );
}
2015-10-11 21:07:40 +02:00
ifttt_message ( $uid , $item );
}
2017-11-26 03:30:56 +01:00
function ifttt_message ( $uid , $item )
{
2020-01-04 23:42:00 +01:00
$a = DI :: app ();
2015-10-11 21:07:40 +02:00
2020-12-13 14:07:12 +01:00
$post = [];
$post [ 'uid' ] = $uid ;
$post [ 'app' ] = 'IFTTT' ;
$post [ 'title' ] = '' ;
$post [ 'body' ] = $item [ 'msg' ];
//$post['date'] = $item['date'];
//$post['uri'] = $item['url'];
2017-11-26 03:30:56 +01:00
if ( $item [ 'type' ] == 'link' ) {
2020-12-13 14:07:12 +01:00
$link = $item [ 'link' ];
2020-07-14 16:17:17 +02:00
$data = PageInfo :: queryUrl ( $item [ 'link' ]);
2015-10-11 21:07:40 +02:00
2017-11-26 03:30:56 +01:00
if ( isset ( $item [ 'title' ]) && ( trim ( $item [ 'title' ]) != '' )) {
$data [ 'title' ] = $item [ 'title' ];
}
2015-10-11 21:07:40 +02:00
2017-11-26 03:30:56 +01:00
if ( isset ( $item [ 'description' ]) && ( trim ( $item [ 'description' ]) != '' )) {
$data [ 'text' ] = $item [ 'description' ];
}
2015-10-11 21:07:40 +02:00
2020-12-13 14:07:12 +01:00
$post [ 'body' ] .= " \n " . PageInfo :: getFooterFromData ( $data );
2017-11-26 03:30:56 +01:00
} elseif (( $item [ 'type' ] == 'photo' ) && ( $item [ 'image' ] != '' )) {
2020-12-13 14:07:12 +01:00
$link = $item [ 'image' ];
$post [ 'body' ] .= " \n \n [img] " . $item [ 'image' ] . " [/img] \n " ;
} elseif ( ! empty ( $item [ 'url' ])) {
$link = $item [ 'url' ];
} else {
$link = hash ( 'ripemd128' , $item [ 'msg' ]);
2017-11-26 03:30:56 +01:00
}
2015-10-11 21:07:40 +02:00
2020-12-13 14:07:12 +01:00
Post\Delayed :: add ( $link , $post , PRIORITY_MEDIUM , true );
2015-10-11 21:07:40 +02:00
}