#development

1 messages · Page 1997 of 1

quartz kindle
#

i mean

#

my personal laptop is mid range

#

but my production servers and shit are all low end

lament rock
#

I'm assuming they get by with quite the headroom?

quartz kindle
#

yeah not nearly close to maxing them out

#

im moving to a 2gb 2core vps soon tho

lament rock
#

from?

quartz kindle
#

1gb 1core

lament rock
#

legendary

quartz kindle
#

well my stuff isnt that big either

#

ever since top.gg got rid of certified section my bot has been permastuck at 9.5k guilds

#

lmao

lament rock
#

rip

craggy pine
#

It do be like that kittyCrying

lament rock
#

9.5k is still really respectable

#

if you can contain that in 1GB, hats off to you

quartz kindle
craggy pine
#

Flat line

#

They ded

lament rock
quartz kindle
#

compared to last year

craggy pine
#

Cert front page definitely was nice.

lament rock
#

3k in a year OhINep

quartz kindle
boreal iron
quartz kindle
lament rock
#

that is insane

quartz kindle
#

which basically means

lyric mountain
#

steady

quartz kindle
#

most of my bot's servers are not organic

#

and probably useless

#

lmao

lyric mountain
#

for servers also steady except for 01/03

#

we don't talk about 01/03

quartz kindle
#

dafuq

sudden geyser
#

one minute breakup

lament rock
#

rip shard 0

quartz kindle
solemn latch
#

cacheless 👀

lament rock
quartz kindle
#

still running on djs v12 lmao

lament rock
#

too bad that'll be dead soon

quartz kindle
#

yup

#

april 30 will kill it

#

if i dont finish this damn rework

lament rock
#

AmandaDiscord/ThunderStorm
amandasunglasses

quartz kindle
#

tiny-discord :^)

lament rock
#

fair

boreal iron
#

still don't trust Tims software

lament rock
#

bro his gateway code is 🪄

quartz kindle
#

i guess its good enough for people to rip it off :^)

lament rock
#

I asked for consent D:

quartz kindle
#

xD

craggy pine
# quartz kindle xD

You wouldn’t happen to have experience in rotating ipv6 blocks would ya? Using a package which idk if I can talk about since technically again tos but ig its to prevent ratelimiting. It works, tho it just errors on binding. #development message

quartz kindle
#

thats useless for discord ratelimits, or are you talking about another service?

craggy pine
#

Another.

earnest phoenix
#

star the message right below that link

quartz kindle
#

welp, i never used rotating ips

#

whats the lib?

craggy pine
#

Dmd incase a moddum doesn’t want me talking about a again tos lib

quartz kindle
craggy pine
#

Atleast i have not successfully had an ip bind yet after 20ish attempts

#

Its a /48 block btw

quartz kindle
#

well i have no idea, but it sounds like a linux / ipv6 configuration issue

#

does it work if you try to run some random server on one of the ips?

craggy pine
#

I wouldn’t know that one tbh since im running it off of a friends server and he says it should be configured correctly he thinks. He uses he-ipv6

quartz kindle
#

try binding a server to one of the ips

craggy pine
#

Ill let him know.

quartz kindle
#

for example http.createServer().listen(port, one_of_the_ips_here)

craggy pine
#

If you have a ipv6 tunnel and ever wana give it a try for testing sake lemmy know as i hope its just an issue with their lib since that code was implemented just 3 days ago lol

#

But well mess around with it some more and try your suggestions

timber fractal
#

im using node-fetch, and i want to catch an error when it occurs, so it doesnt crash my bot, but whatever i try, catch(), try {} catch {}, it crashes my bot and exits the process when the page isnt json. How can i prevent that, and instead catch the error and preventing my bot from crashing and exiting the process?
code ```js
try {
response = await fetch(https://www.mentalfloss.com/api/facts)
} catch (e) {
functions.err(An error occured while trying to fetch a fact from the API., e);

        return client.user.setActivity(`The facts API doesn't work :sob:`, {
            type: type
        });
    }```

error node_modules\node-fetch\lib\index.js:273 return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json')); ^ FetchError: invalid json response body at https://www.mentalfloss.com/api/facts reason: Unexpected token < in JSON at position 5 at C:\Users\Luckie\Desktop\discordbots\crazyclown\node_modules\node-fetch\lib\index.js:273:32 at processTicksAndRejections (node:internal/process/task_queues:96:5) at async status (C:\Users\Luckie\Desktop\discordbots\crazyclown\index.js:78:22) { type: 'invalid-json' }

lyric mountain
timber fractal
lyric mountain
#

.catch(...) after fetch

timber fractal
#

didnt work

#

that still gave the error and exited the process

lyric mountain
#

also since the error says "unexpected <" youre very likely fetching from the wrong url

lyric mountain
timber fractal
timber fractal
# lyric mountain show the error
                                return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));
                                                           ^
FetchError: invalid json response body at https://www.mentalfloss.com/api/facts reason: Unexpected token < in JSON at position 5
    at C:\Users\Luckie\Desktop\discordbots\crazyclown\node_modules\node-fetch\lib\index.js:273:32
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async status (C:\Users\Luckie\Desktop\discordbots\crazyclown\index.js:78:22) {
  type: 'invalid-json'
}``` the same error
lyric mountain
#

show how u did

timber fractal
#

similair to this one ```js
const data = await fetch(https://api.popcat.xyz/chatbot?msg=${encodeURIComponent(message.content)}&owner=Crab+Developments&botname=Crazy+Clown).catch((e) => {
message.reply({
content: :ccCross: An unexpected error occured while trying to fetch a chatbot response. The developers have been notified.
});

        return functions.err('An unexpected error occured while trying to fetch a chatbot response.', e);
    });```
lyric mountain
#

I mean, show that part

#

also, what does functions.err do?

timber fractal
#

dang it im dumb

#

wait no that cant cause it

lyric mountain
#

if it throws an exception, it can

timber fractal
#

actually maybe it can

#

let me test it without that thing

#

nope does the same

response = await fetch(`https://www.mentalfloss.com/api/facts`).catch((e) => {console.log(e)})```
quartz kindle
#

what is index.js line 78?

lyric mountain
#

inside node-fetch

quartz kindle
#

no

#

crazyclown\index.js:78

lyric mountain
#

oh nvm

timber fractal
#
const activities = [
            `LISTENING:`,
            `PLAYING:`,
            `WATCHING:`
        ];

        let type = activities[Math.floor(Math.random() * activities.length)];

        const response = await fetch(`https://www.mentalfloss.com/api/facts`).catch((e) => {console.log(e)})


        const data = await response.json();

        const index = type + data[0].headline || data[0].shortHeadline || data[1].headline || data[1].shortHeadline;

        const regEx =  /(<([^>]+)>)/ig;

        if(index.match(regEx)) {
            await index.replace(regEx, "");
        }
        console.log(index); //Remove after test.```
quartz kindle
#

i think you changed something, so the error is no longer on line 78

timber fractal
quartz kindle
#

anyway the proper way to do what you want is like this:

timber fractal
#

oh waiit ofc it was this line ```js

    const data = await response.json();```
lyric mountain
#

now that explains everything

timber fractal
#

cause i looked in the node-fetch/index.js where the error occured and it was in the .json() function

#

:))))

quartz kindle
#
let data;
try {
    const response = await fetch(`https://www.mentalfloss.com/api/facts`);
    data = await response.json();
} catch(e) {
  console.log(e)
  // do something
  return;
}
timber fractal
#

thank you

quartz kindle
#

or you can do ```js
let data;
try {
data = await fetch(https://www.mentalfloss.com/api/facts).then(x => x.json());
} catch(e) {
console.log(e)
// do something
return;
}

lyric mountain
#

in this case, putting .catch() would reduce it to a one-liner no?

quartz kindle
#

or you can do ```js
const data = await fetch(https://www.mentalfloss.com/api/facts).then(x => x.json()).catch(console.log);
if(!data) {
// do something
return;
}

timber fractal
#

i like the first solution

#

and i hate apis going down

quartz kindle
#

xD

timber fractal
#

anyone has a nice facts api?

timber fractal
earnest phoenix
#

It's also paid nvm troll

timber fractal
boreal iron
#

Can I actually get a Discord user ID based of the topgg user ID?

#

ahh nope I can not

split hazel
#

why did they even change that anyways

#

oh right probably because they're moving away from discord

sudden geyser
#

why to daos and nfts americanjoke

split hazel
#

mfs predicting discord will fuck them over one day

sudden geyser
#

like they haven't already

boreal iron
#

why tf is my user ID on the page my discord ID then?!

split hazel
#

basing your business on another business is really risky i noticed

#

sure you get people immediately but at a massive risk

sudden geyser
#

well everyone who does that knows that

#

e.g. any mobile app

#

it is snowing here as well

craggy pine
#

Lmao I totally pocket sent a picture

split hazel
#

bro whenever i go into the djs server to get help i immediately feel a negative atmosphere 💀

modest maple
#

That feeling doesnt go away

#

that's the majority of bot communities

#

because realistically most people around them don't know anything, and have just been brought up with the whole negative atmosphere so it's just a cycle of people shitting on each other while equally knowing just as little

boreal iron
#

Anybody here being familiar with Twitter API? Limits etc.?
I would need to get ~85k posts of a Twitter account in a reasonable time.

lyric mountain
#

idk what's worse, that someone did post 85k posts or that you need to fetch em

boreal iron
#

yeah it's a more or less offical source of game bans, I need to add them to my database and fetch the account every few mins

boreal iron
lyric mountain
#

understandable

sudden geyser
#

87k is fairly moderate for twitter

boreal iron
#

so somebody here already having API access and wanna catch the posts for me? I'm ok with a simple txt file containing the message content

#

(which is just an URL)

#

@quartz kindle You wanna earn a few bucks doing something for me?

quartz kindle
#

wut

boreal iron
#

I would need to get ~85k posts of a Twitter account in a reasonable time.

lyric mountain
boreal iron
#

just fetching them for, providing the tweet content for me in a txt file, or CSV or whatever

sudden geyser
#

I mean, I'm seeing people with 20k, 40k, 57k, etc. on the platform

#

how many posts per day does that translate to for that individual

boreal iron
#

FakE's gonna pay money as I have no time to do that shit myself or any intentation to register on twitter

lyric mountain
#

let's see

#

I'll consider 1y

neat ingot
#

anyone see any downside/flaw to this?

lyric mountain
neat ingot
lyric mountain
#

156 posts per day

#

at 57k total posts

sudden geyser
#

yes now let's say 12 instead

lyric mountain
#

12 years?

sudden geyser
#

ye

boreal iron
#

Oh errrr I was wrong about the tweet count

lyric mountain
boreal iron
#

That's more accurate

lyric mountain
#

13 per day

sudden geyser
#

yikes

boreal iron
#

since may 2015

sudden geyser
#

that's a tweet every 2 hours

lyric mountain
#

looks more plausible, but tf 13 per day

boreal iron
#

every few mins

lyric mountain
boreal iron
#

yeah I was missing a 0

lyric mountain
#

ik, but 800k is a lot

#

ik it's a bot but still

quartz kindle
boreal iron
#

SOOoooo... you're motivated to earn some cash?

#

shouldn't be a big deal to fetch all user tweets and throw the content into a file

lyric mountain
#

a big file

boreal iron
#

yeah no motivation for it?

lyric mountain
#

nah, I'll pass

boreal iron
#

...too lazy to earn money, my gosh

quartz kindle
neat ingot
boreal iron
quartz kindle
boreal iron
#

me either

quartz kindle
#

im a 9gagger

split hazel
boreal iron
#

you probably mean 9*chan

quartz kindle
#

btw i take back what i said about my fts solution

#

sqlite fts5 is a billion times better

#

im just gonna compile all my data into an sqlite db file

#

the only drawback is that the file size is 5x bigger

#

but i'll taake 0.2ms queries over 10ms queries anyday

sudden geyser
#

@boreal iron why not just apply to the research program and say it's for some science project

boreal iron
#

...

split hazel
#

im guessing they actually have proper checks in place because they wouldnt just make an application for fuckers to lie and get access

#

like university ID verification and proof etc

#

i'll have a look

boreal iron
#

yeah that's getting a little bit tricky to fake

neat ingot
#

i guess that depends on your budget 😄

boreal iron
#

guess I will have to take some student as hostage

neat ingot
#

thats the spirit!

split hazel
#

anyone with docker experience know the minimum amount of RAM you can get away with running a linux container?

#

or even easier the amount of ram a barebone linux container uses

modest maple
#

not alot

neat ingot
#

average node js container uses about that

#

uses more for discord bot obviously

#

node js uses some basic linux stuff, so a barebones linux should be even smaller

#

debian stuff it uses

split hazel
#

the kind of figure i was looking for (ram doesnt grow on trees 😢)

marble juniper
#

I thought it did

boreal iron
#

I'm sure you can get some when paying for emojis

lyric mountain
boreal iron
#

omg imagine all the greenpeace retards crying about the wood

wheat mesa
#

I think you've been proven wrong

split hazel
#

turns out its just a tutorial showing you how to configure swap

wheat mesa
#

nope it's downloading more ram

quartz kindle
#

fuck

#

sqlite's fts5 only has a trigram tokenizer

#

i need an ngram tokenizer with minimum 2 chars

boreal iron
#

Yeah I need to fetch 800k Twitter posts

#

We can’t always get what we want Tim

modest maple
#

2 char ngram is gonna produce a metric fuck ton of terms

#

And also probably gonna hurt perf quite a bit because of that

quartz kindle
modest maple
#

? You mean like alias names or what?

quartz kindle
#

i want full text search

#

with partial matching

#

for example if the person searches for eri it will return Eris and Amneris and eveyrthing that contains that term

modest maple
#

Oof

#

Yeah ngl that is gonna suck to work with

quartz kindle
#

trigram is perfect for my needs, but then searching for Io returns nothing

#

elasticsearch has a configurable ngram tokenizer where you can configure minimum and maximum chars

boreal iron
#

Setup a damn database

quartz kindle
#

sqlite doesnt

modest maple
#

I mean yeah

#

You could use tantivy if you're willing to use rust and want something embedded

#

It'll also give you much better performance over ES and Sqlite

#

There's also Pisa but that's intermittently maintained and cpp

#

Do you care much about the order of results i.e do you care much about the relevancy?

quartz kindle
#

i can order the resulting subset myself with levenshtein

modest maple
#

That'd be pretty expensive to do

quartz kindle
#

still better than nothing

modest maple
#

Amneris would have an edit distance of 4+ which is insane distance levels

quartz kindle
#

but the subset is much smaller

modest maple
#

Sure

quartz kindle
#

searching for eris in 500k asteroids returns 6 results

modest maple
#

Or you could do semantic search perhaps with a BERT model of some sort

#

That might produce more relevant results

rigid maple
#

how can i solve this error?

quartz kindle
#

sqlite is good because i can offload most of it to disk

#

and as long as it gives me sub-millisecond performance its fine

modest maple
#

XD

#

I mean tantivy will do that for you

#

But the JS bindings aren't maintained anymore iirc

quartz kindle
modest maple
#

Tantivy use a segmented index like lucene

#

So everything can run on disk

#

It's quite happy to use < 5MB ram if needed

#

But generally you just use the MMap backend and let the OS decide what to do about caching

#

But it will store everything on disk

quartz kindle
#

and persist for next run?

modest maple
#

Yes

quartz kindle
#

nice

#

i'll look into it

modest maple
#

It's what powers the backbone of my lnx search project

quartz kindle
#

im also looking at a custom tokenizer for sqlite

#

let see how it goes

modest maple
#

Yeah that'd work

#

Although not sure if sqlite would give sub ms perf on 2 char ngrams

quartz kindle
#

trigram gives me 0.2ms

modest maple
#

Yeah but trigrams are very diffrent to ngrams

quartz kindle
#

if only there was some sort of fallback with regular indexing

#

i could try making a separate table for all 2char entries and use a normal index lmao

#

actually i might just do that xD

modest maple
#

In sqlites case a trigram tokenizer will split into 3 word tokens generally where n tokens = len_text / 3, with ngrams you produce every possible combination between the character length ranges

#

So the amount of tokens you produces tends to be exponential and/or quadratic

quartz kindle
#

i guess id need to make a custom tokenizer that only does 1-2 char grams for the first 1-2 chars of each word

#

and trigram for the rest of the word

modest maple
#

Do you only care about the prefix matching in that case?

#

I.e if i out Io would i expect to see ioo and not oio

quartz kindle
#

yeah not sure, but right now not finding Io at all is a bigger issue

#

with 3 chars people can just specify further if it doesnt show up

modest maple
#

Mmm

#

In that case

#

Maybe consider maintaining a seperate tri structure for doing prefix lookups? And then just add them onto your query so they match and/or just append them to the results?

#

And then when you start the system up just rebuild based off of the data in the db

quartz kindle
#

its a possibility

modest maple
#

In terms of the structure you'd use

#

It'd also be alot more efficient search wise

quartz kindle
#

interesting

marble juniper
#

Me when

#

Today we’re excited to announce our support and collaboration on a new Stage 0 proposal to bring optional and erasable type syntax to JavaScript. Because this new syntax wouldn’t change how surrounding code runs, it would effectively act as comments. We think this has the potential to make TypeScript easier and faster to use for development at e...

sudden geyser
#

like python's typing API but without the runtime inspection

quartz kindle
#

now lets see if using these indexes directly with joins will be as fast as the fts5 plugin

simple stump
#

If I have an integer like this:

172800

How would I convert this to 2 days?

Ex.

x = 2 * 60 * 60 * 24
wheat mesa
#

You would divide it...?

#

172800 / (2 * 60 * 60 * 24)

#

Unless that’s not what you’re asking, in which case I don’t understand what you’re asking for

prime cliff
#

vibecat got a nice basic ban appeal system working

sudden geyser
#

-1000000 social credits
your execution date is tomorrow

dry imp
#

ching cheng hanji moment

fiery stream
prime cliff
#

@fiery stream it'a only functional and buggy atm but definitely gonna improve it a lot ChocolaHehe

#

I plan to add different types of bans too not just servers

prime cliff
#

A user

#

Lemme show

#

The user can submit an appeal with discord oauth with optional email notifications and will access that chat with other staff to discuss or appeal/deny with realtime messages

fiery stream
#

How does email notifications works you pay for the domain or like how

#

I remember this module it did for free or was api ion remember

prime cliff
#

I actually have it integrated with gmail using custom domain and no gsuite

fiery stream
#

I see

#

Twilio prolly got something for that too

earnest phoenix
sacred aurora
#

Does anyone have any experience with virtual host in apache?

#

so i have a folder for each user user1-user100
And i want to access it from a subdomain like www1-www100

#

How can do that

earnest phoenix
prime cliff
#

🙃 partly

#

Advanced mod bot with dashboard

earnest phoenix
#

Dash looks cool

prime cliff
#

Thx been working on it a lot

#

Some very useful features too like server suggestions, tags with its own prefix, message filters with rules for blocking ip grabbers, bitly links, ect

next cairn
#

Can anyone here guide me through slash commands?

drifting coral
#

Py?

next cairn
#

I've been at this for three hours

#

js

drifting coral
#

Idk then

next cairn
#

aw

#

I've been trying everything I can find from the internet but nothing is working

#

I'm going to stop for today cause my back hurts sitting here.

glad sleet
#

hi

rocky hearth
#

how do I give different roundness to an element at top and bottom?

earnest phoenix
#

Which api should i use then?

wheat mesa
#

Use the top.gg official node sdk

tulip ledge
earnest phoenix
#

does it go top left bottom right or top right bottom left

tulip ledge
#

Top left right bottom right left iirc

prime cliff
slender thistle
marble juniper
#

Cool

bright hornet
#

I have button paginator, but how can I make it disable after the setinterval?

#
col.on('collect', async (button) => {
        await button.deferUpdate()
        if(button.user.id !== message.author.id) return;
        if(button.customId == '00001') {
            page = page > 0 ? --page : pages.length - 1
        } else if(button.customId == '00002') {
            page = page + 1 < pages.length ? ++page : 0;
        }

        curPage.edit({ embeds: [pages[page]], components: [row]})

        setInterval(() => {
            curPage.edit({embeds: [page[page]], components: [deadRow.setDisabled(true)]})
        }, 5000)
    })``` not working
feral aspen
#

What exactly is database indexing, and an example in discord.js, I suppose?

split hazel
# feral aspen What exactly is database indexing, **and an example in discord.js, I suppose**?

database indexing is like a book index, you can tell the database to index a specific column (for example the ID field) it tells the database that that column will likely receive a lot of lookups and so it should pay extra attention when caching it

An example would be a modlog, you lookup users by their ID but if you had a lot of modlogs, that lookup would start to get slow since the database has to manually find the records

With indexing it can quickly locate those records and return them to you (usually in sub millisecond times) at the cost of some extra memory usage

you have to be wise and to index fields you only need to index otherwise this can result in a lot of memory usage and potentially worse performance

feral aspen
#

I appreciate it a lot!!

#

I need to learn how to apply that with MongoDB, or is that not possible, supposedly?

split hazel
#

what driver are you using?

feral aspen
#

Driver?

bright hornet
#
 setTimeout(function() {
            row.components[0].setDisabled(true);
            row.components[1].setDisabled(true);
            curPage.edit({ embeds: [pages[page]], components: [row]})
        }, 15000)``` I've made a command that using a paginator, I wanted to activate the `setTimeout` only when the command is inactive, how do i do it?
earnest phoenix
feral aspen
#

mongoose package.

earnest phoenix
#

@split hazel does mongoose have indexing

split hazel
#

it does just need to pull up an example in a sec unless anyone beats me to it

rocky hearth
#

how do u open the devtools in discord mac app?

split hazel
#

There are different types of indexes but one for a unique column (which is probably the only one you'll really use) is

const User = new Schema({ user_id: { type: String, index: { unique: true } } })
#

something like that @feral aspen

modest maple
#

You can also just use the _id field so mongo uses the user id as the pk field

feral aspen
#

The index: property.

bright hornet
#
 setTimeout(function() {
            row.components[0].setDisabled(true);
            row.components[1].setDisabled(true);
            curPage.edit({ embeds: [pages[page]], components: [row]})
        }, 15000)``` so i used timeout but how can i set it when the button is inactive?
fiery stream
#

Hi

earnest phoenix
bright hornet
#

ah thanks thanks

bright hornet
#

I read the docs about two functions

#

oh wait

#

i just stopped the settimeout

earnest phoenix
#

That clears the timeout instantly, you must do a few checks before clearing it, for example:

// Set a map of timeouts to get and track them easily.
const timeouts = new Map();

client.on('interactionCreate', async (interaction) => {
  // In your case, check if it's a button interaction.
  if (interaction.isButton()) {
    // Check if the button details match the one you want.
    if (interaction.customId === 'something') {
      // Construct a unique ID.
      const id = `${interaction.guild.id}_${interaction.channel.id}_${interaction.message.id}`;

      // check if the timeout already exists.
      const timeout = timeouts.get(id);

      if (timeout !== undefined) {
        // If the timeout already exists, clear it and set a new one later.
        clearTimeout(timeout);

        // Reset timeout.
        timeouts.delete(id);
        timeouts.set(id, setTimeout(...));
      } else
        // If the timeout doesn't exist, then set it.
        timeouts.set(id, setTimeout(...));
    }
  }
});

That's basically it

bright hornet
#

ahh

#

thanks thanks

earnest phoenix
#

You can also choose to only store the IDs of the timeouts instead of the whole timeout instance for resource efficiency

#

AKA setTimeout(...)[Symbol.toPrimitive]()

stiff lynx
#

How can I create a channel in a input category in discord.js?

earnest phoenix
rocky hearth
#

does that work for u? on windows?

earnest phoenix
#

Help me! I have disabled this tip in VS Code and don't know how to enable it again.

delicate zephyr
earnest phoenix
#

may i ask why

delicate zephyr
delicate zephyr
earnest phoenix
#

interesting use case

delicate zephyr
#

np

spark flint
earnest phoenix
#

BUN CHAN FTW

spark flint
#

YES

#

IKR

hushed patrol
#

how can i add a button to a div if the user's id = to owner id

#

ik how to see if user's id = to owner

#

but how to add button

cinder patio
#

Are you using a frontend framework?

#

like React, vue etc

hushed patrol
#

ejs

hushed patrol
sick agate
#

not really

#

its a templating engine

hushed patrol
#

hm

#

i just wanna know how to add a button to a div

sick agate
#

??????

#

do it in the way that you do in raw html

hushed patrol
#

hmmm

spark flint
#
<% if (<object>.id == "ownerid") { %>
  // button stuff goes here
<% }) %>```
modest maple
#

yikes

#

that is not a great way to do templating

#

but sure

spark flint
#

it works

#

so

spark flint
#

happy birthday @quartz kindle

stiff lynx
#

How can I create a channel in a specified category?

warped turtle
stiff lynx
warped turtle
#

Dang I only know python

#

🥺

stiff lynx
sudden geyser
#

Use <Guild>.channels.create(..., { parent: ... })

#

The first ... is the name of the channel, and the second ... is the category you want to create the channel in, which has to either be a CategoryChannel instance in Discord.js or its ID as a string.

#

For example, guild.channels.create("party", { parent: "1234567890123456789" });

stiff lynx
#

ty Klay

sudden geyser
stiff lynx
#

I would like to send a message to the channel right after I create it, should I await the create(), then send to it?

sudden geyser
#

Yes, then call .send on it.

#

Though make sure you have a resolved instance, rather than a promised instance.

stiff lynx
#
let newChannel = await partnerServer.channels.create(`${nomeCanale}`, {
          parent: idCategoria,
        });

        newChannel.send({ content: `${messaggioPartner}` });```
#

something like this?

#

yup, worked, ty again

earnest phoenix
#

Does the one pixel in a <canvas> represent one pixel of the screen or does it scale like svg does?

quartz kindle
#

yes, once pixel is one pixel

earnest phoenix
#

of the screen?

hybrid cargo
#

Tim dead

quartz kindle
#

how the screen shows one pixel depends on screen size, resolution, zoom, etc

earnest phoenix
#

in svg the viewbox defines how many pixels are in the original image then css defines the rendered size of the element

#

is there a way to do something similar with canvas?

quartz kindle
#

canvas is raster graphics, there are only pixels, nothing else

#

you can either zoom the canvas element or increase the resolution of the canvas

#

svg is vector graphics, not pixels

earnest phoenix
#

so i have to animate an svg now to get responsiveness 😔

quartz kindle
#

it defines shapes and paths

#

shapes and paths and be scaled infinitely because they are just instructions for what/how to draw

hushed patrol
earnest phoenix
spark flint
earnest phoenix
#

that can be done in svg right

spark flint
#

you put html inside that

quartz kindle
#

yes

#

svg scales very well with size, canvas doesnt

#

canvas scales well with graphic complexity, but not with size

hushed patrol
spark flint
#
<div>
  <button>whatever idk</button>
</div>```
#

inside the bit i sent before

hushed patrol
#

but i already have the div i wanna add a button to it not create a new div

hushed patrol
sick agate
#

please learn html and yes

cinder patio
#
<div>
<% if (id === 'ownerId') { %>
//add a button to a div but how?
<% } %>
</div>
woeful pike
#

step 1: uninstall ejs

spark flint
woeful pike
#

god I love me some <% } %>

tulip ledge
#

React > ejs

spark flint
#

I'm looking into moving away from ejs

#

trying react

earnest phoenix
#

@quartz kindle happy birthday

quartz kindle
#

ty

cinder patio
#

react is so much more than ejs

earnest phoenix
woeful pike
#

learn whatever you want

#

as long as it's not ejs

cinder patio
#

just use template literals like a pro

fair axle
#
export default {
  "name": "ping",
  "test": this.name
}
Cannot read properties of undefined (reading "name")
#

How can I solve this problem?

cinder patio
#

this refers to the global this in this case

fair axle
#

so, how can I get the value of "name" key?

#

@cinder patio

cinder patio
#

you can't

fair axle
#

It has to be a way of doing this

quartz kindle
#

separate it

cinder patio
#

well, you could do this instead, which is pretty much the same:

export const name = "ping";
export const test = name;
#

not exactly the same as there's still no default export but still

quartz kindle
#

export default { name, test }

cinder patio
#

or

const name = "ping";
const test = name;

export default { name, test }
fair axle
#

Thank you

quartz kindle
# modest maple lets see indeed

well that was a disaster, i gave up once the table grew past 10x the size of the fts5 table and still didnt finish generating

#

i might just go with 2 tables then, one using prefix and the other using trigram

#

doing a UNION query on these two tables still gives me sub-millisecond performance for most queries

signal summit
#

I need small help with css
Please tell me how can i align this image exactly in the middle?

#

It's supposed to be responsive depending on the screen size

lyric mountain
#

also, ur text aint in the middle too

signal summit
lyric mountain
#

bro tip: use F12 -> Elements and change css there

#

you'll see it being applied in realtime

earnest phoenix
lyric mountain
#

align-items aint flexbox

earnest phoenix
#

It is

lyric mountain
#

is it really? a bunch of times I just used it in raw html with no flex mention whatsoever and it worked

signal summit
#

yes im using

    display: flex;
    align-items: center;

for the parent div

earnest phoenix
#

Is it only the image that needs to be centered or do you want the text too?

signal summit
#

Both

#

I mean the image looks more off centered than the image

earnest phoenix
#

flex-direction: column;

#

align-items centers it vertically unless you change the flex direction to column

signal summit
#

That also didn't work 😥
Im supposed to put that in the @media screen rule right?

earnest phoenix
#

lmao no

signal summit
#

NVM I figured it out

#

I screwed up with the max width and width parameters of the img container, ffs

sudden geyser
#

@prime mist just wondering, but what editor do you use

pulsar bone
#

help , this code works only if the first statement is true and gives error in second statement although the code is the same only the parameters are diff and error make no sence

spark flint
spark flint
#

someone will help when they can

pulsar bone
spark flint
sudden geyser
#

No, I pinged the right one

#

Or maybe they left

dry imp
#

oh no that guy again

earnest phoenix
#

@pulsar bone

#

can you like put a normal username

#

@rustic nova change their nick to ultra stinky

rustic nova
#

They get z

lofty bay
#

speaking of nicknames
can i be Peace™
idk just more used to that name

#

ah yes
emoji

rustic nova
#

You're pea now

lofty bay
#

thanks

#

i guess¿

lyric mountain
#

?

boreal iron
#

-meow

sudden geyser
#

purr

spark flint
#

I’m trying to block moderator Academy scam etc, is it worth blocking the phrase “moderator” from usernames?

#

It would be easier than manually doing each name

#

Same with Hype squad

#

i was recommended regex

#
function useRegex(input) {
    let regex = /moderator [a-zA-Z]+/i;
    return regex.test(input);
}```
#

that would work?

cinder patio
#

yes but u could also use just /^moderator/i

lyric mountain
spark flint
#

yeah ik

#

someone made me a better one i need to test

lyric mountain
#
function useRegex(input) {
    let regex = /^mod(erator)?.+/i;
    return regex.test(input);
}
spark flint
#

but then people with mod in their name

lyric mountain
#

this will catch both mod and moderator followed by anything after it

#

there

boreal iron
lyric mountain
#

only if name starts with mod/moderator

#

there

#

no more global flag

boreal iron
#

i flag

lyric mountain
#

what is i btw

cinder patio
#

case insensitive

boreal iron
#

Case insensitive

lyric mountain
#

a

#

good to know

boreal iron
#

Most important for this case

lyric mountain
#

I usually just lowercase the entire test string

#

actually, there are still cases of [MOD], xX MOD and stuff like that

#

so matching inside the string would be better

stiff dust
#

hi i want to create language setup for my bot (just 2 language) what is the best way to do it ?

lyric mountain
#

big i18n files

stiff dust
#

can u explain more ?

lyric mountain
#
name_of_property=Hi my bot works in english
name_of_property_2=Cool ain't it?
name_of_property=Meu bot funciona em português
name_of_property_2=Legal não?
boreal iron
#

Nope

lyric mountain
#

name one file locale_en-US.properties and the other locale_pt-BR.properties

#

then grab by locale_${localeTag}.properties

stiff dust
#

so i need a really big json file

lyric mountain
# boreal iron Nope

that's usually the proper way to i18n a project, since u can have N locales and allows external help without disclosing the database

tidal ocean
#

can someone help me with something basic

lyric mountain
#

just ask

tidal ocean
lyric mountain
#

you need to import Discord

boreal iron
#

Easiest thing to do is to create language files for your supported languages
Any var that outputs a string which would be replaced is available in your language file
Load all of them at the start of your bot into the cache, save the selection a guild does (choosed an available language) and return your cached vars for this language

tidal ocean
lyric mountain
tidal ocean
lyric mountain
boreal iron
#

object languages { "en" => { var1: … }, "es" => { var1: … } }

#

Ooh => lmao

#

PHP flash back

#

In this case a language map containing the vars with your translation under the language key

lyric mountain
boreal iron
#

You don’t use different vars for different languages

#

What a bullshit

lyric mountain
#

you use different files for different langs

#

that's why I separated the codeblocks

#

note both have the same property name

boreal iron
#

You always be consistent to use the same in a map for example by choosing the right key for your language

lyric mountain
tidal ocean
boreal iron
#

Horrible

lyric mountain
#

regarding the file ^

lyric mountain
lyric mountain
stiff dust
stiff dust
tidal ocean
tidal ocean
stiff dust
# tidal ocean how 🥲

learn js and dont copy codes from github or random youtube videos even if i told you how to do it you will stuck in next parts

lyric mountain
stiff dust
#

const something = require("somewhere")

stiff dust
boreal iron
#

You don’t fucking use your language selection on any var

#

What an horrible desaster to look at

stiff dust
#

i think big json is easier way am i wrong ?

boreal iron
#

For JS JSON probably is the best choice, yeah

#

While I’m using to parse INI files but not for JS

stiff dust
#

so what is the i18n ?

boreal iron
#

_internationalization _

#

Anyways… you load the languages once only

#

Then let the guild select its choice, then get the vars of your loaded language file(s)

#

And they have to be same on any file

stiff dust
#

ok

#

just a question

#

is there any different in one big json for each language or multi json file for one language i mean like 1 json file with 100 line or 10 json with 10 line is this have any effect in speed ?

boreal iron
#

At the place your return your strings, you for example use then:

embed.title = translation.embed_title_welcome_msg;

Or more useful saved as object:

embed.title = translation.embeds.titles.welcome_msg;

#

Well I prefer different language files

#

To not entirely loose the overview when having 10000 lines

#

It also makes sense as I use the language file names as keys for my language map

lyric mountain
boreal iron
#

In my case for example en.ini, es.ini, fr.ini, de.ini etc

#

Which is what the user could select at the end

#

Not hard coded another time in my code

lyric mountain
#

if you pay close attention, I wrote locale_en-US.properties <<<< see the file extension

boreal iron
#

Also no

#

You don’t load the files each time

lyric mountain
#

bruh

boreal iron
#

You load anything once only and keep it in the cache

lyric mountain
#

do you even read?

boreal iron
#

No smirk

lyric mountain
boreal iron
#

I got too much after reading this

#

And had to intervene

lyric mountain
#

both texts are indexed by the same property name

#

they're each in their own locale files

#

they aren't indexed by language code, the file name is

boreal iron
#

No no shhhh calm

#

I don’t, I can’t, I won’t… nooo shhh

hushed patrol
#

bruh

boreal iron
#

Nobody understands your Brazilian language

hushed patrol
stiff dust
#

@boreal iron well why do i need to use i18n? i cant understand
i read few docs but why?
i can just use

let language;
if (lang === 'en') {
language = require(english file location);
else if (lang === 'fr') { 
language = require(france file location);
}
#

and save lang in data base

lyric mountain
#

for obvious reasons, we don't read it fully

boreal iron
#

Just because you’re lazy freerealestate

lyric mountain
#

me and the entire programmer community

boreal iron
lyric mountain
#

🥔

cinder patio
#

speak for urself sir

stiff dust
boreal iron
stiff dust
#

oh wrong reply

lyric mountain
#

basically, by supporting multiple langs ur already i18n'ing

boreal iron
#

But hard coding the language selection in is weird,
When creating a dynamic system you want it to be dynamic lol

lyric mountain
#

that's why I suggested locale_${langCode}.properties

#

or any variation of it

stiff dust
#

ok tnx

lyric mountain
#

also don't forget to cache

boreal iron
lyric mountain
boreal iron
#

lmao

lyric mountain
wheat mesa
#

he’s driving right now don’t distract him

boreal iron
#

He isn’t

lyric mountain
#

richie

boreal iron
#

Working 365d a year

neat ingot
#

any recommended randomized meme api that supports searching?

lyric mountain
#

With a grain of salt, yk, cuz reddit

#

There's a mod here that has an anti-nsfw filter

#

Don't remember who

modest maple
sudden geyser
#

Damn I was right

How do i update the username/avatar for my bot?
You can no longer do this from the developer portal directly for now due to a bug. It will be fixed soon. [...]

boreal iron
#

I mean you can’t for verified bots anyways, at least the name

#

Regarding the average development speed of discord this might take a while also in fact I guess it hasn’t much a priority at all

#

I mean April it’s what… just one and a half month until the message intent comes

#

There would be so much to do to improve interactions

stiff dust
#

hi i want to use i18n but i have a little problem

#

how can i find the data base for message.guild.id or interaction.guild.id in i18n to to set the language??

boreal iron
#

My gosh with a library you seem to make your life harder than needed
It’s actually really easy to do yourself and less confusing

#

Once your guild has selected a language you gotta save it and attach it to the guild object (which is the easiest way)

#

guild.selectedLangProperty = some language;

#

It available anywhere you have your guild object available

sudden geyser
#

I don't think the library is relevant here

#

Like, Discord does tell you the user's and guild's locale

#

So you can use that to determine the language

boreal iron
#

Wtf

#

How would that make sense in any way

sudden geyser
#

How would it not?

boreal iron
#

How am I supposed to send a message to a guild channel with the users language?

#

Makes only sense for ephemeral messages

sudden geyser
#

No, you use the user's locale to determine what language to use, then send that however you normally would.

#

You still have your message/channel/guild/etc. object

boreal iron
#

I mean the question is not about to get the locale

#

Not that I would trust discord on the guild locales anyways

stiff dust
sudden geyser
#

Ah I see

#

Then since you'll be storing it on your bot's side, have you picked a database to use, or not

boreal iron
#

Ah that’s what he means

stiff dust
#

i know how to use data base for example i save a language in database for a guild with id 123
now how can i find the data with this guild id in my schema without having guild object ?

sudden geyser
#

You'll need to query it

#

What database are you using

stiff dust
#

mongodb

quartz kindle
#

mongoloiddb

boreal iron
stiff dust
boreal iron
#

Best thing is to query it once your init your bot

#

Then keep it in the cache

#

And push changes to the database and cache

stiff dust
boreal iron
sudden geyser
#

I haven't used MongoDB, but they do have a guide and docs to querying it.

boreal iron
#

Once you init your bot you know the language based of your database or it’s the default one if the guild hasn’t select one

stiff dust
boreal iron
#

Of course and in your database

#

How else will you remember on an app restart?

stiff dust
#

hmm i know its silly but how can i do that? -.-

boreal iron
#

You gotta append a new property to your guild object

#

Or attach?!

#

Whatever is the right translation

stiff dust
#

oh god i just so confused and dont have any idea that what should i do -.- i need a doc to read or someone to explain what should i do from first step -.-----

boreal iron
#

Once you init your bot you loop through the guilds and assign this property based on a database query

solemn latch
#

most of the time when developing you want have a doc explaining what to do the exact way you want to.

boreal iron
#

Dunno how else I can explain it easier pepowot

split hazel
#

cancel me

#

do it

#

i dare you

solemn latch
boreal iron
solemn latch
#

(I do it too for each type of interaction)

boreal iron
#

Ok that’s your first warning then

solemn latch
#

heck

split hazel
#

its just cleaner and there really isnt all that much overhead people stress it to be

woeful pike
#

create a new client object for each event

stiff dust
#

i can create a for each loop

solemn latch
stiff dust
#

then for each guild do something

#

but what should i do

#

this is my question :./

split hazel
#

and im using djs 14 because i want modal support

#

i hate it

#

the errors are so terrible

#

djs used to be so simple back in the day

woeful pike
#

create a new repo for each command

split hazel
#

create a new docker container for each message

woeful pike
#

now you're thinking like a 10x engineer

solemn latch
split hazel
#

yeah the dev version

boreal iron
stiff dust
solemn latch
#

oh okay, i thought it was out

split hazel
#

its really buggy and terrible

#

im guessing they will polish a lot of things before its out

woeful pike
boreal iron
split hazel
#

make an eval command where setting your nickname to the bots name gives you eval permissions in case you get locked out

#

the discord equivalent to leaving your key under the doormat

#

btw how tf does autocomplete work

stiff dust
boreal iron
#

Well there are faster ways than for each

#

But yeah

#

I actually can’t help with

mongoloiddb
at all

#

thanks for that Tim

stiff dust
#

Tim 👀
where are you ;-;

boreal iron
#

But as I said

quartz kindle
#

wut

boreal iron
#

You gotta need to loop through your guild cache when it’s available (after the ready event)

#

And get you field from the database when the guild has set the language

#

If not you gotta choose the default language of course

split hazel
boreal iron
#

Yellow name

solemn latch
#

😔

boreal iron
#

He must be drinking much

#

Not that you can expect a serious answer today

split hazel
#

brazil moment

boreal iron
#

Ok fake out

solemn latch
#

editing class prototypes is a bad idea right?

stiff dust
# boreal iron If not you gotta choose the default language of course
const GuildsModel = require('../../models/Guilds');
const guilds = client.guilds.cache
guilds.forEach(g => {
  const data = await GuildsModel.findOne({ GuildID: g.id });
  if (data && data.language) {
    language = data.language
  } else {
    language = 'en'
  }
})

so this is exact what you say...
found a data with for each guild id and then if there is a data and data.language the language is data.language and if there isnt it will be 'en'

quartz kindle
#

im breaking my head with this fts indexing thing

solemn latch
stiff dust
solemn latch
#

It does the same thing

stiff dust
#

i know

#

ok but still i dont know what should i do!
so what ?? now i have g.language in my ready event for each guild

solemn latch
#

Every guild object now has a .language property.

solemn latch
stiff dust
#

bruh -.-

#

you are right

stiff dust
#

still i dont have guild object in that code

stiff dust
neat ingot
solemn latch
boreal iron
#

As property in your message object or interaction object etc

boreal iron
#

But I can’t reply consistently

#

Need to work mean while pepowot

stiff dust
neat ingot
#

👀

boreal iron
#

I don’t see any advantage of that shit at all

#

Once you attached your language to guilds all you need to do is to load your language files

#

For example keep them in a map

#

And get your language items by getting the right map value based on the language as key

#

For example

stiff dust
#

wait what i didnt get the last part

#

for example g.language is en or fr

#

and i have 2 different json file

boreal iron
#

const all_languages = map();

language file loop -> all_languages.set("file name here, for example en", "file values");
(file values being an object including all your language vars

boreal iron
#

And load and parse your language files

#

And keep them in your cache
In other words keep them in your var you have access on in your entire code

stiff dust
#

in index or ready ?

boreal iron
#

Up to you when you load your language files

#

I mean you gotta create a function for loading the language files

#

And call that function somewhere for example in your ready. It’s up to you

#

(as long as you can access it in that scope)

#

This way you will be able to recall it later to read your files again once you made a change in your language files

#

Without the need to restart your entire app

vague moat
#

does anyone have a good discord php lib, I'm not a large fan of discord.js, I want to create a light Minecraft RCon bot

#

there's plenty of discord.js libs for RCON but I want to open myself up to the world of php

boreal iron
#

Wut plenty of djs libs for rcon
W U T
djs is a lib to interact with the discord API and gateway
A Minecraft rcon (remote console) lib has nothing to do with that at all

vague moat
#

lmao I'm smart

#

uh so

#

I'm looking for an alternative to discord.js that's in php

dry imp
#

discord-php

vague moat
#

I know there are a few different php whatevers

boreal iron
#

I mean that exists but it’s trash

austere surge
#

php?

#

dafuq

boreal iron
#

It’s just horrible trash

dry imp
#

true

vague moat
#

I'm not sure what's the best for my case lol

boreal iron
#

I used that in the past, too

vague moat
#

I'll try disc-php

boreal iron
#

Making my own was way better than their trash

vague moat
#

not looking for anything heavy

#

lOl

#

ight ty gents

#

and ladys

stiff dust
#

@vague moat the only package of PHP is DiscordPHP

dry imp
#

discord-php yea

boreal iron
#

there are lots of libs

vague moat
#

I may be tripping, I rember word of another one

stiff dust
#

but why should u use that when u can use djs / dpy :/

boreal iron
#

It’s all up to the base functionality your bot also need besides the rcon tools

dry imp
#

but if the maintainer quit idrk who tf wants to maintain that

hybrid cargo
stiff dust
hybrid cargo
#

Why now?

vague moat
#

python lowley weird

hybrid cargo
#

It's not even maintained

vague moat
#

must say

hybrid cargo
#

And outdated

dry imp
#

py-cord

#

its maintained

hybrid cargo
dry imp
#

but not for long ig

boreal iron
#

But php in this case isn’t the best option for a live environment like a continuous stream connection

stiff dust
dry imp
hybrid cargo
#

💀

#

Or is it something that I am unaware of?

#

Educate me in that case thanks lovethank

stiff dust
#

since here ^

dry imp
#

yea idk if danny wants to maintain it for a long time tho

boreal iron
#

What a scumbag

#

Throwing his lib away for private reasons now coming back

dry imp
#

true

#

but most of devs arent switching from pycord anyway

#

knowing that danny could quit all he wants

hybrid cargo
#

Damn that's great then

stiff dust
#

there isnt any Contract is there ?

boreal iron
hybrid cargo
#

I mean logically speaking any lib Dev's could quit anytime they want. It's not like there's a contract. But speaking of the community's thoughts now... Many users experienced Danny quitting out of the blue and had to go through the rewrite... So I'm not sure if the trust would come back to those to rewrite those pycord codes into dpy again

boreal iron
#

That’s what I mean

stiff dust
boreal iron
#

Quitting and crying about personal reasons and discord being an ass, abandoning his lib and fucking all users then coming back and claiming he has no other choice ?

#

I mean wtf is this idiot

hybrid cargo
boreal iron
#

Yeah that’s how things are
If you’re relying on other people that can happen

#

But changing your entire environment because somebody stated He won’t maintain your main library anymore then after changing your code he comes back…

#

Pfff

#

Now ruining the effort of others trying to continue on his work

#

To made sure not any of his lib user will be fucked

#

That actually makes him an asshole, don’t get me wrong

#

Once you have showed off your middle finger to anyone there’s no reason to come back

#

Not that I would actually touch fucking py

#

But after reading his statement when he quits and now this makes me laugh about him

dry imp
boreal iron
#

Let’s hope they do

#

Who knows when he will cry and quite next time

#

Next major API change will come I’m sure

#

Discord always has a plan to disappoint developers

dry imp
#

tbh the button implementation of d.py so ugly not worth the rewrite

dry imp
boreal iron
#

Better not use that weird snakish language at all

dry imp
#

tf u mean fake

#

py is love

boreal iron
#

Stop make me laugh when driving

#

lmao

#

I can’t see shit then

dry imp
boreal iron
#

So rude

#

Just telling the truth

dry imp
#

cmon now

boreal iron
#

Alr got to work now

sudden geyser
#

all I see are modals

dry imp
rose lance
#

can I somehow collect the attributes of multiple css classes into one?

#

like this

.cont-1 {
  values1
}
.cont-2 {
  values2
}
.collection {
  this should have the attributes of .cont-1 and .cont-2
}```
#

I know I can also just write both classes into my element, but I'm working with tailwind and wanna use the same collection of classes at multiple places without having the copypasting all the classes

boreal iron
#

Nope if you wanna set properties for each single and for both together you need to write down the selectors again

#

.count-1, .count-2 { … }

#

Which will apply the properties to both classes

#

But you don’t need to copy and paste the entire obj at any time

#

Once it’s been defined in the global scope you just adjust single properties when needed

#

For example for different screen sizes

#

In media queries

#

For example:

.table
{
margin-top: 10px;
display: table;
}

@media (max-width: 480px)
{
.table
{
display: block;
}
}

#

You don’t need to add the margin property again

#

As long as you don’t manually overwrite a property it will stay the same

#

So also devices with a max screen size or 480px will still have a margin top on that table

quartz kindle
#

ok so i made an ultra fast precomputed index for my full text search thing that returns results in 0.1ms

#

but it turns a 10mb greppable file into a 200mb sqlite db

#

lmao

#

or 700mb ram if the index is stored in a js object

sudden geyser
#

Well the site you linked runs on Microsoft IIS so maybe look into that

#

but I don't think it's just that

boreal iron
#

Just a simple Apache webserver with Indexes and FancyFolders as DirectoryIndex options

#

Of your virtual host

#

Or NGINX

#

Like in that example

#

Each webserver looks a bit different

#

All you need to search for is auto indexing

#

And or index directives

copper cradle
#

how am I supposed to build ImGui with OpenGL and glfw on windows

#

I just can't

#

this is driving me nuts

#

I keep getting "undefined reference to <a shitload of functions>" and I'm getting tired of it

wheat mesa
#

Means your lib isn’t properly installed most likely

oak cliff
#

@oblique flame that counts as advertising, please don't do it thanks. this isnt the place to find translators

oblique flame
#

how?

oak cliff
#

youre asking people to help with your project

#

its like looking for developers