Version 4.0.13.1
This commit is contained in:
1 parent
f9e857d255
commit
c6a86f0d9b
7517 files changed
+597400
-668041
No files matched your search
Whitespace-only changes.
@@ -0,0 +1,170 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief logs
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Chat
|
||||
* @since 15 Mar 2015
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\chat\modules\admin\chat;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* logs
|
||||
*/
|
||||
class _logs extends \IPS\Dispatcher\Controller
|
||||
{
|
||||
/**
|
||||
* Execute
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function execute()
|
||||
{
|
||||
\IPS\Dispatcher::i()->checkAcpPermission( 'logs_manage' );
|
||||
parent::execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show logs
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function manage()
|
||||
{
|
||||
/* Create the table */
|
||||
$table = new \IPS\Helpers\Table\Db( 'chat_log_archive', \IPS\Http\Url::internal( 'app=chat&module=chat&controller=logs' ) );
|
||||
$table->langPrefix = 'chatlog_';
|
||||
|
||||
/* Column stuff */
|
||||
$table->include = array( 'log_time', 'log_user', 'log_message' );
|
||||
$table->mainColumn = 'log_message';
|
||||
$table->widths = array( 'log_time' => '20', 'log_user' => '20', 'log_message' => '60' );
|
||||
|
||||
/* Sort stuff */
|
||||
$table->sortBy = $table->sortBy ?: 'log_time';
|
||||
$table->sortDirection = $table->sortDirection ?: 'desc';
|
||||
|
||||
/* Search */
|
||||
$table->quickSearch = 'log_message';
|
||||
$table->advancedSearch = array(
|
||||
'log_user' => \IPS\Helpers\Table\SEARCH_CONTAINS_TEXT,
|
||||
'log_time' => \IPS\Helpers\Table\SEARCH_DATE_RANGE,
|
||||
);
|
||||
|
||||
/* Formatters */
|
||||
$self = $this;
|
||||
|
||||
$table->parsers = array(
|
||||
'log_time' => function( $val, $row )
|
||||
{
|
||||
$date = \IPS\DateTime::ts( $val );
|
||||
|
||||
return $date->localeDate() . ' ' . $date->localeTime( FALSE );
|
||||
},
|
||||
'log_user' => function( $val, $row ) use ( $self )
|
||||
{
|
||||
return $self->cleanMessage( $val );
|
||||
},
|
||||
'log_message' => function( $val, $row ) use ( $self )
|
||||
{
|
||||
$val = $self->cleanMessage( $val );
|
||||
|
||||
if( $row['log_code'] == 2 )
|
||||
{
|
||||
$_extra = explode( '_', $row['log_extra'] );
|
||||
|
||||
if( $_extra[0] == 1 )
|
||||
{
|
||||
$val = \IPS\Member::loggedIn()->language()->addToStack('chatlog__hasentered', FALSE, array( 'sprintf' => $row['log_user'] ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
$val = \IPS\Member::loggedIn()->language()->addToStack('chatlog__hasleft', FALSE, array( 'sprintf' => $row['log_user'] ) );
|
||||
}
|
||||
}
|
||||
else if( $row['log_code'] == 5 )
|
||||
{
|
||||
$val = \IPS\Member::loggedIn()->language()->addToStack('chatlog__kicked', FALSE, array( 'sprintf' => $val ) );
|
||||
}
|
||||
|
||||
if( mb_strpos( $val, '/me' ) === 0 )
|
||||
{
|
||||
$val = mb_substr( $val, 4 );
|
||||
}
|
||||
|
||||
if( mb_strpos( $row['log_extra'], 'private=' ) === 0 )
|
||||
{
|
||||
$_user = mb_substr( $row['log_extra'], mb_strrpos( $row['log_extra'], '=' ) + 1 );
|
||||
$_uid = $_user;
|
||||
|
||||
$_user = \IPS\Member::load( $_user );
|
||||
|
||||
$val = \IPS\Member::loggedIn()->language()->addToStack('chatlog__private', FALSE, array( 'sprintf' => array( $_user->name, $val ) ) );
|
||||
}
|
||||
|
||||
return $val;
|
||||
}
|
||||
);
|
||||
|
||||
/* Root buttons */
|
||||
\IPS\Output::i()->sidebar['actions']['settings'] = array(
|
||||
'title' => 'prunesettings',
|
||||
'icon' => 'cog',
|
||||
'link' => \IPS\Http\Url::internal( 'app=chat&module=chat&controller=logs&do=settings' ),
|
||||
'data' => array( 'ipsDialog' => '', 'ipsDialog-title' => \IPS\Member::loggedIn()->language()->addToStack('prunesettings') )
|
||||
);
|
||||
|
||||
/* Display */
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('ipschat_log_archive');
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'global', 'core' )->block( 'title', (string) $table );
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean "special" characters
|
||||
*
|
||||
* @param string String to clean
|
||||
* @return string Cleaned string
|
||||
*/
|
||||
public function cleanMessage( $string )
|
||||
{
|
||||
$string = str_replace( "__N__" , "\n", $string );
|
||||
$string = str_replace( "__C__" , ",", $string );
|
||||
$string = str_replace( "__E__" , "=", $string );
|
||||
$string = str_replace( "__PS__" , "+", $string );
|
||||
$string = str_replace( "__A__" , "&", $string );
|
||||
$string = str_replace( "__P__" , "%", $string );
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Settings
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function settings()
|
||||
{
|
||||
$form = new \IPS\Helpers\Form;
|
||||
$form->add( new \IPS\Helpers\Form\Number( 'ipchat_log_prune', \IPS\Settings::i()->ipchat_log_prune, FALSE, array( 'unlimited' => 0, 'unlimitedLang' => 'never' ), NULL, \IPS\Member::loggedIn()->language()->addToStack('after'), \IPS\Member::loggedIn()->language()->addToStack('days') ) );
|
||||
if ( $form->values() )
|
||||
{
|
||||
$form->saveAsSettings();
|
||||
|
||||
\IPS\Session::i()->log( 'acplog__chatlog_settings' );
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=chat&module=chat&controller=logs' ), 'saved' );
|
||||
}
|
||||
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'global', 'core' )->block( 'settings', $form, FALSE );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief settings
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Chat
|
||||
* @since 15 Mar 2015
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\chat\modules\admin\chat;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* settings
|
||||
*/
|
||||
class _settings extends \IPS\Dispatcher\Controller
|
||||
{
|
||||
/**
|
||||
* Execute
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function execute()
|
||||
{
|
||||
\IPS\Dispatcher::i()->checkAcpPermission( 'settings_manage' );
|
||||
parent::execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the settings form
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function manage()
|
||||
{
|
||||
$form = new \IPS\Helpers\Form;
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'ipchat_new_window', \IPS\Settings::i()->ipchat_new_window, TRUE ) );
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'ipschat_enable_rules', \IPS\Settings::i()->ipschat_enable_rules, TRUE, array( 'togglesOn' => array( 'ipschat_rules_id' ) ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\Translatable( 'ipschat_rules_text', NULL, FALSE, array( 'app' => 'core', 'key' => 'ipschat_rules', 'editor' => array( 'app' => 'core', 'key' => 'Admin', 'autoSaveKey' => 'ipschat_rules', 'attachIds' => array( NULL, NULL, 'ipschat_rules' ) ) ), NULL, NULL, NULL, 'ipschat_rules_id' ) );
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'ipchat_hide_usermessage', !\IPS\Settings::i()->ipchat_hide_usermessage, TRUE ) );
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'ipchat_no_buffer', \IPS\Settings::i()->ipchat_no_buffer, TRUE ) );
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\Number( 'ipchat_inactive_minutes', \IPS\Settings::i()->ipchat_inactive_minutes, TRUE, array(), NULL, NULL, \IPS\Member::loggedIn()->language()->addToStack('minutes') ) );
|
||||
$form->add( new \IPS\Helpers\Form\Select( 'ipchat_24hour', \IPS\Settings::i()->ipchat_24hour, TRUE, array( 'options' => array( '12' => 'chat_12hour', '24' => 'chat_24hour' ) ) ) );
|
||||
|
||||
if( \IPS\Settings::i()->ipschat_online )
|
||||
{
|
||||
$times = explode( ',', \IPS\Settings::i()->ipschat_online );
|
||||
|
||||
/* Do we need to adjust the time zone? */
|
||||
if( isset( $times[2] ) AND $times[2] != \IPS\Member::loggedIn()->timezone )
|
||||
{
|
||||
$start = new \IPS\DateTime( '2015-01-01 ' . $times[0], new \DateTimeZone( $times[2] ) );
|
||||
$start->setTimezone( new \DateTimeZone( \IPS\Member::loggedIn()->timezone ) );
|
||||
$times[0] = $start->format( 'H:i' );
|
||||
|
||||
$end = new \IPS\DateTime( '2015-01-01 ' . $times[1], new \DateTimeZone( $times[2] ) );
|
||||
$end->setTimezone( new \DateTimeZone( \IPS\Member::loggedIn()->timezone ) );
|
||||
$times[1] = $end->format( 'H:i' );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$times = array( 0 => '', 1 => '' );
|
||||
}
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\Custom( 'ipschat_online', $times, FALSE, array(
|
||||
'getHtml' => function( $element )
|
||||
{
|
||||
return \IPS\Theme::i()->getTemplate( 'settings' )->chatOnline( $element->value );
|
||||
},
|
||||
'formatValue' => function( $element )
|
||||
{
|
||||
$element->value[2] = \IPS\Member::loggedIn()->timezone;
|
||||
return $element->value;
|
||||
}
|
||||
), NULL, NULL, NULL, 'ipschat_online' ) );
|
||||
|
||||
if ( $values = $form->values( TRUE ) )
|
||||
{
|
||||
\IPS\Lang::saveCustom( 'chat', "ipschat_rules", $values['ipschat_rules_text'] );
|
||||
unset( $values['ipschat_rules_text'] );
|
||||
$values['ipchat_hide_usermessage'] = !$values['ipchat_hide_usermessage'];
|
||||
$form->saveAsSettings( $values );
|
||||
|
||||
/* Clear guest page caches */
|
||||
\IPS\Data\Cache::i()->clearAll();
|
||||
|
||||
\IPS\Session::i()->log( 'acplogs__chat_settings' );
|
||||
}
|
||||
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('menu__chat_chat_settings');
|
||||
\IPS\Output::i()->output .= \IPS\Theme::i()->getTemplate( 'global', 'core' )->block( 'menu__chat_chat_settings', $form );
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,246 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Action Controller
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Chat
|
||||
* @since 23 Mar 2015
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\chat\modules\front\chat;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Action Controller
|
||||
*/
|
||||
class _action extends \IPS\Content\Controller
|
||||
{
|
||||
/**
|
||||
* Init
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function execute()
|
||||
{
|
||||
parent::execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a user to the chat room
|
||||
*
|
||||
* @return void
|
||||
* @note Forum (local) user ID is in \IPS\Request::i()->id and Chat user ID is in \IPS\Request::i()->user
|
||||
*/
|
||||
protected function addUser()
|
||||
{
|
||||
$member = \IPS\Member::load( intval( \IPS\Request::i()->id ) );
|
||||
|
||||
$map = array(
|
||||
'user_id' => intval( \IPS\Request::i()->user ),
|
||||
'forumUserID' => intval( \IPS\Request::i()->id ),
|
||||
'prefix' => $member->group['prefix'],
|
||||
'suffix' => $member->group['suffix'],
|
||||
'photo' => $member->photo,
|
||||
'username' => $member->member_id ? $member->name : $member->loggedIn()->language()->get('guest'),
|
||||
'formattedUsername' => \IPS\Member\Group::load( $member->member_group_id )->formatName( $member->name ),
|
||||
'canBeIgnored' => $member->member_id ? !$member->group['gbw_cannot_be_ignored'] : 1,
|
||||
'canBypassBadwords' => $member->group['g_bypass_badwords'],
|
||||
'groupID' => $member->member_group_id,
|
||||
'profileUrl' => $member->url(),
|
||||
'canModerate' => $member->group['chat_moderate'],
|
||||
'seo_name' => $member->members_seo_name,
|
||||
'last_update' => time(),
|
||||
);
|
||||
|
||||
/* Update the chatters list */
|
||||
$chatters = ( isset( \IPS\Data\Store::i()->chatters ) ) ? \IPS\Data\Store::i()->chatters : array();
|
||||
$chatters[ $map['user_id'] ] = $map;
|
||||
|
||||
\IPS\Data\Store::i()->chatters = $chatters;
|
||||
|
||||
/* Output */
|
||||
\IPS\Output::i()->json( array(
|
||||
'html' => \IPS\Theme::i()->getTemplate( 'view' )->userRow( $map ),
|
||||
'user' => $map
|
||||
) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Load user info
|
||||
*
|
||||
* @return void
|
||||
* @note Forum (local) user ID is in \IPS\Request::i()->id
|
||||
*/
|
||||
protected function loadUserInfo()
|
||||
{
|
||||
\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate( 'view', 'chat' )->userInfo( \IPS\Member::load( intval( \IPS\Request::i()->id ) ) ), 200, 'text/html', \IPS\Output::i()->httpHeaders );
|
||||
}
|
||||
|
||||
/**
|
||||
* Ignore and unignore chats
|
||||
*
|
||||
* @return void
|
||||
* @note Forum (local) user ID is in \IPS\Request::i()->id
|
||||
*/
|
||||
protected function blockUser()
|
||||
{
|
||||
/* Make sure there is an ID */
|
||||
if( !\IPS\Request::i()->id )
|
||||
{
|
||||
\IPS\Output::i()->json( 'OK' );
|
||||
}
|
||||
|
||||
/* Make sure we can ignore this user */
|
||||
$user = \IPS\Member::load( \IPS\Request::i()->id );
|
||||
|
||||
if( $user->group['gbw_cannot_be_ignored'] )
|
||||
{
|
||||
\IPS\Output::i()->error( 'ipschat_no_ignore', '3H269/K', 403, '' );
|
||||
}
|
||||
|
||||
/* Update or insert the ignore */
|
||||
try
|
||||
{
|
||||
$existing = \IPS\Db::i()->select( '*', 'core_ignored_users', array( 'ignore_owner_id=? AND ignore_ignore_id=?', \IPS\Member::loggedIn()->member_id, \IPS\Request::i()->id ) )->first();
|
||||
|
||||
\IPS\Db::i()->update( 'core_ignored_users', array( 'ignore_chats' => $existing['ignore_chats'] ? 0 : 1 ), array( 'ignore_id=?', $existing['ignore_id'] ) );
|
||||
}
|
||||
catch( \UnderflowException $e )
|
||||
{
|
||||
\IPS\Db::i()->insert( 'core_ignored_users', array(
|
||||
'ignore_owner_id' => \IPS\Member::loggedIn()->member_id,
|
||||
'ignore_ignore_id' => intval( \IPS\Request::i()->id ),
|
||||
'ignore_chats' => 1
|
||||
) );
|
||||
}
|
||||
|
||||
\IPS\Output::i()->json( 'OK' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Ban user
|
||||
*
|
||||
* @return void
|
||||
* @note Forum (local) user ID is in \IPS\Request::i()->id
|
||||
*/
|
||||
protected function banUser()
|
||||
{
|
||||
/* Make sure there is an ID */
|
||||
if( !\IPS\Request::i()->id )
|
||||
{
|
||||
\IPS\Output::i()->json( 'OK' );
|
||||
}
|
||||
|
||||
/* Make sure we can moderate */
|
||||
if( !\IPS\Member::loggedIn()->group['chat_moderate'] )
|
||||
{
|
||||
\IPS\Output::i()->error( 'ipschat_no_ban', '3H269/L', 403, '' );
|
||||
}
|
||||
|
||||
/* Ban the user */
|
||||
$user = \IPS\Member::load( \IPS\Request::i()->id );
|
||||
$user->chat_banned = 1;
|
||||
$user->save();
|
||||
|
||||
/* Remove us from chatters list */
|
||||
$chatters = ( isset( \IPS\Data\Store::i()->chatters ) ) ? \IPS\Data\Store::i()->chatters : array();
|
||||
|
||||
foreach( $chatters as $uid => $chatter )
|
||||
{
|
||||
if( $chatter['forumUserID'] == $user->member_id )
|
||||
{
|
||||
unset( $chatters[ $uid ] );
|
||||
}
|
||||
}
|
||||
|
||||
\IPS\Data\Store::i()->chatters = $chatters;
|
||||
|
||||
\IPS\Output::i()->json( 'OK' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Ping to keep us in chatters list
|
||||
*
|
||||
* @return void
|
||||
* @note Forum (local) user ID is in \IPS\Request::i()->id
|
||||
*/
|
||||
protected function ping()
|
||||
{
|
||||
/* Make sure there is an ID */
|
||||
if( !\IPS\Request::i()->id )
|
||||
{
|
||||
\IPS\Output::i()->json( 'OK' );
|
||||
}
|
||||
|
||||
/* If the data store doesn't exist it was wiped, so recreate it */
|
||||
if( !isset( \IPS\Data\Store::i()->chatters ) )
|
||||
{
|
||||
$chatters = array();
|
||||
$options = $_SESSION['chatOptions'];
|
||||
|
||||
$result = \IPS\Http\Url::external( "http://{$options['serverHost']}{$options['serverPath']}/list.php?room={$options['roomId']}&user={$options['userId']}&access_key={$options['accessKey']}" )->request()->get();
|
||||
|
||||
if( $result )
|
||||
{
|
||||
$results = explode( "~~||~~", $result );
|
||||
$status = array_shift( $results );
|
||||
|
||||
if( $status == 1 )
|
||||
{
|
||||
foreach( $results as $k => $v )
|
||||
{
|
||||
$_thisRecord = explode( ',', $v );
|
||||
|
||||
if( !$_thisRecord[0] )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
$member = \IPS\Member::load( intval( $_thisRecord[2] ) );
|
||||
$username = str_replace( '~~#~~', ',', $_thisRecord[1] );
|
||||
|
||||
$chatters[ $_thisRecord[0] ] = array(
|
||||
'user_id' => $_thisRecord[0],
|
||||
'username' => htmlspecialchars( $username, ENT_QUOTES | \IPS\HTMLENTITIES, 'UTF-8', FALSE ),
|
||||
'forumUserID' => $member->member_id,
|
||||
'canBeIgnored' => $member->member_id ? !$member->group['gbw_cannot_be_ignored'] : 1,
|
||||
'canBypassBadwords' => $member->group['g_bypass_badwords'],
|
||||
'groupID' => $member->member_group_id,
|
||||
'prefix' => str_replace( '"', '__DBQ__', $member->group['prefix'] ),
|
||||
'suffix' => str_replace( '"', '__DBQ__', $member->group['suffix'] ),
|
||||
'photo' => $member->photo,
|
||||
'profileUrl' => $member->url(),
|
||||
'canModerate' => $member->group['chat_moderate'],
|
||||
'seo_name' => $member->members_seo_name,
|
||||
'last_update' => time(),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$chatters = \IPS\Data\Store::i()->chatters;
|
||||
}
|
||||
|
||||
/* Update us in chatters list - session will be auto-handled */
|
||||
if( isset( $chatters[ \IPS\Request::i()->id ] ) )
|
||||
{
|
||||
$chatters[ \IPS\Request::i()->id ]['last_update'] = time();
|
||||
|
||||
\IPS\Data\Store::i()->chatters = $chatters;
|
||||
}
|
||||
|
||||
/* Return a response */
|
||||
\IPS\Output::i()->json( 'OK' );
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,481 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief View File Controller
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Chat
|
||||
* @since 10 Oct 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\chat\modules\front\chat;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* View File Controller
|
||||
*/
|
||||
class _view extends \IPS\Content\Controller
|
||||
{
|
||||
/**
|
||||
* @brief Master chat server URL
|
||||
*/
|
||||
const MASTERSERVER = "http://chatservice.ipsdns.com/";
|
||||
|
||||
/**
|
||||
* Init
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function execute()
|
||||
{
|
||||
/* Check that the license allows access, etc. */
|
||||
$licenseData = \IPS\IPS::licenseKey();
|
||||
|
||||
if( !$licenseData )
|
||||
{
|
||||
\IPS\Output::i()->error( 'ipschat_no_license', '4H268/1', 500, 'ipschat_no_license_admin' );
|
||||
}
|
||||
|
||||
if( !isset( $licenseData['chat_limit'] ) OR $licenseData['chat_limit'] < 1 )
|
||||
{
|
||||
\IPS\Output::i()->error( 'ipschat_no_license', '4H269/1', 500, 'ipschat_no_license_access' );
|
||||
}
|
||||
|
||||
/* Group access check */
|
||||
if( !\IPS\Member::loggedIn()->group['chat_access'] )
|
||||
{
|
||||
\IPS\Output::i()->error( 'ipschat_no_group_access', '2H269/2', 403, '' );
|
||||
}
|
||||
|
||||
/* Is this a guest that was blocked? */
|
||||
if( !\IPS\Member::loggedIn()->member_id AND isset( \IPS\Request::i()->cookie['chat_blocked'] ) AND \IPS\Request::i()->cookie['chat_blocked'] )
|
||||
{
|
||||
\IPS\Output::i()->error( 'ipschat_no_access', '2H269/3', 403, '' );
|
||||
}
|
||||
|
||||
/* Or a member? */
|
||||
if( \IPS\Member::loggedIn()->chat_banned )
|
||||
{
|
||||
\IPS\Output::i()->error( 'ipschat_no_access', '2H269/5', 403, '' );
|
||||
}
|
||||
|
||||
/* Spiders also do not have access */
|
||||
if( \IPS\Session\Front::i()->userAgent->spider )
|
||||
{
|
||||
\IPS\Output::i()->error( 'ipschat_no_access', '2H269/4', 403, '' );
|
||||
}
|
||||
|
||||
/* Figure out if chat is online due to time restrictions */
|
||||
if( \IPS\Settings::i()->ipschat_online )
|
||||
{
|
||||
$times = explode( ',', \IPS\Settings::i()->ipschat_online );
|
||||
|
||||
if( count( $times ) AND $times[0] )
|
||||
{
|
||||
/* Do we need to adjust the time zone? */
|
||||
if( isset( $times[2] ) AND $times[2] != \IPS\Member::loggedIn()->timezone )
|
||||
{
|
||||
$start = new \IPS\DateTime( '2015-01-01 ' . $times[0], new \DateTimeZone( $times[2] ) );
|
||||
$start->setTimezone( new \DateTimeZone( \IPS\Member::loggedIn()->timezone ) );
|
||||
$times[0] = $start->format( 'H:i' );
|
||||
|
||||
$end = new \IPS\DateTime( '2015-01-01 ' . $times[1], new \DateTimeZone( $times[2] ) );
|
||||
$end->setTimezone( new \DateTimeZone( \IPS\Member::loggedIn()->timezone ) );
|
||||
$times[1] = $end->format( 'H:i' );
|
||||
}
|
||||
|
||||
$currentTime = new \IPS\DateTime( NULL, new \DateTimeZone( ( isset( $times[2] ) ) ? $times[2] : \IPS\Member::loggedIn()->timezone ) );
|
||||
$currentTime->setTimezone( new \DateTimeZone( \IPS\Member::loggedIn()->timezone ) );
|
||||
$currentTime = $currentTime->format( 'H:i' );
|
||||
|
||||
/* Convert times to floats, as that is simple to compare */
|
||||
$start = str_replace( ':', '.', $times[0] );
|
||||
$end = str_replace( ':', '.', $times[1] );
|
||||
$currentTime = str_replace( ':', '.', $currentTime );
|
||||
|
||||
if( $end > $start )
|
||||
{
|
||||
if( !( $currentTime >= $start ) OR !( $currentTime < $end ) )
|
||||
{
|
||||
\IPS\Output::i()->error( \IPS\Member::loggedIn()->language()->addToStack( 'chat_currently_offline', FALSE, array( 'sprintf' => $start ) ), '1H269/I', 403, 'chat_offline_admin' );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( !( $currentTime >= $start ) AND $currentTime >= $end )
|
||||
{
|
||||
\IPS\Output::i()->error( \IPS\Member::loggedIn()->language()->addToStack( 'chat_currently_offline', FALSE, array( 'sprintf' => $start ) ), '1H269/J', 403, 'chat_offline_admin' );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
parent::execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* View Chat
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function manage()
|
||||
{
|
||||
/* Initiate output */
|
||||
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'jquery/jquery.rangyinputs.js', 'core', 'interface' ) );
|
||||
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'buzz/buzz.min.js', 'chat', 'interface' ) );
|
||||
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'esrever/esrever.js', 'chat', 'interface' ) );
|
||||
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'front_chat.js', 'chat', 'front' ) );
|
||||
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'chat.css', 'chat', 'front' ) );
|
||||
|
||||
if ( \IPS\Theme::i()->settings['responsive'] )
|
||||
{
|
||||
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'chat_responsive.css', 'chat', 'front' ) );
|
||||
}
|
||||
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack( 'chat_title' );
|
||||
|
||||
/* Check rules */
|
||||
if( \IPS\Settings::i()->ipschat_enable_rules )
|
||||
{
|
||||
$proceed = FALSE;
|
||||
|
||||
$form = new \IPS\Helpers\Form( 'chat_rules', 'accept_rules' );
|
||||
$form->class = 'ipsForm_vertical';
|
||||
$form->hiddenValues['proceed'] = TRUE;
|
||||
|
||||
if( $values = $form->values() )
|
||||
{
|
||||
if( $values['proceed'] )
|
||||
{
|
||||
$proceed = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we haven't agreed yet, show the form */
|
||||
if( !$proceed )
|
||||
{
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'view' )->acceptRules( $form );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Initiate our options */
|
||||
$options = array(
|
||||
'roomId' => 0,
|
||||
'userId' => 0,
|
||||
'userName' => $this->cleanUsername( \IPS\Member::loggedIn()->member_id ? \IPS\Member::loggedIn()->name : \IPS\Member::loggedIn()->language()->get('guest') ),
|
||||
'accessKey' => '',
|
||||
'serverHost' => '',
|
||||
'serverPath' => '',
|
||||
);
|
||||
|
||||
/* Call master to retrieve info */
|
||||
try
|
||||
{
|
||||
$result = \IPS\Http\Url::external( self::MASTERSERVER . "gateway31.php?api_key=" . \IPS\Settings::i()->ipb_reg_number . "&user={$options['userName']}&level=" . \IPS\Member::loggedIn()->group['chat_moderate'] )->request()->get();
|
||||
}
|
||||
catch ( \IPS\Http\Request\Exception $e )
|
||||
{
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '4H268/2', 500, 'connect_gw_error_0' );
|
||||
}
|
||||
$results = explode( ',', $result );
|
||||
|
||||
|
||||
/* Error? */
|
||||
if( $results[0] == 0 )
|
||||
{
|
||||
switch( $results[1] )
|
||||
{
|
||||
// No license key
|
||||
case 1:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H269/7', 500, 'connect_gw_error_1' );
|
||||
break;
|
||||
|
||||
// No username
|
||||
case 2:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H269/8', 500, 'connect_gw_error_2' );
|
||||
break;
|
||||
|
||||
// MySQL error
|
||||
case 3:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H268/3', 500, 'connect_gw_error_3' );
|
||||
break;
|
||||
|
||||
// Invalid room ID
|
||||
case 5:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H269/A', 500, 'connect_gw_error_5' );
|
||||
break;
|
||||
|
||||
// Chat room full
|
||||
case 6:
|
||||
$key = \IPS\IPS::licenseKey();
|
||||
\IPS\Output::i()->error( 'chat_room_full', ( $key['chat_limit'] ? '1' : '4' ) . 'H269/B', 403, $key['chat_limit'] ? 'license_no_chat' : NULL );
|
||||
break;
|
||||
|
||||
// Chat room full
|
||||
case 7:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H269/A', 500, 'connect_gw_error_5' );
|
||||
break;
|
||||
|
||||
// The chat room is on a server which is no longer online
|
||||
case 8:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H268/4', 500, 'connect_gw_error_8' );
|
||||
break;
|
||||
|
||||
// No online chat servers could be found
|
||||
case 10:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H268/5', 500, 'connect_gw_error_10' );
|
||||
break;
|
||||
|
||||
// Other
|
||||
default:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H269/6', 500 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Set the options we just got from the master chat server */
|
||||
$options['roomId'] = intval($results[3]);
|
||||
$options['serverHost'] = $results[1];
|
||||
$options['serverPath'] = $results[2];
|
||||
|
||||
/* If this is a guest, adjust the URL to send an identifier */
|
||||
$guestFlag = ( !\IPS\Member::loggedIn()->member_id and isset( \IPS\Request::i()->cookie['chat_user_id'] ) ) ? "&userid=" . intval( \IPS\Request::i()->cookie['chat_user_id'] ) : '';
|
||||
|
||||
/* Now join the actual chat room */
|
||||
try
|
||||
{
|
||||
$result = \IPS\Http\Url::external( "http://{$options['serverHost']}{$options['serverPath']}/join31.php?api_key=" . \IPS\Settings::i()->ipb_reg_number . "&user={$options['userName']}&level=" . \IPS\Member::loggedIn()->group['chat_moderate'] . "&room={$options['roomId']}&forumid=" . \IPS\Member::loggedIn()->member_id . "{$guestFlag}&forumgroup=" . \IPS\Member::loggedIn()->member_group_id )->request()->get();
|
||||
}
|
||||
catch ( \IPS\Http\Request\Exception $e )
|
||||
{
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '4H268/2', 500, 'connect_gw_error_0' );
|
||||
}
|
||||
$results = explode( ',', $result );
|
||||
|
||||
/* Error? */
|
||||
if( $results[0] == 0 )
|
||||
{
|
||||
switch( $results[1] )
|
||||
{
|
||||
// No license key
|
||||
case 1:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H269/C', 500, 'connect_gw_error_1' );
|
||||
break;
|
||||
|
||||
// No username
|
||||
case 2:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H269/D', 500, 'connect_gw_error_2' );
|
||||
break;
|
||||
|
||||
// No room ID
|
||||
case 3:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H269/E', 500, 'connect_gw_error_3' );
|
||||
break;
|
||||
|
||||
// MySQL error
|
||||
case 4:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H269/E', 500, 'connect_gw_error_4' );
|
||||
break;
|
||||
|
||||
// Could not create room
|
||||
case 5:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H269/F', 500, 'connect_gw_error_5' );
|
||||
break;
|
||||
|
||||
// License key mismatch
|
||||
case 6:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H269/G', 500, 'connect_gw_error_6' );
|
||||
break;
|
||||
|
||||
// Chat room full
|
||||
case 7:
|
||||
$key = \IPS\IPS::licenseKey();
|
||||
\IPS\Output::i()->error( 'chat_room_full', ( $key['chat_limit'] ? '1' : '4' ) . 'H269/H', 500, $key['chat_limit'] ? 'license_no_chat' : NULL );
|
||||
break;
|
||||
|
||||
// Other
|
||||
default:
|
||||
\IPS\Output::i()->error( 'generic_chatconnect_error', '5H268/6', 500, 'connect_gw_error_0' );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Remember the important parts of this response */
|
||||
$options['userId'] = $results[1];
|
||||
$options['accessKey'] = $results[2];
|
||||
|
||||
/* If this is a guest, set the chat user ID cookie */
|
||||
if( !\IPS\Member::loggedIn()->member_id )
|
||||
{
|
||||
\IPS\Request::i()->setCookie( 'chat_user_id', $options['userId'], NULL, FALSE );
|
||||
}
|
||||
|
||||
/* Fetch the online users list and build the map */
|
||||
$chatters = array();
|
||||
|
||||
$result = \IPS\Http\Url::external( "http://{$options['serverHost']}{$options['serverPath']}/list.php?room={$options['roomId']}&user={$options['userId']}&access_key={$options['accessKey']}" )->request()->get();
|
||||
|
||||
if( $result )
|
||||
{
|
||||
$results = explode( "~~||~~", $result );
|
||||
$status = array_shift( $results );
|
||||
|
||||
if( $status == 1 )
|
||||
{
|
||||
foreach( $results as $k => $v )
|
||||
{
|
||||
$_thisRecord = explode( ',', $v );
|
||||
|
||||
if( !$_thisRecord[0] )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
$member = \IPS\Member::load( intval( $_thisRecord[2] ) );
|
||||
$username = str_replace( '~~#~~', ',', $_thisRecord[1] );
|
||||
|
||||
$chatters[ $username ] = array(
|
||||
'user_id' => $_thisRecord[0],
|
||||
'username' => htmlspecialchars( $username, ENT_QUOTES | \IPS\HTMLENTITIES, 'UTF-8', FALSE ),
|
||||
'formattedUsername' => \IPS\Member\Group::load( $member->member_group_id )->formatName( $member->name ),
|
||||
'forumUserID' => $member->member_id,
|
||||
'canBeIgnored' => $member->member_id ? !$member->group['gbw_cannot_be_ignored'] : 1,
|
||||
'canBypassBadwords' => $member->group['g_bypass_badwords'],
|
||||
'groupID' => $member->member_group_id,
|
||||
'prefix' => str_replace( '"', '__DBQ__', $member->group['prefix'] ),
|
||||
'suffix' => str_replace( '"', '__DBQ__', $member->group['suffix'] ),
|
||||
'photo' => $member->photo,
|
||||
'profileUrl' => $member->url(),
|
||||
'canModerate' => $member->group['chat_moderate'],
|
||||
'seo_name' => $member->members_seo_name,
|
||||
'last_update' => time(),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ksort($chatters);
|
||||
|
||||
$forumIdMap = array();
|
||||
|
||||
foreach( $chatters as $chatter )
|
||||
{
|
||||
$forumIdMap[ $chatter['user_id'] ] = $chatter;
|
||||
}
|
||||
|
||||
/* Update the chatters list */
|
||||
if( count( $chatters ) )
|
||||
{
|
||||
\IPS\Data\Store::i()->chatters = $forumIdMap;
|
||||
}
|
||||
|
||||
/* Get badwords list */
|
||||
$badwords = iterator_to_array( \IPS\Db::i()->select( 'm_exact, swop, type', 'core_profanity_filters' )->setKeyField( 'type' ) );
|
||||
|
||||
/* Get groups */
|
||||
$groups = array();
|
||||
|
||||
foreach( \IPS\Member\Group::groups() as $group )
|
||||
{
|
||||
$groups[ $group->g_id ] = array( 'prefix' => $group->prefix, 'suffix' => $group->suffix, 'bypassBadwords' => $group->g_bypass_badwords );
|
||||
}
|
||||
|
||||
/* Are we ignoring any chats? */
|
||||
if( \IPS\Member::loggedIn()->member_id )
|
||||
{
|
||||
$ignored = iterator_to_array( \IPS\Db::i()->select( 'ignore_ignore_id, ignore_id', 'core_ignored_users', array( 'ignore_owner_id=? and ignore_chats=1', \IPS\Member::loggedIn()->member_id ) )->setKeyField( 'ignore_ignore_id' )->setValueField( 'ignore_id' ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
$ignored = array();
|
||||
}
|
||||
|
||||
/* Emoticons */
|
||||
$emoticons = array();
|
||||
foreach ( \IPS\Db::i()->select( '*', 'core_emoticons', NULL, 'emo_set,emo_position' ) as $row )
|
||||
{
|
||||
$emoticons[ $row['typed'] ] = (string) \IPS\File::get( 'core_Emoticons', $row['image'] )->url;
|
||||
}
|
||||
|
||||
/* We store the chat options in our session in case we choose to leave the room */
|
||||
$_SESSION['chatOptions'] = $options;
|
||||
|
||||
/* Display */
|
||||
\IPS\Output::i()->sidebar['enabled'] = FALSE;
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'view' )->chat( $forumIdMap );
|
||||
\IPS\Output::i()->endBodyCode .= \IPS\Theme::i()->getTemplate( 'view' )->chatvars( $options, $forumIdMap, $groups, $badwords, $ignored, $emoticons );
|
||||
}
|
||||
|
||||
/**
|
||||
* Leave Chat
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function leave()
|
||||
{
|
||||
/* Check secure key */
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
/* Call server */
|
||||
if( isset( $_SESSION['chatOptions'] ) )
|
||||
{
|
||||
$options = $_SESSION['chatOptions'];
|
||||
|
||||
\IPS\Http\Url::external( "http://{$options['serverHost']}{$options['serverPath']}/leave.php?room={$options['roomId']}&user={$options['userId']}&access_key={$options['accessKey']}" )->request()->get();
|
||||
|
||||
unset( $_SESSION['chatOptions'] );
|
||||
}
|
||||
|
||||
/* Remove us from chatters list */
|
||||
$chatters = ( isset( \IPS\Data\Store::i()->chatters ) ) ? \IPS\Data\Store::i()->chatters : array();
|
||||
|
||||
foreach( $chatters as $uid => $chatter )
|
||||
{
|
||||
if( $chatter['forumUserID'] == \IPS\Member::loggedIn()->member_id )
|
||||
{
|
||||
unset( $chatters[ $uid ] );
|
||||
}
|
||||
}
|
||||
|
||||
\IPS\Data\Store::i()->chatters = $chatters;
|
||||
|
||||
// If this is a popup, close it, otherwise send us back to the suite index
|
||||
if( \IPS\Request::i()->_popup == 1 )
|
||||
{
|
||||
\IPS\Output::i()->output = "<script type='text/javascript'>window.close();</script>";
|
||||
}
|
||||
else
|
||||
{
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( "_leaveChat=1" ), 'leave_chat_room' );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean username for chat
|
||||
*
|
||||
* @param string Username
|
||||
* @return string
|
||||
*/
|
||||
protected function cleanUsername( $username )
|
||||
{
|
||||
$username = str_replace( "\r", '', $username );
|
||||
$username = str_replace( "\n", '__N__', $username );
|
||||
$username = str_replace( ",", '__C__', $username );
|
||||
$username = str_replace( "=", '__E__', $username );
|
||||
$username = str_replace( "+", '__PS__', $username );
|
||||
$username = str_replace( "&", '__A__', $username );
|
||||
$username = str_replace( "%", '__P__', $username );
|
||||
$username = urlencode($username);
|
||||
|
||||
return $username;
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
Whitespace-only changes.
Reference in new issue
Block a user