Esempio n. 1
0
    def init_cls(cls, bridge: "TelegramBridge") -> AsyncIterable[Awaitable[None]]:
        cls.config = bridge.config
        cls.loop = bridge.loop
        cls.mx = bridge.matrix
        cls.az = bridge.az
        cls.hs_domain = cls.config["homeserver.domain"]
        mxid_tpl = SimpleTemplate(
            cls.config["bridge.username_template"],
            "userid",
            prefix="@",
            suffix=f":{Puppet.hs_domain}",
            type=int,
        )
        cls.mxid_template = cast(SimpleTemplate[TelegramID], mxid_tpl)
        cls.displayname_template = SimpleTemplate(
            cls.config["bridge.displayname_template"], "displayname"
        )
        cls.sync_with_custom_puppets = cls.config["bridge.sync_with_custom_puppets"]
        cls.homeserver_url_map = {
            server: URL(url)
            for server, url in cls.config["bridge.double_puppet_server_map"].items()
        }
        cls.allow_discover_url = cls.config["bridge.double_puppet_allow_discovery"]
        cls.login_shared_secret_map = {
            server: secret.encode("utf-8")
            for server, secret in cls.config["bridge.login_shared_secret_map"].items()
        }
        cls.login_device_name = "Telegram Bridge"

        return (puppet.try_start() async for puppet in cls.all_with_custom_mxid())
Esempio n. 2
0
def init(context: 'Context') -> Iterable[Awaitable[Any]]:
    global config
    Puppet.az, config, Puppet.loop, _ = context.core
    Puppet.mx = context.mx
    Puppet.hs_domain = config["homeserver"]["domain"]

    Puppet.mxid_template = SimpleTemplate(config["bridge.username_template"],
                                          "userid",
                                          prefix="@",
                                          suffix=f":{Puppet.hs_domain}",
                                          type=int)
    Puppet.displayname_template = SimpleTemplate(
        config["bridge.displayname_template"], "displayname")

    Puppet.sync_with_custom_puppets = config["bridge.sync_with_custom_puppets"]
    Puppet.homeserver_url_map = {
        server: URL(url)
        for server, url in config["bridge.double_puppet_server_map"].items()
    }
    Puppet.allow_discover_url = config["bridge.double_puppet_allow_discovery"]
    Puppet.login_shared_secret_map = {
        server: secret.encode("utf-8")
        for server, secret in config["bridge.login_shared_secret_map"].items()
    }
    Puppet.login_device_name = "Telegram Bridge"

    return (puppet.try_start() for puppet in Puppet.all_with_custom_mxid())
Esempio n. 3
0
def init(context: 'Context') -> None:
    global config
    Puppet.az, config, Puppet.loop = context.core
    Puppet.mx = context.mx
    Puppet.hs_domain = config["homeserver"]["domain"]
    Puppet.mxid_template = SimpleTemplate(config["bridge.username_template"],
                                          "userid",
                                          prefix="@",
                                          suffix=f":{Puppet.hs_domain}",
                                          type=str)
    Puppet.displayname_template = SimpleTemplate(
        config["bridge.displayname_template"], "displayname", type=str)
Esempio n. 4
0
def init(context: 'Context') -> Iterable[Awaitable[Any]]:
    global config
    Puppet.az, config, Puppet.loop, _ = context.core
    Puppet.mx = context.mx
    Puppet.hs_domain = config["homeserver"]["domain"]

    Puppet.mxid_template = SimpleTemplate(config["bridge.username_template"], "userid",
                                          prefix="@", suffix=f":{Puppet.hs_domain}", type=int)
    Puppet.displayname_template = SimpleTemplate(config["bridge.displayname_template"],
                                                 "displayname")

    return (puppet.try_start() for puppet in Puppet.all_with_custom_mxid())
Esempio n. 5
0
def init(context: 'Context') -> Iterable[Awaitable[Any]]:
    global config
    Puppet.az, config, Puppet.loop, _ = context.core
    Puppet.mx = context.mx
    Puppet.hs_domain = config["homeserver"]["domain"]

    Puppet.mxid_template = SimpleTemplate(config["bridge.username_template"], "userid",
                                          prefix="@", suffix=f":{Puppet.hs_domain}", type=int)
    Puppet.displayname_template = SimpleTemplate(config["bridge.displayname_template"],
                                                 "displayname")

    secret = config["bridge.login_shared_secret"]
    Puppet.login_shared_secret = secret.encode("utf-8") if secret else None
    Puppet.login_device_name = "Telegram Bridge"

    return (puppet.try_start() for puppet in Puppet.all_with_custom_mxid())
Esempio n. 6
0
def init(context: 'Context') -> Iterable[Awaitable[None]]:
    global config
    print("Puppet.init({context})")
    Puppet.az, config, Puppet.loop = context.core
    Puppet.mx = context.mx
    Puppet.hs_domain = config["homeserver"]["domain"]
    Puppet.mxid_template = SimpleTemplate(config["bridge.username_template"],
                                          "userid",
                                          prefix="@",
                                          suffix=f":{Puppet.hs_domain}",
                                          type=int)

    return (puppet.start() for puppet in Puppet.get_all_with_custom_mxid())
Esempio n. 7
0
 def init_cls(cls, bridge: 'TwitterBridge') -> AsyncIterable[Awaitable[None]]:
     cls.config = bridge.config
     cls.loop = bridge.loop
     cls.mx = bridge.matrix
     cls.az = bridge.az
     cls.hs_domain = cls.config["homeserver.domain"]
     cls.mxid_template = SimpleTemplate(cls.config["bridge.username_template"], "userid",
                                        prefix="@", suffix=f":{cls.hs_domain}", type=int)
     cls.sync_with_custom_puppets = cls.config["bridge.sync_with_custom_puppets"]
     secret = cls.config["bridge.login_shared_secret"]
     cls.login_shared_secret = secret.encode("utf-8") if secret else None
     cls.login_device_name = "Twitter DM Bridge"
     return (puppet.try_start() async for puppet in cls.all_with_custom_mxid())
Esempio n. 8
0
def init(context: Context) -> None:
    global config
    BasePortal.az, config, BasePortal.loop, BasePortal.bot = context.core
    BasePortal.matrix = context.mx
    BasePortal.max_initial_member_sync = config["bridge.max_initial_member_sync"]
    BasePortal.sync_channel_members = config["bridge.sync_channel_members"]
    BasePortal.sync_matrix_state = config["bridge.sync_matrix_state"]
    BasePortal.public_portals = config["bridge.public_portals"]
    BasePortal.filter_mode = config["bridge.filter.mode"]
    BasePortal.filter_list = config["bridge.filter.list"]
    BasePortal.hs_domain = config["homeserver.domain"]
    BasePortal.alias_template = SimpleTemplate(config["bridge.alias_template"], "groupname",
                                               prefix="#", suffix=f":{BasePortal.hs_domain}")
Esempio n. 9
0
def init(context: 'Context') -> Iterable[Awaitable[None]]:
    global config
    Puppet.az, config, Puppet.loop = context.core
    Puppet.mx = context.mx
    CustomPuppetMixin.sync_with_custom_puppets = config[
        "bridge.sync_with_custom_puppets"]
    Puppet.hs_domain = config["homeserver"]["domain"]
    Puppet.mxid_template = SimpleTemplate(config["bridge.username_template"],
                                          "userid",
                                          prefix="@",
                                          suffix=f":{Puppet.hs_domain}",
                                          type=str)

    return (puppet.try_start() for puppet in Puppet.get_all_with_custom_mxid())
Esempio n. 10
0
def init(context: 'Context') -> Iterable[Awaitable[None]]:
    global config
    Puppet.az, config, Puppet.loop = context.core
    Puppet.mx = context.mx
    CustomPuppetMixin.sync_with_custom_puppets = config["bridge.sync_with_custom_puppets"]
    Puppet.hs_domain = config["homeserver"]["domain"]
    Puppet.mxid_template = SimpleTemplate(config["bridge.username_template"], "userid",
                                          prefix="@", suffix=f":{Puppet.hs_domain}", type=str)

    secret = config["bridge.login_shared_secret"]
    Puppet.login_shared_secret = secret.encode("utf-8") if secret else None
    Puppet.login_device_name = "Facebook Messenger Bridge"

    return (puppet.try_start() for puppet in Puppet.get_all_with_custom_mxid())
Esempio n. 11
0
class Puppet(BasePuppet):
    hs_domain: str
    twid_template: SimpleTemplate[int] = SimpleTemplate("whatsapp:+{number}",
                                                        "number",
                                                        type=int)
    mxid_template: SimpleTemplate[str]
    displayname_template: SimpleTemplate[str]

    by_twid: Dict[TwilioUserID, 'Puppet'] = {}

    twid: TwilioUserID
    _formatted_number: Optional[str]

    _db_instance: Optional[DBPuppet]

    def __init__(self,
                 twid: TwilioUserID,
                 is_registered: bool = False,
                 db_instance: Optional[DBPuppet] = None) -> None:
        super().__init__()
        self.twid = twid
        self.is_registered = is_registered
        self._formatted_number = None
        self._db_instance = db_instance
        self.intent = self.az.intent.user(self.mxid)
        self.log = self.log.getChild(self.twid)
        self.by_twid[self.twid] = self

    @property
    def phone_number(self) -> int:
        return self.twid_template.parse(self.twid)

    @property
    def formatted_phone_number(self) -> str:
        if not self._formatted_number:
            parsed = phonenumbers.parse(f"+{self.phone_number}")
            fmt = phonenumbers.PhoneNumberFormat.INTERNATIONAL
            self._formatted_number = phonenumbers.format_number(parsed, fmt)
        return self._formatted_number

    @property
    def mxid(self) -> UserID:
        return UserID(self.mxid_template.format_full(str(self.phone_number)))

    @property
    def displayname(self) -> str:
        return self.displayname_template.format_full(
            self.formatted_phone_number)

    @property
    def db_instance(self) -> DBPuppet:
        if not self._db_instance:
            self._db_instance = DBPuppet(twid=self.twid,
                                         matrix_registered=self.is_registered)
        return self._db_instance

    @classmethod
    def from_db(cls, db_puppet: DBPuppet) -> 'Puppet':
        return cls(twid=db_puppet.twid,
                   is_registered=db_puppet.matrix_registered,
                   db_instance=db_puppet)

    def save(self) -> None:
        self.db_instance.edit(matrix_registered=self.is_registered)

    async def update_displayname(self) -> None:
        await self.intent.set_displayname(self.displayname)

    @classmethod
    def get_by_twid(cls,
                    twid: TwilioUserID,
                    create: bool = True) -> Optional['Puppet']:
        try:
            return cls.by_twid[twid]
        except KeyError:
            pass

        db_puppet = DBPuppet.get_by_twid(twid)
        if db_puppet:
            return cls.from_db(db_puppet)

        if create:
            puppet = cls(twid)
            puppet.db_instance.insert()
            return puppet

        return None

    @classmethod
    def get_by_mxid(cls,
                    mxid: UserID,
                    create: bool = True) -> Optional['Puppet']:
        twid = cls.get_twid_from_mxid(mxid)
        if twid:
            return cls.get_by_twid(twid, create)

        return None

    @classmethod
    def get_twid_from_mxid(cls, mxid: UserID) -> Optional[TwilioUserID]:
        parsed = cls.mxid_template.parse(mxid)
        if parsed:
            return TwilioUserID(cls.twid_template.format_full(parsed))
        return None

    @classmethod
    def get_mxid_from_twid(cls, twid: TwilioUserID) -> UserID:
        return UserID(
            cls.mxid_template.format_full(str(cls.twid_template.parse(twid))))