import re from core.command_param_types import Const, Options, Int, Any, Time from core.db import DB from core.decorators import command, instance, setting from core.setting_types import TimeSettingType from core.igncore import Tyrbot from modules.standard.loot.auction_strategy.auction_strategy import AuctionStrategy @instance() class AuctionController: def __init__(self): # noinspection PyTypeChecker self.auction: AuctionStrategy = None self.prepared = [] def inject(self, registry): self.db: DB = registry.get_instance("db") self.bot: Tyrbot = registry.get_instance("bot") def pre_start(self): self.db.shared.exec("CREATE TABLE IF NOT EXISTS auction_log (" "auction_id INT PRIMARY KEY AUTO_INCREMENT, " "item_ref VARCHAR(255) NOT NULL, " "item_name VARCHAR(255) NOT NULL, " "winner_id BIGINT NOT NULL, " "auctioneer_id BIGINT NOT NULL, " "time INT NOT NULL, " "winning_bid INT NOT NULL, " "second_highest_bid INT NOT NULL)") self.db.create_view("auction_log") @setting(name="auction_length", value="90s", description="Regular auction length in seconds") def auction_length(self): return TimeSettingType() @setting(name="auction_announce_interval", value="15s", description="Auction announce interval") def auction_announce_interval(self): return TimeSettingType() @command(command="auction", params=[], description="Show auction status", access_level="guest") def auction_cmd(self, _): if not self.is_auction_running(): return "No auction running." return self.auction.get_auction_list() @command(command="auction", params=[Const("prepare"), Const("clear")], description="Clear the list of prepared items", access_level="moderator", sub_command="modify") def auction_prepare_clear(self, _, _1, _2): self.prepared = [] return "The List has been cleared. Currently there are no prepared items." @command(command="auction", params=[Const("prepare"), Any("items")], description="Prepare items for an auction", access_level="moderator", sub_command="modify") def auction_prepare(self, _, _1, items): items = items.replace("'", '"') items2 = re.findall(r"(([^<]+)?([^<]+)([^<]+)?)", items) if items2: for item in items2: self.prepared.append(item) else: self.prepared.append(items) prep = "" for item in self.prepared: if prep == "": if isinstance(item, tuple): prep = item[0] else: prep = item else: if isinstance(item, tuple): prep += ", " + item[0] else: prep += ", " + item return "Currently prepared items: " + prep @command(command="auction", params=[Const("start"), Time("duration", is_optional=True)], description="Start an auction, with the items added by auction prepare", access_level="moderator", sub_command="modify") def auction_start_cmd(self, request, _, duration): if self.is_auction_running(): return "Auction already running." if not self.prepared: return "You prepared no items" self.auction = AuctionStrategy() for item in self.prepared: if isinstance(item, tuple): self.auction.add_item(item[0]) else: self.auction.add_item(item) self.prepared = [] auction_length = duration or self.auction_length().get_value() announce_interval = self.auction_announce_interval().get_value() return self.auction.start(request.sender, auction_length, announce_interval) @command(command="auction", params=[Options(["cancel"])], description="Cancel ongoing auction", access_level="moderator", sub_command="modify") def auction_cancel_cmd(self, request, _): if not self.is_auction_running(): return "No auction running." result = self.auction.cancel(request.sender) self.auction = None return result @command(command="auction", params=[Options(["end"])], description="end ongoing auction", access_level="moderator", sub_command="modify") def auction_cancel_cmd(self, request, _): if not self.is_auction_running(): return "No auction running." result = self.auction.cancel(request.sender) self.auction = None return result @command(command="auction", params=[Const("bid"), Int("amount", is_optional=True), Const("all", is_optional=True), Int("item_index", is_optional=True)], description="Bid on an item", access_level="guest") def auction_bid_cmd(self, request, _, amount, all_amount, item_index): if not self.is_auction_running(): return "No auction running." self.bot.send_mass_message(request.sender.char_id, self.auction.add_bid(request.sender, all_amount or amount, item_index, request)) def is_auction_running(self): return self.auction and self.auction.is_running