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
await self.disconnect()
self.session.delete()
await self.session.delete()
self._authorized = False
return True

View File

@ -223,9 +223,9 @@ class DownloadMethods(UserMethods):
config = await self(functions.help.GetConfigRequest())
for option in config.dc_options:
if option.ip_address == self.session.server_address:
self.session.set_dc(
await self.session.set_dc(
option.id, option.ip_address, option.port)
self.session.save()
await self.session.save()
break
# 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 ..tl import TLObject, functions, types
from ..tl.alltlobjects import LAYER
from ..utils import AsyncClassWrapper
DEFAULT_DC_ID = 4
DEFAULT_IPV4_IP = '149.154.167.51'
DEFAULT_IPV6_IP = '[2001:67c:4e8:f002::a]'
@ -197,8 +197,7 @@ class TelegramBaseClient(abc.ABC):
DEFAULT_PORT
)
self.flood_sleep_threshold = flood_sleep_threshold
self.session = session
self.session = AsyncClassWrapper(session)
self.api_id = int(api_id)
self.api_hash = api_hash
@ -330,8 +329,8 @@ class TelegramBaseClient(abc.ABC):
await self._disconnect()
if getattr(self, 'session', None):
if getattr(self, '_state', None):
self.session.set_update_state(0, self._state)
self.session.close()
f = await self.session.set_update_state(0, self._state)
await self.session.close()
async def _disconnect(self):
"""
@ -369,7 +368,7 @@ class TelegramBaseClient(abc.ABC):
__log__.info('Reconnecting to new data center %s', 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
# so it's not valid anymore. Set to None to force recreating it.
self.session.auth_key = self._sender.state.auth_key = None
@ -377,14 +376,14 @@ class TelegramBaseClient(abc.ABC):
await self._disconnect()
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
new authorization key. This means we are not authorized.
"""
self._authorized = None
self.session.auth_key = auth_key
self.session.save()
await self.session.save()
# endregion
@ -472,7 +471,7 @@ class TelegramBaseClient(abc.ABC):
session = self._exported_sessions.get(cdn_redirect.dc_id)
if not session:
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)
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.
"""
state = self.session.get_update_state(0)
state = await self.session.get_update_state(0)
if not state or not state.pts:
state = await self(functions.updates.GetStateRequest())
@ -172,15 +172,15 @@ class UpdateMethods(UserMethods):
state.pts = d.pts
break
finally:
self.session.set_update_state(0, state)
await self.session.set_update_state(0, state)
self.session.catching_up = False
# endregion
# region Private methods
def _handle_update(self, update):
self.session.process_entities(update)
async def _handle_update(self, update):
await self.session.process_entities(update)
if isinstance(update, (types.Updates, types.UpdatesCombined)):
entities = {utils.get_peer_id(x): x for x in
itertools.chain(update.users, update.chats)}
@ -236,7 +236,7 @@ class UpdateMethods(UserMethods):
# inserted because this is a rather expensive operation
# (default's sqlite3 takes ~0.1s to commit changes). Do
# 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
# 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)
))
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
if captions:
@ -326,7 +326,7 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
file = stream.read()
hash_md5.update(file)
if use_cache:
cached = self.session.get_file(
cached = await self.session.get_file(
hash_md5.digest(), file_size, cls=use_cache
)
if cached:
@ -446,7 +446,7 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
)
return file_handle, media
def _cache_media(self, msg, file, file_handle,
async def _cache_media(self, msg, file, file_handle,
force_document=False):
if file and msg and isinstance(file_handle,
custom.InputSizedFile):
@ -457,6 +457,6 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
to_cache = utils.get_input_photo(msg.media.photo)
else:
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

View File

@ -48,7 +48,7 @@ class UserMethods(TelegramBaseClient):
exceptions.append(e)
results.append(None)
continue
self.session.process_entities(result)
await self.session.process_entities(result)
exceptions.append(None)
results.append(result)
request_index += 1
@ -58,7 +58,7 @@ class UserMethods(TelegramBaseClient):
return results
else:
result = await future
self.session.process_entities(result)
await self.session.process_entities(result)
return result
except (errors.ServerError, errors.RpcCallFailError) as e:
__log__.warning('Telegram is having internal issues %s: %s',
@ -288,7 +288,7 @@ class UserMethods(TelegramBaseClient):
try:
# 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:
pass
@ -393,7 +393,7 @@ class UserMethods(TelegramBaseClient):
try:
# Nobody with this username, maybe it's an exact name/title
return await self.get_entity(
self.session.get_input_entity(string))
await self.session.get_input_entity(string))
except ValueError:
pass

View File

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

View File

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

View File

@ -15,7 +15,7 @@ from ..tl.types import (
MsgNewDetailedInfo, NewSessionCreated, MsgDetailedInfo, MsgsStateReq,
MsgsStateInfo, MsgsAllInfo, MsgResendReq, upload
)
from ..utils import AsyncClassWrapper
__log__ = logging.getLogger(__name__)
@ -262,7 +262,7 @@ class MTProtoSender:
await authenticator.do_authentication(plain)
if self._auth_key_callback:
self._auth_key_callback(self.state.auth_key)
await self._auth_key_callback(self.state.auth_key)
break
except (SecurityError, AssertionError) as e:
@ -570,7 +570,7 @@ class MTProtoSender:
__log__.debug('Handling update {}'
.format(message.obj.__class__.__name__))
if self._update_callback:
self._update_callback(message.obj)
await self._update_callback(message.obj)
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 .helpers import add_surrogate, del_surrogate
from .tl import types
import inspect
try:
import hachoir
@ -970,3 +971,20 @@ def get_appropriated_part_size(file_size):
return 512
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