2011-10-05 09:20:17 +00:00
< ? php
/**
* Name : NSFW
* Description : Collapse posts with inappropriate content
* Version : 1.0
* Author : Mike Macgirvin < http :// macgirvin . com / profile / mike >
2018-01-15 13:15:33 +00:00
*
2011-10-05 09:20:17 +00:00
*/
2018-01-17 00:51:12 +00:00
use Friendica\Core\Addon ;
2018-01-22 19:03:11 +00:00
use Friendica\Core\L10n ;
2017-11-06 23:55:24 +00:00
use Friendica\Core\PConfig ;
2018-01-22 19:03:11 +00:00
function nsfw_install ()
{
2018-01-17 00:51:12 +00:00
Addon :: registerHook ( 'prepare_body' , 'addon/nsfw/nsfw.php' , 'nsfw_prepare_body' , 10 );
2018-01-20 13:57:41 +00:00
Addon :: registerHook ( 'addon_settings' , 'addon/nsfw/nsfw.php' , 'nsfw_addon_settings' );
Addon :: registerHook ( 'addon_settings_post' , 'addon/nsfw/nsfw.php' , 'nsfw_addon_settings_post' );
2011-10-05 09:20:17 +00:00
}
2018-01-22 19:03:11 +00:00
function nsfw_uninstall ()
{
2018-01-17 00:51:12 +00:00
Addon :: unregisterHook ( 'prepare_body' , 'addon/nsfw/nsfw.php' , 'nsfw_prepare_body' );
2018-01-20 13:57:41 +00:00
Addon :: unregisterHook ( 'addon_settings' , 'addon/nsfw/nsfw.php' , 'nsfw_addon_settings' );
Addon :: unregisterHook ( 'addon_settings_post' , 'addon/nsfw/nsfw.php' , 'nsfw_addon_settings_post' );
2011-10-14 03:53:24 +00:00
}
2018-01-15 13:15:33 +00: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 00:42:36 +00:00
// inside them quite often. We don't need anything fancy, just pull out the data blob so we can
2018-01-15 13:15:33 +00:00
// check against the rest of the body.
2018-01-22 19:03:11 +00:00
function nsfw_extract_photos ( $body )
{
2012-09-17 00:42:36 +00:00
$new_body = '' ;
2018-01-15 13:15:33 +00:00
2012-09-17 00:42:36 +00:00
$img_start = strpos ( $body , 'src="data:' );
$img_end = (( $img_start !== false ) ? strpos ( substr ( $body , $img_start ), '>' ) : false );
$cnt = 0 ;
while ( $img_end !== false ) {
$img_end += $img_start ;
$new_body = $new_body . substr ( $body , 0 , $img_start );
2018-01-15 13:15:33 +00:00
2012-09-17 00:42:36 +00:00
$cnt ++ ;
$body = substr ( $body , 0 , $img_end );
$img_start = strpos ( $body , 'src="data:' );
$img_end = (( $img_start !== false ) ? strpos ( substr ( $body , $img_start ), '>' ) : false );
}
if ( ! $cnt )
return $body ;
return $new_body ;
}
2011-10-14 03:53:24 +00:00
function nsfw_addon_settings ( & $a , & $s ) {
if ( ! local_user ())
return ;
/* Add our stylesheet to the page so we can make our settings look nice */
$a -> page [ 'htmlhead' ] .= '<link rel="stylesheet" type="text/css" href="' . $a -> get_baseurl () . '/addon/nsfw/nsfw.css' . '" media="all" />' . " \r \n " ;
2017-11-06 23:55:24 +00:00
$enable_checked = ( intval ( PConfig :: get ( local_user (), 'nsfw' , 'disable' )) ? '' : ' checked="checked" ' );
$words = PConfig :: get ( local_user (), 'nsfw' , 'words' );
2011-10-14 03:53:24 +00:00
if ( ! $words )
$words = 'nsfw,' ;
2013-11-30 20:21:57 +00:00
$s .= '<span id="settings_nsfw_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_nsfw_expanded\'); openClose(\'settings_nsfw_inflated\');">' ;
2018-01-22 19:03:11 +00:00
$s .= '<h3>' . L10n :: t ( 'Not Safe For Work (General Purpose Content Filter)' ) . '</h3>' ;
2013-11-30 20:21:57 +00: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\');">' ;
2018-01-22 19:03:11 +00:00
$s .= '<h3>' . L10n :: t ( 'Not Safe For Work (General Purpose Content Filter)' ) . '</h3>' ;
2013-11-30 20:21:57 +00:00
$s .= '</span>' ;
2011-10-14 03:53:24 +00:00
$s .= '<div id="nsfw-wrapper">' ;
2018-01-22 19:30:13 +00:00
$s .= '<p>' . L10n :: t ( 'This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter.' ) . '</p>' ;
2018-01-22 19:03:11 +00:00
$s .= '<label id="nsfw-enable-label" for="nsfw-enable">' . L10n :: t ( 'Enable Content filter' ) . ' </label>' ;
2012-02-04 11:56:55 +00:00
$s .= '<input id="nsfw-enable" type="checkbox" name="nsfw-enable" value="1"' . $enable_checked . ' />' ;
$s .= '<div class="clear"></div>' ;
2018-01-22 19:03:11 +00:00
$s .= '<label id="nsfw-label" for="nsfw-words">' . L10n :: t ( 'Comma separated list of keywords to hide' ) . ' </label>' ;
2015-12-12 15:39:27 +00:00
$s .= '<textarea id="nsfw-words" type="text" name="nsfw-words">' . $words . '</textarea>' ;
2011-10-14 03:53:24 +00:00
$s .= '</div><div class="clear"></div>' ;
2018-01-22 19:03:11 +00:00
$s .= '<div class="settings-submit-wrapper" ><input type="submit" id="nsfw-submit" name="nsfw-submit" class="settings-submit" value="' . L10n :: t ( 'Save Settings' ) . '" /></div>' ;
$s .= '<div class="nsfw-desc">' . L10n :: t ( 'Use /expression/ to provide regular expressions' ) . '</div></div>' ;
2011-10-14 03:53:24 +00:00
return ;
}
function nsfw_addon_settings_post ( & $a , & $b ) {
if ( ! local_user ())
return ;
if ( $_POST [ 'nsfw-submit' ]) {
2017-11-06 23:55:24 +00:00
PConfig :: set ( local_user (), 'nsfw' , 'words' , trim ( $_POST [ 'nsfw-words' ]));
2012-02-04 11:56:55 +00:00
$enable = (( x ( $_POST , 'nsfw-enable' )) ? intval ( $_POST [ 'nsfw-enable' ]) : 0 );
$disable = 1 - $enable ;
2017-11-06 23:55:24 +00:00
PConfig :: set ( local_user (), 'nsfw' , 'disable' , $disable );
2018-01-22 19:03:11 +00:00
info ( L10n :: t ( 'NSFW Settings saved.' ) . EOL );
2011-10-14 03:53:24 +00:00
}
2011-10-05 09:20:17 +00:00
}
function nsfw_prepare_body ( & $a , & $b ) {
2011-10-14 03:53:24 +00:00
2012-09-17 00:42:36 +00:00
2011-10-14 03:53:24 +00:00
$words = null ;
2017-11-06 23:55:24 +00:00
if ( PConfig :: get ( local_user (), 'nsfw' , 'disable' ))
2012-02-04 11:56:55 +00:00
return ;
2011-10-14 03:53:24 +00:00
if ( local_user ()) {
2017-11-06 23:55:24 +00:00
$words = PConfig :: get ( local_user (), 'nsfw' , 'words' );
2011-10-14 03:53:24 +00:00
}
if ( $words ) {
$arr = explode ( ',' , $words );
}
else {
2018-01-15 13:15:33 +00:00
$arr = [ 'nsfw' ];
2011-10-14 03:53:24 +00:00
}
$found = false ;
if ( count ( $arr )) {
2012-09-17 00:42:36 +00:00
2013-06-26 10:49:07 +00:00
$body = $b [ 'item' ][ 'title' ] . " \n " . nsfw_extract_photos ( $b [ 'html' ]);
2012-09-17 00:42:36 +00:00
2011-10-14 03:53:24 +00:00
foreach ( $arr as $word ) {
2012-05-11 04:35:48 +00:00
$word = trim ( $word );
if ( ! strlen ( $word )) {
2011-10-14 03:53:24 +00:00
continue ;
}
2012-02-02 07:40:16 +00:00
if ( strpos ( $word , '/' ) === 0 ) {
2012-09-17 00:42:36 +00:00
if ( preg_match ( $word , $body )) {
2012-02-02 07:40:16 +00:00
$found = true ;
break ;
}
2011-10-14 03:53:24 +00:00
}
2012-02-02 07:40:16 +00:00
else {
2012-09-17 00:42:36 +00:00
if ( stristr ( $body , $word )) {
2012-02-02 07:40:16 +00:00
$found = true ;
break ;
}
2013-07-09 00:41:48 +00:00
if ( is_array ( $b [ 'item' ][ 'tags' ]) && count ( $b [ 'item' ][ 'tags' ])) {
foreach ( $b [ 'item' ][ 'tags' ] as $t ) {
if ( stristr ( $t , '>' . $word . '<' )) {
$found = true ;
break ;
}
}
2012-02-02 07:40:16 +00:00
}
2018-01-15 13:15:33 +00:00
}
}
2011-10-14 03:53:24 +00:00
}
2018-01-22 19:03:11 +00:00
if ( $found ) {
2011-10-05 09:20:17 +00:00
$rnd = random_string ( 8 );
2018-01-24 03:59:20 +00:00
$b [ 'html' ] = '<div id="nsfw-wrap-' . $rnd . '" class="fakelink" onclick=openClose(\'nsfw-' . $rnd . '\'); >' . L10n :: t ( '%s - Click to open/close' , $word ) . '</div><div id="nsfw-' . $rnd . '" style="display: none; " >' . $b [ 'html' ] . '</div>' ;
2011-10-05 09:20:17 +00:00
}
2011-10-14 03:53:24 +00:00
}