Fix for hidden settings & tower messages

This commit is contained in:
2021-09-04 18:07:12 +02:00
parent 3c8eb7bb70
commit 10df6c3d26
8 changed files with 66 additions and 29 deletions
@@ -2,11 +2,12 @@ import time
from core.chat_blob import ChatBlob
from core.command_param_types import Const, Int, NamedParameters
from core.decorators import instance, command, event
from core.decorators import instance, command, event, setting
from core.job_scheduler import JobScheduler
from core.logger import Logger
from core.public_channel_service import PublicChannelService
from core.setting_service import SettingService
from core.setting_types import BooleanSettingType
from core.text import Text
from core.igncore import Tyrbot
from modules.core.accounting.services.account_service import AccountService
@@ -14,6 +15,9 @@ from modules.raidbot.tower.tower_controller import TowerController
from modules.raidbot.tower.tower_service import TowerService
from modules.standard.helpbot.playfield_controller import PlayfieldController
# TODO: This module should get split again in the future, allowing tower-tracking in orgbots, or other types.
#
@instance()
class TowerAttackController:
@@ -144,9 +148,9 @@ class TowerAttackController:
blob += " " + self.format_timestamp(row.created_at, t)
blob += "\n"
return ChatBlob("Battle Info %d" % battle_id, blob)
return ChatBlob(f"Battle Info {battle_id}", blob)
@event(event_type=TowerController.TOWER_ATTACK_EVENT, description="Warn on Tower attacks", is_hidden=True)
@event(event_type=TowerController.TOWER_ATTACK_EVENT, description="Create logentries for tower attacks", is_hidden=True)
def tower_attack_event(self, _, event_data):
t = int(time.time())
site_number = self.find_closest_site_number(event_data.location.playfield.id, event_data.location.x_coord,
@@ -167,8 +171,15 @@ class TowerAttackController:
attacker.get("ai_level", 0), attacker.get("profession", ""), event_data.location.x_coord,
event_data.location.y_coord, 0, battle.id, t])
@event(event_type=TowerController.TOWER_ATTACK_EVENT, description="Notify Tower attacks on own org")
@setting(name="tower_notify_type", value=False, description="Only notify when our orgs are involved")
def tower_notify_type(self) -> BooleanSettingType:
return BooleanSettingType()
@event(event_type=TowerController.TOWER_ATTACK_EVENT, description="Notify whenever a tower attack happens")
def tower_def_event(self, _, event_data):
if self.tower_notify_type().get_value():
if not (event_data.attacker.get("org_name", None) in self.account_service.get_org_names() or event_data.defender.org_name in self.account_service.get_org_names()):
return
if event_data.attacker.get("name", None) is not None:
field_id = self.find_closest_site_number(event_data.location.playfield.id, event_data.location.x_coord,
event_data.location.y_coord)
@@ -176,12 +187,12 @@ class TowerAttackController:
"SELECT t.*, p.short_name, p.long_name FROM tower_site t "
"JOIN playfields p ON t.playfield_id = p.id WHERE t.playfield_id = ? AND site_number = ?",
[event_data.location.playfield.id, field_id])
lca = self.text.format_page("%s - %d" % (event_data.location.playfield.long_name, field_id),
lca = self.text.format_page(f"{event_data.location.playfield.long_name} - {field_id:d}",
self.tower.format_site_info(row))
attacker = self.text.format_char_info(event_data.attacker)
add = ""
if account := self.account_service.get_account(event_data.attacker.char_id):
if account.disabled == 0 and account.member != 0:
if self.account_service.simple_checks(account):
add = " :: <red>He's a <myname> Raider!</red>"
self.bot.send_private_channel_message(
f"[<cyan>NW</cyan>] "
@@ -235,12 +246,11 @@ class TowerAttackController:
raise Exception("Unknown victory event type: '%s'" % event_data.type)
def format_attacker(self, row):
level = ("%d/<green>%d</green>" % (
row.att_level, row.att_ai_level)) if row.att_ai_level > 0 else "%d" % row.att_level
level = f"{row.att_level}/<green>{row.att_ai_level}</green>" if row.att_ai_level > 0 else f"{row.att_level}"
org = row.att_org_name + " " if row.att_org_name else ""
victor = " - <notice>Winner!</notice>" if row.is_victory else ""
return "%s (%s %s) %s(%s)%s" % (
row.att_char_name or "Unknown attacker", level, row.att_profession, org, row.att_faction, victor)
return f"{row.att_char_name or 'Unknown attacker'} ({level} {row.att_profession})" \
f" {org}({row.att_faction}){victor}"
def find_closest_site_number(self, playfield_id, x_coord, y_coord):
# noinspection SqlUnused
@@ -301,8 +311,7 @@ class TowerAttackController:
"INSERT INTO tower_battle (playfield_id, site_number, def_org_name, def_faction, "
"is_finished, battle_type, last_updated) VALUES (?, ?, ?, ?, ?, ?, ?)",
[playfield_id, site_number, org_name, faction, is_finished, battle_type, t])
time.sleep(0.5)
return self.db.query_single("SELECT * FROM tower_battle WHERE id = ?", [self.db.last_insert_id()])
return self.db.query_single(sql, [playfield_id, site_number, is_finished, org_name, faction, last_updated])
def get_last_attack(self, att_faction, att_org_name, def_faction, def_org_name, playfield_id, t):
last_updated = t - (8 * 3600)