1
0
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:
Tim Düsterhus 2013-04-27 00:38:53 +02:00
parent 3beff6aea0
commit b0911a3404
6 changed files with 135 additions and 169 deletions

View File

@ -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, @)

View File

@ -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;
}
}

View File

@ -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;
}
} }

View File

@ -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']);
}
} }

View File

@ -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) {
$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(); $roomAction->executeAction();
}
\chat\util\ChatUtil::writeUserData(array('roomID' => null), $user);
} }
} }

View File

@ -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.
*/ */