MadelineProto/src/danog/MadelineProto/MTProtoTools/UpdatesState.php

210 lines
4.9 KiB
PHP

<?php
/**
* UpdatesState class.
*
* This file is part of MadelineProto.
* MadelineProto is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
* MadelineProto is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details.
* You should have received a copy of the GNU General Public License along with MadelineProto.
* If not, see <http://www.gnu.org/licenses/>.
*
* @author Daniil Gentili <daniil@daniil.it>
* @copyright 2016-2020 Daniil Gentili <daniil@daniil.it>
* @license https://opensource.org/licenses/AGPL-3.0 AGPLv3
*
* @link https://docs.madelineproto.xyz MadelineProto documentation
*/
namespace danog\MadelineProto\MTProtoTools;
/**
* Stores the state of updates.
*/
class UpdatesState
{
/**
* PTS.
*/
private int $pts = 1;
/**
* QTS.
*/
private int $qts = -1;
/**
* Seq.
*/
private int $seq = 0;
/**
* Date.
*/
private int $date = 1;
/**
* Channel ID.
*
* @var int
*/
private $channelId;
/**
* Is busy?
*/
private bool $syncLoading = false;
/**
* Init function.
*
* @param array $init Initial parameters
* @param int $channelId Channel ID
*/
public function __construct(array $init = [], int $channelId = 0)
{
$this->channelId = $channelId;
$this->update($init);
}
/**
* Sleep function.
*
* @return array Parameters to serialize
*/
public function __sleep()
{
return $this->channelId ? ['pts', 'channelId'] : ['pts', 'qts', 'seq', 'date', 'channelId'];
}
/**
* Wakeup function.
*/
public function __wakeup()
{
/** @psalm-suppress DocblockTypeContradiction */
if ($this->channelId === false) {
$this->channelId = 0;
}
}
/**
* Is this state relative to a channel?
*
* @return bool
*/
public function isChannel(): bool
{
return (bool) $this->channelId;
}
/**
* Get the channel ID.
*
* @return int
*/
public function getChannel(): int
{
return $this->channelId;
}
/**
* Are we currently busy?
*
* @param bool|null $set Update the currently busy flag
*
* @return bool
*/
public function syncLoading(bool $set = null): bool
{
if ($set !== null) {
$this->syncLoading = $set;
}
return $this->syncLoading;
}
/**
* Update multiple parameters.
*
* @param array $init Parameters to update
*
* @return self
*/
public function update(array $init): self
{
foreach ($this->channelId ? ['pts'] : ['pts', 'qts', 'seq', 'date'] as $param) {
if (isset($init[$param])) {
$this->{$param}($init[$param]);
}
}
return $this;
}
/**
* Get/set PTS.
*
* @param int $set PTS to set
*
* @return int PTS
*/
public function pts(int $set = 0): int
{
if ($set !== 0 && $set > $this->pts) {
$this->pts = $set;
}
return $this->pts;
}
/**
* Get/set QTS.
*
* @param int $set QTS to set
*
* @return int QTS
*/
public function qts(int $set = 0): int
{
if ($set !== 0 && $set > $this->qts) {
$this->qts = $set;
}
return $this->qts;
}
/**
* Get/set seq.
*
* @param int $set Seq to set
*
* @return int seq
*/
public function seq(int $set = 0): int
{
if ($set !== 0 && $set > $this->seq) {
$this->seq = $set;
}
return $this->seq;
}
/**
* Get/set date.
*
* @param int $set Date to set
*
* @return int Date
*/
public function date(int $set = 0): int
{
if ($set !== 0 && $set > $this->date) {
$this->date = $set;
}
return $this->date;
}
/**
* Check validity of PTS contained in update.
*
* @param array $update Update
*
* @return int -1 if it's too old, 0 if it's ok, 1 if it's too new
*/
public function checkPts(array $update): int
{
return $update['pts'] - ($this->pts + $update['pts_count']);
}
/**
* Check validity of seq contained in update.
*
* @param int $seq Seq
*
* @return int -1 if it's too old, 0 if it's ok, 1 if it's too new
*/
public function checkSeq(int $seq): int
{
return $seq ? $seq - ($this->seq + 1) : $seq;
}
}