#dev-contrib
1 messages Β· Page 170 of 1
lmao: #dev-announcements
In the coming weeks, the core dev team will be migrating our current bots
chris does it right then, in true disnake speed
2.5 will require message_content intent btw
we're ready
i mean when connecting to discord
but there's some very nice and very fun bugs on discord's end
so we haven't bumped master to v10 yet
Is the intent itself part of 2.4?
no
ahh alr
since the intent isn't needed to be declared on v9 or lower
ah oki nice
it'd be nice if it wasn't glitched on discord's end tho
lol
my test bot on v10 with the intent disabled still got message content over the HTTP api but not the gateway
however if i turned on the intent, then i would not receive it over HTTP
but would over the gateway
this sounds correct though right?
works the same for members
nope, its supposed to be both
it seems to only affect bots that had the toggle on for a while, from what I tested
You need member/message intent enabled in api portal to get via HTTP
ye
you need that + declare on connection to get from gateway
yeah
this means that @stable mountain might be affected, same with @dusky shore
in which case you're in a better position to have discord fix the issue than i am
on a new bot account they worked properly, and were both restricted
strange
very
Small nitpick @vale ibex https://github.com/python-discord/bot-core/pull/32/files#diff-06572a96a58dc510037d5efa622f9bec8519bc1beab13c9f251e97e657a9d4edR4
Why is Discord.py 2.0a0 captialized?
lol
probably because I was capitialising all instances of Discord
and didn't set my regex to have a negative lookahead
I assume you used 2.4?
slowly becoming a thing, yea
using sir-robin as a catalyst for it
just to make sure boiler plate stuff is in there
yikes the docs are very white
I am sorry my nitpicks just keeps coming
## 1.4.0 23rd February 2022
- Feature: Migrate to disnake over discord.py 2.0a0
- Feature: Add common monkey patches
- Support: Added intersphinx to docs.
there's a dark mode π
Why is there a dot at the end of the last one π
oh wonderful
lol
there should be a dot at the end of every line!
lol you can tell which ones scale wrote and which ones I wrote
the tense isn't even the same lmao
I mean if we're gonna nitpick it:
Feature: Migrate from discord.py 2.0a0 to disnake
we could go for a quite a bit like that
No because there's an ordered list
did I ever have the contrib role, I don't even remember
not getting pings for #dev-announcements is weird
alright updated the changelog with some better wording and grammar
okay but those commas at the end of each bullet item is a bit cursed
that's for the sub list
I think bot-core is using something later than 2.0
younger?
well a bigger semver
it's set to ^2
it shouldn't be ^2
so that's >=2, <3
like I don't even think message intents are in 2.0
message content intent isn't released yet
lol
I still think you should at least pin to 2.1, iirc 2.0 was quite broken
I was gonna just do *
since the bots should set the version they want
didn't think it was worth bothering specifying a version
I think it could be nice to avoid problems further down the line
will you support third party usages?
there is no 2.0
2.1 is the broken version IIRC
oh really
Alizee: this will be in 2.5
pr is disnakedev/disnake#353
I see

@hoary haven I think you can push your changes to your PR. No need to wait for the other reviewer.
ah yes, forgot. will do
https://github.com/python-discord/bot-core/commit/7be96c71051ee746b80a93d83f24559bfd4f0e9a
@vale ibex if you're trying to have code on sphinx autodoc you need two `
where?
Hah yea, thanks
Google docstring style, I approve, I approve
Quick PR to avoid an attribute error when the help channel cache is empty, bot#2101
You better approve on account of you voting for it π
wait did we vote on that haha
oh riiiight
that rings a bell
feels like it was ages ago
I did a sprint on it, then it went dormant, so yeah probably
12/2
Which uhh
I think thatβs December why discord
sounds about right
oh I think I remember someone talking about stopping the bot from auto-joining threads
yeah that was changed
the logging system was relying on that, how did you work around it?
bot/exts/moderation/modlog.py lines 838 to 844
@Cog.listener()
async def on_thread_join(self, thread: Thread) -> None:
"""Log thread creation."""
# If we are in the thread already we can most probably assume we already logged it?
# We don't really have a better way of doing this since the API doesn't make any difference between the two
if thread.me:
return```
uhh.. did you even work around it? π
or is it logging the thread every time someone joins until the bot also joins?
on_thread_join is only triggered on create, when the bot joins, or when a cached archived thread is unarchived
on_thread_member_join is when other members join
this should probably be updated to use something else, maybe the created at time, rather than rely on whether the bot is in the thread or not
(once we migrate to disnake)
since I don't think that data is available in discord.py
right now I imagine it will log on create and when the bot joins
which isn't ideal
we should update the modlog event to look at the created time, to try and distinguish
once we migrate to disnake and have access to that data
but here is the thing, the thread.me attribute should be set when the bot joins, right?
True, but I wonder if it is done so before or after the join event is triggered
if it's done before, then we're probably fine as-is
yeah I think dpy does the event handling before dispatching the event
What does this log?
Is there no thread creation event?
on_thread_join is the only event
and it triggers for a few reasons
it logs thread creations to mod log
May I ask why disnake over pycord or nextcord?
Right now from what we can tell, disnake is more stable currently, the features are generally well implemented, implemented consistently with existing features, and are implemented in good time
nextcord are working on a v3 api, which we are watching closely and may migrate over to when it's ready for general consumption
i am removing admins from python discord
lol gg
no, basically that app looks ... like it was supposed to be a space where we build custom functionality on the django admin
but all it does right now is include the django admin urls in its url config
and the joke is, we don't even include that application
it's completely dead code
yoo is that the one i pointed out
If it is, good job
14 hours later confirming yes this works. cool!
Aha it was #dev-contrib message
Is this public?
Wow this mina user seems like a menace
so it's running site locally on my machine
and logging into the django admin portal
so these are infractions on my test bot/test server
Cool cool cool
me testing antispam
aaaaaaaaaaaaaaaaaaaaaaaaaaa
the admin dash?
yeah anyone can see it
if they clone site
ye ye
if it had our data maybe not lol but otherwise you're good
once they have SITE_ID=1 lol
Is there even any credentials for the prod admin panel
It was previously tied to discord OAuth, that was pretty sick
owners have a super user yeah
yea was a bit overkill, didn't need it considering we barely used oauth2 out of that
I mean we had that for free with the wiki OAuth so why not
because we ditched wiki lol
so then we had a whole role oauth2 system for an admin panel which 12 people could access
Yeah yeah I remember that
hi @trim cradle ! did you find some time to find some time to look into https://github.com/python-discord/site/issues/497?
right, I've been meaning to respond to that
I suppose the current pipeline is fine. It might be nice if admins ask new helpers to add themselves to the registry. As it stands, it's not clear which person or combination of people have final say.
We also haven't discussed the criteria all that much. I mentioned before that I wanted to remove one of the resources, "neural networks from scratch" because it's expensive and print-on-demand, which means that we're asking our users to take on a hefty financial risk in case the resource turns out to not be useful for them. I'd rather curate resources that are easily accessible, even among those that are paid.
Should we curate pairs of interchangeable resources? My inclination is to say that if two resources are very similar, we should only keep one. We don't want to give our users option paralysis or curate so many resources that we don't help our users refine their search any better than google would.
I don't have the answers for those questions.
I'm sure we can iterate on whether the pipeline is fine or not, but the more important thing is to document what the pipeline is
because right now I don't think we've actually written it down anywhere.
or am I wrong about that? @trim cradle
if I haven't written it down on notion somewhere, then I don't think I have. I suppose I can do that later.
Is mentioning the registry to new helpers something you can add to the onboarding procedure? The alternative would be to periodically remind people to update it.
probably, there are helper onboarding docs on notion
maybe it could be added to those?
but I think how to contribute a resource should be documented in the repository itself, though.
Good point
I need to focus on some work stuff, but I'll see about writing something this weekend.
that'd be good. me and @last patio are working on an epic which involves improving the overall documentation and reducing the complexity of the site repo, so this would fit neatly in there
are Volcyy and Joe's new identities part of a thing?
no, they're just weirdos
i dont think mentioning it in onboarding would be sufficient
the onboarding process is a bit overwhelming and i would expect new helpers to file that under "figure it out later" and then forget about it
it's been almost two years since I was onboarded, and from what I remember, it was basically just "u want helper?". I guess the process is different now.
but I see your point.
I wouldn't hold your breath for v3, I'm certain it will take quite a while to be a viable alternative compared to Nextcord v2/Disnake
Far enough away IMO that I don't bring it up when people ask why they should use Nextcord
Yea, we discussed this with vco when making the decision.
alright, wasn't sure
No worries π
@hoary haven @spare plaza bot#2071 was merged. thank you for that cool PR 
time to test it in prod 
brb with my alts /s
Oh god the emojis in commits
Lmao
amazing, right?
I was expecting it to be squashed to remove the emojis
oofers

Basically the site repo and making it more friendly to contribute to
cool
c'mon i can't believe you've done this
3rd commit down, no emoji?
i do love the π for gitignore
um this reminds me, should the bot contributing guide be updated to match some changes we made?
in config-default
yeah and possibly update to staff notion as well.. i'll try to do that today
Not necessarily. I kept it as concise as possible, and people working on the bot will most likely not touch the help system. If they do, they probably won't need to touch that override. And if they do, they can add it π
Most of the configs on that page are mandatory
Yea, a lot of overrides can be removed from the staff config too tbh
since we're not actually overriding, just setting it to the same value again
Ah, wasnβt sure how accurate it had to be
yeah I just made a template for the configs you had to define to run the bot on your server
i think we changed some though
like the names.. i think there was one that overlapped but i'll check
oh, it does include the filters and help channels configs
I guess we can update it, but we can also just remove those
i'm not looking at it right now but it would be good to include those i think. who really wants like 40 test help channels
@static canyon how is reminders stalled by the mod pings PR? Also which mod pings PR?
The modpings PR introduces a converter which I use in the reminder PR
Lemme find the #
bot#2001
That PR adds the DayDuration converter which I use in my PR
Although actually I think I might've since redesigned it, I'm not sure nvm, it will still use this
Wouldn't it make more sense to use arrow since we're shifting towards more arrow usage anyway? It'll add support for human readable stuff too
I'm just using regex because that's what the modpings pr does
Plus arrow doesn't have one method that would solve this
I'll let core devs weigh in on this, but I really enjoy the way the epoch command does it. Since we use arrow anyway, it makes more sense to me to rely on it since it's more robust in the date times it can detect
TL;DR; is that using regex just seemed easier when I initially did this
since it's more robust in the date times it can detect
Everything I wanted to support I've got supported with my regex stuff
no, but using a combination of two would work for nearly all circumstances
arrow.get() and arrow.dehumanize()
Again, I think arrow is the better option because it's far more robust, allows additional time formats, and is way more maintainable than a very complex regex.
Yea, regex seems bad for this.
at face value at least
if there's something this regex does that the two arrow functions don't, I'm open to hear it
one thing i would like support for, in both !remind and .epoch, is "in 1 hour"
iirc you have to do "in 1 hours"
Because for mod pings I do think it would be really helpful for people to turn it off for like 2 hours and just do !mogpings off for 2 hours or whatever the syntax needs to be
I haven't got the up-to-date version on me but this shows it working with the exception of timezone support https://paste.pythondiscord.com/gobemamilo
so, using arrow would support everything there, and would support an offset
with 2 function calls
arrow.get() to try and interpret it as a datetime stamp (Which supports many different formats), arrow.utcnow().dehumanize() to try and interpret it as an "in 1 hour" style offset
I mean I just tried one of the things work in my regex and it doesn't work with arrow
which is?
arrow.get("2021-11-22 12:00:30pm")
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
arrow.get("2021-11-22 12:00:30pm")
File "C:\Users\tizzy\AppData\Local\Programs\Python\Python39\lib\site-packages\arrow\api.py", line 91, in get
return _factory.get(*args, **kwargs)
File "C:\Users\tizzy\AppData\Local\Programs\Python\Python39\lib\site-packages\arrow\factory.py", line 254, in get
dt = parser.DateTimeParser(locale).parse_iso(arg, normalize_whitespace)
File "C:\Users\tizzy\AppData\Local\Programs\Python\Python39\lib\site-packages\arrow\parser.py", line 250, in parse_iso
raise ParserError(
arrow.parser.ParserError: Invalid time component provided. Please specify a format or provide a valid time component in the basic or extended ISO 8601 time format.```
is this a general util that can be implemented in bot-core? so that all our bots can use it?
So we wouldn't have 12/24hr support I guess when including a date
yea, that would work if you removed the pm
since it infers 24 hour clock if given a date too
It apparently doesn't work with . instead of : either
So like 12.30pm
So another fix needed if we're gonna use arrow
Why would you need 12.30pm?
It's just something that was asked, to have support for extra formats
So this isn't quite true
I just really don't like the idea of creating our own behemoth regex which we then have to maintain. That adds a lot of complexity and will make it more difficult to add to or adjust in the future.
But could probably be made true relatively easily
I mean you never have to touch it again once it has been implemented and works
I'd rather say it doesn't work for those esoteric formats, rather than have a large maintenance burden on a complex regex
I mean... that's not true.
Why would you need to change it if it works?
I've never heard of a place that uses 12.30 as a time format
Ideally it's true, but realisitically it's not.
Because you can't guarantee that it'll just work flawlessly. There will be edge cases we don't catch, especially with more esoteric formats.
Which is ironic given that kat literally just said arrow has better support
π€·
It has better support for humanized timestamps and 8601 compliant timestamps...
It's not better support, it's the same support (for iso) π€·
Yea, I don't think either me nor kat would have imagined saying better support also means unused formats
since 12,30 isn't supported either
neither is 12;30
So, since we want to have support for well known formats, arrow is the best choice for that, since it's one less thing we need to maintain, and can rely on the maintainers of arrow to do that for us
I'm fine with moving to arrow, mainly because it makes the humanize part of the issue easier, I just don't get why you both feel the need to shit on my code with reasons which aren't even correct
We aren't shitting on your code, I'm sure it works for what you intended it to do, what I'm saying is that I don't think having it in the code base would be the best option, if one of our dependencies does what we wanted already, with minimal code changes
I don't think I ever "shit" on your code. All I've been saying is that I think arrow is the better choice because it reduces maintenance burden and is robust with the timeformats it supports, including humanized time formats.
the best code is no code, second to that is minimal code
Right yeah, that makes sense
I still don't understand the maintenance thing. Why is a regex less maintainable?
Because trying to understand and parse regex, including the validation of it particularly for edge cases, requires a significant amount of effort compared to 2 function calls.
Hmm
I don't really see how
Either way you've still got to test it
I guess it's just the understanding of the regex
Arrow has a test suite for what it's worth.
Fair enough. I had implemented a test suite for my stuff but I guess as Chris said, it's better to avoid adding code where we can
Yes technically if we want to be strictly black box we still need our own tests but I don't that we want to be so strict necessarily
Yeah
So in terms of the edge cases @vale ibex (like not supporting am/pm) how would I fix those? Just not allow am/pm input and assume 24hr?
If you already wrote tests they could possibly be used still
It's specific to my regex based thing though
And apparently we want to be using arrow instead
Another thing arrow doesn't support (not having padded times)```py
arrow.get("2021-11-22 9:30:00")
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
arrow.get("2021-11-22 9:30:00")
File "C:\Users\tizzy\AppData\Local\Programs\Python\Python39\lib\site-packages\arrow\api.py", line 91, in get
return _factory.get(*args, **kwargs)
File "C:\Users\tizzy\AppData\Local\Programs\Python\Python39\lib\site-packages\arrow\factory.py", line 254, in get
dt = parser.DateTimeParser(locale).parse_iso(arg, normalize_whitespace)
File "C:\Users\tizzy\AppData\Local\Programs\Python\Python39\lib\site-packages\arrow\parser.py", line 250, in parse_iso
raise ParserError(
arrow.parser.ParserError: Invalid time component provided. Please specify a format or provide a valid time component in the basic or extended ISO 8601 time format.```
Honestly when I'm seeing the things that arrow doesn't support, it makes me want to just use the regex because that does support it
You can add formats for arrow to parse.
Well if the goal is the same then the test cases should be the same and ideally your tests aren't written such that they're tightly coupled to the implementation.so I assumed they can be reused
But then I'm having to list every possible format that we allow. Rather than just using my regex which automatically accounts for all of them
Right yeah, true. I'd just need to see whether arrow objects == datetime object equivalent
For the most part they are. A few attributes behave differently
I'll mess around with it and see
Should hopefully be fine
If I really need to I can account for the differences
You can directly compare with datetime
mhm
Or use .datetime to convert it if you must
>>> arrow.get("2021-11-22 00:00:00") == datetime.datetime.fromisoformat("2021-11-22 00:00:00")
False```oof
That's probably tz diff
Right, yeah
Latter is naive
>>> arrow.get("2021-11-22 00:00:00") == datetime.datetime.fromisoformat("2021-11-22 00:00:00").replace(tzinfo=datetime.timezone.utc)
True```Yep, it was
So I'll just have to account for naivety
Which I don't think will actually be an issue since my test datetimes are all set to UTC
>>> london_time = datetime.datetime.fromisoformat("2021-11-22-00:00:00").replace(tzinfo=pytz.timezone("Europe/London"))
>>> paris_time = datetime.datetime.fromisoformat("2021-11-22 00:01:00").replace(tzinfo=pytz.timezone("Europe/Paris"))
>>> london_time == paris_time
```how can I get this to work? Comparing different timezones (Paris is one hour ahead of London so this should be true)
Not sure. I would have expected that to work.
Oh well you changed the minutes instead of hours
It does compare correctly if you fix that and covert them to arrow objects
But still False with just datetime
Huh, so I did
How do I convert to arrow?
I think you can assume UTC if no TZ is provided
arrow.get does that by default iirc
I have commit 91621bc7 from the bot. How can I open it on github?
git show locally
oh that was easier than I thought lol
If I'm working on a site PR, how can I make my bot repo interact with my local site again?
I namely need the clean logs part of site
Currently the url is showing as http://staff.web:8000/bot/logs/1
those somehow just workedβ’οΈ for me
but i run locally, and only use docker for site
idk if that has smth to do with it?
π€·
I'm running bot with docker compose run bot and trying to access the clean logs
Your url settings are wrong, it changed recently
Look at the staff server notion page, it is updated
Web, that works
Thanks
Now I just need to update the config file to reflect that
this is what i have
urls:
# PyDis site vars
site: &DOMAIN "localhost:8000"
site_api: &API !JOIN [*DOMAIN, "/api"]
site_api_schema: "http://"
site_paste: &PASTE !JOIN ["paste.", "pythondiscord.com"]
site_schema: &SCHEMA "http://"
site_staff: &STAFF !JOIN [*DOMAIN, "/staff"]
paste_service: !JOIN ["https://", *PASTE, "/{key}"]
site_logs_view: !JOIN [*SCHEMA, *STAFF, "/bot/logs"]```
This is what I just changed it to```yml
site: &DOMAIN "localhost:8000"
site_api: &API !JOIN [*DOMAIN, "/api"]
site_paste: &PASTE !JOIN ["paste.", "pythondiscord.com"]
site_schema: &SCHEMA "http://"
site_staff: &STAFF !JOIN [*DOMAIN, "/staff"]
paste_service: !JOIN ["https://", *PASTE, "/{key}"]
site_logs_view: !JOIN [*SCHEMA, *STAFF, "/bot/logs"]```
That seems to be the same
So should be good
Thanks
Now if I make changes to my local site repo, how do I make it so that bot will run that changed site repo?
Or is that just done by default?
Guess not lolpy aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host localhost:8000 ssl:default [Connect call failed ('127.0.0.1', 8000)] 2022-02-24 21:19:35 | bot | CRITICAL | Could not connect to site API. Is it running? ERROR: 69
Is the site running on localhost:8000?
I'm trying stuff right now
If I do docker-compose up in the site repo, it starts up
But then when I do docker-compose run bot in the bot repo, it says the port is already taken (it basically tries to start site even though I've already got it running)
PS C:\Users\tizzy\bot> docker-compose run bot
Creating network "bot_default" with the default driver
Creating bot_snekbox_1 ... done
Creating bot_postgres_1 ... done
Creating bot_redis_1 ... done
Creating bot_metricity_1 ... done
Creating bot_web_1 ...
Creating bot_web_1 ... error
ERROR: for bot_web_1 Cannot start service web: driver failed programming external connectivity on endpoint bot_web_1 (14f14a45c4ea9f680f6f3e681b9804c24b04273e679148eccf3923b9a7d427d5): Bind for 127.0.0.1:8000 failed: port is already allocated
ERROR: for web Cannot start service web: driver failed programming external connectivity on endpoint bot_web_1 (14f14a45c4ea9f680f6f3e681b9804c24b04273e679148eccf3923b9a7d427d5): Bind for 127.0.0.1:8000 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.```
And same thing for docker-compose up in the bot repo
if you want an alternative, i do the steps here and use docker-compose up web only for the site, and run the bot in a local venv https://www.pythondiscord.com/pages/guides/pydis-guides/contributing/bot/#with-the-bot-running-locally
A guide to setting up and configuring Bot.
You can run additional services on the host, but this guide won't go over how to install and start them in this way. If possible, prefer to start the services through Docker to replicate the production environment as much as possible.
The site, however, is a mandatory service for the bot. Refer to the previous section and the site contributing guide to learn how to start it on the host, in which case you will need to change urls.site in config.yml to wherever the site is being hosted.
That second paragraph says I need to update the env var to point to where I'm running site locally
But I do that and then it just tries to restart it
Might have fixed it
nvm
I've got no clue what I'm doing now
If I have site running separately, it gives an error because it tries to start it up itself.
If I don't have site running separately, then site starts when I run bot, but bot fails to connect to it
I think I've made some progress, but am coming across an error:py postgres_1 | 2022-02-24 21:35:41.071 UTC [118] ERROR: relation "channels" already exists postgres_1 | 2022-02-24 21:35:41.071 UTC [118] STATEMENT: postgres_1 | CREATE TABLE channels ( postgres_1 | id BIGSERIAL NOT NULL, postgres_1 | name VARCHAR NOT NULL, postgres_1 | is_staff BOOLEAN NOT NULL, postgres_1 | PRIMARY KEY (id) postgres_1 | ) postgres_1 | postgres_1 | pydis-testing_metricity_1 exited with code 1
you can use a compose override file to prevent site from starting with bot
What do you mean?
did you do the steps in the section preceding that though?
from "With the Bot Running Locally"
a docker-compose.override.yml file that changes the web service to not start if you're already running it youself. e.g. I use this to stop the bot from starting
version: "3.7"
services:
bot:
profiles:
- ignore
yes, as that's where you want to prevent the site to start in
don't know what the relation error is though as I usually also skip metricity
So I guess I'd ignore web and postgres?
Currently getting thispy PS C:\Users\tizzy\bot> docker-compose up ERROR: The Compose file is invalid because: Service site has neither an image nor a build context specified. At least one must be provided. @brazen charm
I think it's web in the bot's compose
Right, yea
ERROR: Service "web" was pulled in as a dependency of service "bot" but is not enabled by the active profiles. You may fix this by adding a common profile to "web" and "bot".```
Now this
I guess you'll also need to override bot to not depend on web
Overrode it but same erroryml bot: << : *logging << : *restart_policy build: context: . dockerfile: Dockerfile volumes: - .:/bot:ro tty: true env_file: - .env depends_on: [] environment: BOT_API_KEY: badbot13m0n8f570f942013fc818f234916ca531
You'll need to specify the depends_on key without the web service (and only that)
Hmm
the override is merged into the normal compose iirc
So how do I do that?
bot:
depends_on:
- the_items_that_are_not_web
I've got that
Still not working
depends_on:
- snekbox
- redis```
Same with just snekbox / just redis
Just removed from the main docker-compose for now
Not sure if it's also merging that, maybe assigning it some normal value but that may break things
yeah that'll also wokr
It's still failing to connect to site
2022-02-24 21:54:36 | bot | CRITICAL |
...
aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host localhost:8000 ssl:default [Connect call failed ('127.0.0.1', 8000)]
2022-02-24 21:54:36 | bot | CRITICAL | Could not connect to site API. Is it running?```
And I did do docker-compose up in site
can you access it from the browser?
Yes
It loads the pydis.com homepage (but on localhost)
try 127.0.0.1 instead of localhost
Okay
Assuming you meant in the bot's config, that didn't work
not sure then if http is set. I'd go through the hosts file aliases as those solved a similar issue before
what do you mean?
Apparently my host file already has something for 127.0.0.1
127.0.0.1 kubernetes.docker.internal```
shouldn't matter
Okay, added
It works in the browser
Time to see whether bot likes it
Nope, it doesn't
Still fails to connect @brazen charm
aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host pythondiscord.local:8000 ssl:default [Connect call failed ('127.0.0.1', 8000)]
2022-02-24 22:10:41 | bot | CRITICAL | Could not connect to site API. Is it running?```
what does the config look like?
site: &DOMAIN "pythondiscord.local:8000"
site_staff: &STAFF !JOIN [*DOMAIN, "/staff"]
site_logs_view: !JOIN [*SCHEMA, *STAFF, "/bot/logs"]```
Those are the three relevant bits
is the schema set?
it may need site_web or something like that
are you not using the COMPOSE_PROJECT_NAME env var?
I am
it should be using the same network then
you can try to take stuff down (explicitely with the command) and try again
Got a massive error
Basicallypy web_1 | connection = Database.connect(**conn_params) web_1 | File "/usr/local/lib/python3.9/site-packages/psycopg2/__init__.py", line 127, in connect web_1 | conn = _connect(dsn, connection_factory=connection_factory, **kwasync) web_1 | psycopg2.OperationalError: FATAL: the database system is shutting down
Hmm that seems to have just been bad timing
Think it's fine
yeah the bot started too fast
Starting pydis-testing_snekbox_1 ...
Starting pydis-testing_snekbox_1 ... error
Starting pydis-testing_redis_1 ...
WARNING: Host is already in use by another container
ERROR: for pydis-testing_snekbox_1 Cannot start service snekbox: driver failed programming external connectivity on endpoint pydis-testing_snekbox_1 (f31d95944ea3f5946d079361174a933e28803b9e4174742dfa4d9d56b30f67ab): Bind for 127.0.0.1:8060 failed: port is already allocated
Starting pydis-testing_redis_1 ... error
ERROR: for pydis-testing_redis_1 Cannot start service redis: driver failed programming external connectivity on endpoinRecreating pydis-testing_postgres_1 ... done
ed: port is already allocated
pydis-testing_metricity_1 is up-to-date
ERROR: for snekbox Cannot start service snekbox: driver failed programming external connectivity on endpoint pydis-testing_snekbox_1 (f31d95944ea3f5946d079361174a933e28803b9e4174742dfa4d9d56b30f67ab): Bind for 127.0.0.1:8060 failed: port is already allocated
ERROR: for redis Cannot start service redis: driver failed programming external connectivity on endpoint pydis-testing_redis_1 (b66684f7324dedefa34457a3afc0f567571f29fb0f2e1ca33acaa696ebacdd3a): Bind for 127.0.0.1:6379 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.```
can you docker ps?
And then site is spammingpy postgres_1 | 2022-02-24 22:20:25.287 UTC [258] ERROR: relation "channels" already exists postgres_1 | 2022-02-24 22:20:25.287 UTC [258] STATEMENT: postgres_1 | CREATE TABLE channels ( postgres_1 | id BIGSERIAL NOT NULL, postgres_1 | name VARCHAR NOT NULL, postgres_1 | is_staff BOOLEAN NOT NULL, postgres_1 | PRIMARY KEY (id) postgres_1 | ) postgres_1 | postgres_1 |
dc781ee168b5 ghcr.io/python-discord/metricity:latest "bash entry_point.sh" 3 minutes ago Restarting (1) 15 seconds ago pydis-testing_metricity_1
15ef75f5489a redis:5.0.9 "docker-entrypoint.sβ¦" 15 minutes ago Up 14 minutes 127.0.0.1:6379->6379/tcp bot_redis_1
7a9fe5630e4f ghcr.io/python-discord/snekbox:latest "gunicorn -c config/β¦" 15 minutes ago Up 14 minutes 127.0.0.1:8060->8060/tcp bot_snekbox_1```
How?
docker-compose down
ah it is from before the rename
Yeah
As soon as I start bot, the terminal where I started site gets spammed with errors
And then the bot terminal gets spammed too
this is fresh instance, right?
Site error:py postgres_1 | 2022-02-24 22:24:39.609 UTC [111] ERROR: relation "channels" already exists postgres_1 | 2022-02-24 22:24:39.609 UTC [111] STATEMENT: postgres_1 | CREATE TABLE channels ( postgres_1 | id BIGSERIAL NOT NULL, postgres_1 | name VARCHAR NOT NULL, postgres_1 | is_staff BOOLEAN NOT NULL, postgres_1 | PRIMARY KEY (id) postgres_1 | ) postgres_1 | postgres_1 |
The bot thing seems to just be that error
can you docker-compose down --volumes and try again?
yeah but volumes
hmmm
I guess you can down first without volumes and then with
I guess they're from before the rename
Yeah, I removed the COMPOSE env var thing and now they're gone
So now I try starting site, and then bot? @clever wraith
yep
No errors now
But it's stuck on bot_1 | 2022-02-24 22:30:34 | bot | INFO | Attempting site connection: 1/3
^
web:8000
Ah, it's on try 2/3 now
Just took a long time to timeout
As in, 60 seconds
So looks like it's still not working
bot_1 | 2022-02-24 22:30:34 | aioredis | DEBUG | Creating tcp connection to ('redis', 6379)
bot_1 | 2022-02-24 22:30:34 | bot | INFO | Attempting site connection: 1/3
bot_1 | 2022-02-24 22:31:54 | bot | INFO | Attempting site connection: 2/3
bot_1 | 2022-02-24 22:33:14 | bot | INFO | Attempting site connection: 3/3
bot_1 | ...
bot_1 | 2022-02-24 22:34:29 | bot | CRITICAL |
bot_1 | ....
bot_1 | aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host web:8000 ssl:default [None]
bot_1 | 2022-02-24 22:34:30 | bot | CRITICAL | Could not connect to site API. Is it running?``` @clever wraith
Yeah
can you resend your url?
urls:
# PyDis site vars
site: &DOMAIN "web:8000"
site_api: &API !JOIN [*DOMAIN, "/api"]
site_paste: &PASTE !JOIN ["paste.", "pythondiscord.com"]
site_schema: &SCHEMA "http://"
site_staff: &STAFF !JOIN [*DOMAIN, "/staff"]
paste_service: !JOIN ["https://", *PASTE, "/{key}"]
site_logs_view: !JOIN [*SCHEMA, *STAFF, "/bot/logs"]```
Ah wait, I'm not using the COMPOSE env var
Had to remove it to get rid of the volumes
Forgot to add it back
Let's try again π€
I think it's working
Had a few issues but fixed them
Seems to be up
Perfect, it's up
Thank you very much @clever wraith! 
cool, you're welcome
https://github.com/python-discord/sir-lancebot/pull/1041
can anyone review?
all the front-end peeps, now's your chance to weigh in
site#682
is it fine to have a br inside a span? is it worth avoiding if it Still Worksβ’οΈ?
I think it is fine as it is, it would avoid messing with margins and stuff
can i be assigned to this
oki I've approved it as is
the commit title is wrong though
I think it's worth fixing but will defer to core devs
Hey! Sorry, but the Events team decided, that it's best if this PR is done by a staff member!
Although, there are many issues out there, go ahead and fine another one! π
Thank you, and I'm sorry for the inconvenience!
!source superstarify
Temporarily force a random superstar name (like Taylor Swift) to be the user's nickname.
I know, I wanted to look at the source code myself. That was the fastest way to do so
It's the function above: https://github.com/python-discord/bot/blob/main/bot/exts/moderation/infraction/superstarify.py#L36
bot/exts/moderation/infraction/superstarify.py line 36
async def on_member_update(self, before: Member, after: Member) -> None:```
It listens for everytime a member is trying to change their nickname. If they do and they have an active superstarify infraction, it reverts it
It is, if you're using listeners
@bot.event can only have one
@bot.listen() or @commands.Cog.listener() can have multiple
@clever wraith its not possible to remove the nickname permission from a user without having a whitelist role that gives it to everyone else unfortunately
hence python listens for every member update and changes the nickname back if its changed during that period
You are not allowed to use that command here. Please use the #bot-commands channel instead.
Iβm pretty sure there are some badges that are inaccessible from the API
In [49]: author.premium_since
Out[49]:
datetime.datetime(2019, 6, 10, 19, 7, 12, 423000, tzinfo=datetime.timezone.utc)```
slightlyβ’οΈ
but that only shows for this server, iirc

Created: <t:1459415175:R>
Profile: @patent pivot
ID: 165023948638126080
Joined: <t:1484070095:R>
Roles: <@&267627879762755584>, <@&267628507062992896>, <@&807415650778742785>, <@&587606783669829632>, <@&409416496733880320>, <@&797752289771126784>, <@&491583790448246785>, <@&721459198839357490>, <@&267630620367257601>, <@&585529568383860737>, <@&323426753857191936>, <@&295488872404484098>, <@&764802720779337729>, <@&463658397560995840>
Messages: 119,638
Activity blocks: 19,432
Total: 0
Active: 0
good command
mmm I might not be reading it right, but isn't it covered by the channel field having that ?? https://discord.com/developers/docs/resources/channel#channel-object
Integrate your service with Discord β whether it's a bot or a game or whatever your wildest imagination can come up with.
no, that means that the field may not exist
ah
the second ? which that pr adds means that the field may be nullable
But yeah, my issue is as edge as an edge case might be π
well uh
it led me to find another bug in the library, and so far 2-3 discord api bugs 
some of these bugs existing for 5+ years

nothing profound, I just figured it might not be the only place where something like that happens, and not surprised the lib has old bugs
true
I really thought I sent this easier, sorry about that https://discord.com/developers/docs/reference#nullable-and-optional-resource-fields
Integrate your service with Discord β whether it's a bot or a game or whatever your wildest imagination can come up with.
np, I understood your explanation, thanks
hi could i get a review on bot#2039 π₯Ί
can i got a review on sir-lancebot#1034
this one i suppose
@last patio I'm offloading responsibility for the resource contribution guide.
alright π
Do you mean the !user command? If so, the "activity blocks" means how many 10-minute blocks you were active for on the server I think
@thorny obsidian would you be willing to review https://github.com/python-discord/site/pull/683 ?
@last patio has been working on it to address some of your confusion about which different parts do what in the site project, and I'm too familiar with Django to be a reasonable reviewer.
This is just the first of many PRs, of course.
It could be interesting to look at some Django resources in there, I think
RP has a whole series on the lib I believe
Of course! I can review it later today or tomorrow (parents currently visiting)
lemon I have an ew pr
it fixes all the useless output from python manage.py test
so it just displays dots now as it should
if you pass the wrong datetime kind django will now throw up with an exact stacktrace at test run time
and the infraction viewset was updated as well, to query aware to aware instances
reviewed but I don't get it @last patio
okay @last patiothis was a success.
thanks
https://discordpy.readthedocs.io/en/master/ext/commands/api.html?highlight=context#discord.ext.commands.Context.invoke will call the function without using converters etc.
Is there a way to call a command with conversion?
You get the command and call await commnad.invoke(ctx)
discord/ext/commands/core.py line 885
async def invoke(self, ctx: Context) -> None:```
hmm yeah but then I can't specify the args
You cannot, no. You need to modify ctx and change the args π΅βπ«
Is there a reason why !d discord links nextcord?
hmmm not exactly. I bypassed the issue though, thanks!
!help d
!docs [symbol_name]
Can also use: d, doc
Look up documentation for Python symbols.
Subcommands:
!docs cleardoccache <package_name>
Clear the persistent redis cache for package.
!docs deletedoc <package_name>
Removes the specified package from the database.
!docs getdoc [symbol_name]
Return a documentation embed for a given symbol.
!docs refreshdoc
Refresh inventories and show the difference.
!docs setdoc <package_name> <inventory> [base_url]
Adds a new documentation metadata object to the site's database.
!docs getdoc
Why can i use those buttons lol
because I didn't limit it lol
!d discord
To work with the library and the Discord API in general, we must first create a Discord Bot account.
Creating a Bot account is a pretty straightforward process.
interesting
It might be because nextcord was the last to be added?
or because it's the last on the list out of the wrappers
!src docs
Look up documentation for Python symbols.
Yeah thereβs an open issue for that
You could call https://github.com/Rapptz/discord.py/blob/master/discord/ext/commands/converter.py#L1097 for each param
discord/ext/commands/converter.py line 1097
async def run_converters(ctx: Context, converter, argument: str, param: inspect.Parameter):```
oh that's a thing
Yea, but you need to pass it the converter still, and call each param
But it looks a bit awkward
so it's not much better
I'm only dealing with one param at a time so it's not the end of the world, but creating that Parameter object seems annoying
I have a thing that works, so I'll stick with it for now
π
Does anyone know something similar to wait_for() for buttons in dpy? When I try to use wait_for() it doesn't work and I also tried using this and it isn't working either:
@commands.Cog.listener()
async def on_interaction(interaction: discord.Interaction):
await interaction.respond("houston we got an interaction")
Would appreciate some help with this. Thanks!
Ahh, thanks
reviews welcome on bot#2069
That Title Case 
that's a very long PR title 
(also i'm gonna try reviewing your PR @placid ermine)
i tried
hmm, what's the reason we should check usernames when joining/switching voice channels?
we've had a couple times users in vc reported users joining with Bad Usernames
getting an alert will allow us to address these users even if they're not reported
i think griff originally implemented it to only be initial voice join, but looks like along the way it was changed? not too sure on this one
π
so it seems like this is possible for a user to bypass if they change their nickname while they are in a voice channel, no?
- join vc with clean name
- change nickname
no ping, and bypassed the system
ooh but i did look at the code and the solution to the above should be pretty easy to implement (hopefully)
@Cog.listener()
async def on_member_update(self, before: Member, after: Member) -> None:
if before.display_name == after.display_name:
return
if after.voice is None:
return
await self.check_bad_words_in_name(after)
although hm, is pydis caching voice states
yeah it caches the entire server
Even if this wasn't possible, the goal is not to make it inescapable, but to catch more cases
ah, makes sense
although the above code paired with the existing would prevent all bypasses
I was about to say
if i want to review someone's PR and it's on a branch of their own fork, what do i do
git remote add upstream their_repo.git ?
You could, but I use
git fetch origin refs/pull/12345/head && git checkout FETCH_HEAD
Where 12345 is the PR number
Good enough for looking at and running the code, but not if you want to make changes and push them
In your ~/.gitconfig you can create an alias ```
[alias]
cpr = "!cd ${GIT_PREFIX:-.} && git fetch origin refs/pull/${1}/head && git checkout FETCH_HEAD #"
my origin is my own fork though. i suppose i should use 'upstream' ?
Yeah
sigh i think i'm on old pwsh and && doesn't work lol
To be honest I recommend the gh CLI client
Just make it separate commands
With it you can just do gh pr checkout 12345
Also I don't know if y'all are still on Linode, but they are being acquired by Akamai
gh cli sounds good
but thanks mark i'm now in a detached HEAD state but that's to be expected, i think
french noblemen in 1789:
@clever wraith preferred protocal for git operations: https vs ssh
does it matter?
shouldn't really matter for unauthenticated
Yeah it's gonna be detatched which is what I was alluding to when I said that it's not good if you need to push changes to that branch
GraphQL: Could not resolve to a PullRequest with the number of 2032. (repository.pullRequest)```

No idea I don't use gh cli
Haha
mark that cpr thing is super smart
Thank you. I am filled with joy to finally receive praise for my beautiful git aliases. They are excellent. They have saved my poor frail hands from many keystrokes.
Where do the "GitHub Actions" embeds in #dev-log come from?
Selecting "Send me everything" with a webhook on GitHub only creates embeds from "GitHub"
.bm
Hello, I'm looking at bot#2107, it looks good to me, but would it be better include moderators in the interaction check since we do this for pagination and deletion emojis, or leave it as-is?
(WAHHH the gh cli tool is so cool)
do you mean how mods are able to use the paginate & trash can emojis even if it's an embed invoked by someone else?
i think that'd be nice. on occasion i've pushed other mods' buttons on a help embed they've invoked
i think we might expect the same behavior across all
cool cool. cc @torpid grotto
it might even be necessary, if there are users for whatever reason spamming large embeds in python-general.. unless the trash can emoji still checks
First time contributing so just making sure https://github.com/python-discord/bot/blob/91621bc7ef590118e91bbb2e387db5e14128b530/bot/constants.py#L711 this is the list of IDs I use when checking correct?
bot/constants.py line 711
STAFF_ROLES = Guild.staff_roles```
i think the one above it is the moderation role
Alright I'll do the moderation roles one
(if that's what the current behavior is for other things @sleek steppe?)
yeah π
@placid ermine can you test smth like this
this is the resulting log
is that right though? it appears to tell me that the mute has failed bc the time is in the past, nothing appears in the modlog, the user doesn't get the muted role. but i still have to unmute them to remute them correctly
this is bot#2039
the infraction ID also still gets incremented
interesting
oh.
so
i put my check inside the apply_infraction function
but the bot posts the infraction to the db before that function is called
hmm although
@hoary haven i think this doesnt happen for infraction edits, could you confirm that
like will it let me edit a "failed" mute to end in the future?
probably?
before this the most recent infrac was 34
mm good catch btw
thank you :D not that we ever use iso lmao
i tried editing a valid existing mute to a date in the past, and it failed (as it should), and the original mute duration seems to hold (as it should)
okay i think ill need to put the checks for mute, ban and voice_mute individually
because all the commands seem to post the infraction to the api before calling apply_infraction
wait
or maybe revert the PR to just disallowing infraction edits into the past?
huhhh
ohhh
fuck
i see whats wrong
so the flow goes something like
- post infraction to site api
- try to apply infraction by adding role/kicking/banning etc
- if this fails, delete infraction from api
my mistake was returning immediately upon finding the duration is in the past, and thus not executing step 3
that sounds right to me..
yeah, bc i can use !ban with dates in the past and it shows up in the infraction search despite the user not actually being banned
okay so trying to apply the check between (1) and (2), skipping (2) and doing (3) is going to become pretty messy
ill do this
(ie, before (1))
maybe check with a core dev.. bc the portion of the code change that actually disallows editing infractions into the past works fine right?
yeah edits work fine
the part of disallowing past-date expirations to start with might be better in a separate issue < is what i'm unsure about
this seems new
NVM DO NOT USE THAT
github why
they don't use their key to sign those commits when you rebase on github π₯²
This is a problem with rebasing through the site in general.
Including merging a PR via a rebase.
I was all ready to not actually start my editor and use that.... indeed, its not possible
The other problem with online rebases is that it changes the committer date to the current time, so all commits appear to have happened at the same time (cause the web UI uses the committer date rather than the author date).
;-;
I mean, given this particular project the screenshot is from uses squash only, its probably fine
Could some core dev review this? Itβs had 3 approving reviews (from staff members) for a month
https://github.com/python-discord/sir-lancebot/pull/988
Why not make the check in the converter?
interesting
If you don't want to apply it to all ISOs, you can inherit from the ISO converter and add the check after the super call
like FutureISODatetime or something
the docstring of Duration suggests that its going to be in the future https://github.com/python-discord/bot/blob/main/bot/converters.py#L349
And Expiry naturally needs to use it instead
bot/converters.py line 349
async def convert(self, ctx: Context, duration: str) -> datetime:```
bot/converters.py line 351
Converts a `βduration`β string to a datetime object that's `βduration`β in the future.```
hmm
Does the bot use the convertor on startup when pulling infractions to schedule?
or does it just use the raw json from site?
we dont need a check there do we? a bad duration shouldnt make it to the db
It's a valid use case that on start up an infraction would be in the past
if it expired while the bot was down
hmm π€
I don't think it uses the converter
Alright cool, should be fine then
At least from what I recall when converting everything to TZ aware
I can't imagine it would, since we'd need to call convert manually
yeah I think I just made it use arrow.get
π
so i inherit ISODateTime, call super().convert in this convert, and raise an exception if its in the past?
yep
π
And change Expiry to use it instead
Nope, it handles BadArgument already
cool cool
Make sure you raise BadArgument and not any built-in exception
yeah noted
uhh
instead of sending an error message
if the conversion to datetime raises the exception it changes the reason to be the string
yeah the next arg is a str
Yeah then you probably want to check it inside the command itself
There is probablyyyyy a way around it
But I personally don't think that's a good idea, although we shall ask mister zebra right there
well what's the workaround
does it do this for all exceptions or just BadArgument
I think for all Discord errors?
not sure
hmm
Ok so
The issue is that the date arg is optional
So it does fix it for warns, mutes, etc.
It doesn't fix it for bans, edits, appends, instead causing unexpected behavior
ig i could make a decorator which checks that the date arg is not in the past?
That could work yeah
raise a custom exception that isn't recognized by disnake, but is recognized by the error handler as BadArgument
decorator works
@hoary haven should be fixed now btw
cool
one thing i noticed yesterday is that sometimes running !infr search would work and other times it wouldn't
2022-03-01 09:37:22 | bot.exts.backend.error_handler | DEBUG | Command infraction search invoked by minaβ―β©β―#0001 with error CheckFailure: The check functions for command infraction search failed.
any idea why?
Did you run it in a non-mod channel?
Is anyone able to review bot#2107
I was planning to do so later today when I get home (in an hour) π―
The code looks good, just needs testing
So far I've tested with roles, without and with other people who aren't the author of the message
Hi I was just wondering why don't we separate frontend from backend into different repository
frontend and backend for what? Site?
Yep
Because there's no need for that with django and how we do our markdown rendering
have you looked at our site repo and how it's set up? Some things are a bit more intricately linked and wouldn't really benefit from the separation like our forms application does
Site backend is mostly already separated anyway
Itβs almost entirely in the API folder
I say almost entirely because of a couple other apps which are technically backend, but nothing backend beside the api has been worked on in years
Thatβs just admin and mod logs
@torpid grotto bot#2104 has been merged. Thanks for the PR!
bot#2107 *

Why are we running actions on drafts π€
why not?
Well, they're drafts. I'm pushing commits without expecting them to succeed
true, I guess I'm a little annoyed by the emails π
It's possible to disable notifications for actions
I don't see why one would want notifications for that generally
Maybe if the actions take hours
I donβt remember if thereβs a setting for it or not (there almost definitely is), but you can filter your incoming emails for a CC to ci_activity@noreply.github.com and never see another ever again
I believe so, yes.
@surreal veldt , @austere hornet when the command is called without a sub-command, it attempts to directly convert the string using PIL's ImageColor.getrgb(). It then sets the name based on converting the rgb value to hex, and then looking up the hex value from the referenced color list. This could be a case where the fuzzy matching has a score of at least 80, and "matches" the hex value #008000 to Black. Using .color name green works as intended
oh okay, thanks!
so what's needed would be adjusting the fuzzy matching?
Yes, but that would run the risk of then not matching other inputs that are correct
Oh I see, thanks for letting me know!
site will no longer produce any warnings while running tests! Thanks to @tawdry vapor and @crude gyro for reviews. If everything is green, running tests locally will now look like this:
Can we change the dots to 
nice work @last patio, that's much cleaner
what did it look like before?
a deluge of irrelevant warnings and logging
you save what you need, Mark my good friend
thanks!
(also I don't know what that means, how do you save someone's word)
haha
Delugeβ’οΈ copyrighted by: lemon
sure
thanks
@last patio what did you think of my proposals in the Poetry commands issue? I am keen on the last one, which makes manage.py a Poetry script and removes the taskipy stuff
no problem
I think that's nice, well, personally i'm a fan of just using the stock manage.py, but I think that won't work with our setup due to how django-bulma's theming works
so no way around collectstatic
Do you not see the value our custom one provides to new contributors?
Setting up an admin account, API key, etc
In any case that seems orthogonal to this issue
Mark I am the worst person to ask this. I love manual work that makes me feel like I'm in control. Having a script that sets environment variables for me is some kind of satanic bible for me. I do think it's convenient, but I haven't changed my .env file since I started work on Django back in '04
This revelation does not bode well for your project lead position
Thanks Mark
I think manage.py tasks are a nice idea though. Removing dependencies is always good
I like the DevOps role icon!
Pydis is moving to Amazon lambda
Ic
I jest. You're great
It is a joke
I know Mark, you too!!
I think site is on a really good path right now. It's getting really good to contribute
@tawdry vapor do you want to take a look at that issue then?
It does seem like a quick issue but I don't feel comfortable making a commitment right now cause I have a busy week.
no worries!
@dim pelican i want a re-review for python-discord/sir-lancebot#1041
Its all good, was just asking the question lol
Would having the default set in the function eliminate the need for a constant?
Ah I see the diff now
Looks good to me
bot/exts/core/internal_eval/_internal_eval.py line 113
output = self.shorten_output(output)```
this use shorten_output
if 99980 is the default
then shorten_output will be truncated to 99980 character
but the limit of sending message on discord is 1980 character
oh no
should i revert them
@dim pelican still here?
Yeah just reading
If the output is over 1980, it calls _upload_output, and the output is shortened according to the max_length. The upload would then save all of the characters up to 99980
And have that as a link
But now I want to test it again lol
lol
Yeah.....
About that suggestion I made....
It was a bad one
Your original implementation works the way it should
I'm sorry about that
My suggestion needs to be reverted
np
Oh it hurts so good
wdym
Just that I made a bad suggestion, no worries
@dim pelican i want a re-review
Nope, my review is still good, I think just one other staff member needs an approval, then a core dev
just one core dev
@vale ibex being popular
I have no idea why you are showing there, there is nothing else pydis related underneath that
lmao
why make a simple markdown when you can have a pdf
oh new toy btw
lol how weird
Ah, taking a note from gitlab, just with better UI
If I had to pick a face for devops, we could certainly do a lot worse than chris 
I don't know about that, that's a pretty ugly face
This is just what he looks like before shaving in the morning
His face smoothens out significantly
tbf it comes from org which is just markdown
just better lol
anyone run into
Installing dependencies from lock file
RuntimeError
[BUG] bot-core (1.2.0) is not satisfied.
at /usr/lib/python3.10/site-packages/poetry/mixology/partial_solution.py:200 in satisfier
196β # As soon as we have enough assignments to satisfy term, return them.
197β if assigned_term.satisfies(term):
198β return assignment
199β
β 200β raise RuntimeError("[BUG] {} is not satisfied.".format(term))
201β
202β def satisfies(self, term): # type: (Term) -> bool
203β return self.relation(term) == SetRelation.SUBSET
204β
this when running poetry install in the bot repo?
tbf, pandoc does the same thing for md
fair
I had issues with doing the poetry install of bot core for Sir-Robin, I think I eventually ran pip from the venv and then did poetry install again to verify
hmm, installing bot-core in the env still gives the error though
i just did a fresh new pull of the bot and was able to poetry install everything fine
:thonk:
Are you on an old version of poetry?
One that might not support installing from url?
No idea when that was added
Poetry version 1.1.13 should be the latest version
anyways I only needed local dependencies for LSP to work so I removed bot-core from poetry, did poetry install then pipped bot-core again
How odd though
what branch are you working on?
@brisk brook I can't seem to reproduce https://github.com/python-discord/bot/pull/2001#pullrequestreview-860244505
https://github.com/python-discord/bot/pull/2001, but I merged master on my end





