#dev-contrib
1 messages Β· Page 13 of 1
Yeah the config file is a doozy to set up
What now
What, you're re-writing all of PyDis's code in a compiled language now?
it better be Rust
Elaborate?
The emojis that messages sometimes contain; their IDs and whatnot are contained in the config.yml so they're loaded as a constant
Where can I get
the actual pngs
so I can add them
to the server
so I can get the emojis in messages working
I'm tired of seeing invalid form body :(
Oh, you want the PyDis emojis in your own server?
yep yep
Hmm that's why we have the staff testing server
I never got a line
Don't you want to just use the testing server? it's meant to be messed with
And we have a ready config for it
It's hard to explain sorta... not really
I just like having an isolated space
If you right click an emoji it will let you save the image (on desktop)
yep, that much I knew
I just needed all of them in one spot
i wanted to make some contrib to the python bot but the config setup killed me
is there a watered down version of the py bot with auto configs
you mean the default config.yml file?
you can copy that, there's also a server template i think for testing it
The guide tells me to copy paste and to just fillout what i have to
Yeah im using that
But i gotta edit everything
And find everything
We are aware this is a pain point in the new contributor set up process. We want to automate the configuration, but to my knowledge efforts on that have stalled.
In the mean time, keep in mind the sever config mapping does not have to be one to one. For example, you can re use the same channel for multiple config fields. Furthermore, many config options are only used by a subset of the bot, which may not be relevant to what you're developing.
The test server template on the website (https://discord.new/zmHtscpYN9E3) also has the old help channel system, is there an updated one with forums or does that not matter?
haha guys, I made https://github.com/python-discord/site/issues/872 this issue becuase I wanted to implement it, was just waiting for you guys to add the tags, so I could tell you guys to assign it to me. Anyways from next time I will make sure to mention it in the issue itself
I think there's a way to get a list of active threads via the API, but it's per channel id
Guild seems to have a threads attribute
!d discord.Guild.threads
property threads```
A list of threads that you have permission to view.
New in version 2.0.
Presumably would just be len(ctx.guild.threads)
Yeah
@vale ibex should my config have site_api: &API !JOIN ["api.", *DOMAIN] or site_api: &API !JOIN [*DOMAIN, "/api"]
this is good to know; thanks! (and also @clever wraith π )
The latter
thanks devops master
how is postgres upgraded in the k8s cluster
I'm curious
mostly I want to upgrade my own in my cluster 
after im done with autoconfig
im gonna add a feature in the python bot that responds with just ask a question when somes asks does anyone know xyz
also should i make a issue on github to show/tell people that im working on a auto-config/setup thing
@clever wraith thoughts? I heard you wanted to make one as well
Hum ? Heard what from whom/where exactly ? 
maybe a different Luna
No it's me, but I'm intrigued to find out how you heard that
we where talking about it the other day and someone mentioned u want to do it yet i already started (didn't know u where doing it)
and probably almost done(me)
One thing you should know (It's in our contrib guidelines), is that you shouldn't work on something before there's an issue for it & gets approved by our core devs
To not risk working on something, that won't get approved
thats why i asked this
There's still discussion about how autoconfig should work, so there's no way implementation can start now (although hopefully soon). If you have started, I'd recommend you stop working on it for now and share what you have so far. We can then see if it aligns with any of our ideas and figure if there's a way forwards.
i haven't fully implemented it
but i got the base structure done for the most part
Basically they way i want the command setup to work is to pass some parameters like
emojis channels roles prefix
emojis channels and roles are bools while prefix is just a string for example ! or /
the bools by default are false and you would need to specify each parameter when calling the function
if a bool is true it would auto create any missing information
for example :trashcan: exists in the server therefore no need to create a emote but status_idle doesn't exist so it will autocreate it(same thing with the channels and categories as well as roles)
now for the actual config.yml
i couldn't find any clean way to really do it while keeping the !ENV and !JOIN commands
so the idea is to loop through config-default.yml and replace necessary details according to created channels
and since some lines would have the same names we can still distinguish them with the var's in the config
eg we can check the var name to only replace mod's category by not only searching for 'moderators' but as well as &MODS_CATEGORY
moderators: &MODS_CATEGORY 1073019045227544588
so that it can skip
moderators: &MODS_ROLE 831776746206265384
and this is where im currently at @timid sentinel
You should probably add a run down of that to the issue too, for reference
not sure what u mean(not being ironic)
Add a brief rundown of your theory to the issue
Yes
aite
People will look at that issue, not this thread
anyways I assume you probs had the same issue as me so i just made the parser myself
with open('config-default.yml', 'r') as file:
config = file.readlines()
config_keys = {}
parent = ''
child = ''
for index, line in enumerate(config):
if ':' not in line:
continue
current = line.split(':')
if current[1] == '\n':
if current[0].strip() == current[0]:
parent = current[0]
child = ''
config_keys[parent] = {}
continue
child = current[0].strip()
config_keys[parent][child] = {}
continue
if current[0].strip() == current[0]:
config_keys[current[0]] = current[1:]
continue
if child == '':
if current[0].strip()[0] == '#':
continue
config_keys[parent][current[0].strip()] = current[1:]
config_keys[parent][child][current[0].strip()] = current[1:]
print(json.dumps(config_keys, indent=4))
you should get something like
"debug": " !ENV [\"BOT_DEBUG\", \"true\"]\n",
"file_logs": " !ENV [\"FILE_LOGS\", \"false\"]\n",
"bot": {
"prefix": " \"!\"\n",
"sentry_dsn": " !ENV \"BOT_SENTRY_DSN\"\n",
"token": " !ENV \"BOT_TOKEN\"\n",
"trace_loggers": " !ENV \"BOT_TRACE_LOGGERS\"\n",
"clean": {
"message_limit": " 10000\n"
},
"cooldowns": {
"tags": " 60\n"
},
"redis": {
"host": " \"redis.default.svc.cluster.local\"\n",
"password": " !ENV \"REDIS_PASSWORD\"\n",
"port": " 6379\n",
"use_fakeredis": " false\n"
},
...
hope this helps @clever wraith
i tried to use the yaml module but i couldn't manage to get !ENV [\"BOT_DEBUG\", \"true\"] to not change
Our constants.py file acts as a parser
all the parsing logic is at the top
if you import that it will handle reading both config-default.yml, config.yml and .env, leaving the values in the classes for ease of access
i understand that
the problem here im trying to solve is for creating config.yml accustomed to the user
instead of going in and copying channel id's for every channel category and so on
can atleast automate most of the things
Ah auto config stuff?
I believe we had some ideas internally on how to handle this
which included changing how we store constants
I think it's still being fleshed out as an idea
ya i just put a issue on it today
but i worked on it before i did that
i like the idea of using .yml
its very nice
Hah this is a conversation we've been having a quite a number of months by now :P
You can probably find some previous discussions by searching auto-guild or similar in this channel
i can't really say if i solved most of the issues or not as i have no clue what u guy's have stumbled upon
but i have pretty much got it all done atleast with the id's
e.g roleids channelids categoryids
prefix
yada yada
I believe at least one of them was knowing which category to create the channel in
since the category ids and channel ids are separate and have no link
Yea, that's where changing how they're stored came into the discussion
for example
Category: Off-topic - Channels: [<TextChannel id=1073019045890236422 name='ot2-bar' position=46 nsfw=False news=False category_id=1073019045890236419>, <TextChannel id=1073019045890236420 name='ot0-lol' position=44 nsfw=False news=False category_id=1073019045890236419>, <TextChannel id=1073019045890236421 name='ot1-lmao' position=45 nsfw=False news=False category_id=1073019045890236419>]
each textchannel has a category_id
and a id
i still haven't gotten to creating channels, categories, and emojis
but i have done it in a previous bot of mine
I was referring to how we have category constants, and channel constants seperate in the config
oh
but the channels need to be created in certain categories
Similarly, webhooks need to be created in certain channels
and a few other things that need to be linked, but that link isn't represented in the config
its possible
oh
Yes, it is possible, that's what the discussion is I believe
yeah thats kinda what confused me tbh
categories:
logs: &LOGS 1073019045378531479
moderators: &MODS_CATEGORY 1073019045227544588
modmail: &MODMAIL 714494672835444826
appeals: &APPEALS 890331800025563216
appeals2: &APPEALS2 895417395261341766
voice: 1073019045722472535
summer_code_jam: 861692638540857384
Once a formal proposal is together I imagine we will raise it in an issue for discussion
alright sounds good
Seems like a meta change, I think ask in #community-meta to see what admins think
what do you mean by meta change
i want to take on this issue myself
so i can contrib
I feel like it's more than just a change to the bot
We're generally averse to this sort of thing
damn
python-discord/snekbox#168 any word on this? just had some initial thoughts but I think it could be a good thing to explore
If you're looking for ways to contribute, we have a lot of open issues, and you can also help review open pull requests.
ah i didn't know i can review open pr
ok and does someone have to assign me to a issue?
Yeah, just reply to it and mention it here
Oh, it looks like @dusk sinew also wanted to? π€
ya i saw but it's been a month
Yeah no one assigned him for some reason. I'll wait for their reply, and if it's not relevant anymore assign you
I mentioned I'd be willing to take it on in my original message but I'll give @desert imp or @dusk sinew first preference
Ah, but I was first first! /s
damn
i skimmed over it and it looks like it's just 3 lines of code thats changed
to reply instead of ping
wheres the source of this located
Looks to be just two lines, actually
well two but then there is a variable that isnt used
in the python bot , bookmark.py
If you mean view.message then that is most likely used within the view itself
allowed_mentions = AllowedMentions(everyone=False, roles=False, users=[ctx.author])
msg = f"{ctx.author.mention} {icon} {msg}.\n\n```\n{output}\n```"
can just be
msg = f"{icon} {msg}.\n\n```\n{output}\n```"
why is it weird
oh yeah
pydis_core/utils/interactions.py lines 82 to 85
async def on_timeout(self) -> None:
"""Remove the view from `β`βself.message`β`β if set."""
if self.message:
await _handle_modify_message(self.message, "edit")```
You'd need to keep the allowed mentions
response = await ctx.send(msg, allowed_mentions=allowed_mentions, view=view)
becomes
response = await ctx.reply(msg, view=view)
why
You can specify allowed_mentions to forcefully prevent any mentions that may happen due to some exploit in the eval output (which we have had before)
wym
Which directory? Can't find it
sorry, I got confused
That's not it
!source bot.exts.info.subscribe.py
Unable to convert 'bot.ext.info.subscribe.py' to valid command, tag, or Cog.
!source bot.exts.info.subscribe.py
Unable to convert 'bot.exts.info.subscribe.py' to valid command, tag, or Cog.
!source [source_item=None]
Can also use: src
Display information and a GitHub link to the source code of a command, tag, or cog.
bot#2341 looks to be this PR
Yep
!src Subscribe
Cog to allow user to self-assign & remove the roles present in ASSIGNABLE_ROLES.
thanks for the help, found it
Speaking of https://github.com/python-discord/bot/pull/2401
Why?
Because it's an overwhelming amount of channels that are irrelevant to new members
Fair
Is it worth an entire role?
From what I understand we're just barely scraping by the limits
If we want to still give people a way to access, then yes
Not really
oh
!server
Well... that was my entire argument
Still have 151 to spare
It becomes a bit scary during code jams, but even then we have enough room
How many did the CodeJam create?
Yeah
That's what I was thinking of
@cold island why is this new role one digit longer than the rest?
Is that correct? I thought they were fixed-length numbers
Because Discord snowflakes passed 99999999999999999
The ID of the message above is 1074810992346792006
Huh
I just remembered hearing that snowflakes were a specific number of digits
They were, but there's now one more
If you check lemon's user ID he has one digit less
Because it's not something that new members should have to care about in the first place
#help-cherries , #help-pineapple , #help-chocolate , etc, etc
ya looks ugly i have it closed
Those channels are now read-only because #1035199133436354600 is here
yea
So we're talking about hiding the giant list of locked channels by default
i think you should also do the same thing in #1035199133436354600 with Topical Chat
to make it look cleaner
That would be a lot more controversial
and just prevent people from making new posts
I'm not sure what you mean
topical chats are not a replacement for #1035199133436354600
i know
but i think the same system should be applied but with preset categories
so in #1035199133436354600 u can create a new post
but instead of that for Topical chat
wait let me try and write this out
so it doesn't sounds confusing
You want topical chats to have forum channels?
yes
and #algos-and-data-structs becomes a post in the forum
and people can browse through
you can suggest it in #community-meta to see what people think
ok
config-default.yml lines 144 to 146
modmail: &MODMAIL 714494672835444826
appeals: &APPEALS 890331800025563216
appeals2: &APPEALS2 895417395261341766```
?appeal_category get
Currently configured appeal categories are: 890331800025563216, 895417395261341766
It's back-up in case we get flooded with appeals
and yes wtf please sleep
man it's been a while since I made PRs to pydis
hello
helo
(context: updated some links to my old domain to the new one for the bot tutorial)
oh nice, thanks
you can ctrl-c again to kill it, though it might sometimes mess some things up
My suggestion would be to run the bot in a local environment and keep the site in docker. Then you only need to restart the bot without all of the other services
Re: site#876 the build failure isn't related to me right, that's just the actions runner getting ratelimited by GitHub's API?
Yeah it's our actions
also github my beloved why are you using 403 for ratelimiting
I'll probably just wait for @vale ibex to force merge it or something
Aight, well ty for the approvals and good night I'm off to bed :P
Same, night
merged
nice
We should probably figure out what to do about that, I think there was a suggestion some time ago
thats what i do
i be spammin ctrl c
bj0key aint been active in a while mind if i get assigned python-discord/bot/issues/2382
assigned
@dusk sinew sorry for not noticing earlier, feel free to drop a message here if you want to take on an issue.
this PR has a bunch of instances of "\`" in strings that I think need to be there--isn't there a comment I can put at the end of those lines to satisfy the linter? https://github.com/python-discord/bot/actions/runs/3527700113
Can't you escape the backslash?
Also, you only need one backslash at the start of triple backticks (\``` is enough)
let's see
does it even work? shouldn't it be a raw string?
There are \n in the string
hmm right, so they'll need to be individually escaped
what version of poetry are people using? the latest apparently has a bug.
so I can't precommit 
1.3.2
I think
Had to uninstall 1.2 and then reinstall because poetry self update kept failing due to dependencies
yeah, I figured
so
I'm working on bot#2372 .
actually, nvm
lint test failed because expecting ctx.send
the test will need to be updated so that it expects ctx.reply instead
The error a the bottom lists the 3 tests that need to be updated
am i meant to do it
Yeah
@vale ibex I am not sure if you saw my comment on bot#2394 but can I be assigned it?
That was implemented and is working, the issue isnβt with netlify rate limits as it was before
Just GitHub deciding to rate limit GitHub
how do i change the lint-test?
i found the tests file but im not sure what u mean by change the lint-test
put in the same pr ?
Sure
You don't change the lint-test CI
the lint-test CI just runs our test suite
the test_snekbox is expecting a ctx.send
So you need to find the tests that failed, and update them so that they expect ctx.reply rather than ctx.send
but i changed it to ctx.reply
Yea, are you able to se what needs changing?
yea
i did that
Cool, if you run poetry run task test you will run the test suite locally
I have completed it just want to ask some questions, LinePaginator expects ctx, I changed it to accept both ctx and interaction but should I change the argument to something other than ctx like command_callback?
The union seems fine there
what about the argument name?
what does ctx get used for?
to send embed
is that all it gets used for?
and to get the author object
also if we change the argument name then if in some other file someone maybe had used it as a keyword argument, so thats also a problem
I'm tempted to say that we want to make a new paginator for buttons
maybe in bot-core
So that we can design the api to be nicer, rather than work around this
currently I have changed paginate to like this
tags work with reactions right?
tags?
yea bot#2394 is about tags
β’
Β» args-kwargs
Β» async-await
Β» blocking
Β» botvar
Β» class
Β» classmethod
Β» codeblock
Β» comparison
Β» contribute
Β» customchecks
Β» customcooldown
Β» customhelp
Β» dashmpip
Β» decorators
see
looks like the test is expecting the mention at the start of the message too
oh yea truee
you can run poetry run task retest to just retest the tests that failed in the last run fwiw
rather than having to run the whole suite again
I have implemented it this way is this fine?
That doesn't seem right to me, the command isn't to search for tags, it's to output a tag
the searching is done as part of the auto complete
!t search class
Β» class
Β» classmethod
Β» customhelp
Β» defaultdict
Β» docstring
Β» dunder-methods
Β» functions-are-objects
Β» global
Β» indent
Β» local-file
Β» mutability
Β» names
Β» repl
Β» scope
Β» self
!t search class, string
Β» classmethod
Β» defaultdict
Β» docstring
Β» dunder-methods
Β» mutability
commit and push
sir yes sir
ah didn't know that was even a thing, doesn't seem relevant now that we have autocomplete
so just remove it?
I think just /tag <name> and /tag list is enough
ok :)
/tag get <name> if slash comamnd don't support the other format
list is to list all the tags right?
Yea, that sends the paginated embed
but I think the search is to search for keywords in Tag()._content
and to output the matching TagIndentifier.name
actually that would be 3-4 times by me, I also used it in #bot-commands π
Fair enough, in that case I'm fine with it being removed rather than having to maintain it in this migration and anything in the future
okay :)
it was a sub-group for tags, so if tags is migrated then like it has no parent to be a sub-group
Btw you also need to remove the f-string here since there's no interpolation now (f"..." -> "...") https://github.com/python-discord/bot/pull/2402/files#diff-e975479f12117c5a4e47ea73510fee2ca3735c291c7969335fa8a7d25798ba54R475
yep
idk why the lint-test changes didnt show up for me
it's not a change to lint-test. lint-test is some CI we run in github to make sure flake8 tests etc pass on the code you changed
sorry not lint-test
the test folder on my fork
wasn't updated
but for u guys it is
oh right
so it should be removed or be migrated(already migrated, will undo if not this) or be commented out
which one?
ignore this one
Itβs just list and search?
Iβd vote for just removing them
ok i think thats everything now
run poetry run task precommit locally to install the pre commit hooks
that way the flake8 stuff will be picked up on your machine so you can fix them
confused
alright I am making a pr with removed search is that good? @vale ibex
what about silent mentions
that allows a highlighted message but without a notification
put it in the thread
how do I do this??
I saw this for the first time this morning, but I havenβt seen how yet
fr
i just spent the fast 3 minutes trying to figure that out π
Send message without ping and edit the ping in, should highlight the message without the notification
Yes but that doesnβt get me the icon
wut
How do?
lol
This is a experimental feat iirc
nope lol
So only some % of people have it
From what I see it is
ah, if you can't see the icon you need to update
But not available to everyone
it is
I can see it
I cant use it

put @silent at the beginning of your message
Right
How does this work then?
.
It just gets removed from the message?
yeah
What a peculiar feature
I expected no more of discord
Alright then sorry for the confusion!
thanks
that is quiet useful
you can just do it on random messages too 
Am mildly confused why this message still shows the @silent though
i put it in twice to show you how
If you dont mind me asking, where did you find this?

All I found was a single closed draft PR only listed the bit for the intents
Why not a toggle next to the existing reply-ping on/of?
another ~secret~ feature
bot#2403 the tests need a rewrite
discord.app_commands.Command doesn't has can_run like discord.ext.commands.Command
!d discord.app_commands.Command
class discord.app_commands.Command(*, name, description, callback, nsfw=False, parent=None, guild_ids=None, auto_locale_strings=True, extras=...)```
A class that implements an application command.
These are usually not created manually, instead they are created using one of the following decorators:
β’ [`command()`](https://discordpy.readthedocs.io/en/latest/interactions/api.html#discord.app_commands.command "discord.app_commands.command")
β’ [`Group.command`](https://discordpy.readthedocs.io/en/latest/interactions/api.html#discord.app_commands.Group.command "discord.app_commands.Group.command")
β’ [`CommandTree.command`](https://discordpy.readthedocs.io/en/latest/interactions/api.html#discord.app_commands.CommandTree.command "discord.app_commands.CommandTree.command")...
what to do about this? also I don't think the discord.app_commands.Command also has the attribute to invoke_without_command
anyways did a work around to test it and all tests did pass π , will commit
edit: committed
why did this fail https://github.com/python-discord/bot/actions/runs/4175467738/jobs/7230473262 ?? like why didn't the embed got sent in #dev-log?
@clever wraith
discord thing?
also @vale ibex I decided not to keep the search sub-group and made the pr, is that okay?
@fading galleon
Can you please try merging main into your branch ?
I think it's because the lint & test workflow you have is the one being used
& it's not passing required data
to the status_embed workflow
wait I merged my branch into main
yea I merged into my main branch
can you checkout to your branch main and do git log --oneline ?
Either that, or delete your local main branch
also did that
Okay
You need to sync your fork as well
With our repo
Pull, then merge main into your dev branch
yea did those
Only thing left is to push then π
Nice, now we wait
I don't see the workflow changes in the merge commit
https://github.com/python-discord/bot/pull/2403/commits/861f5b25a145dea9bfa8a94c360b0c463d24d1d7
literally the only thing that changed
I mean I am on sync with you guys (my fork repo)
Yeah I do see that
I mean it should show it in the diff if its different from whats on main right?
No it is there indeed
O wait
what is where?
Error: Discord webhook delivery failed! (status: 404; reason: Not Found)
Is the webhook there?
That's my guess
Webhook secret isn't there, so the URL is invalid
I think that's actually Discord's 404
so its a discord thingy?
But how can it not be there ? It should inherit from the actions secrets
It's a our fault thingy
We think at least
for context it sent the embed on my first commit #dev-log message
That's an old one
You're still failing linting https://github.com/python-discord/bot/actions/runs/4174089792/jobs/7227216477
Be sure to lint before committing. You can run poetry run task precommit in the bot directory to make it so linting will run when you try to commit and stop you if it fails
PS C:\Users\\python-discord\bot> python -m poetry run task precommit
pre-commit installed at .git\hooks\pre-commit
im doing just that
i did that before i did my last commit
pre commit will only raise issues with the things you're committing after you installed it
If you want to run the pre commit hooks against all your code, run poetry run task lint
which calls pre-commit run --all-files under the hood
Anyone know how to reverse engineer a dll file#
You need a decompiler for that
im aware but its protected with VMP
how can i contribute to making a tag?
wanna add !micropython
[MicroPython](https://micropython.org/) is a lean and efficient implementation of the Python 3 programming language that includes a small subset of the [Python standard library](https://docs.python.org/3/library/) and is optimised to run on microcontrollers and in constrained environments. MicroPython aims to be as compatible with normal Python as possible to allow you to transfer code with ease from the desktop to a microcontroller or embedded system.
is this fine?
if its not already there make an issue explaining why its needed and what will be its description, after that you basically make a md file in bot/resources/tags after the issue is approved
Thanks, can you help me write the description?
Make sure the issue goes on this repo https://GitHub.com/python-discord/meta
Thereβs a template with the required information
Itβll probably see some discussion and either get approved or rejected, then you can make a PR
someone made a tag back in 2022 and no response π
Yeah unfortunately we sometimes donβt get back to things in a time-appropriate manner, especially if there is not interest or force behind the tag
What that usually means however though is its not likely to get accepted at any rate since it doesnβt seem like anyone is really interested
ah okay, well i made the issue so if anyone would like to approve it, pls do π
Feel free to bump it in #community-meta if you like
Itβll get the right eyes on it there
stderr:
error: subprocess-exited-with-error
Preparing metadata (pyproject.toml) did not run successfully.
exit code: 1
[14 lines of output]
Traceback (most recent call last):
File "C:\Users\\.cache\pre-commit\repo3lagf2rx\py_env-python3\lib\site-packages\pip\_vendor\pep517\in_process\_in_process.py", line 351, in <module>
main()
File "C:\Users\\.cache\pre-commit\repo3lagf2rx\py_env-python3\lib\site-packages\pip\_vendor\pep517\in_process\_in_process.py", line 333, in main
json_out['return_val'] = hook(**hook_input['kwargs'])
File "C:\Users\\.cache\pre-commit\repo3lagf2rx\py_env-python3\lib\site-packages\pip\_vendor\pep517\in_process\_in_process.py", line 152, in prepare_metadata_for_build_wheel
return hook(metadata_directory, config_settings)
File "C:\Users\\AppData\Local\Temp\pip-build-env-mz_nja_m\overlay\Lib\site-packages\poetry\core\masonry\api.py", line 40, in prepare_metadata_for_build_wheel
poetry = Factory().create_poetry(Path(".").resolve(), with_groups=False)
File "C:\Users\\AppData\Local\Temp\pip-build-env-mz_nja_m\overlay\Lib\site-packages\poetry\core\factory.py", line 57, in create_poetry
raise RuntimeError("The Poetry configuration is invalid:\n" + message)
RuntimeError: The Poetry configuration is invalid:
- [extras.pipfile_deprecated_finder.2] 'pip-shims<=0.3.4' does not match '^[a-zA-Z-_.0-9]+$'
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed
Shall we bump the isort version in the pre-commit config ?
I think that fixed it for me
Yea, we should do that
@mellow hare hello, is bot#1849 still a wanted feature? If so, what work is actually left to do? It seems to just be filling this out (don't think site needs changing?) https://github.com/python-discord/bot/blob/main/bot/exts/moderation/infraction/infractions.py#L162-L171
bot/exts/moderation/infraction/infractions.py lines 162 to 171
@command(aliases=("vban",))
async def voiceban(self, ctx: Context) -> None:
"""
NOT IMPLEMENTED.
Permanently ban a user from joining voice channels.
If duration is specified, it temporarily voice bans that user for the given duration.
"""
await ctx.send(":x: This command is not yet implemented. Maybe you meant to use `βvoicemute`β?")```
Alright sir, coming right up !
sir-lancebot#1210
bot#2409
hey no one responded to this or maybe u have and i completely missed it
The fix from Bella just below was related
If you rebase into main it should be fixed
That doesn't look like the same error. It's telling you there's trailing whitespace
in my other commit it gave me the same error
You mean manually running the lint task gave you the above error or the larger actual error message you posted before?
ya
That wasn't a yes or no question, I was asking which one is happening
wait
fkin vs crashed 1 sec
let me run lint again
An unexpected error has occurred: CalledProcessError: command: ('C:\\Users\\\\.cache\\pre-commit\\repo3lagf2rx\\py_env-python3\\Scripts\\python.EXE', '-mpip', 'install', '.')
return code: 1
expected return code: 0
stdout:
Processing c:\users\\.cache\pre-commit\repo3lagf2rx
Installing build dependencies: started
poetry = Factory().create_poetry(Path(".").resolve(), with_groups=False)
File "C:\Users\\AppData\Local\Temp\pip-build-env-oihyfgie\overlay\Lib\site-packages\poetry\core\factory.py", line 57, in create_poetry
raise RuntimeError("The Poetry configuration is invalid:\n" + message)
RuntimeError: The Poetry configuration is invalid:
- [extras.pipfile_deprecated_finder.2] 'pip-shims<=0.3.4' does not match '^[a-zA-Z-_.0-9]+$'
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed
Encountered error while generating package metadata.
See above for output.
note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
Check the log at C:\Users\\.cache\pre-commit\pre-commit.log
different error on poetry run task lint
but same error on github
Hmmm, I'd need to boot up my laptop to take a look
Did you rebase into main?
yep
What does your pre commit config file look like?
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.5.0
hooks:
- id: check-merge-conflict
- id: check-toml
- id: check-yaml
args: [--unsafe] # Required due to custom constructors (e.g. !ENV)
- id: end-of-file-fixer
- id: trailing-whitespace
args: [--markdown-linebreak-ext=md]
- repo: https://github.com/pre-commit/pygrep-hooks
rev: v1.5.1
hooks:
- id: python-check-blanket-noqa
- repo: https://github.com/pycqa/isort
rev: 5.8.0
hooks:
- id: isort
name: isort (python)
- repo: local
hooks:
- id: flake8
name: Flake8
description: This hook runs flake8 within our project's environment.
entry: poetry run flake8
language: system
types: [python]
require_serial: true
The version of isort is still old
I C it
Did you update your fork before rebasing onto main?
i literally did wtf why didnt it update
ok now its updated
[INFO] Initializing environment for https://github.com/pycqa/isort.
[INFO] Installing environment for https://github.com/pycqa/isort.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
Check for merge conflicts................................................Passed
Check Toml...............................................................Passed
Check Yaml...............................................................Passed
Fix End of Files.........................................................Passed
Trim Trailing Whitespace.................................................Failed
- hook id: trailing-whitespace
- exit code: 1
- files were modified by this hook
Fixing tests/bot/exts/utils/test_snekbox.py
check blanket noqa.......................................................Passed
isort (python)...........................................................Passed
Flake8...................................................................Failed
- hook id: flake8
- exit code: 1
Executable `poetry` not found
is it because i changed the test file for snekbox?
No, this will be related to how you installed poetry
Did you install via pip, rather than the installer on their website?
yes
That'll be the cause for this imo
gotta install from there site?
Can i please be assigned to sir-lancebot#1179?
Check for merge conflicts................................................Passed
Check Toml...............................................................Passed
Check Yaml...............................................................Passed
Fix End of Files.........................................................Passed
Trim Trailing Whitespace.................................................Passed
check blanket noqa.......................................................Passed
isort (python)...........................................................Passed
Flake8...................................................................Passed
lets go π
now
what
Nice
?
i commit again>?
Did it fix the trailing whitespace?
yep
Then yea commit that change and push for it to appear in the PR
bot#2394 is about migrating completely !tags to slash command and removing it as a text command right?
There were some possible issues that mightβve prevented a full migration, but I believe that is the ultimate goal yeah
Wait you already know this lol
Just skip that sentence and read the βI believe yeahβ part π
yea lol, but I think it kinda hurts the helpers like you know someone asks hey how can I detect a pattern in a string, and the helper replies you use regex and like when they do the slash command for the regex it only shows them the message and not the one recieving the help
possible work around for this would be that the helper says to them to like run the command themself to know more about what is regex
it doesn't need to be ephemeral though, right?
yea it isn't
edit: didn't know what ephemeral meant here, but it was set False
I understood this issue to just be moving the invocation part of the command, not the behavior afterwards
It would indeed hurt usability quite a bit if only you saw it
wait is it possible to send a text message to an interaction command? The only way I think it is by building a context object from the data present in the interaction?
This is a hard question for me since I havenβt basically looked at discord.py since they did the interactions rewrite
I mean the API for sending text messages requires nothing more than a channel ID, surely you donβt need to reconstruct everything
its same for me too, I didn't used discord.py for a year and a half until now
yea maybe inheriting the interaction class, with just send method from context
Maybe, not sure you quite need to go that far
Looking at the docs, the interaction object has a .channel property which returns a channel object
That implements .send
oh, its good then
also context class has from_interaction
also I think by looking at the code intertaction.followup.send will also work
!d discord.InteractionResponse.send_message
await send_message(content=None, *, embed=..., embeds=..., file=..., files=..., view=..., tts=False, ephemeral=False, allowed_mentions=..., suppress_embeds=False, silent=False, delete_after=None)```
This function is a [*coroutine*](https://docs.python.org/3/library/asyncio-task.html#coroutine).
Responds to this interaction by sending a message.
if you want to respond to an interaction with a message
This can be found on the Interaction object under the response attr
The followup webhook is only used when you can't respond the the interaction within a resonable amount of time, so you do await interaction.response.defer() and then use the interaction.followup webhook to respond later
that sends a message only viewable to the invoker
only if you set ephemeral to true
ah
I saw it in the send method of the context, so you know I thought it can be used
Only the person invoking the command will be able to see the output
mhmm, earlier thought ephemeral meant something else
@fossil veldt the only issue I see left with your PR is the matter of txt files. You make a valid point that this could be a common use case for the feature, but at the same time our filtering rules should still apply. I'm wondering if we can create a compromise here, where txt/csv/json files will be uploaded to the pastebin instead, or displayed like the stdout is if it's the only file and there's no stdout.
Still having this issue with precommit. I tried solutions involving upgrading isort to 5.12, and that didn't solve it.
C:\Users\17032\development\pydis\bot(swfarnsworth-automated-markdown-messages -> origin)
(bot-py3.10) Ξ» git commit -m "Removed unused vars; add code-only line breaks for long strings; fix escapes for tickmarks."
[INFO] Installing environment for https://github.com/pycqa/isort.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
An unexpected error has occurred: CalledProcessError: command: ('C:\\Users\\17032\\.cache\\pre-commit\\repo3n7_gm9a\\py_env-python3\\Scripts\\python.EXE', '-mpip', 'install'
, '.')
return code: 1
expected return code: 0
stdout:
Processing c:\users\17032\.cache\pre-commit\repo3n7_gm9a
Installing build dependencies: started
Installing build dependencies: finished with status 'done'
Getting requirements to build wheel: started
Getting requirements to build wheel: finished with status 'done'
Preparing metadata (pyproject.toml): started
Preparing metadata (pyproject.toml): finished with status 'error'
stderr:
error: subprocess-exited-with-error
Preparing metadata (pyproject.toml) did not run successfully.
exit code: 1
[14 lines of output]
Traceback (most recent call last):
File "C:\Users\17032\.cache\pre-commit\repo3n7_gm9a\py_env-python3\lib\site-packages\pip\_vendor\pep517\in_process\_in_process.py", line 351, in <module>
main()
File "C:\Users\17032\.cache\pre-commit\repo3n7_gm9a\py_env-python3\lib\site-packages\pip\_vendor\pep517\in_process\_in_process.py", line 333, in main
json_out['return_val'] = hook(**hook_input['kwargs'])
File "C:\Users\17032\.cache\pre-commit\repo3n7_gm9a\py_env-python3\lib\site-packages\pip\_vendor\pep517\in_process\_in_process.py", line 152, in prepare_metadata_for
_build_wheel
return hook(metadata_directory, config_settings)
File "C:\Users\17032\AppData\Local\Temp\pip-build-env-jehxuyvg\overlay\Lib\site-packages\poetry\core\masonry\api.py", line 40, in prepare_metadata_for_build_wheel
poetry = Factory().create_poetry(Path(".").resolve(), with_groups=False)
File "C:\Users\17032\AppData\Local\Temp\pip-build-env-jehxuyvg\overlay\Lib\site-packages\poetry\core\factory.py", line 57, in create_poetry
raise RuntimeError("The Poetry configuration is invalid:\n" + message)
RuntimeError: The Poetry configuration is invalid:
- [extras.pipfile_deprecated_finder.2] 'pip-shims<=0.3.4' does not match '^[a-zA-Z-_.0-9]+$'
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed
Encountered error while generating package metadata.
See above for output.
note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
Check the log at C:\Users\17032\.cache\pre-commit\pre-commit.log
Have you rebased onto main? The fix should be on there
is that different from merging main into the feature branch?
not as far as this is concerned
do I just git rebase main or what
Yea that will update the commits on your branch to instead be based fromt he most recent commit on main
my PR was so old that the branches have diverged
so uh
RIP
conflicts are fun
I'll just redo it in a new branch, I guess
that feels really strange, demonstrate a txt file write just for it to be given as a pastebin result...?
isn't the main reason we disallow txt files that we encourage people to use pastebin instead?
but that doesn't seem to apply to the eval bot situation
The point here is to allow file-writing code and to preserve the file contents right? even if you don't actually get a file, the simulation seems successful in that case
well, normally the pastebin is a benefit because people upload large code chunks and it allows you to view them on mobile or something without downloading the file
We encourage people to use the pastebin because we disallow txt files. We don't want people to download files to keep track of a help session
I'm assuming most of the text file outputs will be short demos and the discord preview seems to be sufficient in this case
no previews on mobile
still feels a bit strange to have some file uploads turn into a pastebin link, instead of an actual file
Well, that's the compromise I could think of
It might not be the solution you envisioned, but it'll at least allow these file types
hm..
so like, a new pastebin for each file?
we could do a direct code block for text files under a certain character count perhaps?
that'll have the benefit of it being visible on mobile as well
@fossil veldt β Your 3.11 eval job has completed with return code 0.
test.txt
abcd
longer.txt
https://paste.pythondiscord.com/ayusawibej
could be an embed as well I suppose
yeah, I suggested above displaying a text file similarly to stdout if there's only one file and no stdout
it'd probably be more consistent to do it with every text file
we'd need to character limit the single output anyways (just like multiple)
like show our own code block for text files when under a character limit
even for multiple ones
@fossil veldt β Your 3.11 eval job has completed with return code 0.
test.txt
abc
test2.txt
xyz
It'd have to be a shared character/line limit
probably, yeah
looks like currently 10 lines or 1000 chars
hm, what do we do about decode errors
decode errors?
the file gets to us as bytes
if displaying inline, we have to decode utf-8
it may error
in that case would you be able to open it if it were a file?
either way, the decode function has an option for how to handle errors
we could use mode="ignore"
or use the default strict and list decode errors
currently we have to decode stdout as well but that's done in snekbox
!e
import sys
sys.stdout.buffer.write(bytes([240, 40, 140, 40]))
@fossil veldt :x: Your 3.11 eval job has failed.
UnicodeDecodeError: invalid Unicode in output pipe
how does snekbox handle errors?
just shows that in stdout instead ^
'replace' or 'backslashreplace' would probably work here I think
to not completely omit the character
we can go with that then
!e
print(bytes([240, 40, 140, 40]).decode("utf-8", "ignore"))
print(bytes([240, 40, 140, 40]).decode("utf-8", "replace"))
@fossil veldt :white_check_mark: Your 3.11 eval job has completed with return code 0.
001 | ((
002 | οΏ½(οΏ½(
maybe something like "the file is too big. The full contents of the file can be found here:" before the link
but also, the limit here seems to be for xyz.txt specifically, and not across all files
If I have 10 txt files with 9 lines each, that's a lot of lines
it's currently 10 lines / 1000 chars shared for all files
except files with 1 line and less than 50 chars which always get displayed inline
because that's literally less than the URL
with open('output/b.txt', 'w') as f:
f.write('[Empty]')
Mostly flake8. Some repositories are using black
can someone review
https://github.com/python-discord/bot/pull/2402
Would it be possible to remove/disable the button or change it's colour (to grey or something) after it is not possible to receive a bookmark anymore?
I think you can't change color per user that's making the interaction, since everyone sees that
But i might be mistaken
I think they meant removing the button once the interaction expires
Or changing it to the greyed out button
I'm thinking of removing that entirely
once sir-lancebot#1176 is merged it will be a context menu command, we can remove the text based command and have it not fill up the text channel at all
Speaking of @clever wraith could you rebase this branch onto main when you get a chance?
Done !
However, am I supposed to see all those commits ?
Yea that doesn't look right π
xD
looks like your fork's main doesn't match the main repo's main
https://github.com/shtlrs/sir-lancebot/tree/main says it's two commits ahead
could you run git remote -v
can you run git remote add upstream git@github.com:python-discord/sir-lancebot.git
this will add the main repo as an upstream, then you can reset your main to upstream main
git remote add upstream git@github.com:python-discord/sir-lancebot.git
git fetch -a
git checkout main
git reset --hard upstream/main
git push -f
You see how there's the same commit twice ?
Yea
With different hashes, ofc
I think that when I was bumping isort
I did commit to main by mistake
Then i forgot about it
I remember doing such a mistake
hah no worries
you can use the above commands to reset your fork's main to upstream's main
then you can checkout your branch and do git rebase main
fatal: ambiguous argument 'upstream/main': unknown revision or path not in the working tree.
It seems it doesn't recon what upstream/main is.
I tried fetching from upstream using git fetch upstream, but it says I can't read from remote repo
do you use ssh auth or https?
My command above used ssh, if you use https instead, you can run git remote set-url upstream https://github.com/python-discord/sir-lancebot.git
then git fetch -a
It's the one that PyCharm uses by default, not sure what it is
That didn't do it either
what does git remote -v say?
upstream for pydis, origin for my fork
what urls?
kk cool, does git fetch -a give an error?
Nope
what does git branch -a output?
huh
what about -r?
xD, it doesn't recognize that option
Is it the "refetch" one ?
no worries
Oh
Ok, now it's not letting me push. But ig because it's trying to push to upstream ?
So i'll need to change it back to origin
what's the error and what are you trying to push?
I rebased my branch onto main
did you do git push -f?
if you rebase you need to add -f for force
since the things you're pushing won't match the remote branch, you need to tell git you know what you're doing and push it anyway
ah yeah, to rewrite the history ?
Would that mean if you make a bookmark, no one would be able to add it as well like currently?
they would be able to add it by going into the context menu too
it would mean when someone bookmarks something, it won't post anything in chat, since it isn't needed anymore
I see
You can try it now if you'd like, it's just been deployed
Nice, it works nicely. Just that to not be able to bookmark content someone else might have just bookmarked can't be done anymore
sir-lancebot#1211
Was able to delete quite a lot of stuff
@timid sentinel bot#2403, I resolved your reviews and added mine can you check those?
I don't see any changes, have you pushed them?
oh, I was thinking of pushing it all together, I added these don't know why it didn't show up in the logs
by "added mine" I meant I added my reviews
You have to go to the top of the files changed page and click the green "Review changes" button
That allows you to submit your comments, an overall comment, and an overall decision (approve, request changes, or just add comments)
Till then your comments are only visible to you (hence the "pending")
oh, you know it gotta be a coincidence I found this https://github.com/community/community/discussions/10369 discussion on github mentioning what 'pending' actually meant as you messaged, anyways thanksπ
should i change all ping on commands to reply?
Nice
just like the way in !eval/!timeit
@vale ibex I made lancebot#1212 b4 you fixed it but if you want to merge just the typo fix that might be etter
I pushed my commit 12 seconds before you opened your PR
clearly you're too slow

I'll merge your's though, so it's not blocked
I forgot that all of our projects are Python 3.10+. I have a functional 3.10 build in my downloads folder but it's still not installed. I should probably go change that soon...
Anyway I'm looking at https://github.com/python-discord/site/blob/main/pydis_site/templates/home/timeline.html. I'm surprised that everything is just hard coded, but rewriting it to be YAML driven is probably overkill.
overengineered solution almost good to go
You wrote a parser for the existing HTML?
yes
What did you use for that table 

Are you going to be able to use it again after you change it?
Oh that's way shorter than I would have assumed
print("\n\n".join(reversed(entry_html_pieces)))
and boom, the timeline is reversed without needing to do it manually which is tedious and boring
did docker change their default output formatting? this looks new (and great!)
Reviews would be appreciated on this PR: https://github.com/python-discord/site/pull/879
This is from buildx which is the new builder. It's been around for a few years now and I think even stable for quite a while. Maybe you recently updated Docker and it finally switched to buildx by default.
By the way, you should docker compose without a dash so it uses the new version (2.x), but could be that the dashed command is an alias for the new version now
Please don't advertise here
wheres the source of the lancebot command that reacts to messages lile bot#1234 with an embed containing the link?
I thought the bot will ignore it because its enclosed in backticks :/, could be added as a feature though?
bot#2372 site#824
Will accept reviews in exchange for "
"
@timid sentinel 
here's yours, got lost in the mail
I also need some feedback on this https://github.com/python-discord/bot/pull/2403#discussion_r1111274268
@vocal prairie Do you still need changes done for bot#2388
I'm using docker-compose from PyPI. Docker comes with its own compose command now?
I think docker-compose always came with docker? But compose is now built into docker and its subcommand
I remember having to install it
yeah, and it's written in Go
docker-compose was written in python
Depending on how, when, and what host ypi are running, when you installed docker it may come bundled, if not you can install following this https://docs.docker.com/compose/install/
ye, compose v2
depending on your distro there should be a way to get the docker-compose shim for docker compose
if there's any issues you have with docker compose not working how docker-compose used to work, be sure to report them
its supposed to be a drop-in replacement
and so far I can vouch for that
well.... its not actually a drop in replacement, its actually less buggy
Woah, thanks!
hehe I am gonna give two
for reviewing my pr, although I have lost count for wookie, heres for you @clever wraith

also Bella, I didn't push the fixes because I was waiting for wookie to reply to my reviews as they were related to his reviews, so it kinda made sense to push it after the discussion
Ahahah, thank you!
Sure, but resolving a discussion should incline that we see the changes that have been agreed upon. Which is why I thought they weren't resolved
So better mark them as resolved once we see the concrete changes.
In any case, no worries π
How do i setup @stable mountain bot i keep getting a error
These two pages cover the setup and configuration, but what error are you having specifically?
https://www.pythondiscord.com/pages/guides/pydis-guides/contributing/
https://www.pythondiscord.com/pages/guides/pydis-guides/contributing/bot/
Wait lemme sent sc
@dim pelican
whats your directory structure also did you set up docker and poetry?
Im using replit and idk how to make docker and poetry
Do i need make like
import discord
from discord.ext import commands
?
A guide to setting up and configuring Bot.
after setting up docker and poetry do poetry run task start instead of running main.py
The bot will not work in repl.it, as it has dependencies on a few other projects too, such as having our site api runinng, postgres & redis
https://www.pythondiscord.com/pages/guides/pydis-guides/contributing/bot/ has information on how to get it running on your local machine
A guide to setting up and configuring Bot.
that's currently the only method of running that we support.
Will bot be on 24/7?
is your computer on 24/7?
Sometimes
if you are running the bot on your computer, then it will be live for as long as it's running on your computer
Alr thx for your support
bot#2394 I am asking again as of wookie's comment is it a full migration or are we keeping the command being invoked when using the tags directly i.e !code and just removing its invocation by !tags get code
yeah let's keep the direct usage
@fossil veldt maybe I'm missing something, doesn't one \n mean two lines?
I'll just add the comments to the PR
hm yeah that should be 1 \n
what did you mean with https://github.com/python-discord/bot/pull/2326#discussion_r1114850779 though? Like we should share the text file budget with stdout?
Yeah, the limit is on the entire message
I don't think 5 lines from stdout + 5 lines from text is too crazy, but then again I don't think it's common at all to use both stdout and text output
Well 5+5 is still within the limit
ah yeah it's 10
I guess it's just this then?
budget_lines = MAX_OUTPUT_BLOCK_LINES - (output.count("\n") + 1)
budget_chars = MAX_OUTPUT_BLOCK_CHARS - len(output)
Yeah seems right
Alright all the changes in the comments should have been pushed now
and thanks for the reviews π spotted a lot of stuff I wouldn't have
I'll do some final testing before approving, and then I'll let Mark decide whether he wants to take a final look since there were some changes since his approval
sure sounds good
I should maybe have added some tests for these text format stuff but
that just feels like more work down the road changing tests with format changes
don't really feel like those kind of hard coded tests with string formats do much
also wasn't sure what else to do about this test https://github.com/python-discord/bot/blob/snekbox-files/tests/bot/exts/utils/snekbox/test_io.py#L12-L13
tests/bot/exts/utils/snekbox/test_io.py lines 12 to 13
@skipIf(platform.system() == "Windows", "File names normalizer tests requires Unix-like OS.")
def test_normalize_file_name(self):```
looks like it'll forever have to be skipped on windows
both os and pathlib operate in special windows mode and strips illegal path chars for windows (that we need to account for since both bot and snekbox are unix)
!e
from pathlib import Path
print(Path("\\n"))
@fossil veldt :white_check_mark: Your 3.11 eval job has completed with return code 0.
\n
Of course
You've escaped the Unix
It doesn't? 
You can use a PosixPath on Windows as far as I know if you import it directly
!e
from pathlib import WindowsPath
print(WindowsPath("hi"))
@fossil veldt :x: Your 3.11 eval job has completed with return code 1.
001 | Traceback (most recent call last):
002 | File "<string>", line 3, in <module>
003 | File "/usr/local/lib/python3.11/pathlib.py", line 873, in __new__
004 | raise NotImplementedError("cannot instantiate %r on your system"
005 | NotImplementedError: cannot instantiate 'WindowsPath' on your system
same thing on windows for PosixPath
Oh yeah I was thinking of pure paths
hm
@outer oasis :white_check_mark: Your 3.11 eval job has completed with return code 0.
hi
checks out
what is different in a purepath 
Absolutely no idea
I saw this
You can't actually interact with the os I'm guessing
With a method
Like .rename
!eval
from pathlib import PureWindowsPath
print(PureWindowsPath("hi").rename)
@cold island :x: Your 3.11 eval job has completed with return code 1.
001 | Traceback (most recent call last):
002 | File "<string>", line 3, in <module>
003 | AttributeError: 'PureWindowsPath' object has no attribute 'rename'. Did you mean: 'name'?
Yeah
I guess that's what we should use instead 
I guess so
cool don't have to skip on windows now https://github.com/python-discord/bot/pull/2326/commits/d29e8c6c4240a5e9cb5293788529621ee919c0b7
@clever wraith I updated the pr, re-reivew please github only lets me request re-review from one person
I'll try to have a look this evening.
Thanks for putting it up!
Hmm I tried to run the bot with a custom snekbox image and it's giving me
ClientConnectorError: Cannot connect to host snekbox:8065 ssl:default [Temporary failure in name resolution]
π€
I remember running into this issue at one point with snekbox
oh right. I just didn't read the guide correctly
hmm how do I make snekbox include the third party packages. I tried to follow https://github.com/python-discord/snekbox#third-party-packages but it still doesn't recognize them
53,253
317,396
