2024-03-03, update for kktix_status.
parent
7c605a3c2c
commit
eb220b9f0a
|
@ -3,6 +3,7 @@
|
||||||
#執行方式:python chrome_tixcraft.py 或 python3 chrome_tixcraft.py
|
#執行方式:python chrome_tixcraft.py 或 python3 chrome_tixcraft.py
|
||||||
#import jieba
|
#import jieba
|
||||||
#from DrissionPage import ChromiumPage
|
#from DrissionPage import ChromiumPage
|
||||||
|
#import nodriver as uc
|
||||||
import argparse
|
import argparse
|
||||||
import base64
|
import base64
|
||||||
import json
|
import json
|
||||||
|
@ -41,7 +42,7 @@ try:
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
CONST_APP_VERSION = "MaxBot (2024.03.02)"
|
CONST_APP_VERSION = "MaxBot (2024.03.03)"
|
||||||
|
|
||||||
CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt"
|
CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt"
|
||||||
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
||||||
|
|
|
@ -1 +1,22 @@
|
||||||
{"list": ["settings.json", "", "", "", "", "", "", "", "", "", "", "", "", "", ""], "advanced": {"language": "\u7e41\u9ad4\u4e2d\u6587"}}
|
{
|
||||||
|
"list": [
|
||||||
|
"settings.json",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
""
|
||||||
|
],
|
||||||
|
"advanced": {
|
||||||
|
"language": "\u7e41\u9ad4\u4e2d\u6587"
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,7 +22,7 @@ import sys
|
||||||
import threading
|
import threading
|
||||||
import webbrowser
|
import webbrowser
|
||||||
|
|
||||||
CONST_APP_VERSION = "MaxBot (2024.03.02)"
|
CONST_APP_VERSION = "MaxBot (2024.03.03)"
|
||||||
|
|
||||||
CONST_MAXBOT_LAUNCHER_FILE = "config_launcher.json"
|
CONST_MAXBOT_LAUNCHER_FILE = "config_launcher.json"
|
||||||
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
||||||
|
@ -172,54 +172,60 @@ def load_json():
|
||||||
def btn_restore_defaults_clicked(language_code):
|
def btn_restore_defaults_clicked(language_code):
|
||||||
app_root = get_app_root()
|
app_root = get_app_root()
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_LAUNCHER_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_LAUNCHER_FILE)
|
||||||
|
if os.path.exists(str(config_filepath)):
|
||||||
|
try:
|
||||||
|
os.unlink(str(config_filepath))
|
||||||
|
except Exception as exc:
|
||||||
|
print(exc)
|
||||||
|
pass
|
||||||
|
|
||||||
config_dict = get_default_config()
|
config_dict = get_default_config()
|
||||||
import json
|
|
||||||
with open(config_filepath, 'w') as outfile:
|
|
||||||
json.dump(config_dict, outfile)
|
|
||||||
messagebox.showinfo(translate[language_code]["restore_defaults"], translate[language_code]["done"])
|
messagebox.showinfo(translate[language_code]["restore_defaults"], translate[language_code]["done"])
|
||||||
|
|
||||||
global root
|
global root
|
||||||
load_GUI(root, config_dict)
|
load_GUI(root, config_dict)
|
||||||
|
|
||||||
def btn_save_clicked(language_code):
|
def btn_save_clicked():
|
||||||
btn_save_act(language_code)
|
btn_save_act()
|
||||||
|
|
||||||
def btn_save_act(language_code, slience_mode=True):
|
def btn_save_act(slience_mode=True):
|
||||||
app_root = get_app_root()
|
app_root = get_app_root()
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_LAUNCHER_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_LAUNCHER_FILE)
|
||||||
|
|
||||||
config_dict = get_default_config()
|
config_dict = get_default_config()
|
||||||
|
language_code = get_language_code_by_name(config_dict["advanced"]["language"])
|
||||||
global combo_language
|
|
||||||
|
|
||||||
is_all_data_correct = True
|
is_all_data_correct = True
|
||||||
|
|
||||||
|
global combo_language
|
||||||
|
if is_all_data_correct:
|
||||||
|
config_dict["advanced"]["language"] = combo_language.get().strip()
|
||||||
|
# display as new language.
|
||||||
|
language_code = get_language_code_by_name(config_dict["advanced"]["language"])
|
||||||
|
|
||||||
|
|
||||||
global txt_file_name
|
global txt_file_name
|
||||||
filelist = []
|
filelist = []
|
||||||
for i in range(15):
|
for i in range(15):
|
||||||
filelist.append(txt_file_name[i].get().strip())
|
filelist.append(txt_file_name[i].get().strip())
|
||||||
|
|
||||||
|
|
||||||
if is_all_data_correct:
|
if is_all_data_correct:
|
||||||
config_dict["list"]=filelist
|
config_dict["list"]=filelist
|
||||||
config_dict["advanced"]["language"] = combo_language.get().strip()
|
|
||||||
# display as new language.
|
|
||||||
language_code = get_language_code_by_name(config_dict["advanced"]["language"])
|
|
||||||
|
|
||||||
|
|
||||||
# save config.
|
# save config.
|
||||||
if is_all_data_correct:
|
if is_all_data_correct:
|
||||||
import json
|
# slience
|
||||||
with open(config_filepath, 'w') as outfile:
|
save_json(config_dict, config_filepath)
|
||||||
json.dump(config_dict, outfile)
|
|
||||||
|
|
||||||
if not slience_mode:
|
if not slience_mode:
|
||||||
messagebox.showinfo(translate[language_code]["save"], translate[language_code]["done"])
|
messagebox.showinfo(translate[language_code]["save"], translate[language_code]["done"])
|
||||||
|
|
||||||
return is_all_data_correct
|
return is_all_data_correct
|
||||||
|
|
||||||
|
def save_json(config_dict, target_path):
|
||||||
|
json_str = json.dumps(config_dict, indent=4)
|
||||||
|
with open(target_path, 'w') as outfile:
|
||||||
|
outfile.write(json_str)
|
||||||
|
|
||||||
def open_url(url):
|
def open_url(url):
|
||||||
webbrowser.open_new(url)
|
webbrowser.open_new(url)
|
||||||
|
@ -528,7 +534,7 @@ def get_action_bar(root, language_code):
|
||||||
global btn_save
|
global btn_save
|
||||||
global btn_restore_defaults
|
global btn_restore_defaults
|
||||||
|
|
||||||
btn_save = ttk.Button(frame_action, text=translate[language_code]['save'], command= lambda: btn_save_clicked(language_code) )
|
btn_save = ttk.Button(frame_action, text=translate[language_code]['save'], command= lambda: btn_save_clicked() )
|
||||||
btn_save.grid(column=1, row=0)
|
btn_save.grid(column=1, row=0)
|
||||||
|
|
||||||
btn_restore_defaults = ttk.Button(frame_action, text=translate[language_code]['restore_defaults'], command= lambda: btn_restore_defaults_clicked(language_code))
|
btn_restore_defaults = ttk.Button(frame_action, text=translate[language_code]['restore_defaults'], command= lambda: btn_restore_defaults_clicked(language_code))
|
||||||
|
|
279
kktix_status.py
279
kktix_status.py
|
@ -25,11 +25,11 @@ import requests
|
||||||
import time
|
import time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
CONST_APP_VERSION = "MaxBot (2024.03.02)"
|
CONST_APP_VERSION = "MaxBot (2024.03.03)"
|
||||||
|
|
||||||
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
||||||
|
CONST_MAXBOT_KKTIX_FILE = "kktix.json"
|
||||||
CONST_CAPTCHA_SOUND_FILENAME_DEFAULT = "ding-dong.wav"
|
CONST_CAPTCHA_SOUND_FILENAME_DEFAULT = "ding-dong.wav"
|
||||||
CONST_TIMER_INTERVAL = 3.0
|
|
||||||
|
|
||||||
translate={}
|
translate={}
|
||||||
|
|
||||||
|
@ -58,7 +58,14 @@ def load_translate():
|
||||||
|
|
||||||
zh_tw["url"] = '活動網址'
|
zh_tw["url"] = '活動網址'
|
||||||
zh_tw["check_interval"] = '檢查間隔(秒)'
|
zh_tw["check_interval"] = '檢查間隔(秒)'
|
||||||
|
|
||||||
|
zh_tw["status_in_stock"] = "當狀態為 IN_STOCK"
|
||||||
|
zh_tw["play_ticket_sound"] = '有票時播放音效'
|
||||||
zh_tw["play_sound_filename"] = '音效檔'
|
zh_tw["play_sound_filename"] = '音效檔'
|
||||||
|
zh_tw["ticket_exec_maxbot"] = '有票時執行MaxBot'
|
||||||
|
zh_tw["maxbot_config"] = 'MaxBot 設定檔'
|
||||||
|
zh_tw["ticket_exec_command"] = '有票時執行指令'
|
||||||
|
|
||||||
zh_tw["log"] = '事件記錄'
|
zh_tw["log"] = '事件記錄'
|
||||||
zh_tw["last_status"] = '上一個狀態'
|
zh_tw["last_status"] = '上一個狀態'
|
||||||
|
|
||||||
|
@ -105,6 +112,36 @@ def get_app_root():
|
||||||
app_root = os.path.dirname(basis)
|
app_root = os.path.dirname(basis)
|
||||||
return app_root
|
return app_root
|
||||||
|
|
||||||
|
def load_json():
|
||||||
|
app_root = get_app_root()
|
||||||
|
|
||||||
|
# overwrite config path.
|
||||||
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_FILE)
|
||||||
|
|
||||||
|
config_dict = None
|
||||||
|
if os.path.isfile(config_filepath):
|
||||||
|
with open(config_filepath) as json_data:
|
||||||
|
config_dict = json.load(json_data)
|
||||||
|
else:
|
||||||
|
config_dict = get_default_config()
|
||||||
|
return config_filepath, config_dict
|
||||||
|
|
||||||
|
def btn_restore_defaults_clicked(language_code):
|
||||||
|
app_root = get_app_root()
|
||||||
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_FILE)
|
||||||
|
if os.path.exists(str(config_filepath)):
|
||||||
|
try:
|
||||||
|
os.unlink(str(config_filepath))
|
||||||
|
except Exception as exc:
|
||||||
|
print(exc)
|
||||||
|
pass
|
||||||
|
|
||||||
|
config_dict = get_default_config()
|
||||||
|
messagebox.showinfo(translate[language_code]["restore_defaults"], translate[language_code]["done"])
|
||||||
|
|
||||||
|
global root
|
||||||
|
load_GUI(root, config_dict)
|
||||||
|
|
||||||
def btn_preview_sound_clicked():
|
def btn_preview_sound_clicked():
|
||||||
global txt_play_sound_filename
|
global txt_play_sound_filename
|
||||||
new_sound_filename = txt_play_sound_filename.get().strip()
|
new_sound_filename = txt_play_sound_filename.get().strip()
|
||||||
|
@ -130,6 +167,70 @@ def play_mp3(sound_filename):
|
||||||
except Exception as exc2:
|
except Exception as exc2:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def btn_save_clicked():
|
||||||
|
btn_save_act()
|
||||||
|
|
||||||
|
def btn_save_act(slience_mode=True):
|
||||||
|
app_root = get_app_root()
|
||||||
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_KKTIX_FILE)
|
||||||
|
|
||||||
|
config_dict = get_default_config()
|
||||||
|
language_code = get_language_code_by_name(config_dict["advanced"]["language"])
|
||||||
|
|
||||||
|
is_all_data_correct = True
|
||||||
|
|
||||||
|
#global combo_language
|
||||||
|
if is_all_data_correct:
|
||||||
|
#config_dict["advanced"]["language"] = combo_language.get().strip()
|
||||||
|
# display as new language.
|
||||||
|
language_code = get_language_code_by_name(config_dict["advanced"]["language"])
|
||||||
|
|
||||||
|
global txt_file_name
|
||||||
|
filelist = []
|
||||||
|
for i in range(1):
|
||||||
|
filelist.append(txt_file_name[i].get().strip())
|
||||||
|
|
||||||
|
if is_all_data_correct:
|
||||||
|
config_dict["list"]=filelist
|
||||||
|
|
||||||
|
global txt_url
|
||||||
|
global combo_check_interval
|
||||||
|
|
||||||
|
global chk_state_play_ticket_sound
|
||||||
|
global txt_play_sound_filename
|
||||||
|
|
||||||
|
global chk_state_ticket_exec_maxbot
|
||||||
|
|
||||||
|
global chk_state_ticket_exec_command
|
||||||
|
global txt_new_process
|
||||||
|
|
||||||
|
if is_all_data_correct:
|
||||||
|
config_dict["url"] = txt_url.get().strip()
|
||||||
|
config_dict["check_interval"] = int(combo_check_interval.get().strip())
|
||||||
|
|
||||||
|
config_dict["advanced"]["play_sound"]["ticket"] = bool(chk_state_play_ticket_sound.get())
|
||||||
|
config_dict["advanced"]["play_sound"]["filename"] = txt_play_sound_filename.get().strip()
|
||||||
|
|
||||||
|
config_dict["ticket_exec_maxbot"] = bool(chk_state_ticket_exec_maxbot.get())
|
||||||
|
|
||||||
|
config_dict["ticket_exec_command"] = bool(chk_state_ticket_exec_command.get())
|
||||||
|
config_dict["new_process"] = txt_new_process.get().strip()
|
||||||
|
|
||||||
|
# save config.
|
||||||
|
if is_all_data_correct:
|
||||||
|
# slience
|
||||||
|
save_json(config_dict, config_filepath)
|
||||||
|
|
||||||
|
if not slience_mode:
|
||||||
|
messagebox.showinfo(translate[language_code]["save"], translate[language_code]["done"])
|
||||||
|
|
||||||
|
return is_all_data_correct
|
||||||
|
|
||||||
|
def save_json(config_dict, target_path):
|
||||||
|
json_str = json.dumps(config_dict, indent=4)
|
||||||
|
with open(target_path, 'w') as outfile:
|
||||||
|
outfile.write(json_str)
|
||||||
|
|
||||||
def open_url(url):
|
def open_url(url):
|
||||||
webbrowser.open_new(url)
|
webbrowser.open_new(url)
|
||||||
|
|
||||||
|
@ -211,6 +312,18 @@ def btn_items_browse_event(event):
|
||||||
txt_file_name_value[btn_index-1].set(display_path)
|
txt_file_name_value[btn_index-1].set(display_path)
|
||||||
#print("new json file path:", txt_file_name[btn_index-1].get().strip())
|
#print("new json file path:", txt_file_name[btn_index-1].get().strip())
|
||||||
|
|
||||||
|
def btn_new_process_browse_event(event):
|
||||||
|
working_dir = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
global txt_new_process_value
|
||||||
|
file_path = filedialog.askopenfilename(initialdir=working_dir, filetypes=[("All Files","*.*")])
|
||||||
|
if not file_path is None:
|
||||||
|
display_path = file_path
|
||||||
|
if len(file_path) > len(working_dir):
|
||||||
|
if file_path[:len(working_dir)]==working_dir:
|
||||||
|
display_path = file_path[len(working_dir)+1:]
|
||||||
|
print(display_path)
|
||||||
|
txt_new_process_value.set(display_path)
|
||||||
|
|
||||||
def btn_items_run_event(event):
|
def btn_items_run_event(event):
|
||||||
#btn_index = int(str(event.widget['text']).split(" ")[1])
|
#btn_index = int(str(event.widget['text']).split(" ")[1])
|
||||||
btn_index = 1
|
btn_index = 1
|
||||||
|
@ -300,27 +413,46 @@ def ConfigListTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
txt_url = Entry(frame_group_header, width=30, textvariable = txt_url_value)
|
txt_url = Entry(frame_group_header, width=30, textvariable = txt_url_value)
|
||||||
txt_url.grid(column=1, row=group_row_count, sticky = W)
|
txt_url.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
'''
|
|
||||||
group_row_count +=1
|
group_row_count +=1
|
||||||
|
|
||||||
global lbl_check_interval
|
global lbl_check_interval
|
||||||
lbl_check_interval = Label(frame_group_header, text=translate[language_code]['check_interval'])
|
lbl_check_interval = Label(frame_group_header, text=translate[language_code]['check_interval'])
|
||||||
lbl_check_interval.grid(column=0, row=group_row_count, sticky = E)
|
lbl_check_interval.grid(column=0, row=group_row_count, sticky = E)
|
||||||
|
|
||||||
global txt_check_interval
|
global combo_check_interval
|
||||||
txt_check_interval_value = StringVar(frame_group_header, value=config_dict["check_interval"])
|
combo_check_interval = ttk.Combobox(frame_group_header, state="readonly", width=30)
|
||||||
txt_check_interval = Entry(frame_group_header, width=30, textvariable = txt_check_interval_value)
|
combo_check_interval['values']= ("1","5","10","30","60","180","300","600","3600")
|
||||||
txt_check_interval.grid(column=1, row=group_row_count, sticky = W)
|
combo_check_interval.set(str(config_dict["check_interval"]))
|
||||||
'''
|
combo_check_interval.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
group_row_count +=1
|
||||||
|
|
||||||
|
global lbl_status_IN_STOCK_hr
|
||||||
|
lbl_status_IN_STOCK_hr = Label(frame_group_header, text="")
|
||||||
|
lbl_status_IN_STOCK_hr.grid(column=0, row=group_row_count, sticky = E)
|
||||||
|
|
||||||
group_row_count +=1
|
group_row_count +=1
|
||||||
|
|
||||||
global lbl_status_IN_STOCK
|
global lbl_status_IN_STOCK
|
||||||
lbl_status_IN_STOCK = Label(frame_group_header, text="當狀態為 IN_STOCK")
|
lbl_status_IN_STOCK = Label(frame_group_header, text=translate[language_code]['status_in_stock'])
|
||||||
lbl_status_IN_STOCK.grid(column=0, row=group_row_count, sticky = E)
|
lbl_status_IN_STOCK.grid(column=0, row=group_row_count, sticky = E)
|
||||||
|
|
||||||
group_row_count +=1
|
group_row_count +=1
|
||||||
|
|
||||||
|
global lbl_play_ticket_sound
|
||||||
|
lbl_play_ticket_sound = Label(frame_group_header, text=translate[language_code]['play_ticket_sound'])
|
||||||
|
lbl_play_ticket_sound.grid(column=0, row=group_row_count, sticky = E)
|
||||||
|
|
||||||
|
global chk_state_play_ticket_sound
|
||||||
|
chk_state_play_ticket_sound = BooleanVar()
|
||||||
|
chk_state_play_ticket_sound.set(config_dict["advanced"]["play_sound"]["ticket"])
|
||||||
|
|
||||||
|
global chk_play_ticket_sound
|
||||||
|
chk_play_ticket_sound = Checkbutton(frame_group_header, text=translate[language_code]['enable'], variable=chk_state_play_ticket_sound)
|
||||||
|
chk_play_ticket_sound.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
group_row_count +=1
|
||||||
|
|
||||||
global lbl_play_sound_filename
|
global lbl_play_sound_filename
|
||||||
lbl_play_sound_filename = Label(frame_group_header, text=translate[language_code]['play_sound_filename'])
|
lbl_play_sound_filename = Label(frame_group_header, text=translate[language_code]['play_sound_filename'])
|
||||||
lbl_play_sound_filename.grid(column=0, row=group_row_count, sticky = E)
|
lbl_play_sound_filename.grid(column=0, row=group_row_count, sticky = E)
|
||||||
|
@ -338,13 +470,27 @@ def ConfigListTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
lbl_icon_play.grid(column=2, row=group_row_count, sticky = W)
|
lbl_icon_play.grid(column=2, row=group_row_count, sticky = W)
|
||||||
lbl_icon_play.bind("<Button-1>", lambda e: btn_preview_sound_clicked())
|
lbl_icon_play.bind("<Button-1>", lambda e: btn_preview_sound_clicked())
|
||||||
|
|
||||||
|
group_row_count +=1
|
||||||
|
|
||||||
|
global lbl_ticket_exec_maxbot
|
||||||
|
lbl_ticket_exec_maxbot = Label(frame_group_header, text=translate[language_code]['ticket_exec_maxbot'])
|
||||||
|
lbl_ticket_exec_maxbot.grid(column=0, row=group_row_count, sticky = E)
|
||||||
|
|
||||||
|
global chk_state_ticket_exec_maxbot
|
||||||
|
chk_state_ticket_exec_maxbot = BooleanVar()
|
||||||
|
chk_state_ticket_exec_maxbot.set(config_dict["ticket_exec_maxbot"])
|
||||||
|
|
||||||
|
global chk_ticket_exec_maxbot
|
||||||
|
chk_ticket_exec_maxbot = Checkbutton(frame_group_header, text=translate[language_code]['enable'], variable=chk_state_ticket_exec_maxbot)
|
||||||
|
chk_ticket_exec_maxbot.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
group_row_count +=1
|
group_row_count +=1
|
||||||
|
|
||||||
for i in range(1):
|
for i in range(1):
|
||||||
filename = ""
|
filename = ""
|
||||||
if i <= len(config_dict["list"])-1:
|
if i <= len(config_dict["list"])-1:
|
||||||
filename = config_dict["list"][i]
|
filename = config_dict["list"][i]
|
||||||
lbl_file_name[i] = Label(frame_group_header, text="MaxBot 設定檔")
|
lbl_file_name[i] = Label(frame_group_header, text=translate[language_code]['maxbot_config'])
|
||||||
lbl_file_name[i].grid(column=0, row=group_row_count, sticky = E)
|
lbl_file_name[i].grid(column=0, row=group_row_count, sticky = E)
|
||||||
|
|
||||||
txt_file_name_value[i] = StringVar(frame_group_header, value=filename)
|
txt_file_name_value[i] = StringVar(frame_group_header, value=filename)
|
||||||
|
@ -360,6 +506,43 @@ def ConfigListTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
|
|
||||||
group_row_count +=1
|
group_row_count +=1
|
||||||
|
|
||||||
|
global lbl_ticket_exec_command
|
||||||
|
lbl_ticket_exec_command = Label(frame_group_header, text=translate[language_code]['ticket_exec_command'])
|
||||||
|
lbl_ticket_exec_command.grid(column=0, row=group_row_count, sticky = E)
|
||||||
|
|
||||||
|
global chk_state_ticket_exec_command
|
||||||
|
chk_state_ticket_exec_command = BooleanVar()
|
||||||
|
chk_state_ticket_exec_command.set(config_dict["ticket_exec_command"])
|
||||||
|
|
||||||
|
global chk_ticket_exec_command
|
||||||
|
chk_ticket_exec_command = Checkbutton(frame_group_header, text=translate[language_code]['enable'], variable=chk_state_ticket_exec_command)
|
||||||
|
chk_ticket_exec_command.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
group_row_count +=1
|
||||||
|
|
||||||
|
global lbl_new_processes
|
||||||
|
lbl_new_processes = Label(frame_group_header, text=translate[language_code]['ticket_exec_command'])
|
||||||
|
lbl_new_processes.grid(column=0, row=group_row_count, sticky = E)
|
||||||
|
|
||||||
|
global txt_new_process
|
||||||
|
global txt_new_process_value
|
||||||
|
txt_new_process_value = StringVar(frame_group_header, value=config_dict["new_process"])
|
||||||
|
txt_new_process = Entry(frame_group_header, width=30, textvariable = txt_new_process_value)
|
||||||
|
txt_new_process.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
global btn_new_process_browse
|
||||||
|
btn_new_process_browse = ttk.Button(frame_group_header, text=translate[language_code]['browse'])
|
||||||
|
btn_new_process_browse.grid(column=2, row=group_row_count, sticky = W)
|
||||||
|
btn_new_process_browse.bind('<Button-1>', btn_new_process_browse_event)
|
||||||
|
|
||||||
|
group_row_count +=1
|
||||||
|
|
||||||
|
global lbl_status_log_hr
|
||||||
|
lbl_status_log_hr = Label(frame_group_header, text="")
|
||||||
|
lbl_status_log_hr.grid(column=0, row=group_row_count, sticky = E)
|
||||||
|
|
||||||
|
group_row_count +=1
|
||||||
|
|
||||||
global lbl_status_log
|
global lbl_status_log
|
||||||
lbl_status_log = Label(frame_group_header, text=translate[language_code]['log'])
|
lbl_status_log = Label(frame_group_header, text=translate[language_code]['log'])
|
||||||
lbl_status_log.grid(column=0, row=group_row_count, sticky = E)
|
lbl_status_log.grid(column=0, row=group_row_count, sticky = E)
|
||||||
|
@ -381,11 +564,10 @@ def ConfigListTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
group_row_count +=1
|
group_row_count +=1
|
||||||
|
|
||||||
global txt_status_log
|
global txt_status_log
|
||||||
txt_status_log = Text(frame_group_header, width=40, height=20)
|
txt_status_log = Text(frame_group_header, width=40, height=12)
|
||||||
txt_status_log.grid(column=1, row=group_row_count, sticky = W, columnspan=2)
|
txt_status_log.grid(column=1, row=group_row_count, sticky = W, columnspan=2)
|
||||||
txt_status_log.insert("1.0", "")
|
txt_status_log.insert("1.0", "")
|
||||||
|
|
||||||
|
|
||||||
# add first block to UI.
|
# add first block to UI.
|
||||||
frame_group_header.grid(column=0, row=row_count, sticky = W, padx=UI_PADDING_X)
|
frame_group_header.grid(column=0, row=row_count, sticky = W, padx=UI_PADDING_X)
|
||||||
|
|
||||||
|
@ -449,7 +631,6 @@ def AboutTab(root, language_code):
|
||||||
lbl_fb_fans_url.grid(column=1, row=group_row_count, sticky = W)
|
lbl_fb_fans_url.grid(column=1, row=group_row_count, sticky = W)
|
||||||
lbl_fb_fans_url.bind("<Button-1>", lambda e: open_url(URL_FB))
|
lbl_fb_fans_url.bind("<Button-1>", lambda e: open_url(URL_FB))
|
||||||
|
|
||||||
|
|
||||||
group_row_count +=1
|
group_row_count +=1
|
||||||
|
|
||||||
lbl_chrome_driver = Label(frame_group_header, text=u'Chrome Driver')
|
lbl_chrome_driver = Label(frame_group_header, text=u'Chrome Driver')
|
||||||
|
@ -500,18 +681,17 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
combo_language.bind("<<ComboboxSelected>>", callbackLanguageOnChange)
|
combo_language.bind("<<ComboboxSelected>>", callbackLanguageOnChange)
|
||||||
combo_language.grid(column=1, row=group_row_count, sticky = W)
|
combo_language.grid(column=1, row=group_row_count, sticky = W)
|
||||||
|
|
||||||
|
|
||||||
frame_group_header.grid(column=0, row=row_count, padx=UI_PADDING_X)
|
frame_group_header.grid(column=0, row=row_count, padx=UI_PADDING_X)
|
||||||
|
|
||||||
|
|
||||||
def get_action_bar(root, language_code):
|
def get_action_bar(root, language_code):
|
||||||
frame_action = Frame(root)
|
frame_action = Frame(root)
|
||||||
|
|
||||||
global btn_save
|
#global btn_save
|
||||||
global btn_restore_defaults
|
global btn_restore_defaults
|
||||||
|
|
||||||
btn_save = ttk.Button(frame_action, text=translate[language_code]['save'], command= lambda: btn_save_clicked(language_code) )
|
#btn_save = ttk.Button(frame_action, text=translate[language_code]['save'], command= lambda: btn_save_clicked() )
|
||||||
btn_save.grid(column=1, row=0)
|
#btn_save.grid(column=1, row=0)
|
||||||
|
|
||||||
btn_restore_defaults = ttk.Button(frame_action, text=translate[language_code]['restore_defaults'], command= lambda: btn_restore_defaults_clicked(language_code))
|
btn_restore_defaults = ttk.Button(frame_action, text=translate[language_code]['restore_defaults'], command= lambda: btn_restore_defaults_clicked(language_code))
|
||||||
btn_restore_defaults.grid(column=2, row=0)
|
btn_restore_defaults.grid(column=2, row=0)
|
||||||
|
@ -545,9 +725,9 @@ def load_GUI(root, config_dict):
|
||||||
|
|
||||||
tabControl.select(tab1)
|
tabControl.select(tab1)
|
||||||
|
|
||||||
#row_count+=1
|
row_count+=1
|
||||||
#frame_action = get_action_bar(root, language_code)
|
frame_action = get_action_bar(root, language_code)
|
||||||
#frame_action.grid(column=0, row=row_count)
|
frame_action.grid(column=0, row=row_count)
|
||||||
|
|
||||||
global UI_PADDING_X
|
global UI_PADDING_X
|
||||||
ConfigListTab(tab1, config_dict, language_code, UI_PADDING_X)
|
ConfigListTab(tab1, config_dict, language_code, UI_PADDING_X)
|
||||||
|
@ -565,8 +745,13 @@ def get_default_config():
|
||||||
config_dict["advanced"]["language"] = "繁體中文"
|
config_dict["advanced"]["language"] = "繁體中文"
|
||||||
|
|
||||||
config_dict["advanced"]["play_sound"] = {}
|
config_dict["advanced"]["play_sound"] = {}
|
||||||
|
config_dict["advanced"]["play_sound"]["ticket"] = True
|
||||||
config_dict["advanced"]["play_sound"]["filename"] = CONST_CAPTCHA_SOUND_FILENAME_DEFAULT
|
config_dict["advanced"]["play_sound"]["filename"] = CONST_CAPTCHA_SOUND_FILENAME_DEFAULT
|
||||||
|
|
||||||
|
config_dict["ticket_exec_maxbot"] = True
|
||||||
|
config_dict["ticket_exec_command"] = True
|
||||||
|
config_dict["new_process"] = ""
|
||||||
|
|
||||||
return config_dict
|
return config_dict
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
@ -574,6 +759,11 @@ def main():
|
||||||
# only need to load translate once.
|
# only need to load translate once.
|
||||||
translate = load_translate()
|
translate = load_translate()
|
||||||
|
|
||||||
|
global config_filepath
|
||||||
|
global config_dict
|
||||||
|
# only need to load json file once.
|
||||||
|
config_filepath, config_dict = load_json()
|
||||||
|
|
||||||
global root
|
global root
|
||||||
root = Tk()
|
root = Tk()
|
||||||
root.title(CONST_APP_VERSION)
|
root.title(CONST_APP_VERSION)
|
||||||
|
@ -581,11 +771,10 @@ def main():
|
||||||
global UI_PADDING_X
|
global UI_PADDING_X
|
||||||
UI_PADDING_X = 15
|
UI_PADDING_X = 15
|
||||||
|
|
||||||
config_dict = get_default_config()
|
|
||||||
load_GUI(root, config_dict)
|
load_GUI(root, config_dict)
|
||||||
|
|
||||||
GUI_SIZE_WIDTH = 580
|
GUI_SIZE_WIDTH = 580
|
||||||
GUI_SIZE_HEIGHT = 580
|
GUI_SIZE_HEIGHT = 600
|
||||||
|
|
||||||
GUI_SIZE_MACOS = str(GUI_SIZE_WIDTH) + 'x' + str(GUI_SIZE_HEIGHT)
|
GUI_SIZE_MACOS = str(GUI_SIZE_WIDTH) + 'x' + str(GUI_SIZE_HEIGHT)
|
||||||
GUI_SIZE_WINDOWS=str(GUI_SIZE_WIDTH-60) + 'x' + str(GUI_SIZE_HEIGHT-55)
|
GUI_SIZE_WINDOWS=str(GUI_SIZE_WIDTH-60) + 'x' + str(GUI_SIZE_HEIGHT-55)
|
||||||
|
@ -673,8 +862,12 @@ def kktix_get_event_code(url):
|
||||||
return event_code
|
return event_code
|
||||||
|
|
||||||
def kktix_in_stock():
|
def kktix_in_stock():
|
||||||
btn_preview_sound_clicked()
|
global chk_state_play_ticket_sound
|
||||||
pass
|
try:
|
||||||
|
if bool(chk_state_play_ticket_sound.get()):
|
||||||
|
btn_preview_sound_clicked()
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
|
|
||||||
def update_kktix_status():
|
def update_kktix_status():
|
||||||
global txt_url
|
global txt_url
|
||||||
|
@ -718,17 +911,47 @@ def update_kktix_status():
|
||||||
# run once.
|
# run once.
|
||||||
if registerStatus=="IN_STOCK":
|
if registerStatus=="IN_STOCK":
|
||||||
btn_index = 1
|
btn_index = 1
|
||||||
|
|
||||||
global txt_file_name
|
global txt_file_name
|
||||||
|
global chk_state_ticket_exec_maxbot
|
||||||
|
|
||||||
|
global txt_new_process
|
||||||
|
global chk_state_ticket_exec_command
|
||||||
|
|
||||||
try:
|
try:
|
||||||
filename=txt_file_name[btn_index-1].get().strip()
|
if bool(chk_state_ticket_exec_maxbot.get()):
|
||||||
threading.Thread(target=launch_maxbot, args=(filename,)).start()
|
filename=txt_file_name[btn_index-1].get().strip()
|
||||||
|
threading.Thread(target=launch_maxbot, args=(filename,)).start()
|
||||||
|
|
||||||
|
if bool(chk_state_ticket_exec_command.get()):
|
||||||
|
working_dir = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
subprocess.Popen(txt_new_process.get().strip() , shell=True, cwd=working_dir)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def resetful_api_timer():
|
def resetful_api_timer():
|
||||||
|
checkpoint_time = time.time()
|
||||||
|
|
||||||
|
global combo_check_interval
|
||||||
|
|
||||||
|
check_interval = 5
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
update_kktix_status()
|
try:
|
||||||
time.sleep(CONST_TIMER_INTERVAL)
|
check_interval = int(combo_check_interval.get().strip())
|
||||||
|
except Exception as e:
|
||||||
|
check_interval = 5
|
||||||
|
pass
|
||||||
|
|
||||||
|
elapsed_time = time.time() - checkpoint_time
|
||||||
|
if elapsed_time > check_interval:
|
||||||
|
update_kktix_status()
|
||||||
|
try:
|
||||||
|
btn_save_act()
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
|
checkpoint_time = time.time()
|
||||||
|
time.sleep(0.5)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
threading.Thread(target=resetful_api_timer, daemon=True).start()
|
threading.Thread(target=resetful_api_timer, daemon=True).start()
|
||||||
|
|
23
settings.py
23
settings.py
|
@ -48,7 +48,7 @@ try:
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
CONST_APP_VERSION = "MaxBot (2024.03.02)"
|
CONST_APP_VERSION = "MaxBot (2024.03.03)"
|
||||||
|
|
||||||
CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt"
|
CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt"
|
||||||
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
CONST_MAXBOT_CONFIG_FILE = "settings.json"
|
||||||
|
@ -783,10 +783,14 @@ def load_json():
|
||||||
def btn_restore_defaults_clicked(language_code):
|
def btn_restore_defaults_clicked(language_code):
|
||||||
app_root = get_app_root()
|
app_root = get_app_root()
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_CONFIG_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_CONFIG_FILE)
|
||||||
|
if os.path.exists(str(config_filepath)):
|
||||||
|
try:
|
||||||
|
os.unlink(str(config_filepath))
|
||||||
|
except Exception as exc:
|
||||||
|
print(exc)
|
||||||
|
pass
|
||||||
|
|
||||||
config_dict = get_default_config()
|
config_dict = get_default_config()
|
||||||
with open(config_filepath, 'w') as outfile:
|
|
||||||
json.dump(config_dict, outfile)
|
|
||||||
messagebox.showinfo(translate[language_code]["restore_defaults"], translate[language_code]["done"])
|
messagebox.showinfo(translate[language_code]["restore_defaults"], translate[language_code]["done"])
|
||||||
|
|
||||||
global root
|
global root
|
||||||
|
@ -814,18 +818,19 @@ def btn_resume_clicked(language_code):
|
||||||
|
|
||||||
def btn_launcher_clicked(language_code):
|
def btn_launcher_clicked(language_code):
|
||||||
Root_Dir = ""
|
Root_Dir = ""
|
||||||
save_ret = btn_save_act(language_code, slience_mode=True)
|
save_ret = btn_save_act(slience_mode=True)
|
||||||
if save_ret:
|
if save_ret:
|
||||||
run_python_script("config_launcher")
|
run_python_script("config_launcher")
|
||||||
|
|
||||||
def btn_save_clicked(language_code):
|
def btn_save_clicked():
|
||||||
btn_save_act(language_code)
|
btn_save_act()
|
||||||
|
|
||||||
def btn_save_act(language_code, slience_mode=False):
|
def btn_save_act(slience_mode=False):
|
||||||
app_root = get_app_root()
|
app_root = get_app_root()
|
||||||
config_filepath = os.path.join(app_root, CONST_MAXBOT_CONFIG_FILE)
|
config_filepath = os.path.join(app_root, CONST_MAXBOT_CONFIG_FILE)
|
||||||
|
|
||||||
config_dict = get_default_config()
|
config_dict = get_default_config()
|
||||||
|
language_code = get_language_code_by_name(config_dict["language"])
|
||||||
|
|
||||||
# read user input
|
# read user input
|
||||||
global combo_homepage
|
global combo_homepage
|
||||||
|
@ -1167,7 +1172,7 @@ def save_json(config_dict, target_path):
|
||||||
def btn_run_clicked(language_code):
|
def btn_run_clicked(language_code):
|
||||||
print('run button pressed.')
|
print('run button pressed.')
|
||||||
Root_Dir = ""
|
Root_Dir = ""
|
||||||
save_ret = btn_save_act(language_code, slience_mode=True)
|
save_ret = btn_save_act(slience_mode=True)
|
||||||
print("save config result:", save_ret)
|
print("save config result:", save_ret)
|
||||||
if save_ret:
|
if save_ret:
|
||||||
threading.Thread(target=launch_maxbot).start()
|
threading.Thread(target=launch_maxbot).start()
|
||||||
|
@ -3053,7 +3058,7 @@ def get_action_bar(root, language_code):
|
||||||
btn_run = ttk.Button(frame_action, text=translate[language_code]['run'], command= lambda: btn_run_clicked(language_code))
|
btn_run = ttk.Button(frame_action, text=translate[language_code]['run'], command= lambda: btn_run_clicked(language_code))
|
||||||
btn_run.grid(column=0, row=0)
|
btn_run.grid(column=0, row=0)
|
||||||
|
|
||||||
btn_save = ttk.Button(frame_action, text=translate[language_code]['save'], command= lambda: btn_save_clicked(language_code) )
|
btn_save = ttk.Button(frame_action, text=translate[language_code]['save'], command= lambda: btn_save_clicked() )
|
||||||
btn_save.grid(column=1, row=0)
|
btn_save.grid(column=1, row=0)
|
||||||
|
|
||||||
btn_exit = ttk.Button(frame_action, text=translate[language_code]['exit'], command=btn_exit_clicked)
|
btn_exit = ttk.Button(frame_action, text=translate[language_code]['exit'], command=btn_exit_clicked)
|
||||||
|
|
Loading…
Reference in New Issue