2011-10-05 11:20:17 +02:00
< ? php
2018-03-25 06:08:19 +02:00
2011-10-05 11:20:17 +02:00
/**
* Name : NSFW
* Description : Collapse posts with inappropriate content
* Version : 1.0
* Author : Mike Macgirvin < http :// macgirvin . com / profile / mike >
2018-01-15 14:15:33 +01:00
*
2011-10-05 11:20:17 +02:00
*/
2018-12-26 08:28:16 +01:00
use Friendica\Core\Hook ;
2018-01-22 20:03:11 +01:00
use Friendica\Core\L10n ;
2019-12-30 03:55:10 +01:00
use Friendica\DI ;
2017-11-07 00:55:24 +01:00
2018-01-22 20:03:11 +01:00
function nsfw_install ()
{
2018-12-26 08:28:16 +01:00
Hook :: register ( 'prepare_body_content_filter' , 'addon/nsfw/nsfw.php' , 'nsfw_prepare_body_content_filter' , 10 );
Hook :: register ( 'addon_settings' , 'addon/nsfw/nsfw.php' , 'nsfw_addon_settings' );
Hook :: register ( 'addon_settings_post' , 'addon/nsfw/nsfw.php' , 'nsfw_addon_settings_post' );
2011-10-05 11:20:17 +02:00
}
2018-01-22 20:03:11 +01:00
function nsfw_uninstall ()
{
2018-12-26 08:28:16 +01:00
Hook :: unregister ( 'prepare_body_content_filter' , 'addon/nsfw/nsfw.php' , 'nsfw_prepare_body_content_filter' );
Hook :: unregister ( 'prepare_body' , 'addon/nsfw/nsfw.php' , 'nsfw_prepare_body' );
Hook :: unregister ( 'addon_settings' , 'addon/nsfw/nsfw.php' , 'nsfw_addon_settings' );
Hook :: unregister ( 'addon_settings_post' , 'addon/nsfw/nsfw.php' , 'nsfw_addon_settings_post' );
2011-10-14 05:53:24 +02:00
}
2018-01-15 14:15:33 +01:00
// This function isn't perfect and isn't trying to preserve the html structure - it's just a
// quick and dirty filter to pull out embedded photo blobs because 'nsfw' seems to come up
2012-09-17 02:42:36 +02:00
// inside them quite often. We don't need anything fancy, just pull out the data blob so we can
2018-01-15 14:15:33 +01:00
// check against the rest of the body.
2018-01-22 20:03:11 +01:00
function nsfw_extract_photos ( $body )
{
2012-09-17 02:42:36 +02:00
$new_body = '' ;
2018-01-15 14:15:33 +01:00
2018-03-15 10:00:09 +01:00
$img_start = strpos ( $body , 'src="data:' );
$img_end = (( $img_start !== false ) ? strpos ( substr ( $body , $img_start ), '>' ) : false );
2012-09-17 02:42:36 +02:00
$cnt = 0 ;
2018-03-25 06:08:19 +02:00
while ( $img_end !== false ) {
2012-09-17 02:42:36 +02:00
$img_end += $img_start ;
2018-03-15 10:00:09 +01:00
$new_body = $new_body . substr ( $body , 0 , $img_start );
2018-01-15 14:15:33 +01:00
2012-09-17 02:42:36 +02:00
$cnt ++ ;
2018-03-15 10:00:09 +01:00
$body = substr ( $body , 0 , $img_end );
2012-09-17 02:42:36 +02:00
2018-03-15 10:00:09 +01:00
$img_start = strpos ( $body , 'src="data:' );
$img_end = (( $img_start !== false ) ? strpos ( substr ( $body , $img_start ), '>' ) : false );
2012-09-17 02:42:36 +02:00
}
2018-03-15 10:00:09 +01:00
if ( ! $cnt ) {
2012-09-17 02:42:36 +02:00
return $body ;
2018-03-15 10:00:09 +01:00
}
2012-09-17 02:42:36 +02:00
return $new_body ;
}
2011-10-14 05:53:24 +02:00
2018-03-15 10:00:09 +01:00
function nsfw_addon_settings ( & $a , & $s )
{
if ( ! local_user ()) {
2011-10-14 05:53:24 +02:00
return ;
2018-03-15 10:00:09 +01:00
}
2011-10-14 05:53:24 +02:00
2018-03-15 10:00:09 +01:00
/* Add our stylesheet to the page so we can make our settings look nice */
2011-10-14 05:53:24 +02:00
2019-12-30 21:53:43 +01:00
DI :: page ()[ 'htmlhead' ] .= '<link rel="stylesheet" type="text/css" href="' . DI :: baseUrl () -> get () . '/addon/nsfw/nsfw.css' . '" media="all" />' . " \r \n " ;
2011-10-14 05:53:24 +02:00
2020-01-18 16:50:56 +01:00
$enable_checked = ( intval ( DI :: pConfig () -> get ( local_user (), 'nsfw' , 'disable' )) ? '' : ' checked="checked" ' );
$words = DI :: pConfig () -> get ( local_user (), 'nsfw' , 'words' );
2018-03-15 10:00:09 +01:00
if ( ! $words ) {
2011-10-14 05:53:24 +02:00
$words = 'nsfw,' ;
2018-03-15 10:00:09 +01:00
}
2011-10-14 05:53:24 +02:00
2018-03-15 10:00:09 +01:00
$s .= '<span id="settings_nsfw_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_nsfw_expanded\'); openClose(\'settings_nsfw_inflated\');">' ;
2020-01-18 20:52:33 +01:00
$s .= '<h3>' . DI :: l10n () -> t ( 'Content Filter (NSFW and more)' ) . '</h3>' ;
2018-03-15 10:00:09 +01:00
$s .= '</span>' ;
$s .= '<div id="settings_nsfw_expanded" class="settings-block" style="display: none;">' ;
$s .= '<span class="fakelink" onclick="openClose(\'settings_nsfw_expanded\'); openClose(\'settings_nsfw_inflated\');">' ;
2020-01-18 20:52:33 +01:00
$s .= '<h3>' . DI :: l10n () -> t ( 'Content Filter (NSFW and more)' ) . '</h3>' ;
2018-03-15 10:00:09 +01:00
$s .= '</span>' ;
$s .= '<div id="nsfw-wrapper">' ;
2020-01-18 20:52:33 +01:00
$s .= '<p>' . DI :: l10n () -> t ( 'This addon searches for specified words/text in posts and collapses them. It can be used to filter content tagged with for instance #NSFW that may be deemed inappropriate at certain times or places, such as being at work. It is also useful for hiding irrelevant or annoying content from direct view.' ) . '</p>' ;
$s .= '<label id="nsfw-enable-label" for="nsfw-enable">' . DI :: l10n () -> t ( 'Enable Content filter' ) . ' </label>' ;
2018-03-15 10:00:09 +01:00
$s .= '<input id="nsfw-enable" type="checkbox" name="nsfw-enable" value="1"' . $enable_checked . ' />' ;
2012-02-04 12:56:55 +01:00
$s .= '<div class="clear"></div>' ;
2020-01-18 20:52:33 +01:00
$s .= '<label id="nsfw-label" for="nsfw-words">' . DI :: l10n () -> t ( 'Comma separated list of keywords to hide' ) . ' </label>' ;
2018-03-25 06:08:19 +02:00
$s .= '<textarea id="nsfw-words" type="text" name="nsfw-words">' . $words . '</textarea>' ;
2018-03-15 10:00:09 +01:00
$s .= '</div><div class="clear"></div>' ;
2011-10-14 05:53:24 +02:00
2020-01-18 20:52:33 +01:00
$s .= '<div class="settings-submit-wrapper" ><input type="submit" id="nsfw-submit" name="nsfw-submit" class="settings-submit" value="' . DI :: l10n () -> t ( 'Save Settings' ) . '" /></div>' ;
$s .= '<div class="nsfw-desc">' . DI :: l10n () -> t ( 'Use /expression/ to provide regular expressions' ) . '</div></div>' ;
2011-10-14 05:53:24 +02:00
return ;
}
2018-03-15 10:00:09 +01:00
function nsfw_addon_settings_post ( & $a , & $b )
{
if ( ! local_user ()) {
2011-10-14 05:53:24 +02:00
return ;
2018-03-15 10:00:09 +01:00
}
2011-10-14 05:53:24 +02:00
2018-08-08 08:24:47 +02:00
if ( ! empty ( $_POST [ 'nsfw-submit' ])) {
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( local_user (), 'nsfw' , 'words' , trim ( $_POST [ 'nsfw-words' ]));
2018-11-30 15:11:56 +01:00
$enable = ( ! empty ( $_POST [ 'nsfw-enable' ]) ? intval ( $_POST [ 'nsfw-enable' ]) : 0 );
2018-03-25 06:08:19 +02:00
$disable = 1 - $enable ;
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( local_user (), 'nsfw' , 'disable' , $disable );
2020-01-18 20:52:33 +01:00
info ( DI :: l10n () -> t ( 'NSFW Settings saved.' ) . EOL );
2011-10-14 05:53:24 +02:00
}
2011-10-05 11:20:17 +02:00
}
2018-04-05 04:51:44 +02:00
function nsfw_prepare_body_content_filter ( \Friendica\App $a , & $hook_data )
2018-03-15 10:00:09 +01:00
{
2011-10-14 05:53:24 +02:00
$words = null ;
2020-01-18 16:50:56 +01:00
if ( DI :: pConfig () -> get ( local_user (), 'nsfw' , 'disable' )) {
2012-02-04 12:56:55 +01:00
return ;
2018-03-15 09:44:00 +01:00
}
2018-03-15 10:00:09 +01:00
if ( local_user ()) {
2020-01-18 16:50:56 +01:00
$words = DI :: pConfig () -> get ( local_user (), 'nsfw' , 'words' );
2011-10-14 05:53:24 +02:00
}
2018-03-25 06:08:19 +02:00
2018-03-15 10:00:09 +01:00
if ( $words ) {
2018-03-25 06:08:19 +02:00
$word_list = explode ( ',' , $words );
2018-03-15 10:00:09 +01:00
} else {
2018-03-25 06:08:19 +02:00
$word_list = [ 'nsfw' ];
2011-10-14 05:53:24 +02:00
}
$found = false ;
2018-03-25 06:08:19 +02:00
if ( count ( $word_list )) {
2018-04-01 08:32:08 +02:00
$body = $hook_data [ 'item' ][ 'title' ] . " \n " . nsfw_extract_photos ( $hook_data [ 'item' ][ 'body' ]);
2012-09-17 02:42:36 +02:00
2018-03-25 06:08:19 +02:00
foreach ( $word_list as $word ) {
2012-05-11 06:35:48 +02:00
$word = trim ( $word );
2018-03-15 10:00:09 +01:00
if ( ! strlen ( $word )) {
2011-10-14 05:53:24 +02:00
continue ;
}
2018-03-25 06:20:16 +02:00
2018-04-01 08:32:08 +02:00
$tag_search = false ;
2018-03-25 06:20:16 +02:00
switch ( $word [ 0 ]) {
case '/' ; // Regular expression
$found = preg_match ( $word , $body );
break ;
case '#' : // Hashtag-only search
2018-04-01 08:32:08 +02:00
$tag_search = true ;
$found = nsfw_find_word_in_item_tags ( $hook_data [ 'item' ][ 'hashtags' ], substr ( $word , 1 ));
2012-02-02 08:40:16 +01:00
break ;
2018-03-25 06:20:16 +02:00
default :
2018-04-01 08:32:08 +02:00
$found = stripos ( $body , $word ) !== false || nsfw_find_word_in_item_tags ( $hook_data [ 'item' ][ 'tags' ], $word );
2012-02-02 08:40:16 +01:00
break ;
2018-03-25 06:20:16 +02:00
}
if ( $found ) {
break ;
2018-01-15 14:15:33 +01:00
}
}
2011-10-14 05:53:24 +02:00
}
2018-01-22 20:03:11 +01:00
if ( $found ) {
2018-04-01 08:32:08 +02:00
if ( $tag_search ) {
2020-01-18 20:52:33 +01:00
$hook_data [ 'filter_reasons' ][] = DI :: l10n () -> t ( 'Filtered tag: %s' , $word );
2018-04-01 08:32:08 +02:00
} else {
2020-01-18 20:52:33 +01:00
$hook_data [ 'filter_reasons' ][] = DI :: l10n () -> t ( 'Filtered word: %s' , $word );
2018-04-01 08:32:08 +02:00
}
2011-10-05 11:20:17 +02:00
}
2011-10-14 05:53:24 +02:00
}
2018-03-25 06:20:16 +02:00
function nsfw_find_word_in_item_tags ( $item_tags , $word )
{
if ( is_array ( $item_tags )) {
foreach ( $item_tags as $tag ) {
if ( stripos ( $tag , '>' . $word . '<' ) !== false ) {
return true ;
}
}
}
return false ;
}