Added basic command support for shops

doc_update
Joey Hines 2018-06-23 12:33:02 -05:00
parent 2320acf7bf
commit 484f1ed260
3 changed files with 45 additions and 19 deletions

View File

@ -25,6 +25,12 @@ class GeoffreyDatabase:
return base return base
def add_shop(self, player_name, name, x_pos, y_pos, z_pos, args):
owner = self.add_player(player_name)
shop = Shop(name, x_pos, y_pos, z_pos, owner, args)
self.add_object(shop)
return shop
def add_player(self, player_name): def add_player(self, player_name):
expr = Player.name == player_name expr = Player.name == player_name
player_list = self.query_by_filter(Player, expr) player_list = self.query_by_filter(Player, expr)
@ -50,12 +56,12 @@ class GeoffreyDatabase:
self.session.add(obj) self.session.add(obj)
self.session.commit() self.session.commit()
def find_base_by_owner(self, owner_name): def find_location_by_owner(self, owner_name):
player = self.add_player(owner_name) player = self.add_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_base_around(self, x_pos, z_pos, radius): def find_location_around(self, x_pos, z_pos, radius):
expr = (Location.x < x_pos + radius) & (Location.x > x_pos - radius) & (Location.z < z_pos + radius) & \ expr = (Location.x < x_pos + radius) & (Location.x > x_pos - radius) & (Location.z < z_pos + radius) & \
(Location.z > z_pos - radius) (Location.z > z_pos - radius)
@ -89,7 +95,6 @@ class GeoffreyDatabase:
s = s + '\n' + obj.id s = s + '\n' + obj.id
return s return s
def combine_filter(self, filter_value): def combine_filter(self, filter_value):
return sqlalchemy.sql.expression.and_(filter_value[0]) return sqlalchemy.sql.expression.and_(filter_value[0])
@ -141,13 +146,12 @@ class Location(SQL_Base):
direction = Column(Enum(TunnelDirection)) direction = Column(Enum(TunnelDirection))
owner_id = Column(Integer, ForeignKey('Players.id')) owner_id = Column(Integer, ForeignKey('Players.id'))
owner = relationship("Player", back_populates="locations") owner = relationship("Player", back_populates="locations")
#type = Column(String) type = Column(String)
'''
__mapper_args__ = { __mapper_args__ = {
'polymorphic_on': type, 'polymorphic_on': type,
'polymorphic_identity': 'Location' 'polymorphic_identity': 'Location'
} }
'''
def __init__(self, name, x, y, z, owner, args): def __init__(self, name, x, y, z, owner, args):
try: try:
@ -176,21 +180,21 @@ class Location(SQL_Base):
self.nether_tunnel_addr_to_str()) self.nether_tunnel_addr_to_str())
else: else:
return "Name: {}, Position: {}".format(self.name, self.pos_to_str()) return "Name: {}, Position: {}".format(self.name, self.pos_to_str())
'''
class Shop(Location): class Shop(Location):
__tablename__ = 'Shops' __tablename__ = 'Shops'
id = Column(Integer, ForeignKey('Locations.id'), primary_key=True) shop_id = Column(Integer, ForeignKey('Locations.id'), primary_key=True)
name = Column(String) name = Column(String)
inventory = relationship('ItemListing', back_populates='shop') inventory = relationship('ItemListing', back_populates='shop')
__mapper_args__ = { __mapper_args__ = {
'polymorphic_identity': 'Shop' 'polymorphic_identity': 'Shop',
} }
def __init__(self, name, x, y, z, owner, args): def __init__(self, name, x, y, z, owner, args):
Location.__init__(name, x, y, z, owner, args) Location.__init__(self, name, x, y, z, owner, args)
class ItemListing(SQL_Base): class ItemListing(SQL_Base):
@ -200,7 +204,7 @@ class ItemListing(SQL_Base):
name = Column(String) name = Column(String)
price = Column(Integer) price = Column(Integer)
shop_id = Column(Integer, ForeignKey('Shops.id')) shop_id = Column(Integer, ForeignKey('Locations.id'))
shop = relationship('Shop', back_populates='inventory') shop = relationship('Shop', back_populates='inventory')
@ -210,4 +214,3 @@ class ItemListing(SQL_Base):
def __str__(self): def __str__(self):
return "Item: {}, Price: {}".format(self.name, self.price) return "Item: {}, Price: {}".format(self.name, self.price)
'''

View File

@ -72,15 +72,33 @@ async def addbase(ctx, name: str, x_pos: int, y_pos: int, z_pos: int, * args):
await bot.say('{}, your base named {} located at {} has been added' await bot.say('{}, your base named {} located at {} has been added'
' to the database.'.format(ctx.message.author.mention, base.name, base.pos_to_str())) ' to the database.'.format(ctx.message.author.mention, base.name, base.pos_to_str()))
@bot.command(pass_context=True)
async def addshop(ctx, name: str, x_pos: int, y_pos: int, z_pos: int, * args):
'''
Add your base to the database.
The tunnel address is optional.
?addbase [Base Name] [X Coordinate] [Y Coordinate] [Z Coordinate] [Tunnel Color] [Tunnel Position]
'''
player_name = get_nickname(ctx.message.author)
try:
base = database.add_shop(player_name, name, x_pos, y_pos, z_pos, args)
except LocationInitError:
raise commands.UserInputError
await bot.say('{}, your shop named {} located at {} has been added'
' to the database.'.format(ctx.message.author.mention, base.name, base.pos_to_str()))
@bot.command(pass_context=True) @bot.command(pass_context=True)
async def findbase(ctx, name: str): async def find(ctx, name: str):
''' '''
Finds a base in the database. Finds a base in the database.
?findbase [Player name] ?findbase [Player name]
''' '''
base_list = database.find_base_by_owner(name) base_list = database.find_location_by_owner(name)
if len(base_list) != 0: if len(base_list) != 0:
base_string = base_list_string(base_list, '{} \n{}') base_string = base_list_string(base_list, '{} \n{}')
@ -92,7 +110,7 @@ async def findbase(ctx, name: str):
@bot.command(pass_context=True) @bot.command(pass_context=True)
async def deletebase(ctx, name: str): async def delete(ctx, name: str):
''' '''
Deletes a base from the database. Deletes a base from the database.
?deletebase [Base name] ?deletebase [Base name]
@ -107,7 +125,7 @@ async def deletebase(ctx, name: str):
@bot.command(pass_context=True) @bot.command(pass_context=True)
async def findbasearound(ctx, x_pos: int, z_pos: int, * args): async def findaround(ctx, x_pos: int, z_pos: int, * args):
''' '''
Finds all the base around a certain point that are registered in the database Finds all the base around a certain point that are registered in the database
The Radius argument defaults to 200 blocks if no value is given The Radius argument defaults to 200 blocks if no value is given
@ -121,7 +139,7 @@ async def findbasearound(ctx, x_pos: int, z_pos: int, * args):
except ValueError: except ValueError:
raise commands.UserInputError raise commands.UserInputError
base_list = database.find_base_around(x_pos, z_pos, radius) base_list = database.find_location_around(x_pos, z_pos, radius)
if len(base_list) != 0: if len(base_list) != 0:
base_string = base_list_string(base_list, '{} \n{}') base_string = base_list_string(base_list, '{} \n{}')

View File

@ -1,6 +1,5 @@
from unittest import TestCase from unittest import TestCase
from DatabaseModels import GeoffreyDatabase from DatabaseModels import *
from DatabaseModels import Location, Player
from BotErrors import * from BotErrors import *
from MinecraftAccountInfoGrabber import * from MinecraftAccountInfoGrabber import *
@ -10,6 +9,12 @@ 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_shop(self):
shop = self.database.add_shop('ZeroHD', 'test', 1, 2, 3, ['Green', 0])
self.assertEqual(type(shop), Shop)
def test_add_object(self): def test_add_object(self):
self.database.add_object(self.loc) self.database.add_object(self.loc)