diff --git a/lib/db/member.php b/lib/db/member.php index c98c9680..1fe827f1 100644 --- a/lib/db/member.php +++ b/lib/db/member.php @@ -16,7 +16,7 @@ class Db_Member extends Db{ const DB_TABLE = '`*PREFIX*documents_member`'; - const ACTIVITY_THRESHOLD = 60; // 1 Minute + const ACTIVITY_THRESHOLD = 90; // 1.5 Minutes const MEMBER_STATUS_ACTIVE = 1; const MEMBER_STATUS_INACTIVE = 2; diff --git a/lib/db/op.php b/lib/db/op.php index 9e8c94dd..7dea6f26 100644 --- a/lib/db/op.php +++ b/lib/db/op.php @@ -85,20 +85,20 @@ class Db_Op extends Db { public function addMember($esId, $memberId, $fullName, $color, $imageUrl){ $op = '{"optype":"AddMember","memberid":"'. $memberId .'","timestamp":"'. time() .'", "setProperties":{"fullName":"'. $fullName .'","color":"'. $color .'","imageUrl":"'. $imageUrl .'"}}'; - $this->insertOp($esId, $op); + $this->insertOp($esId, $memberId, $op); } public function removeCursor($esId, $memberId){ - if ($this->hasOp($esId, $memberId, 'AddCursor')){ + if ($this->hasOp($esId, $memberId, 'AddCursor') && !$this->hasLastOp($esId, $memberId, 'RemoveCursor')){ $op = '{"optype":"RemoveCursor","memberid":"'. $memberId .'","reason":"server-idle","timestamp":'. time() .'}'; - $this->insertOp($esId, $op); + $this->insertOp($esId, $memberId, $op); } } public function removeMember($esId, $memberId){ - if ($this->hasOp($esId, $memberId, 'AddMember')){ + if ($this->hasOp($esId, $memberId, 'AddMember') && !$this->hasLastOp($esId, $memberId, 'RemoveMember')){ $op ='{"optype":"RemoveMember","memberid":"'. $memberId .'","timestamp":'. time() .'}'; - $this->insertOp($esId, $op); + $this->insertOp($esId, $memberId, $op); } } @@ -106,18 +106,41 @@ class Db_Op extends Db { //TODO: Follow the spec https://github.com/kogmbh/WebODF/blob/master/webodf/lib/ops/OpUpdateMember.js#L95 $op = '{"optype":"UpdateMember","memberid":"'. $memberId .'","fullName":"'. $fullName .'","color":"'. $color .'","imageUrl":"'. $imageUrl .'","timestamp":'. time() .'}' ; - $this->insertOp($esId, $op); + $this->insertOp($esId, $memberId, $op); } - protected function insertOp($esId, $op){ + protected function insertOp($esId, $memberId, $op){ $op = new Db_Op(array( $esId, - 0, + $memberId, $op )); $op->insert(); } + protected function hasLastOp($esId, $memberId, $opType){ + $query = \OCP\DB::prepare(' + SELECT `opspec` + FROM ' . self::DB_TABLE . ' + WHERE `es_id`=? + AND `member`=? + + ORDER BY `seq` DESC + ', + 2,0 + ); + + $result = $query->execute(array($esId, $memberId)); + $ops = $result->fetchAll(); + foreach ($ops as $op){ + $decoded = json_decode($op['opspec'], true); + if ($decoded['optype']==$opType){ + return true; + } + } + return false; + } + protected function hasOp($esId, $memberId, $opType){ $ops = $this->execute( 'SELECT * FROM ' . $this->tableName . ' WHERE `es_id`=? AND `opspec` LIKE \'%"' . $opType . '","memberid":"' . $memberId .'"%\'', diff --git a/lib/file.php b/lib/file.php index 4520dcd2..6ec450ea 100644 --- a/lib/file.php +++ b/lib/file.php @@ -48,7 +48,7 @@ class File { } public static function getByShareToken($token){ - $linkItem = \OCP\Share::getShareByToken($token); + $linkItem = \OCP\Share::getShareByToken($token, false); if (is_array($linkItem) && isset($linkItem['uid_owner'])) { // seems to be a valid share $rootLinkItem = \OCP\Share::resolveReShare($linkItem);