예제 #1
0
파일: session.py 프로젝트: zolemar/pyrogram
    def next_salt(self):
        log.debug("NextSaltThread started")

        while True:
            now = datetime.now()

            # Seconds to wait until middle-overlap, which is
            # 15 minutes before/after the current/next salt end/start time
            dt = (self.current_salt.valid_until - now).total_seconds() - 900

            log.debug("Current salt: {} | Next salt in {:.0f}m {:.0f}s ({})".format(
                self.current_salt.salt,
                dt // 60,
                dt % 60,
                now + timedelta(seconds=dt)
            ))

            self.next_salt_thread_event.wait(dt)

            if self.next_salt_thread_event.is_set():
                break

            try:
                self.current_salt = self._send(functions.GetFutureSalts(1)).salts[0]
            except (OSError, TimeoutError):
                self.connection.close()
                break

        log.debug("NextSaltThread stopped")
예제 #2
0
    async def next_salt(self):
        log.info("NextSaltTask started")

        while True:
            now = datetime.now()

            # Seconds to wait until middle-overlap, which is
            # 15 minutes before/after the current/next salt end/start time
            valid_until = datetime.fromtimestamp(self.current_salt.valid_until)
            dt = (valid_until - now).total_seconds() - 900

            log.info("Next salt in {:.0f}m {:.0f}s ({})".format(
                dt // 60, dt % 60, now + timedelta(seconds=dt)))

            try:
                await asyncio.wait_for(self.next_salt_task_event.wait(), dt)
            except asyncio.TimeoutError:
                pass
            else:
                break

            try:
                self.current_salt = (await
                                     self._send(functions.GetFutureSalts(num=1)
                                                )).salts[0]
            except (OSError, TimeoutError, RPCError):
                self.connection.close()
                break

        log.info("NextSaltTask stopped")
예제 #3
0
    def start(self):
        while True:
            self.connection = Connection(
                DataCenter(self.dc_id, self.client.test_mode),
                self.client.proxy)

            try:
                self.connection.connect()

                for i in range(self.NET_WORKERS):
                    self.net_worker_list.append(
                        Thread(target=self.net_worker,
                               name="NetWorker#{}".format(i + 1)))

                    self.net_worker_list[-1].start()

                Thread(target=self.recv, name="RecvThread").start()

                self.current_salt = FutureSalt(0, 0, self.INITIAL_SALT)
                self.current_salt = FutureSalt(
                    0, 0,
                    self._send(functions.Ping(0)).new_server_salt)
                self.current_salt = self._send(
                    functions.GetFutureSalts(1)).salts[0]

                self.next_salt_thread = Thread(target=self.next_salt,
                                               name="NextSaltThread")
                self.next_salt_thread.start()

                if not self.is_cdn:
                    self._send(
                        functions.InvokeWithLayer(
                            layer,
                            functions.InitConnection(
                                api_id=self.client.api_id,
                                app_version=self.client.app_version,
                                device_model=self.client.device_model,
                                system_version=self.client.system_version,
                                system_lang_code=self.client.lang_code,
                                lang_code=self.client.lang_code,
                                lang_pack="",
                                query=functions.help.GetConfig(),
                            )))

                self.ping_thread = Thread(target=self.ping, name="PingThread")
                self.ping_thread.start()

                log.info("Connection inited: Layer {}".format(layer))
            except (OSError, TimeoutError, Error):
                self.stop()
            except Exception as e:
                self.stop()
                raise e
            else:
                break

        self.is_connected.set()

        log.debug("Session started")
예제 #4
0
    async def start(self):
        while True:
            self.connection = Connection(self.dc_id,
                                         self.client.storage.test_mode(),
                                         self.client.ipv6, self.client.proxy)

            try:
                await self.connection.connect()

                self.net_worker_task = asyncio.ensure_future(self.net_worker())
                self.recv_task = asyncio.ensure_future(self.recv())

                self.current_salt = FutureSalt(0, 0, Session.INITIAL_SALT)
                self.current_salt = FutureSalt(0, 0, (await self._send(
                    functions.Ping(ping_id=0),
                    timeout=self.START_TIMEOUT)).new_server_salt)
                self.current_salt = \
                    (await self._send(functions.GetFutureSalts(num=1), timeout=self.START_TIMEOUT)).salts[0]

                self.next_salt_task = asyncio.ensure_future(self.next_salt())

                if not self.is_cdn:
                    await self._send(functions.InvokeWithLayer(
                        layer=layer,
                        query=functions.InitConnection(
                            api_id=self.client.api_id,
                            app_version=self.client.app_version,
                            device_model=self.client.device_model,
                            system_version=self.client.system_version,
                            system_lang_code=self.client.lang_code,
                            lang_code=self.client.lang_code,
                            lang_pack="",
                            query=functions.help.GetConfig(),
                        )),
                                     timeout=self.START_TIMEOUT)

                self.ping_task = asyncio.ensure_future(self.ping())

                log.info("Session initialized: Layer {}".format(layer))
                log.info("Device: {} - {}".format(self.client.device_model,
                                                  self.client.app_version))
                log.info("System: {} ({})".format(
                    self.client.system_version, self.client.lang_code.upper()))

            except AuthKeyDuplicated as e:
                await self.stop()
                raise e
            except (OSError, TimeoutError, RPCError):
                await self.stop()
            except Exception as e:
                await self.stop()
                raise e
            else:
                break

        self.is_connected.set()

        log.info("Session started")
예제 #5
0
    def start(self):
        while True:
            try:
                self.connection.connect()

                for i in range(self.NET_WORKERS):
                    self.net_worker_list.append(
                        Thread(target=self.net_worker,
                               name="NetWorker#{}".format(i + 1)))

                    self.net_worker_list[-1].start()

                Thread(target=self.recv, name="RecvThread").start()

                self.current_salt = FutureSalt(0, 0, self.INITIAL_SALT)
                self.current_salt = FutureSalt(
                    0, 0,
                    self._send(functions.Ping(0)).new_server_salt)
                self.current_salt = self._send(
                    functions.GetFutureSalts(1)).salts[0]

                self.next_salt_thread = Thread(target=self.next_salt,
                                               name="NextSaltThread")
                self.next_salt_thread.start()

                if not self.is_cdn:
                    self._send(
                        functions.InvokeWithLayer(
                            layer,
                            functions.InitConnection(
                                self.api_id,
                                self.DEVICE_MODEL,
                                self.SYSTEM_VERSION,
                                self.APP_VERSION,
                                "en",
                                "",
                                "en",
                                functions.help.GetConfig(),
                            )))

                self.ping_thread = Thread(target=self.ping, name="PingThread")
                self.ping_thread.start()

                log.info("Connection inited: Layer {}".format(layer))
            except (OSError, TimeoutError, Error):
                self.stop()
            except Exception as e:
                self.stop()
                raise e
            else:
                break

        self.is_connected.set()

        log.debug("Session started")
예제 #6
0
    def start(self):
        terms = None

        while True:
            try:
                self.connection.connect()

                for i in range(self.WORKERS):
                    Thread(target=self.worker,
                           name="Worker#{}".format(i + 1)).start()

                Thread(target=self.recv, name="RecvThread").start()

                self.current_salt = FutureSalt(0, 0, self.INITIAL_SALT)
                self.current_salt = FutureSalt(
                    0, 0,
                    self._send(functions.Ping(0)).new_server_salt)
                self.current_salt = self._send(
                    functions.GetFutureSalts(1)).salts[0]

                self.next_salt_thread = Thread(target=self.next_salt,
                                               name="NextSaltThread")
                self.next_salt_thread.start()

                if not self.is_cdn:
                    terms = self._send(
                        functions.InvokeWithLayer(
                            layer,
                            functions.InitConnection(
                                self.api_id,
                                self.DEVICE_MODEL,
                                self.SYSTEM_VERSION,
                                self.APP_VERSION,
                                "en",
                                "",
                                "en",
                                functions.help.GetTermsOfService(),
                            ))).text

                self.ping_thread = Thread(target=self.ping, name="PingThread")
                self.ping_thread.start()

                log.info("Connection inited: Layer {}".format(layer))
            except (OSError, TimeoutError):
                self.stop()
            else:
                break

        self.is_connected.set()
        self.total_connections += 1

        log.debug("Session started")

        return terms
예제 #7
0
    def start(self):
        while True:
            self.connection = Connection(self.dc_id,
                                         self.client.storage.test_mode(),
                                         self.client.ipv6, self.client.proxy)

            try:
                self.connection.connect()

                for i in range(self.NET_WORKERS):
                    self.net_worker_list.append(
                        Thread(target=self.net_worker,
                               name="NetWorker#{}".format(i + 1)))

                    self.net_worker_list[-1].start()

                Thread(target=self.recv, name="RecvThread").start()

                self.current_salt = FutureSalt(0, 0, self.INITIAL_SALT)
                self.current_salt = FutureSalt(
                    0, 0,
                    self._send(functions.Ping(ping_id=0),
                               timeout=self.START_TIMEOUT).new_server_salt)
                self.current_salt = self._send(
                    functions.GetFutureSalts(num=1),
                    timeout=self.START_TIMEOUT).salts[0]

                self.next_salt_thread = Thread(target=self.next_salt,
                                               name="NextSaltThread")
                self.next_salt_thread.start()

                if not self.is_cdn:
                    self._send(functions.InvokeWithLayer(
                        layer=layer,
                        query=functions.InitConnection(
                            api_id=self.client.api_id,
                            app_version=self.client.app_version,
                            device_model=self.client.device_model,
                            system_version=self.client.system_version,
                            system_lang_code=self.client.lang_code,
                            lang_code=self.client.lang_code,
                            lang_pack="",
                            query=functions.help.GetConfig(),
                        )),
                               timeout=self.START_TIMEOUT)

                self.ping_thread = Thread(target=self.ping, name="PingThread")
                self.ping_thread.start()

                log.info("Session initialized: Layer {}".format(layer))
                log.info("Device: {} - {}".format(self.client.device_model,
                                                  self.client.app_version))
                log.info("System: {} ({})".format(
                    self.client.system_version, self.client.lang_code.upper()))

            except AuthKeyDuplicated as e:
                self.stop()
                raise e
            except (OSError, TimeoutError, RPCError):
                self.stop()
            except Exception as e:
                self.stop()
                raise e
            else:
                break

        self.is_connected.set()

        log.debug("Session started")