Initial Release of IGNCore version 2.5
This commit is contained in:
@@ -0,0 +1,139 @@
|
||||
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.tyrbot 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"(([^<]+)?<a href=[\"\']itemref://(\d+)/(\d+)/(\d+)[\"\']>([^<]+)</a>([^<]+)?)", 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
|
||||
Reference in New Issue
Block a user