diff --git a/ajax/otpoll.php b/ajax/otpoll.php index 8ad8e01f..8d97e03d 100644 --- a/ajax/otpoll.php +++ b/ajax/otpoll.php @@ -45,6 +45,14 @@ try{ $command = $request->getParam('command'); switch ($command){ case 'query_memberdata_list': + $esId = $request->getParam('args/es_id'); + $inactiveMembers = \OCA\Office\Member::cleanSession($esId); + if (is_array($inactiveMembers)){ + foreach ($inactiveMembers as $member){ + \OCA\Office\Op::removeCursor($esId, $member['member_id']); + } + } + $ids = $request->getParam('args/member_ids'); $members = OCA\Office\Member::getMembersAsArray($ids); $response["memberdata_list"] = array_map( @@ -71,11 +79,6 @@ try{ )); exit(); break; - case 'user_list': - $members = OCA\Office\Member::getMembersByEsId( - $request->getParam('args/es_id') - ); - break; case 'sync_ops': $seqHead = (string) $request->getParam('args/seq_head'); if (!is_null($seqHead)){ diff --git a/appinfo/database.xml b/appinfo/database.xml index b562bce7..842144bf 100644 --- a/appinfo/database.xml +++ b/appinfo/database.xml @@ -96,6 +96,14 @@ true 4 + + status + integer + 1 + true + true + 1 + diff --git a/appinfo/version b/appinfo/version index 5d4294b9..2411653a 100755 --- a/appinfo/version +++ b/appinfo/version @@ -1 +1 @@ -0.5.1 \ No newline at end of file +0.5.2 \ No newline at end of file diff --git a/lib/member.php b/lib/member.php index 90a07ee8..ca1ff012 100644 --- a/lib/member.php +++ b/lib/member.php @@ -14,7 +14,10 @@ namespace OCA\Office; class Member { - const DEFAULT_ACTIVITY_THRESHOLD = 600; // 10 Minutes + const ACTIVITY_THRESHOLD = 60; // 10 Minutes + + const MEMBER_STATUS_ACTIVE = 1; + const MEMBER_STATUS_INACTIVE = 2; public static function add($esId, $displayname, $color){ $query = \OCP\DB::prepare('INSERT INTO `*PREFIX*office_member` (`es_id`, `uid`, `color`, `last_activity`) VALUES (?, ?, ?, ?) '); @@ -57,15 +60,53 @@ class Member { public static function getMembersByEsId($esId, $lastActivity = null){ if (is_null($lastActivity)){ - $activeSince = time() - self::ACTIVITY_THRESHOLD; + $activeSince = self::getInactivityPeriod(); } else { $activeSince = $lastActivity; } - $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*office_member` WHERE `es_id`= ? and last_activity > ?'); + $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*office_member` WHERE `es_id`= ? and `last_activity` > ?'); $result = $query->execute(array($esId, $activeSince)); return $result->fetchAll(); } + + /** + * Mark memebers as inactive + * @param string $esId - session Id + * @return array - list of memberId that were marked as inactive + */ + public static function cleanSession($esId){ + $time = self::getInactivityPeriod(); + + $query = \OCP\DB::prepare('SELECT `member_id` FROM `*PREFIX*office_member` WHERE `es_id`= ? AND `last_activity`execute(array( + $esId, + $time, + self::MEMBER_STATUS_ACTIVE + )); + $deactivated = $result->fetchAll(); + + self::deactivate($esId, $time); + + return $deactivated; + } + + /** + * Update members to inactive state + * @param string $esId + * @param timestamp $time + */ + protected static function deactivate($esId, $time){ + $query = \OCP\DB::prepare('UPDATE `*PREFIX*office_member` SET `status`=? WHERE `es_id`=? AND `last_activity`execute(array( + self::MEMBER_STATUS_INACTIVE, + $esId, + $time + )); + } + + protected static function getInactivityPeriod(){ + return time() - self::ACTIVITY_THRESHOLD; + } } - diff --git a/lib/op.php b/lib/op.php index 1266537d..ba162dcd 100644 --- a/lib/op.php +++ b/lib/op.php @@ -71,5 +71,13 @@ class Op { $result = $query->execute(array($esId, $seq)); return $result->fetchAll(); } + + public static function removeCursor($esId, $memberId){ + return self::add( + $esId, + 0, + '{"optype":"RemoveCursor","memberid":"'. $memberId .'","reason":"server-idle","timestamp":'. time() .'}' + ); + } }