So, there are two things. First one is that I've updated bot on my own. You can use it by using dokkan.py, but there's also BotZone build (2.7..3) which works good too. Just so you know - I DID NOT DO the BotZone one.
6409 lines
254 KiB
Python
6409 lines
254 KiB
Python
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)
|