How can I get client variable inside a slashcommand execute function? - javascript

I would like my bot to reply to a slash command by sending a message to a specified channel. However, every example I have seen only sends these messages through the client.on() or client.once() functions where they pass in the client as a parameter, then use client.channels.cache.get('channel_ID').
My execute(interaction) function for this command takes the interaction as a parameter instead. I do know I can pull the channel_id of the interaction from interaction.channel_id, but then it seems like I still have to get a handle on that channel through the client.
Can I pass in the client and the interaction when executing slash command functions? Is there another way to get a handle on the channel in order to send to it without using client?

All Discord.js classes have an internal client property, so for you all you need to access is interaction.client.

Related

Client (JRE) read server (node) variables directly?

I am trying to set up a server where clients can connect and essentially "raise their hand", which lights up for every client, but only one at a time. I currently just use the express module to send a POST response on button-click. The server takes it as JSON and writes it to a file. All the clients are constantly requesting this file to check the status to see if the channel is clear.
I suspect there is a more streamlined approach for this, but I do not know what modules or methods might be best. Can the server push variables to the clients in some way, instead of the clients constantly requesting a file? Then the client script can receive the variable and change the page elements accordingly?
Usually, this kind of task is done by using WebSockets. Since you already have socket.io set up, it'd be great to reuse it.
From the server, start emitting different messages:
socket.emit("hand", { userId: <string> });
From the client, listen to the new event and invoke whatever the appropriate behavior is:
socket.on("hand", (payload) => {
// payload.userId contains user ID
});

Is there a way to execute a function after a bot is removed from the server in Discord.js?

I have tried using the client.on('guildDelete', () => {remove roles and other things}) , but everytime the bot is removed from my test server it says "Missing Access" (even though my bot has adminstrative privelages on my test server, and all other features work). I am assuming this is because the event is registered after the bot is removed from the server, which would make sense and is why I am tring to find away around that. Any and all help is appreciated.
Full source code: https://github.com/blb7103/sw-bot
Precisely what you said -- the event fires when the bot has officially left the server, and therefore cannot access/edit anything within that server.
There are no workarounds to this.

How to establish a communication between two users, if the id generated by the socketIO are auto generated?

Hello I hope you are very well, I would like to ask you a question that I have not been able to deduce the answer to.
In a course I was seeing that to send a message to a specific user with socketIO.js the to () method is used and the id as a parameter, but I have a doubt, that id is auto generated by socketIO as far as I understand, so I would like to know How can the frontend know that id? The example that I saw in the course does it from the console and sends it directly to the method with the id that it already knows, then that example is not so real, what I would like to know in itself How is it that it performs a one-to-one chat if the id is autogenerated by the socket? I don't know if I understand.
For example, to start a conversation with another user, you can click on a button, trigger an event that makes emit, send the id of the user who writes, the event that should trigger the backend with socket, but my question is how does it taste like who send the message? How do you know the id of who is being sent to when establishing communication between 2 users for the first time? Obviously this must be sent by frontent as a parameter but also how does the frontend give this id of who will it be sent to? I don't know if you can store a fixed socket id for a user in a DB or Can you use your DB id to use with sockets? more than everything is what I can not deduce how it would be done?
I do not know if I understood with the question, more than everything is that, I do not know how it obtains or assigns the id for the target from where the message is sent and if this can be fixed and stored in db or is there any method to this.
I thank you in advance for your response, and any resources that you share with me about it or if you recommend a course with, I would greatly appreciate it.
as an example I have this method
io.on('connection', (client) => {
client.on('privateMessage', (data)=>{
const person = user.getPersona(client.id) //get this
client.broadcast.to(data.para).emit('privateMessage', createMsj( person.name, data.messages));
});
}
But where does the front-end of the person to receive the message to pass it to the method?
The front-end will not know the socket.io id of any other clients. This is where your server needs to be involved.
Each of your users presumably has some username that is displayed in the client UI and this is the name that other clients would know them by.
So, your server needs to keep a mapping between username and socket.io clientID. So, a user can send a request to your server to connect to BobS. Your server then needs to be able to look up BobS, find out if that user is currently connected and, if they are, then what is their socket.id value. That way, your server can facilitate connecting the two users.
This mapping would not typically be kept in a permanent store (such as a database) because the socket.id is a transient value and is only good for the duration of that client's socket.io connection. As such, it is more typically just kept in some sort of Javascript data structure (such as a Map object).

firebase Is it possible to update a transaction on disconnect()

I have to maintain maxCountOfConcurrent Users in a day.
For this I was thinking of adding a transaction,
currently i use something like this to remove the username from online users
rootScope.userPresenceRef.onDisconnect().remove();
Is it possible to have something like this
rootScope.userPresenceRef.onDisconnect().transaction(function(count) {});
An onDisconnect() handler is implemented as a single write operation on the server, when it detects that the client has disconnected. At this point there is no way for the server to talk to the client anymore, so the write operation must consist purely of data that can be determined at the time the onDisconnect() handler is registered.
Since a transaction in Firebase requires communication between the client and the server, there is no way to run a transaction on disconnect. You will have to find a way to model the data without requiring it to be a transaction.
You can use functions
Structure Your Data as
usersData -> uid -> status - online/offline
Listen to update changes of status in functions
if change -> online (make transition to increase count else to decrease count)

How to send chat messages using converse library

I am using openfire as an XMPP server and using converse as client library. I want to send a chat message from my chat window to openfire. For this I want to send the text to a converse method which will send the message to the XMPP server.
I am trying to send the message using the following:
var msg = converse.env.$msg({
from: 'a1#localhost',
to: 'a6#localhost',
type: 'chat',
body: "Hi"
});
converse.send(msg);
But this sends the following frame in network of console in websocket:
message from='a1#localhost' to='a6#localhost' type='chat' body='Hi' xmlns='jabber:client'/>
This does not transfer message to the other user neither it stores it in the table. I am pretty much sure I am calling a wrong function. Can anyone povide any help.
You are calling the right function.
What you'll probably miss:
Listener of messages in "a6#localhost" client: as I read in documentation there are few functions
Probably, the right name of server. "localhost" has problem. You can
check Openfire for real service name on his own web panel
To check if a message it's delivered in Openfire you'll can check
OF's log (check debug one, but probably you'll have to enable it).
Real time messages are not stored on database, only groupchat's ones
and not everytime AND offline messages. To not find them on db means nothing
https://conversejs.org/docs/html/development.html
converse.chats.open('buddy#example.com');
converse.chats.get('buddy#example.com');
converse.listen.on('message', function (event, messageXML) { ... });
The syntax is wrong. conversejs uses strophe plugin to construct and send messages. It exposes the strophe $msg message builder for constructing stanzas. It has to be in the following format:
converse.env.$msg({from: 'a1#localhost', to: 'a6#localhost', type: 'chat'}).c('body').t('Hi');
You need to add a body node and within it a text node for the message.
You can also create and add your own api method and internally create a method that sends your custom stanza, and expose it using the api.

Categories

Resources