#dev-contrib
1 messages ยท Page 122 of 1
PS: You probably want to add labels
What do you mean?
Thanks
I think that's right @brisk brook
It has passed flake8 so rest of linting should work
Now I am confused again, why did this cause ghost pings?
Because you need to confirm the trashcan icon, so you will know where the ping came from?
It deletes the ctx.message as well
So you've now got a ghost ping
The point of this is to only delete ctx.message if it DOESN'T have pings
Ah, alright. I think I got it then again haha.
did you see the example I showed you?
Yeah I think so
cool
Does this make sense by the way @brisk brook https://github.com/python-discord/bot/pull/1694/files/b2061e4f5afab8d8d714ca7a1f969d84c6f1e213#r675657869?
Is it supposed to delete the error_message after the timeout?
It's a bit different. You see wait_for_deletion() puts both the wait_for() and message.delete() inside the same supress(). Meaning it won't get deleted if it timed out, the old code deleted the message if it timed out, do we wish to keep this behaviour?
Meaning it won't get deleted if it timed out
That's what my intention was
Hmm, good point. It looks weird if someone did !doc and it looks like they got no response (but it's just that the failure message that got deleted)
You should clear the reactions then, because like this looks like they will stay? Which again can make the bot look unresponsive if someone tries it after the timeout.
Yep, good point
Hmm
There's no real way to know if it got deleted though
I guess try to remove it and just suppress the error if we get NotFound
Hi :D
I can ask questions related to different aspects of pydis project source codes here, right?
yes
ok
suppres()
so I was wondering, so with how pixels implemented ratelimits, does it just check if a user has a cooldown or how many requests they had remaining through redis each time the user requested an endpoint?
When i was initially adding the automatic deletion of the invocation and the error message, the reason was because of some people just trying out the command, or (unsuccessfully) trying to find some symbol, leading to a chain of lookup errors as it's rarely cleaned up, but I guess it is a bit confusing in lower traffic channels
Do you happen to know what error is? The docs don't actually say
NotFound
If you add a reaction to a message that is deleted then it will 404
Aight, thanks
Yup, reddis is speed
pretty much yeah
It generates a key with the user ID (gotten from the token they authorize with) and looks this up in Redis. Redis handles expiring the keys: https://github.com/python-discord/pixels/blob/3346f31f74d18b40c50a1aa8c239b770a41a3651/pixels/utils/ratelimits.py#L278-L323
ah ok, thanks :D
Yup Redis is real quick
request_id is an increment from here: https://github.com/python-discord/pixels/blob/3346f31f74d18b40c50a1aa8c239b770a41a3651/pixels/utils/ratelimits.py#L115
pixels/utils/ratelimits.py line 115
request_id = next(self.request_id)```
we couldn't do in-memory since we have multiple workers
and even 2 versions of it running (k8s replicas)
self.request_id is a itertools.count
It's not garuanteed unique across the deployment (for example if they restart).
But the chance of someone:
- Making a request with a low request_id (insert into redis)
- Causing it to restart
- Doing another request and get the same request_id
@brisk brook can you review please? ๐ ๐ https://github.com/python-discord/bot/pull/1694
All without the key from step 1 expiring, is so extremely low that we can consider it unique.
I'll take a look!
Hey! I think my draft pull request is ready to โgoโ. What should I do? Is there a standard protocol that I have to follow?
Are you talking about bot#1678?
Yes, I am, I think itโs ready to be formally reviewed.
You should mark it as ready then
Alright, Thanks. Iโll do it soon then, Iโm away from my computer right now.
why do I get two thousands emails about bot#1664
haha
No worries, I've done it for you and merged in main
Oh, wow thanks. ๐
I responded to your comment by the way @brisk brook
Yes I am going to take a look, sorry I was eating.
No worries ๐
Just pinged because I didn't know if you were like me and didn't really check GitHub
Can I get two more reviews on bot#1694 please?
Here? And to write what is my opinion on the purpose of it?
The idea is to say the code's okay
And if you go to the "files" page there should be a thing in top-right
Gimme a few minutes and I'll show you
Show me how?
Screenshot
Just not on laptop right now
This is it @viscid coral
Although I think only staff can Approve
There's "Comment", "Approve" and "Request Changes"
anyone can approve, it just won't directly count towards the approvals required for a merge
So I should comment?
It depends on what you're doing
If you're approving the code (saying it's good quality etc.) then you'd "Approve"
If you're asking for a change to be made (e.g. adding a comment or whatever) then you'd "Request changes"
If it's neither, and you're just posting a general comment or question (e.g. "This might not work how you expect it because ...") then you use a "Comment"
You can approve if you'd like to, just it doesn't count towards the required 3 approvals since you're not staff/core-dev(which is what Numerlor was saying). Still good to do though
Yeah, exactly
It's linked to the if doc_embed is None:
That's just how the previous person wrote it
Well the code seems okay to me, I'll try to press the approve review or how it's called
Generally as long as you aren't flipping a condition (not) first it's fine
https://github.com/TizzySaurus/bot/blob/Update-docs-get-to-prevent-ghost-pings/bot/exts/info/doc/_cog.py#L341-L350 is the lines without the diff by the way (I find the diff gets in the way)
bot/exts/info/doc/_cog.py lines 341 to 350
if doc_embed is None:
error_message = await send_denial(ctx, "No documentation found for the requested symbol.")
await wait_for_deletion(error_message, (ctx.author.id,), timeout=NOT_FOUND_DELETE_DELAY)
with suppress(discord.NotFound):
await error_message.clear_reaction(Emojis.trashcan)
# Make sure that we won't cause a ghost-ping by deleting the message
if not (ctx.message.mentions or ctx.message.role_mentions):
with suppress(discord.NotFound):
await ctx.message.delete()```
Is that ok? Anything else I should add?
That's good ๐ Make sure you selected "Approve" under these options
Yep, perfect ๐
Submitted
Even though your approval doesn't count towards the 3-approval requirement, it's still good to get the extra feedback, and can be good practice for you too
So it's definitely still worth doing
I have no idea, it says maybe because I don't have write access?
(I meant that as an explanation to why)
The reason it's not green is because you don't have write access (because you're not staff/core-dev)
Oh ok
Still need 1 more approval on this by the way if anyone's free
I think it was approved
Nice
Test it on me lol
No documentation found for the requested symbol.
And if you don't react it should remove the reaction
!d discord.ext.commands.Bot.blahblah @static canyon
No documentation found for the requested symbol.
Nice
Yap
Gone are the days of ghost-pings in docs command
let's test if it works with role pings (don't actually lol)
Yap, unless someone does it on purpose
Sure let me ping the mods one sec lol
no lol

The !pypi command has the same issue, so should I code the same thing for that? Or would it make more sense to make it a util function?
It'll make more sense to make it a util function yeah
Open a pull request or something ig
Doesn't make sense to make it a util function, it's really just an if statement.
I mean it's a bit more than that
It's this
To change in pypi command would be like 5 lines of changing code I think
Yeah it's a bit more, I think you should do it a util function
if error:
await ctx.send(embed=embed, delete_after=INVALID_INPUT_DELETE_DELAY)
await ctx.message.delete(delay=INVALID_INPUT_DELETE_DELAY)
```would become```py
if error:
error_message = await ctx.send(embed=embed)
await wait_for_deletion(error_message, (ctx.author.id,), timeout=INVALID_INPUT_DELETE_DELAY)
with suppress(NotFound):
await error_message.clear_reaction(Emojis.trashcan)
# If won't ghost-ping when deleting message
if not (ctx.message.mentions or ctx.message.role_mentions):
with suppress(NotFound):
await ctx.message.delete()```
Makes the code look better and that it dpesn't repeat itself
@brisk brook ^
Or```py
async def delete_message_if_no_pings(message: discord.Message):
"""Checks whether message pings any users. If it doesn't, will safe-delete it."""
# If won't ghost-ping when deleting message, delete it
if not (message.mentions or message.role_mentions):
with suppress(NotFound):
await message.delete()
...
in command
if error:
error_message = await ctx.send(embed=embed)
await delete_invocation_if_no_pings(ctx)```
That's not a fair comparison, the latter codeblock does not do the same thing
Right my bad
lemme fix
I think actually we should just make wait_for_deletion remove the reaction. Then it'd be the same
wait_for_deletion usually deals with timeouts where it really isn't necessary to remove
Would it be bad to make it remove though? I can't really see any downside to it
Would mean changingpy with contextlib.suppress(asyncio.TimeoutError): await bot.instance.wait_for('reaction_add', check=check, timeout=timeout) await message.delete()topy try: await bot.instance.wait_for('reaction_add', check=check, timeout=timeout) except asyncio.TimeoutError: await message.clear_reactions() else: await message.delete()
There's also the fact that if the message still has reactions, but isn't listening for reaction_add anymore, then it makes it look like the bot isn't working when someone clicks a reaction
Might be good to research the use of wait_for_deletion()
No clue how to do that
Could be a deal-breaker for some code
Search the repository for that function name and see if adding that line will break any code using it.
You can search locally in whatever editor you use, I am pretty sure all editors have this option.
Otherwise you could use sourcegraph or similar online options. Sourcegraph is pretty cool!
Just had a look and it won't break anything anywhere
Wouldn't even have to touch the other files using it
The only case it'd break is if you tried to remove the reactions without suppressing which is never done (only place that tries to remove is my PR, which uses contextlib.suppress so wouldn't raise an error)
@brisk brook ^
@brisk brook :white_check_mark: Your eval job has completed with return code 0.
0
That doesn't timeout but I can always only remove when a timeout is specified
(Logic would be in same function so have access to the timeout)
How long was the time? It's like only a few minutes right?
I think this is a nice QoL, because eventually this message here won't delete when I click ๐๏ธ. If we clear the reaction when this happens means we don't break any user-made assumptions.
In fact that does have a timeout
It's the default, 60 * 5 (5mins)
I think this is a nice QoL
QoL to make the change I'm suggesting?
Yes, please change this to remove the reaction.
What is QoL?
Quality of life
Feel free, that is no problem.
This should be the only change right? @brisk brook
It's so small there's probably no issue if you do both the remove the reaction change as well as adding that usage to the command
I mean I've already created the issue now lol
But yeah you're right, probably could've done in the same one
How come none of you have the contributors role? I mean ya'll do a lot
I mean this is one of the first things I've really done on the GitHub personally
It doesn't have to only be on github tho(I think), you also help a lot about the server in community-meta
It's GitHub only (or more specifically dev-ops If I remember correctly)
I haven't contributed a lot over time yet. I mean, I reviewed Chris's Pixels V2 pr as well as submitted my own. But not much else yet.
Can I get a yes/no confirmation for this please @brisk brook
Wanna make sure I'm not missing anything stupid
I am not sure how to interpret what you said?
Your PR can both add clear_reaction to wait_for_deletion() and change the !pypi command to use wait_for_deletion()
It's not a big change, so it should be good.
I did the wait_for_deletion() as its own issue
So I guess I can just make it solve both issues?
Yes but the PR to fix it can do both
Right okay
Yes!
I am not sure how to interpret what you said?
Is that the only change needed for thewait_for_deletionupdate?
They're quite related
Yeah pretty much. Just add awair message.clear_reaction() at the end of the function.
Only want to clear the reactions when we don't delete the message though
To save the error
Hence I changed to try/except/else
Ah, yes that code looks correct
๐
And I want to add the other utility right? The delete_message_if_no_pings
@brisk brook ^
I mean I may not be one to have complete control over that, but I don't like it. It's like 1 line saved?
2 lines each time you use it, and I'll be using it at least twice
3 lines of code vs (usage + import). 2 lines
It also makes the code less readable. One has to look up the function definition to see what it does
Sounds good
Should I be suppressing anything here? https://github.com/TizzySaurus/bot/blob/main/bot/utils/messages.py#L98-L103
bot/utils/messages.py lines 98 to 103
try:
await bot.instance.wait_for('reaction_add', check=check, timeout=timeout)
except asyncio.TimeoutError:
await message.clear_reactions()
else:
await message.delete()```
The original code didn't suppress anything other than TimeoutError so no
I have now added the clear_reactions() but that shouldn't be an issue
Only case it might is if there was no reactions but the function returns before this line if that happens so no issues
Let's see if I can remember how to do the PR 
I think I did something weird once about forking the project, changing what neeeded, and submitting it
Does this look right? @brisk brook
I think it looks ok, but not 100% sure
You won't be correctly linking both issues
Wdym?
They seem to both be linked
GitHub doesn't understand "and"
Both display though?
It links the issue so that you can click it. But it won't show "This issue will be automatically closed when this pull request is merged"
So just:
Solves #1695
Solves #1624?
Or this?
Yeah you need one of those verbs in front of it. But you could word it better.
Wording doesn't really matter, as long as it makes sense
I'd rather not
like we did with the docstring tag earlier lol
Also is the "Can't automatically merge" an issue?
@brisk brook
It says you can still open PR, I wonder what it's cause
Hm?
You have conflicts to solve
God damn it
Just create the PR for now, we can solve them later
Alright
This is probably because you have changes from your old PR on that branch
You should always create a new branch when making a PR so that this doesn't happen.
YOU/main should preferably always be up-to-date python-discord/main
You should work on the pydis repo though
Fixed it
Think I did anyway
God damn it
Linting has gone back to being the bane of my existence
Doesn't even say the error 
Trailing whitespace
Again 
lol
It's in the comment I think?
Yeah I fixed one in a comment
Don't understand this comment @brisk brook https://github.com/python-discord/bot/pull/1696/files#r675857486
Since you removed this code: await error_message.clear_reaction(Emojis.trashcan) you no longer need to import Emojis
Right
from bot.constants import MODERATION_ROLES, RedirectOutput
Don't think that's what you linked to though?
Unless me/GitHub is just messing up
https://github.com/python-discord/bot/pull/1663/files has been lying around for a bit now if anyone's up for it
what is going on over here?
Fisher is fishing resources
Illegal activity
Hopefully this time ๐ค
Finally ๐
Just needs the reviews now https://github.com/python-discord/bot/pull/1696
CC @brisk brook (and @viscid coral if you'd like to do another)
bot#1696
Seems ok to me
@brisk brook can't figure out how to do the docstring
"""
Wait for up to `timeout` seconds for a reaction by any of the specified `user_ids` to delete the message.
If user doesn't respond in time, will clear all reactions to indicate option to delete has expired.
An `attach_emojis` bool may be specified to determine whether to attach the given
`deletion_emojis` to the message in the given `context`.
An `allow_mods` bool may also be specified to allow anyone with a role in `MODERATION_ROLES` to delete
the message.
"""```did this but it failed linting because it needs a blank line between summary and description (considers 2nd line as description rather than part of summary)
multi line docstrings should be laid out with one line at the top, an empty line, and then the more verbose description
You should either condense it into one line, or move it to a more fitting place
move it to a more fitting place
What do you mean by this? @brazen charm
I think in this case a newline between the first two lines would be the nicest
"""
Wait for up to `timeout` seconds for a reaction by any of the specified `user_ids` to delete the message.
If user doesn't respond in time, will clear all reactions to indicate option to delete has expired.
An `attach_emojis` bool may be specified to determine whether to attach the given
`deletion_emojis` to the message in the given `context`.
An `allow_mods` bool may also be specified to allow anyone with a role in `MODERATION_ROLES` to delete
the message.
"""
Just put it in the description
I'd leave the newline after it in place
"""
Wait for up to `timeout` seconds for a reaction by any of the specified `user_ids` to delete the message.
If user doesn't respond in time, will clear all reactions to indicate option to delete has expired.
An `attach_emojis` bool may be specified to determine whether to attach the given
`deletion_emojis` to the message in the given `context`.
An `allow_mods` bool may also be specified to allow anyone with a role in `MODERATION_ROLES` to delete
the message.
"""```so this?
"""
Wait for any of `user_ids` to react with one of the `deletion_emojis` within `timeout` seconds to delete `message`.
If `timeout` expires then reactions are cleared to indicate the option to delete has expired.
...
"""```think this is more descriptive actually
Committed for now since going to bed in a minute
Going to bed now, bot#1696 just needs 2 more reviews and then botโ#1624 and botโ#1695 should be able to be closed
For the new resources system, we need something that reads all the resource yaml files and aggregates certain data from them. I want this to run once when the site launches and then cache that information. How should I approach this? Do TemplateViews have an "on launch" event?
Might be easier to cache it into redis on the first hit
then subsequent hits can just check for that key first
I'm not sure if we already have a pattern like this setup in site or not
CC @blazing magnet
Yeah, that makes sense to me. I have zero experience with redis though. Only have a bit of experience consuming in js
Any code you put in the app's urls.py file will run when the app is started up. Although this could be a little hacky
Eh, using Redis comes with a lot of problems due to race conditions. How intensive would be this computation?
Can I get 2 more review on bot#1696 please? It closes bot#1695 and also bot#1624
I'll take a look after trackmania
Thanks ๐
can anyone core-dev/admin re-run the test/lint for this PR
https://github.com/python-discord/site/pull/508
isn't it missing a push?
i requested a re-run but i don't think it's going to change anything
I thought I forgot to make migrations for a model or so, but I have everything migarted
everything is pushed
maybe I should just update the branch and see
updated the branch rn
yeah, the django error about migrations still pops up:
CommandError: Conflicting migrations detected; multiple leaf nodes in the migration graph: (0070_auto_20210519_0545, 0071_increase_message_content_4000 in api).
21
@green oriole do you mind if i request you in for a few reviews
passed \o/
@lime sluice
@static canyon re:ghost pings, go for it, I think it's how it used to be too
Sure, although I will probably not have enough time for huge PRs until next week, I have to rush a project for work and finish my talk
ah you're already requested in one of them (site #526) as code owner
i'll throw in another
Sounds good
!user
You are not allowed to use that command here. Please use the #bot-commands channel instead.
I think joined should be used this format: x years, x months, x days ago(unix timestamp here of joined date) because if the user language is not English it isn'y understandable
If they hover over it, they can see the exact time
It's a feature of Discord handled by your client (so it should be your own language)
Looks like this when I switched my discord language to french
Even though it isnโt relevant here, not sure any of this server is understandable if you donโt speak English.
For sentry
why is the main folder containing the application files for sir lancebot called bot instead of src, is this some convention to make the src folder be more informative?
when writing a python application, you should always title the source code directory as the name of the application
src is not a convention in python
because when you come to run your application, you use python -m my_module
so in our case, python -m bot
i see, thx joe
hey guys
I'm getting this error when pushing my git
I will send a ss
can anyone welp
this
So if your branch looks like this: ```
A -> B -> C -> D
Your repository looks like this: ```
A -> B -> C -> D -> F
What type of changes have you made? Do you know why your repository has the F commit, but you don't?
Is this about one of our projects? this channel is for conversations about the development of our projects.
Do all projects on the whole organization use LF as line endings? What's the policy there?
There was no mention on which character to use here: https://pythondiscord.com/pages/guides/pydis-guides/contributing/style-guide/#line-breaks
Coding conventions for our Open Source projects.
So, yes technically we do use LF, and it used to be enforced using pre-commit
The thing is, it isnโt really all that convenient for most beginners and unaware people (particularly windows, where git by default clones in CRLF, and checks in with LF)
Ultimately, it doesnโt make any actual difference for most purposes
And it is still enforced to some extent using gitattributes
The repos that donโt have it, youโd have to specifically want and know to commit non-LF ending
So itโs mostly ignored
Ah, yeah.
@old shard
!d aiohttp Returns the page https://docs.aiohttp.org/en/stable/structures.html#module-aiohttp instead of the homepage for aiohttp
Maybe open an isuue https://github.com/python-discord/bot/issues
The bot just sends what was provided for a given symbol by the maintainers of the library
@vale ibex what the hell
lmfao
picking up an old branch
was quite out of date so I did a merge commit
rather than dealing with the endless conflicts with rebasing
What will happen when you're gonna merge it into main?
they won't be duplicated
It'll have a merge commit
If you take a look at https://github.com/python-discord/bot/pull/1527/commits
Ah yeah, that's true haha
the 3rd from last will be in the history
I'm not actually sure what's best practice tbh
I think we mostly do merge commits from what I've seen
Yeah I think it seems so
I was looking at this:
https://github.com/python-discord/bot/compare/e5e4343435c3...1d08b29aedd6
There the commits brought from the merge is shown, so I thought those would also be added onto main ๐
lol yea, luckily not
Yeah we just do merge commits
yeah the commits are already there
I had this idea of storing roles on leaving
- It allows for temporary leaves and rejoins
- On tempban, it allows for regaining of roles
The main argument against this is storage.
This is my counter-argument:
Say a user can have max 15 roles.
That's a max of 16 bigints (User ID + Role IDs)
A quick google search tells me that each bigint = 8 bytes of storage
so that would be 16*8 bytes or an 8th of a kb
Say we have 200k members
that would be 200k * 1/8 kb or 25k kb or ~25 mb
A generalized formula:
m = number of roles
n = number of members
Total Storage = (m+1)8n bytes
This is not much storage at all - Much smaller than anticipated!
I suggest removal of roles after some time like a month to save space anyway
What kind of roles do we want to persist?
We're already persisting the Muted-role, which is the most important role to persist
something like the pixelators role
the reason is that I would like to leave the server temporarily
That's a temporary role, right?
it is?
Typically, if someone gets a role here, they get a role for a reason
If they leave the community and come back, we typically want to decide whether or not they should have the role back
okay
I'm not sure, but we typically don't have vanity roles or the like
We typically have temporary roles for an event for if we want to do things like an event announcement
ah okay
even then, 25 mb is a stupidly small amount of storage to store all roles
I expected it to take more
I don't think storage is the main concern like you purport. Every user's role is already being stored (except it's deleted when they leave).
A similar system already exists, but it's only for mute roles.
However, I think that relies on infraction data (which is not deleted) rather than the saved roles.
I would like to expand it to useful roles like the helper, etc
cosmetic roles would be nice too
It's a niche situation. There are few people with "cosmetic" roles and it also seems rare to leave and then come back.
Rare enough that there's likely the capacity to handle it on a case by case basis.
There may also be user privacy concerns with retaining that data when they leave, especially since the DB schema is designed to tie the roles to the user object. I am not familiar with privacy stuff though.
In addition, when it comes to roles that grant someone permissions, I doubt we will ever create a system that would grant that role automatically when someone rejoins the guild. If someone leaves by accident, it's not too much work to give them back the role manually.
A few days ago, TizzySaurus made a PR and an issue to avoid ghost pings in docs and pypi commands. Shouldn't it be reported in #changelog ?
This question belongs in #tools-and-devops
ah sry
No problem
?
Yeah, itโs usually just whenever someone with perms get around to it
Yeah I asked chris and he said to send it here
So isn't there someone with perms?
There's probably nobody with time atm
Ok thanks
doesn't feel like a very noteworthy change
An admin will get around to it at some point. It's not exactly urgent or that big of a change.
Isn't it better to not do if channel is None and do: if not channel? Or better yet, just channel = channel or ctx.channel
I can see it is used many times in code
i think ill tell it here
the bookmark command cannot bookmark msgs from other channels
could the ability to bookmark msgs from other channels be added to lancebot?
It can, you just need to use the full message link, or do channelid-messageid
That's because just message ids aren't enough to get the message, you need channelid and messageid
Due to this fact, we assume the channelid is the current channelid none is specified
Chris, what about that?
ohhh okay
Well, there's no goal of making the code as concise as possible. This is also a goal that often comes at the expense of readability. So one reason for the author to have written it this way can be that they thought that made the code more verbose and English-like
Oh ok thanks
In this case if not channel seems equally fine
In other cases however an object can have a defined state of false-iness. For example an empty list is evaluated as False.
if not my_list will be true in all cases in which it's False, while if my_list is not None will only be True in a single case
Can some tell me what is "pre commit Failing after n seconds" in github?
Well Iโm assuming thatโs the lint action, on the pre-commit step. Pre commit runs a bunch of linting tools like flake. You can expand it to see the specific error
I don't know how to expand it to specific. I am getting this first time
Can you send a link to the workflow?
Or just the pull request
Describe your change:
Fix a readable issue in a_star[dot]py algo?
Checklist:
I have read CONTRIBUTING.md.
This pull request is all my own work -- I have not plagiarized.
I know that pull req...
@gritty wind
The failing action is black (make sure to lint before you push)
(From the actions tab)
Well thatโll depend entirely on the project youโre working on. If they have a contributing guide, make sure to go over it. Linting is just making sure you follow the style guidelines
oh ...i understand
Also, for general contributing questions not related to this serverโs projects, you can claim a help channel (#โ๏ฝhow-to-get-help)
sorry for using wrong channel
Itโs fine
threads are here, how is python bot handling that
yee i noticed, my mod bot is kinda not a good bot atm
the d.py server seems unbothered by thsi massive breaking change
Danny's been working on it since the api docs got released but it takes time
it always does, but for discord to drop this so suddenly
kinda opens servers up to all sorts of issues considering libraries arent ready for it
So threads are opt in. For us threads are locked to certain staff roles and to internal channels.
Also discord gave 2 months heads up
ya i think its really more that d.py chose a VERY bad time to decide to migrate to 2.0 now
You've got it the wrong way around
2.0 is because of threads & interactions
the Discord v9 gateway brings in breaking changes, so a breaking change was also required in d.py
@patent pivot hi no questions just wanted to say hi
Let's go
approved
is now our new 
oof, other libs have already updated tho, d.py is being incredibly slow
discord.js also hasn't updated yet.
discord.js and discord.py are the two most used libs, so they want to get it right, and have to worry a lot about backwards compatibility, and maintenance
https://github.com/Rapptz/discord.py/projects/3 These are the changes coming in 2.0
nope, because they don't want to commit to a date, since it's all in their free time
such is the pain of relying on open source i suppose
Is that libcurl? ๐
About the snekbox issue: line numbers are super useful on mobile to distinguish between line wrapping and actual line breaks
oh god, its actually quite scary how accurate this is
I know, right
Agreed, you can also point to it when explaining output.
There's not much to gain from removing them
AcTUAlly, dpy doesn't care about backwards compat rn, v2.0 is fully breaking
If they don't get it right, they can't change it later
yeah, true
Yea, this is what I meant with backwards compatibility
anyways
isort does not recognise [tool.isort] as a section for it in the tox.ini file.
It is only recognised as [tool.isort] in a pyproject.toml file, and [isort] in tox.ini
Isort docs: https://pycqa.githu...
:)
really really really learned this the wrong way!
as evidenced by the failing workflow :)
Yay I'm now a KA contributor too :)
lul
gross
returning a message when the annotation is None 
oh my god
I would like to ping this but we are in a public channel and gotta look like serious people 
Very professional

Why can't I send there messages noooo
https://github.com/python-discord/kubernetes/blob/main/postgresql/deployment.yaml why deployment not sts? 
sts?
sts doesn't bring anything

statefulset
in future it's possible we'd look at multiple Postgres instances, but they'd be uniquely tied to the service they are responsible for
so still not a huge appeal for statefulsets

we do use statefulsets around and about, but really our two workforce units are just regular deployments and daemonsets
we use daemonset for ingress, log accumulation and a few other things

Ooh speaking of
Are the helm installs and config listed anywhere in the repo
If not, might be a fun thing to try and document
For my own installs, I just list the names, versions, and the settings that have to be changed ๐คก
Right
When we will have two thousands concurrent connections I feel like that's a thing we will have to do haha
ones with custom config are yea
We could have full deployment steps, how to bring the infra to zero to what it is now, that'd be a fun thing to do
the only one not there is loki
stuff like that
Feeling dumb. Can someone remind me how to do the like... relative to you time stamp/humanized time?
Integrate your service with Discord โ whether it's a bot or a game or whatever your wildest imagination can come up with.
Cheers
HA
nice one discord
That's amazing
I appreciate it
Is there another error that we usually use for these situations, or am I going crazy?
bot/utils/helpers.py lines 36 to 44
def join_role_stats(role_ids: List[int], name: str, guild: Guild) -> Dict[str, int]:
"""Return a dict object with the number of `โmembers`โ of each role given, and the `โname`โ for this joined group."""
members = []
for role_id in role_ids:
if (role := guild.get_role(role_id)) is None:
raise BadArgument("Unable to fetch role data, the specified role does not exist.")
else:
members += role.members
return {name: len(set(members))}```
(Looking at BadArgument)
Not sure, but at least something like ValueError feels more fitting when it's not because of argument conversion from the discord side.
I agree, that does seem more fitting
BadArgument is handled by the error handler though, and will display a proper error message
Ah, I see the context
Yeah, okay, that error shouldn't be caught by the handler
For embeds such as !user I think we should use the timestamp style that displays the exact date and time rather than how long ago it was. The former is much more descriptive at first glance and you don't have to hover over it to get detail.
We use it for moderation, and it's more convenient to get the relative time at a glance.
What's wrong with didplaying both?
Takes more space, and you already get the date by hovering over it.
I've been actually toying with the idea of splitting off the user command as used by the mods
Could have the bot detect moderator and display it differently? Or create a subcommand that shows it differently..
Hmm...
The command is already doing something else in mod channels
But I'm not sure if absolute time is preferred over relative time, maybe other people have a different opinion. Technically speaking, the relative stamp offers you more information than the absolute one.
Well the thing is that eventually it becomes "X years", and at that point it's rather unhelpful when you want to be more precise.
Hey!
Just out of pure curiousity,
In that issue https://github.com/python-discord/api/issues/7
current database schema as the actual deployed one, or the literal python-discord/api schema? (that doesn't seem to exist just now.)
(I know it's already assigned, I just like to go over issues and find a solution, sometimes develop one on my own.)
I believe it's the deployed one
I think this project leaves most of the API unchanged, it just decouples it from the site and rewrites it in FastAPI.
Yeah, but the deployed one uses the Django ORM whereas the API uses SQLAlchemy with Alembic. (That is strictly for sqlalchemy as far as I know)
Yes, that's what the project is about. The API as in the exposed routes and what they accept / return
That's what I was referring to, it's rather unclear with the relative time.
!server too
Created: <t:1483877013:R>
Voice region: europe
Features: THREE_DAY_THREAD_ARCHIVE, PARTNERED, VIP_REGIONS, VANITY_URL, SEVEN_DAY_THREAD_ARCHIVE, NEWS, MEMBER_VERIFICATION_GATE_ENABLED, THREADS_ENABLED, WELCOME_SCREEN_ENABLED, RELAY_ENABLED, PREVIEW_ENABLED, PRIVATE_THREADS, BANNER, DISCOVERABLE, INVITE_SPLASH, COMMUNITY, ANIMATED_ICON
Roles: 88
Member status:
51804
181727
Helpers: 122
Moderation Team: 33
Admins: 15
Owners: 3
Contributors: 39
Category: 32
News: 8
Staff: 75
Stage_Voice: 1
Text: 176
Voice: 8
tbh I'd rather show the manual relative time we had there before
There may be a better format than R?
Where could I read all of them again?
<t:1483877013:t>---------------------<t:1483877013:T>----------<t:1483877013:d>----<t:1483877013:D>--<t:1483877013:f>--<t:1483877013:F>-<t:1483877013:R>
<t:1483877013:t> <t:1483877013:T> <t:1483877013:d> <t:1483877013:D> <t:1483877013:f> <t:1483877013:F> <t:1483877013:R>
Yes, this is correct.
I mean, I kind of liked: <t:1483877013:D> (<t:1483877013:R>) - <t:1483877013:D> (<t:1483877013:R>)
I don't think that brings much benefit over the hover
What's to loose? I think it's much nicer to view it like that, and it's not like it will cause that line to wrap or something similar.
yeah it already does that for a lot of things in the user embed
THREADS_ENABLED
Alright, but SQLAlchemy (and Alembic) still needs the models to be defined, doesn't it? ๐
Yes, although there are reflection options to help with the generation of the models
Maybe I'm not understanding you. Yes, this is part of what needs to be done to move away from django.
Yeah, I see now. SQLAlchemy has this Automap functionality.(Alternatively, sqlacodegen that actually generates the models in respect of PEP8)
<#async-and-concurrency message>
Can we use this instead of the formatting hack in !int e?
!source int e
Run eval in a REPL-like format.
I think there was supposed to be something to replace the current implementation that would be less hacky, no idea on the status of it though
IS there anything in the code that makes sure everything in the database exists. EX: If a column is not there it creates it?
Ping me thx (probly wont respond till towmarro tho)
this might be preposterous, but what about tags for !github, !wsl, etc
or atleast an faq channel
!source docs
Look up documentation for Python symbols.
Thisโll depend entirely on which database youโre referring to, as we have quite a few. For our main ones though (the ones that power this server, the ones on the site) are managed by django. Djangoโs ORM creates them and manages migrations
Though thatโs currently changing over to alembic I believe?
for anyone here who is having trouble with poetry, aside from amazing docs, they also have a discord server
https://discord.gg/GP9bXx2FcW
thanks joe for whitelisting it
twisted is stellar i love twisted
How can I open the website locally after launching site from docker?
should be on localhost:8000
Thanks
Hmm.. whenever I press I link it tries to open it through pythondiscord.local
Ok, I found the line that changes it. Am I supposed to provide an env file or something?
yeah
put ```
127.0.0.1 pythondiscord.local
127.0.0.1 api.pythondiscord.local
127.0.0.1 staff.pythondiscord.local
127.0.0.1 admin.pythondiscord.local
c:\Windows\System32\Drivers\etc\hosts
tnx
Sure
How does python take github link and show it's code?
There's an on message listener in the issue cog
On mobile so can't get you a link to it right now
https://github.com/python-discord/sir-lancebot/blob/main/bot/exts/evergreen/issues.py#L213
That's the current location.
bot/exts/evergreen/issues.py line 213
async def on_message(self, message: discord.Message) -> None:```
!source issue
Unable to convert 'issue' to valid command, tag, or Cog.
Oh ok thanks
But in the future it'll be probably moved to the GithubInfo Cog, and the issue command will be removed.
wrong bot, the code content is done in https://github.com/python-discord/bot/blob/main/bot/exts/info/code_snippets.py
Oh, right lol. Nevermind it's a message listener too ๐
Yeah I see it, thanks
I had that issue for a long time..I had visual studio but it wouldn't detect msvc..one day I decided to try again to install build tools and that time it actually started detecting it
Hmm odd, it worked before on this computer
Is it on your path?
I don't think that's how it detects it
Iirc it has its own environment variable
Don't know if python uses it
Tried reinstalling, didn't help
Anyway, I'm currently unable to create the env and run the pre-commit hook, so if someone can fix https://github.com/python-discord/site/pull/560 that'd be appreciated
get it again and blame poetry for its poor deps handling
I can probably do that
should I amend and force push?
Either is fine I think
Will amend then
tnx
now we have a fancy commit because Git wanted to sign it
How did you do the GitHub updates?
Hmm strange
Iโm not sure why youโd need build tools
You reallly shouldnโt because the docker image is working
which github updates?
the ones in #dev-log ?
Likes this
That's a webhook from GitHub, rather than in a bot
if you goto the settings of a github repo you have admin access to, there is a webhook section
you can then add a webhook there
here's a guide I found
That's how most of the events come into #dev-log
However, the ones liek this #dev-log message
are custom github actions
Oh thank you! Sorry for the wrong place I thought it was some @stable mountain bot feature
No worries ๐
hey, poetry actually has great dep management, much better than pip or pipenv
@patent pivot is pydis sponsored by honeycomb or do you have the base plan?
Thank you @sleek steppe for throwing that command into the sun so quickly lol
Disagree sir, poetry does very weird stuff for its own deps. Like on a 3.8 install it tried to load python.3.9.so
wdym
@green oriole^
It is just very broken
It wrongly detects the Python version and does some stupid stuff
are you using pyenv with it?
poetry env use 3.8
i make website in Django i already host after..........I am facing big issues on Websurfer ISP.
I'm just buying Hosting Domain.
Everything is ok but I canโt open my website from Websurfer ISP
From my mobile network it can access like Ncell , NTC, World link and other network but can't access from
Websurfer ISP
Any Solution Please..
This channel is for discussion of Python Discord's projects, but you could ask in #tools-and-devops (sounds like a DevOps issue to me)
thank you for your suggestion
how do you handle prometheus huge data 
wdym
how do we store all prom data?
prometheus scraps a lot of data which needs a big storage to store, and by looking at the manifests in the repo you have a 20GB volume 

this volue actually got reset a little bit ago since I changed how we deploy prometheus
9 days
we retain for 15 days
oh ok thx, i thought i was going something wrong, the volume got 75MB in less than a min 
thanks for help
@patent pivot if you don't mind me asking, since when have you been into devops 
hmmmmmmmm
I started with Kubernetes about a year ago
June 26 2020 was when I moved personal stuff there

we created the pydis cluster on the 14th November 2020
the first time i tried kubernets was 2 months ago ๐
it is really nice how it works 
we were finished with migration by the 21st it seems
last non-crit services migrated 29th though

i am managing 2 clusters rn, one of them with average 7k requests/hour 
are you the only one who manages the devops in pydis? 
pydis sees 10k/hr peak

there is a devops team, I'm the lead of that team
Akarys, Sebastiaan and Scragly are also on my team
nice
and @radiant merlin
you have the king and i will make the princess 
wholesome
Any idea why i'm getting this error https://paste.pythondiscord.com/lifecohamu.py whenever I send a message (I think) running @stable mountain locally. I've heard other people say they were getting the same error but am not sure if the discussion went anywhere.
oh
I think i'm just missing the channel in the config
Ya, you need to update using the config in notion
How is it going to work when you turn auto reviews back on?
Is it gonna drop every reviews it has been holding onto?
Nah, it doesn't post any older than a day already https://github.com/python-discord/bot/blob/e65afc4e83f822f06fa2d25a7eb8c233b1cce71a/bot/exts/recruitment/talentpool/_review.py#L73
bot/exts/recruitment/talentpool/_review.py line 73
# If it's over a day overdue, it's probably an old nomination and shouldn't be automatically reviewed.```
That was from when we first introduced the system to prevent review-spam, and I thought the easiest option was just to make use of that here
So old ones will need to be posted manually with !tp post_review or actually manually
Right
I think I just made a bad comment on bot#1702
What is venv anyway
There are usually very few bad on-topic comments
Virtual environments, basically an isolated version of your โglobalโ site packages (packages that you install through methods such as pip). Usually used so you can have things like different environments and packages for each project
<@&831776746206265384> above. they (@gritty wind) sent in every channel too
just realised now the second person was answering them, not spamming
I did probably send in every channel at some point, but I think I have good excuses for most ๐
i wonder if there's any channel you haven't sent a message in from what i can see
๐ i was hoping i would have caught you
๐
hello
Hi
Please use #python-discussion for general chatter. This channel is for contributing to one of our many open source projects @sterile grotto
Is there any PR needing some review love (that may have been forgotten), I may have some more time to review anything today.
@brisk brook persist in that most recent comment on the tag PR is referring to persisting the cooldowns across bot restarts, not persistent storage.
Are those not the same thing?
If we want it to persist across restarts, then we need to store it persistently on disk (PostgreSQL)
Redis will keep state even if the bot restarts, we just can't rely on it to have that data forever. So it will persist even if the bot restarts, but it's not permanent storage.
In that regard, because of it being in another Docker container, yeah.
It's also backed up to disk, I believe the redis instance used for the server is configured to do that on every write
Yeah, our redis does write to disk. But it's still not permanent storage to us since we'll dump it when needed.
But other than that I don't see any benefit over a normal python dict for the cooldowns like I mentioned in the comment
Yeah, unless there's a strong benefit to using redis I don't see why we should try to use it everywhere
Alright sounds good!
im saying this cause it was mentioned by staff sometime ago, but you have considered an automated slowmode for @stable mountain, is that right?
i would be willing/interested in contributing something like that, but i'd obviously wanna get approval for that to begin with
You mean like after a spam of messages the bot will automatically set a slowmode delay?
It would take some fine tuning in terms of what data would determine the slowmode. Also for me I would need to see a demonstrated need for it. I know we were roughly collecting data to look into what are the consistent factors that we could use to determine when slowmode is needed, but it's pretty low priority.
Yeah but it can some in handy sometimes, it is pretty easy to make as well
I think you're underestimating finding the right criteria to base the slowmode off of and also the maintenance cost. Right now it's very easy for us to adjust slowmode.
It's something we're interested in and have discussed previously, but it's very low priority for us
We do record the current slowmode of a few of our channels, so we should have some data to play with if we ever want to look at it
oh fair
Would the approach be something like analysing historical data to see what kind of traffic / msg throughput usually results in a slowmode bump in each specific channel, and the having the bot detect that threshold in a live situation?
Its an interesting problem
Probably lots of possible variables too like amount of active speakers, msg length, etc
i mean you could run a nn on the typing events and messages sent and their corresponding slowmodes
would be actually quite interesting
mhm, there are a lot of factors at play like # of total messages, # of speakers, # of messages/speaker, message length, duration of the timeframe that we'd be looking at. Only recently have we even begun to receive typing events.
It would also have to play nicely with our existing antispam
Honestly I doubt an nn is necessary here. Some regression model should do fine
true
an ML / statistical approach could be used to only analyse the historical data; find the relevant variables, perhaps the thresholds
for the sake of transparency & easy configuration the rule can then probably be enforced via more standard means
I see a lot of caps issues in https://github.com/python-discord/sir-lancebot/blob/f5ca5dc712b63ca8a88dfa7a8717abbf96974a02/bot/resources/evergreen/py_topics.yaml , but Xithrius opened a PR about it, so I can't open a new one of my own to do so myself(to help), is there anything I can do?
Xith already opened a PR for the issue but some were missed?
if that's the case it's probably best to leave a comment on the PR and point out what you think should be changed
wookie already did earlier
oh so you'd just like to help make the changes?
Yeah but I have no permissions and there is not point opening a PR for the same purpose
you can leave a comment on the PR offering your help
the way you'd do it technically is make a PR targetting Xith's branch
it'd then be merged into Xith's branch and appear in the PR into master
however you probably shouldn't work on it without coordinating with Xith first
it may be unnecessarily complicated
How should I contact him
comment on their PR or ping them here ๐
however if its just a capitalisation issue I'd leave it to them to resolve
unless it's a complex feature that requires coordinated work of multiple people, or the PR author cannot continue working on the issue, it is best to just give them time to make the changes
sometimes people just get busy and it may take a while
How do the Sir Lancebot's creators host this bot?
I am just wondering on what should I do to make my bot online all the time!
We use linode
And it is paid?
yes
Oh-
Do you know some free hosting?
Yeah but currently I can't pay.
You can take a free tier on popular hosting platforms, but it won't get you really far
i mean yes but also no
(they got sponsored)
bot#1709 I was correct, it's discord.HTTPException?
Xithrius, need help with the py_topics python(s) caps?
Oh-
repl.it, heroku and similar are fine for hobbyist development, not prod workloads though
Does replit even allow hosting?
It does have some functionality yeah
Where is the code that sends the message when a user opens a channel?
bot/exts/help_channels/_message.py line 95
async def dm_on_open(message: discord.Message) -> None:```
Can you give an example
Well there's an on_message listener, https://github.com/python-discord/bot/blob/1e3d8fa4d8e6ba4bdabc96e31bb7c0c4ab82b1d5/bot/exts/help_channels/_cog.py#L461, which in turn calls claim_channel, https://github.com/python-discord/bot/blob/1e3d8fa4d8e6ba4bdabc96e31bb7c0c4ab82b1d5/bot/exts/help_channels/_cog.py#L119. There's quite a lot going on there though, not exactly sure what you're looking for
Yeah I got what I need, thanks
I just saw many people open help channels and the original message was deleted, probably by them
Yeah usually that's because the person who opened it deleted their message, it could also happen if it was deleted by antispam/a bot filter, but that's less likely
In those cases the channels should close faster
Sentry has 380 issues of ConnectionRefusedError ๐
We have to look into a better way to catch ConnectionRefusedError, OSError, DiscordServerError, ClientConnectorError, and ServerDisconnected cause those just spam Sentry.
a few of those may have been (inadvertedly) me
when we routed API traffic directly to Django from bot the server would sometimes randomly drop the connection
leading to ServerDisconnected
we now route internally through NGINX which seems to just... not do that
it could be worker restarts, unsure
What do you think of telling sentry to just ignore those errors?
I guess we would have to filter that via Python since Sentry's website doesn't give us powerful filtering.
Granted, it is nice to know when there are network issues, but I'd rather we aggregate them into a single custom webhook than spam Sentry with new issues.
there's some decent filtering we use at work in sentry, but it's a paid tier
not sure what tier we're on
Yeah we don't have access to that
I think we need to intercept the logging before it gets to sentry sdk
Or maybe the sdk has a filter
Yea, there's a before_send kwarg you can pass a filter func to when you init the sdk
you can make it return None to drop the event entirely
or you can make it do smarter things like add or strip data to the event
A problem we have is that sometimes exceptions are caught and logged without the exception object, making it difficult to filter out.
The idea with that is that the traceback isn't useful for those exceptions, so it's omitted.
the filter gets given the full event payload, along with the exception if there is one
I think the stdlib logging lets us attach arbitrary data, so we could use that.
so in theory we could filter on certain event types
But if I do log.error then how will it get the exception?
it won't in that case, it'll just get the data you see in sentry
Well that's my point. It's difficult to filter those out.
Yea, so would you propose filtering it lower down, in the logging module?
No. I think we just need to modify those places to also include some data with the log message.
The sentry filter would allow us to fiter specific errors exceptions we don't want to send, but as you say it won't give us everything we may want
Ideally we could attach all the exception info but tell the logger not to output the traceback.
So we don't see it in stdout or log files
Hmm yea
I think it lets us attach any data so maybe we could do log.exception("blah", silent=True) and then have a custom log handler for stdout which doesn't send the traceback. (silent is a bad name but it's just for an example)
@vale ibex Would it be safe to assume metabase will always return data in utf-8? There was an error where aiohttp incorrectly detected it as another codec and consequently failed to decode the data. https://sentry.io/organizations/python-discord/issues/2419912603/
Their API does not document the response encoding
I just made an issue for it bot#1713
huh I missed that one
I thought aiohttp automatically decodes the content from the server, so I guess something went wrong there
I think it was some odd unicode char in a user's name that caused it
utf-8 could be safe to assume
I might give that one a go now, since I can test it with my creds
๐โณโดโดํทํฒโฏ๐ this caused the issue
!charinfo ๐โณโดโดํทํฒโฏ๐
\u0060 : GRAVE ACCENT - `
\U0001f315: FULL MOON SYMBOL - ๐
\u2133 : SCRIPT CAPITAL M - โณ
\u2134 : SCRIPT SMALL O - โด
\u2134 : SCRIPT SMALL O - โด
\ud4f7 : HANGUL SYLLABLE PYULH - ํท
\ud4f2 : HANGUL SYLLABLE PYULM - ํฒ
\u212f : SCRIPT SMALL E - โฏ
\U0001f315: FULL MOON SYMBOL - ๐
\u0060 : GRAVE ACCENT - `
\u0060\U0001f315\u2133\u2134\u2134\ud4f7\ud4f2\u212f\U0001f315\u0060
Yeah it detected the wrong encoding
chardet isn't 100% accurate
It detected it as Windows-1254
Thanks


Lol I was really expecting you to leave it at a comment
command+enter did me dirty
Here are the top 3 results:
hell yeah
.so Discord emoji not working when I don't give id

.so quit vim
Here are the top 5 results:
lmfao
.so why is ed the best editor
Here are the top 4 results:
PHP first result
true true
oof
This is fucked on mobile
Yeah, should probably just be the titles that are the the links tbh
The upvotes, views, and comments all fit on one row for me (iPhone 8)
It could probably be cleaned up a bit by removing the tags, or pushing them to a new line
And yes 100% clean up the links haha
For me, my phone detects it as a phone number. Like sometimes happens with the Reddit page thing
Hmm those just seem like the emoji IDs
oh god
Iโve seen people post that before, but Iโm not sure thereโs anything we can do there
I guess other than not use emojis
Time to call reddit_post_text
I wonder if putting the markdown in a different order or adding spaces would fix it
While making the source command, and the bot doesn't find the source, it sends two messages. Why not make button for each response to delete it?
!src not-a-cog
Unable to convert 'not-a-cog' to valid command, tag, or Cog.
!source [source_item]
Can also use: src
Display information and a GitHub link to the source code of a command, tag, or cog.
I think this is similar behaviour to a lot of places where we raise a userinputerror
we send the error embed, then the help for that command
I think having the error embed delete_after a few seconds would be fine
I thought the handle for UserInputError puts the error and the help content into the same embed.
Like.
If I have a suggestion about the help-channels, should I open an issue ir PR.
Issue
PR is the coded solution
Issue is the proposal
Ok
Yea, that looks like it may be a disparity between the two bots
We're working on something at the moment that may solve this long term, but for now I'd suggest you raise an issue if you want to solve it
Anyone care to review bot#1717
Like, putting sir lancebotโs UserinputError handle into bot ?
bot already has a handler for it, it would be a proposal to change that handler to only output 1 embed
Yes, thatโs what I meant. Sir Lancebot already has a proper handler.
Shall I open an issue? If I may.
? And maybe I can try to code it myself but I don't know where the source code is, and I know nothing about discord.py
Yup, always feel free to open an issue
it can take a day or more for a core dev to take a look at new issues, especially during the week, as we're all volunteers and look in our free time
Do you guys think it would be beneficial to close help channels after a period of time if their pinned message is deleted and there's no longer any activity? Because there have been several occurrences of people thinking the help channels are bugged as they see it's occupied but there's no messages there
Although, the more I think about it the less beneficial it seems
If the first message is deleted and there have been no other messages it'll close in 5 minutes usually. Otherwise it'll be 10 minutes after the last non-op response and 30 after the last op response.
Yea, I think Jack's proposal is to close after 5 minutes even if there are messages from non-claimants
If nobody is working on https://github.com/python-discord/sir-lancebot/pull/558, could I take it over? And if I were to take it over, should I just finish it off, or would it be ok if I rewrote it to implement some improvements (namely, including a markov chain implementation, since that's cooler than using a module that does it for you, and also generating the markov chain backwards so you can start with the rhymes, meaning it can run in a fixed amount of time so you don't have to implement timeouts and stuff in case it doesn't finish in time).
I'd check whether the author has any plans of finishing it





1
0