#development

1 messages · Page 2064 of 1

pine nova
#

o nvm found it

woeful pike
#

every forum post ever from 2009

spark flint
#

Id recommend discord-hybrid-sharding for js

#

Very good

pine nova
#

i see

pale vessel
#

You'd have to reupload them with SPOILER_ at the start of the filenames

spark flint
#

Ty

thorny flume
#

I already solved it, but can you help me with something else?

#

I put the messageCreate event in the bot and I put the content of the sent message in the console, but I'm getting it multiple times. as mentioned earlier, each cluster runs a bot instance, can you send it to just one instance?

quartz kindle
#

did you configure the shards for each cluster?

thorny flume
#

yes

quartz kindle
#

show your config

thorny flume
#

ok, i will enter the pc

ancient nova
#

just realized having an in depth description on join actually makes a difference

#

instantly jumped from ~35 to 46 guilds in one day

tight scaffold
sharp geyser
#

well it returns a json response so you can just get server_count from its response

tight scaffold
#

is there a way to get the server counnt without authorization

sharp geyser
#

ofc not

tight scaffold
#

fun. what am I doing wrong lol

#
var mainContainer = document.getElementById("server-count");
fetch("https://top.gg/api/bots/752236274261426212/stats", {
    method: "get", 
    headers: new Headers({
        'Authorization':  "redacted"
    })})
      .then(function (response) {
    return response.json();
  })
      .then(function (data) {
            mainContainer.textContent = (data[0] + " Servers");
            })
  .catch(function (err) {
    console.log(err);
  });
#

does it not start at 0 all of a sudden

sharp geyser
#

all arrays are 0 index

#

likely data is undefined to begin with

tight scaffold
sharp geyser
#

log what data is

tight scaffold
pale vessel
#

My man don't put the token inside the js code, people can view it and post fake stats for your bots and get you banned

tight scaffold
#

good point, im kinda new to js and dont know how to use env vars

#

im used to c#

pale vessel
#

Js is frontend

sharp geyser
#

data.server_count

tight scaffold
#

ah.

#

makes sense

sharp geyser
#

or data["server_count"] if you really wanted

tight scaffold
#

poifect

sharp geyser
#

gj

tight scaffold
#

is there a way to avoid this mess

(data.server_count + " Servers")
#

and have it all in one string

#

i know c# has $("{content} rest of string")

craggy pine
#

Using ${}

#

same as c# but they must be wrapped in a `

tight scaffold
#

ah ok

#

so then wait is it just reversed?

#

where () is to get data

sharp geyser
#

use back ticks

tight scaffold
#

ah

sharp geyser
#
console.log(`${something} asdasd`)
tight scaffold
#

got it

#

thx

craggy pine
#

{}

tight scaffold
#

righht

craggy pine
#

not ()

tight scaffold
#

thx

#

now how do I hide my token lol

craggy pine
#
(`${data.server_count} Servers`)
#

basically this

pale vessel
#

You could make it a part of your API

tight scaffold
#

ye i got it

#

i dont have a working api yet KEKW

pale vessel
#

Fetch the bot stats in your C# API and return the server count

#

Ah

tight scaffold
#

otherwise i wouldnt have bothered to use the topgg api in the first place

sharp geyser
#

I honestly always do backend before frontend so I never have this problem

bright hornet
sharp geyser
#

using an if statement?

wheat mesa
#

Wtf am I looking at 😭

#

That code makes pretty much no sense

sharp geyser
#

I don't question it anymore waffle

near stratus
sharp geyser
#

is guild_name not already a string tho

wheat mesa
#

I don’t think you’re seeing the problem here misty

sharp geyser
#

Waffle i am starting to question now

wheat mesa
#

Look at everything that isn’t the if statement

sharp geyser
#

I am wondering why they are putting a string inside a string idc about any other problems

#

There was hardly any fucking code to begin with

wheat mesa
#

I think you’re missing the point

#

Even if the if statement made sense, everything else doesn’t

near stratus
#

It wasn't a code
Not js at least

sharp geyser
#

I just realized the what the code looked like

#

wtf is he doing

#

async (err, data)

#

ah yes

wheat mesa
#

I would help but it’s too late and I’m on mobile

sharp geyser
#

I would help but I rather not

#

unity and blender do be calling my name

raven parcel
#

hello

midnight marsh
sharp geyser
#

I have made a cube

#

wonderful progress

midnight marsh
ancient nova
#

where bean

midnight marsh
#

20 MB incoming...

sharp geyser
#

cube

#

blender cube

midnight marsh
#

Why Microsoft GameDVR lags???

midnight marsh
sharp geyser
#

not upside down

#

okay maybe upside down

midnight marsh
sharp geyser
#

I know

#

I forgot i made it view from bottom

midnight marsh
ancient nova
sharp geyser
#

?

ancient nova
#

everyone starts their game dev with a bean

#

not a cube

#

it's basic knowledge

sharp geyser
#

No

midnight marsh
sharp geyser
#

bean isn't even a thing in unity

#

capsule is a thing

ancient nova
sharp geyser
#

Bro I am literally using unity rn

#

how tf you going to tell me

ancient nova
#

literally spawn a capsule and you got a bean

midnight marsh
#

It's used for first person characters

ancient nova
#

you know nothing about unity

sharp geyser
#

That isn't even a fucking bean shape

ancient nova
#

😭

midnight marsh
#

@sharp geyser I was working on this

ancient nova
#

literally everyone will tell you to start with a bean

sharp geyser
#

Ok but you don't know your basic shapes

#

beans are curved

midnight marsh
ancient nova
#

misty

#

google unity bean

#

just do it

sharp geyser
#

this is not a bean shape

midnight marsh
ancient nova
midnight marsh
sharp geyser
#

I noticed it clips sometimes

near stratus
ancient nova
sharp geyser
#

idc what you guys say though

#

your opinions do not matter

midnight marsh
#

EXPLOERE CRASHED???

#

WTF

sharp geyser
#

it is a capsule

#

not a bean

#

that's that

midnight marsh
#

It's called capsule, bean, ...

sharp geyser
#

why do people reply to a message that was just sent

#

😔

#

notifications go brr

midnight marsh
sharp geyser
#

even with mutes it still shows up bozo

midnight marsh
sharp geyser
#

yes block the people who do it to be annoying

midnight marsh
#

Shit. dawn explorer crashed... all my folders closed...

ancient nova
#

one of my unity games

#

guess what I use for my character model

#

BEAN

ancient nova
#

I've got a HDD

ancient nova
#

literally got more pics

#

this is an older screenshot tho

midnight marsh
sharp geyser
#

that is literally fnaf

ancient nova
midnight marsh
#

For no dawn reason it bugs and crashes

ancient nova
#

which I made

sharp geyser
#

cap

ancient nova
#

I posted that on my GJ even

#

here is my racing game

sharp geyser
#

now show the source code

#

yandere dev moment

ancient nova
ancient nova
#

c# is the language I'm good at

#

Js is my third maybe fourth language

#

though I do use it a lot

midnight marsh
sharp geyser
#

poor js

sharp geyser
ancient nova
midnight marsh
sharp geyser
#

yes

#

unity itself is in C++

#

and their scripting api is C#

ancient nova
#

yeah

#

the older version of unity also supports JS believe it or not

sharp geyser
#

I mean you can still use js but it is by third party means

#

and it isn't that good

ancient nova
midnight marsh
sharp geyser
#

They used to have a super shit JS scripting api

ancient nova
#

if you care about dem good graphics

sharp geyser
#

JS isn't a lang meant for a unity game of any decent standard imo

#

C# just makes more sense

ancient nova
#

true

#

that's why they removed it

sharp geyser
#

it was also hardly used iirc

ancient nova
#

you could mix Js with c#

sharp geyser
#

why would you ever wanna do that though

ancient nova
#

so maybe not all that useless

midnight marsh
sharp geyser
#

no

#

I am not a bot dev anymore

ancient nova
#

which coffee should I make? rn I only got latte and cappuchino packs

sharp geyser
#

I hardly work on bots

ancient nova
#

I gotta go shopping

midnight marsh
#

Why?

sharp geyser
#

boring

ancient nova
#

how is your discord v2 going?

sharp geyser
#

I also don't wanna spend my entire life working as a bot dev

#

that just is too limiting

midnight marsh
bright hornet
sharp geyser
#

I need to clean my keyboard geez

#

it is so dirty

ancient nova
#

I actually wanted to rework my old economy

#

wonder if I should

bright hornet
sharp geyser
#

wait is itemList an array

sharp geyser
earnest phoenix
#

npm start
npm ERR! missing script: start

npm ERR! A complete log of this run can be found in:
npm ERR! /home/runner/.npm/_logs/2022-06-30T08_31_35_093Z-debug.log
exit status 1

Help plz

sharp geyser
#

start is missing in your scripts portion of package.json

earnest phoenix
sharp geyser
#

the start script

earnest phoenix
sharp geyser
#

I was telling you what to add

earnest phoenix
#

i want code line

#

ok ok

#

got it

sharp geyser
#

I don't know what it should look like

#

so I can't really help you

#

all I can say is you need to add the start script in your package.json

ancient nova
#

you can just remove the entire thing

sharp geyser
#

if you wanna use npm start ofc you need it

#

else you can just node ./whateverFile

earnest phoenix
sharp geyser
#

read the error

earnest phoenix
#

invalid character

sharp geyser
#

there is an 1" that isn't needed

#

it even tells you the character that is not supposed to be there

earnest phoenix
sharp geyser
#

well ofc

earnest phoenix
#

Hey,

So pretty much I'm trying to log whenever someone get's banned from a server and send it with embed to a modlogs channel, that can be defined by an ID.

I'm having an error with the line 5th line (let auditLog = auditLogs.entries.first()).. returning as TypeError: Cannot read properties of undefined (reading 'first'). Any Idea how to fix this?

client.on("guildBanAdd", (guild, user) => {
  let reason = "no reason"
  let embed = new Discord.MessageEmbed()
  let auditLogs = guild.fetchAuditLogs({type: "MEMBER_BAN_ADD"})
  let auditLog = auditLogs.entries.first()
  if(auditLog.reason !== null){
    reason = auditLog.reason
  }
  embed.setTitle("User Banned")
  embed.setColor("#ff0000")
  embed.addField("Username", `${user.tag}`)
  embed.addField("Banned User ID", `${user.id}`)
  embed.addField("Time Banned", `${user.createdAt}`)
  embed.addField("Reason", `${reason}`)
  client.channels.cache.get("ID").send(embed)
}
)
ancient nova
earnest phoenix
#

The bot has administrator permissions, so yes.

ancient nova
#

try logging both auditLogs and auditLogs.entries to see what they return

earnest phoenix
midnight marsh
#

I do not understand js well. But if you returned users' info, what else could be remained?

ancient nova
#

which is quite stupid imo

earnest phoenix
# ancient nova try logging both auditLogs and auditLogs.entries to see what they return

I've figured it out,

client.on("guildBanAdd", async (guild, user) => {
  let reason = "no reason"
  let embed = new Discord.MessageEmbed()
  const auditLogs = await guild.fetchAuditLogs({
        limit: 1,
        type: 'MEMBER_BAN_ADD',
    });
  let auditLog = auditLogs.entries.first()
  if(auditLog.reason !== null){
    reason = auditLog.reason
  }
  embed.setTitle("User Banned")
  embed.setColor("#ff0000")
  embed.addField("Username", `${user.tag}`)
  embed.addField("Banned User ID", `${user.id}`)
  embed.addField("Time Banned", `${user.createdAt}`)
  embed.addField("Reason", `${reason}`)
  client.channels.cache.get("ID").send(embed)
  
}
)

#

it can be done this way

near stratus
#

nvm

earnest phoenix
#

❤️

ancient nova
sharp geyser
#

they already figured it out

ancient nova
#

oh

#

:/

sharp geyser
#

lmfao

#

you even replied to the message of them saying they figured it out

ancient nova
#

I didn't actually read what the message said

midnight marsh
sharp geyser
#

no?

#

I was just saying that the message he relied to was them saying they fixed it

ancient nova
#
const fetchAudit = function(auditFetchNr) {
     const fetch = await message.guild.fetchAuditLogs({ type: "MEMBER_BAN_ADD" });
     const audit = audit.entries.map(e => e);
     return audit[auditFetchNr];
};
sharp geyser
#

wtf

#

I think it is stupid you need to do .map(e => e)

#

I mean you can do Array.from(audit.values()) to get an array without using .map so that is cool

#

didn't know Array.from was a thing

ancient nova
bright hornet
woeful pike
#

$push for mongodb

earnest phoenix
#

}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! clan_bot@11.0.0 start: node index.js
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the clan_bot@11.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR! /home/runner/.npm/_logs/2022-06-30T14_02_51_825Z-debug.log
exit status 1
 node ./index.js
internal/modules/cjs/loader.js:818
throw err;
 node index.js
internal/modules/cjs/loader.js:818
throw err;
^

Error: Cannot find module 'node:events'
Require stack:

  • /home/runner/Multipurpose-discord-bot/node_modules/discord.js/src/client/BaseClient.js
  • /home/runner/Multipurpose-discord-bot/node_modules/discord.js/src/index.js

help plz

boreal iron
#

Your nodejs version probably doesn’t match the requirements

#

Just try updating it

earnest phoenix
earnest phoenix
#

npx

#

npx node .
node:internal/modules/cjs/loader:1170
throw err;
^

SyntaxError: /home/runner/Multipurpose-discord-bot-1/botconfig/config.json: Unexpected token ] in JSON at position 182
at parse (<anonymous>)
at Object.Module._extensions..json (node:internal/modules/cjs/loader:1167:22)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Module.require (node:internal/modules/cjs/loader:1005:19)
at require (node:internal/modules/cjs/helpers:102:18)
at Object.<anonymous> (/home/runner/Multipurpose-discord-bot-1/index.js:43:16)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
exit status 1

then this error

quartz kindle
#

your config.json file is broken

raw gust
lament rock
#

the name only gives the name. You also need the id

#

custom emojis are
<:name:id>
animated custom emojis are
<a:name:id>

#

for reacting to a message, you can use name:id

#

if you only have the id, you can do _:id

slender wagon
#
let item1 = ""
         StoreList.find({gemType: "1000 Gems"}).count(function (err, count) {
            if (!err && count === 0) {
                item1 = "1000 Gems aren't available at this moment"
            }
        });
console.log(item1)
#

so what could be the reason the item1 is coming out empty

#

even after i attach something to it

#

i am pretty sure i am doing something wrong here but can't figure out yet

woeful pike
#

anything that depends on the value of count must go inside the callback

#

look up how promises and callbacks work

slender wagon
slender wagon
#

Oki so i passed it through functions

#
item1 = "1000 Gems aren't available at this moment"
siteRender(item1)

@woeful pike was this a good approach?

woeful pike
#

I would rather pass nothing into count, make it return a promise and use async/await instead

slender wagon
#

oh

vivid fulcrum
#

there must be an async counterpart to that method

woeful pike
slender wagon
#

lmao yes Mongo

vivid fulcrum
#

callbacks are a very outdated approach

quartz kindle
#

they are still the fastest tho

#

:^)

split hazel
#

wanna break from the ads

#

if you tap now

raw nest
#

If I create a volume for a container and mount it etc. If I have e.g. a NodeJS app do I have to specifiy something to save into the volume or can I access the file system as usually?

quartz kindle
#

if its accessible from the filesystem, then its also accessible from node

#

node can access anything that the operating system can

raw nest
#

but is it like persistent

quartz kindle
#

(except like root/admin stuff and you dont run node as root/admin)

raw nest
#

that's the point of volumes

quartz kindle
#

node doesnt play a part in that

raw nest
#

ye it was an example. If I have a volume and I mount it to a container. How do I access/write/read the volume from the app itself

quartz kindle
#

define container

#

you mean docker?

raw nest
#

oh yes I didn't mention its docker... I'm sorry

#

bruh

quartz kindle
#

you want to add a volume to the same container as the node app? or in a separate container?

raw nest
#

just any container doesn't matter. I run a new container and mount a volume to it.

quartz kindle
#

if you're just asking how to add volumes to containers in general, you'd need to check the docker guides/docs

raw nest
#

I know how. I am wondering how they really work. Like how do you access the stuff from the volume in your app 😅

quartz kindle
#

docker is like a mini operating system by itself

#

anything you run inside docker thinks docker is the operating system

#

so if you configure docker to mount xyz, then your app will also see xyz mounted inside this containerized operating system

#

using regular fs tools

raw nest
#

okay that was the question. If I can usually access it with normal file read if I have mounted the volume to my container

quartz kindle
#

basically yeah you should, depending on how you configure it

#

since it can be read-only, temp/ram fs, etc

#

everything is configurable

raw nest
#

yeah thanks man

rigid maple
#

Successfully passing AuthProtectYT function
logs the variable data
Logging the variable activeChat
but as a result it returns status 903 and Access Denied (in catch block)

raw nest
#

Is it usual or necessary to have two servers one for authorization and the other one for the whole data? (Like shown below)

quartz kindle
#

not needed, just extra security

raw nest
#

alright 👍

rigid maple
#

executing catch block even though there is no error

quartz kindle
rigid maple
#

no i changed this part for that (195-199)

quartz kindle
#

what is the error that is logged before the 903 ?

#

the console log before on the same line

rigid maple
#

and status 903 Access Denied

quartz kindle
#

do you have any middleware?

#

like router.use(...)

rigid maple
#

no

quartz kindle
#

console.log the full error

#

remove the text hata var yigen

#

so it shows the stack trace

rigid maple
#

status 903

#

but it should return 908 and can't do this

split hazel
sharp geyser
#

tauri best rust + js combo for desktop apps

rustic wharf
earnest phoenix
pine nova
#

if u scroll down a little

#

ye

earnest phoenix
#

okey

#

i have it

bright hornet
#
if(existing_item?.Name != shop_item) {
                                                            await economy.updateOne({
                                                                memberID: message.author.id
                                                            },
                                                            {
                                                                $push: {inventory: items},
                                                                $set: {cash: final_amount}
                                                            })
                                                        } else {
                                                            return console.log(false)
                                                        }``` how do i get the name only?
#

and why do i have an extra object?

sacred aurora
#

what do you mean?

pallid zinc
nocturne grove
#

Hey, how can I test my application commands with different languages? I tried changing the Discord client's language, but that didn't change it.
Docs:

Locale is determined by looking at the X-Discord-Locale header, then the Accept-Language header if not present, then lastly the user settings locale.
What are those first two and how can I change my locale?

near stratus
boreal iron
#

You need a beta client of discord to test it

nocturne grove
#

Oh that went easy. Thank you!

#

Now I have to figure out how I can obtain the name_ and description_localizations of my commands. A fetch method doesn't return them as it states in the docs

#

Do you have an idea? @boreal iron

boreal iron
#

Yes there’s an option to fetch with localizations

nocturne grove
#

oh wow I see!

#

You're a hero

nocturne grove
#

👍
Hmm that is not working it seems

#

When adding locale: 'nl' it is giving me the correct descriptionLocalized, but when adding withLocalizations: true ...Localizations and ...Localized are all null

#

Looks like that is only working for global commands and not for guild specific commands

boreal iron
#

Did you register and/or update the commands accordingly?

nocturne grove
#

Hmm it's working now but I have no idea what happened.
I had 1 registered guild command, I did have localizations on that one (saw them when typing the command) but they didn't show with withLocalizations: true.
Deleted that one, made a global one in the same way, for that one it worked. Undid that and added the guild command back and the localizations were there

boreal iron
#

Yeah updating commands sometimes is fucked up

nocturne grove
#

I'll just continue now as if nothing happened 😁

boreal iron
#

Aye, best method freerealestate

nocturne grove
#

xD

boreal iron
#

I mean issues are expected as this is still in development

#

as the entire discord platform

nocturne grove
#

Well you're right

lyric mountain
nocturne grove
#

It looks like the localizations aren't available after restarting the bot. Could that be correct or is that an issue?

boreal iron
#

Do you eventually register the commands on each startup?

nocturne grove
#

afaik I don't, I will investigate

#

well that sounds like I don't know what I'm doing: no

carmine summit
#

Why do I keep getting No 'Access-Control-Allow-Origin' header is present on the requested resource.? But when I put the url into my address bar, it just works just fine.

lyric mountain
#

because CORS

carmine summit
#

also, this is not my api so I cant just go there and type in Access-Control-Allow-Origin: "*"

lyric mountain
#

well, what is the api for?

nocturne grove
boreal iron
#

Huh nope

#

It depends on how and when you register/update your app commands

nocturne grove
#

well, okay, this is the order I do that:
restart
Register command
Console.log(... withLocalizations: true ...): _localizations are present
restart
Console.log: _localizations are not present

#

Also, when using locale: 'lan' in the exact same context, it does give me _localized

boreal iron
#

Huh

#

That link isn’t valid

#

At least I’ve got no access to that channel/server

nocturne grove
#

oh that was linking to DDevs, but they see the word discord.js and they say "go to bla bla for Discord.js support"

boreal iron
#

Well im not in any of those servers

#

But I remember I had that issue in the beginning when I started working with localizations, too

nocturne grove
#

Well no problem. I'll see if I can solve this and I hope I can, as I don't like to continue with step 2 while the command handler doesn't fully work yet

boreal iron
#

Understandable

#

I somehow don’t run into this issue anymore

#

After deleting the commands then register them once again with localizations this issue disappeared

nocturne grove
#

This was my question, so you say it's "no"?

Is it intended that you can still access name_localized and description_localized after a bot restart using local: 'lan', but at the same time that it's not possible for name_localizations and description_localizations using with_localizations: true?
(Replace _l with L)

boreal iron
#

Also when editing commands make sure to include the localizations as well, when missing them the command localizations will be overwritten with null

nocturne grove
#

I'll be back soon, thanks tho

boreal iron
#

Wdym by using local: lan

#

Where are you using that?

nocturne grove
#
await client.application.commands.fetch({ guildId: bot.guild.id, locale: 'nl' })```
locale was what I meant
boreal iron
#

And nl got registered as locale with the command?

nocturne grove
#

Yes, and that was giving nameLocalized and descriptionLocalized

boreal iron
#

Did you register en as well?

#

As default name and description

nocturne grove
#

yes they're default

boreal iron
#

Hmm that’s weird

raw nest
#

If I have like priorities for e.g. roles. And I put a role in higher priority in my DB (MySQL). How can I decrease every priority lower than this in the db? Like change the priority of my role and the other roles all automatically decrease priority by one in the DB?

#

Before:

1. Admin
2. xyz
3. abc

After I changed abc to second priority change xyz automatically to 3.

1. Admin
2. abc
3. xyz
lyric mountain
#

afaik roles are like in discord, they're ordered by priority

#

so if u move a role to 3, the one in 3 goes up

raw nest
#

yes I want to make it similar. But how do I do that? Do I have to map through every role and change the priority? Or can I do something like that in the DB query/strucutre idk?

lyric mountain
#

u can make a move_role() procedure

#

roles are stored in the database (if it's similar to postgres)

raw nest
boreal iron
#

You have to write the queries on your own

#

You can however create a dynamic flow to insert/edit a role and update all others of the same category for example by increasing their priority field or reducing it depending on the inserted priority

nocturne grove
raw nest
boreal iron
# raw nest like what?

For example when inserted priority >= stored priorities increase them by one then insert my new role or edit an existing one

boreal iron
#

As I explained in my example

#

Like insert or update with a case when any other role of this category has the same priority then increase them all by 1 before inserting

lyric mountain
#
UPDATE roles
SET priority = priority + IF(oldPrio > newPrio, -1, 1)
WHERE priority <= newPrio
AND id <> my_role_id

ig?

boreal iron
#

Why would any role need a -1

lyric mountain
#

if you're moving down

boreal iron
#

You only need to increase all roles which have the exact same priority or above

lyric mountain
#

nope, that's just for one way

#

if you move up you'd still increase all priorities

#

if you're moving down, increase others
if you're moving up, decrease others

raw nest
lyric mountain
#

test this in another table first

#

just in case

boreal iron
#

Not when inserting one

lyric mountain
earnest phoenix
#

heyy

#

is there a way to create a bot status page on a website

#

like what are some methods?

lyric mountain
#

make a webserver on your bot with a simple /ping endpoint

#

if it returns status 2xx it's online, else it's offline

earnest phoenix
#

like express?

lyric mountain
#

yes

earnest phoenix
#

ohh alright

#

what about with shards?

lyric mountain
#

for that allow ?shard=<number> parameter on that endpoint, then retrieve shard status from your shardmanager

earnest phoenix
#

ohh alright

boreal iron
#

Or simply report the app statistics to a database you query periodically and cache the results on your website

wheat mesa
boreal iron
#

Dunno why things need to be more complicated than necessary

earnest phoenix
#

ohh true

#

but do i make a new document (using mongodb) for every shard?

#

or have all of them in the same document

boreal iron
#

However you like

#

I mean it depends on the amount of data you store per shard

#

If it’s just the guild size and or member count then throw anything into one document

#

Or simply keep it separate

earnest phoenix
#

ohh oki

#

tysm!

eternal osprey
#

hey how would i be able to get these values?

#

Because due to their - it sees the 2 keys as different things

split hazel
boreal iron
#

No camel case, snake case but weird case

quartz kindle
#

dashcase

#

minuscase

#

negativecase

#

anticase

boreal iron
#

things going wild

eternal osprey
#

how would i actually clear specific intervals?

#

I have a command that starts an interval, its defined using ```js
let interval;
interval = setInterval....

#

however, the command can be used multiple times.

#

so the clearinterval wouldn't work anymore right?

vivid fulcrum
#

🤔

#

what's the context behind this

#

are you pointing at some kind of throttling

eternal osprey
boreal iron
#

If you wanna kill the timers, define a global var as array pushing the intervals into the array when running the command

vivid fulcrum
#

ah, just got the question

boreal iron
#

Iterating through the array can then kill every interval

vivid fulcrum
#

this ^^

boreal iron
#

Or use an object instead of an array to specify specific key names for your interval you can kill separately

#

Or a map

lyric mountain
#

I vote for map, it allows u to get an interval without needing to iterate

nocturne grove
#

@boreal iron as promised, I wrote a simplified version of my code and I'm experiencing the same issue regarding localizations:

const Discord = require('discord.js');
const { bot } = require('./secrets.json');

// "GUILDS", "GUILD_MESSAGES"
const client = new Discord.Client({ intents: bot.intents });

client.login(bot.token);

client.once('ready', async () => {
    const object = {
        name: 'ping',
        description: 'pong',
        nameLocalizations: { 'de': 'pingde' },
        descriptionLocalizations: { 'de': 'pongde' },
        dm_permission: true,
        type: 1,
    };

    // await client.application.commands.create(object, bot.guild.id);

    console.log(await client.application.commands.fetch({ guildId: bot.guild.id }));
});

/* logs (line 18 commented, uncommented, commented):
Collection(0) [Map] {},
*nameLocalizations and descriptionLocalizations are present*,
*nameLocalizations and descriptionLocalizations are null*
*/```

I hope you can spot a mistake
sharp geyser
#

that looks correct to me

nocturne grove
#

The code, the output or both?

sharp geyser
#

I mean the code looks correct

#

At least at a first glance

boreal iron
#

You’re not supposed to register commands on any startup

#

Registering is a one time process

#

Overwriting commands over and over causes trouble

nocturne grove
#

@sharp geyser what about the output? Do you know what you would have / what it should be?

#

@boreal iron oh don't get me wrong, only the second execution of my code line 18 was uncommented. But as you can see, the restart after that, the localizations are null

sharp geyser
#

If you are fetching a command that has been created then it shouldn't be an empty collection

#

lol

boreal iron
#

Well i can’t see line on mobile, I can’t actually really see anything on mobile tbh

sharp geyser
#

Also FakE aren't they already registering once? Or are you talking about they should be checking if it is already registered?

nocturne grove
nocturne grove
sharp geyser
#

I have no idea what line 18 is

#

I am also on mobile

nocturne grove
#

the code line that is commented in the code example

#

lol

boreal iron
#

Well using a service like sourcebin helps

nocturne grove
#

sure

boreal iron
#

Hmm you’re immediately fetching the commands

sharp geyser
#

Is the issue that the commands just aren't registering or?

nocturne grove
sharp geyser
#

I am new to the situation at hand

boreal iron
#

That could be an issue after registering them but if you comment this out on a second run, then the result shouldn’t be null

nocturne grove
boreal iron
#

But uhm

#

You didn’t fetch the commands with the localization option

nocturne grove
nocturne grove
boreal iron
#

lol

#

Would be funny

sharp geyser
#

are they not fetching with their specified locale?

#

that could be an issue

nocturne grove
#

well specified, just no locale at all

sharp geyser
#

👀

nocturne grove
#

also with this line 19 the same result:

console.log(await client.application.commands.fetch({ guildId: bot.guild.id, withLocalizations: true }));

boreal iron
#

Just fetch all localizations

#

Yeah

sharp geyser
#

I haven't fucked with localizations before

nocturne grove
sharp geyser
#

this is all new to me

nocturne grove
#

ohh

boreal iron
sharp geyser
#

oh?

boreal iron
#

But it’s still a non-released feature

sharp geyser
#

ah

boreal iron
sharp geyser
#

Yea I know that much

#

I assume that the localization shows up for the user depending on their language settings tho

#

right?

nocturne grove
boreal iron
# sharp geyser Yea I know that much

The rest is internal handling in your code by getting the guild or user locale executing your command and return a response in the associated language

sharp geyser
#

yea figured as much

lyric mountain
sharp geyser
#

also guilds can have locales?

#

tf

lyric mountain
#

and disabled word wrap

sharp geyser
#

am I just outdated on the discord news or smth

nocturne grove
#

Maybe there's something wrong with (my version of) Discord.js as I don't see any sign that withLocalizations is working. It doesn't make a difference after startup and during the same runtime as when you registered the command, it also doesn't make a difference (the fields are there anyway)

nocturne grove
sharp geyser
#

makes sense then why I wouldn't know

#

I dont own any community servers

boreal iron
#

Wouldn’t be discord

boreal iron
#

I haven’t found a way of changing them but they all have

sharp geyser
lyric mountain
boreal iron
#

I think it requires the v10 gateway version

lyric mountain
#

but highlighting doesn't help when they fuckin wrap the code

boreal iron
#

Not sure if the stable djs is already on v10

sharp geyser
#

v10?

#

yea

#

I think so

boreal iron
sharp geyser
#

actually no stable is only using v9 still

boreal iron
#

Well iirc localizations require the v10 gateway

#

@nocturne grove

sharp geyser
#

It looks like it yea

#

unless I am reading the docs wrong

nocturne grove
#

Thanks! Parts of them work tho, so I expect for everything to work, I need v10
@boreal iron @sharp geyser

#

I will join the d.js server and ask how I can use v10, will come back here

junior karma
#

In this section, may I know where the topgg_auth is located, so where is the auth url?

idle coral
#
(node:97) UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process!
/home/runner/Gage/node_modules/puppeteer/.local-chromium/linux-901912/chrome-linux/chrome: error while loading shared libraries: libgobject-2.0.so.0: cannot open shared object file: No such file or directory


TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md

    at onClose (/home/runner/Gage/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:197:20)
    at Interface.<anonymous> (/home/runner/Gage/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:187:68)
    at Interface.emit (events.js:326:22)
    at Interface.close (readline.js:416:8)
    at Socket.onend (readline.js:194:10)
    at Socket.emit (events.js:326:22)
    at endReadableNT (_stream_readable.js:1241:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:21)
(node:97) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:97) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
#

I get this error when using my image command.

#

Allowing you to search an image.

#

Source code:

const img = require('images-scraper')

const google = new img({
    puppeteer : {
        headless : true,
    }
})

module.exports = {
    name: 'image',
    aliases: ['img'],
    category: '😂 Fun',
    memberpermissions: [],
    cooldown: 5,
    description: 'Searches an image on google!',
    usage: 'image <what image you want to search>',name : 'image',
    run : async(client, message, args) => {
        const query = args.join(" ")
        if(!query) return message.channel.send('Please enter a search query')

        const results = await google.scrape(query, 1)
        message.channel.send(results[0].url);
    }
}
sharp geyser
#

everything I saw online says setting it to false should get rid of that

nocturne grove
#

@sharp geyser @boreal iron about the localizations: I found a conversation with the same problem in the D.js Discord server from 8th June. I've asked if there's any news there

midnight marsh
#

I have to get my /embed command restricted for admin guilds. Bit since I use slash commands from rapptz/discord.py, I cannot put @has_permissions. I mean I can put that and it works. But I cannot catch its error

sick agate
#

did you used error handlers?

idle coral
sick agate
#

and slash commands requires another type of handler @midnight marsh

sharp geyser
#

mmmm

midnight marsh
sick agate
#

yeah um

#

no

midnight marsh
#

ishandlered or sth else it could be

sick agate
#

....

midnight marsh
sick agate
#

read dpy docs

midnight marsh
#

okay thanks

split hazel
#

the backrooms

vivid fulcrum
#

moms basement

quartz kindle
#

CIA's secret moon base

boreal iron
#

topgg development channel moment

rustic nova
#

on mars

#

no shit though, watch elon musk provide server hosting on mars

quartz kindle
#

who the fuck would host shit on mars

sharp geyser
#

cheap and affordable

#

5cents for a 20gb ram vps

quartz kindle
#

yeah with literally 187k ping on a good day and 1.3 million ping on a bad day

sharp geyser
#

key words man

spark flint
sharp geyser
#

you can get further

#

just not in human lifespan

spark flint
#

Buy MuskServersLTD’s Discord bot hosting - 12lyps speeds!

#

12 light years per second

quartz kindle
#

that metric makes zero sense

sharp geyser
#

so fast

sharp geyser
spark flint
#

Lmao

sharp geyser
#

what about the part of putting hosting on mars tim

#

that didn't make sense?

spark flint
sharp geyser
#

tim you draw the lines in very weird places my friend

quartz kindle
#

physically putting stuff there is a lot more feasable than somehow creating speeds 12x84600 times the literal speed of light

sharp geyser
#

Okay

#

I feel like if anyone could do it elon could

#

after all he got a bunch of idiots to invest in doge coin

lyric mountain
#

Tim do you know anything about Monte Carlo, perchance?

boreal iron
slender wagon
#

Which one do i get

#

Will use it as a server

boreal iron
#

x86_64 of course

#

Nobody actually wants ARM

#

As long as developers and companies don’t mutate stuff over to this platform

manic basin
quartz kindle
#

who the fuck still uses powerpc

boreal iron
#

Trusted and working piece of technology even after 15y

#

Imagine stuff nowadays would last 15y

#

Haaa!

quartz kindle
#

if you wanna run old shit sure

#

but its basically not compatible with anything

#

powerpc based macs were a piece of shit because they couldnt run any modern osx app

#

couldnt be updated, couldnt do shit

boreal iron
#

But you got a running system!!1!

boreal iron
split hazel
#

windows 11 users wondering why they need to upgrade their whole motherboard and cpu just to run windows

#

windows 7 users:

boreal iron
#

As well as the useless tpm requirement you can still get around

split hazel
#

microsoft stopped focusing on actual optimization and started relying on newer hardware

#

any osdev person will tell you thats a bad move

#

not necessarily for the marketing

#

its just bad 😭

#

windows 7 is probably as light as you'll get nowadays

#

from there on it kinda went to shit

boreal iron
#

I mean the effort it took to make windows 10 work on like any system around the world costs a lot of money I guess

split hazel
#

not like any microsoft products are particularly light

#

it is hard making an os work on all hardware

#

impossible actually

#

you can only really get most

#

you have to rely on people writing drivers

boreal iron
#

The coverage of windows or windows server as light version is really good

split hazel
#

microsoft dont have time to write drivers for everything

boreal iron
#

Pre 11 versions of course

#

Brb

split hazel
#

tpm is the most useless requirement ever

#

only really newer motherboards have a satisfactory version of it

vivid fulcrum
#

that's their goal

#

can't complain about unoptimized os for low end pcs when you don't support low end mmLol

slender wagon
#

Real chad moment

vivid fulcrum
#

that's what i did

slender wagon
#

Same

#

I got an i5 gen 5

boreal iron
#

There’s still no advantage of using v11

#

Not at all

#

At least for users doing more on their pc than probably 99% does

fallen holly
#

will guys help me with my mongoDB connection

#

it is saying bad auth

boreal iron
#

It’s 50/50 in here

#

50% trolling and 50% serious answers

#

But in order to get any answer you need to provide some code and accurate error message

#

Of course without leaking your credentials

fallen holly
#

nvm it works now

bright hornet
#

Is this normal when creating an array object?

sharp geyser
#

if it is an array of objects then looks like it

bright hornet
#

Ah i see i see thanks

#

I thought its kinda one of the bugs

sharp geyser
#

What were yyou expecting it to look like?

boreal iron
#

Those numbers in front of your objects are your array keys

#

While the objects are the values

bright hornet
bright hornet
earnest phoenix
#

Is there a way to connect mongodb to nextjs project

boreal iron
#

To get an item you gotta iterate the entire array and search it by its name

#

Which isn’t really effective

#

So saving the inventory as object with item names as keys will make things a lot easier for you

bright hornet
lyric mountain
#

a better question would be WHY it's undefined

bright hornet
lyric mountain
#

how are u creating it?

bright hornet
#

Schema:

inventory: { type: Array, default: undefined, required: true },```
#

Command:

inventory: [{}],```
lyric mountain
#

there u have it

#

ur adding an empty object

boreal iron
#

According to your screenshot the first item isn’t undefined but has no Name and Value properties

bright hornet
#

Should i remove the inv on my command?

lyric mountain
#

you should remove that [{}]

#

use just []

bright hornet
#

ah isee isee

#

wait let me test

sharp geyser
#

ngl I thought that first object was the entrie's ID but ig I am just dumb

lyric mountain
bright hornet
lyric mountain
#

show current code

bright hornet
#

let me put it on sourcebin

#

hold a se

#

sec

lyric mountain
#

just put the relevant code

bright hornet
#

yep

lofty musk
#

Hello! So I'm trying to add Vote Rewards to my bot, I have the required packages installed via NPM because i'm using javascript but I have an issue can anyone help?

sharp geyser
#

so anywhere you set as 0 or an empty array or smth you can set as default and when you create an entry it uses those defaults

lyric mountain
#

are u supposed to set default as undefined?

sharp geyser
#

it saves on writing code

sharp geyser
bright hornet
bright hornet
sharp geyser
#

he is overwriting what the defaults are

bright hornet
#

let me change it

lofty musk
#

Like I send a test via the webhook I've setuped and have listed, and I'm hosting locally which I have my IP as the URL in the "Webhook URL" settings on the Top.gg settings page which is http://<my ip>:3000/bot/vote and I have a POST request and a GET request.

bright hornet
boreal iron
sharp geyser
# bright hornet let me change it

you can:

//Schema

const mongoose = require('mongoose');

const newAccount = new mongoose.Schema({
    nickname: { type: String },
    memberID: { type: String },
    health: { type: Number },
    max_health: {type: Number },
    min_damage: { type: Number },
    max_damage: { type: Number},
    guildStatus: { type: Boolean },
    guildName: { type: String },
    spouseStatus: { type: Boolean },
    spouse: { type: String },
    inventory: { type: Array, default: [], required: true },
    level: { type: Number, default: 1 },
    exp: { type: Number, default: 0 },
    limit_exp: {type: Number},
    cash: { type: String, default: 0 },
    bank: { type: String, default: 0 },
    warning: { type: Number, default: 0 },
    report: { type: Number, default: 0 }
});

module.exports = mongoose.model("accounts", newAccount);

//Command

new economy({
    nickname: game_name,
    health: 100,
    max_health: 100,
    min_damage: 1,
    max_damage: 50,
    guildStatus: false,
    guildName: null,
    spouseStatus: false,
    spouse: null,
    limit_exp: 100,
    memberID: author.id,
}).save();

You can also set any values you want to default to a specific boolean e,g guildStatus you might want to be false by default until it is changed in code or smth

lofty musk
# earnest phoenix what's the issue

When I send a test to the webhook UI have, it doesn't respond with anything in the console which I told it to log the vote property to return the info of the test result.

sharp geyser
bright hornet
#

ohhh

sharp geyser
#

so you don't have to set them again in the new economy({})

lyric mountain
#

actually all of those can be set to default

sharp geyser
#

probably unrelated to your issue

#

just thought I could tell ya

lyric mountain
#

except nickname and memberID

sharp geyser
bright hornet
#

it works

earnest phoenix
boreal iron
lofty musk
bright hornet
#

damn, i always do defaults with value on my command with my past project bots lmao

#

thanks for the info tho

sharp geyser
#

and if you wanna overwrite those default values you can supply the value in the creation of the entry ofc

lofty musk
boreal iron
#

brb in 2 mins

lofty musk
#
const { Webhook } = require("@top-gg/sdk")
const bot = require(`../bot`);
const Log = require("../Structures/utils/log");
const express = require(`express`);
const app = express();

const webhook = new Webhook("somestupidpasswordgoeshere");

app.post("/bot/vote", webhook.listener(vote => console.log(vote)));
app.get("/bot/vote", (req, res) => res.redirect(`https://top.gg/bot/982887627181158440/vote`));

app.listen(3000, () => Log.info(`API is now officially live on http://localhost:3000!`, "express"));

this is my code.

boreal iron
#

Make sure anything is done I mentioned

earnest phoenix
boreal iron
#

It doesn’t block a port in that range by default

boreal iron
#

But it doesn’t allow incoming requests on that port

earnest phoenix
lofty musk
#

Yeah, it's my primary OS.

bright hornet
#

One last question, how do I return if my inventory array is empty?

#

looks like if(!data) aint working

lyric mountain
#

then it aint empty

#

empty arrays are falsey in js

bright hornet
earnest phoenix
bright hornet
lyric mountain
#

print the array to see if it's empty

bright hornet
#

wait a sec

#

validator.inventory === []?

lyric mountain
#

well, u can try if (inventory.length === 0) but idk

#

it should be false as is

bright hornet
#

ah length

#

wait let me

boreal iron
#

Without forwarding your port 3000 to your local device nothing will pass the router in the first place

#

Also consider to test and run the webhook listener on a server

bright hornet
boreal iron
#

If not you need to adjust the port forwarding rules if the LAN devices have a dynamic IP (which they have be default) as well as update your IP on topgg as it changes frequently

lyric mountain
#

and if length returns anything

#

remember js won't throw errors if u try to access an invalid property

fallen holly
#
let prefix = await db.fetch(`prefix_${message.guild.id}`)
                          ^

TypeError: db.fetch is not a function

#

idk why it is saying that

quartz kindle
#

what is db?

fallen holly
#

quick.db

quartz kindle
#

i dont see any fetch

fallen holly
#

they changed fetch to get

lament rock
#

same with ==

#

They're different pointers

fallen holly
#

now it's saying db.get is not a function

quartz kindle
sinful tinsel
#

hello! I'm fairly new to bot making but I was wondering if possible how to make a bot that can only speak in a single channel, but respond to messages from any channel

quartz kindle
#

regardless of which channel you receive it from

sinful tinsel
#

oh! I'll look into that right now thank you so much

bright hornet
#

How do i get the User part? its on collected.on, i.author?.User didnt work tho

#

even .length

#

or using [index]

quartz kindle
#

collected is likely a collection of multiple items

#

not a single item

#

collected.first() or collected.find() or collected.get(), depending on what you want

bright hornet
#

my goal is to compare the i.content to message.author.id

bright hornet
quartz kindle
#

depends on what the variable actually is

#

show code

bright hornet
#
collector.on('collect', async (i) => {
    // try {
    //     return console.log(i)
    // } catch (err) {
    //     return console.log(err)
    // }
    if (i.author.User.id === message.author.id) {
        const embed = new MessageEmbed()
            .setDescription("Are you going to marry yourself?")
            .setColor('RANDOM')
            .setTimestamp()

        message.channel.send({
            embeds: [embed]
        })
    }
})``` this is the current
#

ah fak

#

wait

quartz kindle
#

it seems like what you want is i.author.id

bright hornet
#

what the f-

#

i thought

#

i need to include the User

#

thanks

quartz kindle
#

User is shown to explain what author is

#

author is an instance of a User class

bright hornet
#

Ohhh

#

Without :

#

not gonna include?

#

alright thanks thanks

fringe jewel
#

Anyone familiar with the npm Discord-Player? How to fix this error?

pine nova
#

ur client is undefined

bright hornet
#

How do i compare bot's id?

#

like srsly

#

client.user.id return as false

sharp geyser
#

show code?

bright hornet
#
if (i.content === client.user.id) {
    const embed = new MessageEmbed()
        .setDescription("Are you going to marry a bot?")
        .setColor('RANDOM')
        .setTimestamp()

    message.channel.send({
        embeds: [embed]
    })
}```
it return as `log(false)`
sharp geyser
#

what is i.content

bright hornet
sharp geyser
#

🤔

#

so it won't be an id

#

if you log i.content it won't be an id

bright hornet
#

oh yea right

#

i forgot

#

let me log first

bright hornet
#

like wt

#

let me change the position

#

wait

sharp geyser
#

well that isn't how you wanna do it

lament rock
#

Use a regular expression to extract the ID

sharp geyser
#

or

lament rock
#

IDs aren't a fixed length

sharp geyser
#

if they are using djs they can grab the mentionable

#

assuming i is a message

#

i.mentions.members.first()

#

returns a member object

lament rock
#

or null

sharp geyser
#

if it isn't cached yes

#

alternatively though since they just wanna compare ids they can do i.mentions.users.first() which iirc doesn't return null but the user object

bright hornet
#

im using collection

sharp geyser
#

I haven't looked at the docs

bright hornet
#

so yeah

lament rock
#

users aren't always cached

#

and if there are no mentions in the first place then HibikiShrug

sharp geyser
#

they just said they were using mentions my guy

lament rock
#

Is it actually required for there to be mentions though. General users aren't the dev

bright hornet
#

client.user.id but this is the every bots id right?

sharp geyser
sharp geyser
bright hornet
#

strange asf

sharp geyser
#

not really

bright hornet
#

i mean

#
const new_content = i.content.slice(2, -1)
client.user.id === new_content```
return as false
lament rock
#

!action <user>

can be done as:
!action @sharp geyser
!action Misty
!action 957347862314905610
!action Insert Misty's Nickname Here

bright hornet
#

i also use i.content.includes("<@") for new_content

pale vessel
#

It could also be <@!

bright hornet
#

probably thats why

lament rock
#

isnt @! deprecated

pale vessel
#

The opposite I think?

sharp geyser
#

no I am pretty sure they deprecated it

pale vessel
#

@sharp geyser

#

Hmm that's on Android RN

lament rock
#

waiting on v6 and v7 to die

sharp geyser
#

@pale vessel

#

yea no

lament rock
#

Doesnt resolve on iOS

bright hornet
#

@scarlet kestrel

pale vessel
#

Desktop?

sharp geyser
#

yep

#

on desktop

pale vessel
#

Icic

#

@pale vessel

#

Try my ping

sharp geyser
#

we just did

bright hornet
#

@pale vessel

#

xd

pale vessel
#

Oh lul

lament rock
#

@pale vessel

#

!

bright hornet
#

same with bot tho

sharp geyser
#

5head

sharp geyser
pale vessel
#

The yellow highlight is very faint with dark AMOLED

bright hornet
lament rock
#

What I was highlighting was that if there are no checks for if the user is actually inputting a mention, then trying to access first mentioned members will give null

sharp geyser
#

well yea

bright hornet
#

wait

#

should i do i.user.id

#

instead of client

sharp geyser
#

client is the bot

bright hornet
#

strange

lament rock
sharp geyser
#

I assume i is an interaction so i.user.id would return the id of the user who used the interaction

lament rock
#

I forgot interactions exist

sharp geyser
#

lol

lament rock
#

content doesnt exist on interactions

#

message based interactions have a message property attached iirc

#

context menu commands dont tho

carmine summit
#

am I dumb? or is chrome messing with my arrays?

bright hornet
#

open the (2)

sharp geyser
#

looks like it is creating a 2D array in some places unless my eyes are playing tricks on me

lament rock
#

The entire array is a 3D array

sharp geyser
#

is it

#

I can't see that well

bright hornet
#

lets try with <@!