mirror of
https://github.com/wbbaddons/Tims-Chat.git
synced 2025-01-09 00:20:08 +00:00
Optimize code foor room leaving
This commit is contained in:
parent
3beff6aea0
commit
b0911a3404
@ -37,7 +37,7 @@ be.bastelstu.Chat
|
|||||||
Attributes
|
Attributes
|
||||||
----------
|
----------
|
||||||
|
|
||||||
When `shields` reaches zero `@pe.getMessages` is stopped, to prevent annoying the server with requests that don't go through. Decreased every time `@getMessages()` fails.
|
When `shields` reaches zero `@pe.getMessages` is stopped, to prevent annoying the server with requests that don't go through. Decreased every time `@getMessages()` fails.
|
||||||
|
|
||||||
shields: 3
|
shields: 3
|
||||||
|
|
||||||
@ -407,15 +407,15 @@ Handle reply.
|
|||||||
|
|
||||||
success: (data, textStatus, jqXHR) =>
|
success: (data, textStatus, jqXHR) =>
|
||||||
WCF.DOMNodeInsertedHandler.enable()
|
WCF.DOMNodeInsertedHandler.enable()
|
||||||
@handleMessages(data.messages)
|
@handleMessages data.messages
|
||||||
@handleUsers(data.users)
|
@handleUsers data.users
|
||||||
WCF.DOMNodeInsertedHandler.disable()
|
WCF.DOMNodeInsertedHandler.disable()
|
||||||
|
|
||||||
Decrease `@shields` on error and disable PeriodicalExecuters once `@shields` reaches zero.
|
Decrease `@shields` on error and disable PeriodicalExecuters once `@shields` reaches zero.
|
||||||
|
|
||||||
error: =>
|
error: =>
|
||||||
console.error 'Battle Station hit - shields at ' + (--@shields / 3 * 104) + ' percent'
|
console.error 'Battle Station hit - shields at ' + (--@shields / 3 * 104) + ' percent'
|
||||||
if @shields is 0
|
if @shields <= 0
|
||||||
@pe.refreshRoomList.stop()
|
@pe.refreshRoomList.stop()
|
||||||
@pe.getMessages.stop()
|
@pe.getMessages.stop()
|
||||||
@freeTheFish()
|
@freeTheFish()
|
||||||
@ -638,6 +638,7 @@ Updates the room list.
|
|||||||
actionName: 'getRoomList'
|
actionName: 'getRoomList'
|
||||||
className: 'chat\\data\\room\\RoomAction'
|
className: 'chat\\data\\room\\RoomAction'
|
||||||
showLoadingOverlay: false
|
showLoadingOverlay: false
|
||||||
|
suppressErrors: true
|
||||||
success: (data) =>
|
success: (data) =>
|
||||||
$('#timsChatRoomList li').remove()
|
$('#timsChatRoomList li').remove()
|
||||||
$('#toggleRooms .ajaxLoad').hide()
|
$('#toggleRooms .ajaxLoad').hide()
|
||||||
@ -656,7 +657,7 @@ Bind click event for inline room change if we have the history API available.
|
|||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
@changeRoom $ event.target
|
@changeRoom $ event.target
|
||||||
|
|
||||||
console.log "Found #{data.length} rooms"
|
console.log "Found #{data.returnValues.length} rooms"
|
||||||
|
|
||||||
**submit(target)**
|
**submit(target)**
|
||||||
Submits the message.
|
Submits the message.
|
||||||
@ -717,7 +718,12 @@ Switches the active sidebar tab to the one belonging to `target`.
|
|||||||
Sends leave notification to the server.
|
Sends leave notification to the server.
|
||||||
|
|
||||||
unload: ->
|
unload: ->
|
||||||
$.ajax @config.unloadURL,
|
proxy = new WCF.Action.Proxy
|
||||||
type: 'POST'
|
autoSend: true
|
||||||
|
data:
|
||||||
|
actionName: 'leave'
|
||||||
|
className: 'chat\\data\\room\\RoomAction'
|
||||||
|
showLoadingOverlay: false
|
||||||
async: false
|
async: false
|
||||||
|
suppressErrors: true
|
||||||
)(jQuery, @)
|
)(jQuery, @)
|
||||||
|
@ -1,85 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace chat\action;
|
|
||||||
use \chat\data;
|
|
||||||
use \wcf\system\exception\IllegalLinkException;
|
|
||||||
use \wcf\system\WCF;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes the user leave Tims Chat.
|
|
||||||
*
|
|
||||||
* @author Tim Düsterhus
|
|
||||||
* @copyright 2010-2013 Tim Düsterhus
|
|
||||||
* @license Creative Commons Attribution-NonCommercial-ShareAlike <http://creativecommons.org/licenses/by-nc-sa/3.0/legalcode>
|
|
||||||
* @package be.bastelstu.chat
|
|
||||||
* @subpackage action
|
|
||||||
*/
|
|
||||||
class LeaveAction extends \wcf\action\AbstractAction {
|
|
||||||
/**
|
|
||||||
* @see wcf\action\AbstractAction::$loginRequired
|
|
||||||
*/
|
|
||||||
public $loginRequired = true;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see \wcf\action\AbstractAction::$neededModules
|
|
||||||
*/
|
|
||||||
public $neededModules = array('CHAT_ACTIVE');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see \wcf\page\AbstractPage::$neededPermissions
|
|
||||||
*/
|
|
||||||
public $neededPermissions = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The current room.
|
|
||||||
*
|
|
||||||
* @var \chat\data\room\Room
|
|
||||||
*/
|
|
||||||
public $room = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Values read from the UserStorage of the current user.
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
public $userData = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see \wcf\action\IAction::execute()
|
|
||||||
*/
|
|
||||||
public function execute() {
|
|
||||||
parent::execute();
|
|
||||||
|
|
||||||
$this->userData['roomID'] = \chat\util\ChatUtil::readUserData('roomID');
|
|
||||||
|
|
||||||
$cache = data\room\Room::getCache();
|
|
||||||
if (!isset($cache[$this->userData['roomID']])) throw new IllegalLinkException();
|
|
||||||
$this->room = $cache[$this->userData['roomID']];
|
|
||||||
if (!$this->room->canEnter()) throw new \wcf\system\exception\PermissionDeniedException();
|
|
||||||
|
|
||||||
if (CHAT_DISPLAY_JOIN_LEAVE) {
|
|
||||||
$this->userData['color'] = \chat\util\ChatUtil::readUserData('color');
|
|
||||||
|
|
||||||
// leave message
|
|
||||||
$messageAction = new data\message\MessageAction(array(), 'create', array(
|
|
||||||
'data' => array(
|
|
||||||
'roomID' => $this->room->roomID,
|
|
||||||
'sender' => WCF::getUser()->userID,
|
|
||||||
'username' => WCF::getUser()->username,
|
|
||||||
'time' => TIME_NOW,
|
|
||||||
'type' => data\message\Message::TYPE_LEAVE,
|
|
||||||
'message' => '',
|
|
||||||
'color1' => $this->userData['color'][1],
|
|
||||||
'color2' => $this->userData['color'][2]
|
|
||||||
)
|
|
||||||
));
|
|
||||||
$messageAction->executeAction();
|
|
||||||
}
|
|
||||||
|
|
||||||
// set current room to null
|
|
||||||
\chat\util\ChatUtil::writeUserData(array('roomID' => null));
|
|
||||||
|
|
||||||
$this->executed();
|
|
||||||
header("HTTP/1.0 204 No Content");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}
|
|
@ -137,7 +137,7 @@ public function countUsers() {
|
|||||||
/**
|
/**
|
||||||
* Returns the users that are currently active in this room.
|
* Returns the users that are currently active in this room.
|
||||||
*
|
*
|
||||||
* @return \wcf\data\user\UserList
|
* @return \wcf\data\user\UserProfileList
|
||||||
*/
|
*/
|
||||||
public function getUsers() {
|
public function getUsers() {
|
||||||
$sql = "SELECT
|
$sql = "SELECT
|
||||||
@ -160,4 +160,46 @@ public function getUsers() {
|
|||||||
|
|
||||||
return $userList;
|
return $userList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the users that "timed out".
|
||||||
|
*
|
||||||
|
* @return \wcf\data\user\UserList
|
||||||
|
*/
|
||||||
|
public static function getDeadUsers() {
|
||||||
|
if (\chat\util\ChatUtil::nodePushRunning()) {
|
||||||
|
$time = TIME_NOW - 120;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$time = TIME_NOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = "SELECT
|
||||||
|
r.userID
|
||||||
|
FROM
|
||||||
|
wcf".WCF_N."_user_storage r
|
||||||
|
LEFT JOIN
|
||||||
|
wcf".WCF_N."_user_storage a
|
||||||
|
ON a.userID = r.userID
|
||||||
|
AND a.field = ?
|
||||||
|
WHERE
|
||||||
|
r.field = ?
|
||||||
|
AND r.fieldValue IS NOT NULL
|
||||||
|
AND (
|
||||||
|
a.fieldValue < ?
|
||||||
|
OR a.fieldValue IS NULL
|
||||||
|
)";
|
||||||
|
$stmt = WCF::getDB()->prepareStatement($sql);
|
||||||
|
$stmt->execute(array('lastActivity', 'roomID', $time - 30));
|
||||||
|
$userIDs = array();
|
||||||
|
while ($userID = $stmt->fetchColumn()) $userIDs[] = $userID;
|
||||||
|
|
||||||
|
$userList = new \wcf\data\user\UserList();
|
||||||
|
if (!empty($userIDs)) $userList->getConditionBuilder()->add('user_table.userID IN (?)', array($userIDs));
|
||||||
|
else $userList->getConditionBuilder()->add('1 = 0', array());
|
||||||
|
|
||||||
|
$userList->readObjects();
|
||||||
|
|
||||||
|
return $userList;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace chat\data\room;
|
namespace chat\data\room;
|
||||||
|
use \chat\util\ChatUtil;
|
||||||
use \wcf\system\WCF;
|
use \wcf\system\WCF;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -124,6 +125,13 @@ public function updatePosition() {
|
|||||||
*/
|
*/
|
||||||
public function validateGetRoomList() {
|
public function validateGetRoomList() {
|
||||||
if (!CHAT_ACTIVE) throw new \wcf\system\exception\IllegalLinkException();
|
if (!CHAT_ACTIVE) throw new \wcf\system\exception\IllegalLinkException();
|
||||||
|
|
||||||
|
$rooms = Room::getCache();
|
||||||
|
$roomID = ChatUtil::readUserData('roomID');
|
||||||
|
if (!isset($rooms[$roomID])) {
|
||||||
|
throw new \wcf\system\exception\IllegalLinkException();
|
||||||
|
}
|
||||||
|
$this->parameters['room'] = $rooms[$roomID];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -132,10 +140,6 @@ public function validateGetRoomList() {
|
|||||||
public function getRoomList() {
|
public function getRoomList() {
|
||||||
$rooms = Room::getCache();
|
$rooms = Room::getCache();
|
||||||
|
|
||||||
$roomID = \chat\util\ChatUtil::readUserData('roomID');
|
|
||||||
if (!isset($rooms[$roomID])) throw new \wcf\system\exception\IllegalLinkException();
|
|
||||||
$activeRoom = $rooms[$roomID];
|
|
||||||
|
|
||||||
$result = array();
|
$result = array();
|
||||||
foreach ($rooms as $room) {
|
foreach ($rooms as $room) {
|
||||||
if (!$room->canEnter()) continue;
|
if (!$room->canEnter()) continue;
|
||||||
@ -146,10 +150,61 @@ public function getRoomList() {
|
|||||||
'application' => 'chat',
|
'application' => 'chat',
|
||||||
'object' => $room
|
'object' => $room
|
||||||
)),
|
)),
|
||||||
'active' => $room->roomID == $activeRoom->roomID
|
'active' => $room->roomID == $this->parameters['room']->roomID
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates parameters and permissions.
|
||||||
|
*/
|
||||||
|
public function validateLeave() {
|
||||||
|
if (!CHAT_ACTIVE) throw new \wcf\system\exception\IllegalLinkException();
|
||||||
|
|
||||||
|
unset($this->parameters['user']);
|
||||||
|
|
||||||
|
$rooms = Room::getCache();
|
||||||
|
$roomID = ChatUtil::readUserData('roomID');
|
||||||
|
if (!isset($rooms[$roomID])) throw new \wcf\system\exception\IllegalLinkException();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Leaves the room.
|
||||||
|
*/
|
||||||
|
public function leave() {
|
||||||
|
// user cannot be set during an AJAX request may be set by the chat itself
|
||||||
|
if (!isset($this->parameters['user'])) {
|
||||||
|
$this->parameters['user'] = WCF::getUser();
|
||||||
|
}
|
||||||
|
|
||||||
|
$rooms = Room::getCache();
|
||||||
|
|
||||||
|
$roomID = ChatUtil::readUserData('roomID', $this->parameters['user']);
|
||||||
|
if (!isset($rooms[$roomID])) throw new \wcf\system\exception\UserInputException();
|
||||||
|
$activeRoom = $rooms[$roomID];
|
||||||
|
|
||||||
|
if (CHAT_DISPLAY_JOIN_LEAVE) {
|
||||||
|
$userData['color'] = ChatUtil::readUserData('color', $this->parameters['user']);
|
||||||
|
|
||||||
|
// leave message
|
||||||
|
$messageAction = new \chat\data\message\MessageAction(array(), 'create', array(
|
||||||
|
'data' => array(
|
||||||
|
'roomID' => $activeRoom->roomID,
|
||||||
|
'sender' => $this->parameters['user']->userID,
|
||||||
|
'username' => $this->parameters['user']->username,
|
||||||
|
'time' => TIME_NOW,
|
||||||
|
'type' => \chat\data\message\Message::TYPE_LEAVE,
|
||||||
|
'message' => '',
|
||||||
|
'color1' => $userData['color'][1],
|
||||||
|
'color2' => $userData['color'][2]
|
||||||
|
)
|
||||||
|
));
|
||||||
|
$messageAction->executeAction();
|
||||||
|
}
|
||||||
|
|
||||||
|
// set current room to null
|
||||||
|
ChatUtil::writeUserData(array('roomID' => null), $this->parameters['user']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,29 +65,12 @@ public function readData() {
|
|||||||
$this->readMessages();
|
$this->readMessages();
|
||||||
$this->users = $this->room->getUsers();
|
$this->users = $this->room->getUsers();
|
||||||
|
|
||||||
$deadUsers = \chat\util\ChatUtil::getDiedUsers();
|
$deadUsers = data\room\Room::getDeadUsers();
|
||||||
foreach ($deadUsers as $deadUser) {
|
foreach ($deadUsers as $deadUser) {
|
||||||
if (!$deadUser) continue;
|
$roomAction = new data\room\RoomAction(array(), 'leave', array(
|
||||||
|
'user' => $deadUser
|
||||||
$user = new \wcf\data\user\User($deadUser['userID']);
|
));
|
||||||
if (CHAT_DISPLAY_JOIN_LEAVE) {
|
$roomAction->executeAction();
|
||||||
$userData['color'] = \chat\util\ChatUtil::readUserData('color', $user);
|
|
||||||
|
|
||||||
$messageAction = new data\message\MessageAction(array(), 'create', array(
|
|
||||||
'data' => array(
|
|
||||||
'roomID' => $deadUser['roomID'],
|
|
||||||
'sender' => $user->userID,
|
|
||||||
'username' => $user->username,
|
|
||||||
'time' => TIME_NOW,
|
|
||||||
'type' => data\message\Message::TYPE_LEAVE,
|
|
||||||
'message' => '',
|
|
||||||
'color1' => $userData['color'][1],
|
|
||||||
'color2' => $userData['color'][2]
|
|
||||||
)
|
|
||||||
));
|
|
||||||
$messageAction->executeAction();
|
|
||||||
}
|
|
||||||
\chat\util\ChatUtil::writeUserData(array('roomID' => null), $user);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,41 +44,6 @@ final class ChatUtil {
|
|||||||
*/
|
*/
|
||||||
private static $packageID = null;
|
private static $packageID = null;
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetches the userIDs of died users.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public static function getDiedUsers() {
|
|
||||||
if (self::nodePushRunning()) {
|
|
||||||
$time = TIME_NOW - 120;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$time = TIME_NOW;
|
|
||||||
}
|
|
||||||
|
|
||||||
$sql = "SELECT
|
|
||||||
r.userID, r.fieldValue AS roomID
|
|
||||||
FROM
|
|
||||||
wcf".WCF_N."_user_storage r
|
|
||||||
LEFT JOIN
|
|
||||||
wcf".WCF_N."_user_storage a
|
|
||||||
ON a.userID = r.userID
|
|
||||||
AND a.field = ?
|
|
||||||
WHERE
|
|
||||||
r.field = ?
|
|
||||||
AND r.fieldValue IS NOT NULL
|
|
||||||
AND (
|
|
||||||
a.fieldValue < ?
|
|
||||||
OR a.fieldValue IS NULL
|
|
||||||
)";
|
|
||||||
$stmt = WCF::getDB()->prepareStatement($sql);
|
|
||||||
$stmt->execute(array('lastActivity', 'roomID', $time - 30));
|
|
||||||
$users = array();
|
|
||||||
while ($user = $stmt->fetchArray()) $users[] = $user;
|
|
||||||
|
|
||||||
return $users;
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Returns the packageID of Tims Chat.
|
* Returns the packageID of Tims Chat.
|
||||||
*/
|
*/
|
||||||
@ -173,6 +138,20 @@ public static function readUserData($field, \wcf\data\user\User $user = null) {
|
|||||||
else return $data[$user->userID];
|
else return $data[$user->userID];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes user data
|
||||||
|
* @param array $data
|
||||||
|
* @param \wcf\data\user\User $user
|
||||||
|
*/
|
||||||
|
public static function writeUserData(array $data, \wcf\data\user\User $user = null) {
|
||||||
|
if ($user === null) $user = WCF::getUser();
|
||||||
|
$ush = UserStorageHandler::getInstance();
|
||||||
|
|
||||||
|
foreach ($data as $key => $value) {
|
||||||
|
$ush->update($user->userID, $key, (isset(static::$serialize[$key])) ? serialize($value) : $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Splits a string into smaller chunks.
|
* Splits a string into smaller chunks.
|
||||||
* UTF-8 safe version of str_split().
|
* UTF-8 safe version of str_split().
|
||||||
@ -246,20 +225,6 @@ public static function timeModifier($time) {
|
|||||||
return (int) round($result, 0);
|
return (int) round($result, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes user data
|
|
||||||
* @param array $data
|
|
||||||
* @param \wcf\data\user\User $user
|
|
||||||
*/
|
|
||||||
public static function writeUserData(array $data, \wcf\data\user\User $user = null) {
|
|
||||||
if ($user === null) $user = WCF::getUser();
|
|
||||||
$ush = UserStorageHandler::getInstance();
|
|
||||||
|
|
||||||
foreach ($data as $key => $value) {
|
|
||||||
$ush->update($user->userID, $key, (isset(static::$serialize[$key])) ? serialize($value) : $value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disables the constructor.
|
* Disables the constructor.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user