public static function joinPrivate(ChainContainer $chain) { $users = DI::get()->getUsers(); $user = $chain->getFrom(); $lang = $user->getLang(); if (!($desiredUser = self::checkRestrictions($chain, $users))) { return; } $privates = PendingPrivates::get(); list($inviterUserId, $time) = $privates->invite($user, $desiredUser, self::getTimeoutCallableResponse()); $remainingTime = time() - $time; if ($remainingTime < $privates->getTTL() && $inviterUserId) { RespondError::make($user, [PropertiesDAO::USER_ID => $lang->getPhrase('YouAlreadySentInvitation', $privates->getTTL() - $remainingTime)]); return; } elseif (!$time && !$inviterUserId) { $newChatRoomId = uniqid('_', 1); $desiredUser->setChannelId($newChatRoomId); $desiredUser->save(); $channel = new Channel($newChatRoomId, 'Приват_' . $newChatRoomId); $channel->setOwnerId($user->getId()); ChannelsCollection::get()->addChannel($channel); $user->setChannelId($newChatRoomId); $user->save(); self::sendMatchResponse($users->getUsersByChatId($newChatRoomId), MsgToken::create('InvitationAccepted')); return; } self::sendPendingResponse($user, MsgToken::create('SendInvitationFor', $desiredUser->getProperties()->getName())); self::sendPendingResponse($desiredUser, MsgToken::create('UserInvitesYou', $user->getProperties()->getName(), $user->getId())); ChannelNotifier::updateChannelInfo($users, ChannelsCollection::get()); }
public function testInvite() { $user1 = $this->getMockUser(); $user2 = $this->getMockUser(); DI::get()->container()->add('eventloop', MockEventLoop::class, true); $dummy = function () { }; // send invitation $inviteTimestamp = time(); list($user1id, $time) = $this->privates->invite($user1, $user2, $dummy); $this->assertEquals($user1->getId(), $user1id); $this->assertNull($time); // repeat sending invitation, but it should return sign of 'already sent' by timestamp of first attempt list($user1id, $time) = $this->privates->invite($user1, $user2, $dummy); $this->assertEquals($user1->getId(), $user1id); $this->assertEquals($inviteTimestamp, $time); // accept invitation list($user1id, $time) = $this->privates->invite($user2, $user1, $dummy); $this->assertNull($user1id); $this->assertNull($time); }