161 lines
4.8 KiB
JavaScript
161 lines
4.8 KiB
JavaScript
|
class IRCServer {
|
||
|
constructor(opCodes, mcUsername) {
|
||
|
this.opCodes = opCodes;
|
||
|
this.mcUsername = mcUsername;
|
||
|
this.userKey = null;
|
||
|
this.pingIntervalId = null;
|
||
|
}
|
||
|
|
||
|
connect() {
|
||
|
this.mcUsername = ModAPI.getProfileName();
|
||
|
// Create WebSocket connection
|
||
|
this.socket = new WebSocket('wss://brick-iron-shift.glitch.me');
|
||
|
|
||
|
// Set up WebSocket event listeners
|
||
|
this.socket.addEventListener('open', () => this.onOpen());
|
||
|
this.socket.addEventListener('message', event => this.onMessage(event.data));
|
||
|
this.socket.addEventListener('close', () => this.onClose());
|
||
|
this.socket.addEventListener('error', () => {
|
||
|
this.sendIRCMessage('WebSocket error occurred');
|
||
|
});
|
||
|
}
|
||
|
|
||
|
onOpen() {
|
||
|
console.log('[IRC] Connected to IRC');
|
||
|
|
||
|
const object = {
|
||
|
op: this.opCodes.CONNECT,
|
||
|
d: this.mcUsername
|
||
|
};
|
||
|
|
||
|
this.sendMessage(JSON.stringify(object));
|
||
|
|
||
|
// Set a periodic task for pinging the server
|
||
|
this.pingIntervalId = setInterval(() => {
|
||
|
const ping = {
|
||
|
op: this.opCodes.PING,
|
||
|
d: ''
|
||
|
};
|
||
|
this.sendMessage(JSON.stringify(ping));
|
||
|
}, 20000);
|
||
|
|
||
|
this.sendIRCMessage('Connected to IRC');
|
||
|
}
|
||
|
|
||
|
onMessage(message) {
|
||
|
const object = JSON.parse(message);
|
||
|
|
||
|
if (object.hasOwnProperty('op') && object.hasOwnProperty('d')) {
|
||
|
const opCode = object.op;
|
||
|
const data = object.d;
|
||
|
|
||
|
switch (opCode) {
|
||
|
case this.opCodes.ID:
|
||
|
this.userKey = data;
|
||
|
console.log('[IRC] User key received.');
|
||
|
break;
|
||
|
|
||
|
case this.opCodes.MESSAGE_RECEIVE:
|
||
|
this.sendIRCMessage(data);
|
||
|
break;
|
||
|
|
||
|
case this.opCodes.DISCONNECTED:
|
||
|
this.sendIRCMessage(`Disconnected from IRC: ${data}`);
|
||
|
break;
|
||
|
|
||
|
case this.opCodes.INVALID:
|
||
|
console.log('[IRC] Received an invalid opcode.');
|
||
|
break;
|
||
|
case this.opCodes.PING:
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
console.log(`[IRC] Unknown opcode: ${opCode}`);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
onClose() {
|
||
|
this.sendIRCMessage('You were disconnected from the IRC chat.');
|
||
|
console.log('[IRC] Disconnected.');
|
||
|
if (this.pingIntervalId) {
|
||
|
clearInterval(this.pingIntervalId);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
disconnect() {
|
||
|
if (this.pingIntervalId) {
|
||
|
clearInterval(this.pingIntervalId);
|
||
|
}
|
||
|
|
||
|
if (this.socket) {
|
||
|
this.socket.close();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sendMessage(msg) {
|
||
|
if (this.socket.readyState === WebSocket.OPEN) {
|
||
|
this.socket.send(msg);
|
||
|
} else {
|
||
|
this.sendIRCMessage('You are not currently connected to the IRC server');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sendIRCChatMessage(message) {
|
||
|
const object = {
|
||
|
op: this.opCodes.MESSAGE_SEND,
|
||
|
d: message
|
||
|
};
|
||
|
|
||
|
this.sendMessage(JSON.stringify(object));
|
||
|
}
|
||
|
|
||
|
sendIRCMessage(message) {
|
||
|
// Assuming you have a function or a way to display messages in your IRC client
|
||
|
ModAPI.displayToChat({msg: `[IRC MESSAGE]: ${message}`});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Define the OpCodes based on the provided Java interface
|
||
|
const OpCodes = {
|
||
|
DISCONNECTED: 6969,
|
||
|
INVALID: 69420,
|
||
|
ID: -1,
|
||
|
CONNECT: 0,
|
||
|
MESSAGE_SEND: 1,
|
||
|
MESSAGE_RECEIVE: 2,
|
||
|
PING: 90
|
||
|
};
|
||
|
|
||
|
var mcUsername = ModAPI.getProfileName();
|
||
|
|
||
|
var ircServer = new IRCServer(OpCodes, mcUsername);
|
||
|
|
||
|
|
||
|
ModAPI.addEventListener("sendchatmessage", (ev) => {
|
||
|
const message = ev.message;
|
||
|
|
||
|
|
||
|
if (message.startsWith("@")) {
|
||
|
const parsed = message.substring(1);
|
||
|
ircServer.sendIRCChatMessage(parsed);
|
||
|
} else if (message.startsWith(".")) {
|
||
|
if (message === ".help") {
|
||
|
ModAPI.displayToChat({ msg: "IRC> Here's a list of commands:" });
|
||
|
ModAPI.displayToChat({ msg: ".connect - Connect to the IRC server" });
|
||
|
ModAPI.displayToChat({ msg: ".disconnect - Disconnect from the IRC server" });
|
||
|
ModAPI.displayToChat({ msg: "To send a message to the IRC server, use @<your message>" });
|
||
|
} else if (message === ".connect") {
|
||
|
ircServer.connect();
|
||
|
ModAPI.displayToChat({ msg: "IRC> Connecting to IRC..." });
|
||
|
} else if (message === ".disconnect") {
|
||
|
ircServer.disconnect();
|
||
|
ModAPI.displayToChat({ msg: "IRC> Disconnecting from IRC..." });
|
||
|
} else {
|
||
|
ModAPI.displayToChat({ msg: "IRC> Unknown command. Type .help for a full list of commands!" });
|
||
|
}
|
||
|
}
|
||
|
ev.preventDefault = true;
|
||
|
});
|