diff options
| author | 2019-09-14 15:10:39 +0200 | |
|---|---|---|
| committer | 2019-09-14 15:10:39 +0200 | |
| commit | dd2fa899c8d5ffef3725e7d86126670f974c0122 (patch) | |
| tree | dd10ebdcc2d9ff088837a3902c3b769609b9ac5c | |
| parent | Nuking the Roles.developer role. (diff) | |
| parent | Merge branch 'django' of github.com:python-discord/bot into django (diff) | |
Merge branch 'django' of github.com:python-discord/bot into django
| -rw-r--r-- | bot/api.py | 22 | ||||
| -rw-r--r-- | bot/cogs/jams.py | 17 | ||||
| -rw-r--r-- | bot/utils/moderation.py | 2 |
3 files changed, 31 insertions, 10 deletions
diff --git a/bot/api.py b/bot/api.py index 36f9cfcd4..9a0ebaa26 100644 --- a/bot/api.py +++ b/bot/api.py @@ -1,5 +1,6 @@ import asyncio import logging +from typing import Optional from urllib.parse import quote as quote_url import aiohttp @@ -10,13 +11,20 @@ log = logging.getLogger(__name__) class ResponseCodeError(ValueError): - def __init__(self, response: aiohttp.ClientResponse, response_data: dict): + def __init__( + self, + response: aiohttp.ClientResponse, + response_json: Optional[dict] = None, + response_text: str = "" + ): self.status = response.status - self.response_data = response_data + self.response_json = response_json or {} + self.response_text = response_text self.response = response def __str__(self): - return f"Status: {self.status} Response: {self.response_data}" + response = self.response_json if self.response_json else self.response_text + return f"Status: {self.status} Response: {response}" class APIClient: @@ -38,8 +46,12 @@ class APIClient: async def maybe_raise_for_status(self, response: aiohttp.ClientResponse, should_raise: bool): if should_raise and response.status >= 400: - response_data = await response.json() - raise ResponseCodeError(response=response, response_data=response_data) + try: + response_json = await response.json() + raise ResponseCodeError(response=response, response_json=response_json) + except aiohttp.ContentTypeError: + response_text = await response.text() + raise ResponseCodeError(response=response, response_text=response_text) async def get(self, endpoint: str, *args, raise_for_status: bool = True, **kwargs): async with self.session.get(self._url_for(endpoint), *args, **kwargs) as resp: diff --git a/bot/cogs/jams.py b/bot/cogs/jams.py index 43b31672b..bca1fb607 100644 --- a/bot/cogs/jams.py +++ b/bot/cogs/jams.py @@ -2,6 +2,7 @@ import logging from discord import Member, PermissionOverwrite, utils from discord.ext import commands +from more_itertools import unique_everseen from bot.constants import Roles from bot.decorators import with_role @@ -29,15 +30,19 @@ class CodeJams: The first user passed will always be the team leader. """ + # Ignore duplicate members + members = list(unique_everseen(members)) # We had a little issue during Code Jam 4 here, the greedy converter did it's job # and ignored anything which wasn't a valid argument which left us with teams of # two members or at some times even 1 member. This fixes that by checking that there # are always 3 members in the members list. if len(members) < 3: - await ctx.send(":no_entry_sign: One of your arguments was invalid - there must be a " - f"minimum of 3 valid members in your team. Found: {len(members)} " - "members") + await ctx.send( + ":no_entry_sign: One of your arguments was invalid\n" + f"There must be a minimum of 3 valid members in your team. Found: {len(members)}" + " members" + ) return code_jam_category = utils.get(ctx.guild.categories, name="Code Jam") @@ -102,7 +107,11 @@ class CodeJams: for member in members: await member.add_roles(jammer_role) - await ctx.send(f":ok_hand: Team created: {team_channel.mention}") + await ctx.send( + f":ok_hand: Team created: {team_channel.mention}\n" + f"**Team Leader:** {members[0].mention}\n" + f"**Team Members:** {' '.join(member.mention for member in members[1:])}" + ) def setup(bot): diff --git a/bot/utils/moderation.py b/bot/utils/moderation.py index b295e4649..7860f14a1 100644 --- a/bot/utils/moderation.py +++ b/bot/utils/moderation.py @@ -37,7 +37,7 @@ async def post_infraction( try: response = await ctx.bot.api_client.post('bot/infractions', json=payload) except ResponseCodeError as exp: - if exp.status == 400 and 'user' in exp.response_data: + if exp.status == 400 and 'user' in exp.response_json: log.info( f"{ctx.author} tried to add a {type} infraction to `{user.id}`, " "but that user id was not found in the database." |