From b6b59ef740575e019c52520077f09d1f93ff798e Mon Sep 17 00:00:00 2001 From: Minidodo Date: Sat, 25 Jun 2022 13:02:26 +0200 Subject: [PATCH] Fixed "should spawn" timers fixed the timer count in !timers reimplemented !wb --- core/igncore.py | 2 +- modules/orgbot/org/org_roster_controller.py | 3 + modules/standard/news/worldboss_controller.py | 129 +++++++----------- modules/standard/timers/timer_controller.py | 11 +- 4 files changed, 57 insertions(+), 88 deletions(-) diff --git a/core/igncore.py b/core/igncore.py index f9ee44a..87ac610 100644 --- a/core/igncore.py +++ b/core/igncore.py @@ -48,7 +48,7 @@ class IgnCore: self.last_timer_event = 0 self.start_time = int(time.time()) self.major_version = "IGNCore v2.9" - self.minor_version = "5" + self.minor_version = "6" self.incoming_queue = FifoQueue() self.mass_message_queue = None self.conns = DictObject() diff --git a/modules/orgbot/org/org_roster_controller.py b/modules/orgbot/org/org_roster_controller.py index b9b6774..d42f267 100644 --- a/modules/orgbot/org/org_roster_controller.py +++ b/modules/orgbot/org/org_roster_controller.py @@ -204,6 +204,9 @@ class OrgRosterController: if not ext_msg: self.logger.error(f"--UKN-- {_} -- {event_data}") 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: log = True self.process_org_msg(ext_msg.params[0], self.MODE_REM_MANUAL, ext_msg) diff --git a/modules/standard/news/worldboss_controller.py b/modules/standard/news/worldboss_controller.py index 2c18085..aa94c31 100644 --- a/modules/standard/news/worldboss_controller.py +++ b/modules/standard/news/worldboss_controller.py @@ -65,8 +65,10 @@ class TimerObj: return 3 * 60 * 60 elif self.name in ["T.A.M.", "Zaal The Immortal"]: return 6 * 60 * 60 - elif self.name in ["Abmouth Indomitus"]: - return 0 + # elif self.name in ["Abmouth Indomitus"]: + # return 0 + # No respawn timer? + return 0 @instance() @@ -93,20 +95,24 @@ class WorldBossController: self.setting_service.register(self.module_name, 'timer_spam', False, BooleanSettingType(), "should timers be spammed") 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("reaper", "wb reaper") - def spam_timer(self, time, mob, msg): + def spam_timer(self, time, mob, msg, next=None): 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"{mob.name} should spawn soon.") + self.jobs[mob.name] = i @event(WebsocketRelayController.WS_RELAY, "save most current local_timers") def get_timer(self, _, data): # print(data) if data.type != "timer": return - local = {} for x in data.payload: found = False for y in self.timer_data: @@ -115,17 +121,15 @@ class WorldBossController: found = True if not found: self.timer_data.append(TimerObj(x)) - # print("-"*50) for x in self.timer_data: x: TimerObj - # print(x.__str__()) if x.alive_immortal(True): x.spam = x.getTime() job = self.jobs.pop(x.name, None) if job: self.job_scheduler.cancel_job(job) self.send_warn(f"{x.name} has spawned.") - i = self.job_scheduler.scheduled_job(self.spam_timer, x.time-1, mob=x.name, msg=f"{x.name} is now mortal.") + i = self.job_scheduler.scheduled_job(self.spam_timer, x.time-1, mob=x, msg=f"{x.name} is now mortal.", next="spawn") self.jobs[x.name] = i elif x.alive_mortal(True): x.spam = x.getTime() @@ -134,9 +138,12 @@ class WorldBossController: self.job_scheduler.cancel_job(job) self.send_warn(f"{x.name} is now mortal.") 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"{x.name} should spawn soon.") + i = self.job_scheduler.scheduled_job(self.spam_timer, x.time+x.get_respawn_timer(), mob=x, msg=f"{x.name} should spawn soon.") 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"{x.name} should spawn soon.") + self.jobs[x.name] = i def send_warn(self, msg): self.relay_hub.send_message("timers", None, f"[WB] {msg}", f"[WB] {msg}") @@ -147,81 +154,47 @@ class WorldBossController: return duration - alert - 1 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)], description="Displays the next worldboss spawns", access_level="member") def show_worldboss(self, request, boss: str): - return ChatBlob("Next Worldboss spawns", self.getWBTimer()) - - @command(command="wb", params=[Const("settings")], - description="Worldboss Settings", access_level="moderator", sub_command="mod") - def wb_settings_cmd(self, request, boss: str): - 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"{timer.name} :: mortal in {self.util.format_time(timer.time-timer.spawn)}" - elif timer.time < timer.getTime(): - rt = timer.get_respawn_timer() - - return f"{timer.name} :: spawn in {self.util.format_time(timer.time + timer.get_respawn_timer())}" + if boss: + boss = self.getWorldbossName(boss) + if boss: + return self.getWBTimer(boss) + return ChatBlob("Next Worldboss spawns", ""+self.getWBTimer()) def getWBTimer(self, name=None) -> Union[TimerObj, list[TimerObj]]: if not name: blob = "" - for x in self.timer_data: - x: TimerObj - if x.alive_immortal(): - blob += f" {x.name} :: 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" {x.name} :: should have spawned {self.util.format_time(abs(x.getTime() - (x.time + rt)))} ago\n" - continue - blob += f" {x.name} :: spawn in {self.util.format_time(x.time + rt - x.getTime())}\n" + for x in sorted(self.timer_data, key=lambda y: y.name): + msg = self.formatMessage(x) + blob += (msg + "\n") if msg else "" return blob for x in self.timer_data: if x.name == name: - return x - - 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"{timer.name} :: is now mortal") - # self.jobs = [x for x in self.jobs if x['name'] != timer.name] - # elif timer.type == "spawn": - # self.send_warn(f"{timer.name} :: 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"{timer.name} :: mortal in {self.util.format_time(timer.time)}") - # elif timer.type == "spawn": - # if alert_duration > 60 * 2: - # self.send_warn( - # f"{timer.name} :: 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]']) + return self.formatMessage(x).strip() + def formatMessage(self, x: TimerObj): + if x.alive_immortal(): + return f" {x.name} :: 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" {x.name} :: should have spawned {self.util.format_time(abs(x.getTime() - (x.time + rt)))} ago" + return f" {x.name} :: spawn in {self.util.format_time(x.time + rt - x.getTime())}" diff --git a/modules/standard/timers/timer_controller.py b/modules/standard/timers/timer_controller.py index ef840aa..478c27b 100644 --- a/modules/standard/timers/timer_controller.py +++ b/modules/standard/timers/timer_controller.py @@ -70,13 +70,6 @@ class TimerController: t = int(time.time()) count = 0 - def getmsg(message): - message = "" + 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 " "LEFT JOIN player p ON t.char_id = p.char_id " "ORDER BY t.finished_at") @@ -85,8 +78,8 @@ class TimerController: blob += "
Automatic Timers
\n" blob += self.worldboss.getWBTimer() x: TimerObj = None - count += len([x for x in self.worldboss.timer_data if (x.time+x.get_respawn_timer()) < x.getTime()]) - blob += "\n\n
Manual Timers
\n" + count += len([x for x in self.worldboss.timer_data if (x.time+x.get_respawn_timer()) > x.getTime()]) + blob += "\n
Manual Timers
\n" for timer in data: repeats = "" if timer.repeating_every > 0: