Compare commits

...

8 Commits

Author SHA1 Message Date
Tulir Asokan 005daa9ee2 Bump version to 0.2.0 2018-06-08 11:55:59 +03:00
Tulir Asokan 7029102c0f Bump version to 0.2.0rc6 2018-06-06 13:39:09 +03:00
Tulir Asokan 708110eb08 Make cascade rules alembic upgrade optional to un-break sqlite 2018-06-03 14:30:19 +03:00
Tulir Asokan c0da861562 Add warning about delete-portal kicking all room members 2018-06-01 18:05:35 +03:00
Tulir Asokan 844cf14bcd Bump version to 0.2.0rc5 2018-06-01 13:27:20 +03:00
Tulir Asokan fe32475e10 Fix kicking Telegram puppets and fix error message when bridging chats you've left 2018-05-31 11:19:24 +03:00
Tulir Asokan f28f5915a4 Don't create portal in response to relaybot events. Fixes #145 2018-05-31 11:18:48 +03:00
Tulir Asokan 1aa80c1a8f Fix user_portal delete cascade when deleting portals 2018-05-31 11:18:20 +03:00
7 changed files with 68 additions and 8 deletions
@@ -0,0 +1,41 @@
"""Add cascade rules to UserPortal
Revision ID: 2228d49c383f
Revises: bcfefa1f1299
Create Date: 2018-05-31 11:11:59.482112
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '2228d49c383f'
down_revision = 'bcfefa1f1299'
branch_labels = None
depends_on = None
def upgrade():
try:
with op.batch_alter_table("user_portal") as batch_op:
batch_op.drop_constraint("user_portal_user_fkey", type_="foreignkey")
batch_op.drop_constraint("user_portal_portal_fkey", type_="foreignkey")
batch_op.create_foreign_key("user_portal_user_fkey", "user", ["user"], ["tgid"],
onupdate="CASCADE", ondelete="CASCADE")
batch_op.create_foreign_key("user_portal_portal_fkey", "portal",
["portal", "portal_receiver"], ["tgid", "tg_receiver"],
onupdate="CASCADE", ondelete="CASCADE")
except ValueError:
return
def downgrade():
try:
with op.batch_alter_table("user_portal") as batch_op:
batch_op.drop_constraint("user_portal_user_fkey", type_="foreignkey")
batch_op.drop_constraint("user_portal_portal_fkey", type_="foreignkey")
batch_op.create_foreign_key("user_portal_user_fkey", "portal",
["portal", "portal_receiver"], ["tgid", "tg_receiver"])
batch_op.create_foreign_key("user_portal_portal_fkey", "user", ["user"], ["tgid"])
except ValueError:
return
@@ -50,9 +50,13 @@ def upgrade():
sa.Column('portal', sa.Integer), sa.Column('portal', sa.Integer),
sa.Column('portal_receiver', sa.Integer), sa.Column('portal_receiver', sa.Integer),
sa.PrimaryKeyConstraint('user', 'portal', 'portal_receiver'), sa.PrimaryKeyConstraint('user', 'portal', 'portal_receiver'),
sa.ForeignKeyConstraint(("user",), ("user.tgid",)), sa.ForeignKeyConstraint(("user",), ("user.tgid",),
name="user_portal_user_fkey",
onupdate="CASCADE", ondelete="CASCADE"),
sa.ForeignKeyConstraint(("portal", "portal_receiver"), sa.ForeignKeyConstraint(("portal", "portal_receiver"),
("portal.tgid", "portal.tg_receiver"))) ("portal.tgid", "portal.tg_receiver"),
name="user_portal_portal_fkey",
onupdate="CASCADE", ondelete="CASCADE"))
op.create_table('message', op.create_table('message',
sa.Column('mxid', sa.String), sa.Column('mxid', sa.String),
sa.Column('mx_room', sa.String), sa.Column('mx_room', sa.String),
+1 -1
View File
@@ -1,2 +1,2 @@
__version__ = "0.2.0rc4" __version__ = "0.2.0"
__author__ = "Tulir Asokan <tulir@maunium.net>" __author__ = "Tulir Asokan <tulir@maunium.net>"
+12 -1
View File
@@ -17,6 +17,7 @@
import asyncio import asyncio
from telethon.errors import * from telethon.errors import *
from telethon.tl.types import ChatForbidden, ChannelForbidden
from mautrix_appservice import MatrixRequestError from mautrix_appservice import MatrixRequestError
from .. import portal as po from .. import portal as po
@@ -114,7 +115,11 @@ async def delete_portal(evt: CommandEvent):
return await evt.reply("Please confirm deletion of portal " return await evt.reply("Please confirm deletion of portal "
f"[{portal.alias or portal.mxid}](https://matrix.to/#/{portal.mxid}) " f"[{portal.alias or portal.mxid}](https://matrix.to/#/{portal.mxid}) "
f"to Telegram chat \"{portal.title}\" " f"to Telegram chat \"{portal.title}\" "
"by typing `$cmdprefix+sp confirm-delete`") "by typing `$cmdprefix+sp confirm-delete`"
"\n\n"
"**WARNING:** If the bridge bot has the power level to do so, **this "
"will kick ALL users** in the room. If you just want to remove the "
"bridge, use `$cmdprefix+sp unbridge` instead.")
@command_handler(needs_auth=False) @command_handler(needs_auth=False)
@@ -258,6 +263,12 @@ async def confirm_bridge(evt: CommandEvent):
else: else:
return await evt.reply("Failed to get info of telegram chat. " return await evt.reply("Failed to get info of telegram chat. "
"You're not logged in, is the relay bot in the chat?") "You're not logged in, is the relay bot in the chat?")
if isinstance(entity, (ChatForbidden, ChannelForbidden)):
if evt.sender.logged_in:
return await evt.reply("You don't seem to be in that chat.")
else:
return await evt.reply("The bot doesn't seem to be in that chat.")
direct = False direct = False
portal.mxid = bridge_to_mxid portal.mxid = bridge_to_mxid
+4 -2
View File
@@ -57,12 +57,14 @@ class UserPortal(Base):
query = None query = None
__tablename__ = "user_portal" __tablename__ = "user_portal"
user = Column(Integer, ForeignKey("user.tgid"), primary_key=True) user = Column(Integer, ForeignKey("user.tgid", onupdate="CASCADE", ondelete="CASCADE"),
primary_key=True)
portal = Column(Integer, primary_key=True) portal = Column(Integer, primary_key=True)
portal_receiver = Column(Integer, primary_key=True) portal_receiver = Column(Integer, primary_key=True)
__table_args__ = (ForeignKeyConstraint(("portal", "portal_receiver"), __table_args__ = (ForeignKeyConstraint(("portal", "portal_receiver"),
("portal.tgid", "portal.tg_receiver")),) ("portal.tgid", "portal.tg_receiver"),
onupdate="CASCADE", ondelete="CASCADE"),)
class User(Base): class User(Base):
+1 -1
View File
@@ -154,7 +154,7 @@ class MatrixHandler:
puppet = Puppet.get_by_mxid(user) puppet = Puppet.get_by_mxid(user)
if sender and puppet: if sender and puppet:
await portal.leave_matrix(puppet, sender) await portal.leave_matrix(puppet, sender, event_id)
user = User.get_by_mxid(user, create=False) user = User.get_by_mxid(user, create=False)
if not user: if not user:
+3 -1
View File
@@ -1318,6 +1318,8 @@ class Portal:
await intent.redact(self.mxid, mxid) await intent.redact(self.mxid, mxid)
async def _create_room_on_action(self, source, action): async def _create_room_on_action(self, source, action):
if source.is_relaybot:
return False
create_and_exit = (MessageActionChatCreate, MessageActionChannelCreate) create_and_exit = (MessageActionChatCreate, MessageActionChannelCreate)
create_and_continue = (MessageActionChatAddUser, MessageActionChatJoinedByLink) create_and_continue = (MessageActionChatAddUser, MessageActionChatJoinedByLink)
if isinstance(action, create_and_exit + create_and_continue): if isinstance(action, create_and_exit + create_and_continue):
@@ -1331,7 +1333,7 @@ class Portal:
action = update.action action = update.action
should_ignore = ((not self.mxid and not await self._create_room_on_action(source, action)) should_ignore = ((not self.mxid and not await self._create_room_on_action(source, action))
or self.is_duplicate_action(update)) or self.is_duplicate_action(update))
if should_ignore: if should_ignore or not self.mxid:
return return
# TODO figure out how to see changes to about text / channel username # TODO figure out how to see changes to about text / channel username
if isinstance(action, MessageActionChatEditTitle): if isinstance(action, MessageActionChatEditTitle):