Added in ace40ec. I wanted to also include a separate example with the >>> prefix so that the syntax highlighting works. However, I am going to hold off due to a bug in escape_markdown that doesn't escape > characters after newlines. I don't feel like escaping it myself.
#dev-log
1 messages ยท Page 55 of 1
Build 20201006.1 succeeded
Requested by
GitHub
Duration
00:02:49
Build pipeline
Bot
Postgres backup completed!
[python-discord/bot] New branch created: mbaruh\-star\-patch
For some reason the old nick is currently taken after the infraction is applied, meaning that the old nick, taken from the display name, is actually the new nick.
I just changed the point where the variable is made to be before applying the infraction.
Build 20201006.2 succeeded
Requested by
GitHub
Duration
00:03:41
Build pipeline
Bot
Build 20201006.3 succeeded
Requested by
GitHub
Duration
00:05:33
Build pipeline
Bot
Connected!
No problem. It looks absolutely fine, but I'll do a quick deploy to ensure it runs without errors too.
I've checked on this one, the said error occurs to me only when YOUTUBE_API_KEY environment variable is missing, works fine otherwise.
Relevant Issues
"Closes #208 "
Description
command can be invoked with pride_leader name or without name, if name is not provided then bot randomly picks name from json.
Screenshots
, and use a loop to filter out any PR that doesnโt match the requirements.
Relevant Issues
Description
This piece of code helps the user to get the temperature of any region of earth
Reasoning
Screenshots
Additional Details
Did you:
- [ ] Join the Python Discord Community?
- [ ] If dependencies have been added or updated, run
pipenv lock? - [ ] Lint your code (
pipenv run lint)? - [ ] Set the PR to allow edits from contributors?
Thank you for contributing to Python Discord!
Please check out the following documents:
- Join the Discord server! - If you have not already, join the Discord server and introduce yourself in our #dev-contrib channel.
- Python Discord Contributor Wiki - A set of resources about setting up our services
- Python Discord Code of Conduct - Code of conduct for our commu...
So can I do it? I have already started implementing it, with ability to play with more than one player too.
Build 20201006.3 failed
Requested by
GitHub
Duration
00:00:59
Build pipeline
Seasonal Bot
@Vthechamp22, @gustavwilliam have already opted to work on this issue,so sorry
This doesnโt seem to be a discord.py command, and because of that doesnโt fit this project.
Build 20201006.6 succeeded
Requested by
GitHub
Duration
00:01:02
Build pipeline
Seasonal Bot
Build 20201006.9 succeeded
Requested by
GitHub
Duration
00:00:53
Build pipeline
Seasonal Bot
I will make a new PR soon with more responses.
Relevant Issues
Closes #486
Description
This PR puts a limit on how long the response sent by the .hacktoberissues is going to be by limiting the issue body up to it's first 500 characters. This avoids http 400 errors (see #486 ) when dealing with issues with very long body.
Did you:
- [x] Join the Python Discord Community?
- [x] If dependencies have been added or updated, run
pipenv lock? - [x] Lint your code (
pipenv run lint)?
...
Thank you for contributing to Python Discord!
Please check out the following documents:
- Join the Discord server! - If you have not already, join the Discord server and introduce yourself in our #dev-contrib channel.
- Python Discord Contributor Wiki - A set of resources about setting up our services
- Python Discord Code of Conduct - Code of conduct for our commu...
Build 20201006.10 succeeded
Requested by
GitHub
Duration
00:01:02
Build pipeline
Seasonal Bot
Iโm being very picky, but would it be possible to use only 3 dots here? Thatโs what we usually use.
embed.description = body[:500] + '...' if len(body) > 500 else body
Looks good to me, thanks for the contribution!
Build 20201006.11 succeeded
Requested by
GitHub
Duration
00:00:57
Build pipeline
Seasonal Bot
You should just use textwrap.shorten instead.
Hey @Anubhav1603, @gustavwilliam checked the "I'd like to implement this feature myself", besides you didn't even commented on this issue, it is up to vestergurkan to implement it.
What is the motivation for 500? The issue discusses that the embed description can be up to 2048 characters in length.
Hey @Anubhav1603, @gustavwilliam checked the "I'd like to implement this feature myself", besides you didn't even commented on this issue, it is up to vestergurkan to implement it.
I am saying same thing to @Vthechamp22, @Akarys42 ๐ ,sorry if I was not clear
@kwzrd 500 is just a short number which I think is decent amount characters for embed descriptions. I agree this is opinionated, (large embeds just don't look good to me/I feel it's bad UX). So being pointed out, I'll limit it back to 2048 characters if that's agreeable.
It's not necessarily a bad choice, if you think that 500 looks and works better. I was just wondering about why it was chosen. Maybe you could show a screenshot of 500 vs 2048?
Build 20201006.1 succeeded
Requested by
GitHub
Duration
00:02:13
Build pipeline
Site
@kwzrd Here are the screenshots you requested-
https://ibb.co/M21rqX2
https://ibb.co/gDM642P
The one with 2048 characters totally covers my laptop screen.
Build 20201006.12 failed
Requested by
GitHub
Duration
00:01:15
Build pipeline
Seasonal Bot
Build 20201006.13 succeeded
Requested by
GitHub
Duration
00:00:48
Build pipeline
Seasonal Bot
Common problem is people leaving their voice on while having background discussions or not realizing their VOX activation level is too low so their mic is picking up every mouth noise they make.
Specifications:
It would work similar to voiceban or tempmute where role could be temporarily placed.
This command should not work on a staff member, or on a member that does not have the speaking role.
This feature should have unit tests.
Dependences
The speaking permission role mus...
Alright @Anubhav1603, although please leave this job to core devs, thanks.
The way you broke this into multiple lines doesn't follow the established style.
raise ValidationError(
{"id": f"User with ID {user_dict['id']} given multiple times."}
)
The behaviour of ignoring conflicts and raising errors for duplicates in the request should be documented in the viewset.
This is not as efficient as it could be:
seen = set()
for user_dict in validated_data:
if user_dict["id"] in seen:
raise ValidationError
seen.add(user_dict["id"])
new_users.append(...)
[python-discord/forms-frontend] New branch created: discord/improve\-oauth2\-flow
Once a user starts the authorization flow the OAuth2 button disables, if the code is received the button comes back however if the user manually closes the auth window then the button will stay disabled. This PR fixes that by checking every 500ms (JavaScript does not provide an event listener for this it seems due to cross origin security) whether the child window has been closed. In future these two flows will become a bit different, one will pop a notification up saying auth was cancelled a...
[python-discord/forms-frontend] branch deleted: discord/improve\-oauth2\-flow
[python-discord/forms-frontend] New branch created: sentry/add\-sentry
This PR introduces the Sentry integration with React including request tracing and error reporting.
How would you feel about naming this _async_init or similar? I feel like that reflects the purpose better.
I'll try to test as soon as I can, for now I've left a few thoughts (really more thoughts than anything) from an initial read.
Have you considered using just a single cache?
Since we're already serializing the perms as JSON, it could be something like:
{
permissions: { ... },
timestamp: 123
}
For the sake of "safety" I'd probably feel tempted to write a class Silence, instances of which can serialize themselves into such a JSON, and can be created from one. That would create more of a "protocol" for what is allowed to exist in the cache, but I realize that I'm basically reinventing a table her...
Since the POSIX timestamp comes out as a float, maybe we could write a -1. for consistent types, but eh nitpick.
My comment here is mainly motivated by the fact that one param restricts the valid values of the other, i.e.:
if None is passed
persistentshould be True to not log None
I generally try to avoid that and see if I can find a way to represent the information using a single value that cannot exist in an invalid state. Here I think the solution is fairly easy, unless I'm missing something.
Looks great, runs great. Thanks!
@quanta-kt Thanks for the examples, I agree that 500 is a more sane value, especially since you can just click the link to read more.
@Den4200 @Akarys42 Are you sure that textwrap.shorten is the better choice here? The problem with it is that it removes newlines. Consider this issue, which gets formatted like so:
; these cases are currently excluded from the gitignore
Build 20201006.4 failed
Requested by
GitHub
Duration
00:01:49
Build pipeline
Bot
Build 20201006.2 failed
Requested by
GitHub
Duration
00:44:59
Build pipeline
Site
Thank you for contributing to Python Discord!
Please check out the following documents:
- Join the Discord server! - If you have not already, join the Discord server and introduce yourself in our #dev-contrib channel.
- Python Discord Contributor Wiki - A set of resources about setting up our services
- Python Discord Code of Conduct - Code of conduct for our commu...
Build 20201006.4 failed
Requested by
GitHub
Duration
00:01:29
Build pipeline
Site
Had to change the logic a bit, so that it would actually take the code block when there is only one code block, but there is another one inline before it:
@staticmethod
def prepare_input(code: str) -> str:
"""Extract code from the Markdown, format it, and insert it into the code template."""
if match := list(FORMATTED_CODE_REGEX.finditer(code)):
blocks = [block for block in match if block.group("block")]
if len(blocks) > 1:
code = '\n'.joi...
Build 20201006.5 has been canceled
Requested by
GitHub
Duration
00:00:00
Build pipeline
Site
Build 20201006.6 failed
Requested by
GitHub
Duration
00:01:30
Build pipeline
Site
Keeping them separate makes it easier to separate permissions code from scheduling code. The caches are not intended to be used publicly so I'm not keen on overcomplicating serialisation for some extra safety. I could add some asserts if you'd like.
There's a slightly annoying issue I need to resolve. The Scheduler is mocked, so when (mock) coroutines are scheduled, they don't get awaited and warnings are issued (though tests still pass).
9243dcb CI: avoid failing whole job if a cache task fails - MarkKoz
[python-discord/bot] New branch created: bug/ci/cache\-continue\-on\-error
Build 20201006.7 failed
Requested by
GitHub
Duration
00:01:56
Build pipeline
Site
Build 20201006.7 has been canceled
Requested by
GitHub
Duration
00:00:00
Build pipeline
Site
Restoring from cache is non-critical. The CI can recover if cache tasks fail.
I'm not sure if we can rely on cacheHitVar remaining unset when a cache task fails. This variable is used in the condition of pipenv steps:
condition: and(succeeded(), ne(variables.PY_ENV_RESTORED, 'true'))
If it's not true, then pipenv won't be installed along with dependencies. If the cache task sets the variable before trying to restore (and failing), then this will make the job fail anyw...
Build 20201006.5 succeeded
Requested by
GitHub
Duration
00:02:26
Build pipeline
Bot
match[0] if len(blocks) == 0 else blocks[0] could be blocks[0] if blocks else match[0] but then len is fine if you prefer the explicitness. I was thinking about this after I posted the code. It's a good feature to prefer code blocks.
Build 20201006.8 failed
Requested by
GitHub
Duration
00:02:09
Build pipeline
Site
Build 20201006.6 succeeded
Requested by
GitHub
Duration
00:02:52
Build pipeline
Bot
Build 20201006.7 succeeded
Requested by
GitHub
Duration
00:04:19
Build pipeline
Bot
Connected!
Build 20201006.8 failed
Requested by
GitHub
Duration
00:02:16
Build pipeline
Site
The diff is kind of a mess now
Build 20201006.8 succeeded
Requested by
GitHub
Duration
00:02:41
Build pipeline
Bot
You could avoid the extra communities if you reword it to be something like
Communities
The communities page on our website contains a number of communities relating to programming and technology, including those we have partnered with as well as a curated list of many others.
@Akarys42 the current logic will still apply for PRs before october 3, then (probably in a separate function?) find PRs after october 3 that doesn't have invalid label or spam, AND in in a repo that has a hacktoberfest topic in it (unless the PR is labeled hacktoberfest-accepted)
I should probably also implement the "pending", "mature period", etc labels, and the 14d timer (which could probably be done later).
Description
hacktoberissues command returns issues, but the repo should also have "hacktoberfest" topic for it to count (and i don't really think a hacktoberfest label is needed but i may be wrong, please let me know)
with current logic, it finds issues with hacktoberfest label, without checking if the repo is even eligible
Possible Solutions
loop through results, only include those that has hacktoberfest label
Would you like to implement a fix?
***Note: For high...
We need a GIL emoji! What does this look like? Well... here's a few elements to start with:
- Lock
- "GIL"
- Python Logo
Possible implementation:
- GILectomy (GIL lock being removed from the python logo)
Should I make a new PR for more responses?
@ChrisGallardo Yes, that'd be fine.
Yes, it's not just the hacktoberfest topic, but also issues labeledhacktoberfestissue.
Build 20201007.1 succeeded
Requested by
GitHub
Duration
00:02:14
Build pipeline
Site
Build 20201007.2 succeeded
Requested by
GitHub
Duration
00:04:28
Build pipeline
Site
Sentry Issue: SEASONALBOT-11
Unhandled tag command error: Command raised an exception: KeyError: 'items' ('items')
@gustavwilliam @quanta-kt Here's a bit of context: #490
Build 20201007.3 succeeded
Requested by
GitHub
Duration
00:02:05
Build pipeline
Site
Everything seems to be in order behaviour-wise. It was a good refactor too. I'd like to see some comments or a description of what it does in the docstring. It's also missing tests but writing them is not a requirement.
If no one wants to do this any more, can I get assigned to this?
I have assigned you, feel free to work on it @Vthechamp22
Description
When I do .hackstats, the bot thinks my reverse pull requests are also valid Hacktober PRs.

Even though I haven't made any PR, it says that I have made a contribution


webhook_send_kwargs['username'] = sub_clyde(webhook_send_...
Build 20201007.1 succeeded
Requested by
GitHub
Duration
00:00:59
Build pipeline
Seasonal Bot
Build 20201007.4 succeeded
Requested by
GitHub
Duration
00:02:29
Build pipeline
Site
Postgres backup completed!
TextWrapper apparently has a replace_whitespace keyword-arg but shorten simply ignores it, weird.
Can't find much to comment on, lgtm
I must've been drowzy revisting this. Will fix the remarks later today
Sounds fair, but I don't know a lot of azure-pipelines, unfortunately.
[python-discord/bot] New branch created: purgeban
196838d Add the ability to purge and ban in one command. - scragly
dice = " ".join(self._get_random_die() for _ in range(num_rolls))
It's fine that _get_random_die is a @staticmethod, but we should still call it with self. Using the class name here violates the locality ideal, and also has a few other problems to consider:
- What happens if we rename this cog? Well, the method would break.
- What happens if you try to inherit from this cog, and then implement your own
_get_random_diemethod? Then this would create s...
Multiple times there's been cases where we've needed to purge a users messages due to spam or unsavoury content after banning via the bot command. As discord do support providing an argument to automatically purge a set number of days worth of messages when banning the user, it could potentially save mods a lot of time and effort.
Relevant links:
Docs for Guild.ban()
I don't know. Do we? The GILectomy is such a pie in the sky at this stage, if it's ever gonna happen it's probably years away.
I guess I'd be okay with a Python logo with a lock on it or something to represent the GIL, but I'm not sure it'd see much use.
Build 20201007.1 succeeded
Requested by
GitHub
Duration
00:03:07
Build pipeline
Bot
Thanks for making this PR!
I think the solution looks great, and you clearly know what you're doing. I have a few readability nitpicks, and I'd also like to like to see a PR description, and for you to set up some commit message rules in your IDE.
The first line in a commit should be limited to 50 characters, in order to prevent this:

In order to ensure you don't need to ma...
I'm not a fan of this way of unpacking the data. data["verified_at"], is a very surprising way to do this, in my opinion. My gut instinct was that it had to be a typo, until I realized that fetchone() probably returns two things instead of just one, in spite of its crystal clear method name.
An immediate fix for this would just be to do [0] instead of the weird comma, but that's also kind of ugly. Maybe there's a beautiful way to do this?
Don't merge this yet - I need to make a migration.
Build 20201007.2 failed
Requested by
GitHub
Duration
00:01:05
Build pipeline
Seasonal Bot
The first line in a commit should be limited to 50 characters, in order to prevent this:
Will do! I did set up precommit after the fact, but I'm not sure it would've caught the thing I fixed. Anyway, I'll try to look future PRs over an extra time before I push them.
Lastly, it looks like our builds are failing because the coverage was reduced on the user endpoint - can you write a unit test for the new endpoint?
I'm already on that as I discussed with Joe last night, I just had t...
It's because it returns a tuple or list with one element. I agree that it doesn't look great. I plan to wrap the database calls in an abstraction with a nicer API, so that might help. I'll let you know when I push it and you can see what you think.
Thanks for the contribution, it works great!
Before we merge this, we would be interested in cleaning up the history because there are 5 commits for a 1-line change. In practice, what we would want to do is only keep the first 2 commits, and drop the last 3. This is not your fault, as we told you to make a change and then asked you to revert it.
Are you familiar with git rebase and would you feel confident trying to do this? If not, that's ok, a core dev can help you or do it for you.
Build 20201007.3 failed
Requested by
GitHub
Duration
00:00:57
Build pipeline
Seasonal Bot
This method can be a static method.
The response when no emojis are found can be improved.
This is how the current response looks like for no emojis

You can add a check in emoji_count() method
if not ctx.guild.emojis:
await ctx.send("No emojis found.")
return
Use is instead of are because there is only 1 emoji
msg.append(f"There is **{len(value)}** emoji in the **{key}** category")
actually, you have to check if len(value) is equal to 1, only then use is.
You could use better names than Key and value, maybe category_name and category_emojis?
Should be generates
"""Generates error embed."""
Yes I am familiar with rebasing but still a little hesitant to do it, can you check this dummy PR here and confirm if that's what I'm supposed to be doing?
Commands used-
git rebase -i issue-486~5 issue-486 # And picking only the first commit
git push origin +issue-486 # A forced push
Also, shouldn't it get squashed into a single commit automatically if one chooses to "Squash and merge" on GitHub?
use the title() method instead
leader_name = leader_name.title()
Build 20201007.4 succeeded
Requested by
GitHub
Duration
00:00:53
Build pipeline
Seasonal Bot
Build 20201007.5 succeeded
Requested by
GitHub
Duration
00:01:00
Build pipeline
Seasonal Bot
Build 20201007.6 succeeded
Requested by
GitHub
Duration
00:00:58
Build pipeline
Seasonal Bot
Build 20201007.7 succeeded
Requested by
GitHub
Duration
00:01:00
Build pipeline
Seasonal Bot
Your dummy PR looks good, but you would want to keep the 2nd commit as well (reducing the dots from 4 to 3).
I think there is an easier way, we actually don't need to rebase because we only need to drop the last 3 commits:
git reset --hard HEAD~3
You can use git log to verify that only commits 5f02c61 and 8645da6 remain. Then git status should say that your local branch is 3 commits behind the remote. Finally git push --force will remove the commits from the remote as we...
its used in embed builder
Build 20201007.8 succeeded
Requested by
GitHub
Duration
00:01:06
Build pipeline
Seasonal Bot
Build 20201007.9 succeeded
Requested by
GitHub
Duration
00:03:09
Build pipeline
Seasonal Bot
Connected!
Build 20201007.10 failed
Requested by
GitHub
Duration
00:00:58
Build pipeline
Seasonal Bot
Build 20201007.11 succeeded
Requested by
GitHub
Duration
00:00:57
Build pipeline
Seasonal Bot
Build 20201007.12 succeeded
Requested by
GitHub
Duration
00:01:02
Build pipeline
Seasonal Bot
@dementati sounds good! Looking forward to seeing the next commits. :slightly_smiling_face:
Nice work so far!
error_comp = ', '.join(emoji_dict)
This should be enough
def generate_invalid_embed(ctx: commands.Context) -> Tuple[discord.Embed, str]:
Imported from typing
Maybe an alias for .emojis ? I can't think of any other command using that, and possible .emoji & .emojis_count
Build 20201007.13 succeeded
Requested by
GitHub
Duration
00:01:14
Build pipeline
Seasonal Bot
Relevant Issues
Closes #490
Closes #450
Description
After testing, I found that urllib.parse.quote is parsing spaces to %2520% that YouTube API don't support. Changing this to urllib.parse.quote_plus make this parsing spaces to + what YouTube API can read and then return again proper response with items key defined.
Did you:
- [x] Join the Python Discord Community?
- [x] If dependencies have been added or updated...
Build 20201007.14 succeeded
Requested by
GitHub
Duration
00:01:05
Build pipeline
Seasonal Bot
Build 20201007.15 succeeded
Requested by
GitHub
Duration
00:00:58
Build pipeline
Seasonal Bot
Build 20201007.16 succeeded
Requested by
GitHub
Duration
00:01:02
Build pipeline
Seasonal Bot
Atie is working on emoji command #462 on different pr
5d247d4 Change call of _get_random_dice call to use s... - gustavwilliam
Thanks for the explanation. I've been wondering what's considered best practice in such a case.
Build 20201007.17 succeeded
Requested by
GitHub
Duration
00:00:59
Build pipeline
Seasonal Bot
I got an API key and tried this out. Works like a charm!
I'm not sure whether this solves the problem entirely. When I try the invoking the command with a valid token and just quote, it logs a warning 1104, rather than failing on a KeyError. Can you confirm that you're getting the same behaviour?
@kwzrd What? L1104 is @snakes_group.command(name='zen').
Ah, sorry I had some extra code above. I meant the warning on line 1102 that starts with "YouTube API error".
@kwzrd But what is your response what this print out?
It logs an error, but doesn't fail on the KeyError. Which makes me think that the problem is two-fold: there may be a problem with the API key used in production, and there is a problem with the spaces (fixed by this PR).
The response I get using a valid API token but quote instead of quote_plus contains an 'items' key with an empty list as the value.
My bad if i explained it badly, but what I meant was to add more aliases, not change the name. The name was fine.
Aliases like emojis or emojis_count is what i wanted to add. Since I don't like having to use _ when calling commands & ec is like a hotkey for seasoned keyboard ninjas. Having a middleground like emojis would help.
Is this warning like:
YouTube API error. Full response looks like {'kind': 'youtube#searchListResponse', 'etag': 'pG-yJlSqu9dpyZEZ1HjJUOB2Us8', 'regionCode': 'EE', 'pageInfo': {'totalResults': 0, 'resultsPerPage': 5}, 'items': []}
because when this looks similar to this, then problem is still it, as YouTube API respond such response when this can't find videos and reason why this can't find videos is that this can't parse %2520% to space.
Yes, but the problem we're encountering in production (see the two issues linked in the PR description) is different. It's a KeyError on line 1092. The fix here is good, but won't solve the problem in the linked issues.
Adds animated server icon for hacktoberfest 2020.

Build 20201007.18 succeeded
Requested by
GitHub
Duration
00:00:53
Build pipeline
Seasonal Bot
Looks and works great - only one small thing!
Maybe we could add pban as an alias?
After seeing a twin beard lemon, there's no way not to need a twin beard lemoji. Let's make one.
Connected!
Hello @manusaurio r u still planning to implement this feature if not can I work on this issue ๐
Thanks, looks great. @SebastiaanZ helped us resolve the API token issue, while this PR makes the cog more resilient to future breakage as we'll now log the response on error instead of failing completely. The use of quote_plus makes multi-word queries resolve correctly. Great work.
Description
When running the seasonalbot, I occasionally get an error:
Ignoring exception in on_reaction_add
Traceback (most recent call last):
File "~\.virtualenvs\seasonalbot-9qy_Ovb8\lib\site-packages\discord\client.py", line 312, in _run_event
await coro(*args, **kwargs)
File "seasonalbot\bot\utils\decorators.py", line 79, in guarded_listener
return await listener(*args, **kwargs)
File "seasonalbot\bot\exts\halloween\candy_collection.py", line 76, in on_r...
Build 20201007.3 succeeded
Requested by
GitHub
Duration
00:02:26
Build pipeline
Bot
Build 20201007.19 succeeded
Requested by
GitHub
Duration
00:03:01
Build pipeline
Seasonal Bot
Connected!
This was caused by an invalid API key, which is now resolved (the linked PR did not resolve the issue, but it resolved a different one and made the cog more resilient to the same issue happening again).
The cause of this issue is not providing a youtube API token env var.
EDIT: I am not sure if this is a bug for everyone, but it is happening for me so I thought I should mention it
It should be await channel.history(limit=1, before=o).next().
Description
I was thinking of adding a .yoda command that transforms text into yoda-like speech.
Example:
.yoda You must have patience my young Padawan.
Returns:
Patience you must have my young Padawan. Hrmm
Reasoning
I recently saw the .snake snakify command, and thought it would be nice to implement a command that converts normal text to yoda-like text. It seems like a really fun implementation.
Proposed Implementation
Yoda's speech is always switched...
Bumps Metricity to discord.py 1.5 and sets the relevant intents to improve performance.
0b2bd40 Update to discord.py 1.5 - jb3
6cc87ab Merge pull request #1 from python-discord/d.py-1.5 - jb3
Instead of checking if the first post is 18+ using if posts[1]["data"]["over_18"] is True: I'd rather filter out all the 18+ posts
How are you planning to switch the subject and action? Would that require some basic natural language processing?
Also, I donโt think Yoda only adds โhhmmmโ at the end. I think randomly putting it in the sentence (between statements) or at the end or beginning would be the way to go.
I agree that yoda does add other sounds including hhmmm and yes, which I can sprinkle in throughout the text. In terms of switching the subject, verb, and action I could use a nlp parser such as spaCy to accomplish finding the subject. I'll look over some of his lines to get a better understanding of his talk as well.
Alright. How would many sentences and more complex ones be handled? Like the one I just wrote (or this one).
Build 20201007.4 succeeded
Requested by
GitHub
Duration
00:02:45
Build pipeline
Bot
You don't need to check updated_fields not in users_to_update. It's not possible for the data returned from the DB to contain duplicates.
Why did you change this? The original docstring was better.
You don't need to check this. I'm pretty sure we can safely assume guild.members will not contain duplicates.
This is almost there.
Let me test around with spaCy and yoda translations, and get back on a more concrete approach.
Appears to be as solid as rock.
Code is readable docstrings are written well and comments are well placed.
Build 20201007.5 succeeded
Requested by
GitHub
Duration
00:02:29
Build pipeline
Bot
Let me know if the docstring isn't enough. Still trying to wrap my ahead around the coding style in this repo
This feels somewhat inconsistent to me with our other commands (3 vs 3d), however I don't see an elegant way to deal with it considering you can only specify a number of days.
wrong issue
lol
This feels somewhat inconsistent to me with our other commands (3 vs 3d), however I don't see an elegant way to deal with it considering you can only specify a number of days.
Build 20201007.5 succeeded
Requested by
GitHub
Duration
00:02:08
Build pipeline
Site
Calling it "Markdown" is too vague.
If there is any code block, ignore text outside the code block.
If there are several fenced code blocks, concatenate only the fenced code blocks.
Prefer a fenced code block over an inline code block if both are present.
Hmm, I tried to rely on the terminology in the existing docstring. Would "formatted code" be more accurate?
You could narrow this down to a single request if you remove the budget and revenue fields. the search response has all of the other data, with the exception of genre names. It only gives genre ID, but what you could do is retrieve all genres once and cache them.
It's just a thought. I suppose 2 requests are fine for something low-frequency like this.
What happens if the chosen page is greater than the last page of the search results?
Wouldn't this leak the token?
Your third line doesn't convey the meaning in my third line. I tried to convey the preference by saying "concatenates only the code blocks", though I can add "and no inline code blocks"
Third line? Did you mean second? It says "concatenate only the fenced code blocks" which makes it clear inline code blocks are excluded, because inline โ fenced.
I mean that the diff has a "-" on the third line "If there is inline code but no code blocks, takes the first instance of inline code" and I don't see an alternative in your suggestion
Sorry, I get it now. I updated the suggestion. I suppose your original third line was okay but I feel mine is more succinct.
Build 20201008.2 succeeded
Requested by
GitHub
Duration
00:02:39
Build pipeline
Bot
Build 20201008.1 succeeded
Requested by
GitHub
Duration
00:02:48
Build pipeline
Bot
Including breadcrumbs at the index feels redundant, especially since there's the "Resources" title right below. Does anyone else feel the same way? Is it better to keep it for consistency?
You should document in the viewset that a 400 will be returned by the POST due to the regex validator failing.
Apologies for so many incremental reviews. I've finally done a comprehensive review and test of the API. Along with my request changes, here are the issues I encountered:
- Posting a single user (i.e. no bulk_create) that already exists results in a 500 response because of an
IntegrityError. This should be re-raises as 400 error instead. - Posting multiple users which exist with
bulk_createworks but the response still includes objects for users which were duplicates. It's just a copy...
This detailed endpoint info should be in the class docstring rather than in the method's docstring.
The way you worded it is unclear in the sense that it may imply the entire operation will abort.
Users that already exist in the database will be skipped.
- page_size: number of Users in one page
- page: page number
Almost forgot: the code in my comment omitted the comments only for the sake of example. I think the comments that existed in _get_diff were useful and you should keep them in one form or another.
Build 20201008.1 succeeded
Requested by
GitHub
Duration
00:00:55
Build pipeline
Seasonal Bot
Build 20201008.2 succeeded
Requested by
GitHub
Duration
00:01:22
Build pipeline
Seasonal Bot
Build 20201008.3 succeeded
Requested by
GitHub
Duration
00:00:55
Build pipeline
Seasonal Bot
Build 20201008.4 succeeded
Requested by
GitHub
Duration
00:00:53
Build pipeline
Seasonal Bot
Build 20201008.5 succeeded
Requested by
GitHub
Duration
00:01:01
Build pipeline
Seasonal Bot
Build 20201008.3 succeeded
Requested by
GitHub
Duration
00:03:43
Build pipeline
Bot
@ChrisGallardo @Den4200
i'm talking about fetching issues (.hacktoberissues) command, not PRs, so I don't think #475 fixes this, and I don't think hacktoberfest-accepted label on PRs is related. Am I missing something?
Postgres backup completed!
Build 20201008.1 failed
Requested by
GitHub
Duration
00:02:22
Build pipeline
Site
This feels somewhat inconsistent to me with our other commands (3 vs 3d), however I don't see an elegant way to deal with it considering you can only specify a number of days.
They're different argument types, so I don't consider it a matter of inelegance at all.
47b0630 Update bot/exts/moderation/infraction/infractio... - scragly
Build 20201008.4 succeeded
Requested by
GitHub
Duration
00:04:36
Build pipeline
Bot
Build 20201008.2 succeeded
Requested by
GitHub
Duration
00:02:32
Build pipeline
Site
Build 20201008.6 succeeded
Requested by
GitHub
Duration
00:01:23
Build pipeline
Seasonal Bot
Build 20201008.7 succeeded
Requested by
GitHub
Duration
00:01:00
Build pipeline
Seasonal Bot
Build 20201008.3 succeeded
Requested by
GitHub
Duration
00:02:41
Build pipeline
Site
Build 20201008.8 succeeded
Requested by
GitHub
Duration
00:01:03
Build pipeline
Seasonal Bot
I have tested it locally and so far it works fine for me.
The code loops through the PRs and first checks whether the PR is made before October 3rd, and immediately continues to next iteration if so. Then it checks whether 'hacktoberfest-accepted' is one of its labels (if any), and if still doesn't apply, it proceeds to query GitHub's topic API and checks if it has the hacktoberfest topic. I have also updated the docstrings for the new rules accordingly, and the logic would obviously need...
Build 20201008.4 succeeded
Requested by
GitHub
Duration
00:03:22
Build pipeline
Site
Build 20201008.5 succeeded
Requested by
GitHub
Duration
00:03:09
Build pipeline
Site
Build 20201008.6 succeeded
Requested by
GitHub
Duration
00:02:25
Build pipeline
Site
Perhaps the name reason_override is a bit misleading, it's for having a different message be sent to the user as the reason for the infraction rather than the reason sent to #mod-log. I've renamed the parameter to hopefully make it clearer.
Build 20201008.5 succeeded
Requested by
GitHub
Duration
00:04:04
Build pipeline
Bot
Perhaps the name reason_override is a bit misleading, it's for having a different message be sent to the user as the reason for the infraction rather than the reason sent to #mod-log. I've renamed the parameter to hopefully make it clearer.
Description
On the leaderboard, If you get a candy twice, your name is repeated twice on the leaderboard. So, instead of

shouldn't it be

?
Steps to Reproduce
Get two candies in #seasonalbot-commands and then do .candy
Expected Behaviour
I expected...
@hedythedev Right, sorry, I misread the issue.
I have played around with this a bit and would like to work on it, can I get assigned?
Good catch. It would seem the token isn't necessary for this request, so I'll just remove it.
Previously the max page was hard-coded, so I figured I'd just go that route for now, and improve it if it's deemed necessary. There are 16 pages in the search results for "snake". In the future, as more movies are added to TMDB, there will eventually be more pages, but that won't break anything here, and I do not expect there will ever be fewer pages than the amount there are now.
This could be fixed by setting the upper range of the random number generation to the total_pages field retu...
Would you then put that on a timer, so it triggers every hour say?
In about how much much time should the event trigger? Every day? Twice every day? Every two hours?
just wondering if we could make this like a global event rather than channel wise.
The bot sends the name in the off topic and event channels at once and people can come up with a halloweenified version of it.
I was thinking it could be a thing only for the #seasonalbot-commands channel?
The previous version removed/hid it because it was considered redundant and we'd have a page title, a breadcrumb and a content title all with the same word, which looked kinda weird. Take that how you will.
Actually I removed this breadcrumb now.
Yes, nice. I think that's much better.
It's fine, I agree that keeping it simple probably makes more sense.
Using a list is a ValidationError convention only
raise NotFound({"detail": f"User with id {user_data['id']} not found."})
Since it's performing validation, I think it makes more sense for this code to be in the serialiser. In the hypothetical case that the serialiser needs to be used elsewhere, this code would have to be duplicated.
{"id": [f"User with ID {user_dict['id']} given multiple times."]}
I also got this warning:
web_1 | /usr/local/lib/python3.7/site-packages/rest_framework/pagination.py:200: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'pydis_site.apps.api.models.bot.user.User'> QuerySet.
web_1 | paginator = self.django_paginator_class(queryset, page_size)
alright, I will return an empty list then.
Alternatively the first request could be limited to 16 pages (or some other low hard-coded number of pages), and then total_pages would be used afterwards.
This sounds good. The initial number should be slightly lower than the threshold to give some leeway for films being removed.
Okay, don't forget to document that.
I was always surprised by the parens. Do you think it reads better with them?
I'm not sure I follow, what do you mean by this?
This is cause cancel() on its own doesn't block until the task is cancelled.
Here the call to cancel will block until the task is guaranteed to be dead right?
Should we pop the channel_id from the cache? If there's an invalid cache entry, it will remain in the cache forever. Although if we just fail to get the channel for some reason temporarily, losing the mapping is not great either. :man_shrugging:
I was wondering whether it would make sense to just have the logic of _schedule_unsilence here within this function, since it's only called from here and contains the same conditional (if duration is None - else), but it's also fine to keep them separate.
Out of interest, is this documented somewhere? All docs seem to imply that we should get a 2-tuple. I'm guessing it's something to do with matching against a dict. :shrug:
Build 20201008.7 succeeded
Requested by
GitHub
Duration
00:02:20
Build pipeline
Site
Connected!
Build 20201008.8 succeeded
Requested by
GitHub
Duration
00:02:16
Build pipeline
Site
2a52e23 Fix millisecond time for command processing time - gustavwilliam
[python-discord/bot] New branch created: fix\-ping\-processing\-time
[bot] Branch fix\-ping\-processing\-time was force-pushed to `888c427`
Fixes a faulty conversion from seconds to milliseconds, for the .ping command. No matter how heavy load the bot is under, it currently displays Command processing time: 0.000ms. This PR aims to solve that, by fixing the conversion from seconds to milliseconds done.
Looks alright. I think it's a little risky to forward **kwargs because of the destination union type, but I guess it would be the caller's responsibility to make sure they don't pass an invalid kwarg.
Build 20201008.6 succeeded
Requested by
GitHub
Duration
00:03:40
Build pipeline
Bot
c035a75 Changed send_attachments so kwargs could be giv... - wookie184
f701523 Add use_cached argument to send_attachments, a... - wookie184
1481d8f Changed dm_relay to include user id in webhook ... - wookie184
64b7016 made sure to use sub_clyde on username passed t... - wookie184
af9ab45 PR #1209: Improve 'send_attachments' - kwzrd
[python-discord/bot] branch deleted: fix\-ping\-processing\-time
Build 20201008.7 succeeded
Requested by
GitHub
Duration
00:05:49
Build pipeline
Bot
Connected!
Makes sense to me, let's give it a try.
Build 20201008.8 succeeded
Requested by
GitHub
Duration
00:04:24
Build pipeline
Bot
Connected!
Build 20201008.9 succeeded
Requested by
GitHub
Duration
00:02:12
Build pipeline
Site
c035a75 Changed send_attachments so kwargs could be giv... - wookie184
f701523 Add use_cached argument to send_attachments, a... - wookie184
1481d8f Changed dm_relay to include user id in webhook ... - wookie184
64b7016 made sure to use sub_clyde on username passed t... - wookie184
888c427 Fix millisecond time for command processing time - gustavwilliam
Build 20201008.9 succeeded
Requested by
GitHub
Duration
00:02:36
Build pipeline
Bot
[python-discord/bot] branch deleted: purgeban
No, that's a misconception. It only requests for the task to be cancelled. It stops blocking once it has arranged for the CancelledError to be raised. IT doesn't get raised immediately and the task can choose to catch the exception to delay or even suppress cancellation.
Build 20201008.10 succeeded
Requested by
GitHub
Duration
00:04:21
Build pipeline
Bot
Connected!
Excellent work. Thanks for putting up with my scrutiny.
4644084 add pagination for GET request on /bot/users en... - RohanJnr
8e636a5 add support for bulk updates on user model - RohanJnr
792af71 Add reference links in UserListSerializer methods - RohanJnr
303cb19 Except AttributeError when self.instance is Non... - RohanJnr
567f7f0 Add code to replace restframework_bulk package ... - RohanJnr
Relevant Issues
Closes #495
Description
The older code was storing candy spawn information in the json, which I think is unnecessary. I have replaced it all with two sets- candy_messages and skull_messages which contain the message ids of the messages where the spawns were made and pop them out when someone reacts to it.
The old schema looked like-
{
"msg_reacted": [
{
"reaction":" \ud83c\udf6c",
"msg_id": 514442502460276740,
...
Build 20201008.9 failed
Requested by
GitHub
Duration
00:00:57
Build pipeline
Seasonal Bot
Build 20201008.10 succeeded
Requested by
GitHub
Duration
00:04:23
Build pipeline
Site
Build 20201008.11 succeeded
Requested by
GitHub
Duration
00:02:49
Build pipeline
Bot
681027b refactor code to GET users from site endpoint ... - RohanJnr [0436f69](https://github.com/python-discord/bot/commit/0436f69476243f7c3bf8e5c0520933e71d2f5fda) Merge remote-tracking branch 'upstream/master' ... - RohanJnr [ec0db2d](https://github.com/python-discord/bot/commit/ec0db2dd98e55f8bf5ba1c07375e196933129f99) Refactor code to make use of bulk create and up... - RohanJnr [eca87e3](https://github.com/python-discord/bot/commit/eca87e32948142863c562664bde262bf9054ca94) fix type and add variable type hinting - RohanJnr [3f87c52`](https://github.com/python-discord/bot/commit/3f87c52f484afc1316e87f67f4055d5d615b054a) Update users on bot start via HTTP PATCH method... - RohanJnr
Build 20201008.10 succeeded
Requested by
GitHub
Duration
00:01:15
Build pipeline
Seasonal Bot
Build 20201008.12 succeeded
Requested by
GitHub
Duration
00:04:29
Build pipeline
Bot
Connected!
I'd rather keep it since it may be a temporary issue. It doesn't cause any problems to leave it in there. In other places the cache is used, the channel is supplied by the channel of the context. Therefore, rescheduling is the only time the channel's validity needs to be checked.
It's being passed to SilenceNotifier on the next line.
I like how the refactor separated the responsibilities. One function sets permissions, one schedules an unsilence, and the command function, for the most part, just sends messages/logs. Of course, it also calls the other two functions. Considering this, the notifier.add_channel isn't really that out of place either.
d0c3990 Silence: add to notifier when indefinite rather... - MarkKoz
No. This code just went through several iterations. There used to be a function call somewhere in between.
I meant it being assigned as an attr. It's only used within the function.
I'm not sure why the API calls this a blog instead of website like the UI, but could you rename this to Website instead?
You should use the bot's session instead.
async with self.bot.http_session.get(url) as r:
return await r.json()
It'd be nice if there was a description saying something that describes the problem, like this:
User does not exist.
Also, what about organisations? Would you like to implement support for organisations? If not, I'd appreciate if you could open an issue for it, so someone else can tackle it.
One small formatting thing below as well.
Instead of hyperlinking Direct link, could we just have the link itself? I think that would look best.
blog = user_data['blog']
elif user_data['blog']: # Blog exists but the link is not complete
blog = f"https://{user_data['blog']}"
It'd look something like this:

So the current behavior of the help channel cooldown feels a bit off. As it's written right now, a user claims a channel and then receives the Help Cooldown role. After 15 minutes, whether or not their channel is still open, they can claim another channel. This means that every 15 minutes, someone can open a help channel and still keep the other ones open.
I propose that we either link the person with their channel and only start the 15 min cooldown after the channel has been closed, ...
[python-discord/forms-frontend] branch deleted: sentry/add\-sentry
[python-discord/forms-frontend] New branch created: sentry/add\-sentry\-prefix
Prefix the Sentry release created by GitHub Actions with forms-frontend@ to match that which the client is reporting.
[python-discord/forms-frontend] branch deleted: sentry/add\-sentry\-prefix
Out of the moderation tools we have available, the superstar command is the odd one out.
- It doesn't ping the user being superstarred, instead posting a special embed (albeit a pretty funny one)
- It doesn't send the reason in the DM.
That leads to some confusion for users on what happened and why it happened.
We don't have to remove the special embed, but:
- It should still give a standard "applied superstar to " so that the user is pinged if it's applied in a public channel
- The...
Regarding your question: I think refreshing the leaderboard on each deploy is the expected behavior. Currently, this bot does not use a database and cannot store such data.
Other features, such as .quiz also refreshes the leaderboard on each deploy.
this should be
def embed_builder(emoji: dict) -> Tuple[discord.Embed, List[str]]:
make sure to import List from Typing
same thing here
def generate_invalid_embed(ctx: commands.Context) -> Tuple[discord.Embed, List[str]]:
Instead of sending the context, you could only send the emojis (ctx.guild.emojis) as that is what is actually required.
You could actually remove the \n here.
Here are a few screenshots:
With \n

Without \n

Experiment with it and see which one looks better. I'm leaning towards removing the \n, but do check with more emoji categories.
I'm not sure about this. Wouldn't that create more situations where someone can't ask their question because they're on cooldown? I think I would rather someone opened a second help channel than someone not being able to ask their question.
As an alternative, if someone opens a second help channel, we could automatically close the first one.
Actually I am using linepaginator that's y it's automatically add spaces in main pydis server we have many category that's y i am using linepaginator so it don't get errored out
This can be
if not valid_name:
Postgres backup completed!
I think the implementation we choose for this feature would depend on if decide to introduce a mypy endpoint; if we already have two endpoints I think it would make sense to have a third one, otherwise wrapping the code in a timeit snippet makes more sense IMO
I agree with mbaruh that people may often want to follow up a question soon after closing a channel, so I don't think always having to wait 15 minutes after closing your channel is great.
I also don't really like the idea of automatically closing the first channel, I don't think people would expect this to happen and I reckon people would end up accidentally closing active channels and getting confused.
That said, I don't see a reason a user should need to have two channels open at once...
This does sound like a good idea. It would only require changing the condition of when a user is able to see the available help channels and the cooldown channel, and slightly reword what's written in the cooldown channel.
Relevant Issues
closes #477
Description
this fixes candy_collection.py throwing
TypeError: 'HistoryIterator' object is not an iterator when
an arrow button is pressed after the .help command.
Reasoning
Before:
Traceback (most recent call last):
File "/home/hedy/.local/share/virtualenvs/seasonalbot-S5lMGbTO/lib/python3.8/site-packages/discord/client.py", line 312, in _run_event
await coro(*args, **kwargs)
File "/mnt/c/Users/hedyh/codeproj...
Thank you for contributing to Python Discord!
Please check out the following documents:
- Join the Discord server! - If you have not already, join the Discord server and introduce yourself in our #dev-contrib channel.
- Python Discord Contributor Wiki - A set of resources about setting up our services
- Python Discord Code of Conduct - Code of conduct for our commu...
Build 20201009.1 failed
Requested by
GitHub
Duration
00:01:04
Build pipeline
Seasonal Bot
wait so the false positive of flake8 is still there, ok lemme fix it
Build 20201009.2 succeeded
Requested by
GitHub
Duration
00:01:21
Build pipeline
Seasonal Bot
Build 20201009.3 failed
Requested by
GitHub
Duration
00:01:02
Build pipeline
Seasonal Bot
Build 20201009.4 failed
Requested by
GitHub
Duration
00:01:28
Build pipeline
Seasonal Bot
Build 20201009.5 succeeded
Requested by
GitHub
Duration
00:01:01
Build pipeline
Seasonal Bot
Any reason we are storing the owner's user ID instead of a foreign key to the User model?
Build 20201009.6 succeeded
Requested by
GitHub
Duration
00:01:04
Build pipeline
Seasonal Bot
No special reason, I meant it as a foreign key. Feel free to change it to what seems appropriate.
Build 20201009.7 succeeded
Requested by
GitHub
Duration
00:01:24
Build pipeline
Seasonal Bot
Build 20201009.8 succeeded
Requested by
GitHub
Duration
00:01:17
Build pipeline
Seasonal Bot
Build 20201009.2 succeeded
Requested by
GitHub
Duration
00:02:41
Build pipeline
Bot
@Den4200 It has support for organisations tho
<img width="294" alt="Screenshot 2020-10-09 at 11 36 22 PM" src="https://user-images.githubusercontent.com/62901541/95616927-3e2e8c00-0a88-11eb-9dd5-6b12d184edca.png">
Build 20201009.9 succeeded
Requested by
GitHub
Duration
00:01:10
Build pipeline
Seasonal Bot
@LakshyaShastri That's not what I meant. See below.

The ollowers, following, starred repos, and organisations field in this embed are not revelant for an organisation account.
Build 20201009.10 succeeded
Requested by
GitHub
Duration
00:01:05
Build pipeline
Seasonal Bot
Looks good, just a few code style changes.
the get() method can take a 2nd argument for a default value.
self.candy_records = candy_data.get("records", {})
Have a globally scoped variable called EMOJIS to store \N{CANDY} and \N{SKULL}.
A dict will do.
This is because, if we have to change those in the future, we will have to replace each and every occurrence which can be a nightmare.
After defining the dict, replace all occurrences of \N{CANDY} and \N{SKULL} by using that dict.
Again here, use the default value argument of get() method
prev_record = self.candy_records.get(str(message.author.id), 0)
Do this in all places.
The following methods can be converted to static methods:
- send_spook_msg
- remove_reactions
Great, could you address my other comments then?
this emoji variable can be merged with the EMOJIS variable which I mentioned earlier in the review.
the argument all of your is a string but the method send_spook_msg expects an integer value as the number of candies.
You need to update the function type annotation from being candies: int to candies: Union[int, str]
Don't forget to import Union from typing.
@Den4200 I've already resolved the direct blog link issue
You skipped over my other eight comments @LakshyaShastri.
Not sure how that will work out? Please take a look at line 192 which utilizes indices of this tuple.
Applied all other suggestions on a local branch, will commit and push it all together once this gets answered.
Oh damn, sorry about that. I'll get those done ASAP
The spookyavatar/savatar command currently accepts an optional user input, but it doesn't actually seem to use that for the image, using the message author instead anyway, so this could also be fixed. Relevant line: https://github.com/python-discord/seasonalbot/blob/ba6536cf2011dc52d1e103407d75aa699975656b/bot/exts/halloween/spookyavatar.py#L39
I think you can count this as approved and start working on it if you want to.
Id like to implement this feature
It would be fairly trivial to wrap the code in a timeit snippet to test the time it takes. Currently Snekbox only has one endpoint and im not sure it would make sense to reimplement eval with python -m timeit <code> when its easy to just eval timeit.main([<code>])
Thanks for the explanation. It also make sense, as the docs explain, that the exc will not be raised until the next cycle of the event loop, so we need to hit an await. I understand the code now - we add a done callback precisely because we want the cancel_all to be called only after the task actually dies.
Yea, makes sense. In practice it's very unlikely to happen anyway, unless a silenced channel is deleted or something.
Sure, it's fine and it makes sense to split it up. I just think it adds a little bit of mental overhead, having to follow the same conditional in two places, but I'm cool with it.
Hello @manusaurio r u still planning to implement this feature if not can I work on this issue
Sorry, feel free to do it.
Looks good, works well. Again sorry for the time it took to get this reviewed. :disappointed:
I've done a code review and tested the cog, I did not spend too much time on the tests, hope that's ok. For the autospec, it's difficult for me to give a review there, but as far as I can tell the way we patch should be safe (i.e. it won't make a test that should fail pass instead). I agree that the new behaviour should be more convenient and have no issues with the monkeypatch as long as it do...
81711d7 Created file for moderation utils tests + added... - ks129
1549690 (Moderation Utils Tests): Added imports, modifi... - ks129
fa6a0ae (Moderation Utils Tests): Created tests for ha... - ks129 [98f7a37](https://github.com/python-discord/bot/commit/98f7a3777152b32bfda24f9d5add938479827c85) (Moderation Utils Tests): Created tests for no... - ks129
4a746fc (Moderation Utils Tests): Created tests for `no... - ks129
Build 20201009.11 succeeded
Requested by
GitHub
Duration
00:01:16
Build pipeline
Seasonal Bot
Build 20201009.3 succeeded
Requested by
GitHub
Duration
00:02:48
Build pipeline
Bot
I'm not making this change yet. I'm still waiting for thoughts on whether forcing manual unsilences is desirable.
If I understand correctly, the proposal is for unsilence to simply set the cached overwrites, or Nones on cache miss? I'm impartial, it makes sense to me to only allow unsilence to be used if the channel was silenced using the cog, on the other hand, maybe mods would find it convenient and it would probably simplify the code quite a bit, so why not. I'm not opposed to it, but I'll leave the decision to you.
:wave: The logic here doesn't quite match how Hacktoberfest handles PRs -- it looks like spam/invalid labelled PRs are being completely excluded for example.
I created a (rather bad) flow chart which covers the basic state check/flow that PRs go through in Hacktoberfest:

You can also read through the raw logic in https://github.com/digitalocean/hacktoberfest/blob/master/app/...
Sentry Issue: BOT-9N
It can do a better job than displaying the raw exception message to the user.
OverflowError: signed integer is greater than maximum
File "discord/ext/commands/core.py", line 444, in _actual_conversion
ret = await instance.convert(ctx, argument)
File "bot/converters.py", line 352, in convert
return now + delta
File "dateutil/relativedelta.py", line 405, in _...
@davisschenk That approach sounds fine, though it is noteworthy that main() is undocumented. I'm not sure if this is unintentional or if it implies that it's not part of the public API. In any case, I'll assign you to this issue.
Since I already implemented it, I'm inclined to leave it at this point. I think it will be such a rare occurrence that no one will even notice either way. And if they do, they can complain and I'll remove it.
How would you feel about making this an or? To get the manual message out if either was disabled manually. I think when mods silence manually, they may not always disable reactions.
98c93d2 Deps: install 'unittest-parallel' & re-lock - kwzrd
[python-discord/bot] New branch created: kwzrd/unittest\-parallel
Hi @MattIPv4, thanks for the flowchart. The main problem is probably because the current and previous results doesn't show the difference between 'valid' and 'waiting', it also doesnt take care of the 'PR acceptance logic', all it does is exclude invalid/spam PRs, and (for after oct 3) the ones that aren't in a hacktoberfest repo (unless hacktobefest-accepted label). @gustavwilliam has said to update the rules ASAP and do the rest (pending, in review period) in a separate issue/pr later. So I...
main([<args>]) is just the equivalent of python -m timeit <args>
Anyone have any opinions on whether or not this should be implemented as a sub-command of eval or as a standalone command?
Standalone. It's not returning the code's output so it's not strictly an eval of the original input. Furthermore, a subcommand would make it impossible to use the subcommand name at the start of the code for an eval unless it was in a code block. Lastly, I imagine it'd complicate parsing of revaluations.
I wouldn't mind seeing B305 added to the ignores in tox.ini. This warning feels like a relic of the past when Python 2 was still prevalent in people's minds.
Build 20201010.1 succeeded
Requested by
GitHub
Duration
00:02:43
Build pipeline
Bot
Build 20201010.1 succeeded
Requested by
GitHub
Duration
00:00:56
Build pipeline
Seasonal Bot
Postgres backup completed!
You can store it in a list
EMOJIS = {
"medals": (
'\N{FIRST PLACE MEDAL}',
'\N{SECOND PLACE MEDAL}',
'\N{SPORTS MEDAL}'
)
}
@MarkKoz All feedback addressed
Build 20201010.2 succeeded
Requested by
GitHub
Duration
00:02:39
Build pipeline
Bot
@Den4200 It did do that earlier, but I changed this to comply with this suggestion
this can be formatted in a better way.
top_sorted = sorted(
((user_id, score) for user_id, score in self.candy_records.items()),
key=lambda x: x[1],
reverse=True
)
leaderboard = '\n'.join(
f"{emoji[index]} <@{record[0]}>: {record[1]}"
for index, record in enumerate(top_five)
) or 'No Candies'
When I initially have candies and later lose them (by reacting to a skull), shouldn't my name be displayed on the leaderboard?

The formatting won't allow the value fields for followers, following, and organization to be in one line
e.add_field(
name='\u200b',
value="Candies will randomly appear on messages sent. "
"\nHit the candy when it appears as fast as possible to get the candy! "
"\nBut beware the ghosts...",
inline=False
)
better indentation for the whole add_field()
Hmmm, I didn't know about the 30 starred repo limit thing, thanks for catching that. Instead of displaying inaccurate stats I think we should just replace it with gists, that sounds like a great idea to me
Just out of curiosity, how would I increase that to 100 per request?
you can check if self.candy_records validates to True before sorting and getting the top_five.
This can be a separate function too.
def generate_leaderboard(self):
if not self.candy_records:
return "No candies."
top_sorted = sorted(
((user_id, score) for user_id, score in self.candy_records.items()),
key=lambda x: x[1],
reverse=True
)
top_five = top_sorted[:5]
leaderboard = ...
I'm gonna work with it.
Build 20201010.2 failed
Requested by
GitHub
Duration
00:00:55
Build pipeline
Seasonal Bot
Also, it might be worth adding a few logging statements in the code where you can catching errors using try except code blocks.
Build 20201010.3 succeeded
Requested by
GitHub
Duration
00:01:07
Build pipeline
Seasonal Bot
12cbfe7 (Aliases, discord.py 1.3.x Migration): Replaced... - ks129
61a93c1 (Snekbox, discord.py 1.3.x Migration): Replaced... - ks129
88b4c72 (Patches, discord.py 1.3.x Migration): Removed ... - ks129
1a14f4f (Off-Topic Names, discord.py 1.3.x Migration): ... - ks129
a4a4b98 (Reddit, discord.py 1.3.x Migration): Replaced ... - ks129
Build 20201010.3 failed
Requested by
GitHub
Duration
00:00:58
Build pipeline
Bot
and, I made the command as .ratethespook, is it fine?
Build 20201010.4 succeeded
Requested by
GitHub
Duration
00:00:59
Build pipeline
Seasonal Bot
I'm not sure if we should keep it to let the user know that he had reacted to candies before.
What are your thoughts?
I think it's better to drop the users with 0 score out of leader-board
Also, it might be worth adding a few logging statements in the code where you can catching errors using try except code blocks.
Will do.
Instead of checking the truthness of the entire dict, I think it's better to check it with top_five due to the fact that candy_records can contain records with 0 score which still evaluates to false and I'd like to drop them out of leader-board.
Build 20201010.5 succeeded
Requested by
GitHub
Duration
00:01:03
Build pipeline
Seasonal Bot
Build 20201010.6 succeeded
Requested by
GitHub
Duration
00:00:59
Build pipeline
Seasonal Bot
Description
With the .riddle command, when a user sends a correct answer multiple times (probably because there isn't any response immediately after correct answer), the final 'who wins' message becomes like this:

๐ [message link](#sir-lancebot-playground message)
Steps to Reproduce
- go to #seasonalbot-commands...
will we allow changes in user event names?
Build 20201010.7 succeeded
Requested by
GitHub
Duration
00:01:12
Build pipeline
Seasonal Bot
7909c4d Add space between dice in roll command - gustavwilliam
6969fc1 Revert and update roll command - gustavwilliam
cfb9237 Rewrite roll command - gustavwilliam
ebf41d3 Move _get_random_die to me a separate function - gustavwilliam
5d247d4 Change call of _get_random_dice call to use s... - gustavwilliam
[python-discord/seasonalbot] branch deleted: space\-out\-dice
Build 20201010.8 succeeded
Requested by
Leon Sandรธy
Duration
00:03:07
Build pipeline
Seasonal Bot
Connected!
Hello, I am working on the same file under PR #496 and have removed those functions entirely. Please see this commit diff
Build 20201010.9 succeeded
Requested by
GitHub
Duration
00:00:55
Build pipeline
Seasonal Bot
will we allow changes in user event names?
I'd say yes, I don't see why we shouldn't allow that.
will we allow changes in user event names?
I'd say yes, I don't see why we shouldn't allow that.
In that case, the name wouldn't be a good choice for a primary key? cuz when we patch request for updating name, it instead creates a new instance.
We can use the default ID generated by Django.
Build 20201010.1 succeeded
Requested by
GitHub
Duration
00:02:37
Build pipeline
Site
I think it no longer makes sense for additional_info to be optional. The default is a string and we wouldn't want to get a None as its repr would show in the modlog.
I agree that the new name is better.
You can use a UID, no problem, it is better than creating a whole new object and deleting the old one.
What would be the reasoning behind changing an event name?
If it's just a typo at the moment of creation, they can just delete and make a new one.
If it's a matter of changing the purpose of the event, I'm not sure we want to allow that. The purpose of having an events table is to allow users to subscribe to them. Users who subscribe to an event about Yu-Gi-Oh! won't want to suddenly find out they're subscribed to an event about the Spice Girls.
Also, even if you use the UID the event n...
This looks good, works perfectly with production metricity data, is well documented and tested and is ready to go.
6ab05d3 Set default example.com dev site to pythondisco... - scragly
e2956b8 Set newest-first sorting for message deletion m... - scragly
f590d2b Add message log links, improved formatting to m... - scragly
618610f Order roles by positioning, add filters and sea... - scragly
0021d4a Improve infractions admin list and page, add se... - scragly
Build 20201010.2 failed
Requested by
GitHub
Duration
00:02:12
Build pipeline
Site
Thanks for making this PR!
I think the solution looks great, and you clearly know what you're doing. I have a few readability nitpicks, and I'd also like to like to see a PR description, and for you to set up some commit message rules in your IDE.
The first line in a commit should be limited to 50 characters, in order to prevent this:

In order to ensure you don't need to ma...
c8c6cb8 Added metricity db connection and user bot API - Lucas Lindstrรถm
c3752e5 Merge branch 'master' into feat/397-398-metrici... - dementati
a188ab8 Fix minor style issue. - Lucas Lindstrรถm
85a0d57 Merge branch 'feat/397-398-metricity-db-and-api... - Lucas Lindstrรถm
15086b4 Added total message count to metricity data res... - Lucas Lindstrรถm
Can I get assigned to here? Is this now possible to get role + channel IDs too?
Changing an event name doesn't necessarily mean that its purpose changed. I can imagine a lot of situations were the name wouldn't be good enough, and the event owner would just want to change it.
Build 20201010.3 succeeded
Requested by
Joseph Banks
Duration
00:04:29
Build pipeline
Site
I'd like to work with this same time when with #1190
Given that message links jump to deleted messages sometimes, it's hard to figure out who was the perputrator.
Within the incidents channel, it may be a good idea for the bot to provide a user ID for the message link owner so mods+ can look into their message history.
If the message link returns nothing, then maybe (if it's possible) the bot can send a message to redirect to a deleted message in the message-change-log channel.
Still, those kinds of situations sound pretty limited, and I still think the name should be unique. I wouldn't want two events with the same name.
Even if it's not the primary key, it seems that like how change of ownership should only be allowed by an admin, so does changing the name. It seems to me that more often than not a name change would mean that something is up with the event, and a name being changed can confuse the users, so the aim should be to do it as little as possible.
Fair enough; that said, I think we should even fuzzy match the name to make sure that we don't have any similar already existing events to avoid any trolling.
Build 20201010.4 failed
Requested by
GitHub
Duration
00:01:58
Build pipeline
Site
b42094d Add media query for heading scaling on mobile d... - jb3
How about also adding in a description field to User Events?
Build 20201010.8 failed
Requested by
GitHub
Duration
00:01:55
Build pipeline
Site
I've made a few fixes:
- Fixed the CSS so it no longer overrides our own CSS
- Removed the read more buttons, I think these events are summed up enough in a sentence or two.
- Prettified the CSS and HTML so it is easier to work on
- Enabled the JS since the load animations work on my MacBook, let me know if you experience otherwise (I don't think it won't work on phones, which is fine)

msg.append(
f"There {'is' if len(category_emojis)==1 else 'are'} **{len(category_emojis)}** "
f"{'emoji' if len(category_emojis)==1 else 'emojis'} in the **{category_name}** category"
)
here also,
emoji_info = (
f"There {'is' if len(category_emojis) == 1 else 'are'} **{len(category_emojis)}** "
f"{'emoji' if len(category_emojis) == 1 else 'emojis'} in the **{category_name}** category"
)
A bit a spacing helps to distinguish between what is an import statement and logger.
from bot.constants import Colours
log = logging.getLogger(__name__)
"""Verify leader name whether it is present in json or not."""
The function also returns None when leader_name is not in self.pride. Need to update function return type
def name_verifier(self, leader_name: str) -> Optional[str]:
- Allow
voice_baninfraction type. - Include voice banned status to metricity endpoint for better performance + cover it with test.
Build 20201010.11 succeeded
Requested by
GitHub
Duration
00:02:04
Build pipeline
Site
Looking good ks!
This work fine locally, I've inserted a record and queried the endpoint, it returns the expected result.
I've added a slight comment because I think the error handling section in the viewset is handling for an impossible case.
Will there ever be multiple active voice bans for a user?
These cannot be in the DB due to the one active infraction type per user constraint.
ERROR: duplicate key value violates unique constraint "unique_active_infraction_per_type_per_user"
Maybe we should put a trailing comma here to stop diffs like this in future
("voice_ban", "Voice Ban"),
Everything looks great, just a tiny suggested change that isn't your fault at all.
("voice_ban", "Voice Ban"),
I know it wasn't there before, but future cases could be avoiding the same two-line diffs with it.
Build 20201010.15 succeeded
Requested by
GitHub
Duration
00:02:28
Build pipeline
Site
Build 20201010.16 succeeded
Requested by
Joseph Banks
Duration
00:04:16
Build pipeline
Site
http.cat urls respond with HTTP status 404 if a cat image does not exist. It could be used instead of checking the status validity using the stdlib.
The code suggested there still has a description for the embed.
Something like this should work.
embed.add_field(
name="Followers",
value=f"[{user_data['followers']}]({user_data['html_url']}?tab=followers)"
)
embed.add_field(name="\u200b", value="\u200b")
embed.add_field(
name="Following",
value=f"[{user_data['following']}]({user_data['html_url']}?tab=following)"
)
You can add on ?per_page=100 to the end of the URL to get 100 per request. Some endpoints default to 30, and others default to 100. The starred repositories endpoint happens to default to 30.
Build 20201010.10 succeeded
Requested by
GitHub
Duration
00:00:52
Build pipeline
Seasonal Bot
okay, all that's done now @Den4200, have a look!
Honestly that doesn't sound that bad. We can do some integer validation, checking that a user isn't looking for dodgy stuff, and otherwise let that handle all the validation. There is no reason why new status codes will not be implemented, and will take longer to get into stdlib than they do http.cat.
To avoid an extra API call, you can get the amount of a public gists from user_data. It is under the public_gists key: user_data['public_gists'].
Build 20201010.11 succeeded
Requested by
GitHub
Duration
00:00:42
Build pipeline
Seasonal Bot
gists is the number of gists the user has, so you don't need to use the len function.
embed.add_field(name="Gists", value=f"[{gists}](https://gist.github.com/{username})")
frick shouldn't have hurried, sorry
Build 20201010.12 succeeded
Requested by
GitHub
Duration
00:01:00
Build pipeline
Seasonal Bot
Build 20201010.13 succeeded
Requested by
GitHub
Duration
00:00:59
Build pipeline
Seasonal Bot
Build 20201010.14 succeeded
Requested by
GitHub
Duration
00:02:39
Build pipeline
Seasonal Bot
Connected!
Actually in this command u have both option u can give name or leave, if u don't give it will select randomly but if u give it will select that only .So, changing name will be worth it and in my issue also scargly clearly mention name should be prideleader.
Build 20201011.1 succeeded
Requested by
GitHub
Duration
00:02:32
Build pipeline
Site
Currently this is impossible to run bot with docker-compose up because site will fail start, as now this require metricity DB URL as environment variable.
Build 20201011.1 succeeded
Requested by
GitHub
Duration
00:02:49
Build pipeline
Bot
Build 20201011.2 succeeded
Requested by
GitHub
Duration
00:02:34
Build pipeline
Bot
Build 20201011.3 succeeded
Requested by
GitHub
Duration
00:04:28
Build pipeline
Bot
Connected!
Postgres backup completed!
plan.pdf
I made a diagram(view the pdf).
Here is what I am suggesting again:
-
Store the ID of the message which will be sent in the #user_events channel(this channel will list all events by listing their name, description, organizer and status).
-
Add reaction to that message to toggle subscription.
-
When the event starts, the bot sends an announcement in #user_events_announcements channel by sending the event name, de...
Build 20201011.4 succeeded
Requested by
GitHub
Duration
00:02:42
Build pipeline
Bot
Build 20201011.5 succeeded
Requested by
Leon Sandรธy
Duration
00:04:40
Build pipeline
Bot
Connected!
I'd rather the ping wasn't automatic. There's no guarantee that the organizer is actually available at the assigned time, for whatever reason, in which case pinging everyone isn't ideal. So the ping option should be invoked manually imo.
I might be wrong, but looking at the plan it seems you want to use the description when pinging. My impression when you suggested it is that you want to use the description for the scheduling, which seems appropriate if that's where you add the subscriptio...
0d6fe3e Remove django-allauth from Pipfile. - lemonsaurus
b648783 Remove django-allauth from settings. - lemonsaurus
a2357c0 Remove files related to django-allauth. - lemonsaurus
517310e Remove allauth references from the home app. - lemonsaurus
892661e Remove the login feature from the templates. - lemonsaurus
[python-discord/site] branch deleted: remove\_oauth
I think this tries to solve a problem we don't have. Is anyone really abusing this to create lots of channels? Does it matter if some members occasionally have two channels open?
Imagine a member who has received an answer in his first help channel and now needs help with a second, unrelated matter. He's not aware that there's a !close function because he's new to the community, and has observed that his previous help channel just closed automatically after a while, so he's decided to wa...
I think having a one channel at a time system is most intuitive, and the cool down is mainly there to stop people spam opening and closing channels (maybe it could even be reduced with this proposal).
I agree that the problem it is solving is a fairly small one, but it does still happen. From what I've seen nearly all of the people who have two help channels open at once are asking the same question in both (granted that is purely anecdotal and someone asking the same question would likely b...
This PR implements bot side of Voice Gate and Voice Ban (infraction).
Voice Gate
- Added
voiceverifycommand that checks does user pass Voice Gate. When user pass, give role but when not, send he don't pass. - Bot automatically clean up voice gate channel, only staff messages will be not deleted.
- In this cog,
InWhitelistCheckFailureexception will be suppressed.
Voice Ban
- Added new infraction type Voice Ban.
- This is available as 2 formats: permanent and temporary.
- ...
Build 20201011.6 succeeded
Requested by
GitHub
Duration
00:02:41
Build pipeline
Bot
Build 20201011.9 succeeded
Requested by
GitHub
Duration
00:00:55
Build pipeline
Seasonal Bot
Build 20201011.8 succeeded
Requested by
GitHub
Duration
00:00:57
Build pipeline
Seasonal Bot
Build 20201011.10 succeeded
Requested by
GitHub
Duration
00:00:58
Build pipeline
Seasonal Bot
Build 20201011.13 succeeded
Requested by
GitHub
Duration
00:01:01
Build pipeline
Seasonal Bot
"Closes #351 "
this is a simple fix in check func
- [x] Join the Python Discord Community?
- [x] If dependencies have been added or updated, run
pipenv lock? - [x] Lint your code (
pipenv run lint)? - [x] Set the PR to allow edits from contributors?
Build 20201011.14 succeeded
Requested by
GitHub
Duration
00:01:02
Build pipeline
Seasonal Bot
Object subcommands such as refcount are currently only available through the underlying aioredis Redis object
Description
The .http_cat command is supposed to send the picture associated with the status code the user enters. To check if the user has entered a valid status code, it checks if it is in the HTTPStatus enum. The problem with this, is that three of the status codes, 103 EARLY_HINTS, 418 IM_A_TEAPOT and 425 TOO_EARLY, are new to python version 3.9, though they are in http.cat. We should fix ...
http.cat returns a 404 cat for any code it does not know about, so maybe we should just do that?
We could check the argument is an integer and leave it at that, then we'll leave it up to http.cat to see whether the code is supported.
I prefer the line break as proposed in the linked issue. It makes the expression much easier to read.
Also, please put a little bit more effort into the commit message(s) and the PR title and description. The fact that you've "changed return" is the one thing we can see from the commit diff. An explanation of why would be appreciated.
I guess we could check if the code returns 404 cat, and if it does, and the code isn't 404 we send something saying the code doesn't exist and show 404 cat.
Sentry Issue: BOT-9V
Perhaps coincidentally, this started appearing once use_cache was defaulted to False. What's weird is that there is already an except HTTPException in the function, of which I'm pretty sure Forbidden is a subclass.
Forbidden: 403 Forbidden (error code: 0): cannot retrieve asset
File "bot/utils/messages.py", line 90, in send_attachments
await attachme...
These comments are also just noise, right?
<p class="color-contrast-medium"><strong>joe</strong> becomes one of the owners around 3 days after it is created, and <strong>lemon</strong> joins the owner team later in the year, when the community has around 300 members.</p>
We definitely don't need these everywhere. Either we remove them all or we put information in them, I guess. Leaning towards the former.
Build 20201011.2 failed
Requested by
GitHub
Duration
00:01:31
Build pipeline
Site
[python-discord/branding] New branch created: more\_wallpapers
This adds some wallpapers and event assets that were used for PyWeek 30, the Summer Code Jam 2020, and for certain announcements. These were just rotting on my local machine, so I figure we may as well add them to this repo for all to enjoy.
Resolved in de3b67c562fa90eac2d79938481a5b84b4e1079f
Resolved in de3b67c562fa90eac2d79938481a5b84b4e1079f
Resolved in 059f6c07b755290634f9aae1a3657d3c4d761b43
Resolved in c0e9af6d8c736205bcefc92bf89e6d587db29455
Build 20201011.3 failed
Requested by
GitHub
Duration
00:02:03
Build pipeline
Site
Resolved in de3b67c562fa90eac2d79938481a5b84b4e1079f
c8c6cb8 Added metricity db connection and user bot API - Lucas Lindstrรถm
c3752e5 Merge branch 'master' into feat/397-398-metrici... - dementati
a188ab8 Fix minor style issue. - Lucas Lindstrรถm
85a0d57 Merge branch 'feat/397-398-metricity-db-and-api... - Lucas Lindstrรถm
15086b4 Added total message count to metricity data res... - Lucas Lindstrรถm
Build 20201011.4 failed
Requested by
GitHub
Duration
00:02:11
Build pipeline
Site
Build 20201011.5 failed
Requested by
GitHub
Duration
00:01:46
Build pipeline
Site
Build 20201012.1 failed
Requested by
GitHub
Duration
00:01:40
Build pipeline
Site
Build 20201012.2 failed
Requested by
GitHub
Duration
00:01:40
Build pipeline
Site
Build 20201012.3 succeeded
Requested by
GitHub
Duration
00:02:32
Build pipeline
Site
Build 20201012.4 failed
Requested by
GitHub
Duration
00:01:39
Build pipeline
Site
Build 20201012.7 succeeded
Requested by
GitHub
Duration
00:02:14
Build pipeline
Site
Now with categories and colours!
<img width="1680" alt="Screenshot 2020-10-12 at 01 53 47" src="https://user-images.githubusercontent.com/20439493/95695197-c601cb00-0c2d-11eb-8fc7-463ffeadb69c.png">
Personally not a fan of this oneline. Much easier to read if you split it up into an if,else
if len(category_emojis) > 1:
emoji_info = f"There are **{len(category_emojis)}** emojis in the **{category_name}** category"
else: # assuming there can't be 0 at this stage.
emoji_info = "There is **1** emoji in the **{category_name}** category"
Don't commit the suggestion, definitely not indentation compatible.
I agree with kwzrd, either break line it or write it out, like
def check(m: discord.Message) -> bool:
if m.channel == ctx.channel:
return fuzz.ratio(answer.lower(), m.content.lower()) > 85
return False # To avoid implicit "return falsey"
Could you elaborate on what you have in mind?
The current design is that this package provides convenient data types to work with, which are "incidentally" backed by redis for persistence. The types currently implemented and planned for the future are not meant as "thin" wrappers around the redis data types. For example, the RedisCache is not just a thin wrapper around a Redis hash data type (although it uses a Redis hash for its persistence).
The problem with exposing the underlying ...
Postgres backup completed!
Relevant Issues
closes #498
Description
When the bot is gonna display the winners, use set() so the duplicates are removed, if any
Screenshots
before/after


Did you:
- [x] Join the [Python Discord Community](https://disc...
[python-discord/seasonalbot] New comment on pull request #501: remove duplicate winners for \.riddle
Thank you for contributing to Python Discord!
Please check out the following documents:
- Join the Discord server! - If you have not already, join the Discord server and introduce yourself in our #dev-contrib channel.
- Python Discord Contributor Wiki - A set of resources about setting up our services
- Python Discord Code of Conduct - Code of conduct for our commu...
Build 20201012.1 succeeded
Requested by
GitHub
Duration
00:01:20
Build pipeline
Seasonal Bot