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())
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())
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)
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())
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())
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())
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())
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}")
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())
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())
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))))