Add first_event_id and next_batch_id columns for portals
This commit is contained in:
@@ -22,7 +22,7 @@ from asyncpg import Record
|
|||||||
from attr import dataclass
|
from attr import dataclass
|
||||||
import attr
|
import attr
|
||||||
|
|
||||||
from mautrix.types import ContentURI, EventID, RoomID
|
from mautrix.types import BatchID, ContentURI, EventID, RoomID
|
||||||
from mautrix.util.async_db import Database
|
from mautrix.util.async_db import Database
|
||||||
|
|
||||||
from ..types import TelegramID
|
from ..types import TelegramID
|
||||||
@@ -44,6 +44,8 @@ class Portal:
|
|||||||
mxid: RoomID | None
|
mxid: RoomID | None
|
||||||
avatar_url: ContentURI | None
|
avatar_url: ContentURI | None
|
||||||
encrypted: bool
|
encrypted: bool
|
||||||
|
first_event_id: EventID | None
|
||||||
|
next_batch_id: BatchID | None
|
||||||
|
|
||||||
sponsored_event_id: EventID | None
|
sponsored_event_id: EventID | None
|
||||||
sponsored_event_ts: int | None
|
sponsored_event_ts: int | None
|
||||||
@@ -67,10 +69,28 @@ class Portal:
|
|||||||
data["local_config"] = json.loads(data.pop("config", None) or "{}")
|
data["local_config"] = json.loads(data.pop("config", None) or "{}")
|
||||||
return cls(**data)
|
return cls(**data)
|
||||||
|
|
||||||
columns: ClassVar[str] = (
|
columns: ClassVar[str] = ", ".join(
|
||||||
"tgid, tg_receiver, peer_type, megagroup, mxid, avatar_url, encrypted, sponsored_event_id,"
|
(
|
||||||
"sponsored_event_ts, sponsored_msg_random_id, username, title, about, photo_id, "
|
"tgid",
|
||||||
"name_set, avatar_set, config"
|
"tg_receiver",
|
||||||
|
"peer_type",
|
||||||
|
"megagroup",
|
||||||
|
"mxid",
|
||||||
|
"avatar_url",
|
||||||
|
"encrypted",
|
||||||
|
"first_event_id",
|
||||||
|
"next_batch_id",
|
||||||
|
"sponsored_event_id",
|
||||||
|
"sponsored_event_ts",
|
||||||
|
"sponsored_msg_random_id",
|
||||||
|
"username",
|
||||||
|
"title",
|
||||||
|
"about",
|
||||||
|
"photo_id",
|
||||||
|
"name_set",
|
||||||
|
"avatar_set",
|
||||||
|
"config",
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -112,6 +132,8 @@ class Portal:
|
|||||||
self.mxid,
|
self.mxid,
|
||||||
self.avatar_url,
|
self.avatar_url,
|
||||||
self.encrypted,
|
self.encrypted,
|
||||||
|
self.first_event_id,
|
||||||
|
self.next_batch_id,
|
||||||
self.sponsored_event_id,
|
self.sponsored_event_id,
|
||||||
self.sponsored_event_ts,
|
self.sponsored_event_ts,
|
||||||
self.sponsored_msg_random_id,
|
self.sponsored_msg_random_id,
|
||||||
@@ -128,9 +150,10 @@ class Portal:
|
|||||||
async def save(self) -> None:
|
async def save(self) -> None:
|
||||||
q = """
|
q = """
|
||||||
UPDATE portal
|
UPDATE portal
|
||||||
SET mxid=$4, avatar_url=$5, encrypted=$6, sponsored_event_id=$7, sponsored_event_ts=$8,
|
SET mxid=$4, avatar_url=$5, encrypted=$6, first_event_id=$7, next_batch_id=$8,
|
||||||
sponsored_msg_random_id=$9, username=$10, title=$11, about=$12, photo_id=$13,
|
sponsored_event_id=$9, sponsored_event_ts=$10, sponsored_msg_random_id=$11,
|
||||||
name_set=$14, avatar_set=$15, megagroup=$16, config=$17
|
username=$12, title=$13, about=$14, photo_id=$15, name_set=$16, avatar_set=$17,
|
||||||
|
megagroup=$18, config=$19
|
||||||
WHERE tgid=$1 AND tg_receiver=$2 AND (peer_type=$3 OR true)
|
WHERE tgid=$1 AND tg_receiver=$2 AND (peer_type=$3 OR true)
|
||||||
"""
|
"""
|
||||||
await self.db.execute(q, *self._values)
|
await self.db.execute(q, *self._values)
|
||||||
@@ -148,10 +171,11 @@ class Portal:
|
|||||||
async def insert(self) -> None:
|
async def insert(self) -> None:
|
||||||
q = """
|
q = """
|
||||||
INSERT INTO portal (
|
INSERT INTO portal (
|
||||||
tgid, tg_receiver, peer_type, mxid, avatar_url, encrypted,
|
tgid, tg_receiver, peer_type, mxid, avatar_url, encrypted, first_event_id,
|
||||||
sponsored_event_id, sponsored_event_ts, sponsored_msg_random_id,
|
next_batch_id, sponsored_event_id, sponsored_event_ts, sponsored_msg_random_id,
|
||||||
username, title, about, photo_id, name_set, avatar_set, megagroup, config
|
username, title, about, photo_id, name_set, avatar_set, megagroup, config
|
||||||
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17)
|
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18,
|
||||||
|
$19)
|
||||||
"""
|
"""
|
||||||
await self.db.execute(q, *self._values)
|
await self.db.execute(q, *self._values)
|
||||||
|
|
||||||
|
|||||||
@@ -10,4 +10,5 @@ from . import (
|
|||||||
v05_channel_ghosts,
|
v05_channel_ghosts,
|
||||||
v06_puppet_avatar_url,
|
v06_puppet_avatar_url,
|
||||||
v07_puppet_phone_number,
|
v07_puppet_phone_number,
|
||||||
|
v08_infinite_backfill,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# mautrix-telegram - A Matrix-Telegram puppeting bridge
|
||||||
|
# Copyright (C) 2022 Tulir Asokan
|
||||||
|
#
|
||||||
|
# This program 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.
|
||||||
|
#
|
||||||
|
# This program 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 Affero General Public License
|
||||||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
from mautrix.util.async_db import Connection
|
||||||
|
|
||||||
|
from . import upgrade_table
|
||||||
|
|
||||||
|
|
||||||
|
@upgrade_table.register(description="Switch to infinite backfill with MSC2716")
|
||||||
|
async def upgrade_v8(conn: Connection) -> None:
|
||||||
|
await conn.execute("ALTER TABLE portal ADD COLUMN first_event_id TEXT")
|
||||||
|
await conn.execute("ALTER TABLE portal ADD COLUMN next_batch_id TEXT")
|
||||||
@@ -167,6 +167,7 @@ from mautrix.appservice import DOUBLE_PUPPET_SOURCE_KEY, IntentAPI
|
|||||||
from mautrix.bridge import BasePortal, NotificationDisabler, RejectMatrixInvite, async_getter_lock
|
from mautrix.bridge import BasePortal, NotificationDisabler, RejectMatrixInvite, async_getter_lock
|
||||||
from mautrix.errors import IntentError, MatrixRequestError, MForbidden
|
from mautrix.errors import IntentError, MatrixRequestError, MForbidden
|
||||||
from mautrix.types import (
|
from mautrix.types import (
|
||||||
|
BatchID,
|
||||||
ContentURI,
|
ContentURI,
|
||||||
EventID,
|
EventID,
|
||||||
EventType,
|
EventType,
|
||||||
@@ -221,6 +222,7 @@ if TYPE_CHECKING:
|
|||||||
|
|
||||||
StateBridge = EventType.find("m.bridge", EventType.Class.STATE)
|
StateBridge = EventType.find("m.bridge", EventType.Class.STATE)
|
||||||
StateHalfShotBridge = EventType.find("uk.half-shot.bridge", EventType.Class.STATE)
|
StateHalfShotBridge = EventType.find("uk.half-shot.bridge", EventType.Class.STATE)
|
||||||
|
DummyPortalCreated = EventType.find("fi.mau.dummy.portal_created", EventType.Class.MESSAGE)
|
||||||
BEEPER_LINK_PREVIEWS_KEY = "com.beeper.linkpreviews"
|
BEEPER_LINK_PREVIEWS_KEY = "com.beeper.linkpreviews"
|
||||||
BEEPER_IMAGE_ENCRYPTION_KEY = "beeper:image:encryption"
|
BEEPER_IMAGE_ENCRYPTION_KEY = "beeper:image:encryption"
|
||||||
|
|
||||||
@@ -304,6 +306,8 @@ class Portal(DBPortal, BasePortal):
|
|||||||
mxid: RoomID | None = None,
|
mxid: RoomID | None = None,
|
||||||
avatar_url: ContentURI | None = None,
|
avatar_url: ContentURI | None = None,
|
||||||
encrypted: bool = False,
|
encrypted: bool = False,
|
||||||
|
first_event_id: EventID | None = None,
|
||||||
|
next_batch_id: BatchID | None = None,
|
||||||
sponsored_event_id: EventID | None = None,
|
sponsored_event_id: EventID | None = None,
|
||||||
sponsored_event_ts: int | None = None,
|
sponsored_event_ts: int | None = None,
|
||||||
sponsored_msg_random_id: bytes | None = None,
|
sponsored_msg_random_id: bytes | None = None,
|
||||||
@@ -323,6 +327,8 @@ class Portal(DBPortal, BasePortal):
|
|||||||
mxid=mxid,
|
mxid=mxid,
|
||||||
avatar_url=avatar_url,
|
avatar_url=avatar_url,
|
||||||
encrypted=encrypted,
|
encrypted=encrypted,
|
||||||
|
first_event_id=first_event_id,
|
||||||
|
next_batch_id=next_batch_id,
|
||||||
sponsored_event_id=sponsored_event_id,
|
sponsored_event_id=sponsored_event_id,
|
||||||
sponsored_event_ts=sponsored_event_ts,
|
sponsored_event_ts=sponsored_event_ts,
|
||||||
sponsored_msg_random_id=sponsored_msg_random_id,
|
sponsored_msg_random_id=sponsored_msg_random_id,
|
||||||
@@ -890,7 +896,11 @@ class Portal(DBPortal, BasePortal):
|
|||||||
|
|
||||||
self.mxid = room_id
|
self.mxid = room_id
|
||||||
self.by_mxid[self.mxid] = self
|
self.by_mxid[self.mxid] = self
|
||||||
|
self.first_event_id = await self.main_intent.send_message_event(
|
||||||
|
self.mxid, DummyPortalCreated, {}
|
||||||
|
)
|
||||||
await self.save()
|
await self.save()
|
||||||
|
self.log.debug(f"Matrix room created: {self.mxid}")
|
||||||
await self.az.state_store.set_power_levels(self.mxid, power_levels)
|
await self.az.state_store.set_power_levels(self.mxid, power_levels)
|
||||||
await user.register_portal(self)
|
await user.register_portal(self)
|
||||||
|
|
||||||
@@ -2211,6 +2221,8 @@ class Portal(DBPortal, BasePortal):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
self.mxid = new_id
|
self.mxid = new_id
|
||||||
|
self.next_batch_id = None
|
||||||
|
self.first_event_id = None
|
||||||
self.by_mxid[self.mxid] = self
|
self.by_mxid[self.mxid] = self
|
||||||
await self.save()
|
await self.save()
|
||||||
|
|
||||||
@@ -3546,6 +3558,8 @@ class Portal(DBPortal, BasePortal):
|
|||||||
self.name_set = False
|
self.name_set = False
|
||||||
self.avatar_set = False
|
self.avatar_set = False
|
||||||
self.about = None
|
self.about = None
|
||||||
|
self.next_batch_id = None
|
||||||
|
self.first_event_id = None
|
||||||
self.sponsored_event_id = None
|
self.sponsored_event_id = None
|
||||||
self.sponsored_event_ts = None
|
self.sponsored_event_ts = None
|
||||||
self.sponsored_msg_random_id = None
|
self.sponsored_msg_random_id = None
|
||||||
|
|||||||
Reference in New Issue
Block a user