Fixed case sensitivity and added a shopinfo command. (Resolves BackLog entries 1 and 4)
parent
933b7c7ba0
commit
1783c58e2a
|
@ -32,9 +32,10 @@ class GeoffreyDatabase:
|
||||||
|
|
||||||
def add_item(self, player_name, shop_name, item_name, price):
|
def add_item(self, player_name, shop_name, item_name, price):
|
||||||
try:
|
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])
|
item = ItemListing(item_name, price, shop[0])
|
||||||
|
self.add_object(item)
|
||||||
except IndexError:
|
except IndexError:
|
||||||
raise LocationLookUpError
|
raise LocationLookUpError
|
||||||
|
|
||||||
|
@ -63,11 +64,24 @@ class GeoffreyDatabase:
|
||||||
self.session.add(obj)
|
self.session.add(obj)
|
||||||
self.session.commit()
|
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):
|
def find_location_by_owner(self, owner_name):
|
||||||
player = self.find_player(owner_name)
|
player = self.find_player(owner_name)
|
||||||
expr = Location.owner == player
|
expr = Location.owner == player
|
||||||
return self.query_by_filter(Location, expr)
|
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):
|
def find_location_by_name_and_owner(self, owner_name, name):
|
||||||
player = self.find_player(owner_name)
|
player = self.find_player(owner_name)
|
||||||
expr = (Location.owner == player) & (Location.name == name)
|
expr = (Location.owner == player) & (Location.name == name)
|
||||||
|
@ -80,7 +94,7 @@ class GeoffreyDatabase:
|
||||||
return self.query_by_filter(Location, expr)
|
return self.query_by_filter(Location, expr)
|
||||||
|
|
||||||
def find_item(self, item_name):
|
def find_item(self, item_name):
|
||||||
expr = ItemListing.name == item_name
|
expr = ItemListing.name.like(item_name)
|
||||||
return self.query_by_filter(ItemListing, expr)
|
return self.query_by_filter(ItemListing, expr)
|
||||||
|
|
||||||
def find_shop_selling_item(self, item_name):
|
def find_shop_selling_item(self, item_name):
|
||||||
|
@ -93,7 +107,7 @@ class GeoffreyDatabase:
|
||||||
return shops
|
return shops
|
||||||
|
|
||||||
def find_player(self, player_name):
|
def find_player(self, player_name):
|
||||||
expr = func.lower(Player.name) == func.lower(player_name)
|
expr = Player.name.like(player_name)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
player = self.query_by_filter(Player, expr)[0]
|
player = self.query_by_filter(Player, expr)[0]
|
||||||
|
@ -112,6 +126,11 @@ class GeoffreyDatabase:
|
||||||
|
|
||||||
return player
|
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):
|
def query_by_filter(self, obj_type, * args):
|
||||||
filter_value = self.combine_filter(args)
|
filter_value = self.combine_filter(args)
|
||||||
return self.session.query(obj_type).filter(filter_value).all()
|
return self.session.query(obj_type).filter(filter_value).all()
|
||||||
|
@ -180,7 +199,7 @@ class Location(SQL_Base):
|
||||||
__tablename__ = 'Locations'
|
__tablename__ = 'Locations'
|
||||||
|
|
||||||
id = Column(Integer, primary_key=True)
|
id = Column(Integer, primary_key=True)
|
||||||
name = Column(String)
|
name = Column(String, unique=True)
|
||||||
x = Column(Integer)
|
x = Column(Integer)
|
||||||
y = Column(Integer)
|
y = Column(Integer)
|
||||||
z = Column(Integer)
|
z = Column(Integer)
|
||||||
|
@ -253,4 +272,4 @@ class ItemListing(SQL_Base):
|
||||||
self.shop = shop
|
self.shop = shop
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "Item: {}, Price: {}".format(self.name, self.price)
|
return "Item: {}, Price: {}D".format(self.name, self.price)
|
||||||
|
|
26
Geoffrey.py
26
Geoffrey.py
|
@ -3,6 +3,7 @@ from DatabaseModels import *
|
||||||
from BotErrors import *
|
from BotErrors import *
|
||||||
from MinecraftAccountInfoGrabber import *
|
from MinecraftAccountInfoGrabber import *
|
||||||
import configparser
|
import configparser
|
||||||
|
#from WebInterface import *
|
||||||
|
|
||||||
TOKEN = ''
|
TOKEN = ''
|
||||||
command_prefix = '?'
|
command_prefix = '?'
|
||||||
|
@ -10,7 +11,7 @@ description = '''
|
||||||
Geoffrey started his life as inside joke none of you will understand.
|
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.
|
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 ' \
|
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)
|
shop_list_str = loc_list_to_string(shop_list)
|
||||||
await bot.say('The following shops sell {}: \n {}'.format(item_name, shop_list_str))
|
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 ************************************************************
|
# Helper Functions ************************************************************
|
||||||
|
|
||||||
|
def get_nickname(discord_user):
|
||||||
def get_nickname(discord_user) :
|
|
||||||
if discord_user.nick is None:
|
if discord_user.nick is None:
|
||||||
name = discord_user.display_name
|
name = discord_user.display_name
|
||||||
else:
|
else:
|
||||||
|
@ -202,7 +218,6 @@ def loc_list_to_string(loc_list, str_format='{}\n{}'):
|
||||||
|
|
||||||
|
|
||||||
def create_config():
|
def create_config():
|
||||||
'sqlite:///:memory:'
|
|
||||||
config['Discord'] = {'Token': ''}
|
config['Discord'] = {'Token': ''}
|
||||||
config['SQL'] = {'Dialect+Driver': 'test', 'username': '', 'password':'', 'host': '', 'port': '', 'database':''}
|
config['SQL'] = {'Dialect+Driver': 'test', 'username': '', 'password':'', 'host': '', 'port': '', 'database':''}
|
||||||
|
|
||||||
|
@ -237,10 +252,11 @@ else:
|
||||||
TOKEN = config['Discord']['Token']
|
TOKEN = config['Discord']['Token']
|
||||||
|
|
||||||
if config['SQL']['dialect+driver'] == 'Test':
|
if config['SQL']['dialect+driver'] == 'Test':
|
||||||
engine_arg = 'sqlite:///:memory:'
|
engine_arg = 'sqlite:///temp.db'
|
||||||
else:
|
else:
|
||||||
engine_arg = get_engine_arg(config)
|
engine_arg = get_engine_arg(config)
|
||||||
|
|
||||||
database = GeoffreyDatabase(engine_arg)
|
database = GeoffreyDatabase(engine_arg)
|
||||||
|
#WebInterface('127.0.0.1', 8081, database)
|
||||||
bot.run(TOKEN)
|
bot.run(TOKEN)
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@ class TestGeoffreyDatabase(TestCase):
|
||||||
self.database = GeoffreyDatabase('sqlite:///:memory:')
|
self.database = GeoffreyDatabase('sqlite:///:memory:')
|
||||||
self.owner = Player('ZeroHD')
|
self.owner = Player('ZeroHD')
|
||||||
self.loc = Location('test', 1, 2, 3, self.owner, ['Green', 0])
|
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):
|
def test_add_object(self):
|
||||||
self.database.add_object(self.loc)
|
self.database.add_object(self.loc)
|
||||||
|
@ -97,6 +96,13 @@ class TestGeoffreyDatabase(TestCase):
|
||||||
|
|
||||||
self.assertEqual(len(loc_list), 0)
|
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):
|
def test_wrong_case(self):
|
||||||
loc = self.database.add_location('ZeroHD', 'test', 0, 0, 0, ['Green', 0])
|
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.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')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue