#dev-contrib

1 messages · Page 80 of 1

vale ibex
#

cool, then run fetch and pull

short snow
#

Skip that step then

#

go to next

mossy wolf
#

gives me an already up to date

vale ibex
#

alright cool, is your json tag on a branch?

mossy wolf
#

yes

vale ibex
#

And you said you rebased that branch on top of master right?

mossy wolf
#

yes i rebased from github desktop (since i'm more of a gui person over command line)

short snow
#

They already rebased so it is uptop date

vale ibex
#

Do the flake8 errors say what file they're coming from?

short snow
#

Bot/bot.py

#

see their pr

mossy wolf
#

looking at exactly it is failing in bot.py, so a change i didn't make

short snow
mossy wolf
#

i'm almost tempted to just delete the branch atm and make a new one

vale ibex
#

I think that might be the easiest

mossy wolf
#

since it has become such a mess now

vale ibex
#

for some reason the PR diff has some lines that are already in master too

green oriole
#

git reset --hard <commit sha> to rollback to a certain commit

#

That is a destructive action though

short snow
#

Hence i said “cld” in that 😛

#

Well gtg guys, if someone is free have a look at the issue automatic link

mossy wolf
#

PR closed, branch deleted and fork gone

short snow
#

@gritty wind gentle reminder that i have mentioned your requested changes ( u didn’t reply to my earlier msg, so thought u didn’t see that)

mossy wolf
#

was getting a bit sick and tired of it with all those conflicting issues. So just backed up my work and restarted. And that worked so i'm happy now

#

the only thing that got lost was my local lint tester and i forgot how to install it :p

vale ibex
#

pipenv run precommit to setup the pre-commit hook

#

pipenv run pre-commit to then run it manually

#

you might need to do pipenv sync --dev first

vale ibex
#

FYI, my PR got merged into cheat.sh so it should work without overwriting the headers now 🙂

#

!e ```py
import aiohttp, asyncio

async def test():
async with aiohttp.ClientSession() as s:
async with s.get('https://cheat.sh/python/json') as response:
without_headers = await response.text()

    s.headers['User-Agent'] = 'curl/7.68.0'
    async with s.get('https://cheat.sh/python/json') as response:
        with_headers = await response.text()

print(without_headers == with_headers)

asyncio.get_event_loop().run_until_complete(test())

stable mountainBOT
#

@vale ibex :x: Your eval job has completed with return code 1.

001 | Traceback (most recent call last):
002 |   File "<string>", line 1, in <module>
003 | ModuleNotFoundError: No module named 'aiohttp'
green oriole
#

There is no networking

vale ibex
#

yea, that actually makes sense...

#

well, you can run it yourself and see that it spits out True now 🙂

vale ibex
#

.pr 554

dusky shoreBOT
vale ibex
#

What are people's thoughts on this? Is it something we want to do, or are we going to wait for smart config?

#

It should probably come with some updates to the contributing guide describing how to use docker

#

Although, the two aren't linked entirely. Since these changes wouldn't impact people who aren't using docker. Tt would just mean people who are using docker will need to create a .env file.

vocal wolf
#

@vale ibex I've never seen a smaller PR

vale ibex
#

😄

#

it's a theme of mine

vocal wolf
#

lol

short snow
#

@vale ibex mentioned the requested changes except the last one (since am not still convinced to use that)

#

on CheatSheet pr

vale ibex
#

The last one being about the line pagination?

short snow
#

yeah

vale ibex
#

yea, that's not something we can do atm, until its ported over from the other bot

#

So I've just closed that comment

short snow
#

ok, and dog status code comments also mentioned

vale ibex
#

Cool 👍 I'm heading off for bed now though, so I'll give them both a once over after work tomorrow 🙂

short snow
#

@vocal wolf requested changes mentioned in issue automatic link

#

valentines here!

short snow
#

my first pr gets merged ! lemon_hearteyes

vocal wolf
#

🎉

short snow
#

lets wait for the bot to restart

#

Hey folks, can you please check bot#13 and metricity#1 and snekbox#11

vocal wolf
#

noice

tawdry vapor
#

Does this exclude private repos?

short snow
#

yeah

#

it gets public pydis repos

#

since it is getting the repo_list through the github api

tawdry vapor
#

Very cool

#

More convenient than the command

short snow
#

ak's idea

patent pivot
#

oh wew that was quickly implemented

#

nice work

short snow
short snow
sullen phoenix
#

nicely done

vale ibex
#

looking through the code base, only this and AoC seem to be effected

patent pivot
#

the user was on cooldown, that's why we were sad

vale ibex
#

ahhh

patent pivot
#

we figured out that discord.py could reliably fetch that data even without the member intent

short snow
patent pivot
#

ah

#

hm

#

ah yeah didn't see that

#

hmmmmmmmmmmm

short snow
#

that's cuz of it ig

gritty wind
#

Can you int e the role

vale ibex
#

yea, there are a few places in the valentines cog where this is happening

#

eg

#

.love @vale ibex

patent pivot
vale ibex
#

Would have raised a IndexError

#
staff = ctx.guild.get_role(Roles.helpers).members
whom = random.choice(staff)
rapid swallow
short snow
#

no, it is happening for every request

#

my guess is intents

rapid swallow
#

There are no users avilable to whome your valentine can be sent.

short snow
#

but many ppl have the lovefest role

#

send it to me @rapid swallow (.bemyvalentine)

#

i have lovefest

rapid swallow
#

I'm on a cooldown right now

short snow
#

ah

eternal owl
#

the command should not go into a cooldown if the user makes any input mistakes

#

and might think about lowering the cooldown

rapid swallow
#

yeah, the cooldown should be reverted on UserInputError or something

eternal owl
#

I english was quite bad when I was writing that feature 2 years ago lemon_sweat

rapid swallow
#

ahh lol

gritty wind
#

whome is sort of valid

short snow
#

Hey, can anyone have a look at the following, since i won't be able to commit to them after 4th due to exams:
sir-lancebot#571 , sir-lancebot#572

short snow
#

hmm bug

#

lets try again

#

sir-lancebot#571 , sir-lancebot#572

short snow
#

hmmm

cold island
#

, sir-lancebot#571 , sir-lancebot#572

cold island
#

It obviously shouldn't work that way, but as a temp workaround 😄 @short snow

short snow
#

hmm, lets see why this happens

gritty wind
#

!e

import re
print(re.findall(".+?(test)", "test"))
print(re.findall(".+?(test)", "something test"))
stable mountainBOT
#

@gritty wind :white_check_mark: Your eval job has completed with return code 0.

001 | []
002 | ['test']
short snow
#

oh wait bot has re

gritty wind
#

hmm

#

try moving bot to the end

#

And why are we matching .+?

short snow
#

we don't that's just the other text, we take the groups

#

#bot-commands message hmm

gritty wind
#

Wdym?

#

fr".+?({self.repo_regex})#(\d+)"
Why do we have .+? here

#

Anyways, you can move sir-lance first, since bot is a substring of it

#

it'll try to match it first, before matching the shorter bot substring

short snow
#

"(meta|sir-lancebot|bot})#(\d+)"gm this works

gritty wind
#

Also waaaay fewer steps lol

short snow
#

english please.

gritty wind
#

down to 500 from 25000

gritty wind
#

The actual replied message also had that which is why it got 0 matches

#

(And can you PR the fix)

short snow
#

re.findall(fr".+?({self.repo_regex})#(\d+)", message.content) the actual one doesn't have that

#

it was just a typo of the f-strings

#

#bot-commands message this works tho

green oriole
#

Hello @clever wraith, we are an english speaking server, so please try to speak english to the best of your abilities

short snow
#

sir-lancebot#571 , sir-lancebot#572

short snow
#

hmm

#

it works with code but not this

green oriole
#

Oh, we merged it

short snow
#

yeah, and i jsut found this bug

gritty wind
#

The code does match it <#bot-commands message>

short snow
#

#bot-commands message regex is being weird

gritty wind
#

I'm not sure why it only does that in that instance

short snow
#

both cases, bot comes first

gritty wind
#

Alright I think it matches the way it does because of the lazy operator

#

At least, removing it made it match correctly

#

(The operator and operand)

#

Which channels is it enabled in?

green oriole
gritty wind
#

can we get it in bot channels too 😛

green oriole
#

Time to make a master commit

gritty wind
#

Anyways I'm pushing the updated regex to master if no one has concerns
fr"({self.repo_regex})#(\d+)"

#

lol yeah

#

Did we remove the notifications from sir-lancebot when it reconnects?

#

bot#320

#

Or did it just not restart yet

short snow
#

no, it does

#

wait for sometime

gritty wind
#

Ah actions

short snow
#

and here it comes.

gritty wind
#

bot#320

#

Cool

short snow
#

Hey, can anyone have a look at the following, since i won't be able to commit to them after 4th due to exams:
sir-lancebot#571 , sir-lancebot#572

balmy vortex
#

hey guys

short snow
#

cool

balmy vortex
#

i wanna some one to help me

#

i have some small problem

short snow
balmy vortex
#

oh sure

gritty wind
#

Is it related to the pydis projects?

short snow
#
+ if game in self.games:        
   self.games.remove(game)
gritty wind
#

Its not that game might not be in list, game might not be defined at all

#

!e

def test():
  raise ValueError()
try:
  game = test()
except:
  print(game)
stable mountainBOT
#

@gritty wind :x: Your eval job has completed with return code 1.

001 | Traceback (most recent call last):
002 |   File "<string>", line 4, in <module>
003 |   File "<string>", line 2, in test
004 | ValueError
005 | 
006 | During handling of the above exception, another exception occurred:
007 | 
008 | Traceback (most recent call last):
009 |   File "<string>", line 6, in <module>
010 | NameError: name 'game' is not defined
short snow
#

ah ok

gritty wind
#

You can give game a placeholder value outside the try block

#

Good job on keeping up with all the changes though, I think I'm good with the current iteration

short snow
#

#bot-commands message will add this?

#

game = None

gritty wind
#

yup

short snow
#

@gritty wind done.

short snow
#

another review needed for c4, if anyone is free 😄

short snow
#

.love command is always taking laudmo.

timid sentinel
#

was thinking it could be an intents problem?

subtle kraken
#

looks like intents issue yeah

short snow
#

intents.member should be True?

subtle kraken
#

I don't think single command warrants adding intents

#

especially if that command is not necessary for the bot to work

patent pivot
#

yeah

short snow
#

(well it is not a single command, the count command also needs them)

subtle kraken
#

still doesn't sound reasonable

#

intents shouldn't be enabled unless core/important features need them

patent pivot
#

yeah

short snow
#

ok

patent pivot
#

the memory & cpu usage of sir lancebot after removing those intents brings me great joy

timid sentinel
#

What do you think the best way to get around that would be, I guess we can just require two users as an input?

cold moon
#

Maybe we should use lovefest role for random member?

short snow
#

i can't think of any other way

#

that would cuz the same issue

hardy gorge
#

why do we support a random member?

#

It was fun, but if we're going to replace it with a constant, there's no real point in it

#

Just have a command that always needs two members to calculate their love score

sharp timber
#

An idea would be the member that sent the last message

short snow
#

that would be good (for ves)

sharp timber
#

or perhaps random choice from last 50 messages?

short snow
#

also whoever does that change, also correct the typos in it

sharp timber
#

Depending on message cache

timid sentinel
#

I think it should have to be a helper or user with the lovefest role, so I'm not sure about random choice/user who sent the last message. I think a command that requires two members is probably the best option

surreal venture
#

How do we review a pull request? (As in the technical details, not the guide) Do I need to do it from the pythondiscord/repo or the author's fork?

surreal venture
#

Okay, so do I need to clone the main repository or do I need to do it directly from github.com?

#

Also, how could I do it from Pycharm (Professional)?

short snow
#

open your clone project , and then go prs tab on left hand column

#

and then open the pr u wanna see

#

and then u can do it

surreal venture
#

Okay, and how can I test the code?

short snow
#

gh pr checkout <pr number>

#

then try it pipenv run start

#

this is what i do

surreal venture
#

gh is the Github CLI?

short snow
#

another way

short snow
surreal venture
#

Could I like create a branch and clone the code to that branch and run it from there?

short snow
#

idts

#

just clone your own fork, and everything should be good

#

this @surreal venture

surreal venture
short snow
#

no, your own clone

#

your fork

#

and just use gh cli to checkout a pr on that

surreal venture
#

okay thank

short snow
#

for testing

surreal venture
#

s

short snow
#

np!

surreal venture
#

Also, is there an easier way to update your fork other than creating a reverse pull request?

short snow
#

this is what i do

#

(only on main)

#

(and i commit on feature/<name>)

surreal venture
#

Do you mean upstream/master? Is main the same as master?

#

Also what does git reset do?

#

Nevermind I got it

mossy wolf
#

for bot#1393 can someone quickly do a sanity check that in terms of grammar and sentence structure it makes sense? i sometimes have a habbit of writing a messy sentence from time to time

green oriole
#

Hey @trim cradle, can you please have a look?

trim cradle
#

!remind 3h look at issue

stable mountainBOT
#
ROGER THAT

Your reminder will arrive in 3 hours!

green oriole
#

At the wording of the tag, yep

trim cradle
#

I'm trying to figure out the internet situation in my room. Hopefully I'll have it sorted out by then.

green oriole
#

Thanks!

trim cradle
#

If not I will cry btw.

green oriole
#

don’t do it lemon_sentimental

mossy wolf
#

for a full review i'll just wait but i know from experience i sometimes make a mess when writing sentences so just a small second look from someone else that nothing is wrong lol

vale ibex
#

how would I go about checking out a PR to test it?

#

I tried git fetch upstream pull/571 as an example but didn't have any luck

#

ahhh I got it

#

git fetch upstream pull/571/head:dogsh && git checkout dogsh

tawdry vapor
#

Add this as an alias to your gitconfig

#
cpr = "!cd ${GIT_PREFIX:-.} && git fetch origin refs/pull/${1}/head && git checkout FETCH_HEAD #"
vale ibex
#

so then it would be git cpr 571?

#

yea, that's worked 🙂 Thanks for the tip

trim cradle
#

@green oriole @mossy wolf done!

#

!remind cancel 1379

stable mountainBOT
#
Can do!

That reminder has been deleted successfully!

green oriole
#

Thank you!

sullen phoenix
#

then you'd be able to do gh pr checkout <pr number>

vale ibex
#

I'll give it a look

tawdry vapor
#

What advantage does that have

mossy wolf
mossy wolf
#

i think you were looking at an outdated file :p

trim cradle
mossy wolf
#

that should apply it to the latest one

trim cradle
mossy wolf
#

yup that's the latest version

#

i'll see from the comments you made which one apply to the current one

#

and see if i can resolve those

green oriole
#

That’s about it

tawdry vapor
#

In exchange for an extra dependency 🤔

green oriole
#

You can push too, not sure if it works with the ref thing

trim cradle
#

@mossy wolf it might be easier to rethink what's being communicated: as I understand it, the error that this is meant to help you debug is that your json file contains absolutely nothing, but it needs to at least have the literal characters {} so that it represents a json object (which is also, in a sense, "nothing"), yes?

mossy wolf
#

the intention indeed is to debug this common error when someone created a new .json file and forgot to give it a valid "structure"

#

for instance, using the very common object {}, even tho it doesn't contain data just yet at least the brackets are needed

green oriole
#

which is also, in a sense, "nothing"
Not really, it will return an empty dictionary. You could have used an empty list too.

#

But I’m being picky

trim cradle
green oriole
#

Hmmm

trim cradle
#

We have to be terse with tag messages or people won't read them, so I don't think we should attempt to teach any json-specific terminology unless we absolutely have to.

mossy wolf
#

pushed a slight wording update to indicate clearly that the .json file itself cannot be empty, but the json data can

#

waiting for the lint test to run

trim cradle
#

`JSONDecodeError: Expecting value: line 1 column 1 (char 0)`

This means that your `.json` *file* is completely empty, but it still needs to represent some kind of data, even if it's an empty container.

To solve the error, simply change the file to read `{}`. This will save an empty "object", which is very similar to what a dict is in Python.
#

What about that?

#

@green oriole @mossy wolf ^

green oriole
#

I’d use dictionary on the last sentence, but it seems pretty good to me

mossy wolf
#

made a few commits it's this now

When creating a new JSON file you might run into the following error.

`JSONDecodeError: Expecting value: line 1 column 1 (char 0)`

In short, this means that your JSON is invalid in its current state. This could very well happen because the file is just new and completely empty.
Whilst the JSON data, the data you wish to store,  may be empty, the .json file must not. You most likely want to use one of the following data types in your .json file:
green oriole
#

I haven’t looked at the proposal though

mossy wolf
#

this implies you must always make an object

#

i guess my tag suggestion might go a bit too much into technical details but yeah json is complex lol

trim cradle
mossy wolf
#

sure yes, it's about having a normalised way to help with a common error

#

but i have a feeling this simplifies it just too much, unless that's fine for a tag here

trim cradle
#

@mossy wolf is there an article that explains this topic in sufficient depth? You could link it at the end of the message.

mossy wolf
#

not that i know off right away

#

otherwise i'm fine with making 2 tags, one being !empty_json with just a very simple brief solution, and that links to a !json_advanced one or something similar that goes a bit more into the technical side of things

#

i can see if i can find something online for it tho, so give me a second

trim cradle
mossy wolf
#

can you quickly see if you think this will explain json data types well enough?

trim cradle
mossy wolf
#

well this tag tries to solve an invalid json, the error appears from python but yeah

gritty wind
#

You can do it on your fork, or main, or whatever

vocal wolf
#

sir-lancebot#569

dusky shoreBOT
vocal wolf
#

If anyone has a bunch of time, a review on this PR would be greatly appreciated.

vocal wolf
#

alright let's go lmao

vocal wolf
green oriole
#

Sweeet

vale ibex
#

😀

mossy wolf
#

and the bot didn't break? it still works? :p

vale ibex
#

!remind 1000000000000000000000y [REDACTED MESSAGE]

stable mountainBOT
#
Bad argument

1000000000000000000000y results in a datetime outside the supported range.

#
Command Help

!remind [mentions]... <expiration> <content>
Can also use: reminder, reminders, remindme

Commands for managing your reminders.

Subcommands:

!remind delete <id_>
Delete one of your active reminders.
!remind edit
Commands for modifying your current reminders.
!remind list
View a paginated embed of all reminders for your user.
!remind new [mentions]... <expiration> <content>
Set yourself a simple reminder.

mossy wolf
#

good

vale ibex
short snow
#

to set help channels should i use a category check or help channels check (one by one)

#

and is there a category check deco ?

gritty wind
#

What are you working on?

short snow
gritty wind
#

And what do you need the channels for?

short snow
#

the help in use channels

gritty wind
#

Right, probably want to check category then

short snow
#

ok, is there one?

#

or i would need to make one deco

gritty wind
#

Not a built in one, no

vale ibex
#

Heh i put that there just as a comment, forgetting that commands won't work in there

short snow
#

no, i was talking about utils.deco scaleios

gritty wind
#

Yeah, don't have one in there either

#

We don't really do channel checks on most sir-lancebot features

#

its usually only season checks, and sir-lancebot channel

short snow
#

ok, i should make one?

gritty wind
#

It isn't that simple

#

The bot has an overall check

#

You'd instead have to do an override

#

and pass it the channel list

vale ibex
#

yea, it uses contants.WHITELISTED_CHANNELS, which determine what channels it can be used in

#

I'd say ignore my comment about it being useful in help channels for now 😄

short snow
#

hmm, what do others think on that?

gritty wind
#

I haven't vetted the docs, other than my initial look months ago

#

I think I'd personally still recommend something like the python docs, or a more tutor based resource, so I don't know how helpful it would be

short snow
#

hmmm

#

so shld i leave it or add it?

gritty wind
#

If you have time for it, go for it

#

The help category is already in the constants file, no?

short snow
#

nope

#

only 5 of them

gritty wind
#

hmm right that's the old static system

#

If you want to do it:

  1. remove the help channels that are still there
  2. add a new category class
  3. add the category ID
short snow
#

yeah am doing that, is there a way to get all channels out of category id in dpy?

gritty wind
#

You'd have to get the category object and iterate over the channels

#

I'm trying to check our rate-limits for that right now

#

but it should be one fetch per command

#

On second thought, that'd be pretty easy to abuse

short snow
#

like?

gritty wind
#

The check runs as the first thing when you invoke the command

#

If you send it a bunch of times in a channel that forces it to do the check

#

you can make a bunch of api hits

#

and get us rate limited

#

You'd have to add a cooldown to make it feasible

short snow
#

ok

tawdry vapor
#

Why do you need all channels in the category?

gritty wind
#

The channels are dynamic, and he wants to add the channels to the whitelist

#

Actually I see a flaw in that reasoning lol

tawdry vapor
#

Why not whitelist by the category id?

short snow
gritty wind
#

One thing I can think of doing

#

is to allow it in all channels

tawdry vapor
#

I don't understand

gritty wind
#

and add a separate check

#

The in_channel_override expects a list of channels?

short snow
#

yeah

#

(override_in_channel)

#

can anyone have a look at sir-lancebot#571 , sir-lancebot#560

short snow
#

@gritty wind can i do a over-ride of all channels and then check for it using if else in the function

#

since i don't see any way of doing tthat in the __init__

gritty wind
#

Yeah, the link I sent does an all channel override

#

You can also override just using the everyone role for simplicity

short snow
#

yeah i did that

#

what is the id of ti?

gritty wind
#

267624335836053506

#

You can replace the developer role in the constant file

#

I think it was renamed to something like everone_role in the bot's constants

#

let me check

#

Yeah

short snow
#

@vocal wolf @vale ibex mentioned the changes 😄

gritty wind
#

I can't give a full review, but I've commented on the things we discussed

gritty wind
#

Awesome, thanks

short snow
#

@eternal owl what do u put in the reddit client id?

short snow
gritty wind
#

Probably the API outage

#

Is this failing now?

short snow
#

yep

gritty wind
#

Give it another shot when the API is back in full force, and let us know if it still fails

short snow
#

weird, the emojis (reddit_ work on webhook but not normal pagination

#

(i don't have them on the server)

gritty wind
eternal owl
#

still having issues @short snow ?

short snow
eternal owl
#

you need the trash can icon id also

#

change it in constants

short snow
#

ok pagination still doesn't work

eternal owl
#

what error

short snow
#
discord.errors.HTTPException: 400 Bad Request (error code: 10014): Unknown Emoji
``` (for trash emoji)
eternal owl
#

yes

short snow
#

for pagination on help works

eternal owl
#

go to constants,

#

search for trash_can in Emojis dataclass

#

and replace it with the one in your server

short snow
#

how would that matter, the .help pagination works, but not in .reddit top

eternal owl
#

cuz you are geting the error

short snow
#

in both cases i get this error

#

lemme still try one minue

eternal owl
short snow
#

can u give the trash can logo image?

short snow
#

ok, give me a minute

#

ok it works now, but each post has two pages for itself

eternal owl
#

huh

short snow
#

hmm, can u join the test server, would be easier to explain

eternal owl
#

okay

short snow
#

i will send invite

eternal owl
#

k

static arrow
#

hi

clever wraith
#

hello!

late wolf
#

In our internal eval command, what is this part doing

    try:
        with contextlib.redirect_stdout(self.stdout):
{0}
        if '_' in locals():
            if inspect.isawaitable(_):
                _ = await _
            return _
```?
green oriole
#

Uuhhh

#

That's a good question

#

Hmm

#

Is it because the last line result will be stored in _?

gritty wind
#

Does it just run async input

#

I honestly don’t know why you’re asking, didn’t you see

#

Ignore this code, it works

#

🙃

short snow
#

who is ikuyarihS on discord?

green oriole
#

Shirayuki haha

short snow
#

@gusty sonnet Can u check out sir-lancebot#560 as u were the original reviewer. thanks

dusky shoreBOT
green oriole
#

I am not sure if they will be able to review it, I haven't seen them in a while

late wolf
short snow
#

probably ping whoever did it

late wolf
#

@cold moon do you have any idea? (iirc you were a code owner of that file)

cold moon
#

Context?

late wolf
cold moon
#

Not sure. I'm code owner, but I haven't never worked on eval.

green oriole
#

!source int e

stable mountainBOT
#
Command: internal eval

Run eval in a REPL-like format.

Source Code
short snow
#

joe seems to have done it

green oriole
#

That’s an oooooooollld code

short snow
#

lets ping him

#

@patent pivot 🏓

timid sentinel
#

"Automatically awaits awaitables if they are the return value"

#

I'd assume it just does that

#

So i guess you can do something like !int e ctx.send("hello") and it will work

late wolf
#

ooo

subtle kraken
#

isn't _ just last statement/expression

late wolf
brazen charm
#

The command itself adds _ = in front of expressions to return them when it sees one, the function returns (and awaits) that and then the code formatter works with that result

late wolf
#

😕

#

I didn't get what you are saying

short snow
#

ah got it

timid sentinel
short snow
#

so this will give 64?

!int e 8*8
``` and

!int e ctx.send(_)

green oriole
#

I think the former will work, not sure about the latter

timid sentinel
#

I think they both should work

short snow
#

can u try?

late wolf
#

its admins+

green oriole
#

Is _ saved anywhere?

#

and yeah, we can’t run it

subtle kraken
#

it is in the command itself

patent pivot
#

Why am I being pinged

late wolf
#

about internal command

subtle kraken
#

int eval things

short snow
#

can u try that joe

subtle kraken
#

supposedly you are aware of what those sacred texts mean

patent pivot
#

still no more clued in on what

#

you are on about

late wolf
#

Why not just make it like this.
f'async def func():\n{textwrap.indent(body, " ")}'

patent pivot
#

!int e 8*8

stable mountainBOT
#
In [1]: 8*8
Out[1]: 64```
patent pivot
#

!int e ctx.send(_)

stable mountainBOT
#
In [2]: ctx.send(_)
Out[2]: 
  File "/bot/bot/exts/utils/internal.py", line 178, in _eval
    res = await func()
  File "<string>", line 5, in func
UnboundLocalError: local variable '_' referenced before assignment```
patent pivot
#

lol

green oriole
#

Hmm

patent pivot
#

I didn't write that

green oriole
#

I guess it is used as a placeholder for printing the result

timid sentinel
#

ah makes sense

late wolf
#

hmmmmm

short snow
#
8*8
await ctx.send(_)
#

do this

timid sentinel
#

because the env is passed in as globals

subtle kraken
#

that will also error out

timid sentinel
patent pivot
#

!int e ```py
8*8
await ctx.send(_)

stable mountainBOT
#
In [3]: 8*8
   ...: await ctx.send(_)
   ...: 
Out[3]: 
  File "/bot/bot/exts/utils/internal.py", line 178, in _eval
    res = await func()
  File "<string>", line 6, in func
UnboundLocalError: local variable '_' referenced before assignment```
patent pivot
#

lol

timid sentinel
#

if you want to play around with it setting up a test server is probably your best bet

subtle kraken
#

I think that use of _ will only work in ipython

patent pivot
#

^

late wolf
#

We can store that value in env and then we wouldn't need to have any thing in code_, just the defining the function part

patent pivot
#

it works in python repl

#

but

subtle kraken
#

I don't really think its any worth changing it

#

it works as is

patent pivot
#

int e is not a repl

green oriole
#

hello @spring ermine, are the one who created !int e? We are pretty clueless about how it actually works, could you please enlight us?

patent pivot
#
>>> 10
10
>>> _
10
#

lol I don't think we are clueless

timid sentinel
#

I mean, I think it makes sense

brazen charm
#

int e just uses exec, the _ is created manually as was shown above

patent pivot
#

yeah

late wolf
#

I get that, but we could move _ to env and just have the function definition part in code_

brazen charm
#

The cog is a bit of a mess but I don't think there's a need to change what worked so far

late wolf
#

k

patent pivot
#

yeah

green oriole
#

We will have a better eval command with rattlesnake anyway

patent pivot
#

black knight

late wolf
#

rattlesnake?

surreal venture
#

rattlesnake?

patent pivot
#

closed source internal bot

green oriole
late wolf
#

right.
@subtle kraken if I do work on internal eval for sir lancelot, i would like to change that.
Is that fine?

green oriole
#

The int e part might be indirectly open source since we will probably copy it to other bots haha

subtle kraken
#

I would rather not

#

it works fine as is

timid sentinel
#

I'm not sure what your proposal for changing it is

subtle kraken
#

I'd say current solution is better than just moving it around

timid sentinel
#

That bit needs to be executed in the function, so it can return the expression if necessary

subtle kraken
#

we also should keep things consistent between bots

late wolf
#

hmm, k

patent pivot
#

!int e ```py
ctx.send("hi")

stable mountainBOT
#
In [4]: ctx.send("hi")```
patent pivot
#

yeah

#

hm

late wolf
timid sentinel
#

oh so it doesn't work anyway lol

late wolf
#

and we can have only the function definition in code_

subtle kraken
#

I can imagine there are reasons as to why our eval is not that simple

patent pivot
#

!int e ```py
_ = ctx.send("hi")

stable mountainBOT
#

hi

#
In [5]: ctx.send("hi")
Out[5]: <Message id=806160940046745631 channel=<TextChannel id=635950537262759947 name='dev-contrib' position=68 nsfw=False news=False category_id=411199786025484308> type=<MessageType.default: 0> author=<Member id=409107086526644234 name='Python' discriminator='4329' bot=True nick=None guild=<Guild id=267624335836053506 name='Python' shard_id=None chunked=True member_count=141801>> flags=<MessageFlags value=0>>```
patent pivot
#

yea

green oriole
#

I’d rather have a carbon copy of the code in @stable mountain, it will make things easier when updating

late wolf
#

k

brazen charm
#

The codeblock with higlighting probably messes with the regex

timid sentinel
#

Ah so it doesn't realise it's an expression you think?

#

I was wondering what the easiest way to PR a tag to the bot is, can I do it entirely through github?

green oriole
#

Yeah, you can

#

It is probably easier tbh

short snow
#

yeah that's the easiest, github has a nice markdown editor

timid sentinel
#

ah cool, thanks

patent pivot
#

Why am I being pinged

green oriole
#

Did you get pinged?

short snow
#

eh? u didn't

#

after the first one

subtle kraken
#

joe lagging out again

surreal venture
#

@short snow What's the everyone_role?

#

Because I can't run .cht:

short snow
#

ah, it is @everyone

surreal venture
short snow
#

put yoru own eveeryone role on it

#

your server's

surreal venture
#

Ah okay

#

So do I change it in constants.py?

short snow
#

yep

#

and also change the help_in_use category

surreal venture
#

okay thanks

#

sure

spring ermine
patent pivot
#

eval

spring ermine
#

oh right that one

#

I think I did contribute to that, yeah

green oriole
#

This PR bot#3

dusky shoreBOT
green oriole
#

You said in the PR that it is from another bot, is it open source?

spring ermine
#

been a while since I wrote that, what's the question?

#

it was my old bot which was closed source, and I think I might've even lost it

hardy gorge
#

I could go through it with you @green oriole

#

It's not that difficult, but I wrote a different version of it for Black Knight

green oriole
#

Alright, we were wondering about a few bits and pieces, but I thiiink we figured it out, at least mostly

hardy gorge
#

There are some parts in the current eval that are not used

#

Probably remnants of development

#

Like the interactive interpreter instance

green oriole
#

How close are you from completing the new eval btw?

hardy gorge
#

It's finished

green oriole
#

We got rid ld the interactive interpreter btw

hardy gorge
#

It works in Black Knight and has worked for a few months now

late wolf
spring ermine
#

Basically it just does py async def func(): # (None,) -> Any try: with contextlib.redirect_stdout(self.stdout): {0} if '_' in locals(): if inspect.isawaitable(_): _ = await _ return _ finally: self.env.update(locals()) where {0} is your code, it execs that code in a scope so we have this new func() in a dict, then we just await func() from the cog

green oriole
#

oh cool, do you think we can add that to @stable mountain ?

hardy gorge
#

We could, yeah

short snow
#

is the black knight on the server yet ?

spring ermine
#

the _ is to await expressions more easily in case someone forgets

green oriole
#

I don’t think we have an instance running yet

late wolf
hardy gorge
#

The thing it does differently is make sure to generate actual stack traces, because the current eval sometimes gives a stack trace to the cog

green oriole
hardy gorge
#

instead of the code that you're evalling that's actually giving you the error

late wolf
#

Hey @hardy gorge could you share it?

spring ermine
#

I mean if there were issues with it you could've asked me to change things lol, would probably have been less effort

hardy gorge
#

I changed the approach somewhat

#

I now analyses the code beforehand with AST and inserts it using AST

spring ermine
#

I see

hardy gorge
#

instead of the string formatting

spring ermine
#

isn't that a fair bit slower though?

#

or I guess it could be fairly simple now that I think about it

green oriole
#

We don’t use int e fairly often, so if the startup time is a bit slower, I don’t think it much of an issue

short snow
#

i c, but why is there a need of AST?

late wolf
#

what is AST?

short snow
#

tree syntax ig

late wolf
#

huh

spring ermine
green oriole
#

With the current code when having a syntax error, it sometimes points to some code from the template

#

Oh nice

short snow
#

#bot-commands message

spring ermine
#

or wait

#

now that I look at that code it looks like I may have missed something maybe?

#

wait nvm I forgot how ast.PyCF_ALLOW_TOP_LEVEL_AWAIT worked

#

I could actually make an even simpler version now that I know how to do bytecode, but that's too hacky even for me

green oriole
#

but that's too hacky even for me
lemon_grimace

spring ermine
hardy gorge
# short snow i c, but why is there a need of AST?

AST is used mainly for two things:

  • Ensuring that the tracebacks always correctly identify the problem within the snippet to be evalled (instead of a syntaxerror causing a stack trace to the cog)
  • Capturing the value of the last expression if it's not an assignment or call that already generates output, even if it's not a single expression/single statement eval.

There's also slightly better separation between the "default environment" and the "local environment" that caries over between different evals within the same session using ChainMap.

short snow
#

ah thankyou so much, it is clear now!

hardy gorge
#

It also has some things that are now already implemented for @stable mountain as well (the bot did not handle long output graciously before, but now it uses the upload method, Black Knight also has that).

late wolf
#

i didn't get any of that, but @hardy gorge is the code sharable?

hardy gorge
#

It will probably be shared in the future, but I'm working at the moment

#

bit busy

late wolf
#

ok

short snow
hardy gorge
#

This was not yet added to @stable mountain

short snow
#

it is gonna be added right?

royal creek
#

hi.. been hosting snekbox here, anyways to expose the container to the internet? as in.. use requests module on evals?

green oriole
#

You’ll have to modify the nsjail config, I don’t know if they are any easy way to do that (Cc @tawdry vapor)

royal creek
#

oh.. will see.

also

&eval

from requests import post
r = post("http://127.0.0.1:8060/eval", data={"input", "print('test')"})
print(r.response)

how does it even escape the ports even the interpreter is exposed to? the above code errors out

green oriole
#

Well, our setup will block network access

royal creek
#

even tho the interpreter sends data thro that port?

cold moon
#

Why this block network access?

hardy gorge
# royal creek oh.. will see. also &eval ```py from requests import post r = post("http://12...

Say that you have two PCs, one with an internet connection and one without an internet connection. There's only a special USB cable between them that allows them to communicate only text. The PC with internet connection receives the Python code from the internet, but does not run it. Rather, it just takes the code (which is just text) and sends it over the text-only USB connection to the other PC that runs the code.

The code that's being executed does not have access to the internet, since the PC it runs on does not have internet access. The PC just runs the code and captures the output (text). It then sends the text output back to the first PC with internet access over the text-only USB connection. This PC with a connection now sends the result over the internet.

This is an enormous simplification, but you could visualise snekbox this way: The outer snekbox API, with an internet connection, receives the code and passes it as text to an interpreter that's "walled off" inside of NSJail. Inside of this "jail", no connection to the internet can be made, so the code is just run and the output stored as text. Then, the text is returned out of the jail to the outer Snekbox process (which does have a connection), which sends back the code to the client.

#

In short: The ports are not escaped; the code is executed within an environment that should have no outside access to anything at all.

royal creek
#

ohhh, a box inside a box , that cleared up stuff ty

mossy wolf
#

afaik that's how a lot of interactive websites do it now. They have a jailed environment that has access to the database, then 1 outside connection to another environment that communicates and at most runs a few checks to check if the input is valid but doesn't execute anything

#

it's just 1 jailed environment blocked off from the internet and it gets inputs relayed through a limited local connection to a relay environment

#

@royal creek

#

but sebastiaan's explanation probably is more extensive and well written in simple language

#

(it still feels odd when i need to mention their name as it's almost the same as my name lol)

royal creek
#

haha..

late wolf
#

The bot is talking unusually long to get eval responses

green oriole
#

Our infrastructure isn’t going fine-ish right now

#

It should be back soon

foggy crater
#

hi, i'm trying my first open source contribution on a simple issue in the python bot and i'm having trouble getting the bot on my machine locally, i'd be happy if someone could help me cuz im kinda lost

gritty wind
#

What have you done so far?

foggy crater
gritty wind
#

That's a good start

foggy crater
#

there are many docker stuff here i have no idea what to do with that

#

never used docker in my life

gritty wind
#

Are you familiar with what docker is in general?

#

(You don't have to be)

foggy crater
#

not really

cold island
#

Are you following the contribution guide?

foggy crater
#

i'm a beginner, all i know is some C/C++ and Python

gritty wind
#

Simply put, it helps run code without having to install things on your system

#

(At least that's what we use it for)

#

all you need to know is if you have docker installed, just type docker-compose up -d to start the bot

#

If you don't, its simplest to get it installed

foggy crater
gritty wind
#

Which part is that?

foggy crater
#

with the .env configuration

gritty wind
#

You can leave those empty if you aren't working on things with reddit

foggy crater
#

oh ok

#

so i need to install docker now?

#

cause it says in the guide that you don't need to

gritty wind
#

The alternative is a lot more complex

#

It involves cloning another repo, running it on your system, and playing around with configuration

#

We recommend docker because it simplifies all that down to 1 step

foggy crater
#

ye you've convinced me

gritty wind
#

Though I'd be happy to guide you through it if you still want the alternative

foggy crater
#

i think it would be good for me to learn docker too

gritty wind
#

You seem to be on windows?

foggy crater
#

yeah

gritty wind
#

Alright, all you'd need to install for docker is

#

(Check the note about system requirements in that link)

foggy crater
#

ok, it's downloading

foggy crater
#

i finished downloading and running docker (and i ran the docker-compose command), what next

gritty wind
#

Well, if you've done everything correctly, the bot should now be running

#

Do you have the docker desktop application open?

foggy crater
#

yes

#

i think i have an error though

gritty wind
#

That does happen, feel free to post it

foggy crater
gritty wind
#

Yeah the bot itself is down

#

Can you click on it to get the logs

foggy crater
gritty wind
#

What did you put in your env file?

#

Make sure not to share BOT_TOKEN

foggy crater
#

maybe because of the reddit stuff?

#

how can i try running it again?

gritty wind
#

it pops up if you hover over it

foggy crater
#

still got an error

gritty wind
#

Is it the same error?

foggy crater
#

this is my .env

gritty wind
#

Some of these aren't correct for the @stable mountain bot?

foggy crater
gritty wind
#

For example sesonalbot is for @dusky shore

#
BOT_TOKEN=YourDiscordBotTokenHere
BOT_API_KEY=badbot13m0n8f570f942013fc818f234916ca531```
foggy crater
#

pretty sure i followed the instructions

gritty wind
#

Where do you see seasonal bot on the page?

foggy crater
#

so i only change the first line?

#

of the thing u sent

gritty wind
#

Yeah the second one is already correct

foggy crater
#

okok

gritty wind
# foggy crater

If you don't mind, could you share where you saw these though?

#

Oh I think I see what you were looking at

#

Those were just examples, the ones you need to set are on the main page

foggy crater
#

yes it was the environment variables page

gritty wind
#

If you follow the link, SEASONALBOT_DEBUG=True and CHANNEL_ANNOUNCEMENTS=12345 are only examples

#

they don't apply to the bot

gritty wind
foggy crater
#

ok thank you

#

i love the open source community already ❤️

#

i am still getting the same error though 😕

gritty wind
#

Can you try running docker-compose up again

foggy crater
#

docker-compose up -d or docker-compose up?

gritty wind
#

-d just stops it from logging things to your console

#

since you are using the docker app, it's probably easier

foggy crater
#

same error

#

i will paste the whole error here

stable mountainBOT
#

Hey @foggy crater!

Uh-oh! It looks like your message got zapped by our spam filter. We currently don't allow .txt attachments, so here are some tips to help you travel safely:

• If you attempted to send a message longer than 2000 characters, try shortening your message to fit within the character limit or use a pasting service (see below)

• If you tried to show someone your code, you can use codeblocks
(run !code-blocks in #bot-commands for more information) or use a pasting service like:

https://paste.pythondiscord.com

foggy crater
foggy crater
gritty wind
#

What do you have in your env file right now?

foggy crater
gritty wind
#

It should be fine

brazen charm
#

Did you configure the hosts in your config file?

foggy crater
gritty wind
#

It shouldn't have to be set for docker

brazen charm
#

The defaults are for deployment I believe, docker only needs web:8000 etc. right?

gritty wind
#

Yeah, but the redis connection error is strange

foggy crater
gritty wind
#

Usually I would recommend not bothering with it and using fakeredis

#

One thing I can think of

#

can you add REDIS_PASSWORD= to your env file and run docker-compose up -d --build bot

brazen charm
# foggy crater not sure what that is

I believe it is somewhere in the guide, in the config.yml file you created from config-default.yml you'll either need to set the redis host or set use_fakeredis to true, then you'll also need to configure the site url and schema

foggy crater
gritty wind
#

No, just leave it empty

foggy crater
#

ok

gritty wind
#

(Also fwiw, that's redis not reddit. redis is a sort of database thing, but you can learn about that when you have time)

foggy crater
#

i still have the same error

gritty wind
#

Can you share your env file again?

foggy crater
#

yes

gritty wind
#

And did you run the command with --build?

foggy crater
#

i coppied the command you sent and pasted it in the terminal

gritty wind
#

Hmm that's strange. I had managed to recreate the issue, and adding the password var solved it

#

I'll look into it later, but for now you can set USE_FAKEREDIS to true in your config file

foggy crater
#

maybe its in one of the warnings?

gritty wind
#

No those should be fine

#

They are related to the reddit commands, and shouldn't affect startup

foggy crater
#

ok i have progress!

gritty wind
#

Different error, or did it start?

foggy crater
#

different error

#

one sec

gritty wind
#

uhh let me check

#

Yeah that's the one

#

what's the error?

foggy crater
gritty wind
#

Strange

#

do you have any spaces, or any extra characters around the token?

foggy crater
#

no

gritty wind
#

Ok, can you go to the docker app, and click on bot

#

If you look in the area with the logs, you should see an Inspect button

foggy crater
#

uhu

gritty wind
foggy crater
#

yeah, im in the inspect

gritty wind
#

That should have a list of Environment variables, what do you see in there?

#

Be careful because your token could be there in plain text

gritty wind
#

Does the bot token match what you have in the env file?

foggy crater
#

yeah

gritty wind
#

Ok, I'm not too sure. Never had anyone run into that before lol

#

Can you regenerate the token and copy it again

foggy crater
#

yes

#

still same error

#

and the tokens are matching

#

maybe i should restart my pc?

gritty wind
#

Oh wait

#

No my bad

#

This isn't a discord api error

#

its a site api error lol

#

Do you have any changes to your config file, other than the FAKEREDIS one?

#

(Also can you check that BOT_API_KEY matches)

foggy crater
#

it was false and i turned it into true

gritty wind
#

Ok, that's fine

foggy crater
#

imma go to sleep now, thanks so much for the help @gritty wind

gritty wind
#

Whenever you have time, feel free to check in and we'll try to get it solved

#

FWIW, sorry that you have to jump through so many hoops, we are working on making things easier

foggy crater
#

it's ok, every mistake means learning lessons for the future

#

i can't wait to start contributing

short snow
#

sir-lancebot#560 , sir-lancebot#571. sir-lancebot#572 are up for review, one review pending for each, if anyone would like to have a quick look at them 🙂

short snow
#

@timid sentinel I just saw you online, i put a comment on your tag, incase u haven't seen that

timid sentinel
#

yep yep, just seen, replying now

vocal wolf
#

@timid sentinel f0kin beautiful m8

timid sentinel
#

yaaay

#

Although don't think I didn't notice this, now I see how you value my contributions lemon_sentimental

short snow
#

lmaooo

#

@vocal wolf lemon_enraged

vocal wolf
green oriole
#

Smh I’m sure you did this because wookie opened the pr

vocal wolf
#

lmfao

short snow
#

lol

green oriole
#

Bullying other mods

vocal wolf
#

Wookie is a wonderful person and I very respect them

short snow
#

really?

vocal wolf
#

Because we had a really good conversation a really long time ago

short snow
#

#bot-commands message ayyyy

#

lovely

green oriole
#

you better say that wookie is a nice person

timid sentinel
vocal wolf
#

Yep, back in the stone ages of me helping people

#

The one dpy conversation that started it all

timid sentinel
#

makes me feel old (here), because I feel like you've been mod for ages, and I was a mod before you were a helper

#

but anyway, this isn't the compliments and talking about the past channel smh, we're quite off topic lol

vocal wolf
#

lmao

green oriole
#

Haha

short snow
#

WEE WOO WEE WOO IT'S A DUPE OF #150

#

lol

#

i can finish of the left of prs on sir-lancebot if needed xith.

subtle kraken
#

xith stole that from me fwiw smh

short snow
#

lol, and was that yours, or stolen?

subtle kraken
#

I said I will close it for being a dupe

#

we are currently talking about many issues to close resolved ones, outdated ones etc

short snow
#

addes it to github replies

#

is sir-lancebot#312 still up for a grab?

dusky shoreBOT
green oriole
#

Will ask

short snow
#

since eso challenges have went down

green oriole
#

Yeah, nope

short snow
#

sir-lancebot#213 show be closed by sir-lancebot#350

green oriole
short snow
#

regarding the prideanthems issue

#

they had a lis of songs

#

if they could just post it on the issue, it could a bit easier for the next one

green oriole
#

Hello @granite goblet, would you please have the song list for the pride anthem command?

#

Hmm

#

Ah, they left

short snow
#

ah ok

#

is there some site or place where i could find these anthems?

#

pydis-api where did this project come from?

#

ves' status

green oriole
#

@hardy gorge is probably working on separating the API from our site

patent pivot
#

yeah

short snow
#

oh

#

so to set up pydis-site, we would need to set up the api too?

patent pivot
#

no, the site doesn't depend onn the API

short snow
#

and for the text based adventure game, can i take the story from repl.it talks? there many nice interesting stories on that

short snow
patent pivot
#

the idea is:

  • site (after dewikification) will become our content application, it won't have a databae at all
  • api will be a separate django application (separate project, not another app inside) that handles only db interaction
#

the bot will speak to the api

short snow
#

so do we need to set the api to work out with the bot?

#

that was my question

green oriole
#

We will need the API, yes, but not the site

patent pivot
#

yes

hardy gorge
#

I'm not working on our project; misleading name

#

I'm doing a personal project to learn FastAPI by migrating it to FastAPI

patent pivot
#

lul

green oriole
#

Haha

short snow
green oriole
#

Gotta write one :P

short snow
#

🥺

#

my story writing skills ain't good

green oriole
#

But that’s part of the challenge

#

You can pair with someone else too

short snow
#

would some sort of among us game be counted in that?

#

i will make it first and then show, would be better to understnad

brazen charm
hardy gorge
#

I've request a review from myself

short snow
#

and user name as the username also

late wolf
#

Who is GhostOfGoes?

brazen charm
gritty wind
short snow
#

Ah ok

short snow
#

@vocal wolf mentioned the requested changes, and replied to your comment on cht.sh

vocal wolf
#

Thanks

short snow
#

Doesn't dog status codes have two approvals?

cold island
#

link?

short snow
vocal wolf
#

I guess it does

short snow
#

then press the the super power button

vocal wolf
#

I already have

short snow
#

lemon_hearteyes , i was slow

#

Well, is that ok? using the everyone role to over-ride that channels?

vocal wolf
#

I saw the comment, I'll reply fully at a later time, must look at stuff and things within bot to confirm if it's good or not

short snow
#

ok

#

there was no category check, hence i did that

gritty wind
#

Need some help formatting a long list of imports from one file

#
from file import x, y, z

With everything on one line, I pass the line limit.

from file import (
  x,
  y,
  z
)

I believe this is the typical structure we'd follow in such cases, and that works, but there are ~10 imports, and I don't think they deserve ten lines.

from file import (
  x, y, z
)

This doesn't surpass line length, would it be fine?

#

Alternatively, I could use import file and go down that route, but I first want to see what people think before I start restructuring everything

green oriole
#

I don’t mind any of those solutions, do what feels the best IMO

somber acorn
#

Hi

#

@brazen charm are you a dev?

brazen charm
#

If you're splitting it up I'd personally prefer the style in the second codeblock as it can always be collapsed in most editors if the amount of lines is a problem. But depending on what the module and imported names are, doing the import normally (maybe with an alias to a shorter name) may be the best solution

short snow
#

if the are mannny, then u can use something like the third one, with 2-3 in one line

#

otherwise i had say 2nd

gritty wind
#

I don't think the third one works unless you do them all in one line

#

Because if you are already going to be doing multiple lines, might as well commit

short snow
#

he is gonna get irritated of pings soon lol

#

we need to either remove it or fix it fast

green oriole
#

I mean, they have the role

#

If you don’t want pings, you should remove the role

gritty wind
#

... we should still get that bug report filed 👀

short snow
#

a high priority one

green oriole
#

!remind 4h Work!

stable mountainBOT
#
ROGER THAT

Your reminder will arrive in 4 hours!

green oriole
#

!remind delete 1397

stable mountainBOT
#
Alright.

That reminder has been deleted successfully!

green oriole
#

Nevermind

#

Haha