diff --git a/geoffrey/BotConfig.py b/geoffrey/BotConfig.py index f65cda9..5d99d90 100644 --- a/geoffrey/BotConfig.py +++ b/geoffrey/BotConfig.py @@ -31,7 +31,9 @@ def create_config(config, path): def read_config(path): config = configparser.ConfigParser() try: - config.read_file(codecs.open(path, "r", "utf8")) + file = codecs.open(path, "r", "utf8") + config.read_file(file) + file.close() except FileNotFoundError: create_config(config, path) print("Config generated.") diff --git a/geoffrey/Commands.py b/geoffrey/Commands.py index 22f589c..c479920 100644 --- a/geoffrey/Commands.py +++ b/geoffrey/Commands.py @@ -40,13 +40,13 @@ class Commands: try: player = self.get_player(session, discord_uuid, mc_uuid) - if len(self.interface.find_location_by_owner(session, player)) == 0: + if len(self.interface.find_location_by_owner(session, player, loc_type=Base)) == 0: if base_name is None: base_name = "{}'s Base".format(player.name) elif base_name is None: raise EntryNameNotUniqueError - base = self.interface.add_base(session, player, base_name, x_pos, z_pos) + base = self.interface.add_loc(session, player, base_name, x_pos, z_pos, loc_type=Base) base_str = base.__str__() finally: @@ -60,13 +60,13 @@ class Commands: try: player = self.get_player(session, discord_uuid, mc_uuid) - if len(self.interface.find_shop_by_owner(session, player)) == 0: + if len(self.interface.find_location_by_owner(session, player, loc_type=Shop)) == 0: if shop_name is None: shop_name = "{}'s Shop".format(player.name) elif shop_name is None: raise EntryNameNotUniqueError - shop = self.interface.add_shop(session, player, shop_name, x_pos, z_pos) + shop = self.interface.add_loc(session, player, shop_name, x_pos, z_pos, loc_type=Shop) shop_name = shop.__str__() finally: @@ -129,7 +129,7 @@ class Commands: session = self.interface.database.Session() try: player = self.get_player(session, discord_uuid, mc_uuid) - shop_list = self.interface.find_shop_by_owner(session, player) + shop_list = self.interface.find_location_by_owner(session, player, loc_type=Shop) if shop_name is None: if len(shop_list) == 1: @@ -291,7 +291,7 @@ class Commands: player = self.get_player(session, discord_uuid=discord_uuid, mc_uuid=mc_uuid) if shop_name is None: - shop_list = self.interface.find_shop_by_owner(session, player) + shop_list = self.interface.find_location_by_owner(session, player, loc_type=Shop) if len(shop_list) == 0: raise LocationLookUpError @@ -301,7 +301,7 @@ class Commands: shop = shop_list[0] else: - shop = self.interface.find_shop_by_name_and_owner(session, player, shop_name)[0] + shop = self.interface.find_location_by_name_and_owner(session, player, shop_name, loc_type=Shop)[0] expr = (ItemListing.name == item) & (ItemListing.shop == shop) self.interface.database.delete_entry(session, ItemListing, expr) diff --git a/geoffrey/DatabaseInterface.py b/geoffrey/DatabaseInterface.py index 553ec13..1edd9d2 100644 --- a/geoffrey/DatabaseInterface.py +++ b/geoffrey/DatabaseInterface.py @@ -6,15 +6,16 @@ class DatabaseInterface: def __init__(self, bot_config, debug=False): self.database = GeoffreyDatabase(bot_config, debug) - def add_base(self, session, owner, name, x_pos, z_pos, dimension=None): - base = Base(name, x_pos, z_pos, owner, dimension) - self.database.add_object(session, base) - return base + def add_loc(self, session, owner, name, x_pos, z_pos, dimension=None, loc_type=Location): + if loc_type == Base: + loc = Base(name, x_pos, z_pos, owner, dimension) + elif loc_type == Shop: + loc = Shop(name, x_pos, z_pos, owner, dimension) + else: + loc = Location(name, x_pos, z_pos, owner, dimension) - def add_shop(self, session, owner, name, x_pos, z_pos, dimension=None): - shop = Shop(name, x_pos, z_pos, owner, dimension) - self.database.add_object(session, shop) - return shop + self.database.add_object(session, loc) + return loc def add_tunnel(self, session, owner, color, number, location_name): tunnels = self.find_tunnel_by_owner(session, owner) @@ -40,7 +41,7 @@ class DatabaseInterface: def add_item(self, session, owner, shop_name, item_name, price, amount): try: - shop = self.find_shop_by_name_and_owner(session, owner, shop_name) + shop = self.find_location_by_name_and_owner(session, owner, shop_name, loc_type=Shop) item = ItemListing(item_name, price, amount, shop[0]) self.database.add_object(session, item) @@ -63,39 +64,27 @@ class DatabaseInterface: return player - def find_location_by_name(self, session, name): - expr = Location.name.ilike('%{}%'.format(name)) - return self.database.query_by_filter(session, Location, expr) + def find_location_by_name(self, session, name, loc_type=Location): + expr = loc_type.name.ilike('%{}%'.format(name)) + return self.database.query_by_filter(session, loc_type, expr) - def find_shop_by_name(self, session, name): - expr = Location.name.ilike('%{}%'.format(name)) - return self.database.query_by_filter(session, Shop, expr) + def find_location_by_owner(self, session, owner, loc_type=Location): + expr = loc_type.owner == owner + return self.database.query_by_filter(session, loc_type, expr) - def find_location_by_owner(self, session, owner): - expr = Location.owner == owner - return self.database.query_by_filter(session, Location, expr) + def find_location_by_owner_name(self, session, owner_name, loc_type=Location): + expr = loc_type.owner.has(Player.name.ilike(owner_name)) + return self.database.query_by_filter(session, loc_type, expr) - def find_shop_by_owner(self, session, owner): - expr = Shop.owner == owner - return self.database.query_by_filter(session, Shop, expr) + def find_location_by_name_and_owner(self, session, owner, name, loc_type=Location): + expr = (loc_type.owner == owner) & (loc_type.name.ilike(name)) + return self.database.query_by_filter(session, loc_type, expr) - def find_location_by_owner_name(self, session, owner_name): - expr = Location.owner.has(Player.name.ilike(owner_name)) - return self.database.query_by_filter(session, Location, expr) - - def find_shop_by_name_and_owner(self, session, owner, name): - expr = (Shop.owner == owner) & (Shop.name.ilike(name)) - return self.database.query_by_filter(session, Shop, expr) - - def find_location_by_name_and_owner(self, session, owner, name): - expr = (Location.owner == owner) & (Location.name.ilike(name)) - return self.database.query_by_filter(session, Location, expr) - - def find_location_around(self, session, x_pos, z_pos, radius, dimension): + def find_location_around(self, session, x_pos, z_pos, radius, dimension, loc_type=Location): dimension_obj = Dimension.str_to_dimension(dimension) - expr = (Location.x < x_pos + radius + 1) & (Location.x > x_pos - radius - 1) & \ - (Location.z < z_pos + radius + 1) \ - & (Location.z > z_pos - radius - 1) & (Location.dimension == dimension_obj) + expr = (loc_type.x < x_pos + radius + 1) & (loc_type.x > x_pos - radius - 1) & \ + (loc_type.z < z_pos + radius + 1) \ + & (loc_type.z > z_pos - radius - 1) & (loc_type.dimension == dimension_obj) return list_to_string(self.database.query_by_filter(session, Location, expr)) diff --git a/geoffrey/tests/test_geoffreyDatabase.py b/geoffrey/tests/test_geoffreyDatabase.py index 59f38d1..94b93b1 100644 --- a/geoffrey/tests/test_geoffreyDatabase.py +++ b/geoffrey/tests/test_geoffreyDatabase.py @@ -4,6 +4,7 @@ from unittest import TestCase from DatabaseInterface import * from BotConfig import * + class TestGeoffreyDatabase(TestCase): def setUp(self): path = os.path.dirname(os.path.abspath(__file__)) @@ -21,7 +22,7 @@ class TestGeoffreyDatabase(TestCase): self.session.close() def add_shop(self, player): - shop = self.interface.add_shop(self.session, player, 'test', 1, 3, "nether") + shop = self.interface.add_loc(self.session, player, 'test', 1, 3, "nether", loc_type=Shop) return shop def add_player(self): @@ -29,7 +30,7 @@ class TestGeoffreyDatabase(TestCase): return player def add_loc(self, player): - loc = self.interface.add_base(self.session, player, 'test', 0, 0) + loc = self.interface.add_loc(self.session, player, 'test', 0, 0, loc_type=Base) return loc def test_add_object(self): @@ -79,13 +80,13 @@ class TestGeoffreyDatabase(TestCase): self.assertEqual(type(shop), Shop) - shop_list = self.interface.find_shop_by_name(self.session, 'test') + shop_list = self.interface.find_location_by_name(self.session, 'test', loc_type=Shop) self.assertEqual(shop_list[0].dimension, shop.dimension) def test_add_two_shops(self): owner = self.add_player() self.add_shop(owner) - shop2 = self.interface.add_shop(self.session, owner, 'no u', 1, 3) + shop2 = self.interface.add_loc(self.session, owner, 'no u', 1, 3, loc_type=Shop) loc_list = self.interface.find_location_by_owner(self.session, owner) @@ -186,7 +187,7 @@ class TestGeoffreyDatabase(TestCase): self.assertEqual(loc_list[0].id, loc.id) - self.interface.add_shop(self.session, owner, 'testshop', 1, 3, 'neThEr') + self.interface.add_loc(self.session, owner, 'testshop', 1, 3, 'neThEr', loc_type=Shop) self.interface.add_item(self.session, owner, 'testshop', 'dirts', 1, 15) @@ -201,17 +202,17 @@ class TestGeoffreyDatabase(TestCase): def test_big_input(self): owner = self.add_player() - self.assertRaises(DatabaseValueError, self.interface.add_base, self.session, owner, + self.assertRaises(DatabaseValueError, self.interface.add_loc, self.session, owner, 'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT' 'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT' - 'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT', 0, 0, ) + 'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT', 0, 0, Shop) def test_duplicate_name(self): owner = self.add_player() self.add_loc(owner) - self.assertRaises(EntryNameNotUniqueError, self.interface.add_base, self.session, - owner, 'test', 0, 0, 0) + self.assertRaises(EntryNameNotUniqueError, self.interface.add_loc, self.session, + owner, 'test', 0, 0, Shop) def test_delete_parent(self): owner = self.add_player()