from core.aochat.BaseModule import BaseModule
from core.chat_blob import ChatBlob
from core.command_alias_service import CommandAliasService
from core.command_param_types import Options, Int, Any, Const, NamedParameters
from core.db import DB
from core.decorators import instance, command
from core.dict_object import DictObject
from core.event_service import EventService
from core.lookup.pork_service import PorkService
from core.public_channel_service import PublicChannelService
from core.text import Text
from core.tyrbot import Tyrbot
from core.util import Util
from modules.raidbot.tower.tower_service import TowerService
from modules.standard.helpbot.playfield_controller import PlayfieldController
@instance()
class TowerHotController(BaseModule):
PAGE_SIZE = 9
# noinspection DuplicatedCode
def inject(self, registry):
self.bot: Tyrbot = registry.get_instance("bot")
self.db: DB = registry.get_instance("db")
self.util: Util = registry.get_instance("util")
self.text: Text = registry.get_instance("text")
self.event_service: EventService = registry.get_instance("event_service")
self.pork_service: PorkService = registry.get_instance("pork_service")
self.playfield_controller: PlayfieldController = registry.get_instance("playfield_controller")
self.public_channel_service: PublicChannelService = registry.get_instance("public_channel_service")
self.towercache: TowerService = registry.get_instance("tower_service")
self.command_alias_service: CommandAliasService = registry.get_instance("command_alias_service")
def pre_start(self):
self.command_alias_service.add_alias('towers', "lc")
self.command_alias_service.add_alias('tower', "lc")
@command(command="hot",
params=[Options(['tl1', 'tl2', 'tl3', 'tl4', 'tl5', 'tl6', 'tl7']), Any('faction', is_optional=True),
NamedParameters(["page"])],
access_level="member",
description="Shows hot playfields")
def hot_tl(self, _, tl, faction: str, named_params):
if faction:
if faction.startswith("--page="):
named_params = DictObject({'page': faction[7:]})
faction = None
if faction is not None and faction.lower() not in ['omni', 'clan', 'neut', 'neutral']:
return f"Unknown faction: {faction}"
tl = tl[2:]
page = int(named_params.page or "1")
offset = (page - 1) * self.PAGE_SIZE
towers = self.towercache.get_towers_hot_tl(int(tl), faction)
return self.text.format_pagination(towers, offset, page, self.formatter, f"Hot Sites TL{tl} ({len(towers)})",
f"There are no hot sites for TL {tl}.",
f'hot tl{tl} {faction or ""}', 9)
def formatter(self, row, _, data):
return self.towercache.format_entry(row, len(data))
@command(command="hot",
params=[Int('level', is_optional=True), Any('faction', is_optional=True), NamedParameters(["page"])],
access_level="member",
description="Shows hot playfields by level")
def hot_level(self, _, level, faction, named_params):
if faction:
if faction.startswith("--page="):
named_params = DictObject({'page': faction[7:]})
faction = None
if faction is not None and faction.lower() not in ['omni', 'clan', 'neut', 'neutral']:
return f"Unknown faction: {faction}"
if level:
if level < 0 | level > 220:
return f"Level out of range: {level}"
page = int(named_params.page or "1")
offset = (page - 1) * self.PAGE_SIZE
towers = self.towercache.get_towers_hot_level(level, faction)
level = f"{level}" if level else ""
faction = f"{faction} " if faction else ""
return self.text.format_pagination(towers, offset, page, self.formatter, f"Hot Towersites ({len(towers)})",
f"There are no hot sites.", f'hot {level}{faction}', 9)
@command(command="free", params=[],
access_level="member",
description="Shows hot playfields by level")
def free(self, _, ):
blob = ""
towers = [x for x in self.towercache.get_free() if x.short_name not in ['AND', 'GTC']]
for row in towers:
blob += self.towercache.format_entry(row, len(towers))
return ChatBlob(f"FREE Towersites ({len(towers)})", blob) if blob else f"No free towersites found."
@command(command="lc", params=[], access_level="member",
description="See a list of land control tower sites in a particular playfield")
def lc(self, _):
hot, cold, unplanted = 0, 0, 0
clan, omni, neut = 0, 0, 0
last_pf = 0
previous = {}
blob = ""
def number(numb):
if numb < 10:
return f"0{numb}"
return numb
for tower in self.towercache.get_towers_all():
if tower.id != last_pf:
if last_pf == 0:
previous = tower
last_pf = tower.id
continue
blob += f"{number(hot)} {number(cold)} {number(unplanted)} :: " \
f"{number(clan)} {number(neut)} {number(omni)} " \
f"[{self.text.make_tellcmd(previous.short_name, f'lc {previous.long_name}')}] " \
f"{previous.long_name}\n"
hot, cold, unplanted = 0, 0, 0
clan, omni, neut = 0, 0, 0
previous = tower
last_pf = tower.id
site = self.towercache.is_hot(tower)
if site == 0:
cold += 1
elif site == -1:
unplanted += 1
elif site == 1:
hot += 1
faction = tower.get('faction', None)
if faction:
faction = faction.lower
if faction == "omni":
omni += 1
elif faction == "clan":
clan += 1
else:
neut += 1
return ChatBlob('All Tower Sites', blob)
@command(command="lc", params=[Const("org"), Any("org_name", is_optional=True)], access_level="member",
description="See a list of land control tower sites in a particular playfield")
def lc_org(self, _, _1, org):
towers = []
try:
org = int(org)
except ValueError:
pass
if type(org) == str:
orgs = self.db.query(
"SELECT * from all_orgs where org_name LIKE ? and org_id in "
"(SELECT org_id from towers group by org_id)",
[f"%{org.replace(' ', '%')}%"])
if len(orgs) == 1:
towers = self.towercache.get_towers_by_org(orgs[0].org_id)
elif len(orgs) == 0:
return "Your search returned no orgs."
else:
blob = "Your search had multiple results; please pick an org:
"
for org in orgs:
blob += "[%s] %s (%s) <%s>%s [%s " \
"members]
" \
% (self.text.make_chatcmd("Towers", "/tell lc org %s" % org.org_id),
org.org_name, org.org_id, org.faction.lower(), org.faction, org.member_count)
return ChatBlob("Pick an Org", blob)
elif type(org) == int:
if len(self.db.query("SELECT org_id from all_orgs where org_id=?", [int(org)])) == 0:
return "Your search returned no orgs."
else:
towers = self.towercache.get_towers_by_org(org)
title = f"Towersites of the org {org}"
blob = ""
for tower in towers:
blob += self.towercache.format_entry(tower, len(towers))
return ChatBlob(title, blob)
@command(command="lc", params=[Any("playfield"), Int("site_number", is_optional=True)], access_level="member",
description="See a list of land control tower sites in a particular playfield")
def lc_playfield(self, _, playfield_name, site_number):
playfield = self.playfield_controller.get_playfield_by_name(playfield_name)
if not playfield:
return "Could not find playfield %s." % playfield_name
if site_number:
title = f"Tower site x{site_number} in {playfield.long_name}"
towers = self.towercache.get_towers_by_pf_site(playfield.id, site_number)
else:
title = f"Tower sites in {playfield.long_name}"
towers = self.towercache.get_towers_by_pf(playfield.id)
blob = ""
for tower in towers:
blob += self.towercache.format_entry(tower, len(towers))
if site_number:
blob += "More to come... stay tuned."
return ChatBlob(title, blob)