asynciowrapper for sessions

This commit is contained in:
joseph 2018-09-27 11:31:21 +02:00
parent 785071a5cd
commit f50694fdc2
17 changed files with 832 additions and 29 deletions

View File

@ -0,0 +1,27 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="ConstantConditionalExpressionJS" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="ConstantIfStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="ConstantOnLHSOfComparisonJS" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="FunctionNamingConventionJS" enabled="true" level="WARNING" enabled_by_default="true">
<option name="m_regex" value="b[a-z][A-Za-z]*" />
<option name="m_minLength" value="4" />
<option name="m_maxLength" value="32" />
</inspection_tool>
<inspection_tool class="JSClassNamingConvention" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="JSNonASCIINames" enabled="true" level="WARNING" enabled_by_default="true">
<option name="myAllowOnlyAscii" value="true" />
</inspection_tool>
<inspection_tool class="LocalVariableNamingConventionJS" enabled="true" level="WARNING" enabled_by_default="true">
<option name="m_regex" value="[a-z][A-Za-z]*" />
<option name="m_minLength" value="1" />
<option name="m_maxLength" value="32" />
</inspection_tool>
<inspection_tool class="ParameterNamingConventionJS" enabled="true" level="WARNING" enabled_by_default="true">
<option name="m_regex" value="[a-z][A-Za-z]*" />
<option name="m_minLength" value="1" />
<option name="m_maxLength" value="32" />
</inspection_tool>
</profile>
</component>

7
.idea/misc.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6.1 virtualenv at C:\Users\Joseph\AppTwoVirtualEnv" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/telethon-opensource.iml" filepath="$PROJECT_DIR$/.idea/telethon-opensource.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="Unittests" />
</component>
</module>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

679
.idea/workspace.xml Normal file
View File

@ -0,0 +1,679 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="ee5414ab-9d9b-454a-9be7-ad4f82b906b2" name="Default" comment="">
<change beforePath="$PROJECT_DIR$/telethon/client/auth.py" beforeDir="false" afterPath="$PROJECT_DIR$/telethon/client/auth.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/telethon/client/downloads.py" beforeDir="false" afterPath="$PROJECT_DIR$/telethon/client/downloads.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/telethon/client/telegrambaseclient.py" beforeDir="false" afterPath="$PROJECT_DIR$/telethon/client/telegrambaseclient.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/telethon/client/updates.py" beforeDir="false" afterPath="$PROJECT_DIR$/telethon/client/updates.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/telethon/client/uploads.py" beforeDir="false" afterPath="$PROJECT_DIR$/telethon/client/uploads.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/telethon/client/users.py" beforeDir="false" afterPath="$PROJECT_DIR$/telethon/client/users.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/telethon/network/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/telethon/network/__init__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/telethon/network/connection/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/telethon/network/connection/__init__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/telethon/network/mtprotosender.py" beforeDir="false" afterPath="$PROJECT_DIR$/telethon/network/mtprotosender.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/telethon/utils.py" beforeDir="false" afterPath="$PROJECT_DIR$/telethon/utils.py" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="CoverageDataManager">
<SUITE FILE_PATH="coverage/telethon_opensource$__init__.coverage" NAME="__init__ Coverage Results" MODIFIED="1538038762109" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/telethon_tests" />
<SUITE FILE_PATH="coverage/telethon_opensource$Unittests_in_telethon_tests.coverage" NAME="Unittests in telethon_tests Coverage Results" MODIFIED="1538038767741" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/telethon_tests" />
<SUITE FILE_PATH="coverage/telethon_opensource$Unittests_for_test_crypto_CryptoTests.coverage" NAME="Unittests for test_crypto.CryptoTests Coverage Results" MODIFIED="1538038736873" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/telethon_tests" />
<SUITE FILE_PATH="coverage/telethon_opensource$Unittests_for_test_network_NetworkTests.coverage" NAME="Unittests for test_network.NetworkTests Coverage Results" MODIFIED="1538038888847" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/telethon_tests" />
<SUITE FILE_PATH="coverage/telethon_opensource$test.coverage" NAME="test Coverage Results" MODIFIED="1538040465245" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/telethon" />
<SUITE FILE_PATH="coverage/telethon_opensource$setup.coverage" NAME="setup Coverage Results" MODIFIED="1537880221604" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
</component>
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="memory.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/telethon/sessions/memory.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="312">
<caret line="183" selection-start-line="183" selection-end-line="183" />
<folding>
<element signature="e#0#21#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="users.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/telethon/client/users.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="528">
<caret line="78" selection-start-line="78" selection-end-line="78" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="dialogs.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/telethon/client/dialogs.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="510">
<caret line="131" selection-start-line="131" selection-end-line="131" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="test.py" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/telethon/test.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="292">
<caret line="30" column="42" lean-forward="true" selection-start-line="30" selection-start-column="42" selection-end-line="30" selection-end-column="42" />
<folding>
<element signature="e#0#14#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="test_parser.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/telethon_tests/test_parser.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
<file leaf-file-name="test_network.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/telethon_tests/test_network.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="738">
<caret line="41" selection-start-line="41" selection-end-line="41" selection-end-column="53" />
<folding>
<element signature="e#0#13#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>self.session.</find>
<find>f =</find>
<find>set_update</find>
<find>self.session</find>
<find>set_dc</find>
<find>auth_key_call</find>
<find>mtprot</find>
<find>set_</find>
<find>AsyncClass</find>
<find>Connection</find>
</findStrings>
<dirStrings>
<dir>D:\projects\telethon-opensource\telethon</dir>
<dir>D:\projects\telethon-opensource</dir>
</dirStrings>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/telethon/client/telegrambaseclient.py" />
<option value="$PROJECT_DIR$/telethon/client/users.py" />
<option value="$PROJECT_DIR$/telethon/utils.py" />
<option value="$PROJECT_DIR$/telethon/network/mtprotosender.py" />
<option value="$PROJECT_DIR$/telethon/network/connection/__init__.py" />
<option value="$PROJECT_DIR$/telethon/network/__init__.py" />
<option value="$PROJECT_DIR$/telethon_tests/test_network.py" />
<option value="$PROJECT_DIR$/telethon/test.py" />
</list>
</option>
</component>
<component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
<component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
<component name="JsGulpfileManager">
<detection-done>true</detection-done>
<sorting>DEFINITION_ORDER</sorting>
</component>
<component name="ProjectFrameBounds" extendedState="6">
<option name="x" value="1603" />
<option name="y" value="-8" />
<option name="width" value="1458" />
<option name="height" value="777" />
</component>
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="Scope" />
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="telethon-opensource" type="b2602c69:ProjectViewProjectNode" />
<item name="telethon-opensource" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="telethon-opensource" type="b2602c69:ProjectViewProjectNode" />
<item name="telethon-opensource" type="462c0819:PsiDirectoryNode" />
<item name="telethon" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="telethon-opensource" type="b2602c69:ProjectViewProjectNode" />
<item name="telethon-opensource" type="462c0819:PsiDirectoryNode" />
<item name="telethon_tests" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
</pane>
</panes>
</component>
<component name="PropertiesComponent">
<property name="SearchEverywhereHistoryKey" value="&#9;FILE&#9;file://D:/projects/telethon-opensource/telethon/client/telegramclient.py" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
<property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PythonContentEntriesConfigurable" />
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="RunManager" selected="Python.test">
<configuration name="__init__" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="telethon-opensource" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/telethon_tests" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/telethon_tests/__init__.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
</configuration>
<configuration name="test" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="telethon-opensource" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/telethon" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/telethon/test.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
</configuration>
<configuration name="Unittests for test_crypto.CryptoTests" type="tests" factoryName="Unittests" temporary="true" nameIsGenerated="true">
<module name="telethon-opensource" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/telethon_tests" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="_new_additionalArguments" value="&quot;&quot;" />
<option name="_new_target" value="&quot;test_crypto.CryptoTests&quot;" />
<option name="_new_targetType" value="&quot;PYTHON&quot;" />
</configuration>
<configuration name="Unittests for test_network.NetworkTests" type="tests" factoryName="Unittests" temporary="true" nameIsGenerated="true">
<module name="telethon-opensource" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/telethon_tests" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="_new_additionalArguments" value="&quot;&quot;" />
<option name="_new_target" value="&quot;test_network.NetworkTests&quot;" />
<option name="_new_targetType" value="&quot;PYTHON&quot;" />
</configuration>
<configuration name="Unittests in telethon_tests" type="tests" factoryName="Unittests" temporary="true" nameIsGenerated="true">
<module name="telethon-opensource" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/telethon_tests" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="_new_additionalArguments" value="&quot;&quot;" />
<option name="_new_target" value="&quot;$PROJECT_DIR$/telethon_tests&quot;" />
<option name="_new_targetType" value="&quot;PATH&quot;" />
</configuration>
<list>
<item itemvalue="Python.test" />
<item itemvalue="Python tests.Unittests for test_crypto.CryptoTests" />
<item itemvalue="Python.__init__" />
<item itemvalue="Python tests.Unittests in telethon_tests" />
<item itemvalue="Python tests.Unittests for test_network.NetworkTests" />
</list>
<recent_temporary>
<list>
<item itemvalue="Python.test" />
<item itemvalue="Python tests.Unittests for test_network.NetworkTests" />
<item itemvalue="Python tests.Unittests in telethon_tests" />
<item itemvalue="Python.__init__" />
<item itemvalue="Python tests.Unittests for test_crypto.CryptoTests" />
</list>
</recent_temporary>
</component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="ee5414ab-9d9b-454a-9be7-ad4f82b906b2" name="Default" comment="" />
<created>1537880100846</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1537880100846</updated>
</task>
<servers />
</component>
<component name="TestHistory">
<history-entry file="Unittests_for_test_crypto_CryptoTests - 2018.09.27 at 10h 58m 57s.xml">
<configuration name="Unittests for test_crypto.CryptoTests" configurationId="tests" />
</history-entry>
<history-entry file="Unittests_in_telethon_tests - 2018.09.27 at 10h 59m 28s.xml">
<configuration name="Unittests in telethon_tests" configurationId="tests" />
</history-entry>
<history-entry file="Unittests_for_test_network_NetworkTests - 2018.09.27 at 11h 00m 34s.xml">
<configuration name="Unittests for test_network.NetworkTests" configurationId="tests" />
</history-entry>
<history-entry file="Unittests_for_test_network_NetworkTests - 2018.09.27 at 11h 01m 29s.xml">
<configuration name="Unittests for test_network.NetworkTests" configurationId="tests" />
</history-entry>
</component>
<component name="ToolWindowManager">
<frame x="-7" y="-7" width="2575" height="1415" extended-state="6" />
<editor active="true" />
<layout>
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="bottom" id="Event Log" side_tool="true" />
<window_info anchor="bottom" id="Database Changes" show_stripe_button="false" />
<window_info anchor="bottom" id="Run" order="2" visible="true" weight="0.45269743" />
<window_info anchor="bottom" id="Version Control" />
<window_info anchor="bottom" id="Python Console" weight="0.32994527" />
<window_info anchor="bottom" id="Terminal" />
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.24970178" />
<window_info anchor="bottom" id="Statistic" />
<window_info anchor="bottom" id="Docker" show_stripe_button="false" />
<window_info anchor="right" id="Database" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info anchor="right" id="SciView" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.3995309" />
<window_info id="Favorites" side_tool="true" />
<window_info anchor="right" id="Commander" order="0" weight="0.4" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
</layout>
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="1" />
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
<url>file://$PROJECT_DIR$/telethon/client/users.py</url>
<line>290</line>
<option name="timeStamp" value="24" />
</line-breakpoint>
</breakpoints>
<default-breakpoints>
<breakpoint type="python-exception">
<properties notifyOnTerminate="true" exception="BaseException">
<option name="notifyOnTerminate" value="true" />
</properties>
</breakpoint>
</default-breakpoints>
<option name="time" value="25" />
</breakpoint-manager>
</component>
<component name="debuggerHistoryManager">
<expressions id="evaluateExpression">
<expression>
<expression-string>x,y=(*args,)</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>x,y=*args</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>x=(*args,)</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>x=(*args)</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>args</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>x=*args</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>*args</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>w</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>w()</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
</expressions>
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/telethon/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<folding>
<element signature="e#0#14#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/setup.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="306">
<caret line="25" column="37" selection-start-line="25" selection-start-column="37" selection-end-line="25" selection-end-column="37" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/tl/functions/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="277">
<caret line="22" column="8" selection-start-line="22" selection-start-column="8" selection-end-line="22" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/sessions/string.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="180">
<caret line="10" column="26" lean-forward="true" selection-start-line="10" selection-start-column="26" selection-end-line="10" selection-end-column="26" />
<folding>
<element signature="e#0#13#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/telethon/sessions/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<folding>
<element signature="e#0#29#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/AppData/Local/Programs/Python/Python36-32/Lib/asyncio/events.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="247">
<caret line="126" selection-start-line="126" selection-end-line="126" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/client/auth.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1170">
<caret line="16" column="8" selection-start-line="16" selection-start-column="8" selection-end-line="16" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/sessions/abstract.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="126">
<caret line="14" column="8" selection-start-line="14" selection-start-column="8" selection-end-line="14" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/client/telegrambaseclient.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="582">
<caret line="228" selection-start-line="228" selection-end-line="228" />
<folding>
<element signature="e#0#10#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/AppData/Local/Programs/Python/Python36-32/Lib/asyncio/base_events.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="240">
<caret line="465" selection-start-line="465" selection-end-line="465" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/AppTwoVirtualEnv/Lib/site-packages/async_generator/_impl.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="6750">
<caret line="382" column="11" selection-start-line="382" selection-start-column="11" selection-end-line="382" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/tl/functions/messages.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="485">
<caret line="1179" selection-start-line="1179" selection-end-line="1179" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/client/dialogs.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="510">
<caret line="131" selection-start-line="131" selection-end-line="131" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/client/users.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="528">
<caret line="78" selection-start-line="78" selection-end-line="78" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/sessions/sqlite.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-903">
<caret line="183" column="12" selection-start-line="183" selection-start-column="8" selection-end-line="183" selection-end-column="12" />
<folding>
<element signature="e#0#15#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/client/telegramclient.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/telethon/utils.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="258">
<caret line="122" selection-start-line="122" selection-end-line="122" />
<folding>
<element signature="e#159#172#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/sessions/memory.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="312">
<caret line="183" selection-start-line="183" selection-end-line="183" />
<folding>
<element signature="e#0#21#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/network/mtprotosender.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="864">
<caret line="48" column="23" lean-forward="true" selection-start-line="48" selection-start-column="23" selection-end-line="48" selection-end-column="23" />
<folding>
<element signature="e#0#14#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/network/connection/tcpfull.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="144">
<caret line="14" column="8" selection-start-line="14" selection-start-column="8" selection-end-line="14" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/network/connection/common.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="171">
<caret line="15" column="6" selection-start-line="15" selection-start-column="6" selection-end-line="15" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/network/connection/http.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="54">
<caret line="7" column="27" selection-start-line="7" selection-start-column="27" selection-end-line="7" selection-end-column="27" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/network/connection/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="90">
<caret line="5" column="30" selection-start-line="5" selection-start-column="30" selection-end-line="5" selection-end-column="30" />
<folding>
<element signature="e#0#38#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/network/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="162">
<caret line="9" column="56" selection-start-line="9" selection-start-column="56" selection-end-line="9" selection-end-column="56" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon_tests/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="90">
<caret line="5" lean-forward="true" selection-start-line="5" selection-end-line="5" />
<folding>
<element signature="e#0#36#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon_tests/test_crypto.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1022">
<caret line="17" column="46" lean-forward="true" selection-start-line="17" selection-start-column="46" selection-end-line="17" selection-end-column="46" />
<folding>
<element signature="e#0#15#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon_tests/test_parser.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/telethon_tests/test_higher_level.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="360">
<caret line="20" column="40" selection-start-line="20" selection-start-column="40" selection-end-line="20" selection-end-column="40" />
<folding>
<element signature="e#0#15#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon_tests/test_network.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="738">
<caret line="41" selection-start-line="41" selection-end-line="41" selection-end-column="53" />
<folding>
<element signature="e#0#13#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/telethon/test.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="292">
<caret line="30" column="42" lean-forward="true" selection-start-line="30" selection-start-column="42" selection-end-line="30" selection-end-column="42" />
<folding>
<element signature="e#0#14#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</component>
<component name="masterDetails">
<states>
<state key="ScopeChooserConfigurable.UI">
<settings>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
</states>
</component>
</project>

View File

@ -399,7 +399,7 @@ class AuthMethods(MessageParseMethods, UserMethods):
return False return False
await self.disconnect() await self.disconnect()
self.session.delete() await self.session.delete()
self._authorized = False self._authorized = False
return True return True

View File

@ -223,9 +223,9 @@ class DownloadMethods(UserMethods):
config = await self(functions.help.GetConfigRequest()) config = await self(functions.help.GetConfigRequest())
for option in config.dc_options: for option in config.dc_options:
if option.ip_address == self.session.server_address: if option.ip_address == self.session.server_address:
self.session.set_dc( await self.session.set_dc(
option.id, option.ip_address, option.port) option.id, option.ip_address, option.port)
self.session.save() await self.session.save()
break break
# TODO Figure out why the session may have the wrong DC ID # TODO Figure out why the session may have the wrong DC ID

View File

@ -16,7 +16,7 @@ from ..network.mtprotostate import MTProtoState
from ..sessions import Session, SQLiteSession, MemorySession from ..sessions import Session, SQLiteSession, MemorySession
from ..tl import TLObject, functions, types from ..tl import TLObject, functions, types
from ..tl.alltlobjects import LAYER from ..tl.alltlobjects import LAYER
from ..utils import AsyncClassWrapper
DEFAULT_DC_ID = 4 DEFAULT_DC_ID = 4
DEFAULT_IPV4_IP = '149.154.167.51' DEFAULT_IPV4_IP = '149.154.167.51'
DEFAULT_IPV6_IP = '[2001:67c:4e8:f002::a]' DEFAULT_IPV6_IP = '[2001:67c:4e8:f002::a]'
@ -197,8 +197,7 @@ class TelegramBaseClient(abc.ABC):
DEFAULT_PORT DEFAULT_PORT
) )
self.flood_sleep_threshold = flood_sleep_threshold self.session = AsyncClassWrapper(session)
self.session = session
self.api_id = int(api_id) self.api_id = int(api_id)
self.api_hash = api_hash self.api_hash = api_hash
@ -330,8 +329,8 @@ class TelegramBaseClient(abc.ABC):
await self._disconnect() await self._disconnect()
if getattr(self, 'session', None): if getattr(self, 'session', None):
if getattr(self, '_state', None): if getattr(self, '_state', None):
self.session.set_update_state(0, self._state) f = await self.session.set_update_state(0, self._state)
self.session.close() await self.session.close()
async def _disconnect(self): async def _disconnect(self):
""" """
@ -369,7 +368,7 @@ class TelegramBaseClient(abc.ABC):
__log__.info('Reconnecting to new data center %s', new_dc) __log__.info('Reconnecting to new data center %s', new_dc)
dc = await self._get_dc(new_dc) dc = await self._get_dc(new_dc)
self.session.set_dc(dc.id, dc.ip_address, dc.port) await self.session.set_dc(dc.id, dc.ip_address, dc.port)
# auth_key's are associated with a server, which has now changed # auth_key's are associated with a server, which has now changed
# so it's not valid anymore. Set to None to force recreating it. # so it's not valid anymore. Set to None to force recreating it.
self.session.auth_key = self._sender.state.auth_key = None self.session.auth_key = self._sender.state.auth_key = None
@ -377,14 +376,14 @@ class TelegramBaseClient(abc.ABC):
await self._disconnect() await self._disconnect()
return await self.connect() return await self.connect()
def _auth_key_callback(self, auth_key): async def _auth_key_callback(self, auth_key):
""" """
Callback from the sender whenever it needed to generate a Callback from the sender whenever it needed to generate a
new authorization key. This means we are not authorized. new authorization key. This means we are not authorized.
""" """
self._authorized = None self._authorized = None
self.session.auth_key = auth_key self.session.auth_key = auth_key
self.session.save() await self.session.save()
# endregion # endregion
@ -472,7 +471,7 @@ class TelegramBaseClient(abc.ABC):
session = self._exported_sessions.get(cdn_redirect.dc_id) session = self._exported_sessions.get(cdn_redirect.dc_id)
if not session: if not session:
dc = await self._get_dc(cdn_redirect.dc_id, cdn=True) dc = await self._get_dc(cdn_redirect.dc_id, cdn=True)
session = self.session.clone() session = await self.session.clone()
session.set_dc(dc.id, dc.ip_address, dc.port) session.set_dc(dc.id, dc.ip_address, dc.port)
self._exported_sessions[cdn_redirect.dc_id] = session self._exported_sessions[cdn_redirect.dc_id] = session

View File

@ -137,7 +137,7 @@ class UpdateMethods(UserMethods):
This can also be used to forcibly fetch new updates if there are any. This can also be used to forcibly fetch new updates if there are any.
""" """
state = self.session.get_update_state(0) state = await self.session.get_update_state(0)
if not state or not state.pts: if not state or not state.pts:
state = await self(functions.updates.GetStateRequest()) state = await self(functions.updates.GetStateRequest())
@ -172,15 +172,15 @@ class UpdateMethods(UserMethods):
state.pts = d.pts state.pts = d.pts
break break
finally: finally:
self.session.set_update_state(0, state) await self.session.set_update_state(0, state)
self.session.catching_up = False self.session.catching_up = False
# endregion # endregion
# region Private methods # region Private methods
def _handle_update(self, update): async def _handle_update(self, update):
self.session.process_entities(update) await self.session.process_entities(update)
if isinstance(update, (types.Updates, types.UpdatesCombined)): if isinstance(update, (types.Updates, types.UpdatesCombined)):
entities = {utils.get_peer_id(x): x for x in entities = {utils.get_peer_id(x): x for x in
itertools.chain(update.users, update.chats)} itertools.chain(update.users, update.chats)}
@ -236,7 +236,7 @@ class UpdateMethods(UserMethods):
# inserted because this is a rather expensive operation # inserted because this is a rather expensive operation
# (default's sqlite3 takes ~0.1s to commit changes). Do # (default's sqlite3 takes ~0.1s to commit changes). Do
# it every minute instead. No-op if there's nothing new. # it every minute instead. No-op if there's nothing new.
self.session.save() await self.session.save()
# We need to send some content-related request at least hourly # We need to send some content-related request at least hourly
# for Telegram to keep delivering updates, otherwise they will # for Telegram to keep delivering updates, otherwise they will

View File

@ -211,7 +211,7 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
entity, media=types.InputMediaUploadedPhoto(fh) entity, media=types.InputMediaUploadedPhoto(fh)
)) ))
input_photo = utils.get_input_photo(r.photo) input_photo = utils.get_input_photo(r.photo)
self.session.cache_file(fh.md5, fh.size, input_photo) await self.session.cache_file(fh.md5, fh.size, input_photo)
fh = input_photo fh = input_photo
if captions: if captions:
@ -326,7 +326,7 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
file = stream.read() file = stream.read()
hash_md5.update(file) hash_md5.update(file)
if use_cache: if use_cache:
cached = self.session.get_file( cached = await self.session.get_file(
hash_md5.digest(), file_size, cls=use_cache hash_md5.digest(), file_size, cls=use_cache
) )
if cached: if cached:
@ -446,7 +446,7 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
) )
return file_handle, media return file_handle, media
def _cache_media(self, msg, file, file_handle, async def _cache_media(self, msg, file, file_handle,
force_document=False): force_document=False):
if file and msg and isinstance(file_handle, if file and msg and isinstance(file_handle,
custom.InputSizedFile): custom.InputSizedFile):
@ -457,6 +457,6 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
to_cache = utils.get_input_photo(msg.media.photo) to_cache = utils.get_input_photo(msg.media.photo)
else: else:
to_cache = utils.get_input_document(msg.media.document) to_cache = utils.get_input_document(msg.media.document)
self.session.cache_file(md5, size, to_cache) await self.session.cache_file(md5, size, to_cache)
# endregion # endregion

View File

@ -48,7 +48,7 @@ class UserMethods(TelegramBaseClient):
exceptions.append(e) exceptions.append(e)
results.append(None) results.append(None)
continue continue
self.session.process_entities(result) await self.session.process_entities(result)
exceptions.append(None) exceptions.append(None)
results.append(result) results.append(result)
request_index += 1 request_index += 1
@ -58,7 +58,7 @@ class UserMethods(TelegramBaseClient):
return results return results
else: else:
result = await future result = await future
self.session.process_entities(result) await self.session.process_entities(result)
return result return result
except (errors.ServerError, errors.RpcCallFailError) as e: except (errors.ServerError, errors.RpcCallFailError) as e:
__log__.warning('Telegram is having internal issues %s: %s', __log__.warning('Telegram is having internal issues %s: %s',
@ -288,7 +288,7 @@ class UserMethods(TelegramBaseClient):
try: try:
# First try to get the entity from cache, otherwise figure it out # First try to get the entity from cache, otherwise figure it out
return self.session.get_input_entity(peer) return await self.session.get_input_entity(peer)
except ValueError: except ValueError:
pass pass
@ -393,7 +393,7 @@ class UserMethods(TelegramBaseClient):
try: try:
# Nobody with this username, maybe it's an exact name/title # Nobody with this username, maybe it's an exact name/title
return await self.get_entity( return await self.get_entity(
self.session.get_input_entity(string)) await self.session.get_input_entity(string))
except ValueError: except ValueError:
pass pass

View File

@ -7,5 +7,5 @@ from .authenticator import do_authentication
from .mtprotosender import MTProtoSender from .mtprotosender import MTProtoSender
from .connection import ( from .connection import (
ConnectionTcpFull, ConnectionTcpAbridged, ConnectionTcpObfuscated, ConnectionTcpFull, ConnectionTcpAbridged, ConnectionTcpObfuscated,
ConnectionTcpIntermediate, ConnectionHttp ConnectionTcpIntermediate, ConnectionHttp,Connection
) )

View File

@ -3,3 +3,4 @@ from .tcpabridged import ConnectionTcpAbridged
from .tcpobfuscated import ConnectionTcpObfuscated from .tcpobfuscated import ConnectionTcpObfuscated
from .tcpintermediate import ConnectionTcpIntermediate from .tcpintermediate import ConnectionTcpIntermediate
from .http import ConnectionHttp from .http import ConnectionHttp
from .common import Connection

View File

@ -15,7 +15,7 @@ from ..tl.types import (
MsgNewDetailedInfo, NewSessionCreated, MsgDetailedInfo, MsgsStateReq, MsgNewDetailedInfo, NewSessionCreated, MsgDetailedInfo, MsgsStateReq,
MsgsStateInfo, MsgsAllInfo, MsgResendReq, upload MsgsStateInfo, MsgsAllInfo, MsgResendReq, upload
) )
from ..utils import AsyncClassWrapper
__log__ = logging.getLogger(__name__) __log__ = logging.getLogger(__name__)
@ -262,7 +262,7 @@ class MTProtoSender:
await authenticator.do_authentication(plain) await authenticator.do_authentication(plain)
if self._auth_key_callback: if self._auth_key_callback:
self._auth_key_callback(self.state.auth_key) await self._auth_key_callback(self.state.auth_key)
break break
except (SecurityError, AssertionError) as e: except (SecurityError, AssertionError) as e:
@ -570,7 +570,7 @@ class MTProtoSender:
__log__.debug('Handling update {}' __log__.debug('Handling update {}'
.format(message.obj.__class__.__name__)) .format(message.obj.__class__.__name__))
if self._update_callback: if self._update_callback:
self._update_callback(message.obj) await self._update_callback(message.obj)
async def _handle_pong(self, message): async def _handle_pong(self, message):
""" """

47
telethon/test.py Normal file
View File

@ -0,0 +1,47 @@
import inspect
import asyncio
from telethon.utils import AsyncClassWrapper
class session:
test1='test1'
async def test2(self,arg):
print(arg)
def test3(self,arg):
print("test3")
@property
def test4(self):
return "test4"
async def t():
s = AsyncClassWrapper(session())
print(s.test1)
await s.test2("test2")
await s.test3("k")
print(s.test4)
s.test5 = "hey"
print(s.test5)
asyncio.get_event_loop().run_until_complete(t())
import inspect
import asyncio
from telethon.client import TelegramClient
api_hash = ""
api_id = 12345
async def main():
client = TelegramClient(None, api_id, api_hash)
await client.session.set_dc(2, '149.154.167.40', 443)
await client.start(
phone='9996621234', code_callback=lambda: '22222'
)
print(await client.get_dialogs())
await client.send_message("me","heyh")
asyncio.get_event_loop().run_until_complete(main())

View File

@ -16,6 +16,7 @@ from types import GeneratorType
from .extensions import markdown, html from .extensions import markdown, html
from .helpers import add_surrogate, del_surrogate from .helpers import add_surrogate, del_surrogate
from .tl import types from .tl import types
import inspect
try: try:
import hachoir import hachoir
@ -970,3 +971,20 @@ def get_appropriated_part_size(file_size):
return 512 return 512
raise ValueError('File size too large') raise ValueError('File size too large')
class AsyncClassWrapper:
def __init__(self, wrapped):
self.wrapped = wrapped
def __getattr__(self, item):
w = getattr(self.wrapped, item)
async def wrapper(*args,**kwargs):
val = w(*args, **kwargs)
return await val if inspect.isawaitable(val) else val
if inspect.isfunction(w) or inspect.ismethod(w):
return wrapper
elif isinstance(w,property):
return w.fget(self.wrapped)
else:
return w