From 03546e2a5e43308b39f5ab753f30029842c00efe Mon Sep 17 00:00:00 2001 From: Pawel Orzech Date: Sat, 9 Nov 2019 21:01:55 +0000 Subject: [PATCH] Fix --- .../JAMIRU_stage_id.txt | 0 BotZone3.2/README.md | 67 + BotZone3.2/setup.py | 37 + wget.py => BotZone3.2/wget.py | 0 BotZoneV2.7.3.py | 223 + LICENSE | 165 + Lrfarm.py | 483 ++ README.md | 89 +- aa.py | 400 + commands.py | 6409 +++++++++++++++++ config.py | 121 + decrypt.py | 33 + decryptor.py | 32 + encrypt.py | 33 + extra.py | 188 + help.txt | 2 + packet.py | 139 + pysqlsimplecipher/__init__.py | 0 pysqlsimplecipher/config.py | 19 + pysqlsimplecipher/decryptor.py | 143 + pysqlsimplecipher/encryptor.py | 95 + pysqlsimplecipher/util.py | 88 + setup.py | 51 +- 23 files changed, 8725 insertions(+), 92 deletions(-) rename JAMIRU_stage_id.txt => BotZone3.2/JAMIRU_stage_id.txt (100%) create mode 100644 BotZone3.2/README.md create mode 100755 BotZone3.2/setup.py rename wget.py => BotZone3.2/wget.py (100%) create mode 100644 BotZoneV2.7.3.py create mode 100644 LICENSE create mode 100644 Lrfarm.py create mode 100644 aa.py create mode 100644 commands.py create mode 100644 config.py create mode 100644 decrypt.py create mode 100644 decryptor.py create mode 100644 encrypt.py create mode 100644 extra.py create mode 100644 help.txt create mode 100644 packet.py create mode 100644 pysqlsimplecipher/__init__.py create mode 100644 pysqlsimplecipher/config.py create mode 100644 pysqlsimplecipher/decryptor.py create mode 100644 pysqlsimplecipher/encryptor.py create mode 100644 pysqlsimplecipher/util.py mode change 100755 => 100644 setup.py diff --git a/JAMIRU_stage_id.txt b/BotZone3.2/JAMIRU_stage_id.txt similarity index 100% rename from JAMIRU_stage_id.txt rename to BotZone3.2/JAMIRU_stage_id.txt diff --git a/BotZone3.2/README.md b/BotZone3.2/README.md new file mode 100644 index 0000000..62cbf45 --- /dev/null +++ b/BotZone3.2/README.md @@ -0,0 +1,67 @@ +# Dragon Ball Dokkan Battle Bot + +This is a Dokkan Battle bot that was first created by FlashChaser. I added a lot of new features and planning on adding more, therefore I've created my own repo. +There's no support from me - it is what it is. If you're gonna get banned - bad luck. + + +If you want to add a feature you've made feel free to submit a pull request. + +The bot is made quite straightforwardly: +The packet module handles the encryption of packet data as well as the authorisation. +There shouldn't be too much reason to add to this file beyond fixing bugs. + +The commands module is where the bulk of the code will be written for adding new features. + +The dokkan module is where the command line/UI will be implemented, and will call the functions in the commands module. + +The decryptor module uses: https://github.com/bssthu/pysqlsimplecipher +Although it's slow FlashChaser preferred this code over pysqlcipher simply because it's easier to package it for distribution without running into issues. + +# Download +Just grab a copy of master repo and go on. + +# To Do + +Feel free to add feature requests. I'm gonna try and add as much as I can with my spare time. Bot already can do pretty much anything. + +- Sell only Hercules +- **Hercule Punch - done** +- SBR, +- **RankUp - done**, +- Transfer but better, +- **BossRush - done** +- **EzaPLUS (up to 50lvl) - done** + +# Installation + +You might need to use sudo before every pip3 command. + +``` +pip3 install six +pip3 install pyinstaller +pip3 install colorama +pip3 install orator + pip3 install pycrypto - https://github.com/dlitz/pycrypto +OR pip3 install pycryptodome +pip3 install PySimpleGUI +pip3 install requests +``` + +Then go to folder where your dokkan.py file is and: python3 dokkan.py + +Happy testing! + +# Pull Requests +Very happy to merge pull requests. +Until I can develop some tests be careful to make sure that all new commands that you implement accurately support JP translation. + +e.g Check that you read from the global database, and if the data doesn't exist, read from the jp database. + +```python +try: + config.Model.set_connection_resolver(config.db_glb) + config.Quests.find_or_fail(int(stage_id)) +except: + config.Model.set_connection_resolver(config.db_jp) + config.Quests.find_or_fail(int(stage_id)) +``` \ No newline at end of file diff --git a/BotZone3.2/setup.py b/BotZone3.2/setup.py new file mode 100755 index 0000000..7a9ee26 --- /dev/null +++ b/BotZone3.2/setup.py @@ -0,0 +1,37 @@ +from distutils.core import setup + + +def get_version(relpath): + """read version info from file without importing it""" + from os.path import dirname, join + for line in open(join(dirname(__file__), relpath)): + if '__version__' in line: + if '"' in line: + # __version__ = "0.9" + return line.split('"')[1] + elif "'" in line: + return line.split("'")[1] + +setup( + name='wget', + version=get_version('wget.py'), + author='anatoly techtonik ', + url='http://bitbucket.org/techtonik/python-wget/', + + description="pure python download utility", + license="Public Domain", + classifiers=[ + 'Environment :: Console', + 'License :: Public Domain', + 'Operating System :: OS Independent', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 3', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Topic :: System :: Networking', + 'Topic :: Utilities', + ], + + py_modules=['wget'], + + long_description=open('README.txt').read(), +) diff --git a/wget.py b/BotZone3.2/wget.py similarity index 100% rename from wget.py rename to BotZone3.2/wget.py diff --git a/BotZoneV2.7.3.py b/BotZoneV2.7.3.py new file mode 100644 index 0000000..4e7ae66 --- /dev/null +++ b/BotZoneV2.7.3.py @@ -0,0 +1,223 @@ +from colorama import init, Fore, Back, Style +import commands +import config +import sys +import os +import webbrowser + + +# Coloroma autoreset +init(autoreset=True) +if not os.path.isdir("Saves"): + try: + os.mkdir('Saves') + os.mkdir('Saves/ios') + os.mkdir('Saves/android') + os.mkdir('Saves/Jp') + os.mkdir('Saves/Jp/ios') + os.mkdir('Saves/Jp/android') + os.mkdir('Saves/fresh') + os.mkdir('Saves/fresh/ios') + os.mkdir('Saves/fresh/android') + except: + print(Fore.RED + Style.BRIGHT + 'Unable to create saves file') + +while True: + + # Decide which client to use. + print(' ') + print(" ___ __ ____ ") + print(" / _ )___ / //_ / ___ ___ ___ ") + print(" / _ / _ \/ __// /_/ _ \/ _ \/ -_)") + print("/____/\___/\__//___/\___/_//_/\__/") + + print('Choose a version') + print('---------------------------------') + print(' ') + while True: + print('Which version? (' + 'Jp: 1 ' + 'or ' 'Global: 2' ')',end='') + client = input(" ") + if client.lower() == '1': + config.client = 'japan' + while True: + print(" ___ __ ____ ") + print(" / _ )___ / //_ / ___ ___ ___ ") + print(" / _ / _ \/ __// /_/ _ \/ _ \/ -_)") + print("/____/\___/\__//___/\___/_//_/\__/") + print("-----------------------------------") + print("Possible by SomeNi") + print(" ") + print("[ Status ] -> You're curently on JP") + print(" ") + print("[ 0 ] -> New Account") + print("[ 1 ] -> Transfer Account") + print("[ 2 ] -> Load From Save") + print("[ 3 ] -> Daily Logins") + print("[ 4 ] -> Update Both DataBase") + print("[ 5 ] -> BotZone Discord Link") + print("[ 6 ] -> Update Glb DataBase") + print("[ 7 ] -> Update JP DataBase") + print(" ") + + command = input('Enter your choice: ') + if command == '0': + print(' ') + config.identifier = commands.signup() + commands.Jp_save_account() + config.access_token, config.secret = commands.signin(config.identifier) + commands.tutorial() + commands.daily_login() + break + elif command == '1': + print(' ') + commands.Jp_transfer_account() + commands.daily_login() + break + elif command == '2': + print(' ') + commands.Jp_load_account() + commands.daily_login() + commands.accept_gifts() + commands.accept_missions() + break + elif command == '3': + print('') + commands.Jp_bulk_daily_logins() + break + elif command == '4': + print('') + commands.db_download() + elif command == '6': + commamds.glb_db_dowmload() + elif command == '7': + commands.jp_db_download() + elif command == '5': + webbrowser.open(commands.discordurl, new=0, autoraise=True) + elif command == 'exit': + exit() + else: + print(Fore.RED + Style.BRIGHT + "Command not understood") + + # User commands. + while True: + print('---------------------------------') + print( + Fore.CYAN + Style.BRIGHT + "Type" + Fore.YELLOW + Style.BRIGHT + " 'help'" + Fore.CYAN + Style.BRIGHT + " to view all commands.") + + # Set up comma separated chain commands. Handled via stdin + try: + command = input() + except: + sys.stdin = sys.__stdin__ + command = input() + + if command == 'exit': + break + # Pass command to command executor and handle keyboard interrupts. + try: + commands.user_command_executor(command) + except KeyboardInterrupt: + print(Fore.CYAN + Style.BRIGHT + 'User interrupted process.') + except Exception as e: + print(Fore.RED + Style.BRIGHT + repr(e)) + break + elif client.lower() == '2': + config.client = 'global' + print(' ') + while True: + print(" ___ __ ____ ") + print(" / _ )___ / //_ / ___ ___ ___ ") + print(" / _ / _ \/ __// /_/ _ \/ _ \/ -_)") + print("/____/\___/\__//___/\___/_//_/\__/") + print("-----------------------------------") + + print(" ") + print("[ Status ] -> You're curently on Global") + print(" ") + print("[ 0 ] -> New Account") + print("[ 1 ] -> Transfer Account") + print("[ 2 ] -> Load From Save") + print("[ 3 ] -> Load Fresh Account") + print("[ 4 ] -> New Fresh Account") + print("[ 5 ] -> Update Both DataBase") + print("[ 6 ] -> BotZone Discord Link") + print("[ 7 ] -> Update Glb DataBase") + print("[ 8 ] -> Update JP DataBase") + print(" ") + + command = input('Enter your choice: ') + if command == '0': + print(' ') + config.identifier = commands.signup() + commands.save_account() + config.access_token, config.secret = commands.signin(config.identifier) + commands.tutorial() + commands.daily_login() + break + elif command == '1': + print(' ') + commands.transfer_account() + commands.daily_login() + break + elif command == '2': + print(' ') + commands.load_account() + commands.daily_login() + commands.accept_gifts() + commands.accept_missions() + break + elif command == '4': + print(' ') + config.identifier = commands.signup() + commands.fresh_save_account() + config.access_token, config.secret = commands.signin(config.identifier) + commands.tutorial() + commands.daily_login() + break + elif command == '3': + print(' ') + commands.fresh_load_account() + commands.daily_login() + commands.accept_gifts() + commands.accept_missions() + break + elif command == '5': + print(' ') + commands.db_download() + elif command == '7': + commands.glb_db_download() + elif command == '8': + commands.jp_db_download() + elif command == '6': + webbrowser.open(commands.discordurl, new=0, autoraise=True) + elif command == 'exit': + exit() + else: + print(Fore.RED + Style.BRIGHT + "Command not understood") + + # User commands. + while True: + print('---------------------------------') + print( + "Type" + " 'help'" + " to view all commands.") + + # Set up comma separated chain commands. Handled via stdin + try: + command = input() + except: + sys.stdin = sys.__stdin__ + command = input() + + if command == 'exit': + break + # Pass command to command executor and handle keyboard interrupts. + try: + commands.user_command_executor(command) + except KeyboardInterrupt: + print(Fore.CYAN + Style.BRIGHT + 'User interrupted process.') + except Exception as e: + print(Fore.RED + Style.BRIGHT + repr(e)) + + break + else: + print(Fore.RED + Style.BRIGHT + "Command not understood") diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/Lrfarm.py b/Lrfarm.py new file mode 100644 index 0000000..96a7e8f --- /dev/null +++ b/Lrfarm.py @@ -0,0 +1,483 @@ +import commands +from colorama import init, Fore, Back, Style +# Coloroma autoreset +init(autoreset=True) + + +def t(): + + print(" Lr Trunks") + stage = input('What stage would you like to complete(Proud Bloodline 320022) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(Raging Counterstrike 406003) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(Dignity of a Clan 408002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(The Strongest Space Pirate 420002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(Warrior of Hope 414002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(The Time Patrol Warrior 422002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def mv(): + print("Majin Vegeta") + stage = input('What stage would you like to complete(The Dark Prince Returns 319022) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(15): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(The Strongest Shadow Dragon 517002) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(Dark Nightmare 518002) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(Fusion in Blue 519001) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(Rose-Tinted Plot 520001) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(A New Hope 522001) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def gv(): + print(" Lr Super Saiyan Goku & Super Saiyan Vegeta") + stage = input('What stage would you like to complete(The Ultimate Pair of the Present World 537001) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(Ultimate Splendor 512003) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(7): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def b(): + print("Lr Full Power Boujack (Galactic Warrior)") + stage = input('What stage would you like to complete( Extreme Peril 306008) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(25): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def c(): + print("Lr Cell (Perfect Form) & Cell Jr") + stage = input('What stage would you like to complete(Waking Nightmare 502003) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(7): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def tm(): + print("Lr Trunks (Teen) (Future) & Mai (Future)") + stage = input('What stage would you like to complete( The Zero Mortals Plan 328006) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(20): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + "BREAK" + stage = input('What stage would you like to complete(Dark Nightmare 518002) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(1): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete( Rose-Tinted Plot 520001) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(1): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + "BREAK" + stage = input('What stage would you like to complete(Fusion in Blue 519001) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(1): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete( The Epic Battle Begins 524001) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(1): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + "BREAK" + stage = input('What stage would you like to complete(A New Hope 522001) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(2): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete( Last Judgment...Or Last Hope 523002) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(2): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + "BREAK" + stage = input('What stage would you like to complete(Searing Rose-Colored Fury 520002) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(2): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete( Sublime Blue! 519002) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(2): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def bw(): + print("Lr Beerus & Whis") + stage = input('What stage would you like to complete(God of Destruction Wrath 511002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(7): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(Destruction God Awakens 314001) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(4): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + "BREAK" + stage = input('What stage would you like to complete(In Search of the Super Saiyan God 314002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(7): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(Vegeta Pride 314007) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(4): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def gg(): + print("Lr Super Saiyan Gohan (Teen) & Super Saiyan Goten (Kid)") + stage = input('What stage would you like to complete(Go! Warriors of the New Generation 552001) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(10): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(Blast! Family Kamehameha! 326006) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(20): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def vg(): + print("Lr Super Saiyan Goku (Angel) & Super Saiyan Vegeta (Angel)") + stage = input('What stage would you like to complete(The Ultimate Pair of the Otherworld 536001) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(10): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(Fusion Reborn! 326006) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(7): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def tg(): + print("Lr Trunks (Kid) & Goten (Kid)") + stage = input('What stage would you like to complete(An Unexpectedly Powerful Man! 411002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(Super Gotenks! 513002) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + "BREAK" + stage = input('What stage would you like to complete(One Powerful Super Fusion! 513003) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def gh(): + print(" Lr Super Saiyan 2 Gohan") + stage = input('What stage would you like to complete(Waking Nightmare 502003) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def ggg(): + print(" Lr Super Saiyan 3 Goku") + stage = input('What stage would you like to complete(Super Saiyan Goku 403002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(Phantom Majin Resurrected! 535002) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + "BREAK" + stage = input('What stage would you like to complete(Mighty Warrior: 24-Hour Revival 528001) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(Ultimate Finishing Move 504002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(4): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def bd(): + print("Lr Bardock") + stage = input('What stage would you like to complete(Saiyans from Planet Vegeta 347001) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(10): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete( 534001 The Unknown Battle) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + "BREAK" + stage = input('What stage would you like to complete(347007 A Lone Warriors Last Battle) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete( 602002 True Fear) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + "BREAK" + stage = input('What stage would you like to complete(602003 Summit of the Universe) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def gb(): + print("Lr Goku Black (Super Saiyan Rosé) & Zamasu") + stage = input('What stage would you like to complete( 518002 Dark Nightmare) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + "BREAK" + stage = input('What stage would you like to complete(519001 Fusion in Blue) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete( 520001 Rose-Tinted Plot) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + "BREAK" + stage = input('What stage would you like to complete(522001 A New Hope) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete( 523002 Last Judgment...Or Last Hope) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + "BREAK" + stage = input('What stage would you like to complete(524001 The Epic Battle Begins) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(3): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def gf(): + print("Lr Goku & Frieza (Final Form) (Angel)") + stage = input('What stage would you like to complete( 544001 Ever-Evolving Power) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + "BREAK" + stage = input('What stage would you like to complete(Ever-Evolving Evil) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(538001 Kaboom! Ultra Instinct) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + "BREAK" + stage = input('What stage would you like to complete(533002 The True Golden Frieza) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def by(): + print("Lr Legendary Super Saiyan Broly") + stage = input('What stage would you like to complete(501003 The Demon Returns) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + +def android(): + print("Lr Android 17&18") + stage = input('What stage would you like to complete(501002 awakening beyond) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + stage = input('What stage would you like to complete(502002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + stage = input('What stage would you like to complete(503002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + stage = input('What stage would you like to complete(504002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + stage = input('What stage would you like to complete(505002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + stage = input('What stage would you like to complete(506002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + stage = input('What stage would you like to complete(507002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(508002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(510002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(511002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(512002) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(513002) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(514001) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(515002) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(516001) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + +def Androids(): + print("Lr Android 17&18/android#17") + stage = input('What stage would you like to complete(543001) : ') + difficulty = input('Enter the difficulty|(4:Super 2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + stage = input('What stage would you like to complete(366008) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + stage = input('What stage would you like to complete(503002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + stage = input('What stage would you like to complete(366008) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + stage = input('What stage would you like to complete(415002) : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) \ No newline at end of file diff --git a/README.md b/README.md index 62cbf45..9ba6844 100644 --- a/README.md +++ b/README.md @@ -1,67 +1,38 @@ -# Dragon Ball Dokkan Battle Bot +# pysqlsimplecipher +Encrypt or decrypt formated sqlite db. -This is a Dokkan Battle bot that was first created by FlashChaser. I added a lot of new features and planning on adding more, therefore I've created my own repo. -There's no support from me - it is what it is. If you're gonna get banned - bad luck. +This project is a tool for sqlite database encryption or decryption like +[sqlcipher](http://sqlcipher.net/) +without install sqlcipher. +When encrypt or decrypt database, an algorithm called AES-256-CBC is used. +Each page shares the same key derived from password, +but owns a random initialization vector stored at the end of the page. -If you want to add a feature you've made feel free to submit a pull request. - -The bot is made quite straightforwardly: -The packet module handles the encryption of packet data as well as the authorisation. -There shouldn't be too much reason to add to this file beyond fixing bugs. - -The commands module is where the bulk of the code will be written for adding new features. - -The dokkan module is where the command line/UI will be implemented, and will call the functions in the commands module. - -The decryptor module uses: https://github.com/bssthu/pysqlsimplecipher -Although it's slow FlashChaser preferred this code over pysqlcipher simply because it's easier to package it for distribution without running into issues. - -# Download -Just grab a copy of master repo and go on. - -# To Do - -Feel free to add feature requests. I'm gonna try and add as much as I can with my spare time. Bot already can do pretty much anything. - -- Sell only Hercules -- **Hercule Punch - done** -- SBR, -- **RankUp - done**, -- Transfer but better, -- **BossRush - done** -- **EzaPLUS (up to 50lvl) - done** - -# Installation - -You might need to use sudo before every pip3 command. - -``` -pip3 install six -pip3 install pyinstaller -pip3 install colorama -pip3 install orator - pip3 install pycrypto - https://github.com/dlitz/pycrypto -OR pip3 install pycryptodome -pip3 install PySimpleGUI -pip3 install requests +## Decrypt +```bash +python decrypt.py encrypted.db password output.db ``` -Then go to folder where your dokkan.py file is and: python3 dokkan.py +## Encrypt +```bash +python encrypt.py plain.db password output.db +``` +Needs reserved space at the end of each page of the database file. -Happy testing! +Otherwise, use sqlcipher to encrypt. -# Pull Requests -Very happy to merge pull requests. -Until I can develop some tests be careful to make sure that all new commands that you implement accurately support JP translation. +#### Encrypt with sqlcipher +- Open plain db +```bash +./sqlcipher plain.db +``` +- Encrypt to enc.db +```sql +ATTACH DATABASE 'enc.db' as encrypted key 'testkey'; +SELECT sqlcipher_export('encrypted'); +DETACH DATABASE encrypted; +``` -e.g Check that you read from the global database, and if the data doesn't exist, read from the jp database. - -```python -try: - config.Model.set_connection_resolver(config.db_glb) - config.Quests.find_or_fail(int(stage_id)) -except: - config.Model.set_connection_resolver(config.db_jp) - config.Quests.find_or_fail(int(stage_id)) -``` \ No newline at end of file +## License +GNU Lesser General Public License Version 3 diff --git a/aa.py b/aa.py new file mode 100644 index 0000000..3472657 --- /dev/null +++ b/aa.py @@ -0,0 +1,400 @@ +import commands +from colorama import init, Fore, Back, Style +# Coloroma autoreset +init(autoreset=True) + + +def ss(): + print("TEQ Super Saiyan God SS Vegito") + stage = input('What stage would you like to complete(519002 Sublime Blue!) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def sss(): + print("PHY Super Saiyan Broly") + stage = input('What stage would you like to complete(548001 The Greatest Saiyan Adversary) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def ssss(): + print("STR Super Gogeta") + stage = input('What stage would you like to complete(505003 Fusion Reborn!) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(2): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def s(): + print("AGL Super Saiyan Gogeta") + stage = input('What stage would you like to complete(549001 The Omnipotent Saiyan Warrior) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def a(): + print("INT SSJ3 Bardock") + stage = input('What stage would you like to complete(534001 The Unknown Battle : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def aa(): + print("STR SSJ4 Goku") + stage = input('What stage would you like to complete(525001 The Scarlet Hero! Super Saiyan 4! : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def aaa(): + print("INT UI Goku") + stage = input('What stage would you like to complete(538001 Kaboom! Ultra Instinct : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def aaaa(): + print("AGL SSJ4 Vegeta") + stage = input('What stage would you like to complete(526001 The Crimson Flash! Super Saiyan 4 : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def b(): + print("PHY FP Frieza") + stage = input('What stage would you like to complete(507002 Full-Power Final Battle : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def bb(): + print("TEQ Golden Frieza") + stage = input('What stage would you like to complete(516001 Emperors Obsession Area : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def bbb(): + print("AGL SSJ3 Goku") + stage = input('What stage would you like to complete(504002 Ultimate Finishing Move Area : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(10): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def bbbb(): + print("TEQ SSJ4 Gogeta") + stage = input('What stage would you like to complete(532001 The Ultimate Super Gogeta : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def c(): + print("INT Super Gogeta") + stage = input('What stage would you like to complete(505003 Fusion Reborn!) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def cc(): + print("SSJ3 Gotenks") + stage = input('What stage would you like to complete(513002 Super Gotenks) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +def ccc(): + print("TEQ FP SSJ4 Goku") + stage = input('What stage would you like to complete(542001 Transcend Super Saiyan 4) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def cccc(): + print("STR Jiren") + stage = input('What stage would you like to complete(540002 Confronting the Strongest of All Universes) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def d(): + print("INT Golden Frieza") + stage = input('What stage would you like to complete(533002 The True Golden Frieza) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def dd(): + print("PHY Android 17") + stage = input('What stage would you like to complete(543001 Superb Ranger) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def ddd(): + print("TEQ Hit") + stage = input('What stage would you like to complete(547001 The Deadliest Assassin) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def dddd(): + print("AGL SSBE Vegeta") + stage = input('What stage would you like to complete(524002 Battle for Honor and Pride) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def e(): + print("PHY Kid Buu") + stage = input('What stage would you like to complete(524003 Regression to Evil) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def ee(): + print("INT Kid Buu") + stage = input('What stage would you like to complete(524003 Regression to Evil) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def eee(): + print("TEQ SSJ3 Goku (Angel)") + stage = input('What stage would you like to complete(528001 Mighty Warrior: 24-Hour Revival) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def eeee(): + print("PHY Goku Black") + stage = input('What stage would you like to complete(518002 Dark Nightmare) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def f(): + print("INT Goku Black") + stage = input('What stage would you like to complete(518003 Black Harbinger of Destruction) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def ff(): + print("TEQ SSG Goku") + stage = input('What stage would you like to complete(549001 The Omnipotent Saiyan Warrior) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def ffx(): + print("STR SSG Vegeta") + stage = input('What stage would you like to complete(549001 The Omnipotent Saiyan Warrior) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def fff(): + print("AGL SSGSS Goku") + stage = input('What stage would you like to complete(514001 Ceaseless Combat) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def ffff(): + print("STR Toppo") + stage = input('What stage would you like to complete(524002 Battle for Honor and Pride) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def g(): + print("STR Rose Goku Black") + stage = input('What stage would you like to complete(520002 Searing Rose-Colored Fury) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def gg(): + print("PHY SSGSS Vegito") + stage = input('What stage would you like to complete(519001 Fusion in Blue) : ') + difficulty = input('Enter the difficulty|(3:Super): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def ggg(): + print("STR SSJ3 Goku") + stage = input('What stage would you like to complete(504002 Ultimate Finishing Move Area : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(10): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def gggx(): + print("TEQ SSJ3 Broly") + stage = input('What stage would you like to complete(531001 All-Time Nastiest Evolution : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def gggg(): + print("AGL Transgoku") + stage = input('What stage would you like to complete(544001 Ever-Evolving Power : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def h(): + print("STR SSJ3 Vegeta") + stage = input('What stage would you like to complete(510002 The Most Powerful Blow : ') + difficulty = input('Enter the difficulty|(2:Z-Hard): ') + loop = input('Enter how many times to execute(10): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def hh(): + print("PHY SSJ3 Gotenks") + stage = input('What stage would you like to complete(513003 One Powerful Super Fusion! : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def hhh(): + print("AGL Turles") + stage = input('What stage would you like to complete(539001 Arrival of the Universe-Crusher! : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def hhhh(): + print("STR Janemba") + stage = input('What stage would you like to complete(506003 Overwhelming Force of Evil! : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def j(): + print("INT Janemba") + stage = input('What stage would you like to complete(506003 Overwhelming Force of Evil! : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(2): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def jj(): + print("TEQ TransFrieza") + stage = input('What stage would you like to complete(545001 Ever-Evolving Evil : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(11): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + + +##################################################################################################################### +def jjj(): + print("AGL Broly") + stage = input('What stage would you like to complete(548001 The Greatest Saiyan Adversary) : ') + difficulty = input('Enter the difficulty|(4:Super2): ') + loop = input('Enter how many times to execute(5): ') + for i in range(int(loop)): + commands.complete_stage(stage, difficulty) + diff --git a/commands.py b/commands.py new file mode 100644 index 0000000..290e8b2 --- /dev/null +++ b/commands.py @@ -0,0 +1,6409 @@ +import base64 +from colorama import init, Fore, Back, Style +import config +import decryptor +import io +import json +from orator import DatabaseManager, Model +import os +import packet +import PySimpleGUI as sg +from random import choice +from random import randint +import re +import requests +from string import ascii_uppercase +import sys +import time +import webbrowser +from random import * +import extra +import Lrfarm +import aa +# Coloroma autoreset +init(autoreset=True) + + +def complete_stage(stage_id, difficulty, kagi=None): + # Completes a given stage stage name or ID has been supplied as a string + # kagi must be correct kagi item ID if used + # Check if user has supplied a stage name and searches DB for correct stage id + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/user'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/user' + else: + url = 'http://ishin-production.aktsk.jp/user' + r = requests.get(url, headers=headers) + user = r.json() + + print(Fore.GREEN + 'Account Rank:' + str(get_user()['user']['rank'])) + print('Stones: ' + str(user['user']['stone'])) + if not stage_id.isnumeric(): + + try: + config.Model.set_connection_resolver(config.db_glb) + stage_id = str(config.Quests.where('name', 'like', '%' + stage_id + + '%').first().id) + except AttributeError: + config.Model.set_connection_resolver(config.db_jp) + stage_id = str(config.Quests.where('name', 'like', '%' + stage_id + + '%').first().id) + except: + print(Fore.RED + Style.BRIGHT + "Could not find stage name in databases") + return 0 + # Retrieve correct stage name to print + # Check if GLB database has id, if not try JP DB. + + try: + config.Model.set_connection_resolver(config.db_glb) + config.Quests.find_or_fail(int(stage_id)) + stage_name = config.Quests.find_or_fail(int(stage_id)).name + except: + config.Model.set_connection_resolver(config.db_jp) + config.Quests.find_or_fail(int(stage_id)) + stage_name = config.Quests.find_or_fail(int(stage_id)).name + + try: + print('Begin stage: ' + stage_name + ' ' + stage_id + ' | Difficulty: ' \ + + str(difficulty) + ' Deck: ' + str(config.deck)) + except: + print(Fore.RED + Style.BRIGHT + 'Does this quest exist?') + return 0 + + # Begin timer for overall stage completion, rounded to second. + timer_start = int(round(time.time(), 0)) + + # Form First Request + APIToken = ''.join(choice(ascii_uppercase) for i in range(63)) + friend = get_friend(stage_id, difficulty) + + if friend['is_cpu'] == False: + if kagi != None: + sign = json.dumps({'difficulty': difficulty, 'eventkagi_item_id': kagi, 'friend_id': friend['id'], + 'is_playing_script': True, 'selected_team_num': config.deck}) + else: + sign = json.dumps({'difficulty': difficulty, 'friend_id': friend['id'], 'is_playing_script': True, + 'selected_team_num': config.deck}) + else: + if kagi != None: + sign = json.dumps({'difficulty': difficulty, 'eventkagi_item_id': kagi, 'cpu_friend_id': friend['id'], + 'is_playing_script': True, 'selected_team_num': config.deck}) + else: + sign = json.dumps({'difficulty': difficulty, 'cpu_friend_id': friend['id'], 'is_playing_script': True, + 'selected_team_num': config.deck}) + + enc_sign = packet.encrypt_sign(sign) + + # ## Send First Request + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/quests/' + stage_id + + '/sugoroku_maps/start'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + data = {'sign': enc_sign} + + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/quests/' + stage_id \ + + '/sugoroku_maps/start' + else: + url = 'http://ishin-production.aktsk.jp/quests/' + stage_id \ + + '/sugoroku_maps/start' + + r = requests.post(url, data=json.dumps(data), headers=headers) + + # Form second request + # Time for request sent + + if 'sign' in r.json(): + dec_sign = packet.decrypt_sign(r.json()['sign']) + elif 'error' in r.json(): + print(Fore.RED + Style.BRIGHT + str(r.json()['error'])) + # Check if error was due to lack of stamina + if r.json()['error']['code'] == 'act_is_not_enough': + # Check if allowed to refill stamina + if config.allow_stamina_refill == True: + refill_stamina() + r = requests.post(url, data=json.dumps(data), + headers=headers) + else: + print(Fore.RED + Style.BRIGHT + 'Stamina refill not allowed.') + return 0 + elif r.json()['error']['code'] == 'active_record/record_not_found': + return 0 + elif r.json()['error']['code'] == 'invalid_area_conditions_potential_releasable': + print(Fore.RED + Style.BRIGHT + 'You do not meet the coniditions to complete potential events') + return 0 + else: + print(Fore.RED + Style.BRIGHT + str(r.json()['error'])) + return 0 + else: + print(Fore.RED + Style.BRIGHT + str(r.json())) + return 0 + if 'sign' in r.json(): + dec_sign = packet.decrypt_sign(r.json()['sign']) + # Retrieve possible tile steps from response + steps = [] + for x in dec_sign['sugoroku']['events']: + steps.append(x) + + finish_time = int(round(time.time(), 0) + 90) + start_time = finish_time - randint(6200000, 8200000) + damage = randint(500000, 1000000) + + # Hercule punching bag event damage + if str(stage_id)[0:3] in ('711', '185'): + damage = randint(100000000, 101000000) + + sign = { + 'actual_steps': steps, + 'difficulty': difficulty, + 'elapsed_time': finish_time - start_time, + 'energy_ball_counts_in_boss_battle': [4, 6, 0, 6, 4, 3, 0, 0, 0, 0, 0, 0, 0, ], + 'has_player_been_taken_damage': False, + 'is_cheat_user': False, + 'is_cleared': True, + 'is_defeated_boss': True, + 'is_player_special_attack_only': True, + 'max_damage_to_boss': damage, + 'min_turn_in_boss_battle': 0, + 'quest_finished_at_ms': finish_time, + 'quest_started_at_ms': start_time, + 'steps': steps, + 'token': dec_sign['token'], + } + + enc_sign = packet.encrypt_sign(json.dumps(sign)) + + # Send second request + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/quests/' + stage_id + + '/sugoroku_maps/finish'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + data = {'sign': enc_sign} + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/quests/' + stage_id \ + + '/sugoroku_maps/finish' + else: + url = 'http://ishin-production.aktsk.jp/quests/' + stage_id \ + + '/sugoroku_maps/finish' + + r = requests.post(url, data=json.dumps(data), headers=headers) + dec_sign = packet.decrypt_sign(r.json()['sign']) + + # ## Print out Items from Database + if 'items' in dec_sign: + supportitems = [] + awakeningitems = [] + trainingitems = [] + potentialitems = [] + treasureitems = [] + carditems = [] + trainingfields = [] + stones = 0 + supportitemsset = set() + awakeningitemsset = set() + trainingitemsset = set() + potentialitemsset = set() + treasureitemsset = set() + carditemsset = set() + trainingfieldsset = set() + print('Items:') + print('-------------------------') + if 'quest_clear_rewards' in dec_sign: + for x in dec_sign['quest_clear_rewards']: + if x['item_type'] == 'Point::Stone': + stones += x['amount'] + for x in dec_sign['items']: + if x['item_type'] == 'SupportItem': + + # print('' + SupportItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + supportitems.append(x['item_id']) + supportitemsset.add(x['item_id']) + elif x['item_type'] == 'PotentialItem': + + # print('' + PotentialItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + potentialitems.append(x['item_id']) + potentialitemsset.add(x['item_id']) + elif x['item_type'] == 'TrainingItem': + + # print('' + TrainingItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + trainingitems.append(x['item_id']) + trainingitemsset.add(x['item_id']) + elif x['item_type'] == 'AwakeningItem': + + # print('' + AwakeningItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + awakeningitems.append(x['item_id']) + awakeningitemsset.add(x['item_id']) + elif x['item_type'] == 'TreasureItem': + + # print('' + TreasureItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + treasureitems.append(x['item_id']) + treasureitemsset.add(x['item_id']) + elif x['item_type'] == 'Card': + + # card = Cards.find(x['item_id']) + + carditems.append(x['item_id']) + carditemsset.add(x['item_id']) + elif x['item_type'] == 'Point::Stone': + + # print('' + card.name + '['+rarity+']'+ ' x '+str(x['quantity'])) + # print('' + TreasureItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + stones += 1 + elif x['item_type'] == 'TrainingField': + + # card = Cards.find(x['item_id']) + + for i in range(x['quantity']): + trainingfields.append(x['item_id']) + trainingfieldsset.add(x['item_id']) + else: + print(x['item_type']) + + # Print items + for x in supportitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.SupportItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(Fore.CYAN + Style.BRIGHT + config.SupportItems.find(x).name + ' x' \ + + str(supportitems.count(x))) + for x in awakeningitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.AwakeningItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(Fore.MAGENTA + Style.BRIGHT + config.AwakeningItems.find(x).name + ' x' \ + + str(awakeningitems.count(x))) + for x in trainingitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.TrainingItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(Fore.RED + Style.BRIGHT + config.TrainingItems.find(x).name + ' x' \ + + str(trainingitems.count(x))) + for x in potentialitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.PotentialItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(config.PotentialItems.find_or_fail(x).name + ' x' \ + + str(potentialitems.count(x))) + for x in treasureitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.TreasureItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(Fore.GREEN + Style.BRIGHT + config.TreasureItems.find(x).name + ' x' \ + + str(treasureitems.count(x))) + for x in trainingfieldsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.TrainingFields.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(config.TrainingFields.find(x).name + ' x' \ + + str(trainingfields.count(x))) + for x in carditemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.Cards.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(config.Cards.find(x).name + ' x' + str(carditems.count(x))) + print(Fore.YELLOW + Style.BRIGHT + 'Stones x' + str(stones)) + zeni = '{:,}'.format(dec_sign['zeni']) + print('Zeni: ' + zeni) + if 'gasha_point' in dec_sign: + print('Friend Points: ' + str(dec_sign['gasha_point'])) + + print('--------------------------') + + # Sell Cards + + i = 0, 1 + card_list = [] + if 'user_items' in dec_sign: + if 'cards' in dec_sign['user_items']: + for x in dec_sign['user_items']['cards']: + if config.Cards.find(x['card_id']).rarity == 0: + card_list.append(x['id']) + if config.Cards.find(x['card_id']).rarity == 1: + card_list.append(x['id']) + if config.Cards.find(x['card_id']).rarity == 2: + card_list.append(x['id']) + + if len(card_list) > 0: + sell_cards(card_list) + if len(card_list) > 1: + sell_cards(card_list) + if len(card_list) > 2: + sell_cards(card_list) + + # ## Finish timing level + + timer_finish = int(round(time.time(), 0)) + timer_total = timer_finish - timer_start + + # #### COMPLETED STAGE + + print(Fore.GREEN + Style.BRIGHT + 'Completed stage: ' + str(stage_id) + ' in ' \ + + str(timer_total) + ' seconds') + print('##############################################') + + +#################################################################### +def get_friend( + stage_id, + difficulty, +): + # Returns supporter for given stage_id & difficulty + # Chooses cpu_supporter if possible + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/quests/' + stage_id + + '/supporters'), + 'Content-type': 'application/json', + 'X-Platform': 'config.platform', + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/quests/' + stage_id \ + + '/supporters' + else: + url = 'http://ishin-production.aktsk.jp/quests/' + stage_id \ + + '/supporters' + + r = requests.get(url, headers=headers) + + ''' + if 'supporters' not in r.json(): + print('Bandai has temp blocked connection... Attempting sign in...') + response = SignIn(signup, AdId, UniqueId) + RefreshClient() + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': GetMac('GET', '/quests/' + stage_id + + '/supporters', MacId, secret1), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + r = requests.get(url, headers=headers) + ''' + # If CPU supporter available, choose it every time + if 'cpu_supporters' in r.json(): + if int(difficulty) == 5: + if 'super_hard3' in r.json()['cpu_supporters']: + if len(r.json()['cpu_supporters']['super_hard3' + ]['cpu_friends']) > 0: + return { + 'is_cpu': True, + 'id': r.json()['cpu_supporters']['super_hard3'] + ['cpu_friends'][0]['id'] + } + if int(difficulty) == 4: + if 'super_hard2' in r.json()['cpu_supporters']: + if len(r.json()['cpu_supporters']['super_hard2' + ]['cpu_friends']) > 0: + return { + 'is_cpu': True, + 'id': r.json()['cpu_supporters']['super_hard2'] + ['cpu_friends'][0]['id'] + } + if int(difficulty) == 3: + if 'super_hard1' in r.json()['cpu_supporters']: + if len(r.json()['cpu_supporters']['super_hard1' + ]['cpu_friends']) > 0: + return { + 'is_cpu': True, + 'id': r.json()['cpu_supporters']['super_hard1'] + ['cpu_friends'][0]['id'] + } + if int(difficulty) == 2: + if 'very_hard' in r.json()['cpu_supporters']: + if len(r.json()['cpu_supporters']['very_hard' + ]['cpu_friends']) > 0: + return { + 'is_cpu': True, + 'id': r.json()['cpu_supporters']['very_hard'] + ['cpu_friends'][0]['id'] + } + if int(difficulty) == 1: + if 'hard' in r.json()['cpu_supporters']: + if len(r.json()['cpu_supporters']['hard']['cpu_friends' + ]) > 0: + return { + 'is_cpu': True, + 'id': r.json()['cpu_supporters']['hard'] + ['cpu_friends'][0]['id'] + } + if int(difficulty) == 0: + if 'normal' in r.json()['cpu_supporters']: + if len(r.json()['cpu_supporters']['normal' + ]['cpu_friends']) > 0: + return { + 'is_cpu': True, + 'id': r.json()['cpu_supporters']['normal'] + ['cpu_friends'][0]['id'] + } + + return { + 'is_cpu': False, + 'id': r.json()['supporters'][0]['id'] + } + + +#################################################################### +def refill_stamina(): + # ## Restore user stamina + + stones = get_user()['user']['stone'] + if stones < 1: + print(Fore.RED + Style.BRIGHT + 'You have no stones left...') + return 0 + if config.client == 'global': + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('PUT', '/user/recover_act_with_stone'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + url = 'https://ishin-global.aktsk.com/user/recover_act_with_stone' + else: + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('PUT', '/user/recover_act_with_stone'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + url = 'http://ishin-production.aktsk.jp/user/recover_act_with_stone' + + r = requests.put(url, headers=headers) + print(Fore.GREEN + Style.BRIGHT + 'STAMINA RESTORED') + + +#################################################################### +def get_user(): + # Returns user response from bandai + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/user'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/user' + else: + url = 'http://ishin-production.aktsk.jp/user' + r = requests.get(url, headers=headers) + return r.json() + + +#################################################################### +def sell_cards(card_list): + # Takes cards list and sells them in batches of 99 + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/cards/sell'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/cards/sell' + else: + url = 'http://ishin-production.aktsk.jp/cards/sell' + + cards_to_sell = [] + i = 0 + for card in card_list: + i += 1 + cards_to_sell.append(card) + if i == 99: + data = {'card_ids': cards_to_sell} + r = requests.post(url, data=json.dumps(data), headers=headers) + print('Sold Cards x' + str(len(cards_to_sell))) + if 'error' in r.json(): + print(r.json()['error']) + return 0 + i = 0 + cards_to_sell[:] = [] + if i != 0: + data = {'card_ids': cards_to_sell} + r = requests.post(url, data=json.dumps(data), headers=headers) + print('Sold Cards x' + str(len(cards_to_sell))) + # print(r.json()) + + +#################################################################### +def signup(): + # returns string identifier to be formatted and used by SignIn function + + # Set platform to use + set_platform() + + # Generate AdId and Unique ID to send to Bandai + config.AdId = packet.guid()['AdId'] + config.UniqueId = packet.guid()['UniqueId'] + + user_acc = { + 'ad_id': config.AdId, + 'country': 'AU', + 'currency': 'AUD', + 'device': 'samsung', + 'device_model': 'SM-G930V', + 'os_version': '6.0', + 'platform': config.platform, + 'unique_id': config.UniqueId, + } + user_account = json.dumps({'user_account': user_acc}) + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/auth/sign_up' + else: + url = 'http://ishin-production.aktsk.jp/auth/sign_up' + r = requests.post(url, data=user_account, headers=headers) + + # ## It is now necessary to solve the captcha. Opens browser window + # ## in order to solve it. Script waits for user input before continuing + if 'captcha_url' not in r.json(): + print(Fore.RED + Style.BRIGHT + 'Captcha could not be loaded...') + return None + + url = r.json()['captcha_url'] + webbrowser.open(url, new=2) + captcha_session_key = r.json()['captcha_session_key'] + print( + 'Opening captcha in browser. Press' + Fore.RED + Style.BRIGHT + ' ENTER ' + Style.RESET_ALL + 'once you have solved it...') + input() + + # ## Query sign up again passing the captcha session key. + # ## Bandais servers check if captcha was solved relative to the session key + + data = {'captcha_session_key': captcha_session_key, + 'user_account': user_acc} + + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/auth/sign_up' + else: + url = 'http://ishin-production.aktsk.jp/auth/sign_up' + + r = requests.post(url, data=json.dumps(data), headers=headers) + + # ##Return identifier for account, this changes upon transferring account + try: + return base64.b64decode(r.json()['identifier']).decode('utf-8') + except: + return None + +#################################################################### +#################################################################### +def signin(identifier): + # Takes account identifier and encodes it properly, sending BASIC Authorization + # request to bandai. + # Returns tuple + + # Format identifier to receive access_token and secret + basic_pwacc = identifier.split(':') + complete_string = basic_pwacc[1] + ':' + basic_pwacc[0] + basic_accpw = 'Basic ' \ + + base64.b64encode(complete_string.encode('utf-8' + )).decode('utf-8') + data = json.dumps({ + 'ad_id': packet.guid()['AdId'], + 'unique_id': packet.guid()['UniqueId'] + }) + + # print(data) + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': basic_accpw, + 'Content-type': 'application/json', + 'X-ClientVersion': '////', + 'X-Language': 'en', + 'X-UserCountry': 'AU', + 'X-UserCurrency': 'AUD', + 'X-Platform': config.platform, + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/auth/sign_in' + else: + url = 'http://ishin-production.aktsk.jp/auth/sign_in' + + r = requests.post(url, data=data, headers=headers) + + if 'captcha_url' in r.json(): + print(r.json()) + url = r.json()['captcha_url'] + webbrowser.open(url, new=2) + captcha_session_key = r.json()['captcha_session_key'] + print( + 'Opening captcha in browser. Press' + Fore.RED + Style.BRIGHT + ' ENTER ' + Style.RESET_ALL + 'once you have solved it...') + input() + r = requests.post(url, data=data, headers=headers) + + print(Fore.RED + Style.BRIGHT + 'SIGN IN COMPLETE' + Style.RESET_ALL) + + try: + return (r.json()['access_token'], r.json()['secret']) + except: + return None + + +#################################################################### +def get_transfer_code(): + # Returns transfer code in dictionary + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/auth/link_codes'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + data = {'eternal': 1} + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/auth/link_codes' + else: + url = 'http://ishin-production.aktsk.jp/auth/link_codes' + + r = requests.post(url, data=json.dumps(data), headers=headers) + try: + print('Transfer Code:' + r.json()['link_code']) + return {'transfer_code': r.json()['link_code']} + except: + return None + + +#################################################################### +def tutorial(): + # ##Progress NULL TUTORIAL FINISH + + print(Fore.CYAN + Style.BRIGHT + 'Tutorial Progress: 1/8') + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('PUT', '/tutorial/finish'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/tutorial/finish' + else: + url = 'http://ishin-production.aktsk.jp/tutorial/finish' + r = requests.put(url, headers=headers) + + # ##Progress NULL Gasha + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/tutorial/gasha'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/tutorial/gasha' + else: + url = 'http://ishin-production.aktsk.jp/tutorial/gasha' + r = requests.post(url, headers=headers) + print(Fore.CYAN + Style.BRIGHT + 'Tutorial Progress: 2/8') + + # ##Progress to 999% + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('PUT', '/tutorial'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + progress = {'progress': '999'} + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/tutorial' + else: + url = 'http://ishin-production.aktsk.jp/tutorial' + r = requests.put(url, data=json.dumps(progress), headers=headers) + print(Fore.CYAN + Style.BRIGHT + 'Tutorial Progress: 3/8') + + # ##Change User name + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('PUT', '/user'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + user = {'user': {'name': make_name()}} + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/user' + else: + url = 'http://ishin-production.aktsk.jp/user' + r = requests.put(url, data=json.dumps(user), headers=headers) + print(Fore.CYAN + Style.BRIGHT + 'Tutorial Progress: 4/8') + + # ##/missions/put_forward + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/missions/put_forward'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/missions/put_forward' + else: + url = 'http://ishin-production.aktsk.jp/missions/put_forward' + r = requests.post(url, headers=headers) + print(Fore.CYAN + Style.BRIGHT + 'Tutorial Progress: 5/8') + + # ##Apologies accept + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('PUT', '/apologies/accept'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/apologies/accept' + else: + url = 'http://ishin-production.aktsk.jp/apologies/accept' + r = requests.put(url, headers=headers) + + # ##On Demand + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('PUT', '/user'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/user' + else: + url = 'http://ishin-production.aktsk.jp/user' + data = {'user': {'is_ondemand': True}} + r = requests.put(url, data=json.dumps(data), headers=headers) + print(Fore.CYAN + Style.BRIGHT + 'Tutorial Progress: 6/8') + + # ##Hidden potential releasable + + print(Fore.CYAN + Style.BRIGHT + 'Tutorial Progress: 7/8') + print(Fore.CYAN + Style.BRIGHT + 'Tutorial Progress: 8/8') + print(Fore.RED + Style.BRIGHT + 'TUTORIAL COMPLETE') + + +#################################################################### +def jp_db_download(): + # + jp_out_of_date = False + + # Check local DB versions in help.txt + while True: + if os.path.isfile('help.txt'): + f = open(os.path.join('help.txt'), 'r') + local_version_jp = f.readline().rstrip() + f.close() + break + else: + f = open(os.path.join('help.txt'), 'w') + f.write('111\n') + f.write('111\n') + f.close() + + # Check what is the current client this may end up being unnecessary + original_client = config.client + + + + # Set second db to download to jp. + config.client = 'japan' + config.identifier = signup() + config.access_token, config.secret = signin(config.identifier) + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/client_assets/database'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + 'X-Language': 'en', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/client_assets/database' + else: + url = 'http://ishin-production.aktsk.jp/client_assets/database' + + r = requests.get(url, allow_redirects=True, headers=headers) + if local_version_jp != str(r.json()['version']): + jp_out_of_date = True + jp_current = r.json()['version'] + + print(Fore.RED + Style.BRIGHT + 'JP DB out of date...') + print(Fore.RED + Style.BRIGHT + 'Downloading...') + url = r.json()['url'] + r = requests.get(url, allow_redirects=True) + open('dataenc_jp.db', 'wb').write(r.content) + + # Revert client to original + config.client = original_client + + print(Fore.RED + Style.BRIGHT \ + + 'Decrypting Latest Databases... This can take a few minutes...') + + # Calling database decrypt script + + + if jp_out_of_date: + print('Decrypting JP Database') + decryptor.main(p='2db857e837e0a81706e86ea66e2d1633') + with open('help.txt', 'r') as file: + data = file.readlines() + data[1] = str(jp_current) + '\n' + with open('help.txt', 'w') as file: + file.writelines(data) + + print(Fore.GREEN + Style.BRIGHT + 'Database update complete.') + +def glb_db_download(): + # + glb_out_of_date = False + + # Check local DB versions in help.txt + while True: + if os.path.isfile('help.txt'): + f = open(os.path.join('help.txt'), 'r') + local_version_glb = f.readline().rstrip() + f.close() + break + else: + f = open(os.path.join('help.txt'), 'w') + f.write('111\n') + f.write('111\n') + f.close() + + # Check what is the current client this may end up being unnecessary + original_client = config.client + + # Set first db to download to global. + config.client = 'global' + config.identifier = signup() + config.access_token, config.secret = signin(config.identifier) + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/client_assets/database'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + 'X-Language': 'en', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/client_assets/database' + else: + url = 'http://ishin-production.aktsk.jp/client_assets/database' + + r = requests.get(url, allow_redirects=True, headers=headers) + if local_version_glb != str(r.json()['version']): + glb_out_of_date = True + glb_current = r.json()['version'] + + print(Fore.RED + Style.BRIGHT + 'GLB DB out of date...') + print(Fore.RED + Style.BRIGHT + 'Downloading...') + url = r.json()['url'] + r = requests.get(url, allow_redirects=True) + open('dataenc_glb.db', 'wb').write(r.content) + + + + # Revert client to original + config.client = original_client + + print(Fore.RED + Style.BRIGHT \ + + 'Decrypting Latest Databases... This can take a few minutes...') + + # Calling database decrypt script + if glb_out_of_date: + print('Decrypting Global Database') + decryptor.main() + with open('help.txt', 'r') as file: + data = file.readlines() + data[0] = str(glb_current) + '\n' + with open('help.txt', 'w') as file: + file.writelines(data) + + + print(Fore.GREEN + Style.BRIGHT + 'Database update complete.') + +def db_download(): + # + jp_out_of_date = False + glb_out_of_date = False + + # Check local DB versions in help.txt + while True: + if os.path.isfile('help.txt'): + f = open(os.path.join('help.txt'), 'r') + local_version_glb = f.readline().rstrip() + local_version_jp = f.readline().rstrip() + f.close() + break + else: + f = open(os.path.join('help.txt'), 'w') + f.write('111\n') + f.write('111\n') + f.close() + + # Check what is the current client this may end up being unnecessary + original_client = config.client + + # Set first db to download to global. + config.client = 'global' + config.identifier = signup() + config.access_token, config.secret = signin(config.identifier) + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/client_assets/database'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + 'X-Language': 'en', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/client_assets/database' + else: + url = 'http://ishin-production.aktsk.jp/client_assets/database' + + r = requests.get(url, allow_redirects=True, headers=headers) + if local_version_glb != str(r.json()['version']): + glb_out_of_date = True + glb_current = r.json()['version'] + + print(Fore.RED + Style.BRIGHT + 'GLB DB out of date...') + print(Fore.RED + Style.BRIGHT + 'Downloading...') + url = r.json()['url'] + r = requests.get(url, allow_redirects=True) + open('dataenc_glb.db', 'wb').write(r.content) + + # Set second db to download to jp. + config.client = 'japan' + config.identifier = signup() + config.access_token, config.secret = signin(config.identifier) + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/client_assets/database'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + 'X-Language': 'en', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/client_assets/database' + else: + url = 'http://ishin-production.aktsk.jp/client_assets/database' + + r = requests.get(url, allow_redirects=True, headers=headers) + if local_version_jp != str(r.json()['version']): + jp_out_of_date = True + jp_current = r.json()['version'] + + print(Fore.RED + Style.BRIGHT + 'JP DB out of date...') + print(Fore.RED + Style.BRIGHT + 'Downloading...') + url = r.json()['url'] + r = requests.get(url, allow_redirects=True) + open('dataenc_jp.db', 'wb').write(r.content) + + # Revert client to original + config.client = original_client + + print(Fore.RED + Style.BRIGHT \ + + 'Decrypting Latest Databases... This can take a few minutes...') + + # Calling database decrypt script + if glb_out_of_date: + print('Decrypting Global Database') + decryptor.main() + with open('help.txt', 'r') as file: + data = file.readlines() + data[0] = str(glb_current) + '\n' + with open('help.txt', 'w') as file: + file.writelines(data) + + if jp_out_of_date: + print('Decrypting JP Database') + decryptor.main(p='2db857e837e0a81706e86ea66e2d1633') + with open('help.txt', 'r') as file: + data = file.readlines() + data[1] = str(jp_current) + '\n' + with open('help.txt', 'w') as file: + file.writelines(data) + + print(Fore.GREEN + Style.BRIGHT + 'Database update complete.') + + +#################################################################### +def accept_missions(): + # Accept all remaining missions + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/missions'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////' + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/missions' + else: + url = 'http://ishin-production.aktsk.jp/missions' + r = requests.get(url, headers=headers) + missions = r.json() + mission_list = [] + for mission in missions['missions']: + if mission['completed_at'] != None and mission['accepted_reward_at'] == None: + mission_list.append(mission['id']) + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/missions/accept'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////' + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/missions/accept' + else: + url = 'http://ishin-production.aktsk.jp/missions/accept' + data = {"mission_ids": mission_list} + r = requests.post(url, data=json.dumps(data), headers=headers) + if 'error' not in r.json(): + print(Fore.GREEN + Style.BRIGHT + 'Accepted missions') + + +#################################################################### +def accept_gifts(): + # Gets Gift Ids + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/gifts'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/gifts' + else: + url = 'http://ishin-production.aktsk.jp/gifts' + r = requests.get(url, headers=headers) + + gifts = [] + for x in r.json()['gifts']: + gifts.append(x['id']) + + # AcceptGifts + if len(gifts) == 0: + print('No gifts to accept...') + return 0 + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/gifts/accept'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/gifts/accept' + else: + url = 'http://ishin-production.aktsk.jp/gifts/accept' + + chunks = [gifts[x:x + 25] for x in range(0, len(gifts), 25)] + for data in chunks: + data = {'gift_ids': data} + r = requests.post(url, data=json.dumps(data), headers=headers) + if 'error' not in r.json(): + print(Fore.GREEN + Style.BRIGHT + 'Gifts Accepted...') + else: + print(r.json()) + + +#################################################################### +def change_supporter(): + # Needs to have translation properly implemented! + + ###Get user cards + print(Fore.CYAN + Style.BRIGHT + 'Fetching user cards...') + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/cards'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/cards' + else: + url = 'http://ishin-production.aktsk.jp/cards' + r = requests.get(url, headers=headers) + master_cards = r.json()['cards'] + print(Fore.GREEN + Style.BRIGHT + 'Done...') + + ###Sort user cards into a list of dictionaries with attributes + print(Fore.CYAN + Style.BRIGHT + 'Fetching card attributes...') + card_list = [] + for card in master_cards: + ###Get card collection object from database + try: + config.Model.set_connection_resolver(config.db_glb) + db_card = config.Cards.find_or_fail(card['card_id']) + except: + config.Model.set_connection_resolver(config.db_jp) + db_card = config.Cards.find_or_fail(card['card_id']) + # db_card = config.Cards.where('id','=',card['card_id']).first() + + ###Get card rarity + if db_card.rarity == 0: + rarity = 'N' + elif db_card.rarity == 1: + rarity = 'R' + elif db_card.rarity == 2: + rarity = 'SR' + elif db_card.rarity == 3: + rarity = 'SSR' + elif db_card.rarity == 4: + rarity = 'UR' + elif db_card.rarity == 5: + rarity = 'LR' + ###Get card Type + if str(db_card.element)[-1] == '0': + type = '[AGL] ' + elif str(db_card.element)[-1] == '1': + type = '[TEQ] ' + elif str(db_card.element)[-1] == '2': + type = '[INT] ' + elif str(db_card.element)[-1] == '3': + type = '[STR] ' + elif str(db_card.element)[-1] == '4': + type = '[PHY] ' + ###Get card categories list + categories = [] + # Get category id's given card id + card_card_categories = config.CardCardCategories.where( + 'card_id', '=', db_card.id).get() + + try: + for category in card_card_categories: + try: + config.Model.set_connection_resolver(config.db_glb) + categories.append(config.CardCategories.find( + category.card_category_id).name) + except: + config.Model.set_connection_resolver(config.db_jp) + categories.append(config.CardCategories.find( + category.card_category_id).name) + except: + None + ###Get card link_skills list + link_skills = [] + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill1_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill1_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill2_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill2_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill3_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill3_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill4_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill4_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill5_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill5_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill6_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill6_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill7_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill7_id).name) + except: + None + except: + None + + dict = { + 'ID': db_card.id, + 'Rarity': rarity, + 'Name': db_card.name, + 'Type': type, + 'Cost': db_card.cost, + 'Hercule': db_card.is_selling_only, + 'HP': db_card.hp_init, + 'Categories': categories, + 'Links': link_skills, + 'UniqueID': card['id'] + } + card_list.append(dict) + print(Fore.GREEN + Style.BRIGHT + "Done...") + + ###Sort cards + print(Fore.CYAN + Style.BRIGHT + "Sorting cards...") + card_list = sorted(card_list, key=lambda k: k['Name']) + card_list = sorted(card_list, key=lambda k: k['Rarity']) + card_list = sorted(card_list, key=lambda k: k['Cost']) + print(Fore.GREEN + Style.BRIGHT + "Done...") + ###Define cards to display + cards_to_display_dicts = [] + cards_to_display = [] + # Take cards in card_list that aren't hercule statues or kais? + for char in card_list: + if char['Hercule'] != 1 and char['HP'] > 5: + cards_to_display_dicts.append(char) + cards_to_display.append( + char['Type'] + char['Rarity'] + ' ' + char['Name'] + ' | ' + str(char['ID']) + ' | ' + str( + char['UniqueID']) + ' | ' ' x '+str(x['quantity'])) + + ###Define links to display + links_master = [] + config.Model.set_connection_resolver(config.db_jp) + for link in config.LinkSkills.all(): + links_master.append(link.name) + try: + config.Model.set_connection_resolver(config.db_glb) + links_master.append(config.LinkSkills.find_or_fail(link.id).name) + except: + config.Model.set_connection_resolver(config.db_jp) + links_master.append(config.LinkSkills.find_or_fail(link.id).name) + + links_to_display = sorted(links_master) + + ###Define categories to display + categories_master = [] + config.Model.set_connection_resolver(config.db_jp) + for category in config.CardCategories.all(): + try: + config.Model.set_connection_resolver(config.db_glb) + categories_master.append(config.CardCategories.find_or_fail(category.id).name) + except: + config.Model.set_connection_resolver(config.db_jp) + categories_master.append(config.CardCategories.find_or_fail(category.id).name) + + categories_to_display = sorted(categories_master) + + ###Define window layout + + col1 = [[sg.Listbox(values=(cards_to_display), size=(30, 20), key='CARDS')], + [sg.Listbox(values=([]), size=(30, 6), key='CARDS_CHOSEN')], + [sg.Button(button_text='Set as Supporter', key='choose_card')]] + + col2 = [[sg.Listbox(values=(sorted(categories_to_display)), size=(25, 20), key='CATEGORIES')], + [sg.Listbox(values=([]), size=(25, 6), key='CATEGORIES_CHOSEN')], + [sg.Button(button_text='Choose Categories', key='choose_categories'), + sg.Button(button_text='Clear Categories', key='clear_categories')]] + + col3 = [[sg.Listbox(values=(sorted(links_to_display)), size=(25, 20), key='LINKS')], + [sg.Listbox(values=([]), size=(25, 6), key='LINKS_CHOSEN')], + [sg.Button(button_text='Choose Links', key='choose_links'), + sg.Button(button_text='Clear Links', key='clear_links')]] + + layout = [[sg.Column(col1), sg.Column(col2), sg.Column(col3)]] + window = sg.Window('Supporter Update', grab_anywhere=True, keep_on_top=True).Layout(layout) + + ###Begin window loop + chosen_links = [] + chosen_categories = [] + + ### + chosen_cards_ids = [] + chosen_cards_unique_ids = [] + chosen_cards_names = [] + chosen_cards_to_display = [] + + while len(chosen_cards_ids) < 1: + event, values = window.Read() + + if event == None: + return 0 + + if event == 'choose_card': + if len(values['CARDS']) < 1: + continue + # Get ID of chosen card to send to bandai + chosen_line = values['CARDS'][0] + char_name, char_id, char_unique_id = chosen_line.split(' | ') + chosen_cards_ids.append(int(char_id)) + chosen_cards_unique_ids.append(int(char_unique_id)) + try: + config.Model.set_connection_resolver(config.db_glb) + chosen_cards_names.append(config.Cards.find(char_id).name) + except: + config.Model.set_connection_resolver(config.db_jp) + chosen_cards_names.append(config.Cards.find(char_id).name) + + # Chosen cards to display in lower box + chosen_cards_to_display.append(chosen_line) + + if event == 'choose_categories': + for category in values['CATEGORIES']: + chosen_categories.append(category) + categories_to_display.remove(category) + + if event == 'clear_categories': + categories_to_display.extend(chosen_categories) + chosen_categories[:] = [] + categories_to_display = sorted(categories_to_display) + + if event == 'choose_links': + for link in values['LINKS']: + chosen_links.append(link) + links_to_display.remove(link) + + if event == 'clear_links': + links_to_display.extend(chosen_links) + chosen_links[:] = [] + links_to_display = sorted(links_to_display) + break + + ###Re-populate cards to display, checking filter criteria + cards_to_display[:] = [] + for char in cards_to_display_dicts: + if char['Name'] in chosen_cards_names: + continue + + if len(list(set(chosen_links) & set(char['Links']))) != len(chosen_links): + # print("List intersection") + continue + + if len(list(set(chosen_categories) & set(char['Categories']))) != len(chosen_categories): + # print("Category intersectino") + continue + + cards_to_display.append( + char['Type'] + char['Rarity'] + ' ' + char['Name'] + ' | ' + str(char['ID']) + ' | ' + str( + char['UniqueID'])) + + ###Update window elements + window.FindElement('CARDS').Update(values=cards_to_display) + window.FindElement('CARDS_CHOSEN').Update(values=chosen_cards_to_display) + window.FindElement('CATEGORIES').Update(values=categories_to_display) + window.FindElement('CATEGORIES_CHOSEN').Update(values=chosen_categories) + window.FindElement('LINKS').Update(values=links_to_display) + window.FindElement('LINKS_CHOSEN').Update(values=chosen_links) + + window.Close() + ###Send selected supporter to bandai + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('PUT', '/support_leaders'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/support_leaders' + else: + url = 'http://ishin-production.aktsk.jp/support_leaders' + # print(chosen_cards_unique_ids) + data = {'support_leader_ids': chosen_cards_unique_ids} + # print(data) + r = requests.put(url, data=json.dumps(data), headers=headers) + if 'error' in r.json(): + print(Fore.RED + Style.BRIGHT + str(r.json())) + else: + # print(r.json()) + print(chosen_cards_names) + print(Fore.GREEN + Style.BRIGHT + "Supporter updated!") + + return 0 + + +#################################################################### +def change_team(): + # Needs to have translation properly implemented! + + ###Get user deck to change + chosen_deck = int(input("Enter the deck number you would like to change: ")) + + ###Get user cards + print(Fore.CYAN + Style.BRIGHT + 'Fetching user cards...') + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/cards'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/cards' + else: + url = 'http://ishin-production.aktsk.jp/cards' + r = requests.get(url, headers=headers) + master_cards = r.json()['cards'] + print(Fore.GREEN + Style.BRIGHT + 'Done...') + + ###Sort user cards into a list of dictionaries with attributes + print(Fore.CYAN + Style.BRIGHT + 'Fetching card attributes...') + card_list = [] + for card in master_cards: + ###Get card collection object from database + try: + config.Model.set_connection_resolver(config.db_glb) + db_card = config.Cards.find_or_fail(card['card_id']) + except: + config.Model.set_connection_resolver(config.db_jp) + db_card = config.Cards.find_or_fail(card['card_id']) + # db_card = config.Cards.where('id','=',card['card_id']).first() + + ###Get card rarity + if db_card.rarity == 0: + rarity = 'N' + elif db_card.rarity == 1: + rarity = 'R' + elif db_card.rarity == 2: + rarity = 'SR' + elif db_card.rarity == 3: + rarity = 'SSR' + elif db_card.rarity == 4: + rarity = 'UR' + elif db_card.rarity == 5: + rarity = 'LR' + ###Get card Type + if str(db_card.element)[-1] == '0': + type = '[AGL] ' + elif str(db_card.element)[-1] == '1': + type = '[TEQ] ' + elif str(db_card.element)[-1] == '2': + type = '[INT] ' + elif str(db_card.element)[-1] == '3': + type = '[STR] ' + elif str(db_card.element)[-1] == '4': + type = '[PHY] ' + ###Get card categories list + categories = [] + # Get category id's given card id + card_card_categories = config.CardCardCategories.where( + 'card_id', '=', db_card.id).get() + + try: + for category in card_card_categories: + try: + config.Model.set_connection_resolver(config.db_glb) + categories.append(config.CardCategories.find( + category.card_category_id).name) + except: + config.Model.set_connection_resolver(config.db_jp) + categories.append(config.CardCategories.find( + category.card_category_id).name) + except: + None + ###Get card link_skills list + link_skills = [] + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill1_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill1_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill2_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill2_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill3_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill3_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill4_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill4_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill5_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill5_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill6_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill6_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill7_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill7_id).name) + except: + None + except: + None + + dict = { + 'ID': db_card.id, + 'Rarity': rarity, + 'Name': db_card.name, + 'Type': type, + 'Cost': db_card.cost, + 'Hercule': db_card.is_selling_only, + 'HP': db_card.hp_init, + 'Categories': categories, + 'Links': link_skills, + 'UniqueID': card['id'] + } + card_list.append(dict) + print(Fore.GREEN + Style.BRIGHT + "Done...") + + ###Sort cards + print(Fore.CYAN + Style.BRIGHT + "Sorting cards...") + card_list = sorted(card_list, key=lambda k: k['Name']) + card_list = sorted(card_list, key=lambda k: k['Rarity']) + card_list = sorted(card_list, key=lambda k: k['Cost']) + print(Fore.GREEN + Style.BRIGHT + "Done...") + ###Define cards to display + cards_to_display_dicts = [] + cards_to_display = [] + # Take cards in card_list that aren't hercule statues or kais? + for char in card_list: + if char['Hercule'] != 1 and char['HP'] > 5: + cards_to_display_dicts.append(char) + cards_to_display.append( + char['Type'] + char['Rarity'] + ' ' + char['Name'] + ' | ' + str(char['ID']) + ' | ' + str( + char['UniqueID'])) + + ###Define links to display + links_master = [] + config.Model.set_connection_resolver(config.db_jp) + for link in config.LinkSkills.all(): + links_master.append(link.name) + try: + config.Model.set_connection_resolver(config.db_glb) + links_master.append(config.LinkSkills.find_or_fail(link.id).name) + except: + config.Model.set_connection_resolver(config.db_jp) + links_master.append(config.LinkSkills.find_or_fail(link.id).name) + + links_to_display = sorted(links_master) + + ###Define categories to display + categories_master = [] + config.Model.set_connection_resolver(config.db_jp) + for category in config.CardCategories.all(): + try: + config.Model.set_connection_resolver(config.db_glb) + categories_master.append(config.CardCategories.find_or_fail(category.id).name) + except: + config.Model.set_connection_resolver(config.db_jp) + categories_master.append(config.CardCategories.find_or_fail(category.id).name) + + categories_to_display = sorted(categories_master) + + ###Define window layout + + col1 = [[sg.Listbox(values=(cards_to_display), size=(30, 20), key='CARDS')], + [sg.Listbox(values=([]), size=(30, 6), key='CARDS_CHOSEN')], + [sg.Button(button_text='Choose Card', key='choose_card'), + sg.Button(button_text='Confirm Team', key='confirm_team')]] + + col2 = [[sg.Listbox(values=(sorted(categories_to_display)), size=(25, 20), key='CATEGORIES')], + [sg.Listbox(values=([]), size=(25, 6), key='CATEGORIES_CHOSEN')], + [sg.Button(button_text='Choose Categories', key='choose_categories'), + sg.Button(button_text='Clear Categories', key='clear_categories')]] + + col3 = [[sg.Listbox(values=(sorted(links_to_display)), size=(25, 20), key='LINKS')], + [sg.Listbox(values=([]), size=(25, 6), key='LINKS_CHOSEN')], + [sg.Button(button_text='Choose Links', key='choose_links'), + sg.Button(button_text='Clear Links', key='clear_links')]] + + layout = [[sg.Column(col1), sg.Column(col2), sg.Column(col3)]] + window = sg.Window('Deck Update', grab_anywhere=True, keep_on_top=True).Layout(layout) + + ###Begin window loop + chosen_links = [] + chosen_categories = [] + + ### + chosen_cards_ids = [] + chosen_cards_unique_ids = [] + chosen_cards_names = [] + chosen_cards_to_display = [] + + while len(chosen_cards_ids) < 6: + event, values = window.Read() + + if event == None: + return 0 + + if event == 'choose_card': + if len(values['CARDS']) < 1: + continue + # Get ID of chosen card to send to bandai + chosen_line = values['CARDS'][0] + char_name, char_id, char_unique_id = chosen_line.split(' | ') + chosen_cards_ids.append(int(char_id)) + chosen_cards_unique_ids.append(int(char_unique_id)) + try: + config.Model.set_connection_resolver(config.db_glb) + chosen_cards_names.append(config.Cards.find(char_id).name) + except: + config.Model.set_connection_resolver(config.db_jp) + chosen_cards_names.append(config.Cards.find(char_id).name) + + # Chosen cards to display in lower box + chosen_cards_to_display.append(chosen_line) + + if event == 'choose_categories': + for category in values['CATEGORIES']: + chosen_categories.append(category) + categories_to_display.remove(category) + + if event == 'clear_categories': + categories_to_display.extend(chosen_categories) + chosen_categories[:] = [] + categories_to_display = sorted(categories_to_display) + + if event == 'choose_links': + for link in values['LINKS']: + chosen_links.append(link) + links_to_display.remove(link) + + if event == 'clear_links': + links_to_display.extend(chosen_links) + chosen_links[:] = [] + links_to_display = sorted(links_to_display) + + if event == 'confirm_team': + if len(chosen_cards_unique_ids) < 6: + if len(chosen_cards_unique_ids) == 0: + print(Fore.RED + Style.BRIGHT + 'No cards selected.') + return 0 + loop = 6 - len(chosen_cards_unique_ids) + for i in range(int(loop)): + chosen_cards_unique_ids.append('0') + break + + ###Re-populate cards to display, checking filter criteria + cards_to_display[:] = [] + for char in cards_to_display_dicts: + if char['Name'] in chosen_cards_names: + continue + + if len(list(set(chosen_links) & set(char['Links']))) != len(chosen_links): + # print("List intersection") + continue + + if len(list(set(chosen_categories) & set(char['Categories']))) != len(chosen_categories): + # print("Category intersectino") + continue + + cards_to_display.append( + char['Type'] + char['Rarity'] + ' ' + char['Name'] + ' | ' + str(char['ID']) + ' | ' + str( + char['UniqueID'])) + + ###Update window elements + window.FindElement('CARDS').Update(values=cards_to_display) + window.FindElement('CARDS_CHOSEN').Update(values=chosen_cards_to_display) + window.FindElement('CATEGORIES').Update(values=categories_to_display) + window.FindElement('CATEGORIES_CHOSEN').Update(values=chosen_categories) + window.FindElement('LINKS').Update(values=links_to_display) + window.FindElement('LINKS_CHOSEN').Update(values=chosen_links) + + window.Close() + ###Send selected team to bandai + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/teams'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/teams' + else: + url = 'http://ishin-production.aktsk.jp/teams' + # print(chosen_cards_unique_ids) + data = {'selected_team_num': 1, 'user_card_teams': [ + {'num': chosen_deck, 'user_card_ids': chosen_cards_unique_ids}, + ]} + # print(data) + r = requests.post(url, data=json.dumps(data), headers=headers) + if 'error' in r.json(): + print(Fore.RED + Style.BRIGHT + str(r.json())) + else: + # print(r.json()) + print(chosen_cards_names) + print(Fore.GREEN + Style.BRIGHT + "Deck updated!") + + return 0 + + +#################################################################### +def get_kagi_id(stage): + # return kagi ID to use for a stage + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/eventkagi_items'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/eventkagi_items' + else: + url = 'http://ishin-production.aktsk.jp/eventkagi_items' + r = requests.get(url, headers=headers) + + kagi_items = r.json()['eventkagi_items'] + area_id = config.Quests.find(stage).area_id + area_category = config.Area.find(area_id).category + areatabs = config.AreaTabs.all() + for tab in areatabs: + j = json.loads(tab.area_category_ids) + if area_category in j['area_category_ids']: + kagi_id = int(tab.id) + print('Kagi ID: ' + str(tab.id)) + break + for kagi in kagi_items: + if kagi['eventkagi_item_id'] == kagi_id: + if kagi['quantity'] > 0: + print('kagi_id' + kagi_id) + return kagi_id + else: + return None + + return None + + +#################################################################### + +def complete_unfinished_quest_stages(): + # ## Will eventually use this to streamline stuff + # type: (object, object) -> object + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/user_areas'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/user_areas' + else: + url = 'http://ishin-production.aktsk.jp/user_areas' + r = requests.get(url, headers=headers) + + maps = [] + for user in r.json()['user_areas']: + for map in user['user_sugoroku_maps']: + if map['cleared_count'] == 0 and map['sugoroku_map_id'] < 999999 and map['sugoroku_map_id'] > 100: + maps.append(map) + + if len(maps) == 0: + print("No quests to complete!") + print('--------------------------------------------') + return 0 + + i = 0 + while i == 0: + # print(maps) + for map in maps: + complete_stage(str(map['sugoroku_map_id'])[:-1], str(map['sugoroku_map_id'])[-1]) + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/user_areas'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + r = requests.get(url, headers=headers) + maps_check = [] + # print(r.json()) + for user in r.json()['user_areas']: + for map in user['user_sugoroku_maps']: + if map['cleared_count'] == 0 and map['sugoroku_map_id'] < 999999 and map['sugoroku_map_id'] > 100: + maps_check.append(map) + if maps_check == maps: + i = 1 + else: + maps = maps_check + refresh_client() + return 1 + + +#################################################################### +def refresh_client(): + config.access_token, config.secret = signin(config.identifier) + print(Fore.GREEN + Style.BRIGHT + 'Refreshed Token') + + +#################################################################### +def change_name(): + # Changes name associated with account + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('PUT', '/user'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + name = input('What would you like to change your name to?: ') + user = {'user': {'name': name}} + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/user' + else: + url = 'http://ishin-production.aktsk.jp/user' + r = requests.put(url, data=json.dumps(user), headers=headers) + if 'error' in r.json(): + print(r.json()) + else: + print("Name changed to: " + name) + + +#################################################################### +def increase_capacity(): + # Increases account card capacity by 5 every time it is called + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/user/capacity/card'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/user/capacity/card' + else: + url = 'http://ishin-production.aktsk.jp/user/capacity/card' + + r = requests.post(url, headers=headers) + if 'error' in r.json(): + print(Fore.RED + Style.BRIGHT + str(r.json())) + else: + print(Fore.GREEN + Style.BRIGHT + 'Card capacity +5') + + +#################################################################### + +def get_user_info(): + # ## Returns User dictionary and info + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/user'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/user' + else: + url = 'http://ishin-production.aktsk.jp/user' + r = requests.get(url, headers=headers) + user = r.json() + + print('Account OS: ' + config.platform.upper()) + print('User ID: ' + str(user['user']['id'])) + print('Stones: ' + str(user['user']['stone'])) + print('Zeni: ' + str(user['user']['zeni'])) + print('Rank: ' + str(user['user']['rank'])) + print('Stamina: ' + str(user['user']['act'])) + print('Name: ' + str(user['user']['name'])) + print('Total Card Capacity: ' + str(user['user']['total_card_capacity'])) + + +#################################################################### +def complete_unfinished_events(): + # ## Will eventually use this to streamline stuff + # type: (object, object) -> object + ### Get current event IDs + # ## Gets current events json which contains some useful data + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/events'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/events' + else: + url = 'http://ishin-production.aktsk.jp/events' + r = requests.get(url, headers=headers) + events = r.json() + event_ids = [] + for event in events['events']: + event_ids.append(event['id']) + event_ids = sorted(event_ids) + try: + event_ids.remove(135) + except: + None + + ### Complete areas if they are in the current ID pool + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/user_areas'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/user_areas' + else: + url = 'http://ishin-production.aktsk.jp/user_areas' + r = requests.get(url, headers=headers) + areas = r.json()['user_areas'] + i = 1 + for area in areas: + if area['area_id'] in event_ids: + for stage in area['user_sugoroku_maps']: + if stage['cleared_count'] == 0: + complete_stage(str(stage['sugoroku_map_id'])[:-1], str(stage['sugoroku_map_id'])[-1]) + i += 1 + if i % 30 == 0: + refresh_client() + + +#################################################################### +def complete_clash(): + print('Fetching current clash...') + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/resources/home?rmbattles=true'), + 'X-Language': 'en', + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/resources/home?rmbattles=true' + else: + url = 'http://ishin-production.aktsk.jp/resources/home?rmbattles=true' + r = requests.get(url, headers=headers) + clash_id = r.json()['rmbattles']['id'] + + #### dropout + print('Resetting clash to beginning...') + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/rmbattles/' + str(clash_id) + '/stages/dropout'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + sign = { + 'reason': "dropout" + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/rmbattles/' + str(clash_id) + '/stages/dropout' + else: + url = 'http://ishin-production.aktsk.jp/rmbattles/' + str(clash_id) + '/stages/dropout' + + r = requests.post(url, data=json.dumps(sign), headers=headers) + print('Reset complete...') + + print('Fetching list of stages from Bandai...') + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/rmbattles/' + str(clash_id)), + 'X-Language': 'en', + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/rmbattles/' + str(clash_id) + else: + url = 'http://ishin-production.aktsk.jp/rmbattles/' + str(clash_id) + + r = requests.get(url, headers=headers) + + available_stages = [] + for area in r.json()['level_stages'].values(): + for stage in area: + available_stages.append(stage['id']) + print('Stages obtained...') + print('Asking Bandai for available cards...') + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/rmbattles/available_user_cards'), + 'X-Language': 'en', + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/rmbattles/available_user_cards' + else: + url = 'http://ishin-production.aktsk.jp/rmbattles/available_user_cards' + + r = requests.get(url, headers=headers) + print('Cards received...') + available_user_cards = [] + # print(r.json()) + for card in r.json(): + available_user_cards.append(card) + available_user_cards = available_user_cards[:99] + + if len(available_user_cards) == 0: + print(Fore.RED + Style.BRIGHT + "Not enough cards to complete Battlefield with!") + return 0 + + is_beginning = True + # print(available_stages) + print('Sending Bandai full team...') + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('PUT', '/rmbattles/teams/1'), + 'X-Language': 'en', + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + data = {'user_card_ids': available_user_cards} + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/rmbattles/teams/1' + else: + url = 'http://ishin-production.aktsk.jp/rmbattles/teams/1' + + r = requests.put(url, data=json.dumps(data), headers=headers) + print('Sent!') + print('') + print('Commencing Ultimate Clash!') + print('----------------------------') + for stage in available_stages: + leader = available_user_cards[0] + members = available_user_cards[1] + sub_leader = available_user_cards[2] + + sign = { + 'is_beginning': is_beginning, + 'user_card_ids': { + 'leader': leader, + 'members': members, + 'sub_leader': sub_leader + } + } + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/rmbattles/' + str(clash_id) + '/stages/' + str(stage) + '/start'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/rmbattles/' + str(clash_id) + '/stages/' + str(stage) + '/start' + else: + url = 'http://ishin-production.aktsk.jp/rmbattles/' + str(clash_id) + '/stages/' + str(stage) + '/start' + + r = requests.post(url, data=json.dumps(sign), headers=headers) + print('Commencing Stage ' + Fore.YELLOW + str(stage)) + + is_beginning = False + + ###Second request + finish_time = int(round(time.time(), 0) + 2000) + start_time = finish_time - randint(40000000, 50000000) + if 'sign' in r.json(): + dec_sign = packet.decrypt_sign(r.json()['sign']) + enemy_hp = 0 + try: + for enemy in dec_sign['enemies']: + enemy_hp += enemy[0]['hp'] + except: + print('nah') + + sign = { + 'damage': enemy_hp, + 'finished_at_ms': finish_time, + 'finished_reason': 'win', + 'is_cleared': True, + 'remaining_hp': 0, + 'round': 0, + 'started_at_ms': start_time, + 'token': dec_sign['token'] + } + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/rmbattles/' + str(clash_id) + '/stages/finish'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/rmbattles/' + str(clash_id) + '/stages/finish' + else: + url = 'http://ishin-production.aktsk.jp/rmbattles/' + str(clash_id) + '/stages/finish' + + r = requests.post(url, data=json.dumps(sign), headers=headers) + print('Completed Stage ' + Fore.YELLOW + str(stage)) + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/rmbattles/teams/1'), + 'X-Language': 'en', + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/rmbattles/teams/1' + else: + url = 'http://ishin-production.aktsk.jp/rmbattles/teams/1' + + r = requests.get(url, headers=headers) + print('----------------------------') + if 'sortiable_user_card_ids' not in r.json(): + return 0 + available_user_cards = r.json()['sortiable_user_card_ids'] + + +#################################################################### +def complete_area(area_id): + # completes all stages and difficulties of a given area. + # JP Translated + + # Check if GLB database has id, if not try JP DB. + if config.client == 'global': + config.Model.set_connection_resolver(config.db_glb) + quests = config.Quests.where('area_id', '=', area_id).get() + else: + config.Model.set_connection_resolver(config.db_jp) + quests = config.Quests.where('area_id', '=', area_id).get() + + total = 0 + for quest in quests: + config.Model.set_connection_resolver(config.db_jp) + sugorokus = config.Sugoroku.where('quest_id', '=', quest.id).get() + total += len(sugorokus) + i = 1 + for quest in quests: + config.Model.set_connection_resolver(config.db_jp) + sugorokus = config.Sugoroku.where('quest_id', '=', quest.id).get() + difficulties = [] + for sugoroku in sugorokus: + print('Completion of area: ' + str(i) + '/' + str(total)) + complete_stage(str(quest.id), sugoroku.difficulty) + i += 1 + + +#################################################################### +def save_account(): + if not os.path.isdir("Saves"): + try: + os.mkdir('Saves') + os.mkdir('Saves/ios') + os.mkdir('Saves/android') + os.mkdir('Saves/Jp') + os.mkdir('Saves/Jp/ios') + os.mkdir('Saves/Jp/android') + os.mkdir('Saves/fresh') + os.mkdir('Saves/fresh/ios') + os.mkdir('Saves/fresh/android') + except: + print(Fore.RED + Style.BRIGHT + 'Unable to create saves file') + return 0 + + valid_save = False + while valid_save == False: + save_name = input("What would you like to name the file?") + while save_name.isalnum() == 0: + print(Fore.RED + Style.BRIGHT + "Name not allowed!") + save_name = input('What would you like to name this save?: ') + if os.path.exists('Saves' + os.sep + config.platform + os.sep + save_name + ".txt"): + print(Fore.RED + Style.BRIGHT + "File by that name already exists.") + else: + try: + f = open(os.path.join('Saves' + os.sep + config.platform + os.sep + save_name + ".txt"), 'w') + f.write(str(config.identifier) + '\n') + f.write(str(config.AdId) + '\n') + f.write(str(config.UniqueId) + '\n') + f.write(str(config.platform) + '\n') + f.write(str(config.client) + '\n') + f.close() + print('--------------------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Written details to file: ' + save_name) + print(Fore.RED + Style.BRIGHT + 'If ' + save_name + ' is deleted your account will be lost!') + print('--------------------------------------------') + break + except Exception as e: + print(e) + + +#################################################################### +def load_account(): + while 1 == 1: + print( + 'Choose your operating system (' + Fore.YELLOW + Style.BRIGHT + 'Android: 1' + Style.RESET_ALL + ' or' + Fore.YELLOW + Style.BRIGHT + ' IOS: 2' + Style.RESET_ALL + ')',end='') + platform = input('') + if platform[0].lower() in ['1', '2']: + if platform[0].lower() == '1': + config.platform = 'android' + else: + config.platform = 'ios' + break + else: + print(Fore.RED + 'Could not identify correct operating system to use.') + + while 1 == 1: + save_name = input("What save would you like to load?: ") + if os.path.isfile('Saves' + os.sep + config.platform + os.sep + save_name + ".txt"): + try: + f = open(os.path.join('Saves', config.platform, save_name + ".txt"), 'r') + config.identifier = f.readline().rstrip() + config.AdId = f.readline().rstrip() + config.UniqueId = f.readline().rstrip() + config.platform = f.readline().rstrip() + client = f.readline().rstrip() + if config.client == client: + break + else: + print(Fore.RED + Style.BRIGHT + 'Save does not match client version.') + + except Exception as e: + print(e) + + else: + print(Fore.RED + Style.BRIGHT + "Could not find " + save_name) + refresh_client() + + +#################################################################### + +def daily_login(): + # ## Accepts Outstanding Login Bonuses + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', + '/resources/home?apologies=true&banners=true&bonus_schedules=true&budokai=true&comeback_campaigns=true&gifts=true&login_bonuses=true&rmbattles=true'), + 'X-Language': 'en', + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/resources/home?apologies=true&banners=true&bonus_schedules=true&budokai=true&comeback_campaigns=true&gifts=true&login_bonuses=true&rmbattles=true' + else: + url = 'http://ishin-production.aktsk.jp/resources/home?apologies=true&banners=true&bonus_schedules=true&budokai=true&comeback_campaigns=true&gifts=true&login_bonuses=true&rmbattles=true' + r = requests.get(url, headers=headers) + if 'error' in r.json(): + print(r.json()) + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/login_bonuses/accept'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/login_bonuses/accept' + else: + url = 'http://ishin-production.aktsk.jp/login_bonuses/accept' + + r = requests.post(url, headers=headers) + if 'error' in r.json(): + print(r.json()) + + +#################################################################### +def dragonballs(): + is_got = 0 + ###Check for Dragonballs + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/dragonball_sets'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////' + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/dragonball_sets' + else: + url = 'http://ishin-production.aktsk.jp/dragonball_sets' + r = requests.get(url, headers=headers) + if 'error' in r.json(): + print(Fore.RED + Style.BRIGHT + str(r.json())) + return 0 + + ####Determine which dragonball set is being used + set = r.json()['dragonball_sets'][0]['id'] + + ### Complete stages and count dragonballs + for dragonball in r.json()['dragonball_sets']: + for db in reversed(dragonball['dragonballs']): + if db['is_got'] == True: + is_got += 1 + elif db['is_got'] == False: + is_got += 1 + complete_stage(str(db['quest_id']), db['difficulties'][0]) + + ### If all dragonballs found then wish + if is_got == 7: + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/dragonball_sets/' + str(set) + '/wishes'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////' + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/dragonball_sets/' + str(set) + '/wishes' + else: + url = 'http://ishin-production.aktsk.jp/dragonball_sets/' + str(set) + '/wishes' + + r = requests.get(url, headers=headers) + if 'error' in r.json(): + print(Fore.RED + Style.BRIGHT + str(r.json())) + return 0 + wish_ids = [] + for wish in r.json()['dragonball_wishes']: + if wish['is_wishable']: + print('#########################') + print('Wish ID: ' + str(wish['id'])) + wish_ids.append(str(wish['id'])) + print(wish['title']) + print(wish['description']) + print('') + + print(Fore.YELLOW + 'What wish would you like to ask shenron for? ID: ', end='') + choice = input() + while choice not in wish_ids: + print("Shenron did not understand you! ID: ", end='') + choice = input() + wish_ids[:] = [] + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/dragonball_sets/' + str(set) + '/wishes'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/dragonball_sets/' + str(set) + '/wishes' + else: + url = 'http://ishin-production.aktsk.jp/dragonball_sets/' + str(set) + '/wishes' + data = {'dragonball_wish_ids': [int(choice)]} + r = requests.post(url, data=json.dumps(data), headers=headers) + if 'error' in r.json(): + print(Fore.RED + Style.BRIGHT + str(r.json())) + else: + print(Fore.YELLOW + 'Wish granted!') + print('') + + dragonballs() + + return 0 + + +#################################################################### +def transfer_account(): + # Determine correct platform to use + set_platform() + + transfercode = input('Enter your transfer code: ') + + config.AdId = packet.guid()['AdId'] + config.UniqueId = packet.guid()['UniqueId'] + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + data = {'eternal': True, 'old_user_id': '', 'user_account': { + 'device': 'samsung', + 'device_model': 'SM-G930V', + 'os_version': '6.0', + 'platform': config.platform, + 'unique_id': config.UniqueId, + }} + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/auth/link_codes/' \ + + str(transfercode) + else: + url = 'http://ishin-production.aktsk.jp/auth/link_codes/' \ + + str(transfercode) + print('URL: ' + url) + r = requests.put(url, data=json.dumps(data), headers=headers) + if 'error' in r.json(): + print(r.json()) + print(base64.b64decode(r.json()['identifiers']).decode('utf-8')) + config.identifier = base64.b64decode(r.json()['identifiers']).decode('utf-8') + + save_account() + refresh_client() + + +#################################################################### +def user_command_executor(command): + if ',' in command: + command = command.replace(" ", "") + command = command.replace(",", "\n") + s = io.StringIO(command + '\n') + sys.stdin = s + command = input() + + if command == 'help': + print('---------------------------------') + print(' ') + print(Style.BRIGHT + Fore.YELLOW + '\'stage\'' + Style.RESET_ALL + ' | Completes stage given ID or name.') + print(Style.BRIGHT + Fore.YELLOW + '\'gt\'' + Style.RESET_ALL + ' | Gt DragonBalls.') + print( + Style.BRIGHT + Fore.YELLOW + '\'area\'' + Style.RESET_ALL + ' | Complete all stages and difficulties in an area.') + print( + Style.BRIGHT + Fore.YELLOW + '\'cards\'' + Style.RESET_ALL + ' | Provides a GUI to view card information.') + print( + Style.BRIGHT + Fore.YELLOW + '\'completequests\'' + Style.RESET_ALL + ' | Completes all unfinished quest stages.') + print( + Style.BRIGHT + Fore.YELLOW + '\'completeevents\'' + Style.RESET_ALL + ' | Completes all unfinished event stages.') + print( + Style.BRIGHT + Fore.YELLOW + '\'dokkan\'' + Style.RESET_ALL + ' | Completes all event stages, regardless of being finished beforehand.') + print( + Style.BRIGHT + Fore.YELLOW + '\'potara\'' + Style.RESET_ALL + ' | Provides a series of prompts to collect Potara medals.') + print(Style.BRIGHT + Fore.YELLOW + '\'bossrush\'' + Style.RESET_ALL + ' | Completes all bossrush stages.') + print( + Style.BRIGHT + Fore.YELLOW + '\'hercule\'' + Style.RESET_ALL + ' | Completes all Hercule Punch Machine stages.') + print( + Style.BRIGHT + Fore.YELLOW + '\'completezbattles\'' + Style.RESET_ALL + ' | Completes all unfinished zbattles to stage 30.') + print( + Style.BRIGHT + Fore.YELLOW + '\'zstages\'' + Style.RESET_ALL + ' | Provides a GUI to complete single Z-Battle stages.') + print( + Style.BRIGHT + Fore.YELLOW + '\'clash\'' + Style.RESET_ALL + ' | Complete ultimate clash if you have enough UR cards.') + print( + Style.BRIGHT + Fore.YELLOW + '\'listevents\'' + Style.RESET_ALL + ' | Prints a list of all currently available events.') + print( + Style.BRIGHT + Fore.YELLOW + '\'summon\'' + Style.RESET_ALL + ' | Provides a GUI to choose what banner to summon.') + print( + Style.BRIGHT + Fore.YELLOW + '\'listsummons\'' + Style.RESET_ALL + ' | Prints a list of all currently available summons.') + print( + Style.BRIGHT + Fore.YELLOW + '\'dragonballs\'' + Style.RESET_ALL + ' | Collects Dragonballs and makes wishes.') + print( + Style.BRIGHT + Fore.YELLOW + '\'omegafarm\'' + Style.RESET_ALL + ' | Completes everything (story, events, zbattle)') + print(Style.BRIGHT + Fore.YELLOW + '\'info\'' + Style.RESET_ALL + ' | Print out account information.') + print(Style.BRIGHT + Fore.YELLOW + '\'items\'' + Style.RESET_ALL + ' | Provides a GUI to view user items.') + print( + Style.BRIGHT + Fore.YELLOW + '\'medals\'' + Style.RESET_ALL + ' | Provides a GUI to view and sell medals.') + print( + Style.BRIGHT + Fore.YELLOW + '\'sbr or nbsr\'' + Style.RESET_ALL + ' | sbr)') + print( + Style.BRIGHT + Fore.YELLOW + '\'rankup\'' + Style.RESET_ALL + ' | Levels character)') + print(Style.BRIGHT + Fore.YELLOW + '\'sell\'' + Style.RESET_ALL + ' | Provides a GUI to sell cards.') + print(Style.BRIGHT + Fore.YELLOW + '\'team\'' + Style.RESET_ALL + ' | Change composition of a deck.') + print(Style.BRIGHT + Fore.YELLOW + '\'supporter\'' + Style.RESET_ALL + ' | Change your support unit.') + print(Style.BRIGHT + Fore.YELLOW + '\'deck\'' + Style.RESET_ALL + ' | Select a deck to be the default.') + print(Style.BRIGHT + Fore.YELLOW + '\'gift\'' + Style.RESET_ALL + ' | Accepts gifts and missions.') + print(Style.BRIGHT + Fore.YELLOW + '\'transfer\'' + Style.RESET_ALL + ' | Generates User ID and Transfer Code.') + print(Style.BRIGHT + Fore.YELLOW + '\'capacity\'' + Style.RESET_ALL + ' | Increase card capacity by +5.') + print(Style.BRIGHT + Fore.YELLOW + '\'name\'' + Style.RESET_ALL + ' | Change account name.') + print(Style.BRIGHT + Fore.YELLOW + '\'key\'' + Style.RESET_ALL + ' | Kagi stages.') + print(Style.BRIGHT + Fore.YELLOW + '\'Farm\'' + Style.RESET_ALL + ' | LR medals.') + print(Style.BRIGHT + Fore.YELLOW + '\'fu\'' + Style.RESET_ALL + ' | 40 ur medals.') + print(Style.BRIGHT + Fore.YELLOW + '\'TF\'' + Style.RESET_ALL + ' | Treasure Farm.') + print(Style.BRIGHT + Fore.YELLOW + '\'refresh\'' + Style.RESET_ALL + ' | Reauthenticates the client.') + elif command == 'TF': + TF() + elif command == 'tf': + TF() + elif command == 'stage': + stage = input('What stage would you like to complete?: ') + difficulty = input('Enter the difficulty|(0:Easy, 1:Hard etc...): ') + loop = input('Enter how many times to execute: ') + for i in range(int(loop)): + complete_stage(stage, difficulty) + elif command == 'area': + area = input('Enter the area to complete: ') + loop = input('How many times to complete the entire area: ') + for i in range(int(loop)): + complete_area(area) + elif command == 'gift': + accept_gifts() + accept_missions() + elif command == 'omegafarm': + complete_unfinished_quest_stages() + refresh_client() + complete_unfinished_events() + complete_unfinished_zbattles() + complete_clash() + accept_gifts() + accept_missions() + refresh_client() + ## When this will get updated, we shall add :finishzbattle,30, + sell + sellhercule + baba(?) + elif command == 'completequests': + complete_unfinished_quest_stages() + elif command == 'completeevents': + complete_unfinished_events() + elif command == 'completezbattles': + complete_unfinished_zbattles() + elif command == 'zstages': + complete_zbattle_stage() + elif command == 'clash': + complete_clash() + elif command == 'daily': + complete_stage('130001', 0) + complete_stage('131001', 0) + complete_stage('132001', 0) + complete_potential() + accept_gifts() + accept_missions() + elif command == 'listevents': + list_events() + elif command == 'summon': + summon() + elif command == 'listsummons': + list_summons() + elif command == 'dragonballs': + dragonballs() + elif command == 'info': + get_user_info() + elif command == 'items': + items_viewer() + elif command == 'medals': + sell_medals() + elif command == 'sell': + sell_cards__bulk_GUI() + elif command == 'cards': + list_cards() + elif command == 'supporter': + change_supporter() + elif command == 'team': + change_team() + elif command == 'farm': + lr_farm() + elif command == 'fu': + ur_farm() + elif command == 'deck': + config.deck = int(input('Enter a deck number to use: ')) + elif command == 'transfer': + new_transfer() + elif command == 'capacity': + valid = False + while not valid: + try: + increase_times = int(input("How many times do you want to increase the capacity? (+5 per time): ")) + valid = True + except ValueError: + print("That's not a valid number.") + # Checking if you have enough Dragon Stones + if increase_times > get_user()['user']['stone']: + print("You don't have enough Dragon Stones.") + pass + # Increasing the capacity + else: + for _ in range(increase_times): + increase_capacity() + increase_capacity() + elif command == 'name': + change_name() + elif command == 'dokkan': + dokkan() + elif command == 'supporter': + change_supporter() + elif command == 'sbr': + complete_sbr() + elif command == 'bossrush': + complete_stage('701001', 3) + complete_stage('701001', 4) + complete_stage('701002', 4) + complete_stage('701002', 5) + complete_stage('701003', 5) + complete_stage('701004', 5) + complete_stage('701005', 5) + complete_stage('701006', 5) + complete_stage('701007', 5) + complete_stage('701008', 5) + if config.client == "japan": + complete_stage('701007', 5) + complete_stage('701008', 5) + accept_missions() + elif command == 'potara': + potara() + elif command == 'hercule': + complete_stage('711001', 1) + complete_stage('711002', 1) + complete_stage('711003', 1) + complete_stage('711004', 1) + complete_stage('711005', 1) + complete_stage('711006', 1) + complete_potential() + accept_gifts() + accept_missions() + elif command == 'rankup': + rankup() + elif command == 'gt': + Gt() + elif command == 'key': + get_kagi() + elif command == 'limit': + limit_stage() + elif command == 'refresh': + refresh_client() + else: + print('Command not found.') + + +#################################################################### +def complete_unfinished_zbattles(kagi=False): + # JP Translated + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/events'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/events' + else: + url = 'http://ishin-production.aktsk.jp/events' + r = requests.get(url, headers=headers) + events = r.json() + try: + for event in events['z_battle_stages']: + try: + config.Model.set_connection_resolver(config.db_glb) + x = config.ZBattles.where('z_battle_stage_id', '=', event['id']).first().enemy_name + except: + config.Model.set_connection_resolver(config.db_jp) + print(config.ZBattles.where('z_battle_stage_id', '=', event['id']).first().enemy_name, end='') + print(Fore.CYAN + Style.BRIGHT + ' | ID: ' + str(event['id'])) + + # Get current zbattle level + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/user_areas'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/user_areas' + else: + url = 'http://ishin-production.aktsk.jp/user_areas' + r = requests.get(url, headers=headers) + if 'user_z_battles' in r.json(): + zbattles = r.json()['user_z_battles'] + if zbattles == []: + zbattles = 0 + else: + zbattles = 0 + + level = 1 + for zbattle in zbattles: + if int(zbattle['z_battle_stage_id']) == int(event['id']): + level = zbattle['max_clear_level'] + 1 + print('Current EZA Level: ' + str(level)) + + # Stop at level 30 !! This may not work for all zbattle e.g kid gohan + while level < 31: + ##Get supporters + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/z_battles/' + str(event['id']) + '/supporters'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/z_battles/' + str(event['id']) + '/supporters' + else: + url = 'http://ishin-production.aktsk.jp/z_battles/' + str(event['id']) + '/supporters' + r = requests.get(url, headers=headers) + if 'supporters' in r.json(): + supporter = r.json()['supporters'][0]['id'] + elif 'error' in r.json(): + print(Fore.RED + Style.BRIGHT + r.json()) + return 0 + else: + print(Fore.RED + Style.BRIGHT + 'Problem with ZBattle') + print(r.raw()) + return 0 + + ###Send first request + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/z_battles/' + str(event['id']) + '/start'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + + if kagi == True: + sign = json.dumps({ + 'friend_id': supporter, + 'level': level, + 'selected_team_num': config.deck, + 'eventkagi_item_id': 5 + }) + else: + sign = json.dumps({ + 'friend_id': supporter, + 'level': level, + 'selected_team_num': config.deck, + }) + + enc_sign = packet.encrypt_sign(sign) + data = {'sign': enc_sign} + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/z_battles/' + str(event['id']) + '/start' + else: + url = 'http://ishin-production.aktsk.jp/z_battles/' + str(event['id']) + '/start' + r = requests.post(url, data=json.dumps(data), headers=headers) + + if 'sign' in r.json(): + dec_sign = packet.decrypt_sign(r.json()['sign']) + # Check if error was due to lack of stamina + elif 'error' in r.json(): + if r.json()['error']['code'] == 'act_is_not_enough': + # Check if allowed to refill stamina + if config.allow_stamina_refill == True: + refill_stamina() + r = requests.post(url, data=json.dumps(data), + headers=headers) + else: + print(r.json()) + return 0 + else: + print(Fore.RED + Style.BRIGHT + 'Problem with ZBattle') + print(r.raw()) + return 0 + + finish_time = int(round(time.time(), 0) + 2000) + start_time = finish_time - randint(6200000, 8200000) + + data = { + 'elapsed_time': finish_time - start_time, + 'is_cleared': True, + 'level': level, + 's': 'rGAX18h84InCwFGbd/4zr1FvDNKfmo/TJ02pd6onclk=', + 't': 'eyJzdW1tYXJ5Ijp7ImVuZW15X2F0dGFjayI6MTAwMzg2LCJlbmVteV9hdHRhY2tfY291bnQiOjUsImVuZW15X2hlYWxfY291bnRzIjpbMF0sImVuZW15X2hlYWxzIjpbMF0sImVuZW15X21heF9hdHRhY2siOjEwMDAwMCwiZW5lbXlfbWluX2F0dGFjayI6NTAwMDAsInBsYXllcl9hdHRhY2tfY291bnRzIjpbMTBdLCJwbGF5ZXJfYXR0YWNrcyI6WzMwNjYwNTJdLCJwbGF5ZXJfaGVhbCI6MCwicGxheWVyX2hlYWxfY291bnQiOjAsInBsYXllcl9tYXhfYXR0YWNrcyI6WzEyMzY4NTBdLCJwbGF5ZXJfbWluX2F0dGFja3MiOls0NzcxOThdLCJ0eXBlIjoic3VtbWFyeSJ9fQ==', + 'token': dec_sign['token'], + 'used_items': [], + 'z_battle_finished_at_ms': finish_time, + 'z_battle_started_at_ms': start_time, + } + # enc_sign = encrypt_sign(sign) + + headers = { + 'User-Agent': 'Android', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/z_battles/' + str(event['id']) + '/finish'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/z_battles/' + str(event['id']) + '/finish' + else: + url = 'http://ishin-production.aktsk.jp/z_battles/' + str(event['id']) + '/finish' + + r = requests.post(url, data=json.dumps(data), headers=headers) + dec_sign = packet.decrypt_sign(r.json()['sign']) + # ## Print out Items from Database + print('Level: ' + str(level)) + # ## Print out Items from Database + if 'items' in dec_sign: + supportitems = [] + awakeningitems = [] + trainingitems = [] + potentialitems = [] + treasureitems = [] + carditems = [] + trainingfields = [] + stones = 0 + supportitemsset = set() + awakeningitemsset = set() + trainingitemsset = set() + potentialitemsset = set() + treasureitemsset = set() + carditemsset = set() + trainingfieldsset = set() + print('Items:') + print('-------------------------') + if 'quest_clear_rewards' in dec_sign: + for x in dec_sign['quest_clear_rewards']: + if x['item_type'] == 'Point::Stone': + stones += x['amount'] + for x in dec_sign['items']: + if x['item_type'] == 'SupportItem': + + # print('' + SupportItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + supportitems.append(x['item_id']) + supportitemsset.add(x['item_id']) + elif x['item_type'] == 'PotentialItem': + + # print('' + PotentialItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + potentialitems.append(x['item_id']) + potentialitemsset.add(x['item_id']) + elif x['item_type'] == 'TrainingItem': + + # print('' + TrainingItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + trainingitems.append(x['item_id']) + trainingitemsset.add(x['item_id']) + elif x['item_type'] == 'AwakeningItem': + + # print('' + AwakeningItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + awakeningitems.append(x['item_id']) + awakeningitemsset.add(x['item_id']) + elif x['item_type'] == 'TreasureItem': + + # print('' + TreasureItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + treasureitems.append(x['item_id']) + treasureitemsset.add(x['item_id']) + elif x['item_type'] == 'Card': + + # card = Cards.find(x['item_id']) + + carditems.append(x['item_id']) + carditemsset.add(x['item_id']) + elif x['item_type'] == 'Point::Stone': + + # print('' + card.name + '['+rarity+']'+ ' x '+str(x['quantity'])) + # print('' + TreasureItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + stones += 1 + elif x['item_type'] == 'TrainingField': + + # card = Cards.find(x['item_id']) + + for i in range(x['quantity']): + trainingfields.append(x['item_id']) + trainingfieldsset.add(x['item_id']) + else: + print(x['item_type']) + + # Print items + for x in supportitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.SupportItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(Fore.CYAN + Style.BRIGHT + config.SupportItems.find(x).name + ' x' \ + + str(supportitems.count(x))) + for x in awakeningitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.AwakeningItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(Fore.MAGENTA + Style.BRIGHT + config.AwakeningItems.find(x).name + ' x' \ + + str(awakeningitems.count(x))) + for x in trainingitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.TrainingItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(Fore.RED + Style.BRIGHT + config.TrainingItems.find(x).name + ' x' \ + + str(trainingitems.count(x))) + for x in potentialitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.PotentialItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(config.PotentialItems.find_or_fail(x).name + ' x' \ + + str(potentialitems.count(x))) + for x in treasureitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.TreasureItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(Fore.GREEN + Style.BRIGHT + config.TreasureItems.find(x).name + ' x' \ + + str(treasureitems.count(x))) + for x in trainingfieldsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.TrainingFields.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(config.TrainingFields.find(x).name + ' x' \ + + str(trainingfields.count(x))) + for x in carditemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.Cards.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(config.Cards.find(x).name + ' x' + str(carditems.count(x))) + print(Fore.YELLOW + Style.BRIGHT + 'Stones x' + str(stones)) + if 'gasha_point' in dec_sign: + print('Friend Points: ' + str(dec_sign['gasha_point'])) + + print('--------------------------') + print('##############################################') + level += 1 + refresh_client() + + except Exception as e: + print(Fore.RED + Style.BRIGHT + str(e)) + print(Fore.RED + Style.BRIGHT + 'Trouble finding new Z-Battle events') + + +#################################################################### +def set_platform(): + while True: + print( + 'Choose your operating system (' + Fore.YELLOW + Style.BRIGHT + 'Android: 1' + Style.RESET_ALL + ' or' + Fore.YELLOW + Style.BRIGHT + ' IOS: 2' + Style.RESET_ALL + ') ',end='') + platform = input('') + if platform[0].lower() in ['1', '2']: + if platform[0].lower() == '1': + config.platform = 'android' + else: + config.platform = 'ios' + break + else: + print(Fore.RED + Style.BRIGHT + 'Could not identify correct operating system to use.') + + +#################################################################### +def list_events(): + # Prints all currently available events + # JP Translated + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/events'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/events' + else: + url = 'http://ishin-production.aktsk.jp/events' + r = requests.get(url, headers=headers) + events = r.json() + + area_id = None + for event in events['events']: + for quest in event['quests']: + if str(event['id']) != area_id: + area_id = str(event['id']) + try: + config.Model.set_connection_resolver(config.db_glb) + area_name = str(config.Area.where('id', '=', area_id).first().name) + except: + config.Model.set_connection_resolver(config.db_jp) + area_name = str(config.Area.where('id', '=', area_id).first().name) + print('--------------------------------------------') + print(Back.BLUE + Fore.WHITE + Style.BRIGHT \ + + area_name) + print('--------------------------------------------') + + ids = quest['id'] + config.Model.set_connection_resolver(config.db_glb) + sugorokus = config.Sugoroku.where('quest_id', '=', int(ids)).get() + if len(sugorokus) < 1: + config.Model.set_connection_resolver(config.db_jp) + sugorokus = config.Sugoroku.where('quest_id', '=', int(ids)).get() + difficulties = [] + for sugoroku in sugorokus: + difficulties.append(sugoroku.difficulty) + print(config.Quests.find(ids).name + ' ' + str(ids) \ + + ' Difficulties: ' + str(difficulties) \ + + ' AreaID: ' + str(event['id'])) + + +#################################################################### +def event_viewer(): + # Event GUI with options to complete stage. + # JP Translation needs work + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/events'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/events' + else: + url = 'http://ishin-production.aktsk.jp/events' + r = requests.get(url, headers=headers) + events = r.json() + + # Build areas list + areas_to_display = [] + stage_ids = [] + areas = {} + + for event in events['events']: + area_id = str(event['id']) + try: + config.Model.set_connection_resolver(config.db_glb) + area_name = area_id + ' | ' + str(config.Area.where('id', '=', area_id).first()+ config.Quests('name')) + except: + config.Model.set_connection_resolver(config.db_jp) + area_name = area_id + ' | ' + str(config.Area.where('id', '=', area_id).first()+ config.Quests('name')) + areas_to_display.append(area_name) + stage_ids[:] = [] + for quest in event['quests']: + stage_ids.append(quest['id']) + areas[area_id] = stage_ids[:] + + stages_to_display = [] + difficulties = [0] + stage_name = '' + + col1 = [[sg.Listbox(values=(sorted(areas_to_display)), change_submits=True, size=(30, 20), key='AREAS')]] + col2 = [[sg.Listbox(values=(sorted(stages_to_display)), change_submits=True, size=(30, 20), key='STAGES')]] + col3 = [[sg.Text('Name', key='STAGE_NAME', size=(30, 2))], + [sg.Text('Difficulty: '), sg.Combo(difficulties, key='DIFFICULTIES', size=(6, 3), readonly=True)], + [sg.Text('How many times to complete:') + , sg.Spin([i for i in range(1, 999)], key='LOOP', initial_value=1, size=(3, 3))], + [sg.Button(button_text='Complete Stage', key='COMPLETE_STAGE')]] + + layout = [[sg.Column(col1), sg.Column(col2), sg.Column(col3)]] + window = sg.Window('Event Viewer').Layout(layout) + + while True: + event, values = window.Read() + if event == None: + return 0 + + if event == 'AREAS' and len(values['AREAS']) > 0: + stages_to_display[:] = [] + # Check if GLB database has id, if not try JP DB. + area_id = values['AREAS'][0].split(' | ')[0] + + for stage_id in areas[area_id]: + try: + config.Model.set_connection_resolver(config.db_glb) + stage_name = config.Quests.find_or_fail(stage_id).name + except: + config.Model.set_connection_resolver(config.db_jp) + stage_name = config.Quests.find_or_fail(stage_id).name + stages_to_display.append(stage_name + ' | ' + str(stage_id)) + + if event == 'STAGES' and len(values['STAGES']) > 0: + difficulties[:] = [] + stage_id = values['STAGES'][0].split(' | ')[1] + stage_name = values['STAGES'][0].split(' | ')[0] + sugorokus = config.Sugoroku.where('quest_id', '=', str(stage_id)).get() + difficulties = [] + for sugoroku in sugorokus: + difficulties.append(str(sugoroku.difficulty)) + window.FindElement('DIFFICULTIES').Update(values=difficulties) + window.FindElement('STAGE_NAME').Update(stage_name) + + if event == 'COMPLETE_STAGE' and stage_name != '': + window.Hide() + window.Refresh() + for i in range(int(values['LOOP'])): + complete_stage(stage_id, values['DIFFICULTIES']) + window.UnHide() + window.Refresh() + + window.FindElement('STAGES').Update(values=stages_to_display) + + +#################################################################### +def complete_potential(): + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/events'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/events' + else: + url = 'http://ishin-production.aktsk.jp/events' + r = requests.get(url, headers=headers) + events = r.json() + for event in events['events']: + if event['id'] >= 140 and event['id'] < 145: + for quest in event['quests']: + ids = quest['id'] + config.Model.set_connection_resolver(config.db_jp) + sugorokus = config.Sugoroku.where('quest_id', '=', + int(ids)).get() + difficulties = [] + for sugoroku in sugorokus: + config.Model.set_connection_resolver(config.db_jp) + complete_stage(str(ids), sugoroku.difficulty) + + +#################################################################### + +def list_summons(): + # Prints current available summons, could be formatted better but meh + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/gashas'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/gashas' + else: + url = 'http://ishin-production.aktsk.jp/gashas' + + r = requests.get(url, headers=headers) + + for gasha in r.json()['gashas']: + print(gasha['name'].replace('\n', ' ') + ' ' + str(gasha['id'])) + if len(gasha['description']) > 0: + print(Fore.YELLOW + re.sub(r'\{[^{}]*\}', "", gasha['description']).replace('\n', ' ')) + + +#################################################################### +def summon(): + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/gashas'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/gashas' + else: + url = 'http://ishin-production.aktsk.jp/gashas' + r = requests.get(url, headers=headers) + gashas = [] + for gasha in r.json()['gashas']: + gashas.append(gasha['name'] + ' | ' + str(gasha['id'])) + + layout = [[sg.Listbox(values=(gashas), size=(30, 20), key='GASHAS')], + [sg.Radio('Multi', "TYPE", default=True), sg.Radio('Single', "TYPE")], + [sg.Spin([i for i in range(1, 999)], key='LOOP', initial_value=1, size=(3, 3))], + [sg.Button(button_text='Summon!', key='SUMMON')]] + window = sg.Window('Event Viewer').Layout(layout) + + while True: + event, values = window.Read() + if event == None: + return 0 + + if event == 'SUMMON' and len(values['GASHAS']) > 0: + summon_id = values['GASHAS'][0].split(' | ')[1] + if values[0]: + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/gashas/' + str(summon_id) + + '/courses/2/draw'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/gashas/' + str(summon_id) \ + + '/courses/2/draw' + else: + url = 'http://ishin-production.aktsk.jp/gashas/' + str(summon_id) \ + + '/courses/2/draw' + window.Hide() + window.Refresh() + for i in range(int(values['LOOP'])): + r = requests.post(url, headers=headers).json() + if 'error' in r: + print(r) + window.Close() + return 0 + card_list = [] + for card in r['gasha_items']: + try: + config.Model.set_connection_resolver(config.db_glb) + config.Cards.find_or_fail(int(card['item_id'])).rarity + except: + config.Model.set_connection_resolver(config.db_jp) + config.Cards.find_or_fail(int(card['item_id'])).rarity + + if config.Cards.find(int(card['item_id'])).rarity == 0: + rarity = Fore.RED + Style.BRIGHT + 'N' + Style.RESET_ALL + elif config.Cards.find(int(card['item_id'])).rarity == 1: + rarity = Fore.RED + Style.BRIGHT + 'R' + Style.RESET_ALL + elif config.Cards.find(int(card['item_id'])).rarity == 2: + rarity = Fore.RED + Style.BRIGHT + 'SR' + Style.RESET_ALL + elif config.Cards.find(int(card['item_id'])).rarity == 3: + rarity = Fore.YELLOW + 'SSR' + Style.RESET_ALL + elif config.Cards.find(int(card['item_id'])).rarity == 4: + rarity = Fore.MAGENTA + Style.BRIGHT + 'UR' + Style.RESET_ALL + elif config.Cards.find(int(card['item_id'])).rarity == 5: + rarity = Fore.CYAN + 'LR' + Style.RESET_ALL + if str(config.Cards.find(int(card['item_id'])).element)[-1] == '0': + type = Fore.CYAN + Style.BRIGHT + 'AGL ' + elif str(config.Cards.find(int(card['item_id'])).element)[-1] == '1': + type = Fore.GREEN + Style.BRIGHT + 'TEQ ' + elif str(config.Cards.find(int(card['item_id'])).element)[-1] == '2': + type = Fore.MAGENTA + Style.BRIGHT + 'INT ' + elif str(config.Cards.find(int(card['item_id'])).element)[-1] == '3': + type = Fore.RED + Style.BRIGHT + 'STR ' + elif str(config.Cards.find(int(card['item_id'])).element)[-1] == '4': + type = Fore.YELLOW + 'PHY ' + card_list.append(type + config.Cards.find(int(card['item_id' + ])).name + ' ' + rarity) + for card in card_list: + print(card) + window.UnHide() + window.Refresh() + + + else: + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/gashas/' + str(summon_id) + + '/courses/1/draw'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/gashas/' + str(summon_id) \ + + '/courses/1/draw' + else: + url = 'http://ishin-production.aktsk.jp/gashas/' + str(summon_id) \ + + '/courses/1/draw' + window.Hide() + window.Refresh() + for i in range(int(values['LOOP'])): + r = requests.post(url, headers=headers).json() + if 'error' in r: + print(r) + window.Close() + return 0 + card_list = [] + for card in r['gasha_items']: + try: + config.Model.set_connection_resolver(config.db_glb) + config.Cards.find_or_fail(int(card['item_id'])).rarity + except: + config.Model.set_connection_resolver(config.db_jp) + config.Cards.find_or_fail(int(card['item_id'])).rarity + + if config.Cards.find(int(card['item_id'])).rarity == 0: + rarity = Fore.RED + Style.BRIGHT + 'N' + Style.RESET_ALL + elif config.Cards.find(int(card['item_id'])).rarity == 1: + rarity = Fore.RED + Style.BRIGHT + 'R' + Style.RESET_ALL + elif config.Cards.find(int(card['item_id'])).rarity == 2: + rarity = Fore.RED + Style.BRIGHT + 'SR' + Style.RESET_ALL + elif config.Cards.find(int(card['item_id'])).rarity == 3: + rarity = Fore.YELLOW + 'SSR' + Style.RESET_ALL + elif config.Cards.find(int(card['item_id'])).rarity == 4: + rarity = Fore.MAGENTA + Style.BRIGHT + 'UR' + Style.RESET_ALL + elif config.Cards.find(int(card['item_id'])).rarity == 5: + rarity = Fore.CYAN + 'LR' + Style.RESET_ALL + if str(config.Cards.find(int(card['item_id'])).element)[-1] == '0': + type = Fore.CYAN + Style.BRIGHT + 'AGL ' + elif str(config.Cards.find(int(card['item_id'])).element)[-1] == '1': + type = Fore.GREEN + Style.BRIGHT + 'TEQ ' + elif str(config.Cards.find(int(card['item_id'])).element)[-1] == '2': + type = Fore.MAGENTA + Style.BRIGHT + 'INT ' + elif str(config.Cards.find(int(card['item_id'])).element)[-1] == '3': + type = Fore.RED + Style.BRIGHT + 'STR ' + elif str(config.Cards.find(int(card['item_id'])).element)[-1] == '4': + type = Fore.YELLOW + 'PHY ' + card_list.append(type + config.Cards.find(int(card['item_id' + ])).name + ' ' + rarity) + for card in card_list: + print(card) + window.UnHide() + window.Refresh() + print('------------------------------------------') + + +#################################################################### +def sell_cards__bulk_GUI(): + # Provides a GUI to select a range of cards to sell. + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/teams'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/teams' + else: + url = 'http://ishin-production.aktsk.jp/teams' + r = requests.get(url, headers=headers) + + team_cards = [] + for team in r.json()['user_card_teams']: + team_cards.extend(team['user_card_ids']) + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/support_leaders'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/support_leaders' + else: + url = 'http://ishin-production.aktsk.jp/support_leaders' + r = requests.get(url, headers=headers) + team_cards.extend(r.json()['support_leader_ids']) + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/cards'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/cards' + else: + url = 'http://ishin-production.aktsk.jp/cards' + r = requests.get(url, headers=headers) + + cards_master_dict = [] + for card in r.json()['cards']: + # Avoid selling favourited cards + if card['is_favorite'] == True: + continue + try: + config.Model.set_connection_resolver(config.db_glb) + # Quick and dirty way to exclude elder kais from sell + hp_max = config.Cards.find_or_fail(card['card_id']).hp_max + if hp_max == 1: + continue + + card_name = config.Cards.find_or_fail(card['card_id']).name + rarity = config.Cards.find_or_fail(card['card_id']).rarity + if card['id'] not in team_cards: + cards_master_dict.append({ + 'card_id': card['card_id'], + 'unique_id': card['id'], + 'name': card_name, + 'rarity': rarity + }) + except: + config.Model.set_connection_resolver(config.db_jp) + # Quick and dirty way to exclude elder kais from sell + hp_max = config.Cards.find_or_fail(card['card_id']).hp_max + if hp_max == '1': + print('max') + continue + + card_name = config.Cards.find_or_fail(card['card_id']).name + rarity = config.Cards.find_or_fail(card['card_id']).rarity + if card['id'] not in team_cards: + cards_master_dict.append({ + 'card_id': card['card_id'], + 'unique_id': card['id'], + 'name': card_name, + 'rarity': rarity + }) + + cards_to_display_dicts = [] + cards_to_display_dicts = cards_master_dict[:] + + cards_to_display = [] + for card in cards_to_display_dicts: + cards_to_display.append(card['name']) + + col1 = [[sg.Checkbox('N', default=False, key='N', change_submits=True)], + [sg.Checkbox('R', default=False, key='R', change_submits=True)], + [sg.Checkbox('SR', default=False, key='SR', change_submits=True)], + [sg.Checkbox('SSR', default=False, key='SSR', change_submits=True)]] + col2 = [[sg.Listbox(values=([]), size=(30, 20), key='CARDS')]] + layout = [[sg.Column(col1), sg.Column(col2)], [sg.Button(button_text='Sell!', key='SELL')]] + window = sg.Window('Sell Cards').Layout(layout) + while True: + event, values = window.Read() + + if event == None: + window.Close() + return 0 + + if event in ['N', 'R', 'SR', 'SSR', 'SELL']: + accepted_rarities = [] + if values['N']: + accepted_rarities.append(0) + if values['R']: + accepted_rarities.append(1) + if values['SR']: + accepted_rarities.append(2) + if values['SSR']: + accepted_rarities.append(3) + + cards_to_display[:] = [] + cards_to_display_dicts[:] = [] + for card in cards_master_dict: + if card['rarity'] in accepted_rarities: + cards_to_display.append(card['name']) + cards_to_display_dicts.append(card) + + if event == 'SELL': + cards_to_sell = [] + window.Hide() + window.Refresh() + for card in cards_to_display_dicts: + cards_to_sell.append(card['unique_id']) + cards_master_dict.remove(card) + sell_cards(cards_to_sell) + cards_to_display[:] = [] + cards_to_display_dicts[:] = [] + cards_to_display_dicts[:] = cards_master_dict + for card in cards_to_display_dicts: + if card['rarity'] in accepted_rarities: + cards_to_display.append(card['name']) + window.UnHide() + window.Refresh() + + window.FindElement('CARDS').Update(values=cards_to_display) + + return 0 + + +#################################################################### +def items_viewer(): + # ## Accepts Outstanding Login Bonuses + headers = { + 'User-Agent': 'Android', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', + '/resources/login?potential_items=true&training_items=true&support_items=true&treasure_items=true&special_items=true'), + 'X-Language': 'en', + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/resources/login?potential_items=true&training_items=true&support_items=true&treasure_items=true&special_items=true' + else: + url = 'http://ishin-production.aktsk.jp/resources/login?potential_items=true&training_items=true&support_items=true&treasure_items=true&special_items=true' + r = requests.get(url, headers=headers) + + col1 = [[sg.Checkbox('Support Items', default=False, key='SUPPORT', change_submits=True)], + [sg.Checkbox('Training Items', default=False, key='TRAINING', change_submits=True)], + [sg.Checkbox('Potential Items', default=False, key='POTENTIAL', change_submits=True)], + [sg.Checkbox('Treasure Items', default=False, key='TREASURE', change_submits=True)], + [sg.Checkbox('Special Items', default=False, key='SPECIAL', change_submits=True)]] + col2 = [[sg.Output(size=(40, 30))]] + layout = [[sg.Column(col1), sg.Column(col2)]] + window = sg.Window('Items').Layout(layout) + while True: + event, values = window.Read() + + if event == None: + window.Close() + return 0 + + if event in ['SUPPORT', 'TRAINING', 'POTENTIAL', 'TREASURE', 'SPECIAL']: + os.system('cls' if os.name == 'nt' else 'clear') + if values['SUPPORT']: + print('\n##########################') + print('Support Items -') + print('##########################') + window.Refresh() + for item in r.json()['support_items']['items']: + try: + config.Model.set_connection_resolver(config.db_glb) + print(str(config.SupportItems.find_or_fail(item['item_id']).name) + ' x' + str( + item['quantity'])) + except: + config.Model.set_connection_resolver(config.db_jp) + print(str(config.SupportItems.find_or_fail(item['item_id']).name) + ' x' + str( + item['quantity'])) + window.Refresh() + if values['TRAINING']: + print('\n##########################') + print('Training Items -') + print('##########################') + window.Refresh() + for item in r.json()['training_items']: + try: + config.Model.set_connection_resolver(config.db_glb) + print(str(config.TrainingItems.find(item['training_item_id']).name) + ' x' + str( + item['quantity'])) + except: + config.Model.set_connection_resolver(config.db_jp) + print(str(config.TrainingItems.find(item['training_item_id']).name) + ' x' + str( + item['quantity'])) + window.Refresh() + if values['POTENTIAL']: + print('\n##########################') + print('Potential Items -') + print('##########################') + window.Refresh() + for item in reversed(r.json()['potential_items']['user_potential_items']): + try: + config.Model.set_connection_resolver(config.db_glb) + print(str(config.PotentialItems.find(item['potential_item_id']).name) + ' x' + str( + item['quantity'])) + print(config.PotentialItems.find(item['potential_item_id']).description) + except: + config.Model.set_connection_resolver(config.db_jp) + print(str(config.PotentialItems.find(item['potential_item_id']).name) + ' x' + str( + item['quantity'])) + print(config.PotentialItems.find(item['potential_item_id']).description) + window.Refresh() + if values['TREASURE']: + print('\n##########################') + print('Treasure Items -') + print('##########################') + window.Refresh() + for item in r.json()['treasure_items']['user_treasure_items']: + try: + config.Model.set_connection_resolver(config.db_glb) + print(str(config.TreasureItems.find(item['treasure_item_id']).name) + ' x' + str( + item['quantity'])) + except: + config.Model.set_connection_resolver(config.db_jp) + print(str(config.TreasureItems.find(item['treasure_item_id']).name) + ' x' + str( + item['quantity'])) + window.Refresh() + if values['SPECIAL']: + print('\n##########################') + print('Special Items -') + print('##########################') + window.Refresh() + for item in r.json()['special_items']: + try: + config.Model.set_connection_resolver(config.db_glb) + print(str(config.SpecialItems.find(item['special_item_id']).name) + ' x' + str( + item['quantity'])) + except: + config.Model.set_connection_resolver(config.db_jp) + print(str(config.SpecialItems.find(item['special_item_id']).name) + ' x' + str( + item['quantity'])) + window.Refresh() + + +#################################################################### +def list_cards(): + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/cards'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/cards' + else: + url = 'http://ishin-production.aktsk.jp/cards' + r = requests.get(url, headers=headers) + cards = {} + for card in r.json()['cards']: + try: + config.Model.set_connection_resolver(config.db_glb) + name = config.Cards.find_or_fail(card['card_id']).name + except: + config.Model.set_connection_resolver(config.db_jp) + name = config.Cards.find_or_fail(card['card_id']).name + + try: + config.Model.set_connection_resolver(config.db_glb) + element = str(config.Cards.find_or_fail(card['card_id']).element) + except: + config.Model.set_connection_resolver(config.db_jp) + element = str(config.Cards.find_or_fail(card['card_id']).element) + + if element[-1] == '0': + element = 'AGL' + elif element[-1] == '1': + element = 'TEQ' + elif element[-1] == '2': + element = 'INT' + elif element[-1] == '3': + element = 'STR' + elif element[-1] == '4': + element = 'PHY' + + try: + config.Model.set_connection_resolver(config.db_glb) + cost = config.Cards.find_or_fail(card['card_id']).cost + leader_skill_id = config.Cards.find_or_fail(card['card_id']).leader_skill_id + passive_skill_id = config.Cards.find_or_fail(card['card_id']).passive_skill_set_id + links_skill_ids = [] + links_skill_ids.append(config.Cards.find_or_fail(card['card_id']).link_skill1_id) + links_skill_ids.append(config.Cards.find_or_fail(card['card_id']).link_skill2_id) + links_skill_ids.append(config.Cards.find_or_fail(card['card_id']).link_skill3_id) + links_skill_ids.append(config.Cards.find_or_fail(card['card_id']).link_skill4_id) + links_skill_ids.append(config.Cards.find_or_fail(card['card_id']).link_skill5_id) + links_skill_ids.append(config.Cards.find_or_fail(card['card_id']).link_skill6_id) + links_skill_ids.append(config.Cards.find_or_fail(card['card_id']).link_skill7_id) + + except: + config.Model.set_connection_resolver(config.db_jp) + cost = config.Cards.find_or_fail(card['card_id']).cost + leader_skill_id = config.Cards.find_or_fail(card['card_id']).leader_skill_id + passive_skill_id = config.Cards.find_or_fail(card['card_id']).passive_skill_set_id + links_skill_ids = [] + links_skill_ids.append(config.Cards.find_or_fail(card['card_id']).link_skill1_id) + links_skill_ids.append(config.Cards.find_or_fail(card['card_id']).link_skill2_id) + links_skill_ids.append(config.Cards.find_or_fail(card['card_id']).link_skill3_id) + links_skill_ids.append(config.Cards.find_or_fail(card['card_id']).link_skill4_id) + links_skill_ids.append(config.Cards.find_or_fail(card['card_id']).link_skill5_id) + links_skill_ids.append(config.Cards.find_or_fail(card['card_id']).link_skill6_id) + links_skill_ids.append(config.Cards.find_or_fail(card['card_id']).link_skill7_id) + + cards[card['card_id']] = { + 'id': card['card_id'], + 'unique_id': card['id'], + 'name': name, + 'type': element, + 'cost': cost, + 'leader_skill_id': leader_skill_id, + 'link_skill_ids': links_skill_ids, + 'passive_skill_id': passive_skill_id + } + cards_sort = [] + for item in cards: + cards_sort.append(cards[item]) + + # Sort cards for listbox + cards_sort = sorted(cards_sort, key=lambda k: k['name']) + cards_sort = sorted(cards_sort, key=lambda k: k['cost']) + + # Card strings to for listbox value + cards_to_display = [] + for card in cards_sort: + cards_to_display.append(card['type'] + ' ' + str(card['cost']) + ' ' + card['name'] + ' | ' + str(card['id'])) + + col1 = [[sg.Listbox(values=(cards_to_display), size=(30, 30), key='CARDS', change_submits=True, + font=('Courier', 15, 'bold'))]] + col2 = [[sg.Text('Type', key='TYPE', font=('', 15, 'bold'), auto_size_text=True), + sg.Text('Name', key='NAME', size=(None, 3), font=('', 15, 'bold'), auto_size_text=True)], + [sg.Text('Cost', key='COST', font=('', 10, 'bold'))], + [sg.Text('Leader Skill', key='LEADERSKILLNAME', size=(None, 1), font=('', 12, 'bold underline'))], + [sg.Text('Leader Skill Description', key='LEADERSKILLDESC', size=(None, 4), font=('', 10, 'bold'))], + [sg.Text('Passive', key='PASSIVESKILLNAME', size=(None, 2), font=('', 12, 'bold underline'))], + [sg.Text('Passive Description', key='PASSIVESKILLDESC', size=(None, 5), font=('', 10, 'bold'))], + [sg.Text('Link Skill', key='LINKSKILL1', size=(None, 1), font=('', 10, 'bold'))], + [sg.Text('Link Skill', key='LINKSKILL2', size=(None, 1), font=('', 10, 'bold'))], + [sg.Text('Link Skill', key='LINKSKILL3', size=(None, 1), font=('', 10, 'bold'))], + [sg.Text('Link Skill', key='LINKSKILL4', size=(None, 1), font=('', 10, 'bold'))], + [sg.Text('Link Skill', key='LINKSKILL5', size=(None, 1), font=('', 10, 'bold'))], + [sg.Text('Link Skill', key='LINKSKILL6', size=(None, 1), font=('', 10, 'bold'))], + [sg.Text('Link Skill', key='LINKSKILL7', size=(None, 1), font=('', 10, 'bold'))]] + + layout = [[sg.Column(col1), sg.Column(col2)]] + window = sg.Window('Items').Layout(layout) + while True: + event, values = window.Read() + + if event == None: + window.Close() + return 0 + + if event == 'CARDS': + # Get Card ID + card_id = int(values['CARDS'][0].split(' | ')[1]) + + # Get correct colour for card element + if cards[card_id]['type'] == 'PHY': + colour = 'gold2' + elif cards[card_id]['type'] == 'STR': + colour = 'red' + elif cards[card_id]['type'] == 'AGL': + colour = 'blue' + elif cards[card_id]['type'] == 'TEQ': + colour = 'green' + elif cards[card_id]['type'] == 'INT': + colour = 'purple' + else: + colour = 'black' + + # Retrieve leaderskill from DB + try: + config.Model.set_connection_resolver(config.db_glb) + leader_skill_name = config.LeaderSkills.find_or_fail(cards[card_id]['leader_skill_id']).name.replace( + '\n', ' ') + leader_skill_desc = config.LeaderSkills.find_or_fail( + cards[card_id]['leader_skill_id']).description.replace('\n', ' ') + + except: + config.Model.set_connection_resolver(config.db_jp) + leader_skill_name = config.LeaderSkills.find_or_fail(cards[card_id]['leader_skill_id']).name.replace( + '\n', ' ') + leader_skill_desc = config.LeaderSkills.find_or_fail( + cards[card_id]['leader_skill_id']).description.replace('\n', ' ') + + # Retrieve passive skill + if cards[card_id]['passive_skill_id'] == None: + passive_skill_name = 'None' + passive_skill_desc = 'None' + else: + try: + config.Model.set_connection_resolver(config.db_glb) + passive_skill_name = config.Passives.find_or_fail(cards[card_id]['passive_skill_id']).name.replace( + '\n', ' ') + passive_skill_desc = config.Passives.find_or_fail( + cards[card_id]['passive_skill_id']).description.replace('\n', ' ') + + except: + config.Model.set_connection_resolver(config.db_jp) + passive_skill_name = config.Passives.find_or_fail(cards[card_id]['passive_skill_id']).name.replace( + '\n', ' ') + passive_skill_desc = config.Passives.find_or_fail( + cards[card_id]['passive_skill_id']).description.replace('\n', ' ') + + # Retrieve link skills from DB + ls1 = None + ls2 = None + ls3 = None + ls4 = None + ls5 = None + ls6 = None + ls7 = None + + try: + config.Model.set_connection_resolver(config.db_glb) + if config.LinkSkills.find(cards[card_id]['link_skill_ids'][0]) != None: + ls1 = config.LinkSkills.find(cards[card_id]['link_skill_ids'][0]).name.replace('\n', ' ') + if config.LinkSkills.find(cards[card_id]['link_skill_ids'][1]) != None: + ls2 = config.LinkSkills.find(cards[card_id]['link_skill_ids'][1]).name.replace('\n', ' ') + if config.LinkSkills.find(cards[card_id]['link_skill_ids'][2]) != None: + ls3 = config.LinkSkills.find(cards[card_id]['link_skill_ids'][2]).name.replace('\n', ' ') + if config.LinkSkills.find(cards[card_id]['link_skill_ids'][3]) != None: + ls4 = config.LinkSkills.find(cards[card_id]['link_skill_ids'][3]).name.replace('\n', ' ') + if config.LinkSkills.find(cards[card_id]['link_skill_ids'][4]) != None: + ls5 = config.LinkSkills.find(cards[card_id]['link_skill_ids'][4]).name.replace('\n', ' ') + else: + ls5 = 'Link Skill' + if config.LinkSkills.find(cards[card_id]['link_skill_ids'][5]) != None: + ls6 = config.LinkSkills.find(cards[card_id]['link_skill_ids'][5]).name.replace('\n', ' ') + else: + ls6 = 'Link Skill' + if config.LinkSkills.find(cards[card_id]['link_skill_ids'][6]) != None: + ls7 = config.LinkSkills.find(cards[card_id]['link_skill_ids'][6]).name.replace('\n', ' ') + else: + ls7 = 'Link Skill' + except: + config.Model.set_connection_resolver(config.db_jp) + if config.LinkSkills.find(cards[card_id]['link_skill_ids'][0]) != None: + ls1 = config.LinkSkills.find(cards[card_id]['link_skill_ids'][0]).name.replace('\n', ' ') + if config.LinkSkills.find(cards[card_id]['link_skill_ids'][1]) != None: + ls2 = config.LinkSkills.find(cards[card_id]['link_skill_ids'][1]).name.replace('\n', ' ') + if config.LinkSkills.find(cards[card_id]['link_skill_ids'][2]) != None: + ls3 = config.LinkSkills.find(cards[card_id]['link_skill_ids'][2]).name.replace('\n', ' ') + if config.LinkSkills.find(cards[card_id]['link_skill_ids'][3]) != None: + ls4 = config.LinkSkills.find(cards[card_id]['link_skill_ids'][3]).name.replace('\n', ' ') + if config.LinkSkills.find(cards[card_id]['link_skill_ids'][4]) != None: + ls5 = config.LinkSkills.find(cards[card_id]['link_skill_ids'][4]).name.replace('\n', ' ') + else: + ls5 = 'Link Skill' + if config.LinkSkills.find(cards[card_id]['link_skill_ids'][5]) != None: + ls6 = config.LinkSkills.find(cards[card_id]['link_skill_ids'][5]).name.replace('\n', ' ') + else: + ls6 = 'Link Skill' + if config.LinkSkills.find(cards[card_id]['link_skill_ids'][6]) != None: + ls7 = config.LinkSkills.find(cards[card_id]['link_skill_ids'][6]).name.replace('\n', ' ') + else: + ls7 = 'Link Skill' + + window.FindElement('NAME').Update(value=cards[card_id]['name'].replace('\n', ' ')) + window.FindElement('TYPE').Update(value='[' + cards[card_id]['type'] + ']', text_color=colour) + window.FindElement('COST').Update(value='COST: ' + str(cards[card_id]['cost'])) + window.FindElement('LEADERSKILLNAME').Update(value=leader_skill_name) + window.FindElement('LEADERSKILLDESC').Update(value=leader_skill_desc) + window.FindElement('PASSIVESKILLNAME').Update(value=passive_skill_name) + window.FindElement('PASSIVESKILLDESC').Update(value=passive_skill_desc) + window.FindElement('LINKSKILL1').Update(value=ls1) + window.FindElement('LINKSKILL2').Update(value=ls2) + window.FindElement('LINKSKILL3').Update(value=ls3) + window.FindElement('LINKSKILL4').Update(value=ls4) + window.FindElement('LINKSKILL5').Update(value=ls5) + window.FindElement('LINKSKILL6').Update(value=ls6) + window.FindElement('LINKSKILL7').Update(value=ls7) + + +#################################################################### +def sell_medals(): + # Get Medals + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/awakening_items'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + config.Model.set_connection_resolver(config.db_glb) + url = 'https://ishin-global.aktsk.com/awakening_items' + else: + config.Model.set_connection_resolver(config.db_jp) + url = 'http://ishin-production.aktsk.jp/awakening_items' + r = requests.get(url, headers=headers) + + # Create list with ID for listbox + medal_list = [] + for medal in reversed(r.json()['awakening_items']): + try: + config.Model.set_connection_resolver(config.db_glb) + item = config.Medal.find_or_fail(int(medal['awakening_item_id'])) + except: + config.Model.set_connection_resolver(config.db_jp) + item = config.Medal.find_or_fail(int(medal['awakening_item_id'])) + + medal_list.append(item.name + ' [x' + str(medal['quantity']) + '] | ' + str(item.id)) + + layout = [[sg.Text('Select a medal-')], + [sg.Listbox(values=(medal_list), size=(30, 15), key='medal_tally', font=('', 15, 'bold'))], + [sg.Text('Amount'), sg.Spin([i for i in range(1, 999)], initial_value=1, size=(5, None))], + [sg.Button(button_text='Sell', key='Medal')]] + + window = sg.Window('Medal List', keep_on_top=True).Layout(layout) + while True: + event, values = window.Read() + + if event == None: + window.Close() + return 0 + + # Check if medal selected and sell + if event == 'Medal': + if len(values['medal_tally']) == 0: + print(Fore.RED + Style.BRIGHT + "You did not select a medal.") + continue + + value = values['medal_tally'][0] + medal = value.split(' | ') + medalo = medal[1] + amount = values[0] + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/awakening_items/exchange'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/awakening_items/exchange' + else: + url = 'http://ishin-production.aktsk.jp/awakening_items/exchange' + + medal_id = int(medalo) + chunk = int(amount) // 99 + remainder = int(amount) % 99 + + window.Hide() + window.Refresh() + for i in range(chunk): + data = {'awakening_item_id': medal_id, 'quantity': 99} + r = requests.post(url, data=json.dumps(data), headers=headers) + if 'error' in r.json(): + print(Fore.RED + Style.BRIGHT + str(r.json)) + else: + print(Fore.GREEN + Style.BRIGHT + 'Sold Medals x' + str(99)) + + if remainder > 0: + data = {'awakening_item_id': medal_id, 'quantity': remainder} + r = requests.post(url, data=json.dumps(data), headers=headers) + if 'error' in r.json(): + print(Fore.RED + Style.BRIGHT + str(r.json)) + else: + print(Fore.GREEN + Style.BRIGHT + 'Sold Medals x' + str(remainder)) + + # New medal list + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/awakening_items'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/awakening_items' + else: + url = 'http://ishin-production.aktsk.jp/awakening_items' + r = requests.get(url, headers=headers) + + medal_list[:] = [] + for medal in reversed(r.json()['awakening_items']): + try: + config.Model.set_connection_resolver(config.db_glb) + item = config.Medal.find_or_fail(int(medal['awakening_item_id'])) + except: + config.Model.set_connection_resolver(config.db_jp) + item = config.Medal.find_or_fail(int(medal['awakening_item_id'])) + + medal_list.append(item.name + ' [x' + str(medal['quantity']) + ']' + ' | ' + str(item.id)) + + window.FindElement('medal_tally').Update(values=medal_list) + window.UnHide() + window.Refresh() + + +#################################################################### +def complete_zbattle_stage(kagi=False): + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/events'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/events' + else: + url = 'http://ishin-production.aktsk.jp/events' + r = requests.get(url, headers=headers) + events = r.json() + + zbattles_to_display = [] + for event in events['z_battle_stages']: + try: + config.Model.set_connection_resolver(config.db_glb) + zbattle = config.ZBattles.where('z_battle_stage_id', '=', event['id']).first().enemy_name + ' | ' + str( + event['id']) + except: + config.Model.set_connection_resolver(config.db_jp) + zbattle = config.ZBattles.where('z_battle_stage_id', '=', event['id']).first().enemy_name + ' | ' + str( + event['id']) + zbattles_to_display.append(zbattle) + + col1 = [[sg.Text('Select a Z-Battle', font=('', 15, 'bold'))], + [sg.Listbox(values=(zbattles_to_display), size=(30, 15), key='ZBATTLE', font=('', 15, 'bold'))]] + + col2 = [[sg.Text('Select Single Stage:'), sg.Combo(['5', '10', '15', '20', '25', '30'], size=(6, 3), key='LEVEL')], + [sg.Text('Amount of times: '), + sg.Spin([i for i in range(1, 999)], initial_value=1, size=(5, None), key='LOOP')], + [sg.Button(button_text='Go!', key='GO')]] + + layout = [[sg.Column(col1), sg.Column(col2)]] + window = sg.Window('Medal List').Layout(layout) + + while True: + event, values = window.Read() + if event == None: + window.Close() + return 0 + + if event == 'GO': + if len(values['ZBATTLE']) == 0: + print(Fore.RED + Style.BRIGHT + "Select a Z-Battle!") + continue + + for i in range(int(values['LOOP'])): + window.Hide() + window.Refresh() + # + stage = values['ZBATTLE'][0].split(' | ')[1] + level = values['LEVEL'] + + ##Get supporters + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/z_battles/' + str(stage) + '/supporters'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/z_battles/' + str(stage) + '/supporters' + else: + url = 'http://ishin-production.aktsk.jp/z_battles/' + str(stage) + '/supporters' + r = requests.get(url, headers=headers) + if 'supporters' in r.json(): + supporter = r.json()['supporters'][0]['id'] + elif 'error' in r.json(): + print(Fore.RED + Style.BRIGHT + r.json()) + return 0 + else: + print(Fore.RED + Style.BRIGHT + 'Problem with ZBattle') + print(r.raw()) + return 0 + + ###Send first request + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/z_battles/' + str(stage) + '/start'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + + if kagi == True: + sign = json.dumps({ + 'friend_id': supporter, + 'level': int(level), + 'selected_team_num': config.deck, + 'eventkagi_item_id': 5 + }) + else: + sign = json.dumps({ + 'friend_id': supporter, + 'level': int(level), + 'selected_team_num': config.deck, + }) + + enc_sign = packet.encrypt_sign(sign) + data = {'sign': enc_sign} + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/z_battles/' + str(stage) + '/start' + else: + url = 'http://ishin-production.aktsk.jp/z_battles/' + str(stage) + '/start' + r = requests.post(url, data=json.dumps(data), headers=headers) + + if 'sign' in r.json(): + dec_sign = packet.decrypt_sign(r.json()['sign']) + # Check if error was due to lack of stamina + elif 'error' in r.json(): + if r.json()['error']['code'] == 'act_is_not_enough': + # Check if allowed to refill stamina + if config.allow_stamina_refill == True: + refill_stamina() + r = requests.post(url, data=json.dumps(data), + headers=headers) + else: + print(r.json()) + return 0 + else: + print(Fore.RED + Style.BRIGHT + 'Problem with ZBattle') + print(r.raw()) + return 0 + + finish_time = int(round(time.time(), 0) + 2000) + start_time = finish_time - randint(6200000, 8200000) + + data = { + 'elapsed_time': finish_time - start_time, + 'is_cleared': True, + 'level': int(level), + 's': 'rGAX18h84InCwFGbd/4zr1FvDNKfmo/TJ02pd6onclk=', + 't': 'eyJzdW1tYXJ5Ijp7ImVuZW15X2F0dGFjayI6MTAwMzg2LCJlbmVteV9hdHRhY2tfY291bnQiOjUsImVuZW15X2hlYWxfY291bnRzIjpbMF0sImVuZW15X2hlYWxzIjpbMF0sImVuZW15X21heF9hdHRhY2siOjEwMDAwMCwiZW5lbXlfbWluX2F0dGFjayI6NTAwMDAsInBsYXllcl9hdHRhY2tfY291bnRzIjpbMTBdLCJwbGF5ZXJfYXR0YWNrcyI6WzMwNjYwNTJdLCJwbGF5ZXJfaGVhbCI6MCwicGxheWVyX2hlYWxfY291bnQiOjAsInBsYXllcl9tYXhfYXR0YWNrcyI6WzEyMzY4NTBdLCJwbGF5ZXJfbWluX2F0dGFja3MiOls0NzcxOThdLCJ0eXBlIjoic3VtbWFyeSJ9fQ==', + 'token': dec_sign['token'], + 'used_items': [], + 'z_battle_finished_at_ms': finish_time, + 'z_battle_started_at_ms': start_time, + } + # enc_sign = encrypt_sign(sign) + + headers = { + 'User-Agent': 'Android', + 'Accept': '*/*', + 'Authorization': packet.mac('POST', '/z_battles/' + str(stage) + '/finish'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/z_battles/' + str(stage) + '/finish' + else: + url = 'http://ishin-production.aktsk.jp/z_battles/' + str(stage) + '/finish' + + r = requests.post(url, data=json.dumps(data), headers=headers) + dec_sign = packet.decrypt_sign(r.json()['sign']) + # ## Print out Items from Database + print('Level: ' + str(level)) + # ## Print out Items from Database + if 'items' in dec_sign: + supportitems = [] + awakeningitems = [] + trainingitems = [] + potentialitems = [] + treasureitems = [] + carditems = [] + trainingfields = [] + stones = 0 + supportitemsset = set() + awakeningitemsset = set() + trainingitemsset = set() + potentialitemsset = set() + treasureitemsset = set() + carditemsset = set() + trainingfieldsset = set() + print('Items:') + print('-------------------------') + if 'quest_clear_rewards' in dec_sign: + for x in dec_sign['quest_clear_rewards']: + if x['item_type'] == 'Point::Stone': + stones += x['amount'] + for x in dec_sign['items']: + if x['item_type'] == 'SupportItem': + + # print('' + SupportItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + supportitems.append(x['item_id']) + supportitemsset.add(x['item_id']) + elif x['item_type'] == 'PotentialItem': + + # print('' + PotentialItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + potentialitems.append(x['item_id']) + potentialitemsset.add(x['item_id']) + elif x['item_type'] == 'TrainingItem': + + # print('' + TrainingItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + trainingitems.append(x['item_id']) + trainingitemsset.add(x['item_id']) + elif x['item_type'] == 'AwakeningItem': + + # print('' + AwakeningItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + awakeningitems.append(x['item_id']) + awakeningitemsset.add(x['item_id']) + elif x['item_type'] == 'TreasureItem': + + # print('' + TreasureItems.find(x['item_id']).name + ' x '+str(x['quantity'])) + + for i in range(x['quantity']): + treasureitems.append(x['item_id']) + treasureitemsset.add(x['item_id']) + elif x['item_type'] == 'Card': + + # card = Cards.find(x['item_id']) + + carditems.append(x['item_id']) + carditemsset.add(x['item_id']) + elif x['item_type'] == 'Point::Stone': + stones += 1 + elif x['item_type'] == 'TrainingField': + + # card = Cards.find(x['item_id']) + + for i in range(x['quantity']): + trainingfields.append(x['item_id']) + trainingfieldsset.add(x['item_id']) + else: + print(x['item_type']) + + # Print items + for x in supportitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.SupportItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(Fore.CYAN + Style.BRIGHT + config.SupportItems.find(x).name + ' x' \ + + str(supportitems.count(x))) + for x in awakeningitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.AwakeningItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(Fore.MAGENTA + Style.BRIGHT + config.AwakeningItems.find(x).name + ' x' \ + + str(awakeningitems.count(x))) + for x in trainingitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.TrainingItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(Fore.RED + Style.BRIGHT + config.TrainingItems.find(x).name + ' x' \ + + str(trainingitems.count(x))) + for x in potentialitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.PotentialItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(config.PotentialItems.find_or_fail(x).name + ' x' \ + + str(potentialitems.count(x))) + for x in treasureitemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.TreasureItems.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(Fore.GREEN + Style.BRIGHT + config.TreasureItems.find(x).name + ' x' \ + + str(treasureitems.count(x))) + for x in trainingfieldsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.TrainingFields.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(config.TrainingFields.find(x).name + ' x' \ + + str(trainingfields.count(x))) + for x in carditemsset: + # JP Translation + try: + config.Model.set_connection_resolver(config.db_glb) + config.Cards.find_or_fail(x).name + except: + config.Model.set_connection_resolver(config.db_jp) + + # Print name and item count + print(config.Cards.find(x).name + ' x' + str(carditems.count(x))) + print(Fore.YELLOW + Style.BRIGHT + 'Stones x' + str(stones)) + if 'gasha_point' in dec_sign: + print('Friend Points: ' + str(dec_sign['gasha_point'])) + + print('--------------------------') + print('##############################################') + window.UnHide() + window.Refresh() + + +#################################################################### +def bulk_daily_logins(): + layout = [[sg.Text('Choose what gets completed!')], + [sg.Checkbox('Daily Login', default=True)], + [sg.Checkbox('Accept Gifts')], + [sg.Checkbox('Complete Daily Events')], + [sg.Text('Enter command to execute:')], + [sg.Input(key='user_input')], + [sg.Ok()]] + + window = sg.Window('Daily Logins', keep_on_top=True).Layout(layout) + event, values = window.Read() + window.Close() + if event == None: + return 0 + + login = values[0] + gift = values[1] + daily_events = values[2] + user_input = values['user_input'] + print(user_input) + + # Fetch saves to choose from + files = [] + for subdir, dirs, os_files in os.walk("Saves"): + for file in sorted(os_files): + files.append(subdir + os.sep + file) + + ### Create window that manages saves selections + # Layout + chosen_files = [] + column1 = [ + [sg.Listbox(values=(files), size=(30, None), bind_return_key=True, select_mode='multiple', key='select_save')], + [sg.Button(button_text='Select All', key='all')]] + column2 = [[sg.Listbox(values=(chosen_files), size=(30, None), bind_return_key=True, select_mode='multiple', + key='remove_save')], + [sg.Button(button_text='Remove All', key='remove_all')]] + layout = [[sg.Column(column1), sg.Column(column2)], + [sg.Button(button_text='Start Grind!', key='Done')]] + window = sg.Window('Saves', keep_on_top=True, font=('Helvetica', 15)).Layout(layout) + + while event != 'Done': + event, value = window.Read() + if event == 'select_save': + chosen_files.extend(value['select_save']) + for save in value['select_save']: + files.remove(save) + + if event == 'remove_save': + files.extend(value['remove_save']) + for save in value['remove_save']: + chosen_files.remove(save) + + if event == 'all': + chosen_files.extend(files) + files[:] = [] + + if event == 'remove_all': + files.extend(chosen_files) + chosen_files[:] = [] + + if event == None: + print(Fore.RED + Style.BRIGHT + 'User terminated daily logins') + return 0 + + window.FindElement('select_save').Update(values=sorted(files)) + window.FindElement('remove_save').Update(values=sorted(chosen_files)) + + window.Close() + + ### Execution per file + for file in chosen_files: + bulk_daily_save_processor(file, login, gift, daily_events, user_input) + + +#################################################################### +def bulk_daily_save_processor(save, login, gift, daily_events, user_input): + f = open(os.path.join(save), 'r') + config.identifier = f.readline().rstrip() + config.AdId = f.readline().rstrip() + config.UniqueId = f.readline().rstrip() + config.platform = f.readline().rstrip() + config.client = f.readline().rstrip() + f.close() + + try: + refresh_client() + except: + print('Sign in failed' + save + ".txt") + return 0 + + ### + if login == True: + daily_login() + if gift == True: + accept_gifts() + if daily_events == True: + complete_stage('130001', 0) + complete_stage('131001', 0) + complete_stage('132001', 0) + complete_potential() + accept_gifts() + accept_missions() + print('Completed Daily Grind') + while len(user_input) > 1: + user_command_executor(user_input) + try: + user_input = input() + except: + sys.stdin = sys.__stdin__ + break + user_input = input() + + +############################################################################## +def fresh_save_account(): + if not os.path.isdir("Saves"): + try: + os.mkdir('Saves') + os.mkdir('Saves/ios') + os.mkdir('Saves/android') + os.mkdir('Saves/Jp') + os.mkdir('Saves/Jp/ios') + os.mkdir('Saves/Jp/android') + os.mkdir('Saves/fresh') + os.mkdir('Saves/fresh/ios') + os.mkdir('Saves/fresh/android') + except: + print(Fore.RED + Style.BRIGHT + 'Unable to create saves file') + return 0 + + valid_save = False + while valid_save == False: + save_name = input("What would you like to name the file?") + while save_name.isalnum() == 0: + print(Fore.RED + Style.BRIGHT + "Name not allowed!") + save_name = input('What would you like to name this save?: ') + if os.path.exists('Saves' + os.sep + config.platform + os.sep + save_name + ".txt"): + print(Fore.RED + Style.BRIGHT + "File by that name already exists.") + else: + try: + f = open(os.path.join('Saves/fresh' + os.sep + config.platform + os.sep + save_name + ".txt"), 'w') + f.write(str(config.identifier) + '\n') + f.write(str(config.AdId) + '\n') + f.write(str(config.UniqueId) + '\n') + f.write(str(config.platform) + '\n') + f.write(str(config.client) + '\n') + f.close() + print('--------------------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Written details to file: ' + save_name) + print(Fore.RED + Style.BRIGHT + 'If ' + save_name + ' is deleted your account will be lost!') + print('--------------------------------------------') + break + except Exception as e: + print(e) + + +###################################################################################### +def fresh_load_account(): + while 1 == 1: + print( + 'Choose your operating system (' + Fore.YELLOW + Style.BRIGHT + 'Android: 1' + Style.RESET_ALL + ' or' + Fore.YELLOW + Style.BRIGHT + ' IOS: 2' + Style.RESET_ALL + ')',end='') + platform = input('') + if platform[0].lower() in ['1', '2']: + if platform[0].lower() == '1': + config.platform = 'android' + else: + config.platform = 'ios' + break + else: + print(Fore.RED + 'Could not identify correct operating system to use.') + + while 1 == 1: + save_name = input("What save would you like to load?: ") + if os.path.isfile('Saves/fresh' + os.sep + config.platform + os.sep + save_name + ".txt"): + try: + f = open(os.path.join('Saves/fresh', config.platform, save_name + ".txt"), 'r') + config.identifier = f.readline().rstrip() + config.AdId = f.readline().rstrip() + config.UniqueId = f.readline().rstrip() + config.platform = f.readline().rstrip() + client = f.readline().rstrip() + if config.client == client: + break + else: + print(Fore.RED + Style.BRIGHT + 'Save does not match client version.') + + except Exception as e: + print(e) + + else: + print(Fore.RED + Style.BRIGHT + "Could not find " + save_name) + refresh_client() + + +########################################################################################## +def fresh_bulk_daily_logins(): + layout = [[sg.Text('Choose what gets completed!')], + [sg.Checkbox('Daily Login', default=True)], + [sg.Checkbox('Accept Gifts')], + [sg.Checkbox('Complete Daily Events')], + [sg.Text('Enter command to execute:')], + [sg.Input(key='user_input')], + [sg.Ok()]] + + window = sg.Window('Daily Logins', keep_on_top=True).Layout(layout) + event, values = window.Read() + window.Close() + if event == None: + return 0 + + login = values[0] + gift = values[1] + daily_events = values[2] + user_input = values['user_input'] + print(user_input) + + # Fetch saves to choose from + files = [] + for subdir, dirs, os_files in os.walk("Saves/fresh"): + for file in sorted(os_files): + files.append(subdir + os.sep + file) + + ### Create window that manages saves selections + # Layout + chosen_files = [] + column1 = [ + [sg.Listbox(values=(files), size=(30, None), bind_return_key=True, select_mode='multiple', key='select_save')], + [sg.Button(button_text='Select All', key='all')]] + column2 = [[sg.Listbox(values=(chosen_files), size=(30, None), bind_return_key=True, select_mode='multiple', + key='remove_save')], + [sg.Button(button_text='Remove All', key='remove_all')]] + layout = [[sg.Column(column1), sg.Column(column2)], + [sg.Button(button_text='Start Grind!', key='Done')]] + window = sg.Window('Saves/fresh', keep_on_top=True, font=('Helvetica', 15)).Layout(layout) + + while event != 'Done': + event, value = window.Read() + if event == 'select_save': + chosen_files.extend(value['select_save']) + for save in value['select_save']: + files.remove(save) + + if event == 'remove_save': + files.extend(value['remove_save']) + for save in value['remove_save']: + chosen_files.remove(save) + + if event == 'all': + chosen_files.extend(files) + files[:] = [] + + if event == 'remove_all': + files.extend(chosen_files) + chosen_files[:] = [] + + if event == None: + print(Fore.RED + Style.BRIGHT + 'User terminated daily logins') + return 0 + + window.FindElement('select_save').Update(values=sorted(files)) + window.FindElement('remove_save').Update(values=sorted(chosen_files)) + + window.Close() + + for file in chosen_files: + bulk_daily_save_processor(file, login, gift, daily_events, user_input) + + +######################################################################################################################## +def dokkan(): + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/events'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/events' + else: + url = 'http://ishin-production.aktsk.jp/events' + r = requests.get(url, headers=headers) + events = r.json() + event_ids = [] + for event in events['events']: + event_ids.append(event['id']) + event_ids = sorted(event_ids) + try: + event_ids.remove(135) + except: + None + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/user_areas'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/user_areas' + else: + url = 'http://ishin-production.aktsk.jp/user_areas' + r = requests.get(url, headers=headers) + areas = r.json()['user_areas'] + i = 1 + for area in areas: + if area['area_id'] in event_ids: + for stage in area['user_sugoroku_maps']: + complete_stage(str(stage['sugoroku_map_id'])[:-1], str(stage['sugoroku_map_id'])[-1]) + i += 1 + if i % 30 == 0: + refresh_client() + + +class letter(): + # Each letter has a lowercase character, an uppercase character, and + # identifiers as vowel or consonant. + def __init__(self, lowerchar, upperchar, is_vowel, is_consonant): + self.upperchar = upperchar + self.lowerchar = lowerchar + self.is_vowel = is_vowel + self.is_consonant = is_consonant + + +global alphabet +alphabet = [letter('a', 'A', True, False), + letter('b', 'B', False, True), + letter('c', 'C', False, True), + letter('d', 'D', False, True), + letter('e', 'E', True, False), + letter('f', 'F', False, True), + letter('g', 'G', False, True), + letter('h', 'H', False, True), + letter('i', 'I', True, False), + letter('j', 'J', False, True), + letter('k', 'K', False, True), + letter('l', 'L', False, True), + letter('m', 'M', False, True), + letter('n', 'N', False, True), + letter('o', 'O', True, False), + letter('p', 'P', False, True), + letter('q', 'Q', False, True), + letter('r', 'R', False, True), + letter('s', 'S', False, True), + letter('t', 'T', False, True), + letter('u', 'U', True, False), + letter('v', 'V', False, True), + letter('w', 'W', False, True), + letter('x', 'X', False, True), + letter('y', 'Y', True, True), + letter('z', 'Z', False, True) + ] + + +def rand_int(x1, x2): + # Generate a random integer number between x1 and x2, inclusive. + r = int(int(x1) + random() * (int(x2) - int(x1))) + return r + + +def make_name(): + # Determine name length. + lmin = 3 # Minimum length. + lmax = 3 # Maximum length. + name_length = rand_int(lmin, lmax) + + # Initialize string. + my_name = "" + + prev_vowel = False # Was the previous letter a vowel? + prev_consonant = False # Was the previous letter a consonant? + prev2_vowel = False # Were the previous 2 letters vowels? + prev2_consonant = False # Were the previous 2 letters consonants? + + # Generate letters for name. + for i in range(0, name_length): + a = get_letter(prev2_vowel, prev2_consonant) + if (i == 0): + my_name = my_name + a.upperchar + else: + my_name = my_name + a.lowerchar + prev2_vowel = (a.is_vowel and prev_vowel) + prev2_consonant = (a.is_consonant and prev_consonant) + prev_vowel = a.is_vowel + prev_consonant = a.is_consonant + + return my_name + + +def get_letter(need_consonant, need_vowel): + global alphabet + # Generate a random letter. + done = False + while (not done): + a = alphabet[rand_int(0, 25)] + if ((need_consonant and a.is_vowel) or (need_vowel and a.is_consonant)): + done = False + else: + done = True + return a + + +def complete_sbr(): + print('------------------------------------') + while True: + print(Fore.CYAN + Style.BRIGHT + 'SBR ') + print('---------------------------------') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + '1-10 :' + Fore.YELLOW + Style.BRIGHT + ' 0') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + '11-20 :' + Fore.YELLOW + Style.BRIGHT + ' 1') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + '21-30 :' + Fore.YELLOW + Style.BRIGHT + ' 2') + command = input('Enter your choice: ') + if command == '0': + print(' ') + extra.complete_sbr() + break + elif command == '1': + print(' ') + extra.sbr_next() + break + elif command == '2': + print(' ') + extra.sbr_new() + + + +def potara(): + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + 'Clear without any Support Items') + complete_stage('10002', 2) + complete_stage('11002', 2) + complete_stage('12002', 2) + complete_stage('13002', 2) + complete_stage('14002', 2) + complete_stage('16002', 2) + complete_stage('17002', 2) + complete_stage('18002', 2) + complete_stage('19002', 3) + complete_stage('20002', 3) + complete_stage('22002', 3) + complete_stage('23002', 3) + complete_stage('24002', 3) + complete_stage('25002', 3) + complete_stage('26002', 3) + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + '6 Characters with Link Skill: Z-Fighters') + change_team() + complete_stage('10004', 2) + complete_stage('10006', 2) + complete_stage('10008', 2) + complete_stage('11004', 2) + complete_stage('11006', 2) + complete_stage('11008', 2) + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + '6 Characters with Link Skill: Prodigies') + change_team() + complete_stage('12004', 2) + complete_stage('12006', 2) + complete_stage('12008', 2) + complete_stage('13004', 2) + complete_stage('13006', 2) + complete_stage('13008', 2) + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + '6 Characters with Link Skill: Saiyan Warrior Race') + change_team() + complete_stage('14004', 2) + complete_stage('14006', 2) + complete_stage('14008', 2) + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + 'Clear with a Vegito on your team') + change_team() + complete_stage('15002', 2) + complete_stage('21002', 3) + complete_stage('27002', 3 ) + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + '6 Characters with Link Skill: Golden Warrior') + change_team() + complete_stage('16004', 2) + complete_stage('16006', 2) + complete_stage('16008', 2) + complete_stage('17004', 2) + complete_stage('17006', 2) + complete_stage('17008', 2) + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + '6 Characters with Link Skill: Shocking Speed') + change_team() + complete_stage('18004', 2) + complete_stage('18006', 2) + complete_stage('18008', 2) + complete_stage('19004', 3) + complete_stage('19006', 3) + complete_stage('19008', 3) + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + '6 Characters with Link Skill: Fused Fighter') + change_team() + complete_stage('20004', 3) + complete_stage('20006', 3) + complete_stage('20008', 3) + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + '5 Characters with Link Skill: Fierce Battle') + change_team() + complete_stage('22006', 3) + complete_stage('23006', 3) + complete_stage('24006', 3) + complete_stage('25006', 3) + complete_stage('26006', 3) + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + 'AGL Type with Link Skill: Fierce Battle') + change_team() + complete_stage('22004', 3) + complete_stage('22008', 3) + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + 'TEQ Type with Link Skill: Fierce Battle') + change_team() + complete_stage('23004', 3) + complete_stage('23008', 3) + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + 'INT Type with Link Skill: Fierce Battle') + change_team() + complete_stage('24004', 3) + complete_stage('24008', 3) + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + 'STR Type with Link Skill: Fierce Battle') + change_team() + complete_stage('25004', 3) + complete_stage('25008', 3) + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + 'PHY Type with Link Skill: Fierce Battle') + change_team() + complete_stage('26004', 3) + complete_stage('26008', 3) + + +def new_transfer(): + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/user'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/user' + else: + url = 'http://ishin-production.aktsk.jp/user' + r = requests.get(url, headers=headers) + user = r.json() + print('Name: ' + str(user['user']['name'])) + print('Rank: ' + str(user['user']['rank'])) + print('Account OS: ' + config.platform.upper()) + print('User ID: ' + str(user['user']['id'])) + get_transfer_code() + + + +def rankup(): + #gets current level and level to reach + reachlv = input('\n\nAt what level are you trying to reach?\n') + ranklv = get_user()['user']['rank'] + multiplier = input('\nWhat is the current multiplier? ') + #converts into exp by getting table info + exp_curr = config.Ranks.find(ranklv).exp_total + exp_reach = config.Ranks.find(reachlv).exp_total + exp_needed = exp_reach - exp_curr + # The amount of exp the last stage gives // ttc= times to complete + ttc = exp_needed / (float(27600) * float(multiplier)) + ttc = round(ttc+0.999) + print('Exp needed= ' + str(exp_needed)) + print('The last stage will be done' + str(ttc) + ' times.') + # lööps bröther + for i in range(int(ttc)): + complete_stage('27003', '3', kagi = None) + print(Fore.GREEN + 'Account Rank:' + str(get_user()['user']['rank'])) + + +####################################################################################################################### +def Jp_save_account(): + if not os.path.isdir("Saves"): + try: + os.mkdir('Saves') + os.mkdir('Saves/ios') + os.mkdir('Saves/android') + os.mkdir('Saves/Jp') + os.mkdir('Saves/Jp/ios') + os.mkdir('Saves/Jp/android') + os.mkdir('Saves/fresh') + os.mkdir('Saves/fresh/ios') + os.mkdir('Saves/fresh/android') + except: + print(Fore.RED + Style.BRIGHT + 'Unable to create saves file') + return 0 + + valid_save = False + while valid_save == False: + save_name = input("What would you like to name the file?") + while save_name.isalnum() == 0: + print(Fore.RED + Style.BRIGHT + "Name not allowed!") + save_name = input('What would you like to name this save?: ') + if os.path.exists('Saves/Jp' + os.sep + config.platform + os.sep + save_name + ".txt"): + print(Fore.RED + Style.BRIGHT + "File by that name already exists.") + else: + try: + f = open(os.path.join('Saves/Jp' + os.sep + config.platform + os.sep + save_name + ".txt"), 'w') + f.write(str(config.identifier) + '\n') + f.write(str(config.AdId) + '\n') + f.write(str(config.UniqueId) + '\n') + f.write(str(config.platform) + '\n') + f.write(str(config.client) + '\n') + f.close() + print('--------------------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Written details to file: ' + save_name + ".txt") + print(Fore.RED + Style.BRIGHT + 'If ' + save_name + ' is deleted your account will be lost!') + print('--------------------------------------------') + break + except Exception as e: + print(e) + + +def Jp_load_account(): + while 1 == 1: + print( + 'Choose your operating system (' + Fore.YELLOW + Style.BRIGHT + 'Android: 1' + Style.RESET_ALL + ' or' + Fore.YELLOW + Style.BRIGHT + ' IOS: 2' + Style.RESET_ALL + ')',end='') + platform = input('') + if platform[0].lower() in ['1', '2']: + if platform[0].lower() == '1': + config.platform = 'android' + else: + config.platform = 'ios' + break + else: + print(Fore.RED + 'Could not identify correct operating system to use.') + + while 1 == 1: + save_name = input("What save would you like to load?: ") + if os.path.isfile('Saves/Jp' + os.sep + config.platform + os.sep + save_name + ".txt"): + try: + f = open(os.path.join('Saves/Jp', config.platform, save_name + ".txt"), 'r') + config.identifier = f.readline().rstrip() + config.AdId = f.readline().rstrip() + config.UniqueId = f.readline().rstrip() + config.platform = f.readline().rstrip() + client = f.readline().rstrip() + if config.client == client: + break + else: + print(Fore.RED + Style.BRIGHT + 'Save does not match client version.') + + except Exception as e: + print(e) + + else: + print(Fore.RED + Style.BRIGHT + "Could not find " + save_name) + refresh_client() + + +########################################################################################## +def Jp_bulk_daily_logins(): + layout = [[sg.Text('Choose what gets completed!')], + [sg.Checkbox('Daily Login', default=True)], + [sg.Checkbox('Accept Gifts')], + [sg.Checkbox('Complete Daily Events')], + [sg.Text('Enter command to execute:')], + [sg.Input(key='user_input')], + [sg.Ok()]] + + window = sg.Window('Daily Logins', keep_on_top=True).Layout(layout) + event, values = window.Read() + window.Close() + if event == None: + return 0 + + login = values[0] + gift = values[1] + daily_events = values[2] + user_input = values['user_input'] + print(user_input) + + # Fetch saves to choose from + files = [] + for subdir, dirs, os_files in os.walk("Saves/Jp"): + for file in sorted(os_files): + files.append(subdir + os.sep + file) + + ### Create window that manages saves selections + # Layout + chosen_files = [] + column1 = [ + [sg.Listbox(values=(files), size=(30, None), bind_return_key=True, select_mode='multiple', key='select_save')], + [sg.Button(button_text='Select All', key='all')]] + column2 = [[sg.Listbox(values=(chosen_files), size=(30, None), bind_return_key=True, select_mode='multiple', + key='remove_save')], + [sg.Button(button_text='Remove All', key='remove_all')]] + layout = [[sg.Column(column1), sg.Column(column2)], + [sg.Button(button_text='Start Grind!', key='Done')]] + window = sg.Window('Saves/fresh', keep_on_top=True, font=('Helvetica', 15)).Layout(layout) + + while event != 'Done': + event, value = window.Read() + if event == 'select_save': + chosen_files.extend(value['select_save']) + for save in value['select_save']: + files.remove(save) + + if event == 'remove_save': + files.extend(value['remove_save']) + for save in value['remove_save']: + chosen_files.remove(save) + + if event == 'all': + chosen_files.extend(files) + files[:] = [] + + if event == 'remove_all': + files.extend(chosen_files) + chosen_files[:] = [] + + if event == None: + print(Fore.RED + Style.BRIGHT + 'User terminated daily logins') + return 0 + + window.FindElement('select_save').Update(values=sorted(files)) + window.FindElement('remove_save').Update(values=sorted(chosen_files)) + + window.Close() + + for file in chosen_files: + bulk_daily_save_processor(file, login, gift, daily_events, user_input) + + +def Jp_transfer_account(): + # Determine correct platform to use + set_platform() + + transfercode = input('Enter your transfer code: ') + + config.AdId = packet.guid()['AdId'] + config.UniqueId = packet.guid()['UniqueId'] + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + data = {'eternal': True, 'old_user_id': '', 'user_account': { + 'device': 'samsung', + 'device_model': 'SM-G930V', + 'os_version': '6.0', + 'platform': config.platform, + 'unique_id': config.UniqueId, + }} + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/auth/link_codes/' \ + + str(transfercode) + else: + url = 'http://ishin-production.aktsk.jp/auth/link_codes/' \ + + str(transfercode) + print('URL: ' + url) + r = requests.put(url, data=json.dumps(data), headers=headers) + if 'error' in r.json(): + print(r.json()) + print(base64.b64decode(r.json()['identifiers']).decode('utf-8')) + config.identifier = base64.b64decode(r.json()['identifiers']).decode('utf-8') + + Jp_save_account() + refresh_client() + + +######################################################################################################################## +def Gt(): + complete_stage('173001', 1) + complete_stage('173002', 1) + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + '1 Characters with Link Skill:Turtle School ') + change_team() + complete_stage('173003', 1) + print(Fore.YELLOW + Style.BRIGHT + '1 Characters with Link Skill:Pure Saiyan ') + change_team() + complete_stage('173004', 1) + print(Fore.YELLOW + Style.BRIGHT + '1 Characters with Link Skill:Super Saiyan ') + change_team() + complete_stage('173005', 1) + print(Fore.YELLOW + Style.BRIGHT + ' Use a team made up of only Super characters of each type in level 6 ') + change_team() + complete_stage('173006', 1) + print(Fore.YELLOW + Style.BRIGHT + 'Use a team made up of only characters from the "Buu Saga" category in level 7') + change_team() + complete_stage('173007', 1) + print(Fore.YELLOW + Style.BRIGHT + 'Only teams that include "Giru" can enter this stage.') + change_team() + complete_stage('172001', 1) + complete_stage('172002', 1) + complete_stage('172003', 1) + print(Fore.YELLOW + Style.BRIGHT + 'Teams that include the following characters cannot enter this stage. - Pan (GT) - Pan (GT) (Honey) - Goku (GT) & Pan (GT) & Trunks (GT)') + change_team() + complete_stage('172004', 1) + complete_stage('172005', 1) + complete_stage('172006', 1) + complete_stage('172007', 1) + + +def get_kagi(): + + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 6.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/eventkagi_items'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/eventkagi_items' + else: + url = 'http://ishin-production.aktsk.jp/eventkagi_items' + r = requests.get(url, headers=headers) + stageid = input('\nWhich Stage do you want to complete?: ') + kagi_items = r.json()['eventkagi_items'] + area_id = str(config.Quests.find(stageid).area_id) + area_category = config.Area.find(area_id).category + areatabs = config.AreaTabs.all() + for tab in areatabs: + j = json.loads(tab.area_category_ids) + if area_category in j['area_category_ids']: + kagi_id = int(tab.id) + print('Kagi ID: ' + str(tab.id)) + break + for kagi in kagi_items: + if kagi['eventkagi_item_id'] == kagi_id: + if kagi['quantity'] > 0: + print('Available') + diff = input('\nstage difficulty?: \n') + times = input('\nhow many times do you want to complete?: \n') + for i in range(int(times)): + complete_stage(stageid, diff, kagi=kagi_id) + else: + print(Fore.RED + '\nThere are not enough keys or that stage does not exist for the keys') + return None + + +def limit_stage(): + print(Fore.CYAN + Style.BRIGHT + 'Clear all stages with SUPER UNITS ONLY') + change_team() + complete_stage('319001', 1) + complete_stage('319002', 1) + complete_stage('319003', 1) + complete_stage('319004', 1) + complete_stage('319005', 1) + complete_stage('319006', 1) + complete_stage('319007', 1) + complete_stage('319008', 1) + print(Fore.PURPLE + Style.BRIGHT + 'Clear without PHY character') + change_team() + complete_stage('319009', 1) + print(Fore.YELLOW + Style.BRIGHT + 'Clear without AGL character') + change_team() + complete_stage('319010', 1) + print(Fore.RED + Style.BRIGHT + 'Clear without INT character') + change_team() + complete_stage('319011', 1) + print(Fore.GREEN + Style.BRIGHT + 'Clear without TEQ character') + change_team() + complete_stage('319012', 1) + print(Fore.CYAN + Style.BRIGHT + 'Clear without STR character') + change_team() + complete_stage('319013', 1) + print(Fore.WHITE + Style.BRIGHT + 'Clear with A CHARACTER OF EACH TYPE') + change_team() + complete_stage('319014', 2) + complete_stage('319015', 2) + complete_stage('319016', 2) + complete_stage('319017', 2) + complete_stage('319018', 2) + complete_stage('319019', 2) + complete_stage('319020', 2) + complete_stage('319021', 2) + complete_stage('319022', 2) + complete_stage('319023', 2) + complete_stage('319024', 2) + + print(Fore.CYAN + Style.BRIGHT + 'Clear all stages with EXTREME UNITS ONLY') + change_team() + complete_stage('320001', 1) + complete_stage('320002', 1) + complete_stage('320003', 1) + complete_stage('320004', 1) + complete_stage('320005', 1) + complete_stage('320006', 1) + complete_stage('320007', 1) + complete_stage('320008', 1) + print(Fore.PURPLE + Style.BRIGHT + 'Clear without INT character') + change_team() + complete_stage('320009', 1) + print(Fore.YELLOW + Style.BRIGHT + 'Clear without PHY character') + change_team() + complete_stage('320010', 1) + print(Fore.RED + Style.BRIGHT + 'Clear without STR character') + change_team() + complete_stage('320011', 1) + print(Fore.GREEN + Style.BRIGHT + 'Clear without TEQ character') + change_team() + complete_stage('320012', 1) + print(Fore.CYAN + Style.BRIGHT + 'Clear without AGL character') + change_team() + complete_stage('320013', 1) + print(Fore.WHITE + Style.BRIGHT + 'Clear with A CHARACTER OF EACH TYPE') + change_team() + complete_stage('320014', 2) + complete_stage('320015', 2) + complete_stage('320016', 2) + complete_stage('320017', 2) + complete_stage('320018', 2) + complete_stage('320019', 2) + complete_stage('320020', 2) + complete_stage('320021', 2) + complete_stage('320022', 2) + complete_stage('320023', 2) + complete_stage('320024', 2) + + +def change_supporter(): + # Needs to have translation properly implemented! + + ###Get user cards + print(Fore.CYAN + Style.BRIGHT + 'Fetching user cards...') + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('GET', '/cards'), + 'Content-type': 'application/json', + 'X-Language': 'en', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/cards' + else: + url = 'http://ishin-production.aktsk.jp/cards' + r = requests.get(url, headers=headers) + master_cards = r.json()['cards'] + print(Fore.GREEN + Style.BRIGHT + 'Done...') + + ###Sort user cards into a list of dictionaries with attributes + print(Fore.CYAN + Style.BRIGHT + 'Fetching card attributes...') + card_list = [] + for card in master_cards: + ###Get card collection object from database + try: + config.Model.set_connection_resolver(config.db_glb) + db_card = config.Cards.find_or_fail(card['card_id']) + except: + config.Model.set_connection_resolver(config.db_jp) + db_card = config.Cards.find_or_fail(card['card_id']) + #db_card = config.Cards.where('id','=',card['card_id']).first() + + ###Get card rarity + if db_card.rarity == 0: + rarity = 'N' + elif db_card.rarity == 1: + rarity = 'R' + elif db_card.rarity == 2: + rarity = 'SR' + elif db_card.rarity == 3: + rarity ='SSR' + elif db_card.rarity == 4: + rarity = 'UR' + elif db_card.rarity == 5: + rarity = 'LR' + ###Get card Type + if str(db_card.element)[-1] == '0': + type ='[AGL] ' + elif str(db_card.element)[-1] == '1': + type ='[TEQ] ' + elif str(db_card.element)[-1] == '2': + type ='[INT] ' + elif str(db_card.element)[-1] == '3': + type ='[STR] ' + elif str(db_card.element)[-1] == '4': + type ='[PHY] ' + ###Get card categories list + categories = [] + #Get category id's given card id + card_card_categories = config.CardCardCategories.where( + 'card_id','=',db_card.id).get() + + try: + for category in card_card_categories: + try: + config.Model.set_connection_resolver(config.db_glb) + categories.append(config.CardCategories.find( + category.card_category_id).name) + except: + config.Model.set_connection_resolver(config.db_jp) + categories.append(config.CardCategories.find( + category.card_category_id).name) + except: + None + ###Get card link_skills list + link_skills = [] + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill1_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill1_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill2_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill2_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill3_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill3_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill4_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill4_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill5_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill5_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill6_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill6_id).name) + except: + None + except: + None + try: + config.Model.set_connection_resolver(config.db_glb) + link_skills.append(config.LinkSkills.find(db_card.link_skill7_id).name) + except AttributeError: + try: + config.Model.set_connection_resolver(config.db_jp) + link_skills.append(config.LinkSkills.find(db_card.link_skill7_id).name) + except: + None + except: + None + + dict = { + 'ID': db_card.id, + 'Rarity': rarity, + 'Name': db_card.name, + 'Type': type, + 'Cost': db_card.cost, + 'Hercule': db_card.is_selling_only, + 'HP': db_card.hp_init, + 'Categories':categories, + 'Links':link_skills, + 'UniqueID': card['id'] + } + card_list.append(dict) + print(Fore.GREEN + Style.BRIGHT + "Done...") + + ###Sort cards + print(Fore.CYAN + Style.BRIGHT + "Sorting cards...") + card_list = sorted(card_list, key=lambda k: k['Name']) + card_list = sorted(card_list, key=lambda k: k['Rarity']) + card_list = sorted(card_list, key=lambda k: k['Cost']) + print(Fore.GREEN + Style.BRIGHT + "Done...") + ###Define cards to display + cards_to_display_dicts = [] + cards_to_display = [] + #Take cards in card_list that aren't hercule statues or kais? + for char in card_list: + if char['Hercule'] != 1 and char['HP'] > 5: + cards_to_display_dicts.append(char) + cards_to_display.append(char['Type'] + char['Rarity']+ ' ' +char['Name'] + ' | ' + str(char['ID']) + ' | '+ str(char['UniqueID'])) + + ###Define links to display + links_master = [] + config.Model.set_connection_resolver(config.db_jp) + for link in config.LinkSkills.all(): + links_master.append(link.name) + try: + config.Model.set_connection_resolver(config.db_glb) + links_master.append(config.LinkSkills.find_or_fail(link.id).name) + except: + config.Model.set_connection_resolver(config.db_jp) + links_master.append(config.LinkSkills.find_or_fail(link.id).name) + + links_to_display = sorted(links_master) + + ###Define categories to display + categories_master = [] + config.Model.set_connection_resolver(config.db_jp) + for category in config.CardCategories.all(): + try: + config.Model.set_connection_resolver(config.db_glb) + categories_master.append(config.CardCategories.find_or_fail(category.id).name) + except: + config.Model.set_connection_resolver(config.db_jp) + categories_master.append(config.CardCategories.find_or_fail(category.id).name) + + categories_to_display = sorted(categories_master) + + ###Define window layout + + col1 = [[sg.Listbox(values=(cards_to_display),size = (30,20),key='CARDS')], + [sg.Listbox(values=([]),size = (30,6),key = 'CARDS_CHOSEN')], + [sg.Button(button_text = 'Set as Supporter',key='choose_card')]] + + col2 = [[sg.Listbox(values=(sorted(categories_to_display)),size = (25,20),key = 'CATEGORIES')], + [sg.Listbox(values=([]),size = (25,6),key = 'CATEGORIES_CHOSEN')], + [sg.Button(button_text ='Choose Categories',key='choose_categories'), + sg.Button(button_text ='Clear Categories',key='clear_categories')]] + + col3 = [[sg.Listbox(values=(sorted(links_to_display)),size = (25,20),key='LINKS')], + [sg.Listbox(values=([]),size = (25,6),key = 'LINKS_CHOSEN')], + [sg.Button(button_text ='Choose Links',key='choose_links'), + sg.Button(button_text ='Clear Links',key='clear_links')]] + + layout = [[sg.Column(col1),sg.Column(col2),sg.Column(col3)]] + window = sg.Window('Supporter Update',grab_anywhere=True,keep_on_top = True).Layout(layout) + + + ###Begin window loop + chosen_links = [] + chosen_categories = [] + + ### + chosen_cards_ids = [] + chosen_cards_unique_ids = [] + chosen_cards_names = [] + chosen_cards_to_display = [] + + while len(chosen_cards_ids) < 1: + event,values = window.Read() + + if event == None: + return 0 + + if event == 'choose_card': + if len(values['CARDS']) < 1: + continue + #Get ID of chosen card to send to bandai + chosen_line = values['CARDS'][0] + char_name,char_id,char_unique_id = chosen_line.split(' | ') + chosen_cards_ids.append(int(char_id)) + chosen_cards_unique_ids.append(int(char_unique_id)) + try: + config.Model.set_connection_resolver(config.db_glb) + chosen_cards_names.append(config.Cards.find(char_id).name) + except: + config.Model.set_connection_resolver(config.db_jp) + chosen_cards_names.append(config.Cards.find(char_id).name) + + + #Chosen cards to display in lower box + chosen_cards_to_display.append(chosen_line) + + if event == 'choose_categories': + for category in values['CATEGORIES']: + chosen_categories.append(category) + categories_to_display.remove(category) + + if event == 'clear_categories': + categories_to_display.extend(chosen_categories) + chosen_categories[:] = [] + categories_to_display = sorted(categories_to_display) + + + if event == 'choose_links': + for link in values['LINKS']: + chosen_links.append(link) + links_to_display.remove(link) + + if event == 'clear_links': + links_to_display.extend(chosen_links) + chosen_links[:] = [] + links_to_display = sorted(links_to_display) + break + + ###Re-populate cards to display, checking filter criteria + cards_to_display[:] = [] + for char in cards_to_display_dicts: + if char['Name'] in chosen_cards_names: + continue + + if len(list(set(chosen_links) & set(char['Links']))) != len(chosen_links): + #print("List intersection") + continue + + if len(list(set(chosen_categories) & set(char['Categories']))) != len(chosen_categories): + #print("Category intersectino") + continue + + cards_to_display.append(char['Type'] + char['Rarity']+ ' ' +char['Name'] + ' | ' + str(char['ID']) + ' | '+ str(char['UniqueID'])) + + + ###Update window elements + window.FindElement('CARDS').Update(values=cards_to_display) + window.FindElement('CARDS_CHOSEN').Update(values=chosen_cards_to_display) + window.FindElement('CATEGORIES').Update(values=categories_to_display) + window.FindElement('CATEGORIES_CHOSEN').Update(values=chosen_categories) + window.FindElement('LINKS').Update(values=links_to_display) + window.FindElement('LINKS_CHOSEN').Update(values=chosen_links) + + window.Close() + ###Send selected supporter to bandai + headers = { + 'User-Agent': 'Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', + 'Accept': '*/*', + 'Authorization': packet.mac('PUT', '/support_leaders'), + 'Content-type': 'application/json', + 'X-Platform': config.platform, + 'X-AssetVersion': '////', + 'X-DatabaseVersion': '////', + 'X-ClientVersion': '////', + } + if config.client == 'global': + url = 'https://ishin-global.aktsk.com/support_leaders' + else: + url = 'http://ishin-production.aktsk.jp/support_leaders' + #print(chosen_cards_unique_ids) + data = {'support_leader_ids':chosen_cards_unique_ids} + #print(data) + r = requests.put(url, data = json.dumps(data),headers = headers) + if 'error' in r.json(): + print(Fore.RED + Style.BRIGHT+str(r.json())) + else: + #print(r.json()) + print(chosen_cards_names) + print(Fore.GREEN + Style.BRIGHT+"Supporter updated!") + + +def lr_farm(): + + print('------------------------------------') + while True: + print(Fore.CYAN + Style.BRIGHT + 'Farm Lr,Tur,Ur Awakening Medals ') + print('---------------------------------') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'TEQ Super Saiyan God SS Vegito :' + Fore.YELLOW + Style.BRIGHT + ' 0') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Majin Vegeta :' + Fore.YELLOW + Style.BRIGHT + ' 1') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Lr Super Saiyan Goku & Super Saiyan Vegeta :' + Fore.YELLOW + Style.BRIGHT + ' 2') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Lr Full Power Boujack (Galactic Warrior) :' + Fore.YELLOW + Style.BRIGHT + ' 3') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Lr Cell (Perfect Form) & Cell Jr :' + Fore.YELLOW + Style.BRIGHT + ' 4') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Lr Trunks (Teen) (Future) & Mai (Future) :' + Fore.YELLOW + Style.BRIGHT + ' 5') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Lr Beerus & Whis :' + Fore.YELLOW + Style.BRIGHT + ' 6') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Lr Super Saiyan Gohan (Teen) & Super Saiyan Goten (Kid) :' + Fore.YELLOW + Style.BRIGHT + ' 7') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Lr Super Saiyan Goku (Angel) & Super Saiyan Vegeta (Angel) :' + Fore.YELLOW + Style.BRIGHT + ' 8') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Lr Trunks (Kid) & Goten (Kid) :' + Fore.YELLOW + Style.BRIGHT + ' 9') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Lr Super Saiyan 2 Gohan :' + Fore.YELLOW + Style.BRIGHT + ' 10') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Lr Super Saiyan 3 Goku :' + Fore.YELLOW + Style.BRIGHT + ' 11') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Lr Bardock :' + Fore.YELLOW + Style.BRIGHT + ' 12') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Lr Goku Black (Super Saiyan Rosé) & Zamasu :' + Fore.YELLOW + Style.BRIGHT + ' 13') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Lr Goku & Frieza (Final Form) (Angel):' + Fore.YELLOW + Style.BRIGHT + ' 14') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Lr Legendary Super Saiyan Broly :' + Fore.YELLOW + Style.BRIGHT + ' 15') + print('---------------------------------') + + command = input('Enter your choice: ') + if command == '0': + print(' ') + aa.ss() + break + elif command == '1': + print(' ') + Lrfarm.mv() + break + elif command == '2': + print(' ') + Lrfarm.gv() + break + elif command == '3': + print(' ') + Lrfarm.b() + break + elif command == '4': + print(' ') + Lrfarm.c() + break + elif command == '5': + print(' ') + Lrfarm.tm() + break + elif command == '6': + print(' ') + Lrfarm.bw() + break + elif command == '7': + print(' ') + Lrfarm.gg() + break + elif command == '8': + print(' ') + Lrfarm.vg() + break + elif command == '9': + print(' ') + Lrfarm.tg() + break + elif command == '10': + print(' ') + Lrfarm.gh() + break + elif command == '11': + print(' ') + Lrfarm.ggg() + break + elif command == '12': + print(' ') + Lrfarm.bd() + break + elif command == '13': + print(' ') + Lrfarm.gb() + break + elif command == '14': + print(' ') + Lrfarm.gf() + break + elif command == '15': + print(' ') + Lrfarm.by() + + +def ur_farm(): + + print('------------------------------------') + while True: + print(Fore.CYAN + Style.BRIGHT + 'Farm Tur,Ur Awakening Medals ') + print('---------------------------------') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'TEQ Super Saiyan God SS Vegito:' + Fore.YELLOW + Style.BRIGHT + ' 0') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'PHY Super Saiyan Broly :' + Fore.YELLOW + Style.BRIGHT + ' 1') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'STR Super Gogeta :' + Fore.YELLOW + Style.BRIGHT + ' 2') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'AGL Super Saiyan Gogeta :' + Fore.YELLOW + Style.BRIGHT + ' 3') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'INT SSJ3 Bardock:' + Fore.YELLOW + Style.BRIGHT + ' 4') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'STR SSJ4 Goku :' + Fore.YELLOW + Style.BRIGHT + ' 5') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'INT UI Goku :' + Fore.YELLOW + Style.BRIGHT + ' 6') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'AGL SSJ4 Vegeta) :' + Fore.YELLOW + Style.BRIGHT + ' 7') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'PHY FP Frieza :' + Fore.YELLOW + Style.BRIGHT + ' 8') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'TEQ Golden Frieza :' + Fore.YELLOW + Style.BRIGHT + ' 9') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'AGL SSJ3 Goku :' + Fore.YELLOW + Style.BRIGHT + ' 10') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'TEQ SSJ4 Gogeta :' + Fore.YELLOW + Style.BRIGHT + ' 11') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'INT Super Gogeta :' + Fore.YELLOW + Style.BRIGHT + ' 12') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'SSJ3 Gotenks :' + Fore.YELLOW + Style.BRIGHT + ' 13') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'TEQ FP SSJ4 Goku:' + Fore.YELLOW + Style.BRIGHT + ' 14') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'STR Jiren :' + Fore.YELLOW + Style.BRIGHT + ' 15') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'INT Golden Frieza:' + Fore.YELLOW + Style.BRIGHT + ' 16') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'PHY Android 17 :' + Fore.YELLOW + Style.BRIGHT + ' 17') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'TEQ Hit:' + Fore.YELLOW + Style.BRIGHT + ' 18') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'AGL SSBE Vegeta :' + Fore.YELLOW + Style.BRIGHT + ' 19') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'PHY Kid Buu:' + Fore.YELLOW + Style.BRIGHT + ' 20') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'INT Kid Buu:' + Fore.YELLOW + Style.BRIGHT + ' 21') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'TEQ SSJ3 Goku (Angel):' + Fore.YELLOW + Style.BRIGHT + ' 22') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'PHY Goku Black :' + Fore.YELLOW + Style.BRIGHT + ' 23') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'INT Goku Black:' + Fore.YELLOW + Style.BRIGHT + ' 24') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'TEQ SSG Goku:' + Fore.YELLOW + Style.BRIGHT + ' 25') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'STR SSG Vegeta' + Fore.YELLOW + Style.BRIGHT + ' 26') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'AGL SSGSS Goku :' + Fore.YELLOW + Style.BRIGHT + ' 27') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'STR Toppo:' + Fore.YELLOW + Style.BRIGHT + ' 28') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'STR Rose Goku Black' + Fore.YELLOW + Style.BRIGHT + ' 29') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'PHY SSGSS Vegito' + Fore.YELLOW + Style.BRIGHT + ' 30') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'STR SSJ3 Goku :' + Fore.YELLOW + Style.BRIGHT + ' 31') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'TEQ SSJ3 Broly' + Fore.YELLOW + Style.BRIGHT + ' 32') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'AGL Transgoku :' + Fore.YELLOW + Style.BRIGHT + ' 33') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'STR SSJ3 Vegeta:' + Fore.YELLOW + Style.BRIGHT + ' 34') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'PHY SSJ3 Gotenks' + Fore.YELLOW + Style.BRIGHT + ' 35') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'AGL Turles' + Fore.YELLOW + Style.BRIGHT + ' 36') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'STR Janemba :' + Fore.YELLOW + Style.BRIGHT + ' 37') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'INT Janemba:' + Fore.YELLOW + Style.BRIGHT + ' 38') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'TEQ TransFrieza' + Fore.YELLOW + Style.BRIGHT + ' 39') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'AGL Broly' + Fore.YELLOW + Style.BRIGHT + ' 40') + print('---------------------------------') + print('---------------------------------') + + command = input('Enter your choice: ') + if command == '0': + print(' ') + aa.ss() + break + elif command == '1': + print(' ') + aa.sss() + break + elif command == '2': + print(' ') + aa.ssss() + break + elif command == '3': + print(' ') + aa.s() + break + elif command == '4': + print(' ') + aa.a() + break + elif command == '5': + print(' ') + aa.aa() + break + elif command == '6': + print(' ') + aa.aaa() + break + elif command == '7': + print(' ') + aa.aaaa() + break + elif command == '8': + print(' ') + aa.b() + break + elif command == '9': + print(' ') + aa.bb() + break + elif command == '10': + print(' ') + aa.bbb() + break + elif command == '11': + print(' ') + aa.bbbb() + break + elif command == '12': + print(' ') + aa.c() + break + elif command == '13': + print(' ') + aa.cc() + break + elif command == '14': + print(' ') + aa.ccc() + break + elif command == '15': + print(' ') + aa.cccc() + break + elif command == '16': + print(' ') + aa.d() + break + elif command == '17': + print(' ') + aa.dd() + break + elif command == '18': + print(' ') + aa.ddd() + break + elif command == '19': + print(' ') + aa.dddd() + break + elif command == '20': + print(' ') + aa.e() + break + elif command == '21': + print(' ') + aa.ee() + break + elif command == '22': + print(' ') + aa.eee() + break + elif command == '23': + print(' ') + aa.eeee() + break + elif command == '24': + print(' ') + aa.f() + break + elif command == '25': + print(' ') + aa.ff() + break + elif command == '26': + print(' ') + aa.ffx() + break + elif command == '27': + print(' ') + aa.fff() + break + elif command == '28': + print(' ') + aa.ffff() + break + elif command == '29': + print(' ') + aa.g() + break + elif command == '30': + print(' ') + aa.gg() + break + elif command == '31': + print(' ') + aa.ggg() + break + elif command == '32': + print(' ') + aa.gggx() + break + elif command == '33': + print(' ') + aa.gggg() + break + elif command == '34': + print(' ') + aa.h() + break + elif command == '35': + print(' ') + aa.hh() + break + elif command == '36': + print(' ') + aa.hhh() + break + elif command == '37': + print(' ') + aa.hhhh() + break + elif command == '38': + print(' ') + aa.j() + break + elif command == '39': + print(' ') + aa.jj() + break + elif command == '40': + print(' ') + aa.jjj() + break + + + +discordurl = 'https://discord.gg/GFExDwX' + +def TF(): + + print('------------------------------------') + while True: + print(Fore.CYAN + Style.BRIGHT + 'Farm Tresures ') + print('---------------------------------') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Gems:' + Fore.YELLOW + Style.BRIGHT + ' 0') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Metal Fruit:' + Fore.YELLOW + Style.BRIGHT + ' 1') + print('---------------------------------') + print(Fore.CYAN + Style.BRIGHT + 'Hercule Badges:' + Fore.YELLOW + Style.BRIGHT + ' 2') + print('---------------------------------') + + command = input('Enter your choice: ') + if command == '0': + print(' ') + gems() + break + if command == '1': + print(' ') + metal() + break + if command == '2': + print(' ') + hercule() + break + +def gems(): + stage = input('What stage would you like to complete?(23007): ') + difficulty = input('Enter the difficulty|(3): ') + loop = input('Enter how many times to execute(39): ') + for i in range(int(loop)): + complete_stage(stage, difficulty) + + +def metal(): + stage = input('What stage would you like to complete?(32207): ') + difficulty = input('Enter the difficulty|(2): ') + loop = input('Enter how many times to execute(39): ') + for i in range(int(loop)): + complete_stage(stage, difficulty) + +def hercule(): + stage = input('What stage would you like to complete?(32410): ') + difficulty = input('Enter the difficulty|(2): ') + loop = input('Enter how many times to execute(39): ') + for i in range(int(loop)): + complete_stage(stage, difficulty) diff --git a/config.py b/config.py new file mode 100644 index 0000000..29596aa --- /dev/null +++ b/config.py @@ -0,0 +1,121 @@ +from orator import DatabaseManager, Model + +AdId = None +UniqueId = None +identifier = None +access_token = None +secret = None +client = 'japan' +platform = 'android' + +deck = 1 +allow_stamina_refill = True + + +### Database Config +jp_config = {'mysql': {'driver': 'sqlite', 'database': 'jp.db'}} +glb_config = {'mysql': {'driver': 'sqlite', 'database': 'glb.db'}} +db_glb = DatabaseManager(glb_config) +db_jp = DatabaseManager(jp_config) +Model.set_connection_resolver(db_glb) + +class LeaderSkills(Model): + + __table__ = 'leader_skills' + +class LinkSkills(Model): + + __table__ = 'link_skills' + +class AreaTabs(Model): + + __table__ = 'area_tabs' + +class CardSpecials(Model): + + __table__ = 'card_specials' + +class Passives(Model): + + __table__ = 'passive_skill_sets' + +class Supers(Model): + + __table__ = 'specials' + +class ZBattles(Model): + + __table__ = 'z_battle_stage_views' + +class CardCategories(Model): + + __table__ = 'card_categories' + +class CardCardCategories(Model): + + __table__ = 'card_card_categories' + +class TreasureItems(Model): + + __table__ = 'treasure_items' + + +class AwakeningItems(Model): + + __table__ = 'awakening_items' + + +class SupportItems(Model): + + __table__ = 'support_items' + + +class PotentialItems(Model): + + __table__ = 'potential_items' + +class SpecialItems(Model): + + __table__ = 'special_items' + + +class TrainingItems(Model): + + __table__ = 'training_items' + + +class Cards(Model): + + __table__ = 'cards' + + +class Quests(Model): + + __table__ = 'quests' + +class Ranks(Model): + + __table__ = 'rank_statuses' + + +class TrainingFields(Model): + + __table__ = 'training_fields' + + +class Sugoroku(Model): + + __table__ = 'sugoroku_maps' + + +class Area(Model): + + __table__ = 'areas' + + +class Medal(Model): + + __table__ = 'awakening_items' + + + diff --git a/decrypt.py b/decrypt.py new file mode 100644 index 0000000..96236d3 --- /dev/null +++ b/decrypt.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Module : decrypt.py +# Author : bssthu +# Project : pysqlsimplecipher +# Creation date : 2016-06-03 +# Description : +# + + +import sys +from pysqlsimplecipher import decryptor + + +def usage(): + print('Usage: python decrypt.py encrypted.db password output.db') + + +def main(): + # arguments + argv = sys.argv + if len(argv) != 4: + usage() + return + filename_in = argv[1] + password = bytearray(argv[2].encode('utf8')) + filename_out = argv[3] + + decryptor.decrypt_file(filename_in, password, filename_out) + + +if __name__ == '__main__': + main() diff --git a/decryptor.py b/decryptor.py new file mode 100644 index 0000000..89ac460 --- /dev/null +++ b/decryptor.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Module : decrypt.py +# Author : bssthu +# Project : pysqlsimplecipher +# Creation date : 2016-06-03 +# Description : +# + + +import sys +from pysqlsimplecipher import decryptor + + +def usage(): + print('Usage: python decrypt.py encrypted.db password output.db') + + +def main(p = '9bf9c6ed9d537c399a6c4513e92ab24717e1a488381e3338593abd923fc8a13b'): + + password = bytearray(p.encode('utf8')) + if p == '9bf9c6ed9d537c399a6c4513e92ab24717e1a488381e3338593abd923fc8a13b': + filename_in = 'dataenc_glb.db' + filename_out = 'glb.db' + else: + filename_in = 'dataenc_jp.db' + filename_out = 'jp.db' + + decryptor.decrypt_file(filename_in, password, filename_out) + + +if __name__ == '__main__': + main() diff --git a/encrypt.py b/encrypt.py new file mode 100644 index 0000000..a43a7e2 --- /dev/null +++ b/encrypt.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Module : encrypt.py +# Author : bssthu +# Project : pysqlsimplecipher +# Creation date : 2016-06-03 +# Description : +# + + +import sys +from pysqlsimplecipher import encryptor + + +def usage(): + print('Usage: python encrypt.py plain.db password output.db') + + +def main(): + # arguments + argv = sys.argv + if len(argv) != 4: + usage() + return + filename_in = argv[1] + password = bytearray(argv[2].encode('utf8')) + filename_out = argv[3] + + encryptor.encrypt_file(filename_in, password, filename_out) + + +if __name__ == '__main__': + main() diff --git a/extra.py b/extra.py new file mode 100644 index 0000000..c9e0cc0 --- /dev/null +++ b/extra.py @@ -0,0 +1,188 @@ +import commands +from colorama import init, Fore, Back, Style +# Coloroma autoreset +init(autoreset=True) + + +def sbr_new(): + + print('---------------------------------') + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Universe Survival Sagaa Category Team') + + commands.change_team() + + commands.complete_stage('710021', 5) + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Super Saiyan 3" Category Team') + + commands.change_team() + + commands.complete_stage('710022', 5) + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Giant Form Category Team') + + commands.change_team() + + commands.complete_stage('710023', 5) + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Transformation Boost Category Team') + + commands.change_team() + + commands.complete_stage('710024', 5) + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Ginyu Force Category Team') + + commands.change_team() + + commands.complete_stage('710025', 5) + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Movie Bosses Category Team') + + commands.change_team() + + commands.complete_stage('710026', 5) + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Pure Saiyans Category Team') + + commands.change_team() + + commands.complete_stage('710027', 5) + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Future Saga Category Team') + + commands.change_team() + + commands.complete_stage('710028', 5) + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Full Power Category Team') + + commands.change_team() + + commands.complete_stage('710029', 5) + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Androids Category Team') + + commands.change_team() + + commands.complete_stage('710030', 5) + + +def sbr_next(): + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Super Class Team') + + commands.change_team() + + commands.complete_stage('710011', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Extreme Class Team') + + commands.change_team() + + commands.complete_stage('710012', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Fusion Category Team') + + commands.change_team() + + commands.complete_stage('710013', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Shadow Dragons Category Team') + + commands.change_team() + + commands.complete_stage('710014', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Peppy Gals Category Team') + + commands.change_team() + + commands.complete_stage('710015', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Hybrid Saiyans Category Team') + + commands.change_team() + + commands.complete_stage('710016', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Resurrected Warriors Category Team') + + commands.change_team() + + commands.complete_stage('710017', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Realm of Gods Category Team') + + commands.change_team() + + commands.complete_stage('710018', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Majin Buu Saga Category Team') + + commands.change_team() + + commands.complete_stage('710019', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Potara Category Team') + + commands.change_team() + + commands.complete_stage('710020', 5) + + print('---------------------------------') + + +def complete_sbr(): + print('------------------------------------') + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Super TEQ Team') + + commands.change_team() + + commands.complete_stage('710001', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Extreme TEQ Team') + + commands.change_team() + + commands.complete_stage('710002', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Super INT Team') + + commands.change_team() + + commands.complete_stage('710003', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Extreme INT Team') + + commands.change_team() + + commands.complete_stage('710004', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Super PHY Team') + + commands.complete_stage('710005', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Extreme PHY Team') + + commands.change_team() + + commands.complete_stage('710006', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Super AGL Team') + + commands.change_team() + + commands.complete_stage('710007', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Extreme AGL Team') + + commands.change_team() + + commands.complete_stage('710008', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Super STR Team') + + commands.change_team() + + commands.complete_stage('710009', 5) + + print(Fore.YELLOW + Style.BRIGHT + 'Clear with Extreme STR Team') + + commands.change_team() + + commands.complete_stage('710010', 5) + + +print('---------------------------------') + diff --git a/help.txt b/help.txt new file mode 100644 index 0000000..d906c6d --- /dev/null +++ b/help.txt @@ -0,0 +1,2 @@ +1570518409 +1569982484 diff --git a/packet.py b/packet.py new file mode 100644 index 0000000..9bf6a76 --- /dev/null +++ b/packet.py @@ -0,0 +1,139 @@ +### packet.py contains functions critical to sending requests to the server + +import base64 +import binascii +import config +from Crypto.Cipher import AES +import hashlib +import hmac +import json +import os +import time +import uuid + +# Padding for the input string --not +# related to encryption itself. + +BLOCK_SIZE = 16 # Bytes +pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * chr(BLOCK_SIZE + - len(s) % BLOCK_SIZE) +unpad = lambda s: s[:-ord(s[len(s) - 1:])] + +#################################################################### + +def guid(): + + # Generates UniqueID & AdIDcompatible with Bandais servers + # Returns dict + + UUID = str(uuid.uuid4()) + UniqueId = str(uuid.uuid4()) + ':' + UUID[0:8] + return dict(AdId=str(uuid.uuid4()), UniqueId=UniqueId) + +#################################################################### + +def mac(method,action): + + # Creates Mac Authentication header string used when sending requests + # returns string + + ts = str(int(round(time.time(), 0))) + nonce = ts + ':' + config.AdId + if config.client == 'global': + value = ts + '\n' + nonce + '\n' + method + '\n' + action + '\n' \ + + 'ishin-global.aktsk.com' + '\n' + '3001' + ''' + +''' + else: + value = ts + '\n' + nonce + '\n' + method + '\n' + action + '\n' \ + + 'ishin-production.aktsk.jp' + '\n' + '3001' + ''' + +''' + + + hmac_hex_bin = hmac.new(config.secret.encode('utf-8'), value.encode('utf-8' + ), hashlib.sha256).digest() + mac = base64.b64encode(hmac_hex_bin).decode() + final = 'MAC ' + 'id=' + '"' + config.access_token + '"' + ' nonce=' + '"' \ + + nonce + '"' + ' ts=' + '"' + ts + '"' + ' mac=' + '"' + mac \ + + '"' + return final + +#################################################################### +# ================================================================ +# get_key_and_iv +# ================================================================ + +def get_key_and_iv( + password, + salt, + klen=32, + ilen=16, + msgdgst='md5', + ): + ''' + Derive the key and the IV from the given password and salt. + + This is a niftier implementation than my direct transliteration of + the C++ code although I modified to support different digests. + + CITATION: http://stackoverflow.com/questions/13907841/implement-openssl-aes-encryption-in-python + + @param password The password to use as the seed. + @param salt The salt. + @param klen The key length. + @param ilen The initialization vector length. + @param msgdgst The message digest algorithm to use. + ''' + + # equivalent to: + # from hashlib import as mdf + # from hashlib import md5 as mdf + # from hashlib import sha512 as mdf + + mdf = getattr(__import__('hashlib', fromlist=[msgdgst]), msgdgst) + password = password.encode('ascii', 'ignore') # convert to ASCII + + try: + maxlen = klen + ilen + keyiv = mdf(password + salt).digest() + tmp = [keyiv] + while len(tmp) < maxlen: + tmp.append(mdf(tmp[-1] + password + salt).digest()) + keyiv += tmp[-1] # append the last byte + key = keyiv[:klen] + iv = keyiv[klen:klen + ilen] + return (key, iv) + except UnicodeDecodeError: + return (None, None) + + +#################################################################### +def encrypt_sign(data): + data = pad(data) + key1 = str.encode(data) + password = \ + 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzJ9JaHioVi6rr0TAfr6j' + salt = os.urandom(8) + (key, iv) = get_key_and_iv(password, salt, klen=32, ilen=16, + msgdgst='md5') + cipher = AES.new(key, AES.MODE_CBC, iv) + a = cipher.encrypt(key1) + a = salt + a + return base64.b64encode(a).decode() + + +#################################################################### +def decrypt_sign(sign): + buffer = base64.b64decode(sign) + buffer_encoded = base64.b64encode(buffer) + password = \ + 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzJ9JaHioVi6rr0TAfr6j' + salt = buffer[0:8] + (key, iv) = get_key_and_iv(password, salt, klen=32, ilen=16, + msgdgst='md5') + data = buffer[8:len(buffer)] + cipher = AES.new(key, AES.MODE_CBC, iv) + a = unpad(cipher.decrypt(data)).decode('utf8') + return json.loads(a) +#################################################################### diff --git a/pysqlsimplecipher/__init__.py b/pysqlsimplecipher/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pysqlsimplecipher/config.py b/pysqlsimplecipher/config.py new file mode 100644 index 0000000..ace3f5e --- /dev/null +++ b/pysqlsimplecipher/config.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Module : config.py +# Author : bssthu +# Project : pysqlsimplecipher +# Creation date : 2016-06-03 +# Description : +# + + +salt_mask = 0x3a +key_sz = 32 +key_iter = 64000 +hmac_key_sz = 32 +hmac_key_iter = 2 +page_sz = 1024 +iv_sz = 16 +reserve_sz = 48 +hmac_sz = 20 diff --git a/pysqlsimplecipher/decryptor.py b/pysqlsimplecipher/decryptor.py new file mode 100644 index 0000000..f3216d9 --- /dev/null +++ b/pysqlsimplecipher/decryptor.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Module : decryptor.py +# Author : bssthu +# Project : pysqlsimplecipher +# Creation date : 2016-06-03 +# Description : +# + + +from pysqlsimplecipher import config +from pysqlsimplecipher import util + + +def decrypt_file(filename_in, password, filename_out): + if not isinstance(filename_in, str): + raise RuntimeError('filename_in must be a str.') + if not isinstance(password, bytearray): + raise RuntimeError('password must be a bytearray.') + if not isinstance(filename_out, str): + raise RuntimeError('filename_out must be a str.') + + # read + with open(filename_in, 'rb') as fp: + raw = fp.read() + + # decrypt + dec = decrypt_default(raw, password) + + # write + with open(filename_out, 'wb') as fp: + fp.write(dec) + + +def decrypt_default(raw, password): + # configs + salt_mask = config.salt_mask + key_sz = config.key_sz + key_iter = config.key_iter + hmac_key_sz = config.hmac_key_sz + hmac_key_iter = config.hmac_key_iter + page_sz = config.page_sz + iv_sz = config.iv_sz + reserve_sz = config.reserve_sz + hmac_sz = config.hmac_sz + + return decrypt(raw, password, salt_mask, key_sz, key_iter, hmac_key_sz, hmac_key_iter, page_sz, iv_sz, reserve_sz, hmac_sz) + + +def decrypt(raw, password, salt_mask, key_sz, key_iter, hmac_key_sz, hmac_key_iter, page_sz, iv_sz, reserve_sz, hmac_sz): + dec = b'SQLite format 3\0' + + # derive key + salt_sz = 16 + salt = raw[:salt_sz] + key, hmac_key = util.key_derive(salt, password, salt_mask, key_sz, key_iter, hmac_key_sz, hmac_key_iter) + + # decrypt file header, try with default page size + page_sz, reserve_sz = decrypt_page_header(raw, key, salt_sz, page_sz, iv_sz, reserve_sz) + if page_sz < 0 or reserve_sz < 0: + raise RuntimeError('failed to decide page size or reserve size.') + + # decrypt pages + for i in range(0, int(len(raw) / 1024)): + page = util.get_page(raw, page_sz, i + 1) + if i == 0: + # skip salt + page = page[salt_sz:] + page_content = page[:-reserve_sz] + reserve = page[-reserve_sz:] + iv = reserve[:iv_sz] + # check hmac + hmac_old = reserve[iv_sz:iv_sz+hmac_sz] + hmac_new = util.generate_hmac(hmac_key, page_content + iv, i + 1) + if not hmac_old == hmac_new: + raise RuntimeError('hmac check failed in page %d.' % (i+1)) + # decrypt content + page_dec = util.decrypt(page_content, key, iv) + dec += page_dec + util.random_bytes(reserve_sz) + + return dec + + +def decrypt_page_header(raw, key, salt_sz, page_sz, iv_sz, reserve_sz): + """Try to decrypt first page with default config. + + If default page size fail, change page size. + When succeed, return page_sz, reserve_sz. + If fail, return -1, -1. + """ + + if not util.is_valid_page_size(page_sz): + page_sz = 512 + + new_reserve_sz = try_get_reserve_size_for_specified_page_size(raw, key, salt_sz, page_sz, iv_sz, reserve_sz) + if new_reserve_sz > 0: # default page_sz is ok + return page_sz, new_reserve_sz + + page_sz = 512 + while page_sz <= 65536: + new_reserve_sz = try_get_reserve_size_for_specified_page_size(raw, key, salt_sz, page_sz, iv_sz, reserve_sz) + if new_reserve_sz > 0: + return page_sz, new_reserve_sz + page_sz <<= 1 + + return -1, -1 # fail + + +def try_get_reserve_size_for_specified_page_size(raw, key, salt_sz, page_sz, iv_sz, reserve_sz): + """Try to decrypt first page with specified page size. + + If default reserve size fail, change reserve size. + When succeed, return reserve size. + If always fail, return -1. + """ + + first_page_content = util.get_page(raw, page_sz, 1)[salt_sz:] + + if reserve_sz >= iv_sz: + first_page_dec = decrypt_by_reserve_size(first_page_content, key, iv_sz, reserve_sz) + # default reserve_sz is ok + if util.is_valid_decrypted_header(first_page_dec) \ + and page_sz == util.get_page_size_from_database_header(raw[:salt_sz] + first_page_dec) \ + and reserve_sz == util.get_reserved_size_from_database_header(raw[:salt_sz] + first_page_dec): + return reserve_sz + + # try every possible reserve size. + # the usable size of a page is at least 480. + for reserve_sz in range(iv_sz, page_sz - 480): + first_page_dec = decrypt_by_reserve_size(first_page_content, key, iv_sz, reserve_sz) + if util.is_valid_decrypted_header(first_page_dec) \ + and page_sz == util.get_page_size_from_database_header(raw[:salt_sz] + first_page_dec) \ + and reserve_sz == util.get_reserved_size_from_database_header(raw[:salt_sz] + first_page_dec): + return reserve_sz + + return -1 # fail + + +def decrypt_by_reserve_size(first_page_without_salt, key, iv_sz, reserve_sz): + """Decrypt page content using specified reserve size""" + reserve = first_page_without_salt[-reserve_sz:] + iv = reserve[:iv_sz] + return util.decrypt(first_page_without_salt, key, iv) diff --git a/pysqlsimplecipher/encryptor.py b/pysqlsimplecipher/encryptor.py new file mode 100644 index 0000000..ef86956 --- /dev/null +++ b/pysqlsimplecipher/encryptor.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Module : encryptor.py +# Author : bssthu +# Project : pysqlsimplecipher +# Creation date : 2016-06-03 +# Description : +# + + +import hashlib +import hmac +from pysqlsimplecipher import config +from pysqlsimplecipher import util + + +def check_database_header(header): + if not util.is_valid_database_header(header): + raise RuntimeError('invalid database header.') + + page_sz = util.get_page_size_from_database_header(header) + if not util.is_valid_page_size(page_sz): + raise RuntimeError('invalid page size %d.' % page_sz) + + reserve_sz = util.get_reserved_size_from_database_header(header) + if reserve_sz == 0: + raise RuntimeError('needs reserved space at the end of each page.') + + return page_sz, reserve_sz + + +def encrypt_file(filename_in, password, filename_out): + if not isinstance(filename_in, str): + raise RuntimeError('filename_in must be a str.') + if not isinstance(password, bytearray): + raise RuntimeError('password must be a bytearray.') + if not isinstance(filename_out, str): + raise RuntimeError('filename_out must be a str.') + + # read + with open(filename_in, 'rb') as fp: + raw = fp.read() + + # check header + page_sz, reserve_sz = check_database_header(raw[:100]) + + # encrypt + dec = encrypt_default(raw, password, page_sz, reserve_sz) + + # write + with open(filename_out, 'wb') as fp: + fp.write(dec) + + +def encrypt_default(raw, password, page_sz, reserve_sz): + # configs + salt_mask = config.salt_mask + key_sz = config.key_sz + key_iter = config.key_iter + hmac_key_sz = config.hmac_key_sz + hmac_key_iter = config.hmac_key_iter + iv_sz = config.iv_sz + hmac_sz = config.hmac_sz + + if reserve_sz < iv_sz + hmac_sz: + raise RuntimeError('reserved space at the end of each page is %d, needs %d.' % (reserve_sz, iv_sz + hmac_sz)) + + return encrypt(raw, password, salt_mask, key_sz, key_iter, hmac_key_sz, hmac_key_iter, page_sz, iv_sz, reserve_sz, hmac_sz) + + +def encrypt(raw, password, salt_mask, key_sz, key_iter, hmac_key_sz, hmac_key_iter, page_sz, iv_sz, reserve_sz, hmac_sz): + salt_sz = 16 + salt = util.random_bytes(salt_sz) + enc = salt + + # derive key + key, hmac_key = util.key_derive(salt, password, salt_mask, key_sz, key_iter, hmac_key_sz, hmac_key_iter) + + # encrypt pages + for i in range(0, int(len(raw) / 1024)): + page = util.get_page(raw, page_sz, i + 1) + if i == 0: + # skip header string + page = page[salt_sz:] + page_content = page[:-reserve_sz] + iv = util.random_bytes(iv_sz) + # encrypt content + page_enc = util.encrypt(page_content, key, iv) + # generate hmac + hmac_new = util.generate_hmac(hmac_key, page_enc + iv, i + 1) + enc += page_enc + iv + hmac_new + if reserve_sz > iv_sz + hmac_sz: + enc += util.random_bytes(reserve_sz - iv_sz - hmac_sz) + + return enc diff --git a/pysqlsimplecipher/util.py b/pysqlsimplecipher/util.py new file mode 100644 index 0000000..396bc49 --- /dev/null +++ b/pysqlsimplecipher/util.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Module : util.py +# Author : bssthu +# Project : pysqlsimplecipher +# Creation date : 2016-06-03 +# Description : +# + + +import os +import math +import hashlib +import hmac +import struct +from Crypto.Cipher import AES + + +def encrypt(raw, key, iv): + cipher = AES.new(key, AES.MODE_CBC, iv) + return cipher.encrypt(raw) + + +def decrypt(raw, key, iv): + cipher = AES.new(key, AES.MODE_CBC, iv) + return cipher.decrypt(raw) + + +def is_valid_database_header(header): + return header[:16] == b'SQLite format 3\0' and is_valid_decrypted_header(header[16:]) + + +def is_valid_decrypted_header(header): + # skip first 16 bytes + if type(header) is str: # python2 + header = [ord(x) for x in header] + return header[21-16] == 64 and header[22-16] == 32 and header[23-16] == 32 + + +def get_page_size_from_database_header(header): + if type(header) is str: # python2 + page_sz = 256 * ord(header[16]) + ord(header[17]) + else: + page_sz = int.from_bytes(header[16:18], 'big') + if page_sz == 1: # since SQLite version 3.7.1 + page_sz = 65536 + return page_sz + + +def get_reserved_size_from_database_header(header): + if type(header) is str: # python2 + return ord(header[20]) + else: + return int(header[20]) + + +def is_valid_page_size(page_sz): + # page_sz must be power of 2, and greater than 512 + return page_sz >= 512 and page_sz == 2 ** int(math.log(page_sz, 2)) + + +def get_page(raw, page_sz, page_no): + return raw[page_sz*(page_no-1):page_sz*page_no] + + +def random_bytes(n): + return os.urandom(n) + + +def key_derive(salt, password, salt_mask, key_sz, key_iter, hmac_key_sz, hmac_key_iter): + """Derive an encryption key for page encryption/decryption, an key for hmac generation""" + key = hashlib.pbkdf2_hmac('sha1', password, salt, key_iter, key_sz) + + try: + hmac_salt = bytearray([x ^ salt_mask for x in salt]) + hmac_key = hashlib.pbkdf2_hmac('sha1', key, hmac_salt, hmac_key_iter, hmac_key_sz) + except TypeError: # python2 + hmac_salt = b'' + for x in salt: + hmac_salt += chr(ord(x) ^ salt_mask) + hmac_key = hashlib.pbkdf2_hmac('sha1', str(key), hmac_salt, hmac_key_iter, hmac_key_sz) + return key, hmac_key + + +def generate_hmac(hmac_key, content, page_no): + hmac_obj = hmac.new(hmac_key, content, hashlib.sha1) + hmac_obj.update(struct.pack('