Compare commits
8 Commits
v0.2.0-rc4
...
v0.2.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 005daa9ee2 | |||
| 7029102c0f | |||
| 708110eb08 | |||
| c0da861562 | |||
| 844cf14bcd | |||
| fe32475e10 | |||
| f28f5915a4 | |||
| 1aa80c1a8f |
@@ -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,2 +1,2 @@
|
|||||||
__version__ = "0.2.0rc4"
|
__version__ = "0.2.0"
|
||||||
__author__ = "Tulir Asokan <tulir@maunium.net>"
|
__author__ = "Tulir Asokan <tulir@maunium.net>"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user