Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
55e1021
Merge from https://github.com/jay3332/command-handler
asze17 Nov 25, 2021
1c7c3f3
Fix python3.8 check
asze17 Nov 25, 2021
ffefe69
Fix a few type errors
asze17 Dec 5, 2021
441d88c
Fix import error
asze17 Dec 5, 2021
0bf4648
Import annotations
asze17 Dec 5, 2021
8a84cc9
a comma aaa
asze17 Dec 5, 2021
e61c49e
Reexport plugins in top level
asze17 Dec 5, 2021
10855ab
Can I make a commit without breaking things
asze17 Dec 5, 2021
dff322b
Add alias
asze17 Dec 6, 2021
aeb1886
Add some converters and remove __init__.py in plugins so is a namespa…
asze17 Dec 8, 2021
ee88a48
add remove_command() to CommandSink
DistortedPumpkin Dec 13, 2021
486d68f
Merge pull request #20 from DistortedPumpkin/commands
asze17 Dec 13, 2021
1a73b10
Add converters: MemberConverter, MessageConverter, RoleConverter, Inv…
DistortedPumpkin Dec 15, 2021
d1971b6
Conformed
DistortedPumpkin Dec 15, 2021
bde9142
Type-hint output of convert() method
DistortedPumpkin Dec 15, 2021
fca035c
Fix types
DistortedPumpkin Dec 15, 2021
072634f
Prevent circular imports
DistortedPumpkin Dec 15, 2021
ecfd091
Add future import to make TYPE_CHECKING guard work. Order imports
DistortedPumpkin Dec 15, 2021
d2a540c
Make INVITE_REGEX a constant in utils.py as requested by @ Cryptex-gi…
DistortedPumpkin Dec 17, 2021
1270514
sort imports
DistortedPumpkin Dec 17, 2021
7ef8677
The oh so great maintainers asked me to walrus that
DistortedPumpkin Dec 17, 2021
7527a53
Add `__all__`
asze17 Dec 17, 2021
f37a238
Reexport
asze17 Dec 17, 2021
f468580
Merge pull request #21 from DistortedPumpkin/commands
asze17 Dec 17, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion ferris/plugins/__init__.py

This file was deleted.

15 changes: 14 additions & 1 deletion ferris/plugins/commands/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,15 @@
from .core import Bot, CommandSink
from . import errors, parser
from .core import CaseInsensitiveDict, CommandSink, Bot
from .converters import *
from .errors import *
from .models import Command, Context
from .parser import (
Argument,
ConsumeType,
Converter,
Greedy,
Not,
Quotes,
StringReader,
converter,
)
158 changes: 158 additions & 0 deletions ferris/plugins/commands/converters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
from __future__ import annotations

from typing import TYPE_CHECKING

from ...errors import NotFound
from ...utils import INVITE_REGEX, find
from .errors import BadArgument


__all__ = ('ChannelConverter',
'GuildConverter',
'UserConverter',
'MemberConverter',
'MessageConverter',
'RoleConverter',
'InviteConverter')

if TYPE_CHECKING:
from ... import Channel, Guild, Invite, Member, Message, Role, User
from .models import Context
from .parser import Converter


class ChannelConverter(Converter[Channel]):
async def convert(self, ctx: Context, argument: str):
c = None

if argument.isdigit():
id_ = int(argument)

c = ctx.bot.get_channel(id_)

if not c:
try:
c = await ctx.bot.fetch_channel(id_)
except NotFound:
if not c:
raise BadArgument(f'Channel {id_!r} not found')
else:
raise BadArgument(f'Argument must be an id.')

return c


class GuildConverter(Converter[Guild]):
async def convert(self, ctx: Context, argument: str):
g = None

if argument.isdigit():
id_ = int(argument)

g = ctx.bot.get_guild(id_)

if not g:
try:
g = await ctx.bot.fetch_guild(id_)
except NotFound:
if not g:
raise BadArgument(f'Guild {id_!r} not found')
else:
raise BadArgument(f'Argument must be an id.')

return g


class UserConverter(Converter[User]):
async def convert(self, ctx: Context, argument: str):
u = None

if argument.isdigit():
id_ = int(argument)

u = ctx.bot.get_user(id_)

if not u:
try:
u = await ctx.bot.fetch_user(id_)
except NotFound:
if not u:
raise BadArgument(f'User {id_!r} not found')
else:
raise BadArgument(f'Argument must be an id.')

return u


class MemberConverter(Converter[Member]):
async def convert(self, ctx: Context, argument: str):
m = None

if argument.isdigit():
id_ = int(argument)

m = ctx.guild.get_member(id_)

if not m:
try:
m = await ctx.guild.fetch_member(id_)
except NotFound:
raise BadArgument(f'Member {id_!r} not found')
else:
raise BadArgument('Argument must be an id.')

return m


class MessageConverter(Converter[Message]):
async def convert(self, ctx: Context, argument: str):
m = None

if argument.isdigit():
id_ = int(argument)

m = ctx.bot.get_message(id_)

if not m:
try:
m = await ctx.bot.fetch_message(id_)
except NotFound:
raise BadArgument(f'Message {id_!r} not found')
else: # TODO: Convert from message url after webclient rewrite
raise BadArgument('Argument must be an id.')

return m


class RoleConverter(Converter[Role]):
async def convert(self, ctx: Context, argument: str):
r = None

if argument.isdigit():
id_ = int(argument)

r = ctx.guild.get_role(id_)

if not r:
try:
r = await ctx.guild.fetch_role(id_)
except NotFound:
raise BadArgument(f'Role {id_!r} not found')
else:
r = find(lambda r: r.name == argument, ctx.guild.roles)

if not r:
raise BadArgument('Argument must be role id or name.')

return r


class InviteConverter(Converter[Invite]):
async def convert(self, ctx: Context, argument: str):
if match := INVITE_REGEX.match(argument):
argument = match.group(4)

try:
return await ctx.bot.fetch_invite(argument)
except NotFound:
raise BadArgument('Argument must be a valid invite url or code.')
Loading