#dev-contrib

1 messages Β· Page 134 of 1

green oriole
#

I was about to send a PR mmLul

patent pivot
#

lol

green oriole
#

lol, okay

patent pivot
#

i was going to add a worker

green oriole
viscid coral
#

I don't know where to ask, but kind of two things:

  1. Is there a guide on how to contribute the bot? I mean there is a guide on how to run it, but is there a github guide on how to open a PR, make the changes and submit? I think there was a github learning camp here, but not sure if this topic was there.
  2. If I want to "practice" on making a PR and submitting, how can I? I tried to make a a repo of my-self but it says I can't fork the repo becaus I already own this repo...
green oriole
#

@patent pivot is

User-agent: *
Allow: /
Disallow: /admin
```correct?
#

I don't know much about robots.txt files

patent pivot
#

might need a trailing slash on the admin path

brazen charm
#

Does that apply to subdomains or are they treated separately (e.g. paste)?

green oriole
#

That won't apply to subdomain, plus paste is an independent service

dim pelican
# viscid coral I don't know where to ask, but kind of two things: 1) Is there a guide on how to...

For the first one there is the setup and config guide for Sir-Lancebot, Bot and Site that is linked here: https://pythondiscord.com/pages/guides/pydis-guides/contributing/

For the second one, I think it is kind of a trial by fire. I definitely learned by doing breaking things for my first Issue / PR / linking a branch of a remote

green oriole
#

I guess if we want to give them a robots file we should use a worker

sleek steppe
green oriole
#

@patent pivot OK worker sounds actually better, we could have our policy in a KV for each service, you can assign workers to as many paths as you want

#

So we can have a single worker serving @/robots.txt, paste./robots.txt,api./robots.txt, etc..

viscid coral
dusky shoreBOT
dim pelican
viscid coral
#

Do I have to do that?

#

Can't I just change @in_month(Month.DECEMBER) to @in_month(Month.NOVEMBER, Month.DECEMBER)

dim pelican
#

From the main repo? Not directly.

viscid coral
#

I mean to fork the repo, change it in my forked repo, and than making a PR

dim pelican
#

Then yes

thorny obsidian
#

In general, the process for contributions is:

  1. fork the repo
  2. make a branch on your forked repo
  3. make the changes on that branch and push back to github
  4. create a PR asking to merge the branch on your fork into main
dim pelican
#

Branches are good

viscid coral
dim pelican
#

Keep main updated with main, make new branches for new features or changes

viscid coral
#

I know how to create a PR

thorny obsidian
viscid coral
dim pelican
#

You should select this

#

Then select your forked repo and branch

viscid coral
#

Ok let me try it

stable mountainBOT
#

bot/exts/holidays/hanukkah/hanukkah_embed.py line 41

@commands.command(name="hanukkah", aliases=("chanukah",))```
dim pelican
#

Add it to the possible aliases, seems like a good idea

viscid coral
#

Ok πŸ‘

vale ibex
#

@green oriole mmTriggered

green oriole
#

Oh naw!

vale ibex
#

Do we need to add another ?: there too

#

so that the new brackets are non-capturing

dim pelican
#

Sure, is that on your fork or the python-discord

viscid coral
thorny obsidian
#

yup! that's the correct button

dim pelican
#

That is good, click the button

viscid coral
#

And now compare across forks button?

dim pelican
#

Nope, it is already correctly comparing across forks

#

Since it has your fork and branch in the comparison

viscid coral
#

Oh it did the job for me cool

#

So I just create the PR right? Just one more thing, I didn't read the templates comments because I have no idea where that is

dim pelican
#

You are currently filling out the PR template, just make sure you read the comments and have added the relevant info

#

These things:

Relevant Issues

<!--
It is mandatory to link to an issue that has been approved by a Core Developer, indicated by an "approved" label.
Issues can be skipped with explicit core dev approval, but you have to link the discussion.
-->

<!-- Link the issue by typing: "Closes #<number>" (Closes #0 to close issue 0 for example). -->

Description

<!-- Describe what changes you made, and how you've implemented them. -->

viscid coral
#

It was approved right?

dim pelican
#

Technically not yet, but maybe kat or Xith can add the label

#

It is approved though, you have wookie and kat Ok with it

viscid coral
#

So I'll leve the approve part blank

dim pelican
#

Go for it

green oriole
viscid coral
#

sir-lancebot#864

dusky shoreBOT
green oriole
#

Is it the wrong way around

#

!e

import re
print(re.match(r"(?:(a)b)c", "abc").groups())
stable mountainBOT
#

@green oriole :white_check_mark: Your eval job has completed with return code 0.

('a',)
green oriole
#

So we do need another ?:

vale ibex
#

it depends how we extract the actual invite code from the groups

#

if we do something like .group(1), then if we add a new matching group, then it would pull that new one instead of the code

#

Since we've added a capturing group around [\.,]|dot then that will be then first group

green oriole
#

I honestly hope that's not how we do it lol

vale ibex
#

iirc the api requires just the code, so I think that's how we'd need to do it

#

but I haven't looked at the impl myself

#

All of the other groups in the regex are marked as non-capturing too

#

except for the code group

green oriole
stable mountainBOT
#

.github/CODEOWNERS line 24

bot/utils/regex.py                      @Akarys42```
green oriole
#

lol

molten perch
#

Hey! May I ask what's the situation of api#16 ?

viscid coral
#

Can anyone please review sir-lancebot#864?

dusky shoreBOT
viscid coral
#

Am I suppoed to be able using it?

patent pivot
#

i think that decorator means staff member OR bot commands

viscid coral
#

Oh ok

sleek steppe
#

Can you provide more context?

viscid coral
#

Maybe something wrong with bot.api_client for you?

sleek steppe
#

Is this you running the bot locally?

sleek steppe
#

Is metricity and the site configured?

dim pelican
dusky shoreBOT
green oriole
#

What's the context?

#

Ah, you don't have metricity setup

#

Uhhhh

brisk brook
#

Have you fetched and updated your fork though?

#

No need then

#

Did you simply clone the project?

#

Through Git, or did you only download a zip (I actually don't know if you get the git history with that)

#

Have you pulled since then?

#

You may not have the fix

#

Then you need to pull the changes, what happened was that it was fixed but the bot you're running does not have those fixes

#

Yes

#

should be, rebuild the docker image first

brisk brook
#

When you do git log what's the output you get at the top?

#

Ah good, that means you should have that change

#

Did you do the docker-compose down and then docker-compose up stuff?

#

Ah, that won't rebuild the Docker image, which I believe was necessary for the change you're looking for (because it changed some stuff about the Docker image)

dim pelican
#

docker-compose down
docker-compose up or docker-compose up --build

vale ibex
#

you'll need to delete the site image

#

docker-compose up --build doesn't re-pull site:latest

#

if there is one local

#

at least not all the time, I think there's some cache rule that determines when to do so

#

If you do docker-compose down, that will remove the containers

#

If you open docker desktop and goto the images tab, you can delete the site image there

#

it'll be site_web iirc

#

πŸ‘

tough imp
#

there is docker-compose pull to get latest images

#

or just deleting the one you have works ye

viscid coral
#

I am hosting @stable mountain locally using docker. How can I get the latest commit from github and update my bot?

#

Yeah I forked the project, and downloaded it to my computer

#

Oh I just realized I could just navigate to the dir and do git clone right?

tough imp
#

you should be able to just git pull

viscid coral
#

Me bad with git

tough imp
#

then restart the app

#

it shouldn't require a rebuild; the code is mounted as a volume into the container

#

unless there are dep changes or something

brisk brook
tough imp
#

yeah of course

dim pelican
brisk brook
#

My biggest worry is how big WTFPython examples get

dim pelican
#

Right? There are some entries that are quite long

viscid coral
#

Anyone mind looking at sir-lancebot#864 ? It's really small issue I know

dusky shoreBOT
patent pivot
patent pivot
#

let the discord preview wrap them

viscid coral
dim pelican
viscid coral
patent pivot
patent pivot
#

is it 1 example per item or multiple?

dim pelican
#

hmmmm interesting. I would imagine one file per example

patent pivot
#

so that probably works alright

#

we didn't want to enable for users but for the bot it seems solid

viscid coral
patent pivot
#

@clever wraith what's with that PR?

#

not a huge fan of "shit code" and a no-body PR with no assigned issue

dim pelican
brazen charm
#

What's an union with noreturn even supposed to mean

patent pivot
#

give me a ping if you give it a try

patent pivot
tough imp
#

sometimes it never returns anything 😌

patent pivot
#

I don't think you typehint for that though

dim pelican
brisk brook
patent pivot
#

typehinting implies all success cases right?

#

yeah

brisk brook
#

NoReturn is for like an infinite loop

tough imp
#

noreturn is only for situations where you never return

patent pivot
brisk brook
#

It would be annoying to add for all cases where you may raise an error

brazen charm
#

With exceptions that can be raised anywhere, it's definitely not applicable

patent pivot
#

yeah

tough imp
#

it's specifically documented as never returning

patent pivot
#

yeah

#

okay so not a thing that needs to change

#

well, can wait to hear from author but otherwise I'll drop a comment and close, it should have been raised here or had an issue opened

#

closed

viscid coral
#

bot#1818

dusky shoreBOT
patent pivot
#

yeah that one

gritty wind
#

Were these changes auto gened πŸ‘€

green oriole
#

The only places NoReturn makes sense imo are exit functions

viscid coral
#

Anyone want to review a PR real quick? bot#864

dusky shoreBOT
viscid coral
#

Not that

#

sir-lancebot#864

dusky shoreBOT
viscid coral
#

That

#

lol

dim pelican
#

You want a core dev, like wookie, xith, akarys

viscid coral
thorny obsidian
#

So. Trying to setup Python bot to test some stuff. I'm getting an error on the Python News cog where it's failing to send a message to the webhook. For some reason it's failing there and I'm not sure why.

vale ibex
#

Is your test server setup as a community server?

#

you can't publish messages to announce channels if they're not

thorny obsidian
#

...where does it tell me to do that?

vale ibex
#

uhhhh, probably doesn't, since that is newer than the docs

#

I ran into in on the test server and just turned it on

#

Are the messages still sending to the channel, but still erroring?

thorny obsidian
#

This is how I feel about using our current contributing guides:

dim pelican
#

I sense a site issue about to be opened

vale ibex
#

lol yup

thorny obsidian
#

Like, the contributing guide just focuses on the wrong stuff.

green oriole
#

Why not use the staff server?

thorny obsidian
#

Because I want to have control over my own testing?

#

I'm allowed to use my testing server.

green oriole
#

Yes, you are, I am just wondering why

thorny obsidian
brisk brook
viscid coral
#

What is a News cog? Where is it located?

thorny obsidian
#

python_news.py

#

under exts/info

viscid coral
#

Oh thanks

green oriole
#

Message is none, huh

thorny obsidian
green oriole
#

It makes so little sense

#

!source News

stable mountainBOT
#
Bad argument

Unable to convert 'News' to valid command, tag, or Cog.

#
Command Help

!source [source_item]
Can also use: src

Display information and a GitHub link to the source code of a command, tag, or cog.

green oriole
#

U suck

thorny obsidian
#

I think it's erroring out on sending the webhook, but not like... actually raising an error so it's propagating the None throughout the code where it assumes the webhook object or whatever has been returned. But I can't find anything helpful about setting up the webhooks in our contributing guide

green oriole
#

Did you get an exception log?

vale ibex
#

is the channel marked as an announement channel?

green oriole
#

Seems like our utility to send webhook will return none if it runs into an error which is silly

thorny obsidian
#

yup

vale ibex
#

oh wait, it's saying msg.channel is None

#

that's odd

#

oh no, msg is None

#

where is msg getting set?

green oriole
#

Did you not set up a webhook?

thorny obsidian
#

this is where it's failing, I just have no insight into why:

vale ibex
#

hmmm, that's failing for some reason

thorny obsidian
green oriole
#

Look at the except branch of the definition of send_webhook

#

And did you slap the webhook ID in the config?

thorny obsidian
#

Yup. The webhook ID is for the same channel as the python news and it's an announcements channel.

viscid coral
stable mountainBOT
#

config-default.yml line 306

python_news:        &PYNEWS_WEBHOOK 704381182279942324```
thorny obsidian
#

Yup. Triple checked the webhook ID as well.

patent pivot
#

hmmmmmmm

#

this isn't something you'd typically document in contribution guidelines, it's into the weeds

thorny obsidian
patent pivot
#

you'd either:
a) have the code handle for it, print a warning
b) have the program catch the exception and rewrite it to tell you what is wrong

#

yeah

green oriole
#

I think I know

patent pivot
#

either way, we should handle for it in code as well

green oriole
#

It is stupid

#

Is

python_news:
    channel: *PYNEWS_CHANNEL
    webhook: *PYNEWS_WEBHOOK
 ```in your config.yaml file?
#

Or is it only in the default config

thorny obsidian
#

It's in my config.yml because my config.yml is a copy of the default-config.yml with values changed, per the contribution guidelines.

green oriole
#

Welp

viscid coral
#

Maybe try to mess with the code an print the error of why it doesn't send

green oriole
#

Does the bot have admin perms?

thorny obsidian
green oriole
#

I am clueless

#

Do you not see some form of exception logging in the logs

thorny obsidian
#

Nope. That's all I got. That error traceback

vale ibex
#

Could you add a log.info(self.webhook) before line 118

#

unless you're running bot locally, then debugger would be nice πŸ˜„

tough imp
#

the send_webhook should be logging the exc though, no?

#

it makes an exception log in the except block

viscid coral
vale ibex
#

yea, which is weird since it's not raising

vale ibex
viscid coral
#

Oh

thorny obsidian
#

Okay, a restart and some other debugging later.
It's giving me 400 Bad Request: Invalid Form Body during the send.
If i print the webhook, it gives me <Webhook id=...> with the ID being the one I have in the config and the one I confirmed is the webhook ID for that announcements channel.

vale ibex
#

hmm alr, so webhook is alright

#

it's the send that's the issue

#

hmmm

#

What main commit are you base on?

#
commit 160f0ecb125fe317abc644100e58ab9557ea7faa (HEAD -> main, origin/main)
Author: TizzySaurus <47674925+TizzySaurus@users.noreply.github.com>
Date:   Wed Sep 8 09:48:22 2021 +0100

    Add support for `!infraction last` (#1804)
#

This?

thorny obsidian
#

I just cloned for this, latest commit is 160f0ecb

brazen charm
#

does a send with some simple known content work?

viscid coral
#

Um ig I should let you know? Not related to current topic

patent pivot
#

known bug - not mission critical though really

patent pivot
#

but if that was the case we should be seeing that in prod too

cold island
thorny obsidian
#

I know, I have no idea what's going wrong with the setup of bot though

viscid coral
#

Oh ok thank you Zig and a nameless owner

patent pivot
#

can you debug all the arugments being passed to the webhook send call?

austere hornet
thorny obsidian
patent pivot
#

wtf

thorny obsidian
#

I've checked the channel ID and the webhook ID I think a dozen times now

patent pivot
#

and if you try run .send on the webhook?

#

could also set wait to true as a kwarg to send_webhook and then try debug print the response in send_webhook

thorny obsidian
#

The issue with send_webhook is that it doesn't output a response. It just logs the exception and then the code fails later on because it's given a None value.

patent pivot
#

right - but you can add debug to send_webhook

cold island
#

@vale ibex approved the cache pr

vale ibex
#

ah cool I'll fixup now

#

And to answer your question, yea I think we should. It added error handling right there, rather than when the obj is destroyed

#

Numerlor has bot#1807 open for it

thorny obsidian
# patent pivot right - but you can add debug to send_webhook

So I can't really get any other debugging response besides just "Invalid Form Body"
I can use the webhook directly with a bare aiohttp client session and discord.Webhook.

I feel like I'm missing something vital with setting up webhooks for python bot.

patent pivot
#

I wonder if it's the omission of arguments that is causing things to bug out

#

maybe setting name / avatar / etc would make it work

brazen charm
#

Their test code above works for me

gritty wind
#

If you uhh

#

Interact with the json response manually

patent pivot
gritty wind
#

It might point to a specific field

#

But not always

patent pivot
#

I'll give it a try locally as well

vale ibex
#

If it's not config, maybe its version of d.py?

#

Are you running in docker, or locally?

#

Ah nvm, your error looks liek docker

thorny obsidian
#

Docker, I'm not that much of a masochist

vale ibex
#

lol

#

I imagine you just built bot today?

thorny obsidian
#

Like... two hours ago

#

I even re-installed docker earlier today

vale ibex
#

yea, so it's not gonna be an old v of d.py then

thorny obsidian
#

This is my first time ever building bot too

vale ibex
#

skip the util

thorny obsidian
vale ibex
#

guessing that says the same?

patent pivot
#

did we just deploy site

vale ibex
#

sad

vale ibex
patent pivot
#

hmmm

#

did we just deploy bot

vale ibex
#

ye

patent pivot
#

site restarted

#

lol

vale ibex
#

πŸ€”

patent pivot
gritty wind
#

Logs?

patent pivot
#

which imo at least shows a pretty tight correlation

#

no bot deploys = no site restarts

gritty wind
#

Joe what are we looking at

patent pivot
#

hahahaa

#

so the top one has a point every time we restarted bot

#

and the bottom one shows every time sites P99 (max time for 99% of reqs) crosses 1 second

vale ibex
#

and try with your ids

gritty wind
#

Well

#

That doesn’t sound good

patent pivot
#

which then causes the workers to saturate, healthchecks to fail and pod gets restarted

gritty wind
#

Is the bot blocking something?

patent pivot
#

ignore the huge empty space that's because prometheus ran out of disk space and i didn't notice

#

lol

patent pivot
gritty wind
#

What does it check when starting up

#

Ah

thorny obsidian
vale ibex
#

πŸ‘Œ

#

could you dm me your config yml so I don't need to pull ids πŸ˜…

gritty wind
#

Well, could you try to deploy a build without the sync steps and see how that goes

thorny obsidian
gritty wind
#

If it’s the sync steps could we have the bot fetch from a public request instead of directly through the network 🀑

#

Let CF handle the spam

thorny obsidian
#

So I deleted the image, re pulled, re-built. No dice.

... Maybe I just don't ever contribute to Python

gritty wind
#

Whatcha workin on?

patent pivot
thorny obsidian
gritty wind
#

Yes

#

You

thorny obsidian
#

tags ;-;

gritty wind
#

Ahh

thorny obsidian
#

I wanted to test out the string-formatting tag and a contributing tag

cold island
#

Can I have a recap? what isn't working?

gritty wind
#

You know what, this reminds me. I was working on a thing to get tag previews on GitHub so you don’t have to do this at all

thorny obsidian
#

Webhooks are bombing out for me, I have no idea why.

cold island
#

mmm

gritty wind
#

Very far fetched idea though

cold island
#

Can you send your config?

thorny obsidian
#

I'm pretty sure it's something in my set-up, I just don't know what

cold island
#

Are you using our test server?

thorny obsidian
#

nope, my own

#

Figured I could also use this to see the pain points in our contributing guide

cold island
#

Can you try using our for a bit to reduce variables?

#

I'll send you a config

thorny obsidian
#

lol, tbh I'd rather just not contribute to Python than go through the whole set-up of using the staff test server and having to ask Mark for perms and then worrying if my bot is going cause issues.

cold island
#

It's just inviting your bot to the server, really. You don't need any perms to work on tags

#

Neither does your bot, except sending embeds

thorny obsidian
#

Inviting the bot takes admin perms, no?

cold island
#

For you, I can give it to you now

patent pivot
#

yeah so

#

I just MVPd locally and it works

thorny obsidian
#

I'm pretty sure it's something in my set-up, I just don't know what

patent pivot
#

yes, I'm just trying to mimic every configuration and see if I can fuzz the error

vale ibex
#

that's annoying

#

found the issue

#

so we set allowed mentions using allowed_roles = [discord.Object(id_) for id_ in constants.MODERATION_ROLES]

#

since it's a list it can have duplicates, if the config has duplicates

#

so when d.py sends that to discord, it's an invalid list of roles, since they're not unique

#

we should warn if there are duplicates

#

or pass through a dict first

thorny obsidian
#

Sweet. Here I thought "surely, I don't need separate roles for mod and mod team and admins and owners"

#

It works now. Thanks for helping Chris.

vale ibex
#

πŸ‘Œ

cold island
vale ibex
#
allowed_roles = [discord.Object(id_) for id_ in constants.MODERATION_ROLES]
mylist = list(dict.fromkeys(allowed_roles))
cold island
#

You can list({discord.Object(id_) for id_ in constants.MODERATION_ROLES})

#

I don't think order matters

vale ibex
#

true

gritty wind
#

If you do it on consts.mod-role you skip the second variable

#

Or that

#

At this point though

#

Nit picks

thorny obsidian
#

aaaalright, there we go:

vale ibex
#

πŸŽ‰

cold island
clever wraith
gritty wind
#

It should exist from the SQL you ran

#

When uhh

#

When did you last create the postgres container?

green oriole
#

What the heck, Kat's issue was about having duplicate allowed mentions?

gritty wind
#

That's discord for ya

green oriole
#

Sigh

gritty wind
#

Did you update the repo first?

#

Hm, well it should in theory exist then

#

Sure, you should just need to remove the postgres one

#

Can you show the rest of output above

#

That's the important part

#

It might be an html page

green oriole
#

Oh boy, there are both logs at the same time

#

Can you open a new window and do docker-compose logs web and docker-compose logs bot separately?

#

You should be able to open a new one yeah

#

Also closing the terminal may not stop the services

gritty wind
#

All the errors seem to be related to the database not having the tables it should

#

That can be solved by running the sql manually, but docker-compose up really should've done it

vale ibex
#

Do you use docker for anything else othe than pydis?

#

If not, you can run docker-compose down then docker system prune --all --volumes it'll delete everything docker related. Then you can docker-compose up to start again

fallen patrol
#

@vocal wolf concering 2.0 the two bugs I've found: one is a dm typing event which doesn't get dispatched. Doesn't affect pydis bots (does affect modmail)

And threads.archiver_id is always None, but that's since discord removed that. Only way to get this is through the audit log now

patent pivot
fallen patrol
#

Meh, put that there for myself lol

#

Modmail fully breaks under 2.0 lol

#

Not worth anyone's energy here to monkey patch it up

vale ibex
#

What command are you running to get that error?

fallen patrol
#

What's the full traceback

#

Yes

fallen patrol
green oriole
#

I am not sure what we would gain from a 2.0 modmail bot

#

Alright, after you got back did you delete the volume, then did a compose down and up?

#

Huh

#

Can you upload the full logs?

vale ibex
#

I can reproduce the issue

#

Think I know what the issue is, gimme 5 min

vale ibex
#

I've got a fix

#

Just cleaning it up and will pr

#

alright site#587

dusky shoreBOT
vale ibex
#

that's a fun bug

#

no, this needs to be merged

#

for now you need to do the same fix as before, running the sql manually 😦

#

@green oriole in case you were interested in what the issue was, see the above pr desc

#

not by default, no

#

some commands my implement that, but it's not default behaviour

green oriole
#

That's interesting, weird we didn't see any warning or anything

vale ibex
#

I mean we wouldn't in prod, since metricity already exists

#

and I had debug logging and saw it creating the tables and inserting rows just fine

#

just in the wrong db lmfao

#

yea, read the PR description πŸ˜„

#

yup

green oriole
#

I mean, weird that psql doesn't write any warning when running locally

vale ibex
#

What did you do?

#

ahhh yea ofc, that is the wrong sql now, since this is after the change

#

1 sec

#

yup, send some messages in the server

#

that'll insert some messages for your acc

green oriole
#

That won't insert anything if you don't have metricity running lul

cold island
#

What are you working on that requires metricity?

#

Yes but are you working on voice verification?

#

What was your purpose for starting up the bot?

#

ok

gritty wind
#

If you want to use it, you can either modify the end of the sql to have your ID, or set up metricity

cold island
#

Did you clone the repo?

gritty wind
#

Normally you wouldn’t need to set metricity up at all, very few command depend on it

#

Especially on your own user

cold island
#

Are you using docker?

#

Are you sure the two containers are able to communicate?

#

Or at least, that metricity is using the same instance of postgres

#

If you look at your list of containers it should have a single postgres container running

#

Also my knowledge might be outdated, but if you're using metricity you need to destroy the testing metricity tables created by the site so that metricity can create its own

#

Not really available to do the full explanation, but last time I had to interactively enter the container and drop the tables, and only then start metricity

green oriole
#

One could say we should improve the metricity setup process. But we could also argue that nobody really does that, lol. Being able to place them in the same compose project would be handy, although can be quite buggy.

gritty wind
#

It should be relatively easy once you get it set up for the first time, but it definitely requires a lot of work - you're not intended to run the system like this

gritty wind
#

Why do you think it’d be buggy

cold island
#

It shouldn't be buggy. That said we'd need to change tests for something like voice verification which assumes specific rows exist in the db

#

Sorry, not voice verification, I mean the endpoints on the site

gritty wind
#

What we could do is override the command in the compose to not run the migrations, and just start the project

#

That'll get rid of the table already exists errors

#

I'm not seeing anything else that could cause problems, neither on site, nor bot

#

That may be more useful in the site, in the bot it's probably better to not pre-create the data, and instead have the users dynamically populate it

#

That way we don't have things like ^

cold island
#

tbh I'd like to be able to start the bot with the full feature-set with the compose

vale ibex
#

I'm starting to like my solution of initialising metricity on boot less and less

#

the recent PR will fix the issue we have now

#

but I'm leaning towards putting metricity in the site & bot composes

#

and removing init from site all together

#

We can insert the rows that the tests are dependant on in a fixture

#

or even have a debug flag on metricity that does it

cold island
#

If the purpose of that init is for tests, and there's a way to create it only when testing, and it's not a nightmare to write, I'm in favor of it

gritty wind
#

I considered doing it from metricity, but alembic manages the migrations and it's kind of annoying to do it from metricity

#

Just a lot of work when there's a simpler solution

#

Also not relevant for metricity itself is the most important part

vale ibex
#

site requires metricity to exist on boot now, and requires data for tests

cold island
#

You mean the metricity db?

vale ibex
#

yea

cold island
#

Wasn't that the case already?

gritty wind
#

Site I think can still use the init

vale ibex
#

it used to error if a metricity endpoint was hit

#

now it errors on boot

cold island
gritty wind
#

It really shouldn't

#

Let me outline everything again

vale ibex
#

Yea, I'm thinking we add metricity to bot & site compose, to handle creating the relations (which it already does)

gritty wind
#

I think it got muddled a bit

vale ibex
#

then we insert data needed for site tests during the test fixtures

gritty wind
#

So on site:

  • We use the init
  • We force metricity to start without running migrations, which voids the whole table already exists problems.
  • We now have the data we need

In bot:

  • We don't use an init
  • We just run metricity and let it go wild
  • Users insert data by typing in their servers, which is more useful since it'll be actual data that can be used for commands such as user
#

Maybe it doesn't make sense to run metricity on site at all the more I think about it

#

You'd need a bot token and w/e, and it really isn't useful

#

Basically, site can exist as it does now with no problems

cold island
#

What if you want to use site in docker and bot locally?

gritty wind
#

Exact same process

cold island
#

But then you start the site and it doesn't have metricity set up

#

So you have to set it up manually

gritty wind
#

I don't follow

#

Which project's compose are we talking about

cold island
#

bot

gritty wind
#

Right, so do you also want to start the metricity bot seperate of the compose?

cold island
#

hmm.. ok nevermind

#

confused myself

gritty wind
#

I think referring to everything by the same generic terms got a bit confusing πŸ˜…

vale ibex
#

So we add a new env var that tells site to init metricity db, that only gets set in site compose

gritty wind
#

We don't really need an env var I don't think

vale ibex
#

that way, running site we don't have metricity running, but the data is there

gritty wind
#

What will it do?

#

Well, we just use the init for that, why do we need metricity on site

cold island
#

How do you otherwise separate the two states?

vale ibex
cold island
#

If you set up the site currently, it runs the init

#

You need to somehow tell it not to

gritty wind
#

Right, so you're talking about running the site separate from bot?

cold island
#

yes

gritty wind
#

Well, I was just gonna go with what we currently have, which is deleting the tables manually. Can we load the sql init on a var?

cold island
#

That should be possible

vale ibex
#

Yea so what I'm thinking now is there is a env var that controls whether site inits metricity relations on boot. This gets ran when you run the site compose file, but not the bot compose file

#

since we don't want it to run when we run bot, since we will add metricity to the compose

gritty wind
#

Ok, now I'm confused again

#

If you are running site alone, and bot alone

#

How would you make a decision based on the bot's compose

cold island
#

The gist is, don't destroy the db, tell it not to create it in the first place in the case of the bot compose

vale ibex
#

I'm referring to if you're developing on the site repo, or if you're developing on the bot repo

#

site repo you want metricity relations to exist, but you're not running metricity the program, so you need site to init them

gritty wind
#

I don't think we want the init on the bot, no?

vale ibex
#

bot repo, you are running metricty the program, which pulls up it's own relations, so you don't want site to init them

gritty wind
#

Right

vale ibex
#

so we need a way to tell site to init or not

gritty wind
#

What I'm getting confused about is I'm assuming when you say run seperate projects, you're running the compose of the bot with just the bot, and the compose of the site, with just the site, so something like:

cold island
#
If we want to run the metricity bot:
    Let the metricity bot init the metricity DB
otherwise:
    Let site init the metricity DB
#

We don't want the metricity bot on site, but we do want it for bot

gritty wind
#

So to summarize:

  • On bot, no init, just metricity
  • On site, we have init based on an env var
#

Right, that's what I'm thinking

cold island
#

We have an env var anyway, it just gets a different value on each compose

#

The env var is for the site

gritty wind
#

Why would you have it on bot

#

Right, gotcha now

cold island
#

Because the site needs to know whether to init the test DB

gritty wind
#

But I mean the site itself can't process that env var

#

docker-compose is what needs to

cold island
#

yes

gritty wind
#

Since that's where the init is

#

The site itself shouldn't need to know anything?

vale ibex
#

I think we should get site#587 reviewed and merged first

dusky shoreBOT
vale ibex
#

since this actually fixes the init impl

#

then we can look at doing it conditionally

vale ibex
#

at runtime

#

not in compose

gritty wind
#

Oh?

vale ibex
#

since bot doesn't have access to the init.sql on teh site repo

#

it couldn't init metricity at all

gritty wind
#

I see... should we revert that based on the discussions above?

vale ibex
#

so we moved it into site runtime, so when you run site via bot compose it still has relations

#

no I don't think we should

#

hmmm

#

actually

gritty wind
#

It shoulllllldn't be relevant for bot anymore

vale ibex
#

yea, if we're adding metricity to bot compose, as long as we make sure metricity finishes migrations before pulling up site, it should work

#

we can revert all of this and move back to a init volume

gritty wind
#

Ah, seems we are on the same page

vale ibex
#

Now to figure out how to make sure metricity finishes migrations before pulling up site

#

lol

#

docker-compose depends just waits for the container to start, not for migrations to happen

gritty wind
#

There is an option for liveness probe

#

But yeah, I'm not 100% sure where that fits in

#

Does the site need the table for startup?

vale ibex
#

since if metricity hasn't finished migrating, the metricity relations don't exist, and then when site boots it'll error

#

yes

gritty wind
#

Alright, let me find that probe article

#

But it will require changes to metricity

cold island
#

What does the site need it for?

vale ibex
#

django-prometheus requires metricity relations on boot

cold island
#

Alright you lost me

#

lol

vale ibex
#

it's a new thing we added for devops iirc

#

not sure why it needs it, but it errors if it doesn't exist

gritty wind
vale ibex
#

it's hit whenever we do django.setup()

gritty wind
#

The suggestions after that though are wrappers around the container we're waiting for

vale ibex
#

so we can add a liveness there

#

we have a wait_for_postgres blocker in site already

gritty wind
#

Seems like a good place for this

vale ibex
#

that just tries to open a socket

#

we could change that to actually test relations

cold island
#

Ok, that sounds like a good gameplan to me. It doesn't even require a second bot token I think

vale ibex
#

yea, I've got site working and checking for metricity relations

#

just need to get it working with bot

vale ibex
#

metricity is not patient with postgres lol

#

huh metricity isn't doing migrations itself pithink

#

Added this to the docker-compose ```
metricity:
<< : *logging
<< : *restart_policy
depends_on:
- postgres
image: ghcr.io/python-discord/metricity:latest
env_file:
- .env
environment:
DATABASE_URI: postgres://pysite:pysite@postgres:5432/metricity

#

ahh ofc

#

database uri needs to be pysite

#

then it switches

#

nope it doesn't switch

#

I think we're going to have to create two postgres instances in the bot docker compose

#

we need 2 databases running, pysite and metricity

#

need to explain the issue I'm in and make sure I'm not missing something obvious

cold island
#

There shouldn't be an issue with having two databases in the same instance

vale ibex
#

yea, the issue is creating it

cold island
#

If it's working in prod now

vale ibex
#

might need to write a bootstrap script in the bot repo to create the metricity db

cold island
#

Why does the bot need to do that, and not the metricity bot?

vale ibex
#

metricity bot doesn't create the db, it connects to it and populates it

#
postgres:
    << : *logging
    << : *restart_policy
    image: postgres:13-alpine
    environment:
      POSTGRES_DB: pysite
      POSTGRES_PASSWORD: pysite
      POSTGRES_USER: pysite
#

this creates a pysite db

green oriole
#

Isn't pysite/pysite admin?

#

It should be able to create a new database

vale ibex
#

yea, it can

#

we just need to do that somewhere

green oriole
#

We can make metricity do that if debug is on

#

I don't think it is an issue

vale ibex
#

how would that work?

#

string compare the database, if its not "metricty" then metricty crates a new db?

cold island
vale ibex
#

yea, that's not the issue

cold island
#

What I'm trying to say is that the image should be taking care of creating the db

green oriole
#

Maaaybe it doesn't take in any database fragment, and will connect first to the engine to create the database if it doesn't exist, then connect to the actual database

vale ibex
#

the image just connects to a db, it doesn't create a db

#

it creates tables within the db it's given connection string to

green oriole
#

IMO it should :D

cold island
#

Ah I see

vale ibex
#

yea, so we'd give metricity a bare connection string, with no db

#

and it creates the metricity db in it before migrating?

green oriole
#

I think so

cold island
#

You can still supply a db, and create it only if it doesn't exist

vale ibex
#

true

green oriole
#

That sounds a bit cumbersome

vale ibex
#

we'd need to write something to do this though, as the current entry point for the dockerfile is albemic

#

so we'd need to change the metricity entry point, since the db needs to exist before that

green oriole
#

If I specify a database name and it doesn't exist, I would like the bot to assume something is wrong and it isn't connecting to the right cluster or don't have the right perms

cold island
#

hmm that's true

green oriole
#

We can have a shell entry point that runs a creation script, then jump to alembic

vale ibex
#

yea

#

also, this is pretty cool ```
healthcheck:
test: ["CMD-SHELL", "pg_isready -U pysite"]
interval: 2s
timeout: 1s
retries: 5

#

then ```
metricity:
<< : *logging
<< : *restart_policy
depends_on:
postgres:
condition: service_healthy

#

so that metricity doesn't try to start before psql is healthy

#

all in compose

green oriole
#

That's very nice

#

I want that for the bot lol

vale ibex
#

hah yea this is in the bot compose

green oriole
#

O really

vale ibex
#

well, on my machine it is lol

green oriole
#

Are we adding metricity to the bot?

vale ibex
#

yup

#

this is where this whole conversation started

#

the metricity init solution for site didn't actually work

green oriole
#

Wait, so are going to have PG + site + bot + metricity?

vale ibex
#

and redis and snekbox kek

green oriole
#

Do you want to discourage all of our contribs on lower end computers haha

#

It should be an optional dep imo

limber viper
#

where can i share my github project in this discord server ?

green oriole
#

In the metro, back in an hot minute

vale ibex
limber viper
#

i did, no body replied me

vale ibex
#

I can't see any messages from you in help channels

#

There is also a guide in there on how to ask good questions, which will increase your chances of getting a reply

dim pelican
#

πŸ‘€ Me reading kat's messages about setting up Python and Site yesterday and then this convo today....

vale ibex
#

well yea, it needs to be improved somehow right

#

not sure we'd be able to do that without discussing...

dim pelican
#

I think it is pretty freaking sweet, I like technical discussions and especially when I don't understand it. Lets me know there are things to learn, and who to contact for when the time comes

vale ibex
#

Yea, there's quite a bit to our infra lol

dim pelican
#

Can't wait to set up Python, which requires Site

#

And then breaking all of the things (on my side)

short snow
#

bluenix going wild on reviews clappyclap

vale ibex
#

since metricity doesn't have psql installed, we can't really do it from a bash script

#

we'd need to put a python script to init, using psycopg or smth

#

yea, in bot that's where the logging is setup

cold island
vale ibex
#

I'm referring to the psql cli tool

cold island
#

ah

green oriole
#

@vale ibex so here is my two cents: starting up a metricity instance should be a conscious decision. Having two bots silently starting up while you expect only one to start seems quite counter intuitive, especially when you except to start @stable mountain and nothing else. Besides, metricity is only required for two features of the bot, and it takes up resources.

We could make it so the bot doesn't depend on metricity, you'd have to excplicitely start it up I believe. If it doesn't work like that, we can always have it in a separate compose file and have it be selected from the command line.

green oriole
vale ibex
#

the issue is that site depends on metricity relations existing to boot

#

we didn't want site to handle it all the time, since if you wanted to spin up metricity you'd need to remote into psql and delete the tables

#

otherwise metricity would complain during migration

cold island
#

Metricity doesn't have commands, it's just an event listener written with Python

vale ibex
#

yea, I think the reservation there is it's another thing running on your machine, which might impact lower end PCs

#

since to run python via compose you would now need to run 6 services

#

I'm not sure exactly how much it would impact it

cold island
#

Maybe it can be an env var?

#

whether to start metricity or not

vale ibex
#

we'd need metricity to run alembic but not start fully

cold island
#

Hmm

thorny obsidian
#

LMAO @brisk brook

vale ibex
#

which is possible

#

with run ifs

cold island
#

Technically there can be a separate entrypoint in the init file

vale ibex
#

we would change docker CMD ["sh", "-c", "alembic upgrade head && poetry run start"] to ```docker
CMD ["alembic", "upgrade", "head"]
RUN if [[ -z "$start_metricity" ]]
then
poetry run start
fi

#

or smth like that

cold island
#

yeah

#

but

#

Isn't the python app the one creating the tables and relations?

vale ibex
#

alembic creates the relations

#

the app is what populates with data

cold island
#

ic

short snow
#

hmm, can any1 tell me what discussion is going on here, i am not willing to read those 200 messages πŸ˜›

dim pelican
short snow
#

umm i had this problem about 2 weeks back when the prometheus PR by joe (was requiring a metricity db) was merged, i just created the DB and it was working fine after that πŸ€·β€β™‚οΈ

brazen charm
#

Even if it's necessary from a perms perspective (no idea there), you definitely don't need every channel set for developing

cold island
#

Permissions should already be defined. It doesn't matter anyway if you're not doing anything that relates to it

brazen charm
#

the only thing that really matters for testing is that it sends it to the db and tries to mute

thorny obsidian
#

huh, wouldn't think the newline thing applied to md files as well

thorny obsidian
#

πŸ‘‰ πŸ‘ˆ ... tag speedrun? πŸ₯Ί

fervent sage
thorny obsidian
#

bot#1819

dusky shoreBOT
green oriole
vale ibex
#

I've just written the py script in metricity to create the db

#
python create_metricity_db.py
alembic upgrade head
if [ -z "$start_metricity" ]
then
    poetry run start
fi
#

this is the current entry point script

#

I think we should start by default if there is no env var

#

and then have the bot set one to not start it

#

to keep with current behaviour

gritty wind
#

Create If not exists?

#

Can you actually write sql queries

#

As in, can you write custom sql queries with the migration tool

#

Not questioning your sql skills 🀑

dim pelican
#

You've got some reading to do

thorny obsidian
#

@brazen charm what about something like this?

dim pelican
vale ibex
#
    conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
    with conn.cursor() as cursor:
        cursor.execute("SELECT 1 FROM pg_catalog.pg_database WHERE datname = %s", (db_name,))
        exists = cursor.fetchone()
        if not exists:
            print("Creating metricity database.")
            cursor.execute(
                sql.SQL("CREATE DATABASE {dbname}").format(dbname=sql.Identifier(db_name))
            )
    conn.close()
#

gotta do this instead

brazen charm
thorny obsidian
cold island
vale ibex
#

metricity#7 is a non-breaking change that will move us towards getting metricity working in site & bot

dusky shoreBOT
vale ibex
#

would appreciate comments

brisk brook
vale ibex
#

big sad

clever wraith
#

sir-lancebot#849 any reviews would be great

dusky shoreBOT
thorny obsidian
brisk brook
#

Yeah I saw that, I think that may be the best way actually

#

It looks decently sized as well

vale ibex
vale ibex
#

if you wanted to roast the rest of it

#

πŸ˜„

thorny obsidian
#

I'll trade you a bad review for pressing a merge button :D @vale ibex

vale ibex
#

point me to the button lol

thorny obsidian
#

bot#1819

dusky shoreBOT
vale ibex
#

huh, automerge doesn't ask for a commit message on the github app

green oriole
vale ibex
#

lol

green oriole
vale ibex
#

lol not this again

#

lucky I don't write bash often

#

is it if [ ... ]; then rather than new line?

#

that convention sucks πŸ˜„

#

I'm so used to putting { a new line

#

I do the same for then

green oriole
#

Ya haha

#

But honestly that isn't an issue since it is the only bash file of the repo

vale ibex
#

lol yea

#

if you approve this, then it becomes convention for metricity

#

and I will request changes for any new bash files

#

πŸ™ƒ

green oriole
#

lol, I honestly don't know enough about that SQL madness to approve

patent pivot
#

imagine SQL

short snow
#

Would love to get some reviews on bot#1634 bot#1446 sir-lancebot#745

short snow
#

this github colour looks different

#

hmm

#

the pr icon colour

thorny obsidian
#

Okay, I'd like to get a !contribute tag going driving people to some of our projects, particularly Lancebot. What would you say are the vital pieces of information people should have?
Off the top of my head:

  1. Listing our common/larger projects (lance, python)
  2. Directing people to this channel
  3. Linking to our "start here" contributing guides or what have you
vale ibex
#

mention issue before PR

#

but those sound good

short snow
#

there is alredy a issue on that i think

thorny obsidian
#

meta#`09

#

ffffffff

#

meta#109

dusky shoreBOT
brisk brook
#

Could it pull issues marked as "good first issue" from GitHub?

brazen charm
short snow
#

yess that one

thorny obsidian
#

So, I think the goal here is to have a command that will easily direct people to this channel and that guide if they ask if they can contribute to stuff. So less of an explaining and way more of a "go here!"

brisk brook
#

If we'd use the "good first issue" labels more, it could display at the bottom (requires making it a command though) approved issues to get someone started

#

I am thinking it would easily get someone potentially excited about something they can work on

green oriole
vale ibex
#

Just need to add set -e to the bash

vale ibex
#

Alright gonna push the site and bot changes

#

Alright, to summarise.
In metricity#7, metricity now creates it's own DB if one doesn't exist, along with running it's migrations as it used to.

In site#588, site no longer runs metricity migrations at runtime, it instead uses a volume in it's docker compose

In bot#1820, bot includes metricity in it's compose, but sets an env var so the actual bot doesn't start, only the migrations run. This is so that when site boots up the metricity relations are ready.
If someone actually wants to run metricity with the bot, then they just need to remove the skip_metricity env var in the compose

The metricity PR can be merged as is, but the bot and site PRs need to be merged around the same time. Merging at different times won't affect prod, but will impact local devs pulling new site images

vale ibex
cold island
#

sick

green oriole
#

good job

vale ibex
#

docker compose healthchecks are cool

gritty wind
#

πŸ‘Œ πŸ‘Œ πŸ‘Œ

brisk brook
#
        if tag_name_or_group is None and tag_name is None:
            if self.tags:
                await self.list_all_tags(ctx)
                return True
            else:
                await ctx.send(embed=Embed(description="**There are no tags!**"))
                return True

        elif tag_name is None:
            if any(
                tag_name_or_group == identifier.group and tag.accessible_by(ctx.author)
                for identifier, tag in self.tags.items()
            ):
                await self.list_tags_in_group(ctx, tag_name_or_group)
                return True
            else:
                tag_name = tag_name_or_group
                tag_group = None
        else:
            tag_group = tag_name_or_group

        embed = await self.get_tag_embed(ctx, TagIdentifier(tag_group, tag_name))
        if embed is None:
            return False

        if embed is not COOLDOWN.obj:
            await wait_for_deletion(
                await ctx.send(embed=embed),
                (ctx.author.id,)
            )
        # A valid tag was found and was either sent, or is on cooldown
        return True

So this is quite the mouthful from bot#1663, any ideas on how we can make it more readable?

dusky shoreBOT
brisk brook
#
        if not self.tags:
            await ctx.send(embed=Embed(description="**There are no tags!**"))
            return True

        if tag_name_or_group is None and tag_name is None:
            await self.list_all_tags(ctx)
            return True

        if tag_name is None:
            found = await self.list_tags_in_group(ctx, tag_name_or_group)
            # If there is a group with that name and we paginated it
            if found:
                return True

            tag_name = tag_name_or_group
            tag_group = None
        else:
            tag_group = tag_name_or_group

        ...
#

What about this instead?

#

Though it requires changes to list_tags_in_groups() so that it looks like the following: ```py
async def list_tags_in_group(self, ctx: Context, group: str) -> bool:
"""Send a paginator with all tags under group, that are accessible by ctx.author."""
embed = Embed(title=f"Tags under {group}")
tag_lines = sorted(
f"\N{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK} {identifier}"
for identifier, tag in self.tags.items()
if identifier.group == group and tag.accessible_by(ctx.author)
)
if not tag_lines:
return False

    await LinePaginator.paginate(tag_lines, ctx, embed, footer_text=FOOTER_TEXT, empty=False, max_lines=15)
    return True
#

@brazen charm thoughts about these changes? I can't suggest them because it overlaps removed lines which GitHub isn't happy about.

gritty wind
#

match :P

cold island
stable mountainBOT
#

pydis_site/apps/api/viewsets/bot/infraction.py line 62

Response is paginated but the result is returned without any pagination metadata.```
stable mountainBOT
#

pydis_site/apps/api/viewsets/bot/infraction.py line 150

pagination_class = LimitOffsetPaginationExtended```
`pydis_site/apps/api/pagination.py` line 7
```py
class LimitOffsetPaginationExtended(LimitOffsetPagination):```
vale ibex
#

looks like we subclassed LimitOffsetPagination to remove the meta data

cold island
#

ahaa, so it was one line above the one I was looking at πŸ˜„

#

thanks

vale ibex
#

πŸ˜„

cold island
#

@clever wraith I responded in site#578 with a method that might be simpler.

clever wraith
#

Ah, that looks even better - if there was a way for it to not return a nested dict and instead give back the information directly that would be even nicer imo

my solution was based off a stackoverflow answer and someone saying that it follows convention to implement bot/users/username to add an alternative to fetch by username, so I really don't have an opinion on which one of them is better πŸ˜„

cold island
trim cradle
#

.uwu 885596963255484436

dusky shoreBOT
#

885596963255484436

trim cradle
#

this doesn't work for message IDs?

trail pilot
#

.uwu rrrrr

trim cradle
#

I thought it could look up message IDs in the cache and uwu them

brazen charm
#

try a message link

trim cradle
dusky shoreBOT
#

twy a message wink

trail pilot
#

ah

vale ibex
#

it'll only work on IDs if that message is in the message cache iirc

static canyon
#

messageid <-- message in same channel
textchannelid-messageid <-- message in same server
messageurl <-- any message

All assuming cache etc.

vale ibex
#

The latter two work even if they're not in cache afaik

#

they'll get fetched

#

.uptime

dusky shoreBOT
#

I started up 11 hours ago.

vale ibex
#

11hours πŸ‘€

#

.uwu 885263482725994536

dusky shoreBOT
#

885263482725994536

static canyon
#

Yeah, the last two aren't dependant on cache

vale ibex
#

.uwu 885618510217248849

dusky shoreBOT
#

.uwu 885263482725994536

vale ibex
#

yea

#

message id only works if in cache

#

.uwu 635950537262759947-885272315775029248

dusky shoreBOT
#

πŸ€”

static canyon
vale ibex
#

others are fine

static canyon
#

Or at least there wasn't when the converter was made

vale ibex
static canyon
#

I think might be possible with PartialMessage now, not sure

trail pilot
#

why do we cache the messages? why not just use bot.fetch_message?

vale ibex
#

the docstring says it assumes current channel if no id is given

#

but it doesn't

trim cradle
#

.uwu 885618804896456724

dusky shoreBOT
#

de docstwing says it assumes cuwwent channew if no id is given

trim cradle
#

YAY

vale ibex
#

lol

static canyon
trim cradle
#

.uwu this is a thing

dusky shoreBOT
#

dis is a fing

static canyon
trim cradle
#

how does it know which <th> is which?

vale ibex
#

pretty sure it just does a replace

#

with a random uwu thing

trim cradle
#

but in English, <th> represents two different sounds

static canyon
#

.uwu this is a thing

dusky shoreBOT
#

dis is a fing

vale ibex
#
UWU_WORDS = {
    "fi": "fwi",
    "l": "w",
    "r": "w",
    "some": "sum",
    "th": "d",
    "thing": "fing",
    "tho": "fo",
    "you're": "yuw'we",
    "your": "yur",
    "you": "yuw",
}
#

that's how lol

thorny obsidian
#

.uwu thick

dusky shoreBOT
#

dick

thorny obsidian
#

lol yup

trim cradle
#

that's a rip

vale ibex
static canyon
#

!warn @dusky shore inappropriate message

vale ibex
#

I shall call on this favour one day

viscid coral
clever wraith
trim cradle
#

are you saying lance can't be gay?

clever wraith
#

Nonononononononono

#

insert backpedal here

patent pivot
vale ibex
#

Does it suffer from the Scunthorpe Problem?

clever wraith
#

Couldn't someone just .uwu f*ck

trim cradle
clever wraith
vale ibex
#

google it πŸ˜„

trim cradle
#

we're gonna have to make this channel nsfw now

vale ibex
#

it's a problem basic profanity filters run into

clever wraith
#

Oh lmfao

clever wraith
trim cradle
#

you were gay shaming him. obviously.

clever wraith
#

I am a member and supporter of the LGBTQ2IA+ community and continue rant here

trim cradle
#

what is the 2?

clever wraith
#

Two spirit iirc

fervent sage
#

what if we just call it + so we dont have to add more letters

#

or .* cause that covers everything

trim cradle
#

[A-RT-Z]+

#

that way it can't include straight

fervent sage
#

but it can still include heterosexual

trim cradle
#

we'd just assume it stands for homosexual

clever wraith
trim cradle
#

anyway, I'm hesitant to include two spirit as that's a gender identity unrelated to Western queerness.

#

but now we're off topic

clever wraith
fervent sage
#

([A-GI-RT-Z]|H[^E])+

clever wraith
clever wraith
#

Oh come on

fervent sage
#

that still hasnt been merged huh

clever wraith
#

Nope

#

Gotta walk home from school, bye all

green oriole
fallen patrol
#

@patent pivot you maaay want to turn off sending status checks to the discord webhook for king arthur now lmfao

patent pivot
#

lol

#

!remind 5h that

stable mountainBOT
#
No problem.

Your reminder will arrive on <t:1631241572:F>!

fallen patrol
#

29 last messages in #dev-log are king arthur

patent pivot
#

winner

static canyon
#

@brisk brook I've commented on bot#1821 but the comment is rather rushed since I'm going to bed so if there's anything you don't understand etc. just lmk.

dusky shoreBOT
brisk brook
fallen patrol
#

heh I just realised I have now referenced one of my projects in a pydis commit-- stuff from modmail is on @radiant merlin now πŸ˜„

patent pivot
#

inb4 revert

fallen patrol
#

(technically not, because it was a workflow file and King arthur actually isn't running it)

#

(and was initially pulled from pydis/bot)

#

but the point still stands πŸ‘€

fallen patrol
#

also ka # 11 marks the end of the trilogy

patent pivot
#

i might pull out the status embed

fallen patrol
#

meh

#

11 was related to the isort and black conflicts

#

which aside from a bug in isort conflicting with black, is pretty much resolved.

fallen patrol
patent pivot
fallen patrol
#

true

#

it could be moved to lint or build

#

since like

#

wait

#

it could be moved to lint, ig

patent pivot
#

or we just use the default embeds, lol

#

we can have it report only on suites, not stages

fallen patrol
#

wait what is the difference

#

is the whole file a suite?

patent pivot
#

suites will be just one embed for the ci stage, as opposed to each job

fallen patrol
#

where is the stage defined?

patent pivot
#

that's the workflow

fallen patrol
#

ah

#

aight I turned it on for one of my repos, will see if it goes off

#

since its a 4 stage workflow

patent pivot
#

I'll do it once I'm done gaming

fallen patrol
#

lol

austere hornet
fallen patrol
#

well damn, @patent pivot , I found a problem with my checks anyhow lol

#

thanks for that info

#

I'm never turning it on again

#

need to figure out how many times its changing its statuses lmfao

patent pivot
#

lol

fallen patrol
#

wait what

#

it

#

what

fallen patrol