Added town commands and fixed many bug in commands

+Added add_town, add_resident, remove_resident
+Fixed some bugs introduce by the last commit
+Error message now sends as one message
master
Joey Hines 2019-02-16 21:21:29 -06:00
parent d6f2fd47f0
commit e63d00e967
3 changed files with 231 additions and 40 deletions

View File

@ -20,19 +20,43 @@ def formatted_position(location):
return '(x={}, z={})'.format(location["x_coord"], location["z_coord"]) return '(x={}, z={})'.format(location["x_coord"], location["z_coord"])
def formatted_shop(shop): def formatted_shop(shop, base_url):
inventory = "" shop_info_list = formatted_location_info(shop, base_url)
for item in shop["items"]:
inventory = inventory + "\n" + (formatted_item_listing(item))
return formatted_location(shop) + inventory if len(shop["items"]) > 0:
shop_info_list.append("**Inventory:**")
for item in shop["items"]:
shop_info_list.append(formatted_item_listing(item))
return shop_info_list
def formatted_location_info(location, base_url):
info = []
info.append(formatted_location(location))
info.append(get_full_link(base_url, location["link"]))
return info
def formatted_town(town, base_url):
town_info_list = formatted_location_info(town, base_url)
if len(town["residents"]) > 0:
town_info_list.append("**Residents:**")
for resident in town["residents"]:
town_info_list.append(resident["name"])
return town_info_list
def formatted_owners(location): def formatted_owners(location):
owner_list = '' owner_list = ''
if "owner" in location: if "owner" in location:
if len(location["owner"]) == 0: if len(location["owner"]) == 1:
owner_list = 'Owner: **{}**' owner_list = 'Owner: **{}**'
owner_list = owner_list.format(location["owner"][0]["name"]) owner_list = owner_list.format(location["owner"][0]["name"])
else: else:
@ -45,3 +69,7 @@ def formatted_owners(location):
owner_list = owner_list.format(owners) owner_list = owner_list.format(owners)
return owner_list return owner_list
def get_full_link(base_url, link):
return base_url + link

View File

@ -75,10 +75,14 @@ class GeoffreyBot(commands.Bot):
if isinstance(error, commands.errors.CommandNotFound): if isinstance(error, commands.errors.CommandNotFound):
return return
elif isinstance(error, commands.errors.BadArgument): elif isinstance(error, commands.errors.BadArgument):
error_str = "That's not how you use the command you ding dong." error_str = "Well bud, you got this far. Good job! But you still h*cked up the syntax. " \
"Check {}help.".format(self.prefix)
elif isinstance(error, commands.errors.MissingRequiredArgument): elif isinstance(error, commands.errors.MissingRequiredArgument):
error_str = "Well bud, you got this far. Good job! But you still h*cked up the syntax. " \ error_str = "Well bud, you got this far. Good job! But you still h*cked up the syntax. " \
"Check {}help.".format(self.prefix) "Check {}help.".format(self.prefix)
elif hasattr(error, "original") and isinstance(error.original, ValueError):
error_str = "Well bud, you got this far. Good job! But you still h*cked up the syntax. Check {}help." \
.format(self.prefix)
elif hasattr(error, "original") and isinstance(error.original, request_exception.ConnectionError): elif hasattr(error, "original") and isinstance(error.original, request_exception.ConnectionError):
error_str = "Unable to connect to the database. Hopefully someone is working on this..." error_str = "Unable to connect to the database. Hopefully someone is working on this..."
await self.send_error_message("Can't connect to GeoffreyAPI, is it offline?") await self.send_error_message("Can't connect to GeoffreyAPI, is it offline?")
@ -90,7 +94,7 @@ class GeoffreyBot(commands.Bot):
elif e == "NoLocationsInDatabase": elif e == "NoLocationsInDatabase":
error_str = "You have no locations in the database, ding dongs like you can read {}help to figure out" \ error_str = "You have no locations in the database, ding dongs like you can read {}help to figure out" \
"how to add them".format(self.prefix) "how to add them".format(self.prefix)
elif e == "TypeError": elif e == "TypeError" or e == "ValueError":
error_str = "Well bud, you got this far. Good job! But you still h*cked up the syntax. Check {}help." \ error_str = "Well bud, you got this far. Good job! But you still h*cked up the syntax. Check {}help." \
.format(self.prefix) .format(self.prefix)
elif e == "DataError": elif e == "DataError":
@ -104,8 +108,11 @@ class GeoffreyBot(commands.Bot):
ctx.invoked_with, ctx.invoked_with,
ctx.args[1].args[2:])) ctx.args[1].args[2:]))
error_message = ["```python"]
for tb in traceback.format_tb(error.original.__traceback__): for tb in traceback.format_tb(error.original.__traceback__):
await self.send_error_message("```python\n{}```".format(tb)) error_message.append(tb)
error_message.append("```")
error_str = bad_error_message.format(ctx.invoked_with) error_str = bad_error_message.format(ctx.invoked_with)
@ -118,6 +125,10 @@ class GeoffreyBot(commands.Bot):
async def send_error_message(self, msg): async def send_error_message(self, msg):
for user_id in self.error_users: for user_id in self.error_users:
user = await self.get_user_info(user_id) user = await self.get_user_info(user_id)
if msg is list:
await self.send_list(user, msg)
else:
await user.send(msg) await user.send(msg)
def run_command(self, command, **kwargs): def run_command(self, command, **kwargs):
@ -171,7 +182,10 @@ class GeoffreyBot(commands.Bot):
help_list.append(command["help"] + "\n") help_list.append(command["help"] + "\n")
help_msg = self.get_command(command_name).help c = self.get_command(command_name)
if c is not None:
help_msg = c.help
help_list.append(help_msg.format(self.prefix)) help_list.append(help_msg.format(self.prefix))
help_list.append('```') help_list.append('```')

View File

@ -55,12 +55,16 @@ class GeoffreyCommands:
discord_uuid=ctx.message.author.id) discord_uuid=ctx.message.author.id)
await ctx.send( await ctx.send(
'{}, your base has been added to the database: \n\n{}'.format(ctx.message.author.mention, '{}, your base has been added to the database: \n{}'.format(ctx.message.author.mention,
formatted_location(base))) formatted_location(base)))
except Exception as e: except Exception as e:
error_list = [ error_list = [
{"error": "EntryNameNotUniqueError", {"error": "EntryNameNotUniqueError",
"message": "{}, a base with that name already exists, be more unique ding dong".format( "message": "{}, a location with that name already exists, be more unique ding dong".format(
ctx.message.author.mention)
},
{"error": "LocationLookUpError",
"message": "{}, you have more than one location. Please specify a name.".format(
ctx.message.author.mention) ctx.message.author.mention)
}, },
] ]
@ -82,7 +86,7 @@ class GeoffreyCommands:
item = run_command(self.base_url, self.api_token, "POST", "add_item", item_name=item_name, item = run_command(self.base_url, self.api_token, "POST", "add_item", item_name=item_name,
quantity=quantity, quantity=quantity,
diamond_price=diamond_price, shop_name=shop_name, discord_uuid=ctx.message.author.id) diamond_price=diamond_price, shop_name=shop_name, discord_uuid=ctx.message.author.id)
await ctx.send('{}, {} has been added to the inventory of {}'.format(ctx.message.author.mention, await ctx.send('{}, **{}** has been added to the inventory of **{}**'.format(ctx.message.author.mention,
item["item_name"], item["item_name"],
item["shop"]["name"])) item["shop"]["name"]))
except Exception as e: except Exception as e:
@ -99,12 +103,14 @@ class GeoffreyCommands:
await ctx.send(msg) await ctx.send(msg)
@commands.command(pass_context=True) @commands.command(pass_context=True)
async def add_owner(self, ctx, new_owner_name, location_name): async def add_owner(self, ctx, new_owner_name, *args):
''' '''
{}add_owner <New Owner's Name> <Location Name> {}add_owner <New Owner's Name> <Location Name>
WARNING: The new owner had just as much power as you to edit or delete this location. WARNING: The new owner had just as much power as you to edit or delete this location.
''' '''
location_name = get_name(args)
try: try:
location = run_command(self.base_url, self.api_token, "POST", "add_owner", new_owner_name=new_owner_name, location = run_command(self.base_url, self.api_token, "POST", "add_owner", new_owner_name=new_owner_name,
location_name=location_name, discord_uuid=ctx.message.author.id) location_name=location_name, discord_uuid=ctx.message.author.id)
@ -113,17 +119,52 @@ class GeoffreyCommands:
ctx.message.author.mention, new_owner_name, location["name"])) ctx.message.author.mention, new_owner_name, location["name"]))
except Exception as e: except Exception as e:
error_list = [ error_list = [
{"error": "PlayerNotFound", {"error": "OwnerNotFoundError",
"message": "{}, ain't no one in this darn database named {} you goob".format( "message": "{}, ain't no one in this darn database named **{}** you goob".format(
ctx.message.author.mention, new_owner_name) ctx.message.author.mention, new_owner_name)
}, },
{"error": "PlayerInDBError", {"error": "IsOwnerError",
"message": "{}, **{}** is already an owner, stop having amosia.".format( "message": "{}, **{}** is already an owner, stop having amosia.".format(
ctx.message.author.mention, new_owner_name) ctx.message.author.mention, new_owner_name)
}, },
{"error": "LocationLookUpError", {"error": "LocationLookUpError",
"message": "{}, you do not have a location by the name you ding dong goober.".format( "message": "{}, you do not have a location by that name you ding dong goober.".format(
ctx.message.author) ctx.message.author.mention)
}
]
msg = check_error(e, error_list)
await ctx.send(msg)
@commands.command(pass_context=True)
async def add_resident(self, ctx, new_resident_name, *args):
'''
{}add_resident <New Residents's Name> <Town Name>
'''
town_name = get_name(args)
try:
location = run_command(self.base_url, self.api_token, "POST", "add_resident",
new_resident_name=new_resident_name,
town_name=town_name, discord_uuid=ctx.message.author.id)
await ctx.send('{}, **{}** has been added as a resident to **{}**'.format(
ctx.message.author.mention, new_resident_name, location["name"]))
except Exception as e:
error_list = [
{"error": "ResidentNotFoundError",
"message": "{}, ain't no one in this darn database named {} you goob".format(
ctx.message.author.mention, new_resident_name)
},
{"error": "IsResidentError",
"message": "{}, **{}** is already a resident, stop having amosia.".format(
ctx.message.author.mention, new_resident_name)
},
{"error": "LocationLookUpError",
"message": "{}, you do not have a town by that name you ding dong goober.".format(
ctx.message.author.mention)
} }
] ]
@ -142,18 +183,53 @@ class GeoffreyCommands:
name = get_name(args) name = get_name(args)
try: try:
base = run_command(self.base_url, self.api_token, "POST", "add_shop", x_pos=x_pos, z_pos=z_pos, name=name, shop = run_command(self.base_url, self.api_token, "POST", "add_shop", x_pos=x_pos, z_pos=z_pos, name=name,
discord_uuid=ctx.message.author.id) discord_uuid=ctx.message.author.id)
await ctx.send( await ctx.send(
'{}, your shop has been added to the database: \n\n{}'.format(ctx.message.author.mention, '{}, your shop has been added to the database: \n{}'.format(ctx.message.author.mention,
formatted_location(base))) formatted_location(shop)))
except Exception as e: except Exception as e:
error_list = [ error_list = [
{"error": "EntryNameNotUniqueError", {"error": "EntryNameNotUniqueError",
"message": "{}, a shop with that name already exists, be more unique ding dong".format( "message": "{}, a location with that name already exists, be more unique ding dong".format(
ctx.message.author.mention) ctx.message.author.mention)
} },
{"error": "LocationLookUpError",
"message": "{}, you have more than one location. Please specify a name.".format(
ctx.message.author.mention)
},
]
msg = check_error(e, error_list)
await ctx.send(msg)
@commands.command(pass_context=True)
async def add_town(self, ctx, x_pos: int, z_pos: int, *args):
'''
{}add_town <X Coordinate> <Z Coordinate> <Shop Name>
The Town Name parameter is optional if this is your first town
'''
name = get_name(args)
try:
town = run_command(self.base_url, self.api_token, "POST", "add_town", x_pos=x_pos, z_pos=z_pos, name=name,
discord_uuid=ctx.message.author.id)
await ctx.send(
'{}, your town has been added to the database: \n{}'.format(ctx.message.author.mention,
formatted_location(town)))
except Exception as e:
error_list = [
{"error": "EntryNameNotUniqueError",
"message": "{}, a location with that name already exists, be more unique ding dong".format(
ctx.message.author.mention)
},
{"error": "LocationLookUpError",
"message": "{}, you have more than one location. Please specify a name.".format(
ctx.message.author.mention)
},
] ]
msg = check_error(e, error_list) msg = check_error(e, error_list)
@ -182,8 +258,10 @@ class GeoffreyCommands:
{"error": "InvalidTunnelError", {"error": "InvalidTunnelError",
"message": "{}, {} is not a valid tunnel direction ya gub".format(ctx.message.author.mention, "message": "{}, {} is not a valid tunnel direction ya gub".format(ctx.message.author.mention,
tunnel_direction) tunnel_direction)
} },
{"error": "LocationLookUpError",
"message": "{}, you do not have a location by the name you ding dong goober.".format(
ctx.message.author.mention)}
] ]
msg = check_error(e, error_list) msg = check_error(e, error_list)
@ -206,7 +284,7 @@ class GeoffreyCommands:
error_list = [ error_list = [
{"error": "LocationLookUpError", {"error": "LocationLookUpError",
"message": "{}, you do not have a location by the name you ding dong goober.".format( "message": "{}, you do not have a location by the name you ding dong goober.".format(
ctx.message.author)} ctx.message.author.mention)}
] ]
msg = check_error(e, error_list) msg = check_error(e, error_list)
@ -230,7 +308,8 @@ class GeoffreyCommands:
except Exception as e: except Exception as e:
error_list = [ error_list = [
{"error": "LocationLookUpError", {"error": "LocationLookUpError",
"message": "{}, you do not have a location by the name you ding dong goober."}, "message": "{}, you do not have a shop by that name you ding dong goober.".format(
ctx.message.author.mention)},
{"error": "EntryNameNotUniqueError", {"error": "EntryNameNotUniqueError",
"message": "{}, you have more than one location. Please specify a name, dingus.".format( "message": "{}, you have more than one location. Please specify a name, dingus.".format(
ctx.message.author.mention)}, ctx.message.author.mention)},
@ -347,11 +426,6 @@ class GeoffreyCommands:
error_list = [ error_list = [
{"error": "LocationLookUpError", {"error": "LocationLookUpError",
"message": "{}, there are no locations in that area.".format(ctx.message.author.mention) "message": "{}, there are no locations in that area.".format(ctx.message.author.mention)
},
{
"error": "ValueError",
"message": "{}, {} is an invalid radius, the radius must be a whole number.".format(
ctx.message.author.mention, args[0])
} }
] ]
@ -410,9 +484,17 @@ class GeoffreyCommands:
try: try:
location = run_command(self.base_url, self.api_token, "GET", "info", location_name=location_name) location = run_command(self.base_url, self.api_token, "GET", "info", location_name=location_name)
message = "{}, info on {}:\n{}".format(ctx.message.author.mention, location["name"], message = "{}, info on {}:\n".format(ctx.message.author.mention, location["name"])
formatted_location(location))
if location["type"] == "Shop":
info_list = formatted_shop(location, self.base_url)
elif location["type"] == "Town":
info_list = formatted_town(location, self.base_url)
else:
info_list = formatted_location_info(location, self.base_url)
await ctx.send(message) await ctx.send(message)
await self.bot.send_list(ctx, info_list)
except Exception as e: except Exception as e:
error_list = [ error_list = [
@ -461,6 +543,38 @@ class GeoffreyCommands:
msg = check_error(e, error_list) msg = check_error(e, error_list)
await ctx.send(msg) await ctx.send(msg)
@commands.command(pass_context=True)
async def remove_resident(self, ctx, resident_name, *args):
'''
{}remove_resident <Resident Name> <Town Name>
The Town Name is optional if you only have one town.
'''
town_name = get_name(args)
try:
location = run_command(self.base_url, self.api_token, "POST", "remove_resident",
resident_name=resident_name,
town_name=town_name, discord_uuid=ctx.message.author.id)
await ctx.send('{}, **{}** has been remove as a resident of **{}**'.format(
ctx.message.author.mention, resident_name, location["name"]))
except Exception as e:
error_list = [
{"error": "ResidentNotFoundError",
"message": "{}, ain't no one your town named {} you goob".format(
ctx.message.author.mention, resident_name)
},
{"error": "LocationLookUpError",
"message": "{}, you do not have a town by that name you ding dong goober.".format(
ctx.message.author)
}
]
msg = check_error(e, error_list)
await ctx.send(msg)
@commands.command(pass_context=True) @commands.command(pass_context=True)
async def selling(self, ctx, *args): async def selling(self, ctx, *args):
''' '''
@ -475,7 +589,41 @@ class GeoffreyCommands:
message = ["{} The following shop(s) sell **{}**:".format(ctx.message.author.mention, item)] message = ["{} The following shop(s) sell **{}**:".format(ctx.message.author.mention, item)]
for shop in results: for shop in results:
message.append(formatted_shop(shop)) for line in formatted_shop(shop, base_url=self.base_url):
message.append(line)
message.append('')
await self.bot.send_list(ctx, message)
except Exception as e:
error_list = [
{"error": "ItemNotFound",
"message": "{}, no shop was found selling {}".format(
ctx.message.author.mention, item)
}
]
msg = check_error(e, error_list)
await ctx.send(msg)
@commands.command(pass_context=True)
async def selling_price(self, ctx, *args):
'''
{}selling <Item Name>
Sorts by most recently added
'''
item = get_name(args)
try:
results = run_command(self.base_url, self.api_token, "GET", "selling_price", item_name=item)
message = ["{} The following shop(s) sell **{}**:".format(ctx.message.author.mention, item)]
for shop in results:
for line in formatted_shop(shop, base_url=self.base_url):
message.append(line)
message.append('')
await self.bot.send_list(ctx, message) await self.bot.send_list(ctx, message)
except Exception as e: except Exception as e:
@ -519,6 +667,7 @@ class GeoffreyCommands:
msg = check_error(e, error_list) msg = check_error(e, error_list)
await ctx.send(msg) await ctx.send(msg)
@commands.command(pass_context=True) @commands.command(pass_context=True)
async def tunnel(self, ctx, *args): async def tunnel(self, ctx, *args):
''' '''