fishyboteso/fishy/engine/semifisher/fishing_event.py

196 lines
5.1 KiB
Python
Raw Normal View History

"""
fishing_event.py
Defines different fishing modes (states) which acts as state for state machine
also implements callbacks which is called when states are changed
"""
2020-04-17 13:08:26 +00:00
import logging
import time
2021-04-15 18:26:35 +00:00
import random
import keyboard
from playsound import playsound
2021-04-15 18:26:35 +00:00
from win32gui import GetWindowText, GetForegroundWindow
from fishy import web
2021-04-15 18:26:35 +00:00
from fishy.engine.semifisher import fishing_mode
from fishy.engine.semifisher.fishing_mode import State, FishingMode
from fishy.helper import helper
2020-10-17 19:06:07 +00:00
from fishy.helper.config import config
2020-12-27 12:56:43 +00:00
class FishEvent:
fishCaught = 0
totalFishCaught = 0
stickInitTime = 0
fish_times = []
hole_start_time = 0
FishingStarted = False
jitter = False
2021-05-07 12:13:55 +00:00
previousState = State.IDLE
2020-10-15 02:23:15 +00:00
# initialize these
action_key = 'e'
2021-03-08 19:53:40 +00:00
collect_key = 'r'
sound = False
2020-10-15 02:23:15 +00:00
2020-12-13 19:13:15 +00:00
def _fishing_sleep(waittime, lower_limit_ms = 16, upper_limit_ms = 2500):
reaction = 0.0
if FishEvent.jitter and upper_limit_ms > lower_limit_ms:
2020-12-13 19:13:15 +00:00
reaction = float( random.randrange(lower_limit_ms, upper_limit_ms) )/1000.0
2020-12-13 20:04:45 +00:00
max_wait_t = waittime+reaction if waittime+reaction <= 2.5 else 2.5
2020-12-13 19:13:15 +00:00
time.sleep(max_wait_t)
2020-10-15 02:23:15 +00:00
2020-12-27 12:56:43 +00:00
def if_eso_is_focused(func):
def wrapper():
if GetWindowText(GetForegroundWindow()) != "Elder Scrolls Online":
logging.warning("ESO window is not focused")
return
func()
return wrapper
def _sound_and_send_fishy_data():
if FishEvent.fishCaught > 0:
web.send_fish_caught(FishEvent.fishCaught, time.time() - FishEvent.hole_start_time, FishEvent.fish_times)
FishEvent.fishCaught = 0
if FishEvent.sound:
playsound(helper.manifest_file("sound.mp3"), False)
def init():
subscribe()
FishEvent.jitter = config.get("jitter", False)
2020-10-17 19:06:07 +00:00
FishEvent.action_key = config.get("action_key", 'e')
2020-12-07 15:36:15 +00:00
FishEvent.collect_key = config.get("collect_key", 'r')
2020-10-17 19:06:07 +00:00
FishEvent.uid = config.get("uid")
FishEvent.sound = config.get("sound_notification", False)
def unsubscribe():
if fisher_callback in fishing_mode.subscribers:
fishing_mode.subscribers.remove(fisher_callback)
def subscribe():
if fisher_callback not in fishing_mode.subscribers:
fishing_mode.subscribers.append(fisher_callback)
2021-05-07 12:13:55 +00:00
if FishingMode.CurrentMode == State.LOOKING:
fisher_callback(FishingMode.CurrentMode)
def fisher_callback(event: State):
2021-03-14 21:16:49 +00:00
callbacks_map = {
2021-05-07 12:13:55 +00:00
State.IDLE: on_idle,
2021-04-15 18:24:01 +00:00
State.LOOKAWAY: on_idle,
2021-05-07 12:13:55 +00:00
State.LOOKING: on_looking,
State.DEPLETED: on_depleted,
State.NOBAIT: on_nobait,
State.FISHING: on_fishing,
State.REELIN: on_reelin,
State.LOOT: on_loot,
State.INVFULL: on_invfull,
State.FIGHT: on_fight,
State.DEAD: on_dead
2021-03-14 21:16:49 +00:00
}
2021-04-09 18:50:53 +00:00
2021-03-14 21:16:49 +00:00
try:
callbacks_map[event]()
FishEvent.previousState = event
except KeyError as ex:
logging.error("KeyError: State " + str(event) + " is not known.")
except TypeError as ex:
logging.error("TypeError when reading state: " + str(event))
2020-10-15 02:23:15 +00:00
2021-03-14 21:16:49 +00:00
def on_idle():
2021-05-07 12:13:55 +00:00
if FishEvent.previousState in (State.FISHING, State.REELIN):
2021-03-14 21:16:49 +00:00
logging.info("FISHING INTERRUPTED")
_sound_and_send_fishy_data()
def on_depleted():
logging.info("HOLE DEPLETED")
_sound_and_send_fishy_data()
2020-12-13 19:13:15 +00:00
2020-12-27 12:56:43 +00:00
@if_eso_is_focused
2021-03-14 21:16:49 +00:00
def on_looking():
"""
presses e to throw the fishing rod
"""
2021-03-14 21:16:49 +00:00
_fishing_sleep(0.0)
keyboard.press_and_release(FishEvent.action_key)
2021-03-28 15:33:09 +00:00
def on_nobait():
msg = "No bait equipped!"
logging.info(msg)
web.send_notification(msg)
if FishEvent.sound:
playsound(helper.manifest_file("sound.mp3"), False)
2021-03-28 15:33:09 +00:00
2021-03-14 21:16:49 +00:00
def on_fishing():
FishEvent.stickInitTime = time.time()
FishEvent.FishingStarted = True
2020-10-15 02:23:15 +00:00
if FishEvent.fishCaught == 0:
FishEvent.hole_start_time = time.time()
FishEvent.fish_times = []
2021-03-14 21:16:49 +00:00
@if_eso_is_focused
def on_reelin():
"""
called when the fish hook is detected
increases the `fishCaught` and `totalFishCaught`, calculates the time it took to catch
presses e to catch the fish
"""
FishEvent.fishCaught += 1
FishEvent.totalFishCaught += 1
time_to_hook = time.time() - FishEvent.stickInitTime
FishEvent.fish_times.append(time_to_hook)
logging.info("HOOOOOOOOOOOOOOOOOOOOOOOK....... " + str(FishEvent.fishCaught) + " caught " + "in " + str(
round(time_to_hook, 2)) + " secs. " + "Total: " + str(FishEvent.totalFishCaught))
_fishing_sleep(0.0)
keyboard.press_and_release(FishEvent.action_key)
_fishing_sleep(0.5)
def on_loot():
_fishing_sleep(0)
keyboard.press_and_release(FishEvent.collect_key)
_fishing_sleep(0)
2021-03-14 21:16:49 +00:00
2021-03-28 15:33:09 +00:00
def on_invfull():
msg = "Inventory full!"
logging.info(msg)
web.send_notification(msg)
if FishEvent.sound:
playsound(helper.manifest_file("sound.mp3"), False)
2021-03-28 15:33:09 +00:00
2021-03-14 21:16:49 +00:00
def on_fight():
2021-03-26 11:18:29 +00:00
msg = "FIGHTING!"
logging.info(msg)
web.send_notification(msg)
2021-03-14 21:16:49 +00:00
if FishEvent.sound:
playsound(helper.manifest_file("sound.mp3"), False)
2021-03-14 21:16:49 +00:00
def on_dead():
2021-03-28 15:33:09 +00:00
msg = "Character is dead!"
2021-03-26 11:18:29 +00:00
logging.info(msg)
web.send_notification(msg)
if FishEvent.sound:
playsound(helper.manifest_file("sound.mp3"), False)