#development

1 messages · Page 559 of 1

earnest phoenix
#

lmao

#

Jesus, sharding is actually fairly simple yet annoying af. I remember those days when I was fucking clueless to sharding 😂

quartz kindle
#

i havent sharded yet actually

earnest phoenix
#

How many guilds you at?

quartz kindle
#

~560

earnest phoenix
#

ooo

#

What bot

amber fractal
#

You could say that I "shard" but it only spawns 1 instance, so it doesnt actually make a difference

quartz kindle
#

@oak sentinel

earnest phoenix
#

ooo

amber fractal
#

I just dont wanna deal with it later tbh

earnest phoenix
#

It's certified too lmao

amber fractal
#

I just dont think his bot reaches a high amount of people do to it's nature and uses

#

guilds*

#

higher*

#

I mean 560 is good mmLol

quartz kindle
#

yeah my bot has a very specific target audience

#

i like bots with specific uses

amber fractal
#

The way I worded that made it sound like I was putting your bot down mb

quartz kindle
#

lmao nah

#

its better this way actually, because its code is a damn mess, and its not compatible with sharding

#

so i have more time before i need to refactor it

#

im still using a json database lmao

amber fractal
#

thats my fear that when I shard it will just break, but it shouldnt because all of the dbs are connected. but if it does idk what I'll do mmLol

quartz kindle
#

you can create another bot account to test it

#

or you can run it in the same bot account but in a different folder/process

#

and rename all your commands

#

i did this a few times

amber fractal
#

I have a bot that just runs a bunch of processes that I test on

#

Its not efficient at all

#

but I dont feel like making a new bot account for every test on other bots

sick cloud
#

rethink is the best for sharding bc of pools

#

but i just added sharding and hoped it'd work

#

lmao

quartz kindle
#

many databases have pools

#

sqlite has pools as well

sick cloud
#

also rethink is realtime

quartz kindle
#

i think having a database server for a discord bot is overkill, unless you're on hundreds of thousands of guilds

indigo notch
#

MangoDeeBee is gucci

#

My boat has 80k documents and 5mb

viral spade
#

hey again,
i just added sharding (discordjs) by simply put the bot file into the shardmanager module. my bot should make 2 shards and is on 2 servers. Now it is working, two instances are being made, but they seem to share their servers, everything i do gets triggered twice. you know what could be the problem?

indigo notch
#

Dont sbard on e servers

#

Sh0w c0d3s

viral spade
#

Thnaks you it works now. i think.

amber fractal
#

Well they'll be on the same shard

#

either way

#

Shards are assigned to guilds like this (guild_id >> 22) % num_shards == shard_id

viral spade
#

where is the serversize info in the shardingmanager object? cant find it

amber fractal
#

Wdym

#

How many servers are on the shard?

viral spade
#

ye, or the total server count on all shards. just need it for sending serverstats

amber fractal
#

You'll need to broadcast eval to do that

#

afaik you have to add up the total amount on each shard individually

viral spade
#

when sharding it seems easy to send a message to a certain channel, that is not on the same shard. simply let all of the other shards look and send if found. but what about sending msges to certain users? if some are on multiple shards, then they get multiple times the message?

amber fractal
#

DMs always go through shard 0

viral spade
#

hmm how does that help me? i want to send a dm message to a specific shard-extern user with userid, from within another shard

ruby dust
#

all dms are always on shard 0, no exceptions

#

and sending a message in a specific shard is not an issue if both shards are from the same process, that usually happens if you are using lib's auto sharding

quartz kindle
#

if you want cross-shard scripting, you need broadcastEval

#

ie: to send dm > broadcastEval > send message if shard.id === 0

#

it will be broadcasted to all shards but only executed on shard 0

lusty dew
#

How would I get the Message author in python rewrite

earnest phoenix
#

Message.author

#

whatever

viral spade
#

@quartz kindle ok nice but does shard 0 cache all users from all shards?

lusty dew
#

I am getting Undefined Variable 'Message'

quartz kindle
#

@viral spade users from dms are not cached

#

i think

lusty dew
#

Tim

quartz kindle
#

not really

lusty dew
#

Ok

#

I used to know it

#

But that was async

#

not rewrite

quartz kindle
#

have you checked the rewrite docs?

viral spade
#

so if i send a message like you said to shard 0, which does a bot.users.get(id).send(msg), it will always be able to retireve that user and send that message, even if this user is not on a server of shard 0?

quartz kindle
#

i think you can broadcast the user object

#

like broadcast message.author.send("message")

#

im not sure tho

#

let me see if i find an example

inner jewel
#

shard 0 is not guaranteed to have the user cached

#

what you can do

#

is fetch the user by id

#

and then send a DM

viral spade
#

i cant broadcast the user object. all i have is a userid integer in some shard

inner jewel
#

yes

#

you can fetch that

#

there should be a method in the client

#

to get the member object from discord

#

then you can send a DM

#

or, if d.js exposes raw access to the REST api, you can just send the dm with the user id

quartz kindle
#

i remember seeing an example of sending the user object to the broadcast together with the message, but yeah you can use .fetch and then dm

viral spade
#

you mean there should be method to retrieve the shard-extern userobject inside the shard with the client object?

#

oke gonna check that thanks!

#

that sharding business is nasty

inner jewel
#

that only happens because the lib requires an user object to dm

#

you could do just java catnip.rest().user().createDM("userid") .thenCompose(dm -> dm.sendMessage("hello world"))

#

if the lib exposes raw rest access

#

<imagine that being in $YOUR_LANG>

sick cloud
#

pretty sure eris exposes a bit of the rest api right @inner jewel?

inner jewel
#

¯_(ツ)_/¯

#

i've never used it

quartz kindle
#

i dont think d.js does

sick cloud
#

in the docs it lists some things like getRESTUser

#

d.js is too dumb for it

inner jewel
#

that's probably GET /users/:id

quartz kindle
#

d.js = macbook confirmed

inner jewel
#

pretty sure djs exposes that one too

quartz kindle
#

d.js's .fetchUser() uses the rest api if a user is not cached

#
  fetchUser(id, cache = true) {
    if (this.users.has(id)) return Promise.resolve(this.users.get(id));
    return this.rest.methods.getUser(id, cache);
  }```
sick cloud
#

ew stable

lusty dew
#

Yea I have TIm

#

They don't really explain well on how to use their methods and such

quartz kindle
#

it should be <message>.author

lusty dew
#

Ah ok

quartz kindle
#

message being whatever you named incoming messages

lusty dew
#

Wdym?

amber fractal
#

whatever the message object is defined as

sick cloud
#

like if you name the event noodle

#

itll be noodle.author

lusty dew
#

so I would put

#

client.author?

#

A bit confused

amber fractal
#
notamessage.author
})```
quartz kindle
#

you can name the underlined message whatever you want

lusty dew
quartz kindle
#

if you do (self,shit)

amber fractal
#

wait

quartz kindle
#

it will be shit.author

lusty dew
#

Ah ok

amber fractal
#

Still basically the same

lusty dew
#

I would need to make a onn message event

amber fractal
#

yes

lusty dew
#

I forgot to do that uwu

#

xD

amber fractal
#

🤔

#

Lol

lusty dew
#

I was meaning to do that last night and totally forgot about it

#

someone told me I needed one last night

#

oof

#

Those messages sent out of order btw

#

@quartz kindle Is that image you sent in a @client.event() ?

viral spade
#
      let sentArray = await bot.shard.broadcastEval(`
      ...
}

is there an easier way to access the client ('bot') object than passing it down functions from the initial 'message' trigger

inner jewel
#

why broadcast eval?

#

just fetch the user then send

steel heath
#

@quartz kindle anyway to get that cached users with eval?

inner jewel
#

client.fetchUser(id).then(u => u.send(...))

viral spade
#

ah i thought i should send the dm through shard 0?

inner jewel
#

no need to

viral spade
#

ok nice

inner jewel
#

all messages are sent via REST

#

which has no concept of shards

#

DMs are received on shard 0

fluid basin
#

@viral spade message.client

viral spade
#

i see. so i would have always sent that broadcast to itself?

#

@fluid basin thnaks! i was hoping for exactly something like that

inner jewel
#

no need to broadcast anything

viral spade
#

no just saying if i had broadcasted it to shard 0 to send the dm it would have always broadcasted only to itself

#

whatever thanks very much

fluid basin
#

well not sure if using client would miss out on any custom variables you added to bot

inner jewel
#

uhhh

#

you seem to be misunderstanding

#

DMs being received on shard 0 means that only shard 0 receives the message events for dms

fluid basin
#

if you want the safest method, in your onmessage handler just add message.bot = bot; and use message.bot in the module

inner jewel
#

d.js already has message.client

fluid basin
#

hmm I wondering if like custom arguments would get passed

#

iirc it does I think

#

like bot.asgdhdhebidnei = "lol";

steel heath
#

yes if you meant this my custom functions, am too lazy to use something else when i can do this

viral spade
#

@inner jewel hmm i wanted to send every dm from shard0. so when another shard receives a dm, i wanted to broadcast it to shard0, who then sends it. As every dm gets received by shard0 anyway, it would have only broadvasted to iteself, no?

inner jewel
#

why send from shard 0?

#

there's no benefit in doing that

viral spade
#

i got that now

#

just saying it would have

inner jewel
#

there isn't any concept of shards when sending

#

you just say "send message to channel <id>"

viral spade
#

ya it should be user

inner jewel
#

no

#

you always send messages to channels

#

a dm is just a type of channel

#

djs doesn't expose this

#

but there are two requests when sending a dm

#

first to create the channel (which just returns the existing channel id if already created), then to send the message

viral spade
#

ok nice. thansk very muh

viral spade
#

do i have a possibility inside a shard to get info what shard i am?

ruby dust
#

how would I get the current shard's id in discord.py?

#

oh wow, we have a similar question

turbid pumice
steel heath
#

whats the difference between using classes and using just pure javascript without class or super or constructor thingies

inner jewel
#

one you have classes the other you don't

steel heath
#

whats the profit of having classes

inner jewel
#

inheritance/etc

#

you get oop

#

without having to deal with the prototypes yourself

quartz kindle
#

i havent tried using classes yet, im still practicing using prototypes

#

i'll try them on my next project

inner jewel
#

fp

steel heath
#

do u think using classes would decrease the memory usage

inner jewel
#

the difference won't be noticeable

#

depending on what you have now, it might increase or decrease

#

but won't change much

viral spade
#

i read that classes translate to prototypes and basically is the same, just different syntax

steel heath
#

oh then i got something to do with this ram usage and i dont know what to do

#

great

sick cloud
#

classes arent prototypes

earnest phoenix
#

!!

quartz kindle
#

afaik, everything in js is prototypes, so yeah, classes get internally translated to prototypes

#

@earnest phoenix logChannel is null (ie: channel doesnt exist)

earnest phoenix
#

😮

#

but it does T-T

quartz kindle
#

then your code is wrong

earnest phoenix
#

gg

#

@quartz kindle WOW i spelled logs wrong im ctfu LOL

#

thanks

earnest phoenix
#

someone know how to create a class per server ? in website

#

blblblblbl

#

ping me

inner jewel
#

with a loop

earnest phoenix
#

owh

earnest phoenix
#

@inner jewel i'm lost

sturdy delta
#

Yu

earnest phoenix
#

i go sleeping

#

my brain is going to explode

silver lintel
#

how can you make the bot send a message when it joins a guild?

amber fractal
#

Your librarys docs probably explain this

silver lintel
#

ok

#

like would it be an event?

amber fractal
#

Yes, there is an event for it

earnest phoenix
#

@silver lintel

#

//joined a server client.on("guildCreate", guild => { console.log("Joined a new guild: " + guild.name);

#

This is return console.log

#

So you can send a message to the server owner

#

message.guild.owner.send("")

sick cloud
#

don't do that

earnest phoenix
#

Could someone help me plz

sturdy delta
#
const discord = require('discord.js')
class AFKCommand extends commando.Command
{
    constructor(client)
    {
        super(client,{
            name: 'afk',
            group: 'status',
            memberName: 'afk',
            description: 'Adds AFK to your nickname, so others know you are AFK!'
        });
    }

    async run(message, args)
    {
        message.member.setNickname(`[AFK] ${message.author.username}`)
    }
}

module.exports = AFKCommand;

console.log('AFK command is online')``` help it isnt working?
silver lintel
#

why does my console say channels is undefined

bright spear
#

@silver lintel always send the lib and version, and the error

earnest phoenix
#

I keep getting this error and not sure how to fix it

TypeError: Cannot read property 'command' of undefined

#
  if(err) console.error(err); //error if failed reading commands

  var jsfiles = files.filter(f => f.split('.').pop() === 'js'); //Checks that it is .js
  if (jsfiles.length <=0) {return console.log('No commands found...')}
  else { console.log(jsfiles.length + ' commands found.') }

  jsfiles.forEach((f, i) => {
    var cmds = require(`./commands/${f}`);
    console.log(`Command ${f} loading...`);
    bot.commands.set(cmds.config.command, cmds);

  })




} )```
silver lintel
#

so im using discord.js v11.4.2 and heres my code

#

the error is:

late hill
#

@earnest phoenix What do your command files look like

#

I don't know what bot.commands.set would do but like

#

From the error it seems that cmds.config doesn't exist

#

@silver lintel Because channels don't have a guild property

#

In discord.js there are channels and guildChannels

silver lintel
#

so what do i do?

bitter sundial
#

shouldn't the channel object be of the appropriate channel type and Channel object is just a basic base for the other types to extend on

#

at least when getting them from client.channels they should have the correct type

last apex
#

Hey can someone give me hand I'm currently having trouble.

knotty steeple
#

i dont think thats how it works

last apex
#

what doesn't

#

@silver lintel I can help you.

quartz kindle
#

´.kick()´ returns Promise<GuildMember>

#

it doesnt return a message

#

just reuse the previous message object

last apex
#

so what should I add?

quartz kindle
#

just dont replace the message object

#
message //message object
...kick().then(message => { // message object replaced by a guildMember
    // message here is a guild member, not a message
});```
daring flume
#

is there anyone can help me for my problem on pycharm

ruby talon
#

Explain the problem, then we might be able to help. 🙂

daring flume
#

ok, main problem is my pip version is 10.0.1 but for download another module i should upgrade my pip to latest version however for upgrade i need latest pip version

#

so as you can understand it is look like something impossible

ruby talon
#

That isn't a pycharm problem.

daring flume
#

so what is it

#

and how can i fix it

#

i little bit search the internet

ruby talon
#

python.exe -m pip install --upgrade pip

#

Cmd command.

daring flume
#

yes but cmd says C:\Users\MİHROŞ>python -m pip install --upgrade pip
'python' is not recognized as an internal or external command,
operable program or batch file.

ruby talon
daring flume
#

@ruby talon firstly thank you vry much its look like i solved pip version but now new problem occured and this time i totally dont get it

#

it says

#

DEPRECATION: Python 3.4 support has been deprecated. pip 19.1 will be the last one supporting it. Please upgrade your Python as Python 3.4 won't be maintained after March 2019 (cf PEP 429).
Exception:
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\pip_internal\cli\base_command.py", line 176, in main
status = self.run(options, args)
File "C:\Python34\lib\site-packages\pip_internal\commands\install.py", line 315, in run
resolver.resolve(requirement_set)
File "C:\Python34\lib\site-packages\pip_internal\resolve.py", line 131, in resolve
self._resolve_one(requirement_set, req)
File "C:\Python34\lib\site-packages\pip_internal\resolve.py", line 297, in _resolve_one
dist = abstract_dist.dist()
File "C:\Python34\lib\site-packages\pip_internal\operations\prepare.py", line 90, in dist
self.req.source_dir))[0]
IndexError: list index out of range

#

it looks like i have to upgrade my python

ruby talon
#

Yep

#

Uninstall python 3.4 and install 3.7

#

Y would you still use 3.4?

violet jetty
#

read 1st line

ruby talon
#

?

slender thistle
#

3.6 is fine, honestly

lost swallow
#

my bad

viral spade
#

Hey i got a tricky question today. i hope i can articulate it well.

in my app.js/index.js (d.js) i spawn 5 ShardManagers (= 5 Discord Bots, each may be in different servers). When a user types a certain command in any of those (on 'message') i need to take one of the ShardManagers that a) has a shard that is on that server and b) is not already busy in that specific server. Then ofc mark it as busy for that server, until its job in that server is done. When such a message event occurs, multiple bots are very likely to "compete" at the same time to do the job, but only one must succeed.

  1. How do i access the 5 Shardmanagerobjects in the shards on'message' trigger function? Over some proccess (process.shardmanagers = []) wide variable that i create in app.js maybe?
  2. What datastructure can i take for the "busy list", as it needs to be thread save. When using mysql i can "INSERT IGNORE (serverid,botid)" and only on success i execute the server intern work. Other bots firing the Insert "at the same time" will get an error and i can be sure only one succeeded i think. However doing this in persistent memory is not necessary because the list is small and a job takes only a few seconds. Is there a thread save way of doing this in a processwide in-memory variable or database?
amber fractal
viral spade
#

^^

#

you thinking "omg, where should i begin to remedy your misunderstandings"

amber fractal
#

Shards only handle specific servers, no server would have multiple shards anyways

viral spade
#

ye i know

prisma sedge
#

wow thats a big oof

amber fractal
#

Then why did you say that multiple bots would "compete"?

viral spade
#

yes a server has multiple shards, because they add multiple bots

amber fractal
#

Wait

viral spade
#

they have multiple shards within app.js, not withing one shardmanager

amber fractal
#

Wot?

viral spade
#

one server can be in multiple shardMANAGERS

prisma sedge
frozen kettle
#

The real question is why do you need five different bot accounts with five different tokens in a single NodeJS process Thonk

viral spade
#

because the job is a voice channel activity and a bot can be in only one voicechannel at the same time per server. when two people from the same server trigger the command, i want to let bot1 join voicechannel for user1 and bot2 to join the other channel for user2

#

i said its a tricky question^^

daring flume
#

@ruby talon there is a problem

frozen kettle
#

By the way, about the 2/, if I understand well, you want to use MySQL to create a TODO-list of things your bots must do ?

#

(Like a queue)

viral spade
#

no

daring flume
#

py charm doesn't read python 3.7 @ruby talon

viral spade
#

it is a busy-list. when user triggers a command the node process should look for a bot that is not already busy in that server

#

and send it to that server to do the job, meanwhile add it to the busy list so it gets not send again while its doing its job

#

Queue is not possible because the job has to be done instant or not at all, if no bot is available for that server, all are busy

daring flume
#

so in my pycharm i have got new problem (not surprisng) it says : error: [WinError 5] Access denied: 'c:\users\mi\u0307hroş'

amber fractal
#

Basically it has no access

#

Kinda what the error said tho mmLol

daring flume
#

thank you but problems ar not ending

#

i am getting crazy

#

since 2 weeks i am trying to figure this out

#

now it says ModuleNotFoundError: No module named 'setuptools'

#

but these are setup tools

#

they have to be there

#

now i will install them manual from cmd

#

at least ill try

#

by the way i dont know anything abou programing or writng code

#

i was trying to learn something bu these problems occured

#

and i coulnt make it

#

can anyone help me

ruby talon
#

@daring flume ur trying to import a file that python does not find.
This might be because the file is not in a package, its not in the library folder thing, maybe wrong name

daring flume
#

but i am just hitting the "Install packaging tools" button

ruby talon
#

oh

#

what are you trying to install?

daring flume
#

i guess i am trying to install pip and setuptools modules

ruby talon
#

Is it Pycharm that you want to install?

#

Or just Python itself?

daring flume
#

pycharm

ruby talon
quartz kindle
#

@viral spade if i understood correctly,you're trying to manage multiple bots like a "pool", correct? if so, there are several ways of achieving this:

  1. simply have each bot use a different prefix and let the user decide which bot goes on which channel. this is the most commonly used method
  2. you would need one bot dedicated to "listening" to commands, keep a list of which bot is assigned where, and order another bot to do the job, either by creating an internal api, using a discord dm, or by setting up some form of IPC
  3. you can give each bot a certain "priority" and check if a bot with a higher priority is busy or not, and only execute if none of the bots with a higher priority are available. you can keep track of busy statuses in a shared real-time database
#

just a few examples

viral spade
#

@quartz kindle thanks! yes i also thought about each option already.

  1. is not user friendly enough for me.
  2. seems unnecessary complicated and it would be nice to have each bot an "equal", this way it doesnt matter which invitelink the user uses and it doesnt depend on 2 invites ( 1 listener and 1 executer to be functioning)
  3. is my way to go and best, dont you think? but i dont really need a priority, i just ned any (server-specific-)ready bot. its the shared real-time database i was talking about in my question when asking for a proper datastructure that ensures that if two bot fire an insert command at the same time, only one succeeds and there is no error or race conditions. Is there an in-memory option for this? can i store in in my app.js in a process wide variable and access it from the shard intern trigger functions?
inner jewel
#

@quartz kindle bots can't DM each other

quartz kindle
#

oh lul

inner jewel
#

they used to be able to

#

but get 2 broken bots dming each other in a loop forever

#

and you can imagine why it's not allowed anymore

quartz kindle
#

@viral spade redis is pretty much the best in-memory database solution, and it has tools to check for modifications and abort writes if the value changes in the middle of an operation

#

so you could do something based on race-conditions: both bots attempt to change a single value, whichever one succeeds continues the execution, while the other interrupts

viral spade
#

what about the array of bots? can i do it processwide in my app.js file and accesss it in my shards trigger functions later?

inner jewel
#

if you use external sharding, no

viral spade
#

what do i use?^^

#

i know globals are not shared, but proccess values should be ok no?

quartz kindle
#

i believe shardmanager is external sharding

inner jewel
#

no

#

no memory is shared

#

each process is completely isolated

#

no variables can be accessed from another process

viral spade
#

but from parentprocess maybe?

inner jewel
#

no

quartz kindle
#

you can use redis for inter-process variable sharing

inner jewel
#

there's no way. period.

quartz kindle
#

if you're not sharing complex objects

viral spade
#

but i cant use redis for saving the shardManager bot object??

quartz kindle
#

no

inner jewel
#

you can't share variables in any way

#

you'll end up having to write some ipc stuff

viral spade
quartz kindle
#

i believe those are child processes

viral spade
#

the proccess.env test seems to be accessible anywhere

quartz kindle
#

they are all part of the same process

inner jewel
#

it's being read by each process

viral spade
#

so i have this a s proper shared memory?

inner jewel
#

no

#

you can't share memory at all

#

it's 100% impossible

#

by design

viral spade
#

so its just copied on creation?

quartz kindle
#

im not sure about the details, but i believe node's child process is still part of the main process as far as memory usage goes

inner jewel
#

but you can't share any data in memory

#

unless you decide to play with /dev/shm or whatever

#

but then you get a ton of new issues to deal with

#

and have the fun of having to deal with thread safety yourself

quartz kindle
#
child_process.fork(): spawns a new Node.js process and invokes a specified module with an IPC communication channel established that allows sending messages between parent and child.```
#

is that what the shard manager uses?

viral spade
#

@inner jewel
okey so you think i should take some ipc nodejs module for that? then i can access client objects accross clients?

inner jewel
#

you will never be able to do that

#

unless they are in the same process

viral spade
#

okey, maybe some webhook?^^

quartz kindle
#

why exactly do you need to access the client object in another process?

inner jewel
#

just send a message to it

#

could even use eg redis pubsub

#

send("bot-1-shard-1", {someData: "goes here"}) or something like that

quartz kindle
#

oh yeah i forgot redis also has pub/sub

#

that could be the best option

viral spade
#

ok that redis pubsub seems nice.
how about this way now:

When a user sends a command, the receiving shard releases a pubsub to all shards(accross bots,including itself ) "hey do x in server y (from command messageid z)".

All shards will now look: do i have that server on me? and if yes try to add its own botid,serverid,cmdMsgid to the database. As i'd make [botid,serverid] aswell as [cmdMsgId] unique keys i can be sure that if the shard succeeds inserting it 1. has no other job on the same server atm (bc [botid,serverid] is unique) 2. no other shard has taken the job already (bc [cmdMsgId] is unique).
All other shards will fail as cmdMsgId is then already in the db.

The succeeding shard will then perform its operation and afterwards delete the inserted entry again from the db.

could it work like that?

quartz kindle
#

yes, you can use the message id as the unique key

#

you dont even need to use redis's watch or anything like that, you can just use SETNX - Only set the key if it does not already exist.

viral spade
#

i guess i get a promise/callback which will only resolve in one of the shards then. However i was just reading it seems difficult to have composite keys in redis, thats a problem.

quartz kindle
#

redis responds with 0 or 1 if the operation succeeded or not

#

what do you mean composite keys?

viral spade
#

[botid,serverid]

#

they should be a key but only together. [botid,serverid2] is a different key

#

as every bot can be in one voicechannel per server only

quartz kindle
#

yeah but if you use botid as a key, all bots will execute, because all keys will be different

viral spade
#

no because only one bot get the [cmdMsgId] unique insert

quartz kindle
#

you should use messageid as a key, that way only 1 bot can respond to any given command

viral spade
#

i need both

#

and i can make both keys

#

at least in mysql

quartz kindle
#

redis is a key->value store

viral spade
#

thats the problem

quartz kindle
#

what exactly do you need?

viral spade
#

tahts why i said it seems to be difficult, not impossible

#

i need two unique keys, one of them composite

quartz kindle
#

redis does composite keys as a single key string

viral spade
#

As i'd make [botid,serverid] aswell as [cmdMsgId] unique keys i can be sure that if the shard succeeds inserting it 1. has no other job on the same server atm (bc [botid,serverid] is unique) 2. no other shard has taken the job already (bc [cmdMsgId] is unique).

#

i need both keys to achieve both things, no job done twice, no job given to a busy bot

quartz kindle
#

but a job is based on a command

#

you wont ever have a situation where you need more than one bot respond to a single command

#

do you?

viral spade
#

but it can only be executed by a bot that is not already busy on the server that the command came from

slim lion
#

I need help to male a bot

viral spade
#

without the composite key, if two trigger come from the same server at the same time (= two different cmdMsgIds) it would otherwise send the same bot twice to a voicechannel at the same time (maybe the same, maybe not).

With the composite key, If the second trigger occurs, the bot that got the job last time will not be able to insert its [botid,serverid] because it is already in the db (but with a different cmdMsgId)

#

But at the same time the bot will be able to insert and do the job, if only the serverid differs. In this case he does two jobs at the same time on two different servers, which is nice.

quartz kindle
#

@viral spade with redis, there is no such thing as tables or any form of linking data, you need to create indexes and keys yourself, so you would need to manage multiple sets of keys, for example having message key thats basically the job id, and another key that saves bot id and server id. or something like that

#

you can also try using sets and hashes, which are the redis equivalents of arrays and key->value objects

viral spade
#

i just checked it out a bit but it doesnt seem like i can easily achieve this unique key structure in redis

#

sets and hashes those are nice when you have one primary key, no other uniques, right?

quartz kindle
#

you can have a set like this: botID -> busyguild1,busyguild2,busyguild3,etc... so your bot checks if itself is busy in a guild first, and then execute the jobID key attempt

viral spade
#

you mean two different sets?

quartz kindle
#

yeah something like that

#

each bot has its own set, then another set for jobs, where they race against

viral spade
#

problem is with the race conditions. this way id need to have multiple steps to update the db no?

sand crown
#

How much memory would you recommend for a discord bot vps?

viral spade
#
  1. insert to busybots: botid -> unique servername
    on error do nothing
    on success
    2. insert to cmdmsgids: cmdMsgId
    onerror remove botid -> servername again
    on success
    do job
    remove botid -> servername & cmdMsgId

like this? then all the triggered bots will insert themselfes to busybots, and remove themselves again (except the one finishing the cmdMsgId insert). not beautiful but also not terrible. what do you say?

#

@sand crown really depends on what the bot is doing. my bot with 500 servers need about 30mb in total with 2 shards (but i guess most of that is overhead). i wouldnt worry about it too soon, or if you have a very special algo that needs a lot of memory. You can also always take a cloudhoster that allows you to add more ram as you need it.

sand crown
#

Which host would you recommend? And can you define shards, very new to the site and this community.

amber fractal
#

Sharding is splitting a single process into multiple instances

#

I think

viral spade
#

Sharding is wehn bot reaches 2500 users and you need multiple instances because of the server limit

#

also something to worry about not now^^

sand crown
#

My bot is at top 4 trending. Has been added to well over 550 guilds in a few days

viral spade
#

i really dont know the landscape but i was just fine with digitalocean vps

sand crown
#

I'm just worried the ram usage will be too high, and the bot will start to lag.

viral spade
#

which one?^^

#

i am the same lol

amber fractal
#

I use ovh

#

theres some providers listed in the pins here

sand crown
#

Sent you a dm Lin

viral spade
#

@sand crown but yeah in that case id worry about sharding. actually i did already 😃

inner jewel
#

sharding is splitting your bot into multiple gateway connections

#

which allows both you and discord to better balance the load

sand crown
#

Just had Linck explain it, thank you tho 😃

inner jewel
#

you don't need to have 2500 guilds to shard

#

you're forced to shard at that

#

but you can shard whenever you want

sand crown
#

Will a notification take place when sharding should be done?

inner jewel
#

no

earnest phoenix
#

wym

inner jewel
#

but you get an error from discord if you don't shard

#

and your bot fails to connect

earnest phoenix
#

discord wont send you anything, it will just not allow you to connect to the gateway

#

yes

sand crown
#

Alright, thank you @inner jewel

deep inlet
#

@prime cliff

#

Hi

#

Um

#

So

#

What's the equivillent of JS objects in C#?

#

Please don't say classes

prime cliff
#

But it is class 🤔

earnest phoenix
#

classes...?

deep inlet
#

Ok

#

Fine

#

So 2 part question

#

I'm working in Unity

#

I want my script to be efficient

prime cliff
#

Starting C# with unity wew

deep inlet
#

What's an efficient way to make a key map?

earnest phoenix
#

c# unity is uh barely native c#

deep inlet
#

I know, but it works

#

So

#

Yeah

#

I wanna make a key map

#

How

inner jewel
#

google is your friend

#

c# map type

deep inlet
#

OWO

#

MAP LOOKS AMAZING

prime cliff
#

For general usage of mapping something you can use a dictonary
for example you can map specific objects to a key
Dictonary.add(1, OBJECT);
Dictonary.add(3 OBJECT);

And you can call them with Dictonary[1]; or like below Dictonary["test"];

Dictonary.add("test", OBJECT);
Dictonary.add("hello", OBJECT);

deep inlet
#

Hm

#

How would I make it customizable from the inspector tho....

#

Also, what's the type for a func?

#

Do i just do void?

#

Nope. Doesn't work

#

I think what I need is struct. No?

prime cliff
#

void means that the function does not return anything

#

@deep inlet you should lookup some guides or tutorials on C# if you want to learn it properly C# has some nice features that you can learn to use

deep inlet
#

All of them are usually using if statement chains for newbies

#

When I wanna be efficient off the bat

sick cloud
#

i tried width:100% on body but that didn't work

quartz kindle
#

you mean the whitespace on the bottom? where is this on?

#

a dbl page?

sick cloud
#

yeah dbl page

#

i have the content stuff set as #000000

#

but the very bottom doesnt wanna change

quartz kindle
#

my bot page looks fine if i put black background on body

#

wanna dm me your page?

sick cloud
#

uhh

#

sure i guess

#

i set my body as black too and it didnt work

quartz kindle
#

is it youtube? i checked it out and looks fine here lol

sick cloud
#

show?

#

theres whitespace for me

#

@quartz kindle ^

quartz kindle
#

whats your browser?

#

firefox hmm, let me test

sick cloud
#

firefox yeah

#

latest if it matters

quartz kindle
#

yup its a firefox issue

#

lets see if i can fix

sick cloud
#

dang

#

alright

quartz kindle
#

looks like this is the cause

#

Lol

#

looks fine if you have adblock

#

adblock blocks that

sick cloud
#

i do have adblock think

quartz kindle
#

fixed

#
body > div {
    display: none;
}```
sick cloud
#

does that hide ads though

quartz kindle
#

yeah

sick cloud
#

because you can't do that

#

so

quartz kindle
#

oh

#

then

#

you can target only that one

#

if the number of ads is always the same

#

try css body > div:nth-of-type(3) { display: none; }

#

should only block the 3rd div

sick cloud
#

@inner jewel can you like, confirm this is ok

#

i don't want to be banned

quartz kindle
#

it doesnt look like an ad, it looks like some kind of tracking

inner jewel
#

you can't hide the ads

quartz kindle
#

i might be wrong

#

Nielsen Online SiteCensus

sick cloud
#

if i turn off adblock nothing appears down there from what i see

quartz kindle
#

its definitely not an ad

#

it has height 1 width 1

#

just looks broken

sick cloud
#

so i should be fine to hide it?

quartz kindle
#

its a 1x1 image contained in a div

sick cloud
#

hm

quartz kindle
#

but the div is height 24 for no reason

sick cloud
#

@quartz kindle even using that hide code it won't fix it

quartz kindle
#

try this

#
body > div:not([id]) {
    display: none;
}```
#

its the only div without an id

sick cloud
#

nope

quartz kindle
#

rly? hmm works here

sick cloud
#

hm

#

still here

quartz kindle
#

what if you do css position: absolute; top: 0;

sick cloud
#

yeah nope

#

nothing wants to work ig

quartz kindle
#

then something is wrong with your targeting, or your structure is different than mine

#

does it work if you do it on the inspector?

#

wait... why is your css full of html tags? is this normal?

earnest phoenix
#

its a new type

#

HTMLSS

#

yes

inner jewel
#

maybe the markdown parser did that

bright spear
#

yup

sick cloud
#

probably md parser

warm marsh
#

hey can i have a little help? in the console my bot is spamming missing permission i have restarted a bunch of times. I ain't making the bot do anything i check, Any ideas?

sick cloud
#

someone's probably trying to use your bot in a channel where it can't talk

#

what library are you using?

warm marsh
#

discord.js

#

i regenerated token a second ago to see if was dual projects or something

#

nope still same

#

and bot doesn't join channels.

earnest phoenix
#

it's irrelevant to your token :what:

#

it says missing permission for a reason

warm marsh
#

I know

sick cloud
#

okay so in your message event you can add a check

#
if (!msg.guild.me.hasPermission('SEND_MESSAGES')) return;`

put that right at the start of your message event

warm marsh
#

ok

#

Still the same

sick cloud
#

try asking in the discord.js server then and explain

warm marsh
#

ah

#

i am banned from that server...

earnest phoenix
#

you should always check for permissions before executing the action

sick cloud
#

discord api then? lol

warm marsh
#

the bot ain't doing anything

#

i made sure

#

just spams

amber fractal
#

Send a screenshot of your console, it might be different

warm marsh
amber fractal
#

is that all?

warm marsh
#

yeah?

amber fractal
#

It doesnt give you a file or line?

warm marsh
#

just that over and over

#

nope

quartz kindle
#

show your code

amber fractal
#

I think he said commands arent even being called

quartz kindle
#

there could be something in his code he overlooked

warm marsh
#

No i didn't say that

#

but yeah they aren't being called due to simple mistake i made, They did work beforehand and was still getting error.

quartz kindle
#

still, its something in your code

inner jewel
#

async errors are a pain™

warm marsh
#

literally what

#

i rewrote it all

#

still same error.

#

was getting error when was no code. 🤔

quartz kindle
#

send your code anyway

warm marsh
#

it's in multiple files

inner jewel
#

that can be literally anything

warm marsh
#

as use module.exports

inner jewel
#

any action on the discord api where the bot doesn't have permissions

#

d.js just does the request without checking permissions

#

and it doesn't capture the stacktrace at the request start so there's no way of knowing where it was done

quartz kindle
#

yeah, the only way is to check the entire code

warm marsh
#

let me fix error first

#

then will send

#

hastebin?

quartz kindle
#

sure

warm marsh
#

literally all the code

inner jewel
#
  const prefix = ".";
  
  const args = String.prototype.slice.call(message.content, prefix).split(/ +/g);
  const command = Array.prototype.shift.call(args).toLocaleLowerCase();```
warm marsh
#

What about it?

inner jewel
#
  1. you don't check if the content starts with the prefix
warm marsh
#

i literally do

inner jewel
#
  1. those X.prototype.y.call() are useless
#

no

warm marsh
#

below it

inner jewel
#

oh

#

anyway

#

point 2 still stands

warm marsh
#

And i know that they are useless

#

i just like that way over the other

inner jewel
#

X.prototype.y.call(a, ...) -> a.y(...)

warm marsh
#

keeps a pattern throught out my code

#

yeah i understand

#

i just like it

#

as everything looks the same

quartz kindle
#

also

#
    delete require.cache[require.resolve(`./Commands/${command}.js`)];
    require(`./Commands/${command}.js`).run(client, message, args, ops);```
#

do you really need to re-require the file every single time?

inner jewel
#

also check the channel permissions

#

not just guild permissions

warm marsh
#

if i make a change to the file

inner jewel
#

and requiring on user input is dangerous

#

i could eg !../../config.json

#

or whatever

warm marsh
#

but that way is longer

inner jewel
#

you're literally allowing anyone to access any file on your machine

quartz kindle
#

as for the missing permission errors, see if they stop if you remove the invalid command reply

#

which btw is also a bad practice to warn on invalid commands

warm marsh
#

I am not allowing any file access?

#

only ones in that folder.

inner jewel
#

no

#

if someone adds .. to the command name

#

they can exit that folder

#

and read from anywhere

warm marsh
#

Commands/..file.something

quartz kindle
warm marsh
#

ok

quartz kindle
#

../ still works even if you define folders before it

warm marsh
#

Right.

#

if else statements are annoying asf though

#

that's why i use require

#

like that

inner jewel
#

you can use a map

quartz kindle
#

there are many other ways

inner jewel
#

fs.readdirSync

warm marsh
#

no

#

without sync

inner jewel
#

read it once when starting the bot

warm marsh
#

fs.readdir is async

inner jewel
#

there's no issue with sync code

warm marsh
#

pattern

#

keep everything the same through out the code.

quartz kindle
#

its fine to use require, but put the re-require part in a separate command, like a reload command thing

inner jewel
#
const commands = new Map();
fs.readdirSync().loadthecommandsintothemap```
#

no need to be async there

#

and it's useless too

#

require is sync as well

warm marsh
#

so

inner jewel
#

so if async is better you should stop using require :^)

warm marsh
#

And use what? import

#

?

gilded blaze
#

If you are doing it during startup it won't mess up the user experience if it's sync

warm marsh
#

Won't mess it up if it's async either

quartz kindle
#

well, yeah, but you're basically wasting it

warm marsh
#

So

#

My question as well

inner jewel
#

there's no issue in making it sync if only at startup

warm marsh
#

is import async?

inner jewel
#

and makes writing code easier

warm marsh
#

i only used once or so when using react

#

never looked into it

gilded blaze
#

Your perception of async and sync is wrong

warm marsh
#

change my mind

quartz kindle
#

i think import is also sync

inner jewel
#

mjs import is async

warm marsh
#

mjs?

quartz kindle
#

module js

inner jewel
quartz kindle
#

its like a special thingy to indicate that the js file is a module

warm marsh
#

I am lost

#

is this a module or something?

#

or apart of javasrcipt?

quartz kindle
#

its something called ES Modules

warm marsh
#

Ok

#

And i install this?

quartz kindle
#

no, its an experimental feature in node

warm marsh
#

oh ok

quartz kindle
#

but bottom line is: sync and async are both useful depending on the situation, there is no reason to chose async over sync when async does not give you an advantage

#

if you really really want async, you can use readfile() and parse it

warm marsh
#

ok

#

And in this map of commands i am storing what?

#

the whole file or?

#
fs.readdir('./Commands', "utf8", async (err, files) => {
    if (err)
      return console.log(err);
    let cmds = files.filter(file => file.split(/\./g).pop() === "js");
    if (cmds.length <= 0) return console.log("No Files");
    cmds.forEach(async (f, i) => {
      commands.set(f, f);
}); ```
#

that's what you were wanting me to do?

inner jewel
#

coomands.set(f.split(".")[0], require("./commands/" + f))

warm marsh
#

Why am i requiring there?

inner jewel
#

to load the command

warm marsh
#

into the map?

inner jewel
#

yes

warm marsh
#

ok

#

then i do javascript if (commands.has(command)) { commands.get(command).run(. . . .); }

#

?

inner jewel
#

yes

warm marsh
#

ok thanks i guess.

#

And now it doesn't work

warm marsh
#

Ok, all fixed. until next time!

lusty dew
#

How could I check if something still exists in python?

#

like

#

a mentioned user

#

python rewrite btw

ruby dust
#

Wdym exist?

lusty dew
#

Like

#

you know how JS has

#

if(!member) return msg.reply("Message here")

#

I want to do that but with d.py rewrite

#
    mutetime = arg[1]

    if (mutetime < 0) != True:
        await ctx.send("Need to supply a mute time: !mute [20s] [reason]") 
#

Would something like this work?

earnest phoenix
#

Someone wanna help me make a command where i can grab information from a website page and post it into an embed message?

blazing star
#

what language?

lusty dew
#

@blazing star Talking to me?

#

or Sushi?

blazing star
#

Sushi

lusty dew
#

Ah ok

blazing star
#

also

#

is that go

lusty dew
#

?

blazing star
#

or py

lusty dew
#

Py

blazing star
#

i can’t tell what languge that is

#

that’s invalid syntax

lusty dew
blazing star
#

you don’t put parenthesis around if statements in py

lusty dew
#

Oh yea

#

xD

#

I keep forgetting that

#

so used to js

#

But do you think that would work if I removed the ()

blazing star
#

yea

lusty dew
#

Ok

#

Also, do you know if there is something equivalent to the npm package ms in py?

blazing star
#

uh

#

not atm

lusty dew
#

Ok

#

Hm I wonder if I could create a function

#

🤔

#

that basically does the same thing as ms

blazing star
#

you could just write basic code for that

lusty dew
#

function ms(time){
time * 1000
}

blazing star
#

hmmm

#

I mean asyncio uses seconds

lusty dew
#

oof

#

I forgot about asyncio

#

Also

#

didn't know it used seconds

#

Seconds could work

blazing star
#

yea

lusty dew
#

Honestly better then milliseconds

blazing star
#

eh true

lusty dew
#

Forgot how to use asyncio though

blazing star
#

await asyncio.sleep(seconds)

earnest phoenix
#

@blazing star mb im into these codes LOL , im doing discord.js

blazing star
#

huh

earnest phoenix
blazing star
#

oh so then javascript

#

you can use cheerio and a http lib of your choice

earnest phoenix
#

ok thanx

lusty dew
#

Hm

#

do you really need cheerio?

#

what does it even do?

#

I mean like

blazing star
#

cheerio is for webscraping

lusty dew
#

I did the exact same thing and didn't use cheerio

#

or an http lib

earnest phoenix
#

does it work for any website or for 1 specifically

blazing star
#

wait what

#

any website lmao

#

you just load the response text

lusty dew
#

Ye

#

but like

#

Steam

#

I didn't use cheerio or http lib to get info on a game the user listed

blazing star
#

nice

#

some sites are scrape proof

lusty dew
#

Ye

#

Doesn't a buffer prevent scraping

blazing star
#

no

earnest phoenix
#

just gnna be honest

#

Im a bot at coding , so i need help LOL

violet jetty
#

be honest

blazing star
#

cool story

violet jetty
#

you're a bot

earnest phoenix
lusty dew
#

"im a bot at coding"

blazing star
#

lmao

earnest phoenix
#

the irony

lusty dew
#

don't we have a starboard bot here?

blazing star
#

yes

earnest phoenix
#

my bot writes itself cuz its better off

violet jetty
blazing star
#

wow

lusty dew
#

lol I kinda want to put what he said on starboard

blazing star
#

that’s some high tech shit there

lusty dew
#

Lol

#

My bot gave itself a role

#

even though no one used a cmd to do it

blazing star
#

nice

lusty dew
#

It has become self aware

#

UWU

earnest phoenix
#

xD

violet jetty
earnest phoenix
#

buttt who trynna hit me with the spoonfeed

violet jetty
#

Bot fixing itself in 2k19 wow

earnest phoenix
#

for this website sniffer

blazing star
lusty dew
#

@earnest phoenix No one since we can't really spoonfeed

#

only help

blazing star
#

yes

earnest phoenix
#

i mean

lusty dew
#

and guide

blazing star
#

docs

lusty dew
#

But

earnest phoenix
#

if u dm me u can do w/e u want

lusty dew
#

for 20$

blazing star
#

lol

lusty dew
#

I will write your whole bot for you

#

;)

earnest phoenix
#

nah

#

i wanna learn

lusty dew
#

XD

earnest phoenix
#

:<

violet jetty
#

pay to get

sick cloud
#

inb4 $20 to remake mee6 but with role rewards

lusty dew
#

LOL

blazing star
#

lmao

#

no no

#

$10 for rhythm remake

lusty dew
#

Shit that would cost way more then 20$

earnest phoenix
#

you can give me a 1+1 lesson on this cheerio for my friendship as payment

lusty dew
#

Fuck yo friendship

earnest phoenix
#

dam

sick cloud
#

i could remake mee6 but who in their right mind would

lusty dew
#

Money is what talks to me

violet jetty
#

lol

earnest phoenix
#

nakama power??

blazing star
#

@sick cloud same

sick cloud
#

i haven't made a music bot in ages tho

lusty dew
#

Mee6 is trash

sick cloud
#

should i

lusty dew
#

Some of their mod cmds don't work well

inner jewel
#

music bots more like 95% of the bots since lavalink became a thing

blazing star
#

Let’s do the mee6 in the garbage disposal

sick cloud
#

i don't understand lavalink

#

never wanna use it

blazing star
#

lavalink is easy

#

it’s just a websocket

violet jetty
#

Discord sponsor mee6

lusty dew
#

@blazing star Wanna collab on a bot xD

earnest phoenix
#

soo is that a NO on the spoonfeed

lusty dew
#

Jkjk

earnest phoenix
#

dam

blazing star
earnest phoenix
#

bouta ask some mods to spoonfeed me

inner jewel
#

just write your own audio node like the cool kids mmLol

lusty dew
#

@earnest phoenix Pretty much

sick cloud
#

woah you own a dam @earnest phoenix?? how much water does it store?

earnest phoenix
#

not a lot

#

:<

sick cloud
#

we need DamBot

blazing star
#

no WaterBog

sick cloud
#

newest economy

blazing star
#

nah water would be money

sick cloud
#

you have 9 water

blazing star
#

yes tony

earnest phoenix
#

so how about i get some really GUD help?

#

ik you guys have nothing else extremely better to do :/

sick cloud
#

i could be making a music bot

blazing star
#

I actually have better stuff to do

earnest phoenix
#

but

#

?

violet jetty
#

Use module docs you can do better stuff too then

earnest phoenix
#

or can i get a good example that i can work off of and edit it to make it my own?

violet jetty
#

just use HTML to json

earnest phoenix
#

because i just dont know how to piece it

violet jetty
#

use html to json it's easy

earnest phoenix
#

its easy

#

FOR U KID

violet jetty
#

If it's easy for kid then it's also easy for you adult

inner jewel
#

learn how to scrape stuff

#

or search if that website has an api

blazing star
#

webscraping is easy once you know why to do

inner jewel
#

so you don't have to scrape

blazing star
#

or that

inner jewel
#

if you want to scrape you'll need some knowledge of html

blazing star
#

yeah

earnest phoenix
#

johnny i thought u loved me

#

Sabres.botKnowledge = 0

#

Sushi*

blazing star
#

ok

inner jewel
#

then learn how to use google and read docs

earnest phoenix
#

um

#

my entire bot

inner jewel
#

no one is going to hold your hand until you manage to do it

#

¯_(ツ)_/¯

earnest phoenix
#

= google

violet jetty
#

Just use stackoverflow Lol

blazing star
#

actually stack overflow is useful

violet jetty
#

yeah

blazing star
#

TCD is too

inner jewel
#

stackoverflow should insert zero width spaces in every codeblock on answers

earnest phoenix
#

breh these tutorials are like 20 mins

#

:< RIP

#

you guys are so cruel LMAO

violet jetty
#

Use your free time and learn stuff

inner jewel
#

are we though?

#

or are you just lazy?

earnest phoenix
#

50/50

#

im not really lazy since im asking for someone to teach me

blazing star
#

docs help

viral spade
#

follow next one

earnest phoenix
#

@blazing star hey ❤

blazing star
#

uh, hi

earnest phoenix
#

i got it but imma need some assistance if u dont mind

blazing star
#

cool

#

cuz I wont help

earnest phoenix
#

okay :<

#

i got cheerio to work tho 😮

blazing star
#

then read the docs

earnest phoenix
#

i got cheerio to work but idk how to put the info its collecting into an embed message

blazing star
#

cool

earnest phoenix
sinful lotus
#

@earnest phoenix console.log the data u got from the website

earnest phoenix
#

i did o-o

#

i dont know how to apply it here

sinful lotus
#

I cannot answer that if I dont know the data you fetched

earnest phoenix
#

yea i cant find it anymore :<

sinful lotus
#

the basis to put what you want on that embed

#

is to know what is the data gave you and fix the code according to that

#

if its a json response it would be easy

earnest phoenix
#

it was but i cant get it to show anymore RIP

sinful lotus
#

but if its not, then thats where you may need to manually format it

earnest phoenix
#

lemme see if i can pull it again

#

i put everything grabbed at the bottom

viral spade
#

@inner jewel thanks so much for that ipc recommendation earlier! it seems to be exactly what i need so far! i used node-ipc though, not redis pubsub.

#

@earnest phoenix dont u have to put something in here?
.addField('Post#1',HERE)
like
.addField('Post#1','')

earnest phoenix
#

Yes but thats what im trying to figure out

viral spade
#

its the description

earnest phoenix
#

i have no idea how to word it

viral spade
#

what do you mean?

earnest phoenix