def toggle_sub(): if web.is_subbed(config.get("uid"))[0]: if web.unsub(config.get("uid")): gui._notify.set(0) else: if web.sub(config.get("uid")): gui._notify.set(1)
def initialize(window_to_hide): helper.create_shortcut_first() helper.initialize_uid() new_session = web.get_session() if new_session is None: logging.error( "Couldn't create a session, some features might not work") print(f"created session {new_session}") try: is_admin = os.getuid() == 0 except AttributeError: is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0 if is_admin: logging.info("Running with admin privileges") try: helper.auto_upgrade() except Exception: logging.error(traceback.format_exc()) if not config.get("debug", False) and check_window_name( win32gui.GetWindowText(window_to_hide)): win32gui.ShowWindow(window_to_hide, win32con.SW_HIDE) helper.install_thread_excepthook() sys.excepthook = helper.unhandled_exception_logging helper.check_addon("ProvisionsChalutier") if config.get("debug", False): helper.check_addon("FooAddon")
def init(): subscribe() FishEvent.jitter = config.get("jitter", False) FishEvent.action_key = config.get("action_key", 'e') FishEvent.collect_key = config.get("collect_key", 'r') FishEvent.uid = config.get("uid") FishEvent.sound = config.get("sound_notification", False)
def run(self): old_timeline: Optional[List] = None start_from = None if config.get("edit_recorder_mode"): logging.info("moving to nearest coord in recording") old_timeline = player.get_rec_file() if not old_timeline: logging.error("Edit mode selected, but no fishy file selected") return coords = self.engine.get_coords() if not coords: logging.error("QR not found") return start_from = player.find_nearest(old_timeline, coords) if not self.engine.move_to(start_from[2]): logging.error("QR not found") return logging.info("starting, press LMB to mark hole") hotkey.hook(Key.LMB, self._mark_hole) self.timeline = [] last_coord = None while self.engine.start: start_time = time.time() coords = self.engine.get_coords() if not coords: logging.warning( "missed a frame, as qr not be read properly...") time.sleep(0.1) continue self.timeline.append(("move_to", (coords[0], coords[1]))) # maintaining constant frequency for recording time_took = time.time() - start_time if time_took <= Recorder.recording_fps: time.sleep(Recorder.recording_fps - time_took) else: logging.warning("Took too much time to record") last_coord = coords hotkey.free(Key.LMB) if config.get("edit_recorder_mode"): logging.info("moving to nearest coord in recording") end = player.find_nearest(old_timeline, last_coord) self.engine.move_to(end[2]) # recording stitching part1 = old_timeline[:start_from[0]] part2 = old_timeline[end[0]:] self.timeline = part1 + self.timeline + part2 self._ask_to_save()
def initialize(window_to_hide): helper.create_shortcut_first() helper.initialize_uid() new_session = web.get_session() if new_session is None: logging.error( "Couldn't create a session, some features might not work") print(f"created session {new_session}") try: is_admin = os.getuid() == 0 except AttributeError: is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0 if is_admin: logging.info("Running with admin privileges") try: if helper.upgrade_avail() and not config.get("dont_ask_update", False): cv, hv = helper.versions() update_now, dont_ask_update = update_dialog.start(cv, hv) if dont_ask_update: config.set("dont_ask_update", dont_ask_update) else: config.delete("dont_ask_update") if update_now: helper.auto_upgrade() except Exception: logging.error(traceback.format_exc()) if not config.get("debug", False) and check_window_name( win32gui.GetWindowText(window_to_hide)): win32gui.ShowWindow(window_to_hide, win32con.SW_HIDE) helper.install_thread_excepthook() sys.excepthook = helper.unhandled_exception_logging if not config.get("addoninstalled", 0) or helper.get_addonversion( chalutier[0]) < chalutier[2]: helper.install_addon(*chalutier) helper.install_addon(*lam2) helper.remove_addon( "ProvisionsChalutier") #TODO delete with fishy 0.4.6 helper.remove_addon("FooAddon") #TODO delete with fishy 0.4.6 config.set("addoninstalled", helper.get_addonversion(chalutier[0]))
def func(): _file = None files = [('Fishy File', '*.fishy')] while True: button = self._open_save_popup() if button == 0 and config.get("full_auto_rec_file"): return open(config.get("full_auto_rec_file"), 'wb') if button == 1: _file = asksaveasfile(mode='wb', filetypes=files, defaultextension=files) if _file: return _file if button == 2: return None
def run(self): self.mode = None if config.get("calibrate", False): self.mode = Calibrator(self) elif FullAutoMode(config.get("full_auto_mode", 0)) == FullAutoMode.Player: self.mode = Player(self) elif FullAutoMode(config.get("full_auto_mode", 0)) == FullAutoMode.Recorder: self.mode = Recorder(self) else: logging.error("not a valid mode selected") return # block thread until game window becomes active if not is_eso_active(): logging.info("Waiting for eso window to be active...") wait_until(lambda: is_eso_active() or not self.start) if self.start: logging.info("starting in 2 secs...") time.sleep(2) if not (type(self.mode) is Calibrator) and not self.calibrator.all_calibrated(): logging.error("you need to calibrate first") return if not qr_detection.get_values(self.window): logging.error("FishyQR not found, if its not hidden, try to drag it around, " "or increase/decrease its size and try again\nStopping engine...") return if config.get("tabout_stop", 1): self.stop_on_inactive() # noinspection PyBroadException try: self.mode.run() except Exception: logging.error("exception occurred while running full auto mode") print_exc()
def get_rec_file(): file = config.get("full_auto_rec_file") if not file: logging.error("Please select a fishy file first from config") return None file = open(file, 'rb') data = pickle.load(file) file.close() if "full_auto_path" not in data: logging.error("invalid file") return None return data["full_auto_path"]
def check_update(gui, manual_check=False): if not auto_update.upgrade_avail() or config.get("dont_ask_update", False): if manual_check: logging.info("No update is available.") return cv, hv = auto_update.versions() returns = [None, None] _show(gui, cv, hv, returns) [update_now, dont_ask_update] = returns if dont_ask_update: config.set("dont_ask_update", dont_ask_update) else: config.delete("dont_ask_update") if update_now: gui.engine.set_update(hv)
def install_required_addons(force=False): addons_req = [libgps, lam2, fishyqr] addon_version = config.get("addon_version", {}) installed = False for addon in addons_req: if force or (addon_exists(*addon) and (addon[0] not in addon_version or (addon[0] in addon_version and addon_version[addon[0]] < addon[2]))): remove_addon(*addon) install_addon(*addon) addon_version[addon[0]] = addon[2] installed = True config.set("addon_version", addon_version) if installed: logging.info( "Please make sure to enable \"Allow outdated addons\" in ESO")
def __init__(self): StreamHandler.__init__(self) self.renderer = None self._temp_buffer = [] formatter = Formatter('%(levelname)s - %(message)s') self.setFormatter(formatter) logging_config = {"comtypes": logging.INFO, "PIL": logging.INFO, "urllib3": logging.WARNING, "": logging.DEBUG} for name, level in logging_config.items(): _logger = logging.getLogger(name) _logger.setLevel(level) self.setLevel(logging.DEBUG if config.get("debug", False) else logging.INFO) logging.getLogger("").addHandler(self)
def look_for_hole(self) -> bool: valid_states = [fishing_mode.State.LOOKING, fishing_mode.State.FISHING] _hole_found_flag = FishingMode.CurrentMode in valid_states # if vertical movement is disabled if not config.get("look_for_hole", 1): return _hole_found_flag t = 0 while not _hole_found_flag and t <= 2.5: direction = -1 if t > 1.25 else 1 mse.move(0, FullAuto.rotate_by*direction) time.sleep(0.05) t += 0.05 _hole_found_flag = FishingMode.CurrentMode in valid_states self._curr_rotate_y = t return _hole_found_flag
def init(): """ Executed once before the main loop, Finds the game window, and calculates the offset to remove the title bar """ try: WindowServer.hwnd = win32gui.FindWindow(None, "Elder Scrolls Online") rect = win32gui.GetWindowRect(WindowServer.hwnd) client_rect = win32gui.GetClientRect(WindowServer.hwnd) WindowServer.windowOffset = math.floor( ((rect[2] - rect[0]) - client_rect[2]) / 2) WindowServer.titleOffset = ( (rect[3] - rect[1]) - client_rect[3]) - WindowServer.windowOffset if config.get("borderless"): WindowServer.titleOffset = 0 WindowServer.status = Status.RUNNING except pywintypes.error: logging.error("Game window not found") WindowServer.status = Status.CRASHED
def _open_save_popup(self): top = PopUp(empty_function, self.engine.get_gui()._root, background=self.engine.get_gui()._root["background"]) recorder_frame = ttk.Frame(top) top.title("Save Recording?") button = [-1] def button_pressed(_button): button[0] = _button top.quit_top() selected_text = f"\n\nSelected: {os.path.basename(config.get('full_auto_rec_file'))}" if config.get( 'edit_recorder_mode') else "" ttk.Label( recorder_frame, text=f"Do you want to save the recording?{selected_text}").grid( row=0, column=0, columnspan=3, pady=(0, 5)) _overwrite = tk.NORMAL if config.get( "edit_recorder_mode") else tk.DISABLED ttk.Button(recorder_frame, text="Overwrite", command=lambda: button_pressed(0), state=_overwrite).grid(row=1, column=0, pady=(5, 0)) ttk.Button(recorder_frame, text="Save As", command=lambda: button_pressed(1)).grid(row=1, column=1) ttk.Button(recorder_frame, text="Cancel", command=lambda: button_pressed(2)).grid(row=1, column=2) recorder_frame.pack(padx=(5, 5), pady=(5, 5)) recorder_frame.update() top.start() return button[0]
def initialize(window_to_hide): Migration.migrate() helper.create_shortcut_first() new_session = web.get_session() if new_session is None: logging.error("Couldn't create a session, some features might not work") logging.debug(f"created session {new_session}") try: is_admin = os.getuid() == 0 except AttributeError: is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0 if is_admin: logging.info("Running with admin privileges") if not config.get("debug", False) and check_window_name(win32gui.GetWindowText(window_to_hide)): win32gui.ShowWindow(window_to_hide, win32con.SW_HIDE) helper.install_thread_excepthook() sys.excepthook = helper.unhandled_exception_logging helper.install_required_addons()
def file_name(): file = config.get("full_auto_rec_file", None) if file is None: return "Not Selected" return os.path.basename(file)
def create_shortcut_first(): from .config import config if not config.get("shortcut_created", False): create_shortcut(False) config.set("shortcut_created", True)
def check_eula(): if not config.get("eula", False): _run_terms_window() return config.get("eula", False) return config.get("eula", False)
def start(): q = Queue() Process(target=show, args=(config.get("win_loc"), q,)).start() return create_finish(q)
def start(): Process(target=show, args=(config.get("win_loc"), )).start()
def _get_factor(key): return config.get("full_auto_factors", {}).get(key)
def _update_factor(key, value): full_auto_factors = config.get("full_auto_factors", {}) full_auto_factors[key] = value config.set("full_auto_factors", full_auto_factors)
def start_semifisher_config(gui: 'GUI'): def save(): gui.config.set("action_key", action_key_entry.get(), False) gui.config.set("collect_key", collect_key_entry.get(), False) gui.config.set("collect_allow_auto", collect_allow_auto.instate(['selected']), False) gui.config.set("borderless", borderless.instate(['selected']), False) gui.config.set("jitter", jitter.instate(['selected']), False) gui.config.set("sound_notification", sound.instate(['selected']), False) gui.config.save_config() def toggle_sub(): if web.is_subbed()[0]: if web.unsub(): gui._notify.set(0) else: if web.sub(): gui._notify.set(1) def toggle_collect(): gui.config.set("collect_allow_auto", collect_allow_auto.instate(['selected']), False) collect_key_entry['state'] = NORMAL if config.get( "collect_allow_auto") else DISABLED def del_entry_key(event): event.widget.delete(0, "end") event.widget.insert(0, str(event.char)) top = PopUp(save, gui._root, background=gui._root["background"]) controls_frame = Frame(top) top.title("Config") Label(controls_frame, text="Notification:").grid(row=0, column=0) gui._notify = IntVar(0) gui._notify_check = Checkbutton(controls_frame, command=toggle_sub, variable=gui._notify) gui._notify_check.grid(row=0, column=1) gui._notify_check['state'] = DISABLED is_subbed = web.is_subbed() if is_subbed[1]: gui._notify_check['state'] = NORMAL gui._notify.set(is_subbed[0]) Label(controls_frame, text="Fullscreen: ").grid(row=1, column=0, pady=(5, 5)) borderless = Checkbutton(controls_frame, var=BooleanVar(value=config.get("borderless"))) borderless.grid(row=1, column=1) Label(controls_frame, text="Action Key:").grid(row=2, column=0) action_key_entry = Entry(controls_frame, justify=CENTER) action_key_entry.grid(row=2, column=1) action_key_entry.insert(0, config.get("action_key", "e")) action_key_entry.bind("<KeyRelease>", del_entry_key) Label(controls_frame, text="Auto-Looting: ").grid(row=3, column=0, pady=(15, 0)) collect_allow_auto = Checkbutton( controls_frame, command=toggle_collect, var=BooleanVar(value=config.get("collect_allow_auto"))) collect_allow_auto.grid(row=3, column=1, pady=(15, 0)) Label(controls_frame, text="Looting Key:").grid(row=4, column=0, pady=(0, 15)) collect_key_entry = Entry(controls_frame, justify=CENTER) collect_key_entry.grid(row=4, column=1, pady=(0, 15)) collect_key_entry.insert(0, config.get("collect_key", "r")) collect_key_entry['state'] = NORMAL if config.get( "collect_allow_auto") else DISABLED collect_key_entry.bind("<KeyRelease>", del_entry_key) Label(controls_frame, text="Sound Notification: ").grid(row=5, column=0, pady=(5, 5)) sound = Checkbutton(controls_frame, var=BooleanVar(value=config.get("sound_notification"))) sound.grid(row=5, column=1) Label(controls_frame, text="Human-Like Delay: ").grid(row=6, column=0, pady=(5, 5)) jitter = Checkbutton(controls_frame, var=BooleanVar(value=config.get("jitter"))) jitter.grid(row=6, column=1) controls_frame.pack(padx=(5, 5), pady=(5, 5)) top.start()
def mode_command(): config.set("full_auto_mode", mode_var.get()) edit_cb['state'] = "normal" if config.get( "full_auto_mode", 0) == FullAutoMode.Recorder.value else "disable"
def toggle_collect(): gui.config.set("collect_allow_auto", collect_allow_auto.instate(['selected']), False) collect_key_entry['state'] = NORMAL if config.get( "collect_allow_auto") else DISABLED
def start_fullfisher_config(gui: 'GUI'): top = PopUp(helper.empty_function, gui._root, background=gui._root["background"]) controls_frame = ttk.Frame(top) top.title("Config") def file_name(): file = config.get("full_auto_rec_file", None) if file is None: return "Not Selected" return os.path.basename(file) def select_file(): file = askopenfilename(filetypes=[('Python Files', '*.fishy')]) if not file: logging.error("file not selected") else: config.set("full_auto_rec_file", file) logging.info(f"loaded {file}") file_name_label.set(file_name()) def start_calibrate(): top.quit_top() config.set("calibrate", True) gui.engine.toggle_fullfisher() def mode_command(): config.set("full_auto_mode", mode_var.get()) edit_cb['state'] = "normal" if config.get( "full_auto_mode", 0) == FullAutoMode.Recorder.value else "disable" # todo repetitive code fix file_name_label = tk.StringVar(value=file_name()) mode_var = tk.IntVar(value=config.get("full_auto_mode", 0)) edit_var = tk.IntVar(value=config.get("edit_recorder_mode", 0)) tabout_var = tk.IntVar(value=config.get("tabout_stop", 1)) look_for_hole = tk.IntVar(value=config.get("look_for_hole", 1)) row = 0 ttk.Label(controls_frame, text="Calibration: ").grid(row=row, column=0, pady=(5, 0)) ttk.Button(controls_frame, text="RUN", command=start_calibrate).grid(row=row, column=1) row += 1 ttk.Label(controls_frame, text="Mode: ").grid(row=row, column=0, rowspan=2) ttk.Radiobutton(controls_frame, text="Player", variable=mode_var, value=FullAutoMode.Player.value, command=mode_command).grid(row=row, column=1, sticky="w", pady=(5, 0)) row += 1 ttk.Radiobutton(controls_frame, text="Recorder", variable=mode_var, value=FullAutoMode.Recorder.value, command=mode_command).grid(row=2, column=1, sticky="w") row += 1 ttk.Label(controls_frame, text="Edit Mode: ").grid(row=row, column=0) edit_state = tk.NORMAL if config.get( "full_auto_mode", 0) == FullAutoMode.Recorder.value else tk.DISABLED edit_cb = ttk.Checkbutton( controls_frame, variable=edit_var, state=edit_state, command=lambda: config.set("edit_recorder_mode", edit_var.get())) edit_cb.grid(row=row, column=1, pady=(5, 0)) row += 1 ttk.Label(controls_frame, text="Tabout Stop: ").grid(row=row, column=0) ttk.Checkbutton( controls_frame, variable=tabout_var, command=lambda: config.set("tabout_stop", tabout_var.get())).grid( row=row, column=1, pady=(5, 0)) row += 1 ttk.Label(controls_frame, text="Look for hole: ").grid(row=row, column=0) ttk.Checkbutton( controls_frame, variable=look_for_hole, command=lambda: config.set("look_for_hole", look_for_hole.get())).grid( row=row, column=1, pady=(5, 0)) row += 1 ttk.Label(controls_frame, text="Fishy file: ").grid(row=row, column=0, rowspan=2) ttk.Button(controls_frame, text="Select", command=select_file).grid(row=row, column=1, pady=(5, 0)) row += 1 ttk.Label(controls_frame, textvariable=file_name_label).grid(row=row, column=1, columnspan=2) row += 1 ttk.Label(controls_frame, text="Use semi-fisher config for rest").grid(row=row, column=0, columnspan=2, pady=(20, 0)) controls_frame.pack(padx=(5, 5), pady=(5, 10)) controls_frame.update() top.start()