diff --git a/core/igncore.py b/core/igncore.py
index a8b95d0..f133896 100644
--- a/core/igncore.py
+++ b/core/igncore.py
@@ -42,7 +42,7 @@ class IgnCore:
self.last_timer_event = 0
self.start_time = int(time.time())
self.major_version = "IGNCore v2.6"
- self.minor_version = "4"
+ self.minor_version = "5"
self.incoming_queue = FifoQueue()
self.mass_message_queue = None
self.conns = DictObject()
diff --git a/modules/core/accounting/account_controller.py b/modules/core/accounting/account_controller.py
index 4f7d186..a02a921 100644
--- a/modules/core/accounting/account_controller.py
+++ b/modules/core/accounting/account_controller.py
@@ -51,12 +51,12 @@ class AccountController:
if main != entry.main:
main = entry.main
out += f"\n<{entry.faction.lower()}>{entry.name}{entry.faction.lower()}>: " \
- f"[{self.text.make_tellcmd('D', f'account {entry.name}')}]\n"
+ f"[{self.text.make_tellcmd('D', f'account {entry.name}')}]"
main_name = entry.name
- n = f"N" if entry.last_seen == 0 else ""
- out += f" {self.util.get_prof_icon(entry.profession)}" \
- f" {self.text.zfill(entry.level, 220)}/{self.text.zfill(entry.ai_level, 30)} " \
- f"<{entry.faction.lower()}>{entry.name}{entry.faction.lower()}> {n}\n"
+ # n = f"N" if entry.last_seen == 0 else ""
+ # out += f" {self.util.get_prof_icon(entry.profession)}" \
+ # f" {self.text.zfill(entry.level, 220)}/{self.text.zfill(entry.ai_level, 30)} " \
+ # f"<{entry.faction.lower()}>{entry.name}{entry.faction.lower()}> {n}\n"
entries.append([main_name, out])
out = ""
msg = sorted(entries, key=lambda k: k[0])
@@ -81,12 +81,20 @@ class AccountController:
@command(command="account", params=[Const("add"), Character("char")],
access_level="moderator",
- sub_command="moderate", description="Create a new account for given character")
+ sub_command="moderate", description="Create a new account for given character",
+ extended_description="Potentially breaks in bots using a database generated by an onlinebot. "
+ "Use with extreme caution.")
def add_account(self, request: command_request, _, user):
if not user.char_id:
return f"Character {user.name} not found."
if self.account_service.get_account(user.char_id):
+ # Unban the account, if banned
self.account_service.account_enable(user.char_id)
+ # set the memberstatus to 0
+ # (-1 is no member,
+ # 0 is member,
+ # any number above 0 indicates that its an org_member of the same ID)
+ self.account_service.account_add_member(user.char_id)
self.buddy_service.add_buddy(user.char_id, "member")
self.account_service.add_log(request.sender.char_id, "system",
f"Opened Account for {user.name}.",
@@ -230,7 +238,7 @@ class AccountController:
if not mod:
response += f" Options: {prefs}\n"
response += f" Points: {alts[0].points}\n"
- access_levels = {"Member": self.account_service.check_member(alts[0].char_id),
+ access_levels = {f"Member ({alts[0].member})": self.account_service.check_member(alts[0].char_id),
"Officer": self.account_service.check_officer(alts[0].char_id),
"General": self.account_service.check_general(alts[0].char_id),
"President": self.account_service.check_president(alts[0].char_id),
diff --git a/modules/core/accounting/services/account_service.py b/modules/core/accounting/services/account_service.py
index fefd7c3..233cde4 100644
--- a/modules/core/accounting/services/account_service.py
+++ b/modules/core/accounting/services/account_service.py
@@ -155,7 +155,7 @@ class AccountService:
def get_alts(self, char_id) -> List[DictObject]:
return self.db.query(
"SELECT p.*, a.* from account a left join player p on a.char_id = p.char_id where "
- "main=(SELECT main from account where char_id=?) ORDER BY a.main = a.char_id desc, p.level, p.name DESC",
+ "main=(SELECT main from account where char_id=?) ORDER BY a.main = a.char_id desc, p.level desc, p.name DESC",
[char_id])
acc_cache = {}
@@ -377,6 +377,11 @@ class AccountService:
"UPDATE account set disabled=0 where main in (SELECT main from account where char_id=?)",
[char_id]) else False
+ def account_add_member(self, char_id) -> bool:
+ return True if self.db.exec(
+ "UPDATE account set member=0 where main in (SELECT main from account where char_id=?)",
+ [char_id]) else False
+
def remove_members(self, users) -> None:
if type(users) == list and len(users) > 0:
with self.db.pool.get_connection() as conn:
diff --git a/modules/orgbot/alliance/alliance_relay.py b/modules/orgbot/alliance/alliance_relay.py
index 739ba28..53b59ee 100644
--- a/modules/orgbot/alliance/alliance_relay.py
+++ b/modules/orgbot/alliance/alliance_relay.py
@@ -337,6 +337,10 @@ class AllianceRelay:
if not message:
return
org, name, text = message.groups()
+ org = org.strip()
+ name = name.strip()
+ text = text.strip()
+
plain = f"[{org}] {name}: {text}"
org = self.format_text(self.relay_color_org().get_value().get(priv, self.relay_color_org().get_value().get("default")), org)
name = self.format_text(self.relay_color_sender().get_value().get(priv, self.relay_color_sender().get_value().get("default")), name)
diff --git a/modules/raidbot/raid/raidbot_controller.py b/modules/raidbot/raid/raidbot_controller.py
index d1e6c96..c792aa8 100644
--- a/modules/raidbot/raid/raidbot_controller.py
+++ b/modules/raidbot/raid/raidbot_controller.py
@@ -458,7 +458,6 @@ class RaidbotController(BaseModule):
self.raid = None
self.leader.set_raid_leader(self.leader.leader, None)
- self.event_service.fire_event("RAID_ENDED")
return "Raid has ended, logs got saved. Raidleader cleared."
else:
diff --git a/modules/raidbot/tower/tower_attack_controller.py b/modules/raidbot/tower/tower_attack_controller.py
index 484f61d..b6d4964 100644
--- a/modules/raidbot/tower/tower_attack_controller.py
+++ b/modules/raidbot/tower/tower_attack_controller.py
@@ -346,17 +346,17 @@ class TowerAttackController:
def format_battle_info(self, row, t):
blob = ""
defeated = " - Defeated!" if row.is_finished else ""
- blob += "Site: %s %s\n" % (row.short_name, row.site_number or "?")
- blob += "Defender: %s (%s)%s\n" % (row.def_org_name, row.def_faction, defeated)
- blob += "Last Activity: %s\n" % self.format_timestamp(row.last_updated, t)
+ blob += f"Site: {row.short_name} {row.site_number or '?'}\n"
+ blob += f"Defender: {row.def_org_name} ({row.def_faction}){defeated}\n"
+ blob += f"Last Activity: {self.format_timestamp(row.last_updated, t)}\n"
return blob
def format_timestamp(self, t, current_t):
- return "%s (%s ago)" % (
- self.util.format_datetime(t), self.util.time_to_readable(current_t - t))
+ return f"{self.util.format_datetime(t)} " \
+ f"({self.util.time_to_readable(current_t - t)} ago)"
def get_chat_command(self, page):
- return "/tell attacks --page=%d" % page
+ return f"/tell attacks --page={page}"
def check_for_all_towers_channel(self):
if not self.public_channel_service.get_channel_name(TowerController.ALL_TOWERS_ID):
diff --git a/modules/raidbot/tower/tower_service.py b/modules/raidbot/tower/tower_service.py
index 4faa744..29793fa 100644
--- a/modules/raidbot/tower/tower_service.py
+++ b/modules/raidbot/tower/tower_service.py
@@ -1,17 +1,12 @@
-import sys
import time
-from mysql.connector.cursor import CursorBase
-from requests import Session
-
-from conf.config import BotConfig
from core.aochat.BaseModule import BaseModule
from core.db import DB
-from core.decorators import instance, timerevent, event, setting
+from core.decorators import instance, event, setting
+from core.igncore import IgnCore
from core.job_scheduler import JobScheduler
from core.setting_types import BooleanSettingType
from core.text import Text
-from core.igncore import IgnCore
from core.util import Util
from modules.core.accounting.services.account_service import AccountService
from modules.raidbot.tower.tower_controller import TowerController
@@ -34,13 +29,6 @@ class TowerService(BaseModule):
self.job_scheduler: JobScheduler = registry.get_instance("job_scheduler")
self.account_service: AccountService = registry.get_instance("account_service")
- mod = __import__(f'conf.{sys.argv[1]}', fromlist=['BotConfig'])
- config: BotConfig = getattr(mod, 'BotConfig')
- if hasattr(config, "tower_url"):
- self.tower_url = config.tower_url
- else:
- self.tower_url = None
-
def pre_start(self):
self.db.shared.exec("CREATE TABLE IF NOT EXISTS towers("
"pf_id int not null, "
@@ -90,6 +78,9 @@ class TowerService(BaseModule):
self.prepare_nw_warn(row.pf_id, row.site)
elif event_data.type == "terminated":
+ # DEBUG: terminated sites.. behave strange.
+ # for that reason, we'll just output these events to the console, but not the log.
+ print(event_data)
field = self.db.query("SELECT * FROM towers t where t.org_name=? and t.pf_id=?",
[event_data.loser.org_name, event_data.playfield.id])
if len(field) == 1:
@@ -115,57 +106,6 @@ class TowerService(BaseModule):
self.prepare_nw_warn(event_data.playfield.id, "(UKN)",
f"(UKN) PO: {event_data.loser.org_name}|{event_data.loser.faction}")
- @timerevent(budatime="4h", description="fetch the towerAPI cache", is_enabled=False)
- def fetch_tower_update(self, _1, _2):
- if self.tower_url:
- #
- # ONLY Access the API's via Tor... Tyrence is shadow-banning every IP Subnet
- # accessing it multiple times/hour whenever the limit parameter is being used....
- # ?limit is a parameter not documented anywhere, but allows pulling the whole list
- # On other API implementations this parameter has no effect,
- # as the server always responds with the full list.
-
- # In the Future, this Event will get moved to an external process,
- # which maintains the tower Cache for all connected bots,
- # like it has been done with the Worldboss timers.
- from torpy.http.requests import TorRequests
- with TorRequests() as tor_request:
- with tor_request.get_session(1) as session:
- session: Session
- r = session.get(self.tower_url)
- if not r:
- return
- if data := r.json()["results"]:
- blob = []
- for row in data:
- blob.append((row["playfield_id"], row["site_number"], row["ql"],
- row["x_coord"], row["y_coord"],
- row["org_id"], row['org_name'], row['faction'],
- row["close_time"], row["created_at"],
- row["enabled"]))
-
- with self.db.lock:
- with self.db.pool.get_connection() as conn:
- with conn.cursor(dictionary=True) as cur:
- cur: CursorBase
- cur.executemany(
- "INSERT INTO towers (pf_id, site_number, "
- "ql, x_coord, y_coord, org_id, org_name, "
- "faction, close_time, planted, enabled) "
- "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE "
- "org_id=VALUE(org_id), "
- "org_name=VALUE(org_name), "
- "faction=VALUE(faction), "
- "close_time=VALUE(close_time),"
- "ql=VALUE(ql),"
- "planted=VALUE(planted) ", blob)
- rem = []
- for key, value in enumerate(sorted(self.attack_hot, key=lambda k: k['hot'])):
- if value['hot'] < time.time():
- rem.append(key)
- for key in reversed(rem):
- self.attack_hot.pop(key)
-
def day_time(self, day_t):
if day_t > 86400:
day_t -= 86400
diff --git a/modules/standard/loot/loot_lists_controller.py b/modules/standard/loot/loot_lists_controller.py
index 951ef75..5115d35 100644
--- a/modules/standard/loot/loot_lists_controller.py
+++ b/modules/standard/loot/loot_lists_controller.py
@@ -99,6 +99,9 @@ class LootListsController:
self.command_alias_service.add_alias("taurus", "pande taurus")
self.command_alias_service.add_alias("sagittarius", "pande sagittarius")
self.command_alias_service.add_alias("tnh", "pande tnh")
+ self.command_alias_service.add_alias("barmor", "pande barmor")
+ self.command_alias_service.add_alias("bstars", "pande bstars")
+ self.command_alias_service.add_alias("bweapons", "pande bweapons")
self.command_alias_service.add_alias("s7", "apf s7")
self.command_alias_service.add_alias("s13", "apf s13")
@@ -138,9 +141,9 @@ class LootListsController:
items = self.get_items("APF", category)
if items:
- return ChatBlob("%s loot table" % category, self.build_list(items, "APF", category, add_all))
+ return ChatBlob(f"{category} loot table", self.build_list(items, "APF", category, add_all))
else:
- return "No loot registered for %s." % category
+ return f"No loot registered for {category}."
@command(command="apf", params=[], description="Get list of items from APF", access_level="member")
def apf_tables_cmd(self, _):
@@ -162,9 +165,9 @@ class LootListsController:
items = self.get_items("Albtraum", category)
if items:
- return ChatBlob("%s loot table" % category, self.build_list(items, "Albtraum", category))
+ return ChatBlob(f"{category} loot table", self.build_list(items, "Albtraum", category))
else:
- return "No loot registered for %s." % category
+ return f"No loot registered for {category}."
# #
# Pandemonium #
@@ -180,9 +183,9 @@ class LootListsController:
items = self.get_items("Pande", category)
if items:
- return ChatBlob("%s loot table" % category, self.build_list(items, "Pande", category))
+ return ChatBlob(f"{category} loot table", self.build_list(items, "Pande", category))
else:
- return "No loot registered for %s." % category_name
+ return f"No loot registered for {category_name}."
@command(command="pande", params=[], description="Get list of items from Pandemonium", access_level="member")
def pande_tables_cmd(self, _):
@@ -197,9 +200,9 @@ class LootListsController:
category = self.get_real_category_name(category)
items = self.get_items("DustBrigade", category)
if items:
- return ChatBlob("%s loot table" % category, self.build_list(items, "DustBrigade", category))
+ return ChatBlob(f"{category} loot table", self.build_list(items, "DustBrigade", category))
else:
- return "No loot registered for %s." % category
+ return f"No loot registered for {category}."
@command(command="db", params=[], description="Get list of items from DustBrigade", access_level="member")
def db_tables_cmd(self, _):
@@ -222,7 +225,7 @@ class LootListsController:
else:
blob += self.build_list(self.get_items(category, sub), category, sub)
- return ChatBlob("%s loot table" % category, blob)
+ return ChatBlob(f"{category} loot table", blob)
@command(command="xan", params=[], description="Get list of items from Xan", access_level="member")
def xan_tables_cmd(self, _):
@@ -230,14 +233,14 @@ class LootListsController:
raids = ["Mitaar", "Vortexx", "12Man"]
for raid in raids:
- show_loot = self.text.make_chatcmd(
- "Loot table", "/tell xan %s" % self.get_real_category_name(raid, True))
+ show_loot = self.text.make_chatcmd("Loot table",
+ f"/tell xan {self.get_real_category_name(raid, True)}")
sql = "SELECT COUNT(*) AS count FROM raid_loot WHERE raid = ?"
count = self.db.query_single(sql, [raid]).count
- blob += "%s - %s items\n" % (raid, count)
- blob += " └ [%s]\n\n" % show_loot
+ blob += f"{raid} - {count} items\n"
+ blob += f" └ [{show_loot}]\n\n"
return ChatBlob("Xan loot tables", blob)
@@ -250,9 +253,9 @@ class LootListsController:
category = self.get_real_category_name(category_name)
items = self.get_items("Pyramid of Home", category)
if items:
- return ChatBlob("%s loot table" % category, self.build_list(items, "poh", category))
+ return ChatBlob(f"{category} loot table", self.build_list(items, "poh", category))
else:
- return "No loot registered for %s." % category_name
+ return f"No loot registered for {category_name}."
@command(command="poh", params=[], description="Get list of items from Pyramid of Home", access_level="member")
def poh_tables_cmd(self, _):
@@ -270,9 +273,9 @@ class LootListsController:
category = self.get_real_category_name(category_name)
items = self.get_items("Temple of Three Winds (HL)", category)
if items:
- return ChatBlob("%s loot table" % category, self.build_list(items, "totwh", category))
+ return ChatBlob(f"{category} loot table", self.build_list(items, "totwh", category))
else:
- return "No loot registered for %s." % category_name
+ return f"No loot registered for {category_name}."
@command(command="totwh", params=[], description="Get list of items from Temple of Three Winds", access_level="member")
def totwh_tables_cmd(self, _):
@@ -289,9 +292,9 @@ class LootListsController:
category = self.get_real_category_name(category_name)
items = self.get_items("Condemned Subway (HL)", category)
if items:
- return ChatBlob("%s loot table" % category, self.build_list(items, "subh", category))
+ return ChatBlob(f"{category} loot table", self.build_list(items, "subh", category))
else:
- return "No loot registered for %s." % category_name
+ return f"No loot registered for {category_name}."
@command(command="subh", params=[], description="Get list of items from Condemned Subway (HL)",
access_level="member")
@@ -305,13 +308,13 @@ class LootListsController:
raids = self.db.query(sql, [name])
for raid in raids:
show_loot = self.text.make_chatcmd(
- "Loot table", "/tell %s %s" % (cmd, self.get_real_category_name(raid.category, True)))
+ "Loot table", f"/tell {cmd} {self.get_real_category_name(raid.category, True)}")
sql = "SELECT COUNT(*) AS count FROM raid_loot WHERE category = ? and raid=?"
count = self.db.query_single(sql, [raid.category, name]).count
- blob += "%s - %s items\n" % (raid.category, count)
- blob += " └ [%s]\n\n" % show_loot
+ blob += f"{raid.category} - {count} items\n"
+ blob += f" └ [{show_loot}]\n\n"
blob += ""
if not name and not cmd:
raids = [
@@ -347,10 +350,9 @@ class LootListsController:
blob = ""
if add_all:
- blob += "%s items to loot list\n\n" % self.text.make_chatcmd(
- "Add all", f"/tell loot addraid {raid} {category}")
+ blob += f"{self.text.make_chatcmd('Add all', f'/tell loot addraid {raid} {category}')} items to loot list\n\n"
- blob += "%s\n" % category if category is not None else ""
+ blob += f"{category}\n" if category is not None else ""
for item in items:
comment = f" ({item.comment})" if item.comment != "" else ""
diff --git a/modules/standard/raid/assist_controller.py b/modules/standard/raid/assist_controller.py
index 1aa72c0..47df520 100644
--- a/modules/standard/raid/assist_controller.py
+++ b/modules/standard/raid/assist_controller.py
@@ -31,9 +31,9 @@ class AssistController:
def assist_command(self, _):
blob = ""
for caller in self.assist:
- blob += caller
+ blob += caller.capitalize()
blob += f" - [{self.text.make_chatcmd('assist', f'assist {caller}')}]"
- blob += f"[{self.text.make_tellcmd('REM', f'assist del {caller}')}]
"
+ blob += f" [{self.text.make_tellcmd('REM', f'assist del {caller}')}]
"
blob += self.get_assist_output()
self.last_mod = time.time()
return ChatBlob(f"Callers ({len(self.assist)})", blob)
@@ -57,7 +57,7 @@ class AssistController:
return "No assist targets set."
self.last_mod = time.time()
try:
- self.assist.remove(char.name)
+ self.assist.remove(char.name.lower())
return f"{char.name} is no longer a caller. " \
f"Use: {self.get_assist_output()}"
except ValueError:
@@ -73,8 +73,8 @@ class AssistController:
if not self.leader_controller.can_use_command(request.sender.char_id):
return LeaderController.NOT_LEADER_MSG
for caller in targets:
- if caller not in self.assist:
- self.assist.append(caller)
+ if caller.lower() not in self.assist:
+ self.assist.append(caller.lower())
return self.assist_command(request)
def get_assist_output(self):