Browse Source

fork / split from https://github.com/fphammerle/tooncher

Fabian Peter Hammerle 7 years ago
parent
commit
9164ccd512
5 changed files with 33 additions and 177 deletions
  1. 2 2
      README.md
  2. 13 60
      pytrapi/__init__.py
  3. 0 86
      scripts/tooncher
  4. 9 9
      setup.py
  5. 9 20
      tests/test_.py

+ 2 - 2
README.md

@@ -1,2 +1,2 @@
-# tooncher
-automates toontown rewritten's login process
+# pytrapi
+python interface for toontown rewritten's web api (https://github.com/ToontownRewritten/api-doc)

+ 13 - 60
tooncher/__init__.py → pytrapi/__init__.py

@@ -2,8 +2,6 @@ import datetime
 import json
 import os
 import ssl
-import subprocess
-import sys
 import urllib.parse
 import urllib.request
 
@@ -16,41 +14,6 @@ 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'
 
-if sys.platform == 'darwin':
-    TOONTOWN_LIBRARY_PATH = os.path.join(
-        os.path.expanduser('~'), 'Library',
-        'Application Support', 'Toontown Rewritten',
-    )
-    TOONTOWN_ENGINE_DEFAULT_PATH = os.path.join(
-        TOONTOWN_LIBRARY_PATH,
-        'Toontown Rewritten',
-    )
-else:
-    TOONTOWN_LIBRARY_PATH = None
-    TOONTOWN_ENGINE_DEFAULT_PATH = None
-
-
-def start_engine(engine_path, gameserver, playcookie, **kwargs):
-    env = {
-        'TTR_GAMESERVER': gameserver,
-        'TTR_PLAYCOOKIE': playcookie,
-    }
-    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',
-        )
-    return subprocess.Popen(
-        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(
@@ -108,28 +71,6 @@ def login(username=None, password=None,
         raise Exception(repr(resp_data))
 
 
-def launch(engine_path, username, password, validate_ssl_certs=True):
-    result = login(
-        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,
-        )
-    if isinstance(result, LoginSuccessful):
-        p = start_engine(
-            engine_path=engine_path,
-            gameserver=result.gameserver,
-            playcookie=result.playcookie,
-        )
-        p.wait()
-    else:
-        raise Exception(repr(result))
-
-
 class InvasionProgress:
 
     def __init__(self, district, date, cog_type,
@@ -145,6 +86,13 @@ class InvasionProgress:
         return self.total_number - self.despawned_number
 
 
+class InvasionsResponse:
+
+    def __init__(self, update_date, invasions):
+        self.update_date = update_date
+        self.invasions = invasions
+
+
 def request_active_invasions(validate_ssl_certs=True):
     resp_data = api_request(INVASIONS_API_URL)
     if resp_data['error'] is not None:
@@ -160,4 +108,9 @@ def request_active_invasions(validate_ssl_certs=True):
                 despawned_number=int(despawned_number),
                 total_number=int(total_number),
             )
-        return invs
+        return InvasionsResponse(
+            update_date=datetime.datetime.utcfromtimestamp(
+                resp_data['lastUpdated']
+            ),
+            invasions=invs,
+        )

+ 0 - 86
scripts/tooncher

@@ -1,86 +0,0 @@
-#!/usr/bin/env python3
-# PYTHON_ARGCOMPLETE_OK
-
-import os
-import sys
-import tooncher
-import yaml
-
-
-def run(username, config_path, engine_path=None, validate_ssl_certs=True):
-
-    if os.path.exists(config_path):
-        with open(config_path) as f:
-            config = yaml.load(f.read())
-    else:
-        config = {}
-
-    if engine_path is None:
-        if 'engine_path' in config:
-            engine_path = config['engine_path']
-        else:
-            raise Exception('missing path to toontown engine')
-
-    accounts = config['accounts'] if 'accounts' in config else []
-
-    for account in accounts:
-        if account['username'] == username:
-            tooncher.launch(
-                engine_path=engine_path,
-                username=account['username'],
-                password=account['password'],
-                validate_ssl_certs=validate_ssl_certs,
-            )
-
-
-def _init_argparser():
-
-    import argparse
-    argparser = argparse.ArgumentParser(description=None)
-    argparser.add_argument('username')
-    argparser.add_argument(
-        '--config',
-        '-c',
-        metavar='path',
-        dest='config_path',
-        help='path to config file (default: %(default)s)',
-        default=os.path.join(os.path.expanduser('~'), '.tooncher'),
-    )
-    argparser.add_argument(
-        '--engine-path',
-        '-e',
-        metavar='path',
-        dest='engine_path',
-        default=tooncher.TOONTOWN_ENGINE_DEFAULT_PATH,
-        help='\n'.join([
-            'path to toontown engine.',
-            'this overrides the one specified in config file',
-            '(default: %(default)s)',
-        ]),
-    )
-    argparser.add_argument(
-        '--no-ssl-cert-validation',
-        '-k',
-        dest='validate_ssl_certs',
-        help='do not validate ssl certificates',
-        action='store_false',
-    )
-    return argparser
-
-
-def main(argv):
-
-    argparser = _init_argparser()
-    try:
-        import argcomplete
-        argcomplete.autocomplete(argparser)
-    except ImportError:
-        pass
-    args = argparser.parse_args(argv)
-
-    run(**vars(args))
-
-    return 0
-
-if __name__ == "__main__":
-    sys.exit(main(sys.argv[1:]))

+ 9 - 9
setup.py

@@ -5,17 +5,17 @@ from setuptools import setup
 import glob
 
 setup(
-    name = 'tooncher',
-    packages = ['tooncher'],
-    version = '0.3.0',
-    description = "automates toontown rewritten's login process",
+    name = 'pytrapi',
+    packages = ['pytrapi'],
+    version = '0.1.0',
+    description = "interface for toontown rewritten's web api",
     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.2.0',
-    keywords = ['game', 'launcher', 'toontown rewritten', 'ttr'],
+    url = 'https://git.hammerle.me/fphammerle/pytrapi',
+    download_url = 'https://git.hammerle.me/fphammerle/pytrapi/archive/0.1.0.zip',
+    keywords = ['game', 'api', 'toontown rewritten', 'ttr'],
     classifiers = [],
-    scripts = glob.glob('scripts/*'),
-    install_requires = ['pyyaml'],
+    # scripts = glob.glob('scripts/*'),
+    install_requires = [],
     tests_require = ['pytest'],
     )

+ 9 - 20
tests/test_.py

@@ -1,27 +1,16 @@
 # -*- coding: utf-8 -*-
 import pytest
 
-import shutil
-import subprocess
-import tooncher
-
-
-def test_start_engine():
-    p = tooncher.start_engine(
-        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
+import pytrapi
+import datetime
 
 
 def test_api_request_invasions():
-    resp_data = tooncher.api_request(tooncher.INVASIONS_API_URL)
+    resp_data = pytrapi.api_request(pytrapi.INVASIONS_API_URL)
     assert 'invasions' in resp_data
+
+
+def test_request_active_invasions():
+    resp = pytrapi.request_active_invasions()
+    assert isinstance(resp.update_date, datetime.datetime)
+    assert isinstance(resp.invasions, dict)