?selling now groups items sold at the same shop together.
parent
930d9bbd8c
commit
2dab55ab78
|
@ -176,12 +176,15 @@ class Commands:
|
||||||
session = self.interface.database.Session()
|
session = self.interface.database.Session()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
shop_list = self.interface.find_shop_selling_item(session, item_name)
|
shop_list = self.interface.find_top_shops_selling_item(session, item_name)
|
||||||
|
|
||||||
if len(shop_list) == 0:
|
if len(shop_list) == 0:
|
||||||
raise ItemNotFound
|
raise ItemNotFound
|
||||||
|
|
||||||
shop_list_str = list_to_string(shop_list)
|
shop_list_str = ""
|
||||||
|
for shop in shop_list:
|
||||||
|
shop_list_str = shop_list_str + shop[0].selling_str() + list_to_string(
|
||||||
|
self.interface.get_inventory_matches(session, shop[0], item_name)) + '\n\n'
|
||||||
finally:
|
finally:
|
||||||
session.close()
|
session.close()
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
from sqlalchemy import func
|
||||||
from geoffrey.DatabaseModels import *
|
from geoffrey.DatabaseModels import *
|
||||||
|
|
||||||
|
|
||||||
|
@ -106,6 +107,24 @@ class DatabaseInterface:
|
||||||
def find_shop_selling_item(self, session, item_name):
|
def find_shop_selling_item(self, session, item_name):
|
||||||
return self.find_item(session, item_name)
|
return self.find_item(session, item_name)
|
||||||
|
|
||||||
|
def find_top_shops_selling_item(self, session, item_name):
|
||||||
|
expr = ItemListing.name.ilike('%{}%'.format(item_name))
|
||||||
|
result = session.query(func.min(ItemListing.normalized_price), ItemListing.shop_id).group_by(
|
||||||
|
ItemListing.shop_id).filter(expr).order_by(func.min(ItemListing.normalized_price)).all()
|
||||||
|
|
||||||
|
shop_list = []
|
||||||
|
|
||||||
|
for item in result:
|
||||||
|
expr = Shop.shop_id == item[1]
|
||||||
|
shop = self.database.query_by_filter(session, Shop, expr, limit=10)
|
||||||
|
shop_list.append(shop)
|
||||||
|
|
||||||
|
return shop_list
|
||||||
|
|
||||||
|
def get_inventory_matches(self, session, shop, item_name):
|
||||||
|
expr = (ItemListing.shop_id == shop.id) & (ItemListing.name.ilike('%{}%'.format(item_name)))
|
||||||
|
return self.database.query_by_filter(session, ItemListing, expr, limit=5, sort=ItemListing.normalized_price)
|
||||||
|
|
||||||
def find_player(self, session, player_name):
|
def find_player(self, session, player_name):
|
||||||
expr = Player.name.ilike(player_name)
|
expr = Player.name.ilike(player_name)
|
||||||
|
|
||||||
|
|
|
@ -267,6 +267,9 @@ class Shop(Location):
|
||||||
def full_str(self, bot_config):
|
def full_str(self, bot_config):
|
||||||
return Location.full_str(self, bot_config) + self.inv_to_str()
|
return Location.full_str(self, bot_config) + self.inv_to_str()
|
||||||
|
|
||||||
|
def selling_str(self):
|
||||||
|
return "**{}** @ {}, Owner: **{}**".format(self.name, self.pos_to_str(), self.owner.name)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return Location.__str__(self)
|
return Location.__str__(self)
|
||||||
|
|
||||||
|
@ -303,4 +306,4 @@ class ItemListing(SQL_Base):
|
||||||
return '**{}** **{}** for **{}D**'.format(self.amount, self.name, self.price)
|
return '**{}** **{}** for **{}D**'.format(self.amount, self.name, self.price)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '**{}** @ {}, selling {}'.format(self.shop.name, self.shop.pos_to_str(), self.listing_str())
|
return self.listing_str()
|
||||||
|
|
|
@ -172,10 +172,13 @@ class TestCommands(TestCase):
|
||||||
|
|
||||||
result = self.commands.selling('cool')
|
result = self.commands.selling('cool')
|
||||||
|
|
||||||
|
print(result)
|
||||||
|
'''
|
||||||
if 'cool' in result:
|
if 'cool' in result:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
self.fail()
|
self.fail()
|
||||||
|
'''
|
||||||
|
|
||||||
def test_info(self):
|
def test_info(self):
|
||||||
self.commands.register(zerohd, '143072699567177728')
|
self.commands.register(zerohd, '143072699567177728')
|
||||||
|
|
|
@ -22,6 +22,20 @@ class TestGeoffreyDatabase(TestCase):
|
||||||
self.session.commit()
|
self.session.commit()
|
||||||
self.session.close()
|
self.session.close()
|
||||||
|
|
||||||
|
def test_find_top_shops_selling_items(self):
|
||||||
|
owner = self.add_player()
|
||||||
|
self.add_shop(owner)
|
||||||
|
self.interface.add_item(self.session, owner, 'test', 'dirt', 1, 15)
|
||||||
|
self.interface.add_item(self.session, owner, 'test', 'dirt', 1, 5)
|
||||||
|
self.interface.add_loc(self.session, owner, 'test2', 1, 3, "nether", loc_type=Shop)
|
||||||
|
self.interface.add_item(self.session, owner, 'test2', 'dirt', 1, 5)
|
||||||
|
shop_list = self.interface.find_top_shops_selling_item(self.session, "Dirt")
|
||||||
|
|
||||||
|
for shop in shop_list:
|
||||||
|
item_list = self.interface.get_inventory_matches(self.session, shop[0], "dirt")
|
||||||
|
print(item_list)
|
||||||
|
|
||||||
|
|
||||||
def add_shop(self, player):
|
def add_shop(self, player):
|
||||||
shop = self.interface.add_loc(self.session, player, 'test', 1, 3, "nether", loc_type=Shop)
|
shop = self.interface.add_loc(self.session, player, 'test', 1, 3, "nether", loc_type=Shop)
|
||||||
return shop
|
return shop
|
||||||
|
|
Loading…
Reference in New Issue