Fixed "should spawn" timers

fixed the timer count in !timers
reimplemented !wb <search>
This commit is contained in:
2022-06-25 13:02:26 +02:00
parent 84a5933490
commit b6b59ef740
4 changed files with 57 additions and 88 deletions
+1 -1
View File
@@ -48,7 +48,7 @@ class IgnCore:
self.last_timer_event = 0 self.last_timer_event = 0
self.start_time = int(time.time()) self.start_time = int(time.time())
self.major_version = "IGNCore v2.9" self.major_version = "IGNCore v2.9"
self.minor_version = "5" self.minor_version = "6"
self.incoming_queue = FifoQueue() self.incoming_queue = FifoQueue()
self.mass_message_queue = None self.mass_message_queue = None
self.conns = DictObject() self.conns = DictObject()
@@ -204,6 +204,9 @@ class OrgRosterController:
if not ext_msg: if not ext_msg:
self.logger.error(f"--UKN-- {_} -- {event_data}") self.logger.error(f"--UKN-- {_} -- {event_data}")
return return
if [ext_msg.category_id, ext_msg.instance_id] == [508, 176308692]:
self.logger.info(f"AS/OS DETECTED -- {ext_msg}")
if [ext_msg.category_id, ext_msg.instance_id] == self.LEFT_ORG: if [ext_msg.category_id, ext_msg.instance_id] == self.LEFT_ORG:
log = True log = True
self.process_org_msg(ext_msg.params[0], self.MODE_REM_MANUAL, ext_msg) self.process_org_msg(ext_msg.params[0], self.MODE_REM_MANUAL, ext_msg)
+51 -78
View File
@@ -65,8 +65,10 @@ class TimerObj:
return 3 * 60 * 60 return 3 * 60 * 60
elif self.name in ["T.A.M.", "Zaal The Immortal"]: elif self.name in ["T.A.M.", "Zaal The Immortal"]:
return 6 * 60 * 60 return 6 * 60 * 60
elif self.name in ["Abmouth Indomitus"]: # elif self.name in ["Abmouth Indomitus"]:
return 0 # return 0
# No respawn timer?
return 0
@instance() @instance()
@@ -93,20 +95,24 @@ class WorldBossController:
self.setting_service.register(self.module_name, 'timer_spam', False, BooleanSettingType(), self.setting_service.register(self.module_name, 'timer_spam', False, BooleanSettingType(),
"should timers be spammed") "should timers be spammed")
self.command_alias_service.add_alias("tara", "wb tara") self.command_alias_service.add_alias("tara", "wb tara")
self.command_alias_service.add_alias("gaunt", "wb gaunt") self.command_alias_service.add_alias("gaunt", "wb viza")
self.command_alias_service.add_alias("loren", "wb loren") self.command_alias_service.add_alias("loren", "wb loren")
self.command_alias_service.add_alias("reaper", "wb reaper") self.command_alias_service.add_alias("reaper", "wb reaper")
def spam_timer(self, time, mob, msg): def spam_timer(self, time, mob, msg, next=None):
self.send_warn(msg) self.send_warn(msg)
self.jobs.pop(mob, 0) self.jobs.pop(mob.name, 0)
if next == "spawn":
if mob.get_respawn_timer() != 0:
i = self.job_scheduler.scheduled_job(self.spam_timer, mob.time + mob.get_respawn_timer(), mob=mob.name,
msg=f"<highlight>{mob.name}</highlight> should spawn soon.")
self.jobs[mob.name] = i
@event(WebsocketRelayController.WS_RELAY, "save most current local_timers") @event(WebsocketRelayController.WS_RELAY, "save most current local_timers")
def get_timer(self, _, data): def get_timer(self, _, data):
# print(data) # print(data)
if data.type != "timer": if data.type != "timer":
return return
local = {}
for x in data.payload: for x in data.payload:
found = False found = False
for y in self.timer_data: for y in self.timer_data:
@@ -115,17 +121,15 @@ class WorldBossController:
found = True found = True
if not found: if not found:
self.timer_data.append(TimerObj(x)) self.timer_data.append(TimerObj(x))
# print("-"*50)
for x in self.timer_data: for x in self.timer_data:
x: TimerObj x: TimerObj
# print(x.__str__())
if x.alive_immortal(True): if x.alive_immortal(True):
x.spam = x.getTime() x.spam = x.getTime()
job = self.jobs.pop(x.name, None) job = self.jobs.pop(x.name, None)
if job: if job:
self.job_scheduler.cancel_job(job) self.job_scheduler.cancel_job(job)
self.send_warn(f"<highlight>{x.name}</highlight> has spawned.") self.send_warn(f"<highlight>{x.name}</highlight> has spawned.")
i = self.job_scheduler.scheduled_job(self.spam_timer, x.time-1, mob=x.name, msg=f"<highlight>{x.name}</highlight> is now mortal.") i = self.job_scheduler.scheduled_job(self.spam_timer, x.time-1, mob=x, msg=f"<highlight>{x.name}</highlight> is now mortal.", next="spawn")
self.jobs[x.name] = i self.jobs[x.name] = i
elif x.alive_mortal(True): elif x.alive_mortal(True):
x.spam = x.getTime() x.spam = x.getTime()
@@ -134,9 +138,12 @@ class WorldBossController:
self.job_scheduler.cancel_job(job) self.job_scheduler.cancel_job(job)
self.send_warn(f"<highlight>{x.name}</highlight> is now mortal.") self.send_warn(f"<highlight>{x.name}</highlight> is now mortal.")
if x.get_respawn_timer() != 0: if x.get_respawn_timer() != 0:
i = self.job_scheduler.scheduled_job(self.spam_timer, x.time+x.get_respawn_timer(), mob=x.name, msg=f"<highlight>{x.name}</highlight> should spawn soon.") i = self.job_scheduler.scheduled_job(self.spam_timer, x.time+x.get_respawn_timer(), mob=x, msg=f"<highlight>{x.name}</highlight> should spawn soon.")
self.jobs[x.name] = i self.jobs[x.name] = i
# print("-"*50) elif (x.time + 60) < x.getTime() < (x.time + x.get_respawn_timer()):
i = self.job_scheduler.scheduled_job(self.spam_timer, x.time + x.get_respawn_timer(), mob=x,
msg=f"<highlight>{x.name}</highlight> should spawn soon.")
self.jobs[x.name] = i
def send_warn(self, msg): def send_warn(self, msg):
self.relay_hub.send_message("timers", None, f"[<red>WB</red>] {msg}", f"[<red>WB</red>] {msg}") self.relay_hub.send_message("timers", None, f"[<red>WB</red>] {msg}", f"[<red>WB</red>] {msg}")
@@ -147,81 +154,47 @@ class WorldBossController:
return duration - alert - 1 return duration - alert - 1
return duration return duration
def getWorldbossName(self, name):
name = name.lower()
for x in self.timer_data:
x.name: str
if x.name.lower().__contains__(name):
return x.name
return None
# if name in ["tara", "tarasque"]:
# return "Tarasque"
# elif name in ["lw", "loren", "warr", "loren warr"]:
# return "Loren Warr"
# elif name in ["thr", "reaper", "hollow reaper", "the hollow reaper"]:
# return "The Hollow Reaper"
@command(command="wb", params=[Any("worldboss", is_optional=True)], @command(command="wb", params=[Any("worldboss", is_optional=True)],
description="Displays the next worldboss spawns", access_level="member") description="Displays the next worldboss spawns", access_level="member")
def show_worldboss(self, request, boss: str): def show_worldboss(self, request, boss: str):
return ChatBlob("Next Worldboss spawns", self.getWBTimer()) if boss:
boss = self.getWorldbossName(boss)
@command(command="wb", params=[Const("settings")], if boss:
description="Worldboss Settings", access_level="moderator", sub_command="mod") return self.getWBTimer(boss)
def wb_settings_cmd(self, request, boss: str): return ChatBlob("Next Worldboss spawns", "<red></red>"+self.getWBTimer())
pass
def show_user(self, timer):
timer = self.getWBTimer(timer)
if not timer:
return "No timers cached; please try again later."
if timer.spawn < timer.getTime() < timer.time:
return f"<highlight>{timer.name}</highlight> :: mortal in {self.util.format_time(timer.time-timer.spawn)}"
elif timer.time < timer.getTime():
rt = timer.get_respawn_timer()
return f"<highlight>{timer.name}</highlight> :: spawn in {self.util.format_time(timer.time + timer.get_respawn_timer())}"
def getWBTimer(self, name=None) -> Union[TimerObj, list[TimerObj]]: def getWBTimer(self, name=None) -> Union[TimerObj, list[TimerObj]]:
if not name: if not name:
blob = "" blob = ""
for x in self.timer_data: for x in sorted(self.timer_data, key=lambda y: y.name):
x: TimerObj msg = self.formatMessage(x)
if x.alive_immortal(): blob += (msg + "\n") if msg else ""
blob += f" <highlight>{x.name}</highlight> :: mortal in {self.util.format_time(x.time - x.getTime())}\n"
else:
rt = x.get_respawn_timer()
if rt != 0:
if (x.time + rt) < x.getTime() < (x.time + 2 * rt):
blob += f" <highlight>{x.name}</highlight> :: should have spawned <highlight>{self.util.format_time(abs(x.getTime() - (x.time + rt)))}</highlight> ago\n"
continue
blob += f" <highlight>{x.name}</highlight> :: spawn in {self.util.format_time(x.time + rt - x.getTime())}\n"
return blob return blob
for x in self.timer_data: for x in self.timer_data:
if x.name == name: if x.name == name:
return x return self.formatMessage(x).strip()
def timer_alert(self, t, timer):
pass
# if self.setting_service.get_value("timer_spam") == "0":
# return
# for row in self.timer_data:
# if row["name"] == timer.name:
# timer = self.get_spawn(row)
# if not timer.at:
# return
# alert_duration = self.get_next_alert(timer.at - time.time())
# if timer.at - time.time() < 1:
# if timer.type == "mortal":
# self.send_warn(f"<highlight>{timer.name}</highlight> :: is now mortal")
# self.jobs = [x for x in self.jobs if x['name'] != timer.name]
# elif timer.type == "spawn":
# self.send_warn(f"<highlight>{timer.name}</highlight> :: has just spawned")
# self.jobs = [x for x in self.jobs if x['name'] != timer.name]
# else:
# if timer.type == "mortal":
# self.send_warn(f"<highlight>{timer.name}</highlight> :: mortal in {self.util.format_time(timer.time)}")
# elif timer.type == "spawn":
# if alert_duration > 60 * 2:
# self.send_warn(
# f"<highlight>{timer.name}</highlight> :: spawn in {self.util.format_time(timer.time)}")
# for row in self.timer_data:
# if row["name"] == timer.name:
# timer = self.get_spawn(row)
# job_id = self.job_scheduler.scheduled_job(self.timer_alert, time.time() + alert_duration, timer)
# for job in self.jobs:
# if job['name'] == timer.name:
# job['id'] = job_id
# return
# self.jobs.append({'name': timer.name, 'id': job_id})
# @setting('alert_times', '[480 * 60, 360 * 60, 240 * 60, 120 * 60, 60 * 60, 60 * 15, 60 * 5, 60 * 3, 60 * 2, 60, 30, 15, 5, 0]', 'Worldboss timer spam messages (ETA and actual)')
# def alert_times(self):
# return TextSettingType(['[480 * 60, 360 * 60, 240 * 60, 120 * 60, 60 * 60, 60 * 15, 60 * 5, 60 * 3, 60 * 2, 60, 30, 15, 5, 0]'])
def formatMessage(self, x: TimerObj):
if x.alive_immortal():
return f" <highlight>{x.name}</highlight> :: mortal in {self.util.format_time(x.time - x.getTime())}"
else:
rt = x.get_respawn_timer()
if rt != 0:
if (x.time + rt) < x.getTime() < (x.time + 2 * rt):
return f" <highlight>{x.name}</highlight> :: should have spawned {self.util.format_time(abs(x.getTime() - (x.time + rt)))} ago"
return f" <highlight>{x.name}</highlight> :: spawn in {self.util.format_time(x.time + rt - x.getTime())}"
+2 -9
View File
@@ -70,13 +70,6 @@ class TimerController:
t = int(time.time()) t = int(time.time())
count = 0 count = 0
def getmsg(message):
message = "<tab>" + message + "\n" if message != "No timers cached; please try again later." else ""
nn = 0
if message != "":
nn = 1
return message, nn
data = self.db.query("SELECT t.*, p.name AS char_name FROM timer t " data = self.db.query("SELECT t.*, p.name AS char_name FROM timer t "
"LEFT JOIN player p ON t.char_id = p.char_id " "LEFT JOIN player p ON t.char_id = p.char_id "
"ORDER BY t.finished_at") "ORDER BY t.finished_at")
@@ -85,8 +78,8 @@ class TimerController:
blob += "<header>Automatic Timers</header>\n" blob += "<header>Automatic Timers</header>\n"
blob += self.worldboss.getWBTimer() blob += self.worldboss.getWBTimer()
x: TimerObj = None x: TimerObj = None
count += len([x for x in self.worldboss.timer_data if (x.time+x.get_respawn_timer()) < x.getTime()]) count += len([x for x in self.worldboss.timer_data if (x.time+x.get_respawn_timer()) > x.getTime()])
blob += "\n\n<header>Manual Timers</header>\n" blob += "\n<header>Manual Timers</header>\n"
for timer in data: for timer in data:
repeats = "" repeats = ""
if timer.repeating_every > 0: if timer.repeating_every > 0: