Remove syntax error exception, add help pages to some errors
This commit is contained in:
parent
16fc976971
commit
0869f94cdf
@ -12,9 +12,6 @@ logger = logging.getLogger("pluralkit.bot.commands")
|
|||||||
|
|
||||||
command_list = {}
|
command_list = {}
|
||||||
|
|
||||||
class InvalidCommandSyntax(Exception):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class NoSystemRegistered(Exception):
|
class NoSystemRegistered(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -55,9 +52,6 @@ def command(cmd, usage=None, description=None, category=None, system_required=Tr
|
|||||||
await client.send_message(message.channel, embed=embed)
|
await client.send_message(message.channel, embed=embed)
|
||||||
except NoSystemRegistered:
|
except NoSystemRegistered:
|
||||||
await client.send_message(message.channel, embed=utils.make_error_embed("No system registered to this account. Use `pk;system new` to register one."))
|
await client.send_message(message.channel, embed=utils.make_error_embed("No system registered to this account. Use `pk;system new` to register one."))
|
||||||
except InvalidCommandSyntax:
|
|
||||||
usage_str = "**Usage:** pk;{} {}".format(cmd, usage or "")
|
|
||||||
await client.send_message(message.channel, embed=utils.make_default_embed(usage_str))
|
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.exception("Exception while handling command {} (args={}, system={})".format(cmd, args, system.hid if system else "(none)"))
|
logger.exception("Exception while handling command {} (args={}, system={})".format(cmd, args, system.hid if system else "(none)"))
|
||||||
|
|
||||||
@ -71,7 +65,7 @@ def member_command(cmd, usage=None, description=None, category=None, system_only
|
|||||||
async def wrapper(ctx: CommandContext, args):
|
async def wrapper(ctx: CommandContext, args):
|
||||||
# Return if no member param
|
# Return if no member param
|
||||||
if len(args) == 0:
|
if len(args) == 0:
|
||||||
raise InvalidCommandSyntax()
|
return embeds.error("You must pass a member name or ID.")
|
||||||
|
|
||||||
# System is allowed to be none if not system_only
|
# System is allowed to be none if not system_only
|
||||||
system_id = ctx.system.id if ctx.system else None
|
system_id = ctx.system.id if ctx.system else None
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
import logging
|
|
||||||
import re
|
import re
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import List
|
from typing import List
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
from pluralkit.bot import utils, embeds
|
|
||||||
from pluralkit.bot.commands import *
|
from pluralkit.bot.commands import *
|
||||||
|
from pluralkit.bot import help
|
||||||
|
|
||||||
logger = logging.getLogger("pluralkit.commands")
|
logger = logging.getLogger("pluralkit.commands")
|
||||||
|
|
||||||
@ -16,7 +15,7 @@ async def member_info(ctx: MemberCommandContext, args: List[str]):
|
|||||||
@command(cmd="member new", usage="<name>", description="Adds a new member to your system.", category="Member commands")
|
@command(cmd="member new", usage="<name>", description="Adds a new member to your system.", category="Member commands")
|
||||||
async def new_member(ctx: MemberCommandContext, args: List[str]):
|
async def new_member(ctx: MemberCommandContext, args: List[str]):
|
||||||
if len(args) == 0:
|
if len(args) == 0:
|
||||||
raise InvalidCommandSyntax()
|
return embeds.error("You must pass a member name or ID.", help=help.add_member)
|
||||||
|
|
||||||
name = " ".join(args)
|
name = " ".join(args)
|
||||||
bounds_error = utils.bounds_check_member_name(name, ctx.system.tag)
|
bounds_error = utils.bounds_check_member_name(name, ctx.system.tag)
|
||||||
@ -33,8 +32,8 @@ async def new_member(ctx: MemberCommandContext, args: List[str]):
|
|||||||
|
|
||||||
@member_command(cmd="member set", usage="<name|description|color|pronouns|birthdate|avatar> [value]", description="Edits a member property. Leave [value] blank to clear.", category="Member commands")
|
@member_command(cmd="member set", usage="<name|description|color|pronouns|birthdate|avatar> [value]", description="Edits a member property. Leave [value] blank to clear.", category="Member commands")
|
||||||
async def member_set(ctx: MemberCommandContext, args: List[str]):
|
async def member_set(ctx: MemberCommandContext, args: List[str]):
|
||||||
if len(args) == 0:
|
if len(args) == 0:
|
||||||
raise InvalidCommandSyntax()
|
return embeds.error("You must pass a property name to set.", help=help.edit_member)
|
||||||
|
|
||||||
allowed_properties = ["name", "description", "color", "pronouns", "birthdate", "avatar"]
|
allowed_properties = ["name", "description", "color", "pronouns", "birthdate", "avatar"]
|
||||||
db_properties = {
|
db_properties = {
|
||||||
@ -48,7 +47,7 @@ async def member_set(ctx: MemberCommandContext, args: List[str]):
|
|||||||
|
|
||||||
prop = args[0]
|
prop = args[0]
|
||||||
if prop not in allowed_properties:
|
if prop not in allowed_properties:
|
||||||
return embeds.error("Unknown property {}. Allowed properties are {}.".format(prop, ", ".join(allowed_properties)))
|
return embeds.error("Unknown property {}. Allowed properties are {}.".format(prop, ", ".join(allowed_properties)), help=help.edit_member)
|
||||||
|
|
||||||
if len(args) >= 2:
|
if len(args) >= 2:
|
||||||
value = " ".join(args[1:])
|
value = " ".join(args[1:])
|
||||||
@ -90,11 +89,11 @@ async def member_set(ctx: MemberCommandContext, args: List[str]):
|
|||||||
if u.scheme in ["http", "https"] and u.netloc and u.path:
|
if u.scheme in ["http", "https"] and u.netloc and u.path:
|
||||||
value = value
|
value = value
|
||||||
else:
|
else:
|
||||||
return embeds.error("Invalid URL.")
|
return embeds.error("Invalid image URL.")
|
||||||
else:
|
else:
|
||||||
# Can't clear member name
|
# Can't clear member name
|
||||||
if prop == "name":
|
if prop == "name":
|
||||||
return embeds.error("Can't clear member name.")
|
return embeds.error("You can't clear the member name.")
|
||||||
|
|
||||||
# Clear from DB
|
# Clear from DB
|
||||||
value = None
|
value = None
|
||||||
@ -117,10 +116,10 @@ async def member_proxy(ctx: MemberCommandContext, args: List[str]):
|
|||||||
# Sanity checking
|
# Sanity checking
|
||||||
example = " ".join(args)
|
example = " ".join(args)
|
||||||
if "text" not in example:
|
if "text" not in example:
|
||||||
return embeds.error("Example proxy message must contain the string 'text'.")
|
return embeds.error("Example proxy message must contain the string 'text'.", help=help.member_proxy)
|
||||||
|
|
||||||
if example.count("text") != 1:
|
if example.count("text") != 1:
|
||||||
return embeds.error("Example proxy message must contain the string 'text' exactly once.")
|
return embeds.error("Example proxy message must contain the string 'text' exactly once.", help=help.member_proxy)
|
||||||
|
|
||||||
# Extract prefix and suffix
|
# Extract prefix and suffix
|
||||||
prefix = example[:example.index("text")].strip()
|
prefix = example[:example.index("text")].strip()
|
||||||
@ -147,4 +146,4 @@ async def member_delete(ctx: MemberCommandContext, args: List[str]):
|
|||||||
await db.delete_member(ctx.conn, member_id=ctx.member.id)
|
await db.delete_member(ctx.conn, member_id=ctx.member.id)
|
||||||
return embeds.success("Member deleted.")
|
return embeds.success("Member deleted.")
|
||||||
else:
|
else:
|
||||||
return embeds.success("Member deletion cancelled.")
|
return embeds.error("Member deletion cancelled.")
|
@ -1,7 +1,7 @@
|
|||||||
import logging
|
import logging
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
from pluralkit.bot import utils, embeds
|
from pluralkit.bot import utils, embeds, help
|
||||||
from pluralkit.bot.commands import *
|
from pluralkit.bot.commands import *
|
||||||
|
|
||||||
logger = logging.getLogger("pluralkit.commands")
|
logger = logging.getLogger("pluralkit.commands")
|
||||||
@ -11,12 +11,12 @@ logger = logging.getLogger("pluralkit.commands")
|
|||||||
category="Message commands", system_required=False)
|
category="Message commands", system_required=False)
|
||||||
async def message_info(ctx: CommandContext, args: List[str]):
|
async def message_info(ctx: CommandContext, args: List[str]):
|
||||||
if len(args) == 0:
|
if len(args) == 0:
|
||||||
raise InvalidCommandSyntax()
|
return embeds.error("You must pass a message ID.", help=help.message_lookup)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
mid = int(args[0])
|
mid = int(args[0])
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise InvalidCommandSyntax()
|
return embeds.error("You must pass a valid number as a message ID.", help=help.message_lookup)
|
||||||
|
|
||||||
# Find the message in the DB
|
# Find the message in the DB
|
||||||
message = await db.get_message(ctx.conn, str(mid))
|
message = await db.get_message(ctx.conn, str(mid))
|
||||||
|
@ -28,7 +28,7 @@ async def show_help(ctx: CommandContext, args: List[str]):
|
|||||||
else:
|
else:
|
||||||
embed.description = text
|
embed.description = text
|
||||||
else:
|
else:
|
||||||
raise InvalidCommandSyntax()
|
return embeds.error("Unknown help page '{}'.".format(category))
|
||||||
|
|
||||||
return embed
|
return embed
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ import humanize
|
|||||||
|
|
||||||
import pluralkit.utils
|
import pluralkit.utils
|
||||||
from pluralkit import Member
|
from pluralkit import Member
|
||||||
from pluralkit.bot import utils, embeds
|
from pluralkit.bot import utils, embeds, help
|
||||||
from pluralkit.bot.commands import *
|
from pluralkit.bot.commands import *
|
||||||
|
|
||||||
logger = logging.getLogger("pluralkit.commands")
|
logger = logging.getLogger("pluralkit.commands")
|
||||||
@ -15,7 +15,7 @@ logger = logging.getLogger("pluralkit.commands")
|
|||||||
@command(cmd="switch", usage="<name|id> [name|id]...", description="Registers a switch and changes the current fronter.", category="Switching commands")
|
@command(cmd="switch", usage="<name|id> [name|id]...", description="Registers a switch and changes the current fronter.", category="Switching commands")
|
||||||
async def switch_member(ctx: MemberCommandContext, args: List[str]):
|
async def switch_member(ctx: MemberCommandContext, args: List[str]):
|
||||||
if len(args) == 0:
|
if len(args) == 0:
|
||||||
raise InvalidCommandSyntax()
|
return embeds.error("You must pass at least one member name or ID to register a switch to.", help=help.switch_register)
|
||||||
|
|
||||||
members: List[Member] = []
|
members: List[Member] = []
|
||||||
for member_name in args:
|
for member_name in args:
|
||||||
@ -36,7 +36,7 @@ async def switch_member(ctx: MemberCommandContext, args: List[str]):
|
|||||||
|
|
||||||
# Also make sure there aren't any duplicates
|
# Also make sure there aren't any duplicates
|
||||||
if len(set(member_ids)) != len(member_ids):
|
if len(set(member_ids)) != len(member_ids):
|
||||||
return embeds.error("Duplicate members in switch list.")
|
return embeds.error("Duplicate members in member list.")
|
||||||
|
|
||||||
# Log the switch
|
# Log the switch
|
||||||
async with ctx.conn.transaction():
|
async with ctx.conn.transaction():
|
||||||
@ -54,7 +54,7 @@ async def switch_out(ctx: MemberCommandContext, args: List[str]):
|
|||||||
# Get current fronters
|
# Get current fronters
|
||||||
fronters, _ = await pluralkit.utils.get_fronter_ids(ctx.conn, system_id=ctx.system.id)
|
fronters, _ = await pluralkit.utils.get_fronter_ids(ctx.conn, system_id=ctx.system.id)
|
||||||
if not fronters:
|
if not fronters:
|
||||||
raise embeds.error("There's already no one in front.")
|
return embeds.error("There's already no one in front.")
|
||||||
|
|
||||||
# Log it, and don't log any members
|
# Log it, and don't log any members
|
||||||
await db.add_switch(ctx.conn, system_id=ctx.system.id)
|
await db.add_switch(ctx.conn, system_id=ctx.system.id)
|
||||||
@ -63,7 +63,7 @@ async def switch_out(ctx: MemberCommandContext, args: List[str]):
|
|||||||
@command(cmd="switch move", usage="<time>", description="Moves the most recent switch to a different point in time.", category="Switching commands")
|
@command(cmd="switch move", usage="<time>", description="Moves the most recent switch to a different point in time.", category="Switching commands")
|
||||||
async def switch_move(ctx: MemberCommandContext, args: List[str]):
|
async def switch_move(ctx: MemberCommandContext, args: List[str]):
|
||||||
if len(args) == 0:
|
if len(args) == 0:
|
||||||
raise InvalidCommandSyntax()
|
return embeds.error("You must pass a time to move the switch to.", help=help.switch_move)
|
||||||
|
|
||||||
# Parse the time to move to
|
# Parse the time to move to
|
||||||
new_time = dateparser.parse(" ".join(args), languages=["en"], settings={
|
new_time = dateparser.parse(" ".join(args), languages=["en"], settings={
|
||||||
|
@ -6,7 +6,7 @@ import dateparser
|
|||||||
import humanize
|
import humanize
|
||||||
|
|
||||||
import pluralkit.utils
|
import pluralkit.utils
|
||||||
from pluralkit.bot import embeds
|
from pluralkit.bot import embeds, help
|
||||||
from pluralkit.bot.commands import *
|
from pluralkit.bot.commands import *
|
||||||
|
|
||||||
logger = logging.getLogger("pluralkit.commands")
|
logger = logging.getLogger("pluralkit.commands")
|
||||||
@ -48,7 +48,7 @@ async def new_system(ctx: CommandContext, args: List[str]):
|
|||||||
@command(cmd="system set", usage="<name|description|tag|avatar> [value]", description="Edits a system property. Leave [value] blank to clear.", category="System commands")
|
@command(cmd="system set", usage="<name|description|tag|avatar> [value]", description="Edits a system property. Leave [value] blank to clear.", category="System commands")
|
||||||
async def system_set(ctx: CommandContext, args: List[str]):
|
async def system_set(ctx: CommandContext, args: List[str]):
|
||||||
if len(args) == 0:
|
if len(args) == 0:
|
||||||
raise InvalidCommandSyntax()
|
return embeds.error("You must pass a property name to set.", help=help.edit_system)
|
||||||
|
|
||||||
allowed_properties = ["name", "description", "tag", "avatar"]
|
allowed_properties = ["name", "description", "tag", "avatar"]
|
||||||
db_properties = {
|
db_properties = {
|
||||||
@ -60,14 +60,14 @@ async def system_set(ctx: CommandContext, args: List[str]):
|
|||||||
|
|
||||||
prop = args[0]
|
prop = args[0]
|
||||||
if prop not in allowed_properties:
|
if prop not in allowed_properties:
|
||||||
raise embeds.error("Unknown property {}. Allowed properties are {}.".format(prop, ", ".join(allowed_properties)))
|
raise embeds.error("Unknown property {}. Allowed properties are {}.".format(prop, ", ".join(allowed_properties)), help=help.edit_system)
|
||||||
|
|
||||||
if len(args) >= 2:
|
if len(args) >= 2:
|
||||||
value = " ".join(args[1:])
|
value = " ".join(args[1:])
|
||||||
# Sanity checking
|
# Sanity checking
|
||||||
if prop == "tag":
|
if prop == "tag":
|
||||||
if len(value) > 32:
|
if len(value) > 32:
|
||||||
raise embeds.error("Can't have system tag longer than 32 characters.")
|
raise embeds.error("You can't have a system tag longer than 32 characters.")
|
||||||
|
|
||||||
# Make sure there are no members which would make the combined length exceed 32
|
# Make sure there are no members which would make the combined length exceed 32
|
||||||
members_exceeding = await db.get_members_exceeding(ctx.conn, system_id=ctx.system.id, length=32 - len(value) - 1)
|
members_exceeding = await db.get_members_exceeding(ctx.conn, system_id=ctx.system.id, length=32 - len(value) - 1)
|
||||||
@ -90,7 +90,7 @@ async def system_set(ctx: CommandContext, args: List[str]):
|
|||||||
if u.scheme in ["http", "https"] and u.netloc and u.path:
|
if u.scheme in ["http", "https"] and u.netloc and u.path:
|
||||||
value = value
|
value = value
|
||||||
else:
|
else:
|
||||||
raise embeds.error("Invalid URL.")
|
raise embeds.error("Invalid image URL.")
|
||||||
else:
|
else:
|
||||||
# Clear from DB
|
# Clear from DB
|
||||||
value = None
|
value = None
|
||||||
@ -106,7 +106,7 @@ async def system_set(ctx: CommandContext, args: List[str]):
|
|||||||
@command(cmd="system link", usage="<account>", description="Links another account to your system.", category="System commands")
|
@command(cmd="system link", usage="<account>", description="Links another account to your system.", category="System commands")
|
||||||
async def system_link(ctx: CommandContext, args: List[str]):
|
async def system_link(ctx: CommandContext, args: List[str]):
|
||||||
if len(args) == 0:
|
if len(args) == 0:
|
||||||
raise InvalidCommandSyntax()
|
return embeds.error("You must pass an account to link this system to.", help=help.link_account)
|
||||||
|
|
||||||
# Find account to link
|
# Find account to link
|
||||||
linkee = await utils.parse_mention(ctx.client, args[0])
|
linkee = await utils.parse_mention(ctx.client, args[0])
|
||||||
@ -116,7 +116,7 @@ async def system_link(ctx: CommandContext, args: List[str]):
|
|||||||
# Make sure account doesn't already have a system
|
# Make sure account doesn't already have a system
|
||||||
account_system = await db.get_system_by_account(ctx.conn, linkee.id)
|
account_system = await db.get_system_by_account(ctx.conn, linkee.id)
|
||||||
if account_system:
|
if account_system:
|
||||||
return embeds.error("Account is already linked to a system (`{}`)".format(account_system.hid))
|
return embeds.error("The mentioned account is already linked to a system (`{}`)".format(account_system.hid))
|
||||||
|
|
||||||
# Send confirmation message
|
# Send confirmation message
|
||||||
msg = await ctx.reply("{}, please confirm the link by clicking the ✅ reaction on this message.".format(linkee.mention))
|
msg = await ctx.reply("{}, please confirm the link by clicking the ✅ reaction on this message.".format(linkee.mention))
|
||||||
|
@ -65,9 +65,11 @@ For example:
|
|||||||
|
|
||||||
You will need to confirm the deletion.""")
|
You will need to confirm the deletion.""")
|
||||||
member_proxy = ("Setting up member proxying", """To register a member for proxying, use the `pk;member proxy` command.
|
member_proxy = ("Setting up member proxying", """To register a member for proxying, use the `pk;member proxy` command.
|
||||||
|
|
||||||
|
You will need to pass an "example proxy" message containing "text", surrounded by the brackets or prefixes you want to select.
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
`pk;member proxy John [text]` - Registers John to use [square brackets] as tags.
|
`pk;member proxy John [text]` - Registers John to use [square brackets] as proxy brackets.
|
||||||
`pk;member proxy John J:text` - Registers John to use the prefix "J:".
|
`pk;member proxy John J:text` - Registers John to use the prefix "J:".
|
||||||
|
|
||||||
After setting proxy tags, you can use them in any message, and they'll be interpreted by the bot and proxied appropriately.""")
|
After setting proxy tags, you can use them in any message, and they'll be interpreted by the bot and proxied appropriately.""")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user