adds function to modlg API to get cases by member (#2453)

adds command using this to view all of a member's cases demonstrating this

closes #2266
This commit is contained in:
DiscordLiz 2019-02-21 21:31:37 -05:00 committed by Kowlin
parent 77a0a67029
commit 9966668307
2 changed files with 121 additions and 1 deletions

View File

@ -1,4 +1,4 @@
from typing import Optional from typing import Optional, Union
import discord import discord
@ -6,6 +6,8 @@ from redbot.core import checks, modlog, commands
from redbot.core.bot import Red from redbot.core.bot import Red
from redbot.core.i18n import Translator, cog_i18n from redbot.core.i18n import Translator, cog_i18n
from redbot.core.utils.chat_formatting import box from redbot.core.utils.chat_formatting import box
from redbot.core.utils.menus import menu, DEFAULT_CONTROLS
_ = Translator("ModLog", __file__) _ = Translator("ModLog", __file__)
@ -105,6 +107,37 @@ class ModLog(commands.Cog):
else: else:
await ctx.send(await case.message_content(embed=False)) await ctx.send(await case.message_content(embed=False))
@commands.command()
@commands.guild_only()
async def casesfor(self, ctx: commands.Context, member: Union[discord.Member, int]):
"""
Displays the cases for the specified member
"""
try:
if isinstance(member, int):
cases = await modlog.get_cases_for_member(
bot=ctx.bot, guild=ctx.guild, member_id=member
)
else:
cases = await modlog.get_cases_for_member(
bot=ctx.bot, guild=ctx.guild, member=member
)
except discord.NotFound:
return await ctx.send(_("That user does not exist."))
except discord.HTTPException:
return await ctx.send(
_("Something unexpected went wrong while fetching that user by ID.")
)
if not cases:
return await ctx.send(_("That user does not have any cases."))
embed_requested = await ctx.embed_requested()
rendered_cases = [await case.message_content(embed=embed_requested) for case in cases]
await menu(ctx, rendered_cases, DEFAULT_CONTROLS)
@commands.command() @commands.command()
@commands.guild_only() @commands.guild_only()
async def reason(self, ctx: commands.Context, case: Optional[int], *, reason: str): async def reason(self, ctx: commands.Context, case: Optional[int], *, reason: str):

View File

@ -19,6 +19,7 @@ __all__ = [
"get_next_case_number", "get_next_case_number",
"get_case", "get_case",
"get_all_cases", "get_all_cases",
"get_cases_for_member",
"create_case", "create_case",
"get_casetype", "get_casetype",
"get_all_casetypes", "get_all_casetypes",
@ -431,6 +432,92 @@ async def get_all_cases(guild: discord.Guild, bot: Red) -> List[Case]:
return case_list return case_list
async def get_cases_for_member(
guild: discord.Guild, bot: Red, *, member: discord.Member = None, member_id: int = None
) -> List[Case]:
"""
Gets all cases for the specified member or member id in a guild.
Parameters
----------
guild: `discord.Guild`
The guild to get the cases from
bot: Red
The bot's instance
member: `discord.Member`
The member to get cases about
member_id: int
The id of the member to get cases about
Returns
-------
list
A list of all matching cases.
Raises
------
ValueError
If at least one of member or member_id is not provided
`discord.NotFound`
A user with this ID does not exist.
`discord.Forbidden`
The bot does not have permission to fetch the modlog message which was sent.
`discord.HTTPException`
Fetching the user failed.
"""
cases = await _conf.guild(guild).get_raw("cases")
if not (member_id or member):
raise ValueError("Expected a member or a member id to be provided.") from None
if not member_id:
member_id = member.id
if not member:
member = guild.get_member(member_id)
if not member:
member = await bot.get_user_info(member_id)
try:
mod_channel = await get_modlog_channel(guild)
except RuntimeError:
mod_channel = None
async def make_case(data: dict) -> Case:
message = None
if data["message"] and mod_channel:
try:
message = await mod_channel.get_message(data["message"])
except discord.NotFound:
pass
return Case(
bot=bot,
guild=bot.get_guild(data["guild"]),
created_at=data["created_at"],
action_type=data["action_type"],
user=member,
moderator=guild.get_member(data["moderator"]),
case_number=data["case_number"],
reason=data["reason"],
until=data["until"],
channel=guild.get_channel(data["channel"]),
amended_by=guild.get_member(data["amended_by"]),
modified_at=data["modified_at"],
message=message,
)
cases = [
await make_case(case_data)
for case_data in cases.values()
if case_data["user"] == member_id
]
return cases
async def create_case( async def create_case(
bot: Red, bot: Red,
guild: discord.Guild, guild: discord.Guild,