1
0
mirror of https://github.com/wbbaddons/Tims-Chat.git synced 2024-11-01 14:20:07 +00:00

Adding cleanup-cronjob (Currently missing the PIP)

Moving getPackageID into the Util
This commit is contained in:
Tim Düsterhus 2012-03-08 22:07:46 +01:00
parent 8b0dd6e391
commit 6e89b04751
10 changed files with 142 additions and 63 deletions

View File

@ -2,7 +2,6 @@
namespace wcf\acp\form; namespace wcf\acp\form;
use \wcf\system\exception\UserInputException; use \wcf\system\exception\UserInputException;
use \wcf\system\language\I18nHandler; use \wcf\system\language\I18nHandler;
use \wcf\system\package\PackageDependencyHandler;
use \wcf\system\WCF; use \wcf\system\WCF;
/** /**
@ -99,7 +98,7 @@ public function save() {
$roomID = $returnValues['returnValues']->roomID; $roomID = $returnValues['returnValues']->roomID;
if (!I18nHandler::getInstance()->isPlainValue('title')) { if (!I18nHandler::getInstance()->isPlainValue('title')) {
I18nHandler::getInstance()->save('title', 'wcf.chat.room.title'.$roomID, 'wcf.chat.room', PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat')); I18nHandler::getInstance()->save('title', 'wcf.chat.room.title'.$roomID, 'wcf.chat.room', \wcf\util\ChatUtil::getPackageID());
// update title // update title
$chatRoomEditor->update(array( $chatRoomEditor->update(array(
@ -108,7 +107,7 @@ public function save() {
} }
if (!I18nHandler::getInstance()->isPlainValue('topic')) { if (!I18nHandler::getInstance()->isPlainValue('topic')) {
I18nHandler::getInstance()->save('topic', 'wcf.chat.room.topic'.$roomID, 'wcf.chat.room', PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat')); I18nHandler::getInstance()->save('topic', 'wcf.chat.room.topic'.$roomID, 'wcf.chat.room', \wcf\util\ChatUtil::getPackageID());
// update topic // update topic
$chatRoomEditor->update(array( $chatRoomEditor->update(array(

View File

@ -1,7 +1,6 @@
<?php <?php
namespace wcf\acp\form; namespace wcf\acp\form;
use \wcf\system\language\I18nHandler; use \wcf\system\language\I18nHandler;
use \wcf\system\package\PackageDependencyHandler;
use \wcf\system\WCF; use \wcf\system\WCF;
/** /**
@ -64,20 +63,20 @@ public function save() {
$this->title = 'wcf.chat.room.title'.$this->roomObj->roomID; $this->title = 'wcf.chat.room.title'.$this->roomObj->roomID;
if (I18nHandler::getInstance()->isPlainValue('title')) { if (I18nHandler::getInstance()->isPlainValue('title')) {
I18nHandler::getInstance()->remove($this->title, PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat')); I18nHandler::getInstance()->remove($this->title, \wcf\util\ChatUtil::getPackageID());
$this->title = I18nHandler::getInstance()->getValue('title'); $this->title = I18nHandler::getInstance()->getValue('title');
} }
else { else {
I18nHandler::getInstance()->save('title', $this->title, 'wcf.chat.room', PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat')); I18nHandler::getInstance()->save('title', $this->title, 'wcf.chat.room', \wcf\util\ChatUtil::getPackageID());
} }
$this->topic = 'wcf.chat.room.topic'.$this->roomObj->roomID; $this->topic = 'wcf.chat.room.topic'.$this->roomObj->roomID;
if (I18nHandler::getInstance()->isPlainValue('topic')) { if (I18nHandler::getInstance()->isPlainValue('topic')) {
I18nHandler::getInstance()->remove($this->topic, PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat')); I18nHandler::getInstance()->remove($this->topic, \wcf\util\ChatUtil::getPackageID());
$this->topic = I18nHandler::getInstance()->getValue('topic'); $this->topic = I18nHandler::getInstance()->getValue('topic');
} }
else { else {
I18nHandler::getInstance()->save('topic', $this->topic, 'wcf.chat.room', PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat')); I18nHandler::getInstance()->save('topic', $this->topic, 'wcf.chat.room', \wcf\util\ChatUtil::getPackageID());
} }
\wcf\system\acl\ACLHandler::getInstance()->save($this->roomID, $this->objectTypeID); \wcf\system\acl\ACLHandler::getInstance()->save($this->roomID, $this->objectTypeID);
@ -105,8 +104,8 @@ public function readData() {
parent::readData(); parent::readData();
if (!count($_POST)) { if (!count($_POST)) {
I18nHandler::getInstance()->setOptions('title', PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat'), $this->roomObj->title, 'wcf.chat.room.title\d+'); I18nHandler::getInstance()->setOptions('title', \wcf\util\ChatUtil::getPackageID(), $this->roomObj->title, 'wcf.chat.room.title\d+');
I18nHandler::getInstance()->setOptions('topic', PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat'), $this->roomObj->topic, 'wcf.chat.room.topic\d+'); I18nHandler::getInstance()->setOptions('topic', \wcf\util\ChatUtil::getPackageID(), $this->roomObj->topic, 'wcf.chat.room.topic\d+');
$this->title = $this->roomObj->title; $this->title = $this->roomObj->title;
$this->topic = $this->roomObj->topic; $this->topic = $this->roomObj->topic;

View File

@ -23,17 +23,19 @@ class ChatMessageEditor extends \wcf\data\DatabaseObjectEditor {
* @param integer $lifetime Delete messages older that this time. * @param integer $lifetime Delete messages older that this time.
* @return integer Number of deleted messages. * @return integer Number of deleted messages.
*/ */
public static function cleanup($lifetime = CHAT_ARCHIVETIME) { public static function prune($lifetime = CHAT_ARCHIVETIME) {
$baseClass = self::$baseClass;
$sql = "SELECT $sql = "SELECT
".static::getDatabaseIndexName()." ".$baseClass::getDatabaseTableIndexName()."
FROM FROM
".static::getDatabaseTableName()." ".$baseClass::getDatabaseTableName()."
WHERE WHERE
time < ?"; time < ?";
$statement = \wcf\system\WCF::getDB()->prepareStatement($sql); $stmt = \wcf\system\WCF::getDB()->prepareStatement($sql);
$statement->execute(TIME_NOW - $lifetime); $stmt->execute(array(TIME_NOW - $lifetime));
$objectIDs = array(); $objectIDs = array();
while ($objectIDs[] = $statement->fetchColumn()); while ($objectIDs[] = $stmt->fetchColumn());
return static::deleteAll($objectIDs);
return self::deleteAll($objectIDs);
} }
} }

View File

@ -43,7 +43,7 @@ public function __toString() {
* @return integer * @return integer
*/ */
public function countUsers() { public function countUsers() {
$packageID = \wcf\system\package\PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat'); $packageID = \wcf\util\ChatUtil::getPackageID();
$sql = "SELECT $sql = "SELECT
count(*) as count count(*) as count
@ -100,7 +100,7 @@ public function getTitle() {
* @return array<\wcf\data\user\User> * @return array<\wcf\data\user\User>
*/ */
public function getUsers() { public function getUsers() {
$packageID = \wcf\system\package\PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat'); $packageID = \wcf\util\ChatUtil::getPackageID();
$sql = "SELECT $sql = "SELECT
userID userID

View File

@ -17,19 +17,13 @@ class ChatRoomEditor extends \wcf\data\DatabaseObjectEditor implements \wcf\data
*/ */
protected static $baseClass = '\wcf\data\chat\room\ChatRoom'; protected static $baseClass = '\wcf\data\chat\room\ChatRoom';
/**
* Clears the room cache.
*/
public static function resetCache() {
\wcf\system\cache\CacheHandler::getInstance()->clear(WCF_DIR.'cache', 'cache.chatrooms.php');
}
/** /**
* @see \wcf\data\DatabaseObjectEditor::deleteAll() * @see \wcf\data\DatabaseObjectEditor::deleteAll()
*/ */
public static function deleteAll(array $objectIDs = array()) { public static function deleteAll(array $objectIDs = array()) {
parent::deleteAll($objectIDs); parent::deleteAll($objectIDs);
$packageID = \wcf\system\package\PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat'); $packageID = \wcf\util\ChatUtil::getPackageID();
WCF::getDB()->beginTransaction(); WCF::getDB()->beginTransaction();
foreach ($objectIDs as $objectID) { foreach ($objectIDs as $objectID) {
@ -40,4 +34,40 @@ public static function deleteAll(array $objectIDs = array()) {
return count($objectIDs); return count($objectIDs);
} }
/**
* Deletes temporary rooms that are unused.
*
* @return integer Number of deleted rooms
*/
public static function prune() {
$baseClass = self::$baseClass;
$sql = "SELECT
".$baseClass::getDatabaseTableIndexName()."
FROM
".$baseClass::getDatabaseTableName()."
WHERE
permanent = ?
AND roomID NOT IN(
SELECT
fieldValue AS roomID
FROM
wcf".WCF_N."_user_storage
WHERE
packageID = ?
AND field = ?)";
$stmt = \wcf\system\WCF::getDB()->prepareStatement($sql);
$stmt->execute(array(0, \wcf\util\ChatUtil::getPackageID(), 'roomID'));
$objectIDs = array();
while ($objectIDs[] = $stmt->fetchColumn());
return self::deleteAll($objectIDs);
}
/**
* Clears the room cache.
*/
public static function resetCache() {
\wcf\system\cache\CacheHandler::getInstance()->clear(WCF_DIR.'cache', 'cache.chatrooms.php');
}
} }

View File

@ -88,7 +88,7 @@ public function readData() {
try { try {
\wcf\util\ChatUtil::writeUserData(array('lastSeen' => end($this->newestMessages)->messageID)); \wcf\util\ChatUtil::writeUserData(array('lastSeen' => end($this->newestMessages)->messageID));
} }
catch (\wcf\system\SystemException $e) { catch (\wcf\system\exception\SystemException $e) {
\wcf\util\ChatUtil::writeUserData(array('lastSeen' => 0)); \wcf\util\ChatUtil::writeUserData(array('lastSeen' => 0));
} }
@ -161,12 +161,15 @@ public function show() {
if (!WCF::getUser()->userID) { if (!WCF::getUser()->userID) {
throw new \wcf\system\exception\PermissionDeniedException(); throw new \wcf\system\exception\PermissionDeniedException();
} }
\wcf\system\menu\page\PageMenu::getInstance()->setActiveMenuItem('wcf.header.menu.chat'); \wcf\system\menu\page\PageMenu::getInstance()->setActiveMenuItem('wcf.header.menu.chat');
// remove index breadcrumb // remove index breadcrumb
WCF::getBreadcrumbs()->remove(0); WCF::getBreadcrumbs()->remove(0);
parent::show(); parent::show();
// break if not ajax
// break if not using ajax
if ($this->useTemplate) exit; if ($this->useTemplate) exit;
@header('Content-type: application/json'); @header('Content-type: application/json');

View File

@ -31,9 +31,9 @@ public function getData(array $cacheResource) {
FROM wcf".WCF_N."_acl_option acl_option, FROM wcf".WCF_N."_acl_option acl_option,
wcf".WCF_N."_acl_option_to_group option_to_group wcf".WCF_N."_acl_option_to_group option_to_group
".$conditionBuilder; ".$conditionBuilder;
$statement = WCF::getDB()->prepareStatement($sql); $stmt = WCF::getDB()->prepareStatement($sql);
$statement->execute($conditionBuilder->getParameters()); $stmt->execute($conditionBuilder->getParameters());
while ($row = $statement->fetchArray()) { while ($row = $stmt->fetchArray()) {
if (!isset($data[$row['roomID']][$row['permission']])) $data[$row['roomID']][$row['permission']] = $row['optionValue']; if (!isset($data[$row['roomID']][$row['permission']])) $data[$row['roomID']][$row['permission']] = $row['optionValue'];
else $data[$row['roomID']][$row['permission']] = $row['optionValue'] || $data[$row['roomID']][$row['permission']]; else $data[$row['roomID']][$row['permission']] = $row['optionValue'] || $data[$row['roomID']][$row['permission']];
} }

View File

@ -27,7 +27,7 @@ class ChatPermissionHandler extends \wcf\system\SingletonFactory {
* @see \wcf\system\SingletonFactory::init() * @see \wcf\system\SingletonFactory::init()
*/ */
protected function init() { protected function init() {
$packageID = PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat'); $packageID = \wcf\util\ChatUtil::getPackageID();
$ush = \wcf\system\user\storage\UserStorageHandler::getInstance(); $ush = \wcf\system\user\storage\UserStorageHandler::getInstance();
// get groups permissions // get groups permissions
@ -58,9 +58,9 @@ protected function init() {
FROM wcf".WCF_N."_acl_option acl_option, FROM wcf".WCF_N."_acl_option acl_option,
wcf".WCF_N."_acl_option_to_user option_to_user wcf".WCF_N."_acl_option_to_user option_to_user
".$conditionBuilder; ".$conditionBuilder;
$statement = WCF::getDB()->prepareStatement($sql); $stmt = WCF::getDB()->prepareStatement($sql);
$statement->execute($conditionBuilder->getParameters()); $stmt->execute($conditionBuilder->getParameters());
while ($row = $statement->fetchArray()) { while ($row = $stmt->fetchArray()) {
$userPermissions[$row['roomID']][$row['permission']] = $row['optionValue']; $userPermissions[$row['roomID']][$row['permission']] = $row['optionValue'];
} }
@ -97,7 +97,7 @@ public function getPermission(\wcf\data\chat\room\ChatRoom $room, $permission) {
* Clears the cache. * Clears the cache.
*/ */
public static function clearCache() { public static function clearCache() {
$packageID = PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat'); $packageID = \wcf\util\ChatUtil::getPackageID();
$ush = \wcf\system\user\storage\UserStorageHandler::getInstance(); $ush = \wcf\system\user\storage\UserStorageHandler::getInstance();
$ush->resetAll('chatUserPermissions', $packageID); $ush->resetAll('chatUserPermissions', $packageID);

View File

@ -0,0 +1,21 @@
<?php
namespace wcf\system\cronjob;
/**
* Vaporizes unneeded data.
*
* @author Tim Düsterhus
* @copyright 2010-2012 Tim Düsterhus
* @license Creative Commons Attribution-NonCommercial-ShareAlike <http://creativecommons.org/licenses/by-nc-sa/3.0/legalcode>
* @package timwolla.wcf.chat
* @subpackage system.cronjob
*/
class ChatCleanupCronjob implements ICronjob {
/**
* @see wcf\system\ICronjob::execute()
*/
public function execute(\wcf\data\cronjob\Cronjob $cronjob) {
\wcf\data\chat\message\ChatMessageEditor::prune();
\wcf\data\chat\room\ChatRoomEditor::prune();
}
}

View File

@ -22,8 +22,43 @@ class ChatUtil {
*/ */
const TIME_MODIFIER_REGEX = '((?:[0-9]+[s|h|d|w|m|y|S|H|D|W|M|Y]?,?)+)'; const TIME_MODIFIER_REGEX = '((?:[0-9]+[s|h|d|w|m|y|S|H|D|W|M|Y]?,?)+)';
/**
* Package identifier of Tims Chat.
*
* @var string
*/
const PACKAGE_IDENTIFIER = 'timwolla.wcf.chat';
public static $serialize = array('color' => true); public static $serialize = array('color' => true);
/**
* Cached packageID of Tims Chat.
*
* @var integer
*/
private static $packageID = null;
/**
* Returns the packageID of Tims Chat.
*/
public static function getPackageID() {
if (self::$packageID === null) {
self::$packageID = PackageDependencyHandler::getInstance()->getPackageID(self::PACKAGE_IDENTIFIER);
}
return self::$packageID;
}
/**
* Returns a random number.
*
* @return integer
*/
public static function /* int */ getRandomNumber() {
return 4; // chosen by a fair dice roll
// guaranteed to be random
}
/** /**
* Creates a gradient out of two colors represented by an integer. * Creates a gradient out of two colors represented by an integer.
* The first byte is red, the second byte is green, the third one is blue. * The first byte is red, the second byte is green, the third one is blue.
@ -58,7 +93,7 @@ public static function gradient($string, $start, $end) {
*/ */
public static function readUserData($field) { public static function readUserData($field) {
$ush = UserStorageHandler::getInstance(); $ush = UserStorageHandler::getInstance();
$packageID = PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat'); $packageID = self::getPackageID();
// load storage // load storage
$ush->loadStorage(array(WCF::getUser()->userID), $packageID); $ush->loadStorage(array(WCF::getUser()->userID), $packageID);
@ -79,30 +114,6 @@ public static function readUserData($field) {
else return $data[WCF::getUser()->userID]; else return $data[WCF::getUser()->userID];
} }
/**
* Returns a random number.
*
* @return integer
*/
public static function /* int */ getRandomNumber() {
return 4; // chosen by a fair dice roll
// guaranteed to be random
}
/**
* Writes user data
*
* @param array $data
*/
public static function writeUserData(array $data) {
$ush = UserStorageHandler::getInstance();
$packageID = PackageDependencyHandler::getInstance()->getPackageID('timwolla.wcf.chat');
foreach($data as $key => $value) {
$ush->update(WCF::getUser()->userID, $key, (isset(static::$serialize[$key])) ? serialize($value) : $value, $packageID);
}
}
/** /**
* 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().
@ -175,4 +186,18 @@ public static function timeModifier($time) {
return (int) round($result, 0); return (int) round($result, 0);
} }
/**
* Writes user data
*
* @param array $data
*/
public static function writeUserData(array $data) {
$ush = UserStorageHandler::getInstance();
$packageID = self::getPackageID();
foreach($data as $key => $value) {
$ush->update(WCF::getUser()->userID, $key, (isset(static::$serialize[$key])) ? serialize($value) : $value, $packageID);
}
}
} }