From 1783c58e2a7494d74a4a56b232d42f36bca6a2d6 Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Sun, 1 Jul 2018 10:10:10 -0500 Subject: [PATCH] Fixed case sensitivity and added a shopinfo command. (Resolves BackLog entries 1 and 4) --- DatabaseModels.py | 29 ++++++++++++++++++++++++----- Geoffrey.py | 26 +++++++++++++++++++++----- test_geoffreyDatabase.py | 21 ++++++++++++++++++++- 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/DatabaseModels.py b/DatabaseModels.py index 9d374c0..25d8567 100644 --- a/DatabaseModels.py +++ b/DatabaseModels.py @@ -32,9 +32,10 @@ class GeoffreyDatabase: def add_item(self, player_name, shop_name, item_name, price): try: - shop = self.find_location_by_name_and_owner(player_name, shop_name) + shop = self.find_shop_by_name_and_owner(player_name, shop_name) item = ItemListing(item_name, price, shop[0]) + self.add_object(item) except IndexError: raise LocationLookUpError @@ -63,11 +64,24 @@ class GeoffreyDatabase: self.session.add(obj) self.session.commit() + def find_location_by_name(self, name): + expr = Location.name.like('%{}%'.format(name)) + return self.query_by_filter(Location, expr) + + def find_shop_by_name(self, name): + expr = Location.name.like('%{}%'.format(name)) + return self.query_by_filter(Shop, expr) + def find_location_by_owner(self, owner_name): player = self.find_player(owner_name) expr = Location.owner == player return self.query_by_filter(Location, expr) + def find_shop_by_name_and_owner(self, owner_name, name): + player = self.find_player(owner_name) + expr = (Shop.owner == player) & (Shop.name == name) + return self.query_by_filter(Shop, expr) + def find_location_by_name_and_owner(self, owner_name, name): player = self.find_player(owner_name) expr = (Location.owner == player) & (Location.name == name) @@ -80,7 +94,7 @@ class GeoffreyDatabase: return self.query_by_filter(Location, expr) def find_item(self, item_name): - expr = ItemListing.name == item_name + expr = ItemListing.name.like(item_name) return self.query_by_filter(ItemListing, expr) def find_shop_selling_item(self, item_name): @@ -93,7 +107,7 @@ class GeoffreyDatabase: return shops def find_player(self, player_name): - expr = func.lower(Player.name) == func.lower(player_name) + expr = Player.name.like(player_name) try: player = self.query_by_filter(Player, expr)[0] @@ -112,6 +126,11 @@ class GeoffreyDatabase: return player + def get_shop_inventory(self, shop): + expr = ItemListing.shop == shop + + return self.query_by_filter(ItemListing, expr) + def query_by_filter(self, obj_type, * args): filter_value = self.combine_filter(args) return self.session.query(obj_type).filter(filter_value).all() @@ -180,7 +199,7 @@ class Location(SQL_Base): __tablename__ = 'Locations' id = Column(Integer, primary_key=True) - name = Column(String) + name = Column(String, unique=True) x = Column(Integer) y = Column(Integer) z = Column(Integer) @@ -253,4 +272,4 @@ class ItemListing(SQL_Base): self.shop = shop def __str__(self): - return "Item: {}, Price: {}".format(self.name, self.price) + return "Item: {}, Price: {}D".format(self.name, self.price) diff --git a/Geoffrey.py b/Geoffrey.py index d258767..f88d494 100644 --- a/Geoffrey.py +++ b/Geoffrey.py @@ -3,6 +3,7 @@ from DatabaseModels import * from BotErrors import * from MinecraftAccountInfoGrabber import * import configparser +#from WebInterface import * TOKEN = '' command_prefix = '?' @@ -10,7 +11,7 @@ description = ''' Geoffrey started his life as inside joke none of you will understand. At some point, she was to become an airhorn bot. Now, they know where your bases/shops are. -Please respect Geoffrey, the bot is very sensitive.w +Please respect Geoffrey, the bot is very sensitive. ''' bad_error_message = 'OOPSIE WOOPSIE!! Uwu We made a fucky wucky!! A wittle fucko boingo! The admins at our ' \ @@ -177,10 +178,25 @@ async def selling(ctx, item_name: str): shop_list_str = loc_list_to_string(shop_list) await bot.say('The following shops sell {}: \n {}'.format(item_name, shop_list_str)) + +@bot.command(pass_context=True) +async def shopinfo(ctx, shop_name: str): + ''' + Lists the information and inventory of a shop + ?shopinfo [Shop Name] + ''' + shop = database.find_shop_by_name(shop_name)[0] + inv_list = database.get_shop_inventory(shop) + + item_list = '' + for item in inv_list: + item_list = item_list + '{}\n'.format(item.__str__()) + + await bot.say('{} \n Inventory:\n {}'.format(shop.__str__(), item_list)) + # Helper Functions ************************************************************ - -def get_nickname(discord_user) : +def get_nickname(discord_user): if discord_user.nick is None: name = discord_user.display_name else: @@ -202,7 +218,6 @@ def loc_list_to_string(loc_list, str_format='{}\n{}'): def create_config(): - 'sqlite:///:memory:' config['Discord'] = {'Token': ''} config['SQL'] = {'Dialect+Driver': 'test', 'username': '', 'password':'', 'host': '', 'port': '', 'database':''} @@ -237,10 +252,11 @@ else: TOKEN = config['Discord']['Token'] if config['SQL']['dialect+driver'] == 'Test': - engine_arg = 'sqlite:///:memory:' + engine_arg = 'sqlite:///temp.db' else: engine_arg = get_engine_arg(config) database = GeoffreyDatabase(engine_arg) + #WebInterface('127.0.0.1', 8081, database) bot.run(TOKEN) diff --git a/test_geoffreyDatabase.py b/test_geoffreyDatabase.py index 2112f45..56870cf 100644 --- a/test_geoffreyDatabase.py +++ b/test_geoffreyDatabase.py @@ -9,7 +9,6 @@ class TestGeoffreyDatabase(TestCase): self.database = GeoffreyDatabase('sqlite:///:memory:') self.owner = Player('ZeroHD') self.loc = Location('test', 1, 2, 3, self.owner, ['Green', 0]) - #self.shop = Location('test', 1, 2, 3, self.owner, ['Green', 0]) def test_add_object(self): self.database.add_object(self.loc) @@ -97,6 +96,13 @@ class TestGeoffreyDatabase(TestCase): self.assertEqual(len(loc_list), 0) + def test_find_location_by_name(self): + loc = self.database.add_location('ZeroHD', 'test', 0, 0, 0, ['Green', 0]) + + loc_list = self.database.find_location_by_name('test') + + self.assertEqual(loc_list[0].name, loc.name) + def test_wrong_case(self): loc = self.database.add_location('ZeroHD', 'test', 0, 0, 0, ['Green', 0]) @@ -104,6 +110,19 @@ class TestGeoffreyDatabase(TestCase): self.assertEqual(loc_list[0].id, loc.id) + self.database.add_shop('ZeroHD', 'testshop', 1, 2, 3, ['Green', 0]) + + self.database.add_item('ZeroHD', 'testshop', 'dirt', 1) + + shops = self.database.find_shop_selling_item('Dirt') + + self.assertEqual(shops[0].name, 'testshop') + + loc_list = self.database.find_location_by_name('TEST') + + self.assertEqual(loc_list[0].name, 'test') + +