|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
import sys
|
|
|
import pip
|
|
|
import webbrowser
|
|
|
import os
|
|
|
import time
|
|
|
import platform
|
|
|
import subprocess
|
|
|
from pathlib import Path
|
|
|
|
|
|
import libinstaller
|
|
|
|
|
|
from functions import *
|
|
|
|
|
|
appendLog('main.py start initialized', startup=True)
|
|
|
|
|
|
setTitle("", getOS())
|
|
|
|
|
|
from daemon import main
|
|
|
import settings
|
|
|
import editor
|
|
|
import rpc
|
|
|
|
|
|
if getConfig("use_colors"):
|
|
|
from colors import *
|
|
|
else:
|
|
|
RESET = ''
|
|
|
BLACK = RED = GREEN = YELLOW = BLUE = MAGENTA = CYAN = WHITE = ''
|
|
|
BBLACK = BRED = BGREEN = BYELLOW = BBLUE = BMAGENTA = BCYAN = BWHITE = ''
|
|
|
ULINE = REVERSE = ''
|
|
|
|
|
|
import wget
|
|
|
import requests
|
|
|
import keyboard
|
|
|
import getpass
|
|
|
from zipfile import ZipFile
|
|
|
|
|
|
version = 2.6
|
|
|
path = Path(__file__).resolve().parent
|
|
|
|
|
|
def mainMenu():
|
|
|
try:
|
|
|
setTitle("AutoZoom (Главная)", getOS())
|
|
|
|
|
|
global version
|
|
|
global path
|
|
|
|
|
|
appendLog('Main menu opened')
|
|
|
rpc.inMenu()
|
|
|
|
|
|
while True:
|
|
|
if getConfig("update_check"):
|
|
|
print(f'{RESET}Загрузка данных о последней версии...')
|
|
|
|
|
|
try:
|
|
|
setTitle("Загрузка данных...", getOS())
|
|
|
serv_ver = requests.get("https://www.end-play.xyz/AutoZoomVersion.txt").text
|
|
|
setTitle("AutoZoom (Главная)", getOS())
|
|
|
ignore = False
|
|
|
clear()
|
|
|
|
|
|
except Exception as exp:
|
|
|
appendLog(f'Version number load failed {exp}')
|
|
|
setTitle("Ошибка загрузки данных", getOS())
|
|
|
print(f'Не удалось загрузить данные о последней версии.\nПроверьте подключение к сети и повторите попытку.\n\nСтатус сервера центра обновлений:\n{BRED}https://stats.uptimerobot.com/OqwR9iAqBg{RESET}')
|
|
|
|
|
|
todo = input(f'\nВведите {BRED}ignore {RESET}чтобы выключить проверку обновлений и продолжить\nлибо введите что угодно иное чтобы закрыть программу.\n\n > {BRED}')
|
|
|
|
|
|
if todo.lower() == 'ignore':
|
|
|
setConfig("update_check", False)
|
|
|
serv_ver = ''
|
|
|
appendLog('Skipping update check')
|
|
|
setTitle("AutoZoom (Главная)", getOS())
|
|
|
ignore = True
|
|
|
clear()
|
|
|
else:
|
|
|
rpc.disconnect()
|
|
|
sys.exit()
|
|
|
|
|
|
if ignore == False and float(serv_ver) > float(version):
|
|
|
show_version = f' ({BRED}!{RESET})'
|
|
|
else:
|
|
|
show_version = ''
|
|
|
|
|
|
else:
|
|
|
show_version = f' ({BRED}!{RESET})'
|
|
|
setTitle("AutoZoom (Главная)", getOS())
|
|
|
serv_ver = 'disabled'
|
|
|
appendLog('Skipping update check')
|
|
|
clear()
|
|
|
|
|
|
print(f'{BBLACK}»{RESET} Главное меню\n')
|
|
|
print(f' {BRED}1.{RESET} Запуск')
|
|
|
print(f' {BRED}2.{RESET} Редактор')
|
|
|
print(f' {BRED}3.{RESET} Настройки')
|
|
|
print(f' {BRED}4.{RESET} Обновление{show_version}')
|
|
|
print(f' {BRED}5.{RESET} Помощь и связь')
|
|
|
print(f' {BRED}6.{RESET} Закрыть приложение')
|
|
|
|
|
|
if getConfig("debug"):
|
|
|
print(f' {BRED}10.{RESET} Меню разработчика')
|
|
|
|
|
|
menu_choose = input(f'\n {RESET}> {BRED}')
|
|
|
print(RESET)
|
|
|
|
|
|
if menu_choose == '1':
|
|
|
appendLog('Went to daemon')
|
|
|
main('menu')
|
|
|
elif menu_choose == '2':
|
|
|
appendLog('Went to editor')
|
|
|
rpc.inEditor()
|
|
|
editor.editor()
|
|
|
elif menu_choose == '3':
|
|
|
appendLog('Went to settings')
|
|
|
rpc.inSettings()
|
|
|
settings.settings()
|
|
|
elif menu_choose == '4':
|
|
|
appendLog('Went to updater')
|
|
|
rpc.inUpdater()
|
|
|
updater(serv_ver, version)
|
|
|
elif menu_choose == '5':
|
|
|
appendLog('Went to help')
|
|
|
rpc.inHelp()
|
|
|
helpMenu()
|
|
|
elif menu_choose == '6':
|
|
|
appendLog('Exited AutoZoom from main menu', shutdown=True)
|
|
|
rpc.disconnect()
|
|
|
clear()
|
|
|
sys.exit()
|
|
|
elif menu_choose == '10':
|
|
|
if getConfig("debug"):
|
|
|
appendLog('Went to help')
|
|
|
rpc.inDebug()
|
|
|
devMenu()
|
|
|
else:
|
|
|
clear()
|
|
|
else:
|
|
|
clear()
|
|
|
continue
|
|
|
except KeyboardInterrupt:
|
|
|
rpc.disconnect()
|
|
|
clear()
|
|
|
print(f'Закрываем приложение {BGREEN}AutoZoom{RESET}...')
|
|
|
sys.exit()
|
|
|
|
|
|
def os_arch():
|
|
|
is_64bits = sys.maxsize > 2**32
|
|
|
|
|
|
if is_64bits:
|
|
|
return '64bit'
|
|
|
else:
|
|
|
return '32bit'
|
|
|
|
|
|
def helpMenu():
|
|
|
try:
|
|
|
while True:
|
|
|
setTitle("AutoZoom (Помощь)", getOS())
|
|
|
appendLog('Help menu opened')
|
|
|
clear()
|
|
|
global version
|
|
|
global path
|
|
|
|
|
|
print(f'{BBLACK}»{RESET} Меню помощи\n')
|
|
|
print(f' {BRED}1.{RESET} Документация')
|
|
|
print(f' {BRED}2.{RESET} Сайт проекта')
|
|
|
print(f' {BRED}3.{RESET} Центр поддержки')
|
|
|
print(f' {BRED}4.{RESET} Telegram проекта')
|
|
|
print(f' {BRED}5.{RESET} Связаться с автором')
|
|
|
print(f' {BRED}6.{RESET} Поддержать проект')
|
|
|
print(f' {BRED}7.{RESET} Список поддержавших')
|
|
|
print(f' {BRED}8.{RESET} Сводка информации')
|
|
|
print(f' {BRED}9.{RESET} В главное меню')
|
|
|
|
|
|
help_choose = input(f'\n > {BRED}')
|
|
|
|
|
|
if help_choose == '1':
|
|
|
try:
|
|
|
clear()
|
|
|
appendLog('Opened AutoZoom wiki')
|
|
|
webbrowser.open("https://github.com/profitrollgame/autozoom/wiki")
|
|
|
except Exception as exp:
|
|
|
clear()
|
|
|
appendLog(f'Failed to open AutoZoom wiki: {exp}')
|
|
|
none = input(f'{RESET}Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: {BRED}https://github.com/profitrollgame/autozoom/wiki{RESET}\n\n > ')
|
|
|
clear()
|
|
|
elif help_choose == '2':
|
|
|
try:
|
|
|
clear()
|
|
|
appendLog('Opened AutoZoom website')
|
|
|
webbrowser.open("https://www.end-play.xyz/autozoom")
|
|
|
except Exception as exp:
|
|
|
clear()
|
|
|
appendLog(f'Failed to open AutoZoom website: {exp}')
|
|
|
none = input(f'{RESET}Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: {BRED}https://www.end-play.xyz/autozoom{RESET}\n\n > ')
|
|
|
clear()
|
|
|
elif help_choose == '3':
|
|
|
try:
|
|
|
clear()
|
|
|
appendLog('Opened AutoZoom support center')
|
|
|
webbrowser.open("https://www.tidio.com/talk/ydqcvfvgkud3jjk2482uaesvjpeohlh3")
|
|
|
except Exception as exp:
|
|
|
clear()
|
|
|
appendLog(f'Failed to open AutoZoom support center: {exp}')
|
|
|
none = input(f'{RESET}Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: {BRED}https://www.tidio.com/talk/ydqcvfvgkud3jjk2482uaesvjpeohlh3{RESET}\n\n > ')
|
|
|
clear()
|
|
|
elif help_choose == '4':
|
|
|
try:
|
|
|
clear()
|
|
|
appendLog('Opened AutoZoom Telegram group')
|
|
|
webbrowser.open("https://t.me/auto_zoom")
|
|
|
except Exception as exp:
|
|
|
clear()
|
|
|
appendLog(f'Failed to open AutoZoom Telegram group: {exp}')
|
|
|
none = input(f'{RESET}Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: {BRED}https://t.me/auto_zoom{RESET}\n\n > ')
|
|
|
clear()
|
|
|
elif help_choose == '5':
|
|
|
try:
|
|
|
clear()
|
|
|
appendLog('Opened AutoZoom\'s developer Telegram')
|
|
|
webbrowser.open("https://t.me/profitroll")
|
|
|
except Exception as exp:
|
|
|
clear()
|
|
|
appendLog(f'Failed to open AutoZoom\'s developer Telegram: {exp}')
|
|
|
none = input(f'{RESET}Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: {BRED}https://t.me/profitroll{RESET}\n\n > ')
|
|
|
clear()
|
|
|
elif help_choose == '6':
|
|
|
try:
|
|
|
clear()
|
|
|
appendLog('Opened AutoZoom\'s donation page')
|
|
|
webbrowser.open("https://www.end-play.xyz/autozoom/donate")
|
|
|
except Exception as exp:
|
|
|
clear()
|
|
|
appendLog(f'Failed to open AutoZoom\'s donation page: {exp}')
|
|
|
none = input(f'{RESET}Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: {BRED}https://www.end-play.xyz/autozoom/donate{RESET}\n\n > ')
|
|
|
clear()
|
|
|
elif help_choose == '7':
|
|
|
try:
|
|
|
clear()
|
|
|
print(f'{BBLACK}»{RESET} Список поддержавших проект:\n\n{(requests.get("https://www.end-play.xyz/AutoZoomDonors.txt").content.decode("utf-8")).replace("-", RESET+" •"+BRED)}{RESET}')
|
|
|
except Exception as exp:
|
|
|
clear()
|
|
|
appendLog(f'Failed to load donation list {exp}')
|
|
|
print(f'{RESET}Не удалось загрузить данные о списке поддержавших проект.\nВы можете посмотреть его самостоятельно: {BRED}https://www.end-play.xyz/AutoZoomDonors.txt')
|
|
|
none = input('\n > ')
|
|
|
clear()
|
|
|
if help_choose == '8':
|
|
|
clear()
|
|
|
|
|
|
if getState("RBTray.exe"):
|
|
|
rbtray = f'{BGREEN}Активен{RESET}'
|
|
|
else:
|
|
|
rbtray = f'{BRED}Неактивен{RESET}'
|
|
|
|
|
|
if rpc.connected:
|
|
|
dsrpc = f'{BGREEN}Активен{RESET}'
|
|
|
else:
|
|
|
dsrpc = f'{BRED}Неактивен{RESET}'
|
|
|
|
|
|
appendLog(f'Showing system information:\n=============================================\nHelpful data for fault search:\n\nOS: {platform.system()}\nRelease: {platform.release()}\nArch: {os_arch()}\nPy Ver: {platform.python_version()}\nPIP Ver: {pip.__version__}\nImpl: {platform.python_implementation()}\nRev: {platform.python_revision()}\nPy Path: {sys.path[4]}\nAZ Ver: {version}\nAZ User: {getpass.getuser()}\nAZ User Home: {Path.home()}\nAZ Path: {path}\nRBTray: {str(getState("RBTray.exe"))}\nRPC: {str(rpc.connected)}\n=============================================')
|
|
|
print(f'{BBLACK}»{RESET} Информация о системе\n')
|
|
|
print(' Система:')
|
|
|
print(f' {BBLACK}•{RESET} ОС: {YELLOW}{platform.system()}{RESET}')
|
|
|
print(f' {BBLACK}•{RESET} Релиз: {YELLOW}{platform.release()}{RESET}')
|
|
|
print(f' {BBLACK}•{RESET} Разрядность: {YELLOW}{os_arch()}{RESET}')
|
|
|
print('\n Python:')
|
|
|
print(f' {BBLACK}•{RESET} Версия: {YELLOW}{platform.python_version()}{RESET}')
|
|
|
print(f' {BBLACK}•{RESET} Версия PIP: {YELLOW}{pip.__version__}{RESET}')
|
|
|
print(f' {BBLACK}•{RESET} Вариант: {YELLOW}{platform.python_implementation()}{RESET}')
|
|
|
print(f' {BBLACK}•{RESET} Ревизия: {YELLOW}{platform.python_revision()}{RESET}')
|
|
|
print(f' {BBLACK}•{RESET} Расположение: {BRED}{sys.path[4]}{RESET}')
|
|
|
print('\n AutoZoom:')
|
|
|
print(f' {BBLACK}•{RESET} Версия: {YELLOW}{version}{RESET}')
|
|
|
print(f' {BBLACK}•{RESET} Пользователь: {YELLOW}{getpass.getuser()}{RESET}')
|
|
|
print(f' {BBLACK}•{RESET} Папка пользователя: {BRED}{Path.home()}{RESET}')
|
|
|
print(f' {BBLACK}•{RESET} Расположение: {BRED}{path}{RESET}')
|
|
|
print('\n Интеграции:')
|
|
|
print(f' {BBLACK}•{RESET} RBTray: {rbtray}')
|
|
|
print(f' {BBLACK}•{RESET} Discord RPC: {dsrpc}')
|
|
|
none = input('\n > ')
|
|
|
clear()
|
|
|
elif help_choose == '9':
|
|
|
rpc.inMenu()
|
|
|
clear()
|
|
|
setTitle("AutoZoom (Главная)", getOS())
|
|
|
return
|
|
|
else:
|
|
|
clear()
|
|
|
continue
|
|
|
except KeyboardInterrupt:
|
|
|
rpc.inMenu()
|
|
|
clear()
|
|
|
return
|
|
|
|
|
|
def devMenu():
|
|
|
try:
|
|
|
while True:
|
|
|
setTitle("AutoZoom (Отладка)", getOS())
|
|
|
appendLog('Help menu opened')
|
|
|
|
|
|
clear()
|
|
|
|
|
|
print(f'{BBLACK}»{RESET} Меню отладки\n')
|
|
|
print(f' {BRED}1.{RESET} PlaySound test')
|
|
|
print(f' {BRED}2.{RESET} WinSound test')
|
|
|
print(f' {BRED}3.{RESET} Play-audio test')
|
|
|
print(f' {BRED}4.{RESET} playSound function test')
|
|
|
print(f' {BRED}5.{RESET} OS check test')
|
|
|
print(f' {BRED}6.{RESET} Telegram test')
|
|
|
print(f' {BRED}7.{RESET} Zoom meeting test')
|
|
|
print(f' {BRED}8.{RESET} Color test')
|
|
|
print(f' {BRED}9.{RESET} Exit to menu')
|
|
|
|
|
|
choose = input(f'\n > {BRED}')
|
|
|
|
|
|
if choose == '1':
|
|
|
from playsound import playsound
|
|
|
playsound(sounds_folder+"debug.wav")
|
|
|
continue
|
|
|
|
|
|
elif choose == '2':
|
|
|
import winsound
|
|
|
winsound.PlaySound(sounds_folder+"debug.wav", winsound.SND_FILENAME)
|
|
|
continue
|
|
|
|
|
|
elif choose == '3':
|
|
|
os.system(f'play-audio {sounds_folder}debug.wav')
|
|
|
continue
|
|
|
|
|
|
elif choose == '4':
|
|
|
playSound("debug")
|
|
|
continue
|
|
|
|
|
|
elif choose == '5':
|
|
|
clear()
|
|
|
none = input(f'{RESET}{getOS()}\n\n > ')
|
|
|
continue
|
|
|
|
|
|
elif choose == '6':
|
|
|
clear()
|
|
|
import telegram_send
|
|
|
telegram_send.send(messages=["Telegram message test"], parse_mode="markdown", conf=files_folder+"telegram.conf")
|
|
|
continue
|
|
|
|
|
|
elif choose == '7':
|
|
|
clear()
|
|
|
print(editor.debugLesson())
|
|
|
none = input(f'{RESET}\n > ')
|
|
|
continue
|
|
|
|
|
|
elif choose == '8':
|
|
|
clear()
|
|
|
print(f'{BLACK}███{RED}███{GREEN}███{YELLOW}███{BLUE}███{MAGENTA}███{CYAN}███{WHITE}███')
|
|
|
print(f'{BBLACK}███{BRED}███{BGREEN}███{BYELLOW}███{BBLUE}███{BMAGENTA}███{BCYAN}███{BWHITE}███')
|
|
|
print(f'{RESET}RESET')
|
|
|
print(f'{REVERSE}REVERSE{RESET}')
|
|
|
print(f'{ULINE}UNDERLINE{RESET}')
|
|
|
none = input(RESET+'\n > ')
|
|
|
continue
|
|
|
|
|
|
elif choose == '9':
|
|
|
rpc.inMenu()
|
|
|
clear()
|
|
|
setTitle("AutoZoom (Главная)", getOS())
|
|
|
return
|
|
|
|
|
|
else:
|
|
|
clear()
|
|
|
continue
|
|
|
|
|
|
except KeyboardInterrupt:
|
|
|
rpc.inMenu()
|
|
|
clear()
|
|
|
return
|
|
|
|
|
|
|
|
|
def updater(serv_ver, version):
|
|
|
try:
|
|
|
while True:
|
|
|
setTitle("AutoZoom (Обновления)", getOS())
|
|
|
appendLog('Updater menu opened')
|
|
|
clear()
|
|
|
|
|
|
if getConfig("update_check") and float(serv_ver) > float(version):
|
|
|
show_version = f' ({BRED}!{RESET})'
|
|
|
serv_ver = serv_ver.rstrip('\n')
|
|
|
show_action = f'Обновить до {BGREEN}{serv_ver}{RESET}'
|
|
|
changelog_text = f'Изменения в версии {BGREEN}{serv_ver}{RESET}:'
|
|
|
changelog_footer = '\nОбновитесь чтобы вышеуказанное работало.'
|
|
|
elif serv_ver == 'disabled':
|
|
|
show_version = ''
|
|
|
show_action = f'Переустановить'
|
|
|
changelog_text = f'Изменения в вашей версии:'
|
|
|
changelog_footer = ''
|
|
|
else:
|
|
|
show_version = ''
|
|
|
show_action = f'Переустановить'
|
|
|
changelog_text = f'Изменения в вашей версии:'
|
|
|
changelog_footer = ''
|
|
|
|
|
|
|
|
|
print(f'{BBLACK}»{RESET} Меню обновлений\n')
|
|
|
print(f' {BRED}1.{RESET} {show_action}')
|
|
|
print(f' {BRED}2.{RESET} Список изменений')
|
|
|
print(f' {BRED}3.{RESET} В главное меню')
|
|
|
if not getConfig("update_check"):
|
|
|
print(f'\n{BRED}Внимание!{RESET} У вас выключена проверка обновлений.\nЕсли это было сделанно временно - включите её в настройках.')
|
|
|
updater_choose = input(f'\n > {BRED}')
|
|
|
|
|
|
if updater_choose == '1':
|
|
|
appendLog('Choosed to update')
|
|
|
|
|
|
while True:
|
|
|
clear()
|
|
|
print(f'{RESET}Подтвердите действие:\n')
|
|
|
print(f' {BRED}1.{RESET} Установить')
|
|
|
print(f' {BRED}2.{RESET} Отменить')
|
|
|
updater_decide = input(f'\n > {BRED}')
|
|
|
print(RESET)
|
|
|
|
|
|
if updater_decide == '1':
|
|
|
appendLog('Trying to update AutoZoom')
|
|
|
clear()
|
|
|
|
|
|
try:
|
|
|
wget.download('https://www.end-play.xyz/AutoZoomLatest.zip', out='AutoZoomLatest.zip')
|
|
|
appendLog('Latest zip downloaded')
|
|
|
except Exception as exp:
|
|
|
print(f'{RESET}Не удалось загрузить архив с последней версией.\nПроверьте подключение к сети и повторите попытку.\n\nСтатус сервера центра обновлений:\n{BRED}https://status.end-play.xyz/786373747{RESET}')
|
|
|
appendLog(f'Failed to download zip: {exp}')
|
|
|
none = input(f'\n > {BRED}')
|
|
|
continue
|
|
|
|
|
|
with ZipFile('AutoZoomLatest.zip', 'r') as zipObj:
|
|
|
zipObj.extractall()
|
|
|
print(f'{RESET}Все файлы были успешно загружены')
|
|
|
appendLog('Latest zip extracted')
|
|
|
|
|
|
if os.path.exists("AutoZoomLatest.zip"):
|
|
|
os.remove("AutoZoomLatest.zip")
|
|
|
appendLog('Latest used zip deleted')
|
|
|
|
|
|
clear()
|
|
|
none = input(f'{RESET}Обновление завершено, перезапустите AutoZoom.\n\n > ')
|
|
|
rpc.disconnect()
|
|
|
clear()
|
|
|
print(f'{RESET}Закрываем приложение {BGREEN}AutoZoom{RESET}...')
|
|
|
appendLog('Exiting AutoZoom after an update')
|
|
|
sys.exit()
|
|
|
elif updater_decide == '2':
|
|
|
clear()
|
|
|
appendLog('Aborted update')
|
|
|
break
|
|
|
else:
|
|
|
continue
|
|
|
|
|
|
elif updater_choose == '2':
|
|
|
appendLog('Choosed to check changelog')
|
|
|
try:
|
|
|
changelog = requests.get("https://www.end-play.xyz/AutoZoomChangelog.txt")
|
|
|
changelog.encoding = None
|
|
|
appendLog('Changelog loaded')
|
|
|
clear()
|
|
|
print(f'{RESET}{changelog_text}\n')
|
|
|
print(changelog.content.decode('utf-8'))
|
|
|
print(changelog_footer)
|
|
|
none = input('\n > ')
|
|
|
continue
|
|
|
except Exception as exp:
|
|
|
clear()
|
|
|
print(f'{RESET}Не удалось загрузить чейнджлог.\nПроверьте подключение к сети и повторите попытку.\n\nСтатус сервера центра обновлений:\n{BRED}https://status.end-play.xyz/786373747{RESET}')
|
|
|
appendLog(f'Failed to check changelog: {exp}')
|
|
|
none = input('\n > ')
|
|
|
continue
|
|
|
|
|
|
elif updater_choose == '3':
|
|
|
rpc.inMenu()
|
|
|
clear()
|
|
|
appendLog('Returning to main menu')
|
|
|
setTitle("AutoZoom (Главная)", getOS())
|
|
|
return
|
|
|
|
|
|
else:
|
|
|
continue
|
|
|
|
|
|
except KeyboardInterrupt:
|
|
|
rpc.inMenu()
|
|
|
clear()
|
|
|
return
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
from functions import getConfig
|
|
|
from daemon import clear, getOS, setTitle
|
|
|
import time
|
|
|
setTitle("Загрузка main...", getOS())
|
|
|
clear()
|
|
|
|
|
|
if getConfig("run_fullscreen"):
|
|
|
keyboard.press('alt, enter')
|
|
|
time.sleep(.25)
|
|
|
keyboard.release('alt, enter')
|
|
|
|
|
|
setTitle("AutoZoom (Главная)", getOS())
|
|
|
mainMenu()
|
|
|
sys.exit()
|