Reworking bot code. Again... #7

Merged
snxraven merged 5 commits from MiTask/LinkUp-P2P-Chat:main into main 2024-06-11 16:38:55 -04:00
8 changed files with 62 additions and 33 deletions
Showing only changes of commit 00b26d6afe - Show all commits

9
app.js
View File

@ -390,20 +390,13 @@ function sendMessage(e) {
onMessageAdded(config.userName, message, config.userAvatar, topic);
let peersPublicKeys = [];
peersPublicKeys.push([...swarm.connections].map(peer => peer.remotePublicKey.toString('hex')));
peersPublicKeys = peersPublicKeys.flat(1);
peersPublicKeys.push(swarm.keyPair.publicKey.toString('hex'));
const messageObj = JSON.stringify({
type: 'message',
name: config.userName,
message,
avatar: config.userAvatar,
topic: topic,
peers: peersPublicKeys, // Deprecated. To be deleted in future updates
timestamp: Date.now(),
readableTimestamp: new Date().toLocaleString(), // Added human-readable timestamp
timestamp: Date.now()
});
const peers = [...swarm.connections];

View File

@ -60,7 +60,7 @@ loadCommands().then(commands => {
bot.on('onBotJoinRoom', () => {
console.log("Bot is ready!");
bot.sendMessageToAll(process.env.ON_READY_MESSAGE);
bot.sendTextMessage(process.env.ON_READY_MESSAGE);
});
bot.joinChatRoom(process.env.LINKUP_ROOM_ID);

View File

@ -4,6 +4,6 @@ export default {
handler: function(bot, args, message) {
const responses = ['It is certain.', 'It is decidedly so.', 'Without a doubt.', 'Yes - definitely.', 'You may rely on it.', 'As I see it, yes.', 'Most likely.', 'Outlook good.', 'Yes.', 'Signs point to yes.', 'Reply hazy, try again.', 'Ask again later.', 'Better not tell you now.', 'Cannot predict now.', 'Concentrate and ask again.', 'Don\'t count on it.', 'My reply is no.', 'My sources say no.', 'Outlook not so good.', 'Very doubtful.'];
const randomIndex = Math.floor(Math.random() * responses.length);
bot.sendMessage(message.peers, responses[randomIndex]);
bot.sendTextMessage(responses[randomIndex]);
}
};

View File

@ -3,6 +3,6 @@ export default {
description: 'Greet the user',
handler: function(bot, args, message) {
const userName = message.name;
bot.sendMessage(message.peers, `Hello, ${userName}! How can I assist you today?`);
bot.sendTextMessage(`Hello, ${userName}! How can I assist you today?`);
}
};

View File

@ -2,6 +2,6 @@
export default {
handler: function(bot, args, message) {
bot.sendMessage(message.peers, 'Pong!');
bot.sendTextMessage('Pong!');
}
};

View File

@ -1,6 +1,8 @@
import Hyperswarm from 'hyperswarm';
import EventEmitter from 'node:events';
import b4a from "b4a";
import TextMessage from "./TextMessage.js";
import FileMessage from "./FileMessage.js";
class Client extends EventEmitter {
constructor(botName) {
@ -11,6 +13,10 @@ class Client extends EventEmitter {
this.joinedRooms = new Set(); // Track the rooms the bot has joined
this.currentTopic = null; // Track the current topic
this.setupSwarm();
process.on('exit', () => {
this.destroy();
});
}
setupSwarm() {
@ -19,9 +25,14 @@ class Client extends EventEmitter {
const messageObj = JSON.parse(message.toString());
if (this.joinedRooms.has(messageObj.topic)) { // Process message only if it is from a joined room
this.currentTopic = messageObj.topic; // Set the current topic from the incoming message
if (messageObj.type === "message") this.emit('onMessage', peer, messageObj);
if (messageObj.type === "icon") this.emit('onIcon', peer, messageObj);
if (messageObj.type === "file") this.emit('onFile', peer, messageObj);
if (messageObj.type === "message")
this.emit('onMessage', peer, new TextMessage(messageObj.name, messageObj.avatar, messageObj.topic, messageObj.message, messageObj.timestamp));
if (messageObj.type === "file")
this.emit('onFile', peer, new FileMessage(messageObj.name, messageObj.fileName, messageObj.fileUrl, messageObj.fileType, messageObj.avatar, messageObj.topic, messageObj.timestamp));
if (messageObj.type === "icon")
this.emit('onIcon', peer, messageObj);
}
});
@ -46,18 +57,13 @@ class Client extends EventEmitter {
});
}
// TODO: Make topic here actually work.
sendMessage(topic, message) {
sendTextMessage(message) {
this.sendMessage(TextMessage.new(this, message));
}
sendMessage(message) {
console.log('Bot name:', this.botName);
const timestamp = Date.now();
const messageObj = {
type: 'message',
name: this.botName,
message,
timestamp,
topic: this.currentTopic // Include the current topic
};
const data = JSON.stringify(messageObj);
const data = message.toJsonString();
const peers = [...this.swarm.connections];
for (const peer of peers) peer.write(data);
}

View File

@ -1,12 +1,26 @@
class FileMessage {
public FileMessage(chatRoom, userPeer, fileName, fileUrl, fileType, timestamp) {
this.chatRoom = chatRoom;
this.userPeer = userPeer;
public FileMessage(peerName, fileName, fileUrl, fileType, peerAvatar, topic, timestamp) {
this.peerName = peerName;
this.fileName = fileName;
this.fileUrl = fileUrl;
this.fileType = fileType;
this.peerAvatar = peerAvatar;
this.topic = topic;
this.timestamp = timestamp;
}
public toJsonString() {
return JSON.stringify({
type: 'file',
name: this.peerName,
fileName: this.fileName,
fileUrl: this.fileUrl,
fileType: this.fileType,
avatar: this.peerAvatar,
topic: this.topic,
timestamp: this.timestamp,
});
}
}
export default FileMessage;

View File

@ -1,10 +1,26 @@
class TextMessage {
public TextMessage(chatRoom, userPeer, message, timestamp) {
this.chatRoom = chatRoom;
this.userPeer = userPeer;
public TextMessage(peerName, peerAvatar, topic, message, timestamp) {
this.peerName = peerName;
this.peerAvatar = peerAvatar;
this.topic = topic;
this.message = message;
this.timestamp = timestamp;
}
public toJsonString() {
return JSON.stringify({
type: 'message',
name: this.peerName,
message: this.message,
avatar: this.peerAvatar,
topic: this.topic,
timestamp: this.timestamp
});
}
public static new(bot, message) {
return new TextMessage(bot.botName, "", bot.currentTopic, message, Date.now());
}
}
export default TextMessage;