mirror of
https://github.com/pyrogram/pyrogram
synced 2025-08-23 02:17:21 +00:00
Merge branch 'master' into docs
# Conflicts: # compiler/api/compiler.py # compiler/docs/compiler.py
This commit is contained in:
commit
b9fa1e414d
@ -49,7 +49,7 @@ Features
|
|||||||
`MTProto Mobile Protocol v2.0`_ and the mechanisms needed for establishing
|
`MTProto Mobile Protocol v2.0`_ and the mechanisms needed for establishing
|
||||||
a reliable connection.
|
a reliable connection.
|
||||||
|
|
||||||
- **Updated**: Pyrogram makes use of the latest Telegram API version, currently `Layer 74`_.
|
- **Updated**: Pyrogram makes use of the latest Telegram API version, currently `Layer 75`_.
|
||||||
|
|
||||||
- **Documented**: Pyrogram API public methods are documented and resemble the well
|
- **Documented**: Pyrogram API public methods are documented and resemble the well
|
||||||
established Telegram Bot API, thus offering a familiar look to Bot developers.
|
established Telegram Bot API, thus offering a familiar look to Bot developers.
|
||||||
@ -148,7 +148,7 @@ License
|
|||||||
|
|
||||||
.. _`MTProto Mobile Protocol v2.0`: https://core.telegram.org/mtproto
|
.. _`MTProto Mobile Protocol v2.0`: https://core.telegram.org/mtproto
|
||||||
|
|
||||||
.. _`Layer 74`: compiler/api/source/main_api.tl
|
.. _`Layer 75`: compiler/api/source/main_api.tl
|
||||||
|
|
||||||
.. _`your own`: https://github.com/pyrogram/pyrogram/wiki/Getting-Started#api-keys
|
.. _`your own`: https://github.com/pyrogram/pyrogram/wiki/Getting-Started#api-keys
|
||||||
|
|
||||||
@ -191,7 +191,7 @@ License
|
|||||||
<br><br><br>
|
<br><br><br>
|
||||||
<a href="compiler/api/source/main_api.tl">
|
<a href="compiler/api/source/main_api.tl">
|
||||||
<img src="https://www.pyrogram.ml/images/scheme.svg"
|
<img src="https://www.pyrogram.ml/images/scheme.svg"
|
||||||
alt="Scheme Layer 74">
|
alt="Scheme Layer 75">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://core.telegram.org/mtproto">
|
<a href="https://core.telegram.org/mtproto">
|
||||||
<img src="https://www.pyrogram.ml/images/mtproto.svg"
|
<img src="https://www.pyrogram.ml/images/mtproto.svg"
|
||||||
@ -207,7 +207,7 @@ License
|
|||||||
|
|
||||||
.. |scheme| image:: https://www.pyrogram.ml/images/scheme.svg
|
.. |scheme| image:: https://www.pyrogram.ml/images/scheme.svg
|
||||||
:target: compiler/api/source/main_api.tl
|
:target: compiler/api/source/main_api.tl
|
||||||
:alt: Scheme Layer 74
|
:alt: Scheme Layer 75
|
||||||
|
|
||||||
.. |mtproto| image:: https://www.pyrogram.ml/images/mtproto.svg
|
.. |mtproto| image:: https://www.pyrogram.ml/images/mtproto.svg
|
||||||
:target: https://core.telegram.org/mtproto
|
:target: https://core.telegram.org/mtproto
|
||||||
|
@ -129,15 +129,15 @@ def start():
|
|||||||
shutil.rmtree("{}/types".format(DESTINATION), ignore_errors=True)
|
shutil.rmtree("{}/types".format(DESTINATION), ignore_errors=True)
|
||||||
shutil.rmtree("{}/functions".format(DESTINATION), ignore_errors=True)
|
shutil.rmtree("{}/functions".format(DESTINATION), ignore_errors=True)
|
||||||
|
|
||||||
with open("{}/source/auth_key.tl".format(HOME)) as auth, \
|
with open("{}/source/auth_key.tl".format(HOME), encoding="utf-8") as auth, \
|
||||||
open("{}/source/sys_msgs.tl".format(HOME)) as system, \
|
open("{}/source/sys_msgs.tl".format(HOME), encoding="utf-8") as system, \
|
||||||
open("{}/source/main_api.tl".format(HOME)) as api:
|
open("{}/source/main_api.tl".format(HOME), encoding="utf-8") as api:
|
||||||
schema = (auth.read() + system.read() + api.read()).splitlines()
|
schema = (auth.read() + system.read() + api.read()).splitlines()
|
||||||
|
|
||||||
with open("{}/template/class.txt".format(HOME)) as f:
|
with open("{}/template/class.txt".format(HOME), encoding="utf-8") as f:
|
||||||
template = f.read()
|
template = f.read()
|
||||||
|
|
||||||
with open(NOTICE_PATH) as f:
|
with open(NOTICE_PATH, encoding="utf-8") as f:
|
||||||
notice = []
|
notice = []
|
||||||
|
|
||||||
for line in f.readlines():
|
for line in f.readlines():
|
||||||
@ -234,10 +234,10 @@ def start():
|
|||||||
init = "{}/__init__.py".format(path)
|
init = "{}/__init__.py".format(path)
|
||||||
|
|
||||||
if not os.path.exists(init):
|
if not os.path.exists(init):
|
||||||
with open(init, "w") as f:
|
with open(init, "w", encoding="utf-8") as f:
|
||||||
f.write(notice + "\n\n")
|
f.write(notice + "\n\n")
|
||||||
|
|
||||||
with open(init, "a") as f:
|
with open(init, "a", encoding="utf-8") as f:
|
||||||
f.write("from .{} import {}\n".format(snek(c.name), capit(c.name)))
|
f.write("from .{} import {}\n".format(snek(c.name), capit(c.name)))
|
||||||
|
|
||||||
sorted_args = sort_args(c.args)
|
sorted_args = sort_args(c.args)
|
||||||
@ -370,7 +370,7 @@ def start():
|
|||||||
read_types += "\n "
|
read_types += "\n "
|
||||||
read_types += "{} = Object.read(b)\n ".format(arg_name)
|
read_types += "{} = Object.read(b)\n ".format(arg_name)
|
||||||
|
|
||||||
with open("{}/{}.py".format(path, snek(c.name)), "w") as f:
|
with open("{}/{}.py".format(path, snek(c.name)), "w", encoding="utf-8") as f:
|
||||||
f.write(
|
f.write(
|
||||||
template.format(
|
template.format(
|
||||||
notice=notice,
|
notice=notice,
|
||||||
@ -387,7 +387,7 @@ def start():
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
with open("{}/all.py".format(DESTINATION), "w") as f:
|
with open("{}/all.py".format(DESTINATION), "w", encoding="utf-8") as f:
|
||||||
f.write(notice + "\n\n")
|
f.write(notice + "\n\n")
|
||||||
f.write("layer = {}\n\n".format(layer))
|
f.write("layer = {}\n\n".format(layer))
|
||||||
f.write("objects = {")
|
f.write("objects = {")
|
||||||
@ -409,7 +409,7 @@ def start():
|
|||||||
f.write("\n}\n")
|
f.write("\n}\n")
|
||||||
|
|
||||||
for k, v in namespaces.items():
|
for k, v in namespaces.items():
|
||||||
with open("{}/{}/__init__.py".format(DESTINATION, k), "a") as f:
|
with open("{}/{}/__init__.py".format(DESTINATION, k), "a", encoding="utf-8") as f:
|
||||||
f.write("from . import {}\n".format(", ".join([i for i in v])) if v else "")
|
f.write("from . import {}\n".format(", ".join([i for i in v])) if v else "")
|
||||||
|
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ def generate(source_path, base):
|
|||||||
if not i.startswith("__"):
|
if not i.startswith("__"):
|
||||||
build("/".join([path, i]), level=level + 1)
|
build("/".join([path, i]), level=level + 1)
|
||||||
except NotADirectoryError:
|
except NotADirectoryError:
|
||||||
with open(path + "/" + i) as f:
|
with open(path + "/" + i, encoding="utf-8") as f:
|
||||||
p = ast.parse(f.read())
|
p = ast.parse(f.read())
|
||||||
|
|
||||||
for node in ast.walk(p):
|
for node in ast.walk(p):
|
||||||
@ -59,7 +59,7 @@ def generate(source_path, base):
|
|||||||
|
|
||||||
os.makedirs(os.path.dirname(destination + "/" + full_path), exist_ok=True)
|
os.makedirs(os.path.dirname(destination + "/" + full_path), exist_ok=True)
|
||||||
|
|
||||||
with open(destination + "/" + full_path, "w") as f:
|
with open(destination + "/" + full_path, "w", encoding="utf-8") as f:
|
||||||
f.write(
|
f.write(
|
||||||
page_template.format(
|
page_template.format(
|
||||||
title=name,
|
title=name,
|
||||||
@ -94,7 +94,7 @@ def generate(source_path, base):
|
|||||||
inner_path = base + "/index" + ".rst"
|
inner_path = base + "/index" + ".rst"
|
||||||
module = "pyrogram.api.{}".format(base)
|
module = "pyrogram.api.{}".format(base)
|
||||||
|
|
||||||
with open(destination + "/" + inner_path, "w") as f:
|
with open(destination + "/" + inner_path, "w", encoding="utf-8") as f:
|
||||||
if k == base:
|
if k == base:
|
||||||
f.write(":tocdepth: 1\n\n")
|
f.write(":tocdepth: 1\n\n")
|
||||||
|
|
||||||
@ -114,10 +114,10 @@ def start():
|
|||||||
global page_template
|
global page_template
|
||||||
global toctree
|
global toctree
|
||||||
|
|
||||||
with open(home + "/template/page.txt") as f:
|
with open(home + "/template/page.txt", encoding="utf-8") as f:
|
||||||
page_template = f.read()
|
page_template = f.read()
|
||||||
|
|
||||||
with open(home + "/template/toctree.txt") as f:
|
with open(home + "/template/toctree.txt", encoding="utf-8") as f:
|
||||||
toctree = f.read()
|
toctree = f.read()
|
||||||
|
|
||||||
generate(types_path, types_base)
|
generate(types_path, types_base)
|
||||||
|
@ -43,7 +43,7 @@ def start():
|
|||||||
|
|
||||||
files = [i for i in os.listdir("{}/source".format(home))]
|
files = [i for i in os.listdir("{}/source".format(home))]
|
||||||
|
|
||||||
with open(notice_path) as f:
|
with open(notice_path, encoding="utf-8") as f:
|
||||||
notice = []
|
notice = []
|
||||||
|
|
||||||
for line in f.readlines():
|
for line in f.readlines():
|
||||||
@ -51,7 +51,7 @@ def start():
|
|||||||
|
|
||||||
notice = "\n".join(notice)
|
notice = "\n".join(notice)
|
||||||
|
|
||||||
with open("{}/all.py".format(dest), "w") as f_all:
|
with open("{}/all.py".format(dest), "w", encoding="utf-8") as f_all:
|
||||||
f_all.write(notice + "\n\n")
|
f_all.write(notice + "\n\n")
|
||||||
f_all.write("count = {count}\n\n")
|
f_all.write("count = {count}\n\n")
|
||||||
f_all.write("exceptions = {\n")
|
f_all.write("exceptions = {\n")
|
||||||
@ -66,14 +66,14 @@ def start():
|
|||||||
init = "{}/__init__.py".format(dest)
|
init = "{}/__init__.py".format(dest)
|
||||||
|
|
||||||
if not os.path.exists(init):
|
if not os.path.exists(init):
|
||||||
with open(init, "w") as f_init:
|
with open(init, "w", encoding="utf-8") as f_init:
|
||||||
f_init.write(notice + "\n\n")
|
f_init.write(notice + "\n\n")
|
||||||
|
|
||||||
with open(init, "a") as f_init:
|
with open(init, "a", encoding="utf-8") as f_init:
|
||||||
f_init.write("from .{}_{} import *\n".format(name.lower(), code))
|
f_init.write("from .{}_{} import *\n".format(name.lower(), code))
|
||||||
|
|
||||||
with open("{}/source/{}".format(home, i)) as f_csv, \
|
with open("{}/source/{}".format(home, i), encoding="utf-8") as f_csv, \
|
||||||
open("{}/{}_{}.py".format(dest, name.lower(), code), "w") as f_class:
|
open("{}/{}_{}.py".format(dest, name.lower(), code), "w", encoding="utf-8") as f_class:
|
||||||
reader = csv.reader(f_csv, delimiter="\t")
|
reader = csv.reader(f_csv, delimiter="\t")
|
||||||
|
|
||||||
super_class = caml(name)
|
super_class = caml(name)
|
||||||
@ -98,10 +98,10 @@ def start():
|
|||||||
|
|
||||||
sub_classes.append((sub_class, id, message))
|
sub_classes.append((sub_class, id, message))
|
||||||
|
|
||||||
with open("{}/template/class.txt".format(home), "r") as f_class_template:
|
with open("{}/template/class.txt".format(home), "r", encoding="utf-8") as f_class_template:
|
||||||
class_template = f_class_template.read()
|
class_template = f_class_template.read()
|
||||||
|
|
||||||
with open("{}/template/sub_class.txt".format(home), "r") as f_sub_class_template:
|
with open("{}/template/sub_class.txt".format(home), "r", encoding="utf-8") as f_sub_class_template:
|
||||||
sub_class_template = f_sub_class_template.read()
|
sub_class_template = f_sub_class_template.read()
|
||||||
|
|
||||||
class_template = class_template.format(
|
class_template = class_template.format(
|
||||||
@ -123,10 +123,10 @@ def start():
|
|||||||
|
|
||||||
f_all.write("}\n")
|
f_all.write("}\n")
|
||||||
|
|
||||||
with open("{}/all.py".format(dest)) as f:
|
with open("{}/all.py".format(dest), encoding="utf-8") as f:
|
||||||
content = f.read()
|
content = f.read()
|
||||||
|
|
||||||
with open("{}/all.py".format(dest), "w") as f:
|
with open("{}/all.py".format(dest), "w", encoding="utf-8") as f:
|
||||||
f.write(re.sub("{count}", str(count), content))
|
f.write(re.sub("{count}", str(count), content))
|
||||||
|
|
||||||
print("Compiling Errors: [100%]")
|
print("Compiling Errors: [100%]")
|
||||||
|
@ -16,9 +16,9 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
__copyright__ = "Copyright (C) 2017-2018 Dan Tès <https://github.com/delivrance>"
|
__copyright__ = "Copyright (C) 2017-2018 Dan Tès <https://github.com/delivrance>".encode(errors="replace").decode()
|
||||||
__license__ = "GNU Lesser General Public License v3 or later (LGPLv3+)"
|
__license__ = "GNU Lesser General Public License v3 or later (LGPLv3+)"
|
||||||
__version__ = "0.4.0"
|
__version__ = "0.4.2"
|
||||||
|
|
||||||
from .api.errors import Error
|
from .api.errors import Error
|
||||||
from .client import ChatAction
|
from .client import ChatAction
|
||||||
|
@ -42,7 +42,7 @@ class Error(Exception):
|
|||||||
|
|
||||||
# TODO: Proper log unknown errors
|
# TODO: Proper log unknown errors
|
||||||
if self.CODE == 520:
|
if self.CODE == 520:
|
||||||
with open("unknown_errors.txt", "a") as f:
|
with open("unknown_errors.txt", "a", encoding="utf-8") as f:
|
||||||
f.write("{}\t{}\t{}\n".format(x.error_code, x.error_message, query_type))
|
f.write("{}\t{}\t{}\n".format(x.error_code, x.error_message, query_type))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -311,7 +311,7 @@ class Client:
|
|||||||
|
|
||||||
def load_session(self, session_name):
|
def load_session(self, session_name):
|
||||||
try:
|
try:
|
||||||
with open("{}.session".format(session_name)) as f:
|
with open("{}.session".format(session_name), encoding="utf-8") as f:
|
||||||
s = json.load(f)
|
s = json.load(f)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
self.dc_id = 1
|
self.dc_id = 1
|
||||||
@ -326,7 +326,7 @@ class Client:
|
|||||||
auth_key = base64.b64encode(self.auth_key).decode()
|
auth_key = base64.b64encode(self.auth_key).decode()
|
||||||
auth_key = [auth_key[i: i + 43] for i in range(0, len(auth_key), 43)]
|
auth_key = [auth_key[i: i + 43] for i in range(0, len(auth_key), 43)]
|
||||||
|
|
||||||
with open("{}.session".format(self.session_name), "w") as f:
|
with open("{}.session".format(self.session_name), "w", encoding="utf-8") as f:
|
||||||
json.dump(
|
json.dump(
|
||||||
dict(
|
dict(
|
||||||
dc_id=self.dc_id,
|
dc_id=self.dc_id,
|
||||||
@ -604,10 +604,10 @@ class Client:
|
|||||||
file=file,
|
file=file,
|
||||||
ttl_seconds=ttl_seconds
|
ttl_seconds=ttl_seconds
|
||||||
),
|
),
|
||||||
**self.markdown.parse(caption),
|
|
||||||
silent=disable_notification or None,
|
silent=disable_notification or None,
|
||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id()
|
random_id=self.rnd_id(),
|
||||||
|
**self.markdown.parse(caption)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
except FilePartMissing as e:
|
except FilePartMissing as e:
|
||||||
@ -682,10 +682,10 @@ class Client:
|
|||||||
types.DocumentAttributeFilename(os.path.basename(audio))
|
types.DocumentAttributeFilename(os.path.basename(audio))
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
**self.markdown.parse(caption),
|
|
||||||
silent=disable_notification or None,
|
silent=disable_notification or None,
|
||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id()
|
random_id=self.rnd_id(),
|
||||||
|
**self.markdown.parse(caption)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
except FilePartMissing as e:
|
except FilePartMissing as e:
|
||||||
@ -741,10 +741,10 @@ class Client:
|
|||||||
types.DocumentAttributeFilename(os.path.basename(document))
|
types.DocumentAttributeFilename(os.path.basename(document))
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
**self.markdown.parse(caption),
|
|
||||||
silent=disable_notification or None,
|
silent=disable_notification or None,
|
||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id()
|
random_id=self.rnd_id(),
|
||||||
|
**self.markdown.parse(caption)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
except FilePartMissing as e:
|
except FilePartMissing as e:
|
||||||
@ -816,10 +816,10 @@ class Client:
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
**self.markdown.parse(caption),
|
|
||||||
silent=disable_notification or None,
|
silent=disable_notification or None,
|
||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id()
|
random_id=self.rnd_id(),
|
||||||
|
**self.markdown.parse(caption)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
except FilePartMissing as e:
|
except FilePartMissing as e:
|
||||||
@ -882,10 +882,10 @@ class Client:
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
**self.markdown.parse(caption),
|
|
||||||
silent=disable_notification or None,
|
silent=disable_notification or None,
|
||||||
reply_to_msg_id=reply_to_message_id,
|
reply_to_msg_id=reply_to_message_id,
|
||||||
random_id=self.rnd_id()
|
random_id=self.rnd_id(),
|
||||||
|
**self.markdown.parse(caption)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
except FilePartMissing as e:
|
except FilePartMissing as e:
|
||||||
|
31
setup.cfg
31
setup.cfg
@ -1,31 +0,0 @@
|
|||||||
[metadata]
|
|
||||||
name = Pyrogram
|
|
||||||
version = attr: pyrogram.__version__
|
|
||||||
description = Telegram MTProto API Client Library for Python
|
|
||||||
url = https://github.com/pyrogram/pyrogram
|
|
||||||
author = Dan Tès
|
|
||||||
author_email = admin@pyrogram.ml
|
|
||||||
license = LGPLv3+
|
|
||||||
keywords = telegram mtproto api client library python
|
|
||||||
classifiers =
|
|
||||||
Development Status :: 3 - Alpha
|
|
||||||
Intended Audience :: Developers
|
|
||||||
License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)
|
|
||||||
Operating System :: OS Independent
|
|
||||||
Programming Language :: Python
|
|
||||||
Programming Language :: Python :: 3
|
|
||||||
Programming Language :: Python :: 3.3
|
|
||||||
Programming Language :: Python :: 3.4
|
|
||||||
Programming Language :: Python :: 3.5
|
|
||||||
Programming Language :: Python :: 3.6
|
|
||||||
Topic :: Internet
|
|
||||||
Topic :: Communications :: Chat
|
|
||||||
Topic :: Software Development :: Libraries
|
|
||||||
Topic :: Software Development :: Libraries :: Python Modules
|
|
||||||
|
|
||||||
[options]
|
|
||||||
packages = find:
|
|
||||||
zip_safe = False
|
|
||||||
setup_requires = pyaes; pysocks
|
|
||||||
install_requires = pyaes; pysocks
|
|
||||||
include_package_data = True
|
|
39
setup.py
39
setup.py
@ -19,7 +19,7 @@
|
|||||||
import re
|
import re
|
||||||
from sys import argv
|
from sys import argv
|
||||||
|
|
||||||
from setuptools import setup
|
from setuptools import setup, find_packages
|
||||||
|
|
||||||
from compiler.api import compiler as api_compiler
|
from compiler.api import compiler as api_compiler
|
||||||
from compiler.error import compiler as error_compiler
|
from compiler.error import compiler as error_compiler
|
||||||
@ -31,9 +31,42 @@ if len(argv) > 1 and argv[1] != "sdist":
|
|||||||
error_compiler.start()
|
error_compiler.start()
|
||||||
# docs_compiler.start()
|
# docs_compiler.start()
|
||||||
|
|
||||||
|
with open("pyrogram/__init__.py", encoding="utf-8") as f:
|
||||||
|
version = re.findall(r"__version__ = \"(.+)\"", f.read())[0]
|
||||||
|
|
||||||
# PyPI doesn't like raw html
|
# PyPI doesn't like raw html
|
||||||
with open("README.rst", encoding="UTF-8") as f:
|
with open("README.rst", encoding="utf-8") as f:
|
||||||
readme = re.sub(r"\.\. \|.+\| raw:: html(?:\s{4}.+)+\n\n", "", f.read())
|
readme = re.sub(r"\.\. \|.+\| raw:: html(?:\s{4}.+)+\n\n", "", f.read())
|
||||||
readme = re.sub(r"\|header\|", "|logo|\n\n|description|\n\n|scheme| |mtproto|", readme)
|
readme = re.sub(r"\|header\|", "|logo|\n\n|description|\n\n|scheme| |mtproto|", readme)
|
||||||
|
|
||||||
setup(long_description=readme)
|
setup(
|
||||||
|
name="Pyrogram",
|
||||||
|
version=version,
|
||||||
|
description="Telegram MTProto API Client Library for Python",
|
||||||
|
url="https://github.com/pyrogram/pyrogram",
|
||||||
|
author="Dan Tès",
|
||||||
|
author_email="admin@pyrogram.ml",
|
||||||
|
license="LGPLv3+",
|
||||||
|
keywords="telegram mtproto api client library python",
|
||||||
|
long_description=readme,
|
||||||
|
classifiers=[
|
||||||
|
"Development Status :: 3 - Alpha",
|
||||||
|
"Intended Audience :: Developers",
|
||||||
|
"License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)",
|
||||||
|
"Operating System :: OS Independent",
|
||||||
|
"Programming Language :: Python",
|
||||||
|
"Programming Language :: Python :: 3",
|
||||||
|
"Programming Language :: Python :: 3.3",
|
||||||
|
"Programming Language :: Python :: 3.4",
|
||||||
|
"Programming Language :: Python :: 3.5",
|
||||||
|
"Programming Language :: Python :: 3.6",
|
||||||
|
"Topic :: Internet",
|
||||||
|
"Topic :: Communications :: Chat",
|
||||||
|
"Topic :: Software Development :: Libraries",
|
||||||
|
"Topic :: Software Development :: Libraries :: Python Modules"
|
||||||
|
],
|
||||||
|
packages=find_packages(),
|
||||||
|
zip_safe=False,
|
||||||
|
install_requires=["pyaes", "pysocks"],
|
||||||
|
include_package_data=True,
|
||||||
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user