3 Commits 1c1fdebdd2 ... d3722b47cf

Author SHA1 Message Date
  Fabian Peter Hammerle d3722b47cf use setuptools_scm to set version 4 years ago
  Fabian Peter Hammerle a6a79b1510 black format 4 years ago
  Fabian Peter Hammerle 602a0730b3 added pipenv 4 years ago
7 changed files with 291 additions and 96 deletions
  1. 1 1
      LICENSE.txt
  2. 14 0
      Pipfile
  3. 199 0
      Pipfile.lock
  4. 2 0
      README.md
  5. 18 19
      setup.py
  6. 8 8
      tests/test_.py
  7. 49 68
      tooncher/__init__.py

+ 1 - 1
LICENSE.txt

@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) 2016-2017 Fabian Peter Hammerle
+Copyright (c) 2016-2019 Fabian Peter Hammerle
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal

+ 14 - 0
Pipfile

@@ -0,0 +1,14 @@
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+tooncher = {editable = true, path = "."}
+
+[dev-packages]
+black = "==19.10b0"
+pytest = "*"
+
+[requires]
+python_version = "3"

+ 199 - 0
Pipfile.lock

@@ -0,0 +1,199 @@
+{
+    "_meta": {
+        "hash": {
+            "sha256": "b3b678ed4d7ed28a251992a9d87da75a01c6d6d9cf7778e956cac7de53c3b56c"
+        },
+        "pipfile-spec": 6,
+        "requires": {
+            "python_version": "3"
+        },
+        "sources": [
+            {
+                "name": "pypi",
+                "url": "https://pypi.org/simple",
+                "verify_ssl": true
+            }
+        ]
+    },
+    "default": {
+        "pyyaml": {
+            "hashes": [
+                "sha256:0e7f69397d53155e55d10ff68fdfb2cf630a35e6daf65cf0bdeaf04f127c09dc",
+                "sha256:2e9f0b7c5914367b0916c3c104a024bb68f269a486b9d04a2e8ac6f6597b7803",
+                "sha256:35ace9b4147848cafac3db142795ee42deebe9d0dad885ce643928e88daebdcc",
+                "sha256:38a4f0d114101c58c0f3a88aeaa44d63efd588845c5a2df5290b73db8f246d15",
+                "sha256:483eb6a33b671408c8529106df3707270bfacb2447bf8ad856a4b4f57f6e3075",
+                "sha256:4b6be5edb9f6bb73680f5bf4ee08ff25416d1400fbd4535fe0069b2994da07cd",
+                "sha256:7f38e35c00e160db592091751d385cd7b3046d6d51f578b29943225178257b31",
+                "sha256:8100c896ecb361794d8bfdb9c11fce618c7cf83d624d73d5ab38aef3bc82d43f",
+                "sha256:c0ee8eca2c582d29c3c2ec6e2c4f703d1b7f1fb10bc72317355a746057e7346c",
+                "sha256:e4c015484ff0ff197564917b4b4246ca03f411b9bd7f16e02a2f586eb48b6d04",
+                "sha256:ebc4ed52dcc93eeebeae5cf5deb2ae4347b3a81c3fa12b0b8c976544829396a4"
+            ],
+            "version": "==5.2"
+        },
+        "tooncher": {
+            "editable": true,
+            "path": "."
+        }
+    },
+    "develop": {
+        "appdirs": {
+            "hashes": [
+                "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92",
+                "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e"
+            ],
+            "version": "==1.4.3"
+        },
+        "attrs": {
+            "hashes": [
+                "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c",
+                "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"
+            ],
+            "version": "==19.3.0"
+        },
+        "black": {
+            "hashes": [
+                "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b",
+                "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"
+            ],
+            "index": "pypi",
+            "version": "==19.10b0"
+        },
+        "click": {
+            "hashes": [
+                "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13",
+                "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"
+            ],
+            "version": "==7.0"
+        },
+        "importlib-metadata": {
+            "hashes": [
+                "sha256:b044f07694ef14a6683b097ba56bd081dbc7cdc7c7fe46011e499dfecc082f21",
+                "sha256:e6ac600a142cf2db707b1998382cc7fc3b02befb7273876e01b8ad10b9652742"
+            ],
+            "markers": "python_version < '3.8'",
+            "version": "==1.1.0"
+        },
+        "more-itertools": {
+            "hashes": [
+                "sha256:53ff73f186307d9c8ef17a9600309154a6ae27f25579e80af4db8f047ba14bc2",
+                "sha256:a0ea684c39bc4315ba7aae406596ef191fd84f873d2d2751f84d64e81a7a2d45"
+            ],
+            "version": "==8.0.0"
+        },
+        "packaging": {
+            "hashes": [
+                "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47",
+                "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108"
+            ],
+            "version": "==19.2"
+        },
+        "pathspec": {
+            "hashes": [
+                "sha256:e285ccc8b0785beadd4c18e5708b12bb8fcf529a1e61215b3feff1d1e559ea5c"
+            ],
+            "version": "==0.6.0"
+        },
+        "pluggy": {
+            "hashes": [
+                "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0",
+                "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"
+            ],
+            "version": "==0.13.1"
+        },
+        "py": {
+            "hashes": [
+                "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa",
+                "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53"
+            ],
+            "version": "==1.8.0"
+        },
+        "pyparsing": {
+            "hashes": [
+                "sha256:20f995ecd72f2a1f4bf6b072b63b22e2eb457836601e76d6e5dfcd75436acc1f",
+                "sha256:4ca62001be367f01bd3e92ecbb79070272a9d4964dce6a48a82ff0b8bc7e683a"
+            ],
+            "version": "==2.4.5"
+        },
+        "pytest": {
+            "hashes": [
+                "sha256:63344a2e3bce2e4d522fd62b4fdebb647c019f1f9e4ca075debbd13219db4418",
+                "sha256:f67403f33b2b1d25a6756184077394167fe5e2f9d8bdaab30707d19ccec35427"
+            ],
+            "index": "pypi",
+            "version": "==5.3.1"
+        },
+        "regex": {
+            "hashes": [
+                "sha256:15454b37c5a278f46f7aa2d9339bda450c300617ca2fca6558d05d870245edc7",
+                "sha256:1ad40708c255943a227e778b022c6497c129ad614bb7a2a2f916e12e8a359ee7",
+                "sha256:5e00f65cc507d13ab4dfa92c1232d004fa202c1d43a32a13940ab8a5afe2fb96",
+                "sha256:604dc563a02a74d70ae1f55208ddc9bfb6d9f470f6d1a5054c4bd5ae58744ab1",
+                "sha256:720e34a539a76a1fedcebe4397290604cc2bdf6f81eca44adb9fb2ea071c0c69",
+                "sha256:7caf47e4a9ac6ef08cabd3442cc4ca3386db141fb3c8b2a7e202d0470028e910",
+                "sha256:7faf534c1841c09d8fefa60ccde7b9903c9b528853ecf41628689793290ca143",
+                "sha256:b4e0406d822aa4993ac45072a584d57aa4931cf8288b5455bbf30c1d59dbad59",
+                "sha256:c31eaf28c6fe75ea329add0022efeed249e37861c19681960f99bbc7db981fb2",
+                "sha256:c7393597191fc2043c744db021643549061e12abe0b3ff5c429d806de7b93b66",
+                "sha256:d2b302f8cdd82c8f48e9de749d1d17f85ce9a0f082880b9a4859f66b07037dc6",
+                "sha256:e3d8dd0ec0ea280cf89026b0898971f5750a7bd92cb62c51af5a52abd020054a",
+                "sha256:ec032cbfed59bd5a4b8eab943c310acfaaa81394e14f44454ad5c9eba4f24a74"
+            ],
+            "version": "==2019.11.1"
+        },
+        "six": {
+            "hashes": [
+                "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd",
+                "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"
+            ],
+            "version": "==1.13.0"
+        },
+        "toml": {
+            "hashes": [
+                "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c",
+                "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e"
+            ],
+            "version": "==0.10.0"
+        },
+        "typed-ast": {
+            "hashes": [
+                "sha256:1170afa46a3799e18b4c977777ce137bb53c7485379d9706af8a59f2ea1aa161",
+                "sha256:18511a0b3e7922276346bcb47e2ef9f38fb90fd31cb9223eed42c85d1312344e",
+                "sha256:262c247a82d005e43b5b7f69aff746370538e176131c32dda9cb0f324d27141e",
+                "sha256:2b907eb046d049bcd9892e3076c7a6456c93a25bebfe554e931620c90e6a25b0",
+                "sha256:354c16e5babd09f5cb0ee000d54cfa38401d8b8891eefa878ac772f827181a3c",
+                "sha256:48e5b1e71f25cfdef98b013263a88d7145879fbb2d5185f2a0c79fa7ebbeae47",
+                "sha256:4e0b70c6fc4d010f8107726af5fd37921b666f5b31d9331f0bd24ad9a088e631",
+                "sha256:630968c5cdee51a11c05a30453f8cd65e0cc1d2ad0d9192819df9978984529f4",
+                "sha256:66480f95b8167c9c5c5c87f32cf437d585937970f3fc24386f313a4c97b44e34",
+                "sha256:71211d26ffd12d63a83e079ff258ac9d56a1376a25bc80b1cdcdf601b855b90b",
+                "sha256:7954560051331d003b4e2b3eb822d9dd2e376fa4f6d98fee32f452f52dd6ebb2",
+                "sha256:838997f4310012cf2e1ad3803bce2f3402e9ffb71ded61b5ee22617b3a7f6b6e",
+                "sha256:95bd11af7eafc16e829af2d3df510cecfd4387f6453355188342c3e79a2ec87a",
+                "sha256:bc6c7d3fa1325a0c6613512a093bc2a2a15aeec350451cbdf9e1d4bffe3e3233",
+                "sha256:cc34a6f5b426748a507dd5d1de4c1978f2eb5626d51326e43280941206c209e1",
+                "sha256:d755f03c1e4a51e9b24d899561fec4ccaf51f210d52abdf8c07ee2849b212a36",
+                "sha256:d7c45933b1bdfaf9f36c579671fec15d25b06c8398f113dab64c18ed1adda01d",
+                "sha256:d896919306dd0aa22d0132f62a1b78d11aaf4c9fc5b3410d3c666b818191630a",
+                "sha256:fdc1c9bbf79510b76408840e009ed65958feba92a88833cdceecff93ae8fff66",
+                "sha256:ffde2fbfad571af120fcbfbbc61c72469e72f550d676c3342492a9dfdefb8f12"
+            ],
+            "version": "==1.4.0"
+        },
+        "wcwidth": {
+            "hashes": [
+                "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e",
+                "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c"
+            ],
+            "version": "==0.1.7"
+        },
+        "zipp": {
+            "hashes": [
+                "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e",
+                "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335"
+            ],
+            "version": "==0.6.0"
+        }
+    }
+}

+ 2 - 0
README.md

@@ -1,6 +1,8 @@
 # tooncher
 automates toontown rewritten's login process
 
+[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
+
 ## Installation
 
     $ pip3 install --user --upgrade tooncher

+ 18 - 19
setup.py

@@ -1,21 +1,20 @@
-#!/usr/bin/env python3
-
-from setuptools import setup
-
 import glob
 
-setup(
-    name = 'tooncher',
-    packages = ['tooncher'],
-    version = '0.4.0',
-    description = "automates toontown rewritten's login process",
-    author = 'Fabian Peter Hammerle',
-    author_email = 'fabian.hammerle@gmail.com',
-    url = 'https://github.com/fphammerle/tooncher',
-    download_url = 'https://github.com/fphammerle/tooncher/tarball/0.3.1',
-    keywords = ['game', 'launcher', 'toontown rewritten', 'ttr'],
-    classifiers = [],
-    scripts = glob.glob('scripts/*'),
-    install_requires = ['pyyaml'],
-    tests_require = ['pytest'],
-    )
+import setuptools
+
+setuptools.setup(
+    name="tooncher",
+    use_scm_version=True,
+    packages=["tooncher"],
+    description="automates toontown rewritten's login process",
+    author="Fabian Peter Hammerle",
+    author_email="fabian.hammerle@gmail.com",
+    url="https://github.com/fphammerle/tooncher",
+    download_url="https://github.com/fphammerle/tooncher/tarball/0.3.1",
+    keywords=["game", "launcher", "toontown rewritten", "ttr"],
+    classifiers=[],
+    scripts=glob.glob("scripts/*"),
+    install_requires=["pyyaml"],
+    setup_requires=["setuptools_scm"],
+    tests_require=["pytest"],
+)

+ 8 - 8
tests/test_.py

@@ -8,20 +8,20 @@ import tooncher
 
 def test_start_engine():
     p = tooncher.start_engine(
-        engine_path=shutil.which('printenv'),
-        gameserver='gameserver',
-        playcookie='cookie',
+        engine_path=shutil.which("printenv"),
+        gameserver="gameserver",
+        playcookie="cookie",
         stdout=subprocess.PIPE,
         stderr=subprocess.PIPE,
     )
     assert isinstance(p, subprocess.Popen)
     stdout, stderr = p.communicate()
-    assert b'' == stderr
-    env = stdout.strip().split(b'\n')
-    assert b'TTR_GAMESERVER=gameserver' in env
-    assert b'TTR_PLAYCOOKIE=cookie' in env
+    assert b"" == stderr
+    env = stdout.strip().split(b"\n")
+    assert b"TTR_GAMESERVER=gameserver" in env
+    assert b"TTR_PLAYCOOKIE=cookie" in env
 
 
 def test_api_request_invasions():
     resp_data = tooncher.api_request(tooncher.INVASIONS_API_URL)
-    assert 'invasions' in resp_data
+    assert "invasions" in resp_data

+ 49 - 68
tooncher/__init__.py

@@ -13,17 +13,15 @@ https://github.com/ToontownRewritten/api-doc/blob/master/login.md
 https://github.com/ToontownRewritten/api-doc/blob/master/invasions.md
 """
 
-INVASIONS_API_URL = 'https://www.toontownrewritten.com/api/invasions?format=json'
-LOGIN_API_URL = 'https://www.toontownrewritten.com/api/login?format=json'
+INVASIONS_API_URL = "https://www.toontownrewritten.com/api/invasions?format=json"
+LOGIN_API_URL = "https://www.toontownrewritten.com/api/login?format=json"
 
-if sys.platform == 'darwin':
+if sys.platform == "darwin":
     TOONTOWN_LIBRARY_PATH = os.path.join(
-        os.path.expanduser('~'), 'Library',
-        'Application Support', 'Toontown Rewritten',
+        os.path.expanduser("~"), "Library", "Application Support", "Toontown Rewritten",
     )
     TOONTOWN_ENGINE_DEFAULT_PATH = os.path.join(
-        TOONTOWN_LIBRARY_PATH,
-        'Toontown Rewritten',
+        TOONTOWN_LIBRARY_PATH, "Toontown Rewritten",
     )
 else:
     TOONTOWN_LIBRARY_PATH = None
@@ -32,19 +30,15 @@ else:
 
 def start_engine(engine_path, gameserver, playcookie, **kwargs):
     env = {
-        'TTR_GAMESERVER': gameserver,
-        'TTR_PLAYCOOKIE': playcookie,
+        "TTR_GAMESERVER": gameserver,
+        "TTR_PLAYCOOKIE": playcookie,
     }
-    if sys.platform == 'darwin':
-        env['DYLD_LIBRARY_PATH'] = os.path.join(
-            TOONTOWN_LIBRARY_PATH,
-            'Libraries.bundle',
+    if sys.platform == "darwin":
+        env["DYLD_LIBRARY_PATH"] = os.path.join(
+            TOONTOWN_LIBRARY_PATH, "Libraries.bundle",
         )
-        env['DYLD_FRAMEWORK_PATH'] = os.path.join(
-            TOONTOWN_LIBRARY_PATH,
-            'Frameworks',
-        )
-    elif sys.platform == 'linux' and 'XAUTHORITY' in os.environ:
+        env["DYLD_FRAMEWORK_PATH"] = os.path.join(TOONTOWN_LIBRARY_PATH, "Frameworks",)
+    elif sys.platform == "linux" and "XAUTHORITY" in os.environ:
         """
         Fix for TTREngine reporting:
         > :display:x11display(error): Could not open display ":0.0".
@@ -56,82 +50,67 @@ def start_engine(engine_path, gameserver, playcookie, **kwargs):
         >   File "<compiled 'direct.vlt8f63e471.ShowBase'>", line 0, in vltf05fd21b
         > Exception: Could not open window.
         """
-        env['XAUTHORITY'] = os.environ['XAUTHORITY']
+        env["XAUTHORITY"] = os.environ["XAUTHORITY"]
     return subprocess.Popen(
-        args=[engine_path],
-        cwd=os.path.dirname(engine_path),
-        env=env,
-        **kwargs,
+        args=[engine_path], cwd=os.path.dirname(engine_path), env=env, **kwargs,
     )
 
 
 def api_request(url, params=None, validate_ssl_cert=True):
     resp = urllib.request.urlopen(
         url=url,
-        data=urllib.parse.urlencode(params).encode('ascii')
-            if params else None,
-        context=None if validate_ssl_cert
-            else ssl._create_unverified_context(),
+        data=urllib.parse.urlencode(params).encode("ascii") if params else None,
+        context=None if validate_ssl_cert else ssl._create_unverified_context(),
     )
-    return json.loads(resp.read().decode('ascii'))
+    return json.loads(resp.read().decode("ascii"))
 
 
 class LoginSuccessful:
-
     def __init__(self, playcookie, gameserver):
         self.playcookie = playcookie
         self.gameserver = gameserver
 
 
 class LoginDelayed:
-
     def __init__(self, queue_token):
         self.queue_token = queue_token
 
 
-def login(username=None, password=None,
-          queue_token=None, validate_ssl_cert=True):
+def login(username=None, password=None, queue_token=None, validate_ssl_cert=True):
     if username is not None and queue_token is None:
         assert password is not None
         req_params = {
-            'username': username,
-            'password': password,
+            "username": username,
+            "password": password,
         }
     elif username is None and queue_token is not None:
         req_params = {
-            'queueToken': queue_token,
+            "queueToken": queue_token,
         }
     else:
-        raise Exception('either specify username or queue token')
+        raise Exception("either specify username or queue token")
     resp_data = api_request(
-        url=LOGIN_API_URL,
-        params=req_params,
-        validate_ssl_cert=validate_ssl_cert,
+        url=LOGIN_API_URL, params=req_params, validate_ssl_cert=validate_ssl_cert,
     )
-    if resp_data['success'] == 'true':
+    if resp_data["success"] == "true":
         return LoginSuccessful(
-            playcookie=resp_data['cookie'],
-            gameserver=resp_data['gameserver'],
-        )
-    elif resp_data['success'] == 'delayed':
-        return LoginDelayed(
-            queue_token=resp_data['queueToken'],
+            playcookie=resp_data["cookie"], gameserver=resp_data["gameserver"],
         )
+    elif resp_data["success"] == "delayed":
+        return LoginDelayed(queue_token=resp_data["queueToken"],)
     else:
         raise Exception(repr(resp_data))
 
 
-def launch(engine_path, username, password, validate_ssl_certs=True,
-           cpu_limit_percent=None):
+def launch(
+    engine_path, username, password, validate_ssl_certs=True, cpu_limit_percent=None
+):
     result = login(
-        username=username,
-        password=password,
-        validate_ssl_cert=validate_ssl_certs,
+        username=username, password=password, validate_ssl_cert=validate_ssl_certs,
     )
     if isinstance(result, LoginDelayed):
         result = login(
-            queue_token=result.queue_token,
-            validate_ssl_cert=validate_ssl_certs,
+            queue_token=result.queue_token, validate_ssl_cert=validate_ssl_certs,
         )
     if isinstance(result, LoginSuccessful):
         p = start_engine(
@@ -140,21 +119,23 @@ def launch(engine_path, username, password, validate_ssl_certs=True,
             playcookie=result.playcookie,
         )
         if cpu_limit_percent is not None:
-            subprocess.Popen(args=[
-                'cpulimit',
-                '--pid', str(p.pid),
-                '--limit', str(cpu_limit_percent),
-                # '--verbose',
-            ])
+            subprocess.Popen(
+                args=[
+                    "cpulimit",
+                    "--pid",
+                    str(p.pid),
+                    "--limit",
+                    str(cpu_limit_percent),
+                    # '--verbose',
+                ]
+            )
         p.wait()
     else:
         raise Exception(repr(result))
 
 
 class InvasionProgress:
-
-    def __init__(self, district, date, cog_type,
-                 despawned_number, total_number):
+    def __init__(self, district, date, cog_type, despawned_number, total_number):
         self.district = district
         self.date = date
         self.cog_type = cog_type
@@ -168,16 +149,16 @@ class InvasionProgress:
 
 def request_active_invasions(validate_ssl_certs=True):
     resp_data = api_request(INVASIONS_API_URL)
-    if resp_data['error'] is not None:
-        raise Exception(resp_data['error'])
+    if resp_data["error"] is not None:
+        raise Exception(resp_data["error"])
     else:
         invs = {}
-        for district, inv_data in resp_data['invasions'].items():
-            despawned_number, total_number = inv_data['progress'].split('/')
+        for district, inv_data in resp_data["invasions"].items():
+            despawned_number, total_number = inv_data["progress"].split("/")
             invs[district] = InvasionProgress(
                 district=district,
-                date=datetime.datetime.utcfromtimestamp(inv_data['asOf']),
-                cog_type=inv_data['type'],
+                date=datetime.datetime.utcfromtimestamp(inv_data["asOf"]),
+                cog_type=inv_data["type"],
                 despawned_number=int(despawned_number),
                 total_number=int(total_number),
             )