better webtv messages, add KICK to webtv

This commit is contained in:
zefie
2025-06-22 13:03:21 -04:00
parent e37c27c29c
commit 4e3e1af6e1

View File

@@ -41,6 +41,7 @@ class WTVIRC {
this.server = null; this.server = null;
this.clients = []; this.clients = [];
this.channelData = new Map(); this.channelData = new Map();
this.usernames = new Map(); // nickname -> username
this.usertimestamps = new Map(); // nickname -> timestamp since last message this.usertimestamps = new Map(); // nickname -> timestamp since last message
this.usermodes = new Map(); // nickname -> Array of modes (e.g. ['w', 'i']) this.usermodes = new Map(); // nickname -> Array of modes (e.g. ['w', 'i'])
this.usersignontimestamps = new Map(); // nickname -> timestamp since user signed on this.usersignontimestamps = new Map(); // nickname -> timestamp since user signed on
@@ -102,7 +103,8 @@ class WTVIRC {
this.supported_prefixes = ["ohv", "@%+"]; this.supported_prefixes = ["ohv", "@%+"];
this.supported_client_caps = ['chghost', 'away-notify', 'echo-message', 'invite-notify', 'multi-prefix', 'userhost-in-names', 'account-notify', 'extended-join']; this.supported_client_caps = ['chghost', 'away-notify', 'echo-message', 'invite-notify', 'multi-prefix', 'userhost-in-names', 'account-notify', 'extended-join'];
this.supported_server_caps = ['TBURST', 'EOB', 'IE', 'EX']; this.supported_server_caps = ['TBURST', 'EOB', 'IE', 'EX'];
this.supported_webtv_command_hacks = ["MODE"]; this.enable_webtv_command_hacks = this.irc_config.enable_webtv_command_hacks || true;
this.supported_webtv_command_hacks = ["MODE", "KICK"];
this.session_store_path = this.wtvshared.getAbsolutePath(this.minisrv_config.config.SessionStore + path.sep + 'minisrv_internal_irc'); this.session_store_path = this.wtvshared.getAbsolutePath(this.minisrv_config.config.SessionStore + path.sep + 'minisrv_internal_irc');
this.klines_path = this.session_store_path + path.sep + 'klines.json'; this.klines_path = this.session_store_path + path.sep + 'klines.json';
this.caps = [ this.caps = [
@@ -877,7 +879,7 @@ class WTVIRC {
break; break;
} }
targetSocket.write(`:${targetSocket.nickname} MODE ${targetSocket.nickname} ${parts.slice(2).join(' ')}\r\n`); targetSocket.write(`:${targetSocket.nickname} MODE ${targetSocket.nickname} ${parts.slice(2).join(' ')}\r\n`);
if (this.clientIsWebTV(targetSocket)) { if (this.clientIsWebTV(targetSocket) && this.enable_webtv_command_hacks) {
this.sendWebTVNoticeTo(targetSocket, `The network has set your user mode: ${parts.slice(3).join(' ')}`); this.sendWebTVNoticeTo(targetSocket, `The network has set your user mode: ${parts.slice(3).join(' ')}`);
} }
this.broadcastToAllServers(`:${sourceUniqueId} MODE ${targetUniqueId} ${parts.slice(3).join(' ')}\r\n`, socket); this.broadcastToAllServers(`:${sourceUniqueId} MODE ${targetUniqueId} ${parts.slice(3).join(' ')}\r\n`, socket);
@@ -2015,22 +2017,22 @@ class WTVIRC {
if (awaymsg) { if (awaymsg) {
this.broadcastUserIfCap(socket, `:${socket.nickname}!${socket.username}@${socket.host} AWAY :${awaymsg}\r\n`, socket, 'away-notify'); this.broadcastUserIfCap(socket, `:${socket.nickname}!${socket.username}@${socket.host} AWAY :${awaymsg}\r\n`, socket, 'away-notify');
} }
if (this.clientIsWebTV(socket)) { if (this.clientIsWebTV(socket) && this.enable_webtv_command_hacks) {
var output_lines = []; var output_lines = [];
var channelObj = this.channelData.get(ch); var channelObj = this.channelData.get(ch);
output_lines.push("You have joined " + ch + "."); output_lines.push("You have joined " + ch);
output_lines.push("Current channel modes: +" + channelObj.modes.join('')); output_lines.push("Current channel modes: +" + channelObj.modes.join(''));
let isOp = channelObj.ops.has(socket.nickname); let isOp = channelObj.ops.has(socket.nickname);
let isHalfOp = channelObj.halfops.has(socket.nickname); let isHalfOp = channelObj.halfops.has(socket.nickname);
let isVoice = channelObj.voices.has(socket.nickname); let isVoice = channelObj.voices.has(socket.nickname);
if (isOp) { if (isOp) {
output_lines.push("You are a channel operator (@) in " + ch + "."); output_lines.push("You are a channel operator (@) in " + ch);
} else if (isHalfOp) { } else if (isHalfOp) {
output_lines.push("You are a channel half-operator (%) in " + ch + "."); output_lines.push("You are a channel half-operator (%) in " + ch);
} else if (isVoice) { } else if (isVoice) {
output_lines.push("You are voiced (+) in " + ch + "."); output_lines.push("You are voiced (+) in " + ch);
} }
this.sendWebTVNoticeTo(socket, output_lines); this.sendWebTVSpoofedActionTo(socket, ch, output_lines);
} }
} }
break; break;
@@ -2363,7 +2365,7 @@ class WTVIRC {
socket.write(`:${this.servername} 403 ${socket.nickname} ${t} :No such channel\r\n`); socket.write(`:${this.servername} 403 ${socket.nickname} ${t} :No such channel\r\n`);
continue; continue;
} }
if (this.clientIsWebTV(socket) && msg.startsWith('/')) { if (this.clientIsWebTV(socket) && msg.startsWith('/') && this.enable_webtv_command_hacks) {
var wtvcmd = msg.slice(1).split(' '); var wtvcmd = msg.slice(1).split(' ');
if (wtvcmd[0].length > 0) { if (wtvcmd[0].length > 0) {
if (this.supported_webtv_command_hacks.includes(wtvcmd[0].toUpperCase())) { if (this.supported_webtv_command_hacks.includes(wtvcmd[0].toUpperCase())) {
@@ -2973,6 +2975,22 @@ class WTVIRC {
socket.write(`:${this.servername} NOTICE * :${message}\r\n`); socket.write(`:${this.servername} NOTICE * :${message}\r\n`);
} }
sendWebTVSpoofedActionTo(socket, channel, message) {
if (!Array.isArray(message)) {
message = [message];
}
if (this.clientIsWebTV(socket)) {
message.forEach(line => {
const msg = line.split(' ');
const firstWord = msg[0];
const action = msg.slice(1).join(' ');
const message = [`:${firstWord}!system@webtv PRIVMSG ${channel} :\x01ACTION ${action}\x01\r\n`];
this.sendThrottled(socket, message);
});
return;
}
}
getUserChannelCount(username) { getUserChannelCount(username) {
// returns the number of channels a user is in // returns the number of channels a user is in
let count = 0; let count = 0;
@@ -3065,7 +3083,7 @@ class WTVIRC {
} }
// Only send to WebTV clients // Only send to WebTV clients
if (socket && socket !== exceptSocket && this.clientIsWebTV(socket)) { if (socket && socket !== exceptSocket && this.clientIsWebTV(socket)) {
this.sendWebTVNoticeTo(socket, message) this.sendWebTVSpoofedActionTo(socket, channel, message)
alreadyNotified.push(socket); alreadyNotified.push(socket);
} }
} }