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` AND `status`=?');
+ $result = $query->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`');
+ $query->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() .'}'
+ );
+ }
}