#dev-contrib

1 messages · Page 143 of 1

vale ibex
#

or whatever the names are

#

The cog itself should then have some async init task to resolve the IDs to names for showing in the buttons themselves

#

that won't work, since you need to wait for the guild to be available

#

otherwise the role cache will be empty

#

yes

#

think it's something like bot.wait_until_guild_available()

#

yes, you can, which is why I suggested an async init task

#

no, you'd do something like this ```py

class Something(comamnds.Cog):
def init(self, bot):
self.bot = bot
utils.scheduling.create_task(init_cog(), self.bot.loop)

async def init_cog(self):
    await self.bot.wait_until_guild_available()
    ...
wind ruin
#

You can add methods to make Tasks await until something before they run the first time, if you are actually using tasks and not just the entire cog

vale ibex
#

Yea, we have a helper for that

#

updated the snippet

#

since this is an init task, there's no need to use d.py's task ext

wind ruin
#

I mean like ```py
class MyCog(commands.Cog):

@tasks.loop(minutes=10)
async def new_comments(self):


@new_comments.before_loop
async def before_new_comments(self):
    await self.bot.db_loaded.wait()
thorny obsidian
#

@vale ibex while you're here, what are your thoughts on the feasibility of having this cover some of Sir Lance's roles? Too much effort to be worth it?

green oriole
#

So like lovefest and all?

vale ibex
#

it wouldn't be too bad, we'd need to implement a similar month gate

green oriole
#

Okay, another idea

#

Can we make a static message with permanent buttons?

vale ibex
#

this could also have the month number in it, then in the init it checks the current month and only adds those that match, or without a month number

patent pivot
#

on this note: would rather keep it almost solely role IDs, and if we implement date gating then that as well, names should be picked up from the cache since we'll use different colored buttons and emotes to signify if the user currently has a role

#

no need for descriptions

patent pivot
green oriole
#

I see. My idea was to have a message in #roles about it

thorny obsidian
#

I think I'd rather keep as much compatibility with the current !subscribe as we can for the first iteration of this

#

So we still direct people to run this command for themselves

#

Otherwise that's a lot of messages in a lot of places we have to change

green oriole
#

Well, we could add a tag saying we moved it, like we have

#

!free

#

Okay, we apparently removed it haha

short snow
#

what about description of the role?

#

oh joe said that

vale ibex
#

Yea, no need for a description, we're just using buttons so want the text to be relatively small. The name should be descriptive enough

stable mountainBOT
#
It has arrived!

Here's your reminder: that
[Jump back to when you created the reminder](#dev-contrib message)

austere hornet
stable mountainBOT
#
No problem.

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

austere hornet
#

!remind delete 3266

stable mountainBOT
#
Okay.

That reminder has been deleted successfully!

austere hornet
#

@green oriole So I ran the pre-commit command but lint is still failing and I can't figure out why

#

It's actually flake8 that's failing

trail pilot
#

Those are PEP8 guidelines

austere hornet
#

But I still can't seem to understand what in the guidelines I am still "breaking" so to speak

fallen patrol
#

you have a syntax error on line 62

#

that needs to be fixed before the rest of them can be fixed

#

since as of now, the code literally will not work

trail pilot
#

On the right hand side it should let you know what to fix. I.e on line 84, you’ll want to continue the line to the next one so it isn’t breaking the PEP8 guideline on line lengths

fallen patrol
#

and you can't have mixed tabs and spaces

#

what IDE are you using?

austere hornet
fallen patrol
austere hornet
austere hornet
dusky shoreBOT
fallen patrol
#

filtered_blanks = [if min_length < len(random_template["blanks"]) < max_length]

#

what is this trying to do?

austere hornet
#

I understand it's a syntax error, I don't understand where though

austere hornet
#

I actually already had that same website open @fallen patrol 😆

fallen patrol
austere hornet
#

Does that make sense?

fallen patrol
thorny obsidian
austere hornet
#

I think I know what I did wrong

fallen patrol
austere hornet
#

random_template isn't defined

thorny obsidian
#

Below the message you replied to

vale ibex
#

Just stubbing out the button command, is there already a pyweek role Kat?

#

I can't see one, but not sure if I'm blind 😂

vale ibex
#

Alr, I'll make one

#

preference on name?

#

PyWeek Announcements?

thorny obsidian
#

Yeah, don't want to limit it to participants

vale ibex
#

👍

#

<@&897568414044938310>

fallen patrol
thorny obsidian
#

Yeah I'd still prefer to keep it is as a command you run instead of a permanent message

#

Even if we have the subscribe redirect it's still subpar UX for not a lot of benefit

#

Dang @vale ibex that's lightning fast

fallen patrol
vale ibex
#

just wanted to push before I closed it for the night

#

Just need to define button behaviour and then add buttons to a view

fallen patrol
#

reviewed

austere hornet
#

I fixed it and it's still saying syntax error

#

This is what I did

gritty wind
#

Your syntax error is that if

#

If you want an if on one line, you can use a ternary, but from my limited understanding of your code you're just using it to convert to bool right?

#

Use bool()

#

!e [if 1 == 1]

stable mountainBOT
#

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

001 |   File "<string>", line 1
002 |     [if 1 == 1]
003 |      ^^
004 | SyntaxError: invalid syntax
gritty wind
#

vs

#

!e [bool(1 == 1)]

stable mountainBOT
#

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

[No output]
austere hornet
#

Ah

gritty wind
#

obviously tho, 1 == 1 is already a bool

austere hornet
#

Ok

gritty wind
#

so no real need for calling bool there, or the if

austere hornet
#

Ok, got it, thanks Scale!

austere hornet
#

Does anyone know what this means? f-string is missing placeholders

#

line 51

vale ibex
#

you're using a f string but it doesn't have any {var_name} in it

#

so there's no need for it to be an f string

austere hornet
vale ibex
#

bot#1868 is actually ready for review now if anyone was interested

dusky shoreBOT
vale ibex
#

going to leave it as draft since it's based on top of another PR

fallen patrol
vale ibex
fallen patrol
#

since i reviewed it earlier lol

vale ibex
#

ah

vale ibex
#

ah lol sorry @fallen patrol didn't realise it kicks you out

fallen patrol
gritty wind
#

I personally like automatic dismissal, because it ensures things don’t sneak by, which I’ve had done to me

#

Just because I approved what you had before you changed it, doesn’t mean I’ll approve it after

vale ibex
#

Yea I like auto dismissal too, but this was me kicking arl out of a review by pushing changes

fallen patrol
#

yeah

#

i did it to bast earlier ;-;

gritty wind
#

Ahh

#

Yeah that’s uh

#

Questionable 😅

fallen patrol
#

the fact that a partial review can't be added to once a new commit is pushed doesn't make much sense

clever wraith
#

hey all

#

for cowsay

#

i was wondering how i should give the available cows to a user

#

oh

#

nvm

clever wraith
#

hey @vocal wolf, the module im using for cowsay doesnt have a license listed in the meta info on pypi, what do i do? this forces the checks to fail

clever wraith
#

yeah the license is apache

vocal wolf
#

oh sorry I thought you were searching for the license

#

welllllll

#

maybe find an alternative?

fallen patrol
#

it could be ignored

vocal wolf
#

is it? I thought we're only accepting MIT

#

let me take another look

fallen patrol
#

!src

stable mountainBOT
stable mountainBOT
#

.github/workflows/lint-test.yml lines 19 to 26

ALLOWED_LICENSE: Apache Software License;
  BSD License;
  GNU Library or Lesser General Public License (LGPL);
  ISC License (ISCL);
  MIT License;
  Mozilla Public License 2.0 (MPL 2.0);
  Public Domain;
  Python Software Foundation License```
vocal wolf
#

yeah

#

hmmm

fallen patrol
#

first one is apache

#

wait

#

cowsay

#

.src

#

i hate u lance

#

k

stable mountainBOT
#

.github/workflows/lint.yaml lines 20 to 28

ALLOWED_LICENSES: Apache Software License;
  BSD;  BSD License;
  GNU Library or Lesser General Public License (LGPL);
  Historical Permission Notice and Disclaimer (HPND);
  ISC License (ISCL);
  MIT License;
  Mozilla Public License 2.0 (MPL 2.0);
  Public Domain;
  Python Software Foundation License```
fallen patrol
#

!pypi pip-licenses

stable mountainBOT
fallen patrol
#

--ignore-packages

vocal wolf
#

Apache Software License != Apache License maybe?

fallen patrol
#

it isn't listed whatsoever

#

pft

#

brb

vocal wolf
#

maybe this will work lol

fallen patrol
#

yeah

#

I just noticed something that I do not like about pip-licenses lol

#

brb

fallen patrol
#

ah

#

that's why

#

raimon49/pip-licenses#108

fallen patrol
#

reason why its not added: pip saves the license data when a package is installed.

short snow
vocal wolf
clever wraith
#

@vocal wolf if all else fails i can fork and add the license

#

but imma head to bed tonight, bye all

short snow
clever wraith
#

@vocal wolf another option would be to allow the UNKNOWN license if they don't respond

clever wraith
green oriole
#

The workflow isn't detecting the license correctly?

gritty wind
#

I don’t particularly like that solution, and would prefer an explicit ignore for any libraries that are unknown

clever wraith
molten perch
#

Hey! Can I have some opinions on api#22? 🙂

dusky shoreBOT
short snow
#

"a PR should come up anytime now" -- you are working on it?

#

Okay cool! Also i reviewed your PR

#

and you got a poetry.lock conflict 🙃

molten perch
#

Yeah, because my model PR was merged a few days after that PR had been opened.

thorny obsidian
#

but...but... @vale ibex how will I spam buttons now 🥺

vale ibex
#

you can still spam buttons lol

#

you can only spawn the buttons every 10s

thorny obsidian
#

so what docker containers do you have running and what's the status of them?

placid ermine
tawdry vapor
#

Use http instead of https

thorny obsidian
vale ibex
#

oh lol

placid ermine
green oriole
#

Or self sign certs lol

fallen patrol
#

...and i just got distracted and closed a tab with a review

vale ibex
#

github saves inprogress reviews

#

so if you open the review again it should still be there

brisk brook
#

Do you guys get email notifications from GitHub?

#

I am not sure if I want to turn it off 🤔

#

They're all marked as Important which is a bit :/

dim pelican
#

I do, I tried to make a rule that labels them and moves them to a special folder but it has not quite worked out the way I thought it would in gmail

#

In outlook it would be easy

vale ibex
#

works fine for me

thorny obsidian
#

I have all emails off from github except if something I pushed failed a workflow

#

The important stuff is already posted to other channels and places that I check daily, so the email is just extra clutter imo

brisk brook
dim pelican
#

In settings, see all settings, then Filters tab

austere hornet
vocal wolf
clever wraith
#

Ty xith

vocal wolf
#

np

#

re-running the workflow on the PR now

#

hmm

#

still failed

#

ah

#

@clever wraith I think you need to update cowpy to 1.1.1

gritty wind
#

This is why I dislike non-exact requirements, it's unclear when you need to relock, or when something significant changes smh

vale ibex
vocal wolf
#

yeah they have the one in the repo and the one in pypi

vale ibex
#

An Apache 2.0 added 6 years ago, and an MIT one added jsut now

vocal wolf
#

apache and mit

#

lol

vale ibex
#

the repo itself has 2

vocal wolf
#

interesting

vale ibex
#

I've commented on that issue anyway

#

hopefully they'll remove the incorrect license

#

and hopefully the incorrect one isn't the MIT one lol

clever wraith
#

Funky

#

So

#

Poetry is being picky and saying that cowpy v1.1.1 doesn't exist

#

Bad poetry

vocal wolf
vale ibex
#

It just let me add it fine locally

#

are you typing literally v1.1.1?

#

it needs to be just 1.1.1

clever wraith
#

I know

thorny obsidian
#

Chris, how difficult is it to use the Discord button components?

clever wraith
#

I'm removing and re-adding

#

Should maybe work

thorny obsidian
#

I'm thinking of speccing out the Python Trivia night stuff and like... how to do that

clever wraith
#

There we go

#

That worked

thorny obsidian
#

So I guess my question is sort of batching time blocks where I look at which buttons are pressed

#

So like, for the next 5 minutes I will look at which buttons are pressed and make it count towards X. 10 minutes later I do the same thing but it counts towards Y because it's a different question.

vale ibex
#

I'd make each question have a different message with answers

#

rather than reusing buttons

clever wraith
#

Well fuck

thorny obsidian
#

soooo something like
.trivia 2 would start question 2, spit out the question and spawn the buttons with the associated answers?

vale ibex
#

that way you can do ```py
message = await ctx.send("answer:" view=answers_view)
bot.utils.scheduling.create_task(disable_later(message), self.bot.loop)

#

yea

#

after you send the question, create a task to disable the buttons after a defined time

thorny obsidian
#

okay that makes sense. You can just like... spawn a button view to do that, right?

clever wraith
#

Check failed again

vale ibex
#

yea, you'd define a view with the data you need to store, then define the model of a single button

clever wraith
#

Checked pypi API, license is listed

thorny obsidian
#

Okay, cool cool

vale ibex
#

then each command will create a view with a set of buttons

clever wraith
#

Updated and locked for 1.1.1

thorny obsidian
#

Time to scope out how to load in questions and do the answer reveal thing

vale ibex
#

yeaa 😄

#

I'd suggest a list of dicts

#

to store the emssage and answers

#

along with the correct answer

#

then you can use the index to refer to the question itself

thorny obsidian
#

Yeah, I think I'm going to expect the question/answers to be in json format, we can load it in behind the scenes so we never have to commit the questions

vale ibex
#

nicenice

thorny obsidian
#

Okay, a few questions:

  • Can buttons be like... specific to users? So it shows the buttons to everyone, when user A clicks a button it disappears/locks out the buttons but only for user A. User B can still press the buttons.
  • Can you only schedule the buttons to disappear? Can you send a command to force it closed/gone?
  • You can tell who pressed the button right? I feel like that's a given "duh" but wanted to make sure
clever wraith
#

@vocal wolf I found the license problem

#

The license for cowpy is in LICENSE.md, not LICENSE so pip- licenses doesn't find it

vale ibex
#
  1. No, but this could give users the opportunity to change their answer before the time runs out
  2. You could use a command, it would significantly simplify the implementation if we enforce that only 1 question is active at a time, that we we can just store a reference to that message as a self attr, and then just disable the stored one on command
  3. Yes
#

Actually, for 1, we could make it so that after the first interaction, further interactions for that user fail with an ephemeral message

#

but we can't have buttons look different for different users

thorny obsidian
#

okay, but we can do like a "you can't keep changing your answer" type of thing

clever wraith
#

Also, the license isn't listed in metadata

#

So

#

I committed some metadata gore to get it working locally

fallen patrol
#

would be easier to make a whitelist of packages

#

and then pin the version in requirements in case the license changes in the future

vale ibex
clever wraith
#

It looks like he used poetry to upload the package and he doesn't list the license there

#

So I found the problem

gritty wind
#

Which has happened/almost happened before

#

Anyways, since they are willing to fix things, and quickly, I say we get everything fixed upstream then worry about it

vale ibex
#

oh lol

#

oSo I updated the channel IDs to the new values

#

but still getting the error from lance

#

turns out we overwrite them with env vars in prod

#

arthur deployments redeploy sir-lancebot

radiant merlinBOT
#

:white_check_mark: Restarted deployment sir-lancebot in namespace default.

vale ibex
#

deleted the env vars and rebooted, all is well now

vocal wolf
#

all is well

#

all is good

molten perch
#

About Advent of Code.. could someone take a look at sir-lancebot#857? 😄

trail pilot
#

Could someone also take a look at:
sir-lancebot#860?

dusky shoreBOT
trail pilot
#

very close to a merge

#

just one more core dev approval

vocal wolf
#

117 commits holy crap

trail pilot
#

There was a lot of great feedback

#

Oh shoot should I have grouped them in better

vocal wolf
#

I shall test this PR

trail pilot
vocal wolf
#

man I haven't used poetry for a while lol

#

almost forgot how to use it

#

lmao

trail pilot
#

OH also while you're here Xith, this is a bit off topic but how good is CLion for Rust? I think i've seen you use it for rust but i'm not too sure

vocal wolf
#

CLion servers for Rust are really bad sometimes. I'd suggest vscode instead with the rust-analyzer extension.

trail pilot
#

Ah alright

vocal wolf
#

@trail pilot I haven't worked with the new discord ui before. If a user interacts with the dropdown menu, does it only show the changes on their side?

#

Or does everyone see the new embed?

trail pilot
vocal wolf
#

hmmm

trail pilot
#

I wonder if I could just only allow the author to change it

vocal wolf
#

yeah

trail pilot
#

Alright that sounds good, I'll commit that rn

vocal wolf
#

wait

#

but at the same time, what if others want to see information?

trail pilot
#

Hm

vocal wolf
#

I think we should leave it like this for now and see if we need to change it in the future

trail pilot
#

was there anything off putting you noticed with the command

vocal wolf
#

still testing, that's what I just saw right off the bat

#

I really do like these buttons though

trail pilot
vocal wolf
#

In general, that is, but also here. Good idea to use a dropdown.

#

Buttons being a feature in Discord is neat

trail pilot
vocal wolf
#

yep

trail pilot
vocal wolf
#

someone in my old cs club did that on the day of discord.js getting button functionality

#

it was very quick lol

vocal prairie
vocal wolf
#

@trail pilot For the languages embed, should we have a maximum height for amount of languages?

brisk brook
#

I would like if I could run the command for someone

trail pilot
brisk brook
#

Still, only I should be able to change it. But hiding it seems to defeat a bit of the purpose and limits the uses

trail pilot
#

And language names are fairly shor

vocal wolf
#

Yeah I'm not worried about width, just about height.

trail pilot
#

descriptions have a 1024 character limit

vocal wolf
#

but at the same time, the main description embed is sometimes large

trail pilot
vocal wolf
#

right

trail pilot
vocal wolf
#

nope, just going through the code now

green oriole
#

You do a functional test before doing a code review xith?

trail pilot
green oriole
#

Interesting, I like to do the opposite

vocal wolf
#

To see what can be improved about the UI and if I run into any errors so I can include that in the code review/discussion

thorny obsidian
#

Yeah, I always prefer testing the thing before the code review

clever wraith
#

hey all, regarding sir-lancebot#902, it looks like it'll need whitelisting. The license isn't listed in metadata even though it appears to be on the pypi page

dusky shoreBOT
vale ibex
#

we need to wait for that to be fixed upstream

#

we can't merge in something with an unknown license

clever wraith
#

alright

#

but, the package is dead

#

we already know the license

vocal wolf
#

wdym the package is dead?

#

the author updated it a couple hours ago

clever wraith
#

or well, inactive

vale ibex
#

We don't though, since there are two licenses in the repo

#

once that is compatible with our project, and one that isn't

clever wraith
#

are they not both compatible though?

vale ibex
#

afaik Apache 2.0 isn't?

#

I might be wrong on that

vocal wolf
#

There be a difference between dead and no one seeking improvements

vale ibex
#

Yea, Apache 2.0 isn't compatible

clever wraith
#

?

#

im reading it and it looks like it be good

#

Bloody apache

vale ibex
#

The Apache license adds a bunch more requirements to use

clever wraith
#

Lovely

#

I'll open an issue

trail pilot
#

i wonder if you could just use ascii art yourself?

#

try and make your own impl if you wanted to

clever wraith
#

Cowsay is a pain in the ass

vocal wolf
#

@molten perch AoC thingy reviewed.

trail pilot
#

why is the python stdlib kinda inconsistent

#

logging.getLogger uses camelCase

#

yet other things use snake_case

#

ig it's just too hard to go to PEP8 at this point

#

so they keep it as is

thorny obsidian
#

convention and it's old

trail pilot
#

Fair enough

trail pilot
clever wraith
#

Love it when national cs competitions using py 3.x have raw_input() in examples

thorny obsidian
#

It doesn't impact functionality and would affect a lot of codebases for no good reason

brazen charm
brisk brook
trail pilot
#

True

clever wraith
brisk brook
#

That's when they can change it. They probably won't, because that'll be annoying to update.

molten perch
vocal wolf
#

@trail pilot I think we maybe perhaps should squash the challenges PR

trail pilot
#

Cause 117 commits is quite a bit

vocal wolf
#

I can do it from github

#

when merging

trail pilot
#

alright awesome

#

does it look good?

vocal wolf
#

uhhh

#

one change, I have reviewed

#

well technically 3 changes

trail pilot
vocal wolf
#

well

trail pilot
#

I only see log instead of logger

vocal wolf
#

now logger isn't defined

trail pilot
#

Ah yea

#

let me fix that

vocal wolf
#

logger.info on other lines will be wack

trail pilot
#

which I fixed

vocal wolf
#

nice

trail pilot
#

ugh

#

status embed fail

#

in the future should I group my commits?

#

I think I committed too many times lol

vocal wolf
trail pilot
#

It says "status embed fail" from time to time

#

oh nvm

#

it succeeded

vocal wolf
#

the workflow?

trail pilot
#

Yep

vocal wolf
#

yeah it does that

#

lol

trail pilot
#

@brisk brook also, thank you so so so much for all the reviews you did with the challenges PR. You were very thorough and you are an amazing reviewer

#

and the Hangman PR too

#

I just realized i requested the review at the same time Xith approved already, oops

vocal wolf
#

heh

trail pilot
#

also if it isn't too much effort, would you mind marking in #changelog when it's merged? though to be fair you've been reviewing for quite a bit so feel free to do it when you're fine with doing so

vocal wolf
#

oh yeah I was already thinking of how many mentions I'm going to do lol

#

alright it's merged, time to see if it connects and doesn't die

#

I don't know who "tooboredtocode" is on discord, though

green oriole
#

Woo woo, challenge command!

trail pilot
vocal wolf
#

ah

#

ty

trail pilot
#

no problemo

vocal wolf
#

.help challenge

dusky shoreBOT
#
Command Help

**```
.challenge [language=python] [query]

**Can also use:** `kata`

*The challenge command pulls a random kata (challenge) from codewars.com.

The different ways to use this command are:
`.challenge <language>` - Pulls a random challenge within that language's scope.
`.challenge <language> <difficulty>` - The difficulty can be from 1-8,
1 being the hardest, 8 being the easiest. This pulls a random challenge within that difficulty & language.
`.challenge <language> <query>` - Pulls a random challenge with the query provided under the language
`.challenge <language> <query>, <difficulty>` - Pulls a random challenge with the query provided,
under that difficulty within the language's scope.*
trail pilot
#

:D

#

Thanks to everyone who helped out with this PR!

thorny obsidian
#

So for Python Trivia Night no database storage is needed. You just need to be able to accept a json file and convert it into a list of dicts or something similar

trail pilot
#

I think I can already imagine how it would work

#

just trivianight as a group

#

and then a few subcommands

thorny obsidian
#

mhm! I think the only parts that may require some more thought is the scoreboard calculation.

Also the # is just a placeholder, it would be a specific number

#

so like .trivianight 3 would pull up the third question

trail pilot
#

could I edit the functionality a bit to do .trivianight question 3?

#

so I can keep it organized as subcommands

vocal wolf
#

who's onerandomusername again? I keep forgetting

trail pilot
thorny obsidian
#

aru / arl

summer garden
#

How does one set up their environment to be able to contribute to lancebot? I've been wrestling with poetry for a little while. Do i need docker?

vocal wolf
#

ty

trail pilot
#

!contributor

trail pilot
#

Oh the tag in't added yet

thorny obsidian
#

oh yeah... I should do that contribute tag

#

What parts of setting it up for lancebot are you having trouble with?

summer garden
#

Pycharm isn't recognizing the poetry command yet I've added it to my env path

vocal wolf
thorny obsidian
#

hmmmmm, which one of the core devs/regular contributors uses PyCharm a lot...

fallen patrol
green oriole
#

I use intellij lol

vocal wolf
summer garden
#

It seems to work in cmd prompt and powershell but not in any of the pycharm terminals

fallen patrol
#

Well okay, but it's definitely a random username

vocal prairie
#

I think Scale uses PyCharm as well

fallen patrol
#

Ye

trim cradle
vocal wolf
#

a wa

trim cradle
#

A qwa!

vocal wolf
#

You use PyCharm, yeah?

trim cradle
#

Yes

clever wraith
thorny obsidian
# trail pilot so I can keep it organized as subcommands

oh yeah feel free. I am not married at all to my suggestions, I just put there as a starting off point so people can get a solid idea of what I'm after. So feel free to adjust to what makes sense.

Also bug me if you have any questions about how it should function and what not.

vocal wolf
#

People have questions me thinks

summer garden
# trim cradle Yes

Could you give me a hand with setting up poetry with pycharm? It's not being recognized by the terminal

trim cradle
#

My license expires in a few days so I've been hitting up my project leads asking them to buy it for me.

trail pilot
trim cradle
clever wraith
thorny obsidian
trail pilot
#

No problem

#

It was perfect timing lol

summer garden
trail pilot
#

My PR just got finished

trim cradle
clever wraith
#

oh im stupid

#

lmao

trim cradle
#

No I was actually thinking about the coincidence myself.

trim cradle
summer garden
#

Oh gotcha gotcha. Will have a look

trim cradle
#

I'll be back in a few minutes. Doing leg day because can't stop won't stop

summer garden
#

Got it. Thanks a bunch, Stelercus

vale ibex
thorny obsidian
vale ibex
#

Sure

trim cradle
#

@summer garden no problem, just ping me if you have a question

fallen patrol
#

How long are the events

trail pilot
#

Like an estimate

thorny obsidian
#

This one will range between 45 minute - 90 minutes if I had to guess start to finish

thorny obsidian
trail pilot
#

Awesome

#

And what kind of questions?

#

Harder questions about the internals, or easier questions

thorny obsidian
#

No idea! I'm going to be querying staff for some questions and probably the community if necessary

trail pilot
#

Alright, sounds good

#

I'm guessing we won't be able to participate?

#

kron and i

#

Since we're going to be putting the questions into the JSON etc?

clever wraith
#

id assume so

thorny obsidian
#

But the json will look something liiiike:

{
  '1':
    'question': 'sdfsdfs',
    'options':['ad','sfsd', 'sdf', 'hsrhas'],
    'answer': 'sdf' 
}
trail pilot
#

ah alright

vale ibex
#

I guess the questions themselves don't matter so much, more the fact that they will be multiple choice

thorny obsidian
#

You will be able to participate! Part of the magic of my requested implementation is that the json itself won't be committed. It'll be loaded in via command

trail pilot
#

What if we just made placeholder questions and we could still participate if the core dev would be actually adding the questions

vale ibex
#

Ah kat beat me to it

vocal prairie
trail pilot
#

Oh I get it!

#

you just load the json via a command

thorny obsidian
#

Toxic implemented a similar thing for the code jam teams and I liked it a lot

trail pilot
#

.trivianight load

{"hello": 2}

for example?

thorny obsidian
#

mhm or just a straight up file

#

let me seeee if I can find the example

trail pilot
#

The former might be easier because I'm not sure if discord.py will actually catch the file in the message

fallen patrol
clever wraith
thorny obsidian
vocal prairie
#

!src codejam create is Toxic's implementation with CSV

stable mountainBOT
#
Command: codejam create

Create code-jam teams from a CSV file or a link to one, specifying the team names, leaders and members.

Source Code
trail pilot
#

oh that's cool

clever wraith
#

also i assume that command would have to be locked to certain roles @thorny obsidian

trail pilot
#

I have a lot of questions, sorry haha
what does "configured channel" mean?

#

because I'm wondering how we have dropdowns only be native to the user

#

Oh wait it's going to be buttons

#

and dropdowns

thorny obsidian
trail pilot
#

which are specific to users

austere hornet
# trail pilot

It's going to be a specific channel created for the event I would assume

trail pilot
thorny obsidian
#

This will happen in a special channel, or honestly just the channel the thing is started in. It doesn't even need to be configured

trail pilot
#

I'm gonna make something in paint.net so I can understand what's gonna be going on for it

thorny obsidian
clever wraith
#

!codejam create

trail pilot
clever wraith
#

its role locked of course

thorny obsidian
trail pilot
#

I think it oculd just be after one interaction if the user tries again they'll be faced with the epheremal as stated

#

wait what will the second interactoin be more?

#

be for*

thorny obsidian
#

I'll allow people to change their answer once in case they misclicked or misread

austere hornet
sleek steppe
austere hornet
sleek steppe
#

Admin locked

thorny obsidian
#

Yeah, this should be admin + event lead locked

austere hornet
sleek steppe
thorny obsidian
sleek steppe
#

oh ok, it looked like they were talking about the codejam create command

thorny obsidian
#

codejam create I'm fine with keeping admin locked since it can be a lot

trail pilot
#

how does this look for the workflow?

#

it's a bit messy

#

oh i forgot trivianight stop

thorny obsidian
#

I may not want to delete the json entry, I can imagine a scenario where we may want to revisit a question by forcing it

trail pilot
#

ah

#

i can add a visited flag

#

to it

#

maybe the json also has a visited key

thorny obsidian
#

perfect, that'll work

#

Also, if it simplifies it: the .trivianight start doesn't have to create a channel. We can just invoke it in an existing one

trail pilot
#

Ah

#

Ok I think I can understand how this'll work

#

Not as complicated as I originally thought

#

this is probably going to have to be carefully reviewed though, considering one small error might ruin the event as a whole

thorny obsidian
#

OH! Could you also add this command now that I'm thinking about it:
.trivianight list will list out the loaded questions with an indication of which ones have been selected?
Also the .trivianight # for forcing a specific one

#

I'll comment on the issue with this too

trail pilot
timid sentinel
#

writes to trivianight.json- I don't think you should need to be writing to any files, should just be sorted as a dict or w/e, unless I'm misunderstanding something, am sort of jumping in without reading the full context lemon_sweat

trail pilot
thorny obsidian
#

It'll produce a list of the questions that are currently loaded, with an indication of which ones have been used already soooo:
.trivianight list

Q1: "sdfasdfsadf" | :x:
Q2: "dsgaslikdgij" | :checkmark:
Q3: "asdfjk;sidfja;" | :x:
trail pilot
#

because load occurs beore start

#

unless we have start take the json as an argument

#

Wait I think i'm confused

#

The resouces should be lignering around as lnog as the bot is online and the resources are in a global state within the class (class variable in the cog perhaps)

sleek steppe
#

yeah the class variable is fine

trail pilot
#

the cog is only ever ran as a single instance, right?

timid sentinel
#

Well you could just have it as an instance variable on the cog, something like self.questions = ...

trail pilot
#

either way would work

sleek steppe
#

oh yeah that's what I meant, the instance variable

trail pilot
#

also for the trivianight stop, should there be an embed with just the scoreboard or scoreboard and winners

thorny obsidian
#

I'll trust your judgement on that

trail pilot
#

Alright

summer garden
#

how do I go about running lancebot locally for testing?

summer garden
#

Ah i have not. I got distracted setting up poetry. Thanks I'll have a read of this!

austere hornet
#

I was gonna post it too lol

static canyon
stable mountainBOT
#

bot/exts/utilities/challenges.py line 168

color=MAPPING_OF_KYU[int(kata_information["rank"]["name"].replace(" kyu", ""))],```
static canyon
#

I assume you'll want to work on that, but if not then no worries 👍

trail pilot
#

I can make a quick fix now if that's fine

static canyon
#

It's probably better to actually handle that

#

["rank"]["name"] is used in multiple cases, so we should dig deeper into what the root issue is and how to solve it

trail pilot
#

Hmm

#

I don't know why it would be none tho

#

maybe because there is no page?

#

but it just doesn't catch it

static canyon
#

You'd have to debug that 🤷

trail pilot
#

alright, I'll see what I can come up with

#

It got past the page though, that's weird

trail pilot
#

the language I used that raised that error is in beta for codewars.com

#

So the API might not have its rank and what not

static canyon
#

Yeah, that would potentially make sense

trail pilot
#

Should I just entirely take out beta languages?

#

that is infact the reason why

#

These languages are fairly uncommon anyways

#
"beta": [
        "agda", "bf", "cfml", "cobol", "commonlisp", "elm", "erlang", "factor",
        "forth", "fortran", "haxe", "idris", "julia", "nim", "objective-c", "ocaml",
        "pascal", "perl", "powershell", "prolog", "purescript", "r", "raku", "reason", "solidity", "vb.net"
    ]
static canyon
#

Is it possible to just not display the section causing the error?

trail pilot
#

Because it deals with the colors

static canyon
#

Or use a "Unable to retrieve {thing} for languages in BETA mode"

austere hornet
trail pilot
#

I could just check in the very beginning if the language is in beta

#

and send an error embed

#

oh wait

static canyon
#

Imo it's better to keep functionality where possible

trail pilot
#

nvm

#

I see what you're saying

#

Alright working on the change right now and should I just put up a PR for it?

static canyon
#
if name := ...["rank"]["name"]:
    embed_colour = ...  # use name var instead of re-indexing
else:
    embed_colour = ...  # set to default```
static canyon
trail pilot
#

Awesome

#

it works now!

#

difficulty field

static canyon
trail pilot
#

I'll remove the period and do beta

static canyon
static canyon
static canyon
static canyon
#

Then yeah, that looks good with the sight reword I mentioned above

trail pilot
#

Sounds good, sorry for not catching the error earlier!

static canyon
#

(Make sure it still works as expected for non-beta languages)

static canyon
trail pilot
#

Hm, there is another bug that isn't breaking but is still weird

#

.challenge perl only works sometimes

#

Like the website will only load in beta languages at times.. weird

static canyon
#

You're welcome to look into that if you'd like

#

But doesn't seem to be a massive issue

#

(Unless it's like ratelimitting or something)

trail pilot
#

i know the issue I thikn

static canyon
#

Anyway I really should be going to bed.

If you'd like to fix that too in the PR then go ahead (just make sure to mention in the PR) 👍

trail pilot
#

Yeah I can't figure out why it won't work

#

Nvm I know the issue

#

Fixed it!

#

I should not have set the level by random, as that might lead to no katas shown

austere hornet
trail pilot
austere hornet
summer garden
#

regarding sir-lancebot#907, is this simply a case of using a dict.get() with a default value, rather than a []?

dusky shoreBOT
fallen patrol
#

sir-lancebot#908

dusky shoreBOT
short snow
#

another dict.get() issue, if anyone wants to handle, haven't created an issue yet

fallen patrol
#

that seems a little harder to fix, actually

#

looks like it hasn't fetched the latest comic yet

trail pilot
#

Are you allowed to open a PR without an issue? I wanted to open a PR regarding a fix for the .challenge command as it errors out at times

austere hornet
trail pilot
trail pilot
#

i think

trail pilot
#

because sometimes with a beta language the kata will have the rank as none

thorny obsidian
#

You can go ahead, we're just waiting on an admin/core dev to open it via sentry

fallen patrol
#

Ah

trail pilot
#

So should I make the PR?

thorny obsidian
#

Yeah go for it, you can blame me

trail pilot
#

sir-lancebot#909

dusky shoreBOT
trail pilot
#

buttons or a dropdown*

thorny obsidian
#

mmmmm... let's go with buttons. Just to make it more fun

vocal prairie
#

Just from an outside perspective, if there's not more than 5/6 options, I'd like buttons, easier to click

trail pilot
#

Awesome!

#

I always got misled since discord said ephermals only worked for slash commands

#

but turns out it works for buttons too

trail pilot
#

(Sorry for all the questions)

thorny obsidian
#

probably more of a fun and casual event, possibly with a temporary Trivia Night Champion role

#

questions are good!

trail pilot
#

Las tquestion -- how will the scoring work?

#

or will there be a score key in the json?

thorny obsidian
#

greaaaat question. I think for the first iteration all questions are valued the same, so no worries there. I need to have a think about it and figure out a decent scoring system that accounts for questions attempted, questions answered correctly, and maybe even speed

trail pilot
thorny obsidian
#

That'd be neat

trail pilot
#

and speed should also factor in correct answers and the second time you press a button if you do interact again, i presume?

thorny obsidian
#

Yeah, although I'm fine if you want to leave that part out for a future iteration/version

trail pilot
#

I think I could just give it all a shot at one go and any future suggestions could be added in later

#

I don't think speed should be too complicatd

#

complicated

#

just a time.perf_counter()

#

Another question - could I make a folder for the trivianight event? there will be so many views it'll be complicaetd

#

actually nevermind

#

i'll need to keep it in one file

thorny obsidian
#

yup! Probably should have specified this but you can make a trivianight folder under the events/ folder and go nuts

trail pilot
#

the views need to communicate with the scoreboard

#

I may just keep it in one file but have it well documented

thorny obsidian
#

can that be done on the class/instance level and import the relevant files? (I have no idea how views work)

trail pilot
#

Should there be a group chat with you, Kron and I so we don't end up flooding this chat haha

#

Regarding the trivianight event

thorny obsidian
#

nah, that's what this channel is made for so no worries

trail pilot
#

I just wanted to make sure that no one else would get annoyed by all these message

#

s

#

anyways I'm gonna draw out a flowchart

#

something like this

thorny obsidian
#

@vale ibex you are smarter with views than I am, can you take a look at the above?

vocal wolf
#

I don't think I've ever gotten myself as a suggestion for reviewers

thorny obsidian
#

get reviewing!

vocal wolf
#

wrong bot

short snow
#

!remind 22H

stable mountainBOT
#
Missing required argument

content

stable mountainBOT
#
Missing required argument

content

short snow
#

what

#

!remind 22H that and that

stable mountainBOT
#
No problem.

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

short snow
short snow
#

can take up the whole vertical space

short snow
trail pilot
dusky shoreBOT
short snow
#

shouldn't the trivia event be done in DMs? Or people can see each other's answer

#

oh nvm

#

ok the issue sounds fun, "Users will be able to press the buttons to select their answer and should be allowed to change their answer once." does discord have some functionality for this or you are planning to use cache?

trail pilot
#

for that question

short snow
#

bot restarts, whole thing gone 🙃

trail pilot
#

bot won't restart mid event

#

that's a guarantee

thorny obsidian
#

Yeah, I don't need it to persist as long as we can somewhat ensure the bot won't restart mid-event. Which is as simple as "core devs, please don't merge anything on lance for the next 90 minutes"

short snow
#

Hmm alright

#

From the issue i get we first load the questions and then start the event, how about loading the questions in the same command as .trivianight start?

thorny obsidian
#

I want to load the questions in a private channel, but then initialize the event in the channel that will be visible to everyone

#

I want a clear distinction between prepping for it and then actually starting the event

short snow
#

Ah 👍

trail pilot
#

I have a question - is it fine if code is a bit overachieving if it makes accessing it much more easier?

#

I'm implementing __getitem__ and __setitem__ for a scoreboard class for the trivia night so accessing it via across classes is much esaier

thorny obsidian
#

go for it~ This is also a learning/practice opportunity for you

trail pilot
#

since it holds a view and that view holds dictionaries so it would be very long in terms of length to accessing it

#

I think I'm gonna set up a draft PR for the trivia night event if that's fine

short snow
#

This is how I would go about doing this. A class for a "trivia event" would contain the questions list for that particular event. The list would be of a question object.

@dataclass
class Question:
  question: str
  options: set[str]
  answer: str
  # Leaderboard for the particular question
  leaderboard: dict[str]

Where leaderboard is mapping the user discord ID to their points, for points I was thinking of them being relative to the time taken by the user to answer, like 5 sec 100 points, 10 seconds 70 points.

Now buttons, buttons would only be used for questions, the leaderboard would be just listing the first 10 users and others can be seen through a Pastebin link or something, like how AoC happens. On answering a question, the user would be added to the leaderboard of the question - if he got it wrong then 0 points or time relative points (using some formula). So now we can even ensure that they don't respond twice/can change their answer.

The time for the question would be taken when doing next. If the question is passed while running it then we can check if it is done already - if yes ask for confirmation through discord buttons -- if confirmed clear the leaderboard and send the question again.

I am having per question leaderboard here so that it can help to check no changing or double answers and we can have per question leaderboard views like we are having for AoC.

short snow
trail pilot
#

I think for now the first iteration will just have a set # of points for all questions

short snow
#

I didn't get you pithink

trail pilot
#

that will be awarded if the user gets it correct

#

sir-lancebot#910 is up!

This is a draft for now just so that I set it up early on and I don't end up procrastinating making the PR

dusky shoreBOT
short snow
#

ah, but what do you think about the rest

trail pilot
#

I'll show you what I'm thinking for example

#

something like this

short snow
#

Whaat would the question class contain

#

link to the view, link to view the scoreboard?

trail pilot
#

the view should contain the majority of the information, the question class is just sort of an "intercepting" class in the sense that it just abstracts away having to access the view for everythign

#

I finally get to use dunders other than __init__ and __repr__ in prod for once haha

fallen patrol
#

no actually

#

datacenter fire 🥲

plush wedge
#

is there a special tag for hacktober?

#

if so, how do i add it? github isn't letting me add any tags

gritty wind
#

Add a comment on your PR asking for it

#

Non-triagers can’t add tags

brisk brook
gritty wind
#

You are staff

#

Triage here is referring to a permission we have on staff for most of our repos

#

By default you can’t add labels to anything on GitHub yourself

#

Someone with perms needs to

plush wedge
#

Ah

green oriole
#

Hello @trail pilot! I heard you wanted to work on sir-lancebot#912, right?
If so, can you please comment on the issue and ping me back so I can assign you? Thank you!

molten perch
#

Hey! @hardy gorge (sorry for the ping).
What do you think about api#22 , is it fine to start implementing such an endpoint?

dusky shoreBOT
brisk brook
#

Congrats @static canyon

static canyon
#

Thanks! 🎉 ducky_party

#

Congrats to you too 😄

#

You've been doing some great work with all those reviews :p

short snow
#

And congrats bluenix and tizzy

#

btw bluenix i have requested reviews on preserving unloaded cogs and incidents enhacement pr

vale ibex
# trail pilot something like this

I'm not sure they need to be in different files at all, the scoreboard just needs to be a simple command that outputs an embed from a class variable of scores, the question view will be ~10 lines of code and the button view ~50

#

If you take a look at my subscribe PR on bot I have then all in one file and it's alright, I imagine the view and buttons for this will be simpler, since they don't need to self update

#

If it does get too big though, feel free to split out the view and button class into their own models file

static canyon
#

@trail pilot fyi I've linked sir-lancebot#909 to the sentry issue (sir-lancebot#912) and also left a review 👍

Would be great if you can edit your PR message to say "Closes #912" so that the issue will be automatically closed upon PR merge

static canyon
#

Maybe also update the title of the PR to like "Solve GH 912"

vale ibex
#

I've updated the PR description

static canyon
#

TIL I can edit it myself rofl

vale ibex
#

oh lol

#

I've updated the PR title to be more descriptive too

static canyon
#

tyty

short snow
#

Hey @cold island What's the status for bot#1570? Should I wait my PR (#1634) for it or it is gonna take sometime?

dusky shoreBOT
fallen patrol
#

@vale ibex could you uh sir-lancebot#908

dusky shoreBOT
fallen patrol
#

I can't edit it to actually link 907 rn

vale ibex
#

mentioning the issue in the PR description auto-links it 😄

fallen patrol
#

Thanks

#

Ye, I realised I hadn't done that

vale ibex
#

oh, "Closes GH-907" was already there before I edited

#

I just added the solves line

fallen patrol
#

Ah lmao

#

I don't think 907 was actually assigned to me lol

vale ibex
#

wasn't assigned to anyone 😛

fallen patrol
#

Or anyone for that matter ¯\_(ツ)_/¯

#

Ye

vale ibex
#

Yea, doesn't really matter, issue assignments are more useful if the fix is going to take a while, so that two people don't work on the same thing

fallen patrol
#

Yeah

#

I made the edit on github

#

Except because I'm so accustomed to black, I actually made the edit, copied the line, ran it through black, and then pasted it back into github

vale ibex
#

surprised it passed the trailing whitespace check then lol

#

Github loves adding those

fallen patrol
#

I initially had typed ''

#

And not ""

vale ibex
fallen patrol
#

It's unfortunate how bad my coding style is without black

vale ibex
#

hah, I'm the same with my spelling, spellcheck has made it so that I can just spew out words and fix them later

fallen patrol
#

dict.get('thing','' )

vale ibex
#

dict.get(issue, 'body', '')

fallen patrol
#

But with isort and black, I don't have to worry about any of this at all :)

#

No, what I instead do is change the isort and black settings constantly

vale ibex
#

😄

fallen patrol
#

Wish I was kidding

#

I added a second blank like under all of my imports in a pr, so 25+ files edited to add... \n

#

Isort is a very nice tool

brisk brook
#

I love Isort

summer garden
cold island
trail pilot
static canyon
#

I'll take a look shortly 👍

short snow
trail pilot
static canyon
#
        if query is not None and "," in query:
            query_splitted = query.split("," if ", " not in query else ", ")

            if len(query_splitted) > 2:
                raise commands.BadArgument(
                    "There can only be one comma within the query, separating the difficulty and the query itself."
                )

            query, level = query_splitted
            params["q"] = query
            params["r[]"] = f"-{level}"
        elif query is not None and query.isnumeric():
            params["r[]"] = f"-{query}"
        elif query is not None:
            params["q"] = query```I don't particularly like the repeated `query is not None` here. Is there something we can do about that? @trail pilot
trail pilot
#
if query is None:
  pass
elif ...
#

What do you think?

static canyon
#

What do you want to do when query is None?

trail pilot
#

there should be no parameters

static canyon
#

hmm

#
if query is not None:
    if "," in query:
        ...

    elif query.isnumeric():
        ...

    else:
        params["q"] = query```I guess this works
trail pilot
#

Oh wait

#

that does work

brisk brook
#

What do you want to happen if query is None?

static canyon
#

Assuming the else is correct

brisk brook
#

I don't remember, can we return early when this happens?

trail pilot
#

Committed

static canyon
#

You no longer have anything checking against language. Is that intentional?

#

It was originallypy if language and not query: level = f"-{choice([1, 2, 3, 4, 5, 6, 7, 8])}" params["r[]"] = level

trail pilot
#

no langauge and no params would just lead to https://codewars.com/kata/search/(langauge)

static canyon
#

right, okay

#

As long as that's intended

#

By the way it's better to use the imperative for commits

#

So remove instead of removed etc.

#

Have approved, thanks @trail pilot 👍

trail pilot
#

Btw I tested on my end and everything works fine

trail pilot
#

The challenges PR reached to 300 lines with the view included and without it was ~220

vale ibex
#

Yea, you could have the view and button model in a separate file to the commands itself if it makes the file easier to parse

#

and extra 80 lines in a separate class isn't bad though, since they're clearly separated

trail pilot
#

True

vale ibex
#

I don't imagine this to take 80 lines though

trail pilot
#

Though it’s also easier to follow requested changes on my end

vale ibex
#

probably don't even need to subclass view at all

trail pilot
#

Yea, I’m planning on having the bare classes be in different files but the functionality linked in the trivia night cog

trail pilot
#

Or you could just subclass the button itself

vale ibex
#

you can subclass the button sure

#

not sure if the view needs to be subclassed or not

#

you may find it easier to do so to store some question data

#

but that's depending on your implementation

trail pilot
#

Though I can take it out

#

That’s fine with me

vale ibex
#

Yea, I'd suggest subclassing button, rather than using the decorator for this

#

that way you can just define the base behaviour of a button and then init it with the label etc

trail pilot
#

Alright

#

I have to head to school but when I come back I can make the changes and get started on the trivia night cog

vale ibex
#

Yea no worries 🙂

trail pilot
vale ibex
#

no worries, I've recently gone through the struggle of learning the new ui stuff, so it's all fresh in my head 😛

trail pilot
#

The UI is pretty amazing honestly

#

So many different features

vale ibex
#

yea it's nice

austere hornet
#

Congrats @static canyon and @brisk brook !! I knew it would happen someday py_strong 😋

vocal prairie
#

Congrats @static canyon and @brisk brook!

trail pilot
clever wraith
#

Congrats to @static canyon and @brisk brook on contributor

thorny obsidian
#

@static canyon @cold island thoughts?

green oriole
#

Looks good so far, can we add a sentence at the end saying to ask us in #dev-contrib if they have any question?

thorny obsidian
#

In addition to the "Chait with us in #dev-contrib ..." thing?

green oriole
#

hmm, maybe change it "to ask what to work on" tooo "if you are ready to jump into it or have some questions". Something along the lines of that.

static canyon
static canyon
green oriole
#

@vale ibex use the magic label!

vale ibex
#

lol I was in the process of adding the labels 😂

green oriole
#

Hah

green oriole
green oriole
#

Dude, don't get me scared like that

#

It is MIT

vale ibex
#

the precommit is yea

#

you added flake8-isort tho

#

!pypi flake8-isort

stable mountainBOT
brazen charm
#

we're using it as a tool, the license should be irrelevant

green oriole
#

Right

#

The precommit is also MIT

#

We can yeet the flake8 plugin

vale ibex
#

Yea, what Numerlor says is true though,

#

Maybe we ignore dev deps in the linter?

#

Since they never ship

green oriole
#

Eh, I would rather not take any chance and just remove it

#

The precommit is already checking for it

vale ibex
#

Does isort also remove the need for import order?

green oriole
#

Yup

#

Since the CI will fail if any hook modifies any file

vale ibex
#

cool, we could remove that then

green oriole
#

Besides the two of them aren't compatible

vale ibex
#

oh, you did

green oriole
#

Import order is already removed, yeah

vale ibex
#

The package can be useful during dev for your ide to warn you