This commit is contained in:
zefie
2025-06-17 00:07:03 -04:00
parent b69efd83c6
commit 800091eede

View File

@@ -93,10 +93,11 @@ class WTVIRC {
this.clientpeak = 0; this.clientpeak = 0;
this.globalpeak = 0; this.globalpeak = 0;
this.supported_channel_modes = "Ibe,k,l,NOQRTVZcimnprt"; this.supported_channel_modes = "Ibe,k,l,NOQRTVZcimnprt";
this.supported_user_modes = "Ziorswxz"; this.supported_user_modes = "BZiorswxz";
this.supported_prefixes = ["ohv", "@%+"]; this.supported_prefixes = ["ohv", "@%+"];
this.supported_capabilities = ['TBURST', 'EOB', 'IE', 'EX'];
this.caps = [ this.caps = [
`AWAYLEN=${this.awaylen} CASEMAPPING=rfc1459 CHANMODES=${this.supported_channel_modes} CHANNELLEN=${this.channellen} CHANTYPES=${this.channelprefixes.join('')} PREFIX=(${this.supported_prefixes[0]})${this.supported_prefixes[1]} USERMODES=${this.supported_user_modes} MAXLIST=b:${this.maxbans},e:${this.maxexcept},i:${this.maxinvite},k:${this.maxkeylen},l:${this.maxlimit}`, `AWAYLEN=${this.awaylen} CASEMAPPING=rfc1459 BOT=B CHANMODES=${this.supported_channel_modes} CHANNELLEN=${this.channellen} CHANTYPES=${this.channelprefixes.join('')} PREFIX=(${this.supported_prefixes[0]})${this.supported_prefixes[1]} USERMODES=${this.supported_user_modes} MAXLIST=b:${this.maxbans},e:${this.maxexcept},i:${this.maxinvite},k:${this.maxkeylen},l:${this.maxlimit}`,
`CHARSET=ascii MODES=3 EXCEPTS=e INVEX=I NETWORK=${this.network} CHANLIMIT=${this.channelprefixes.join('')}:${this.channellimit} NICKLEN=${this.nicklen} TOPICLEN=${this.topiclen} KICKLEN=${this.kicklen}` `CHARSET=ascii MODES=3 EXCEPTS=e INVEX=I NETWORK=${this.network} CHANLIMIT=${this.channelprefixes.join('')}:${this.channellimit} NICKLEN=${this.nicklen} TOPICLEN=${this.topiclen} KICKLEN=${this.kicklen}`
]; ];
} }
@@ -306,11 +307,19 @@ class WTVIRC {
console.warn('Invalid CAPAB command from server'); console.warn('Invalid CAPAB command from server');
break; break;
} }
const capabilities = parts.slice(1).join(' ').split(','); const capabilities = parts.slice(1);
if (this.debug) { if (this.debug) {
console.log(`Server capabilities: ${capabilities.join(', ')}`); console.log(`Server capabilities: ${capabilities.join(' ')}`);
} }
socket.write(`CAP * ACK :${capabilities.join(' ')}\r\n`); var output_reply = [];
for (const cap of capabilities) {
if (this.supported_capabilities.includes(cap)) {
output_reply.push(cap);
} else {
console.warn(`Unsupported capability: ${cap}`);
}
}
socket.write(`CAPAB :${output_reply.join(' ')}\r\n`);
break; break;
case 'SERVER': case 'SERVER':
if (!socket.is_srv_authorized) { if (!socket.is_srv_authorized) {
@@ -1540,6 +1549,14 @@ class WTVIRC {
this.usermodes.set(socket.nickname, (usermodes).filter(m => m !== 's')); this.usermodes.set(socket.nickname, (usermodes).filter(m => m !== 's'));
socket.write(`:${socket.nickname}!${socket.username}@${socket.host} MODE ${socket.nickname} -s\r\n`); socket.write(`:${socket.nickname}!${socket.username}@${socket.host} MODE ${socket.nickname} -s\r\n`);
this.broadcastToAllServers(`:${socket.uniqueId} MODE ${socket.uniqueId} -s\r\n`); this.broadcastToAllServers(`:${socket.uniqueId} MODE ${socket.uniqueId} -s\r\n`);
} else if (mode.startsWith('+B')) {
this.usermodes.set(socket.nickname, [...usermodes, 'B']);
socket.write(`:${socket.nickname}!${socket.username}@${socket.host} MODE ${socket.nickname} +B\r\n`);
this.broadcastToAllServers(`:${socket.uniqueId} MODE ${socket.uniqueId} +B\r\n`);
} else if (mode.startsWith('-B')) {
this.usermodes.set(socket.nickname, (usermodes).filter(m => m !== 'B'));
socket.write(`:${socket.nickname}!${socket.username}@${socket.host} MODE ${socket.nickname} -B\r\n`);
this.broadcastToAllServers(`:${socket.uniqueId} MODE ${socket.uniqueId} -B\r\n`);
} else if (mode.startsWith('+z') || mode.startsWith('-z')) { } else if (mode.startsWith('+z') || mode.startsWith('-z')) {
socket.write(`:${this.servername} 472 ${socket.nickname} ${mode.slice(1)} :is set by the server and cannot be changed\r\n`); socket.write(`:${this.servername} 472 ${socket.nickname} ${mode.slice(1)} :is set by the server and cannot be changed\r\n`);
} else if (mode.startsWith('+r') || mode.startsWith('-r')) { } else if (mode.startsWith('+r') || mode.startsWith('-r')) {
@@ -2381,6 +2398,9 @@ class WTVIRC {
if (usermodes && usermodes.includes('r')) { if (usermodes && usermodes.includes('r')) {
socket.write(`:${this.servername} 307 ${socket.nickname} ${whoisNick} :is a registered nick\r\n`); socket.write(`:${this.servername} 307 ${socket.nickname} ${whoisNick} :is a registered nick\r\n`);
} }
if (usermodes && usermodes.includes('B')) {
socket.write(`:${this.servername} 320 ${socket.nickname} ${whoisNick} :is a bot\r\n`);
}
var now = this.getDate(); var now = this.getDate();
var userTimestamp = this.usertimestamps.get(whoisNick) || now; var userTimestamp = this.usertimestamps.get(whoisNick) || now;
var idleTime = now - userTimestamp; var idleTime = now - userTimestamp;
@@ -3751,7 +3771,8 @@ class WTVIRC {
modesToSort.sort(); modesToSort.sort();
var sortedModesWithParams = modesToSort.join(''); var sortedModesWithParams = modesToSort.join('');
} }
var sortedChannelModes = sortModesAlphaCapsFirst(this.supported_channel_modes).replace(/,/g, ''); var channelModes = this.supported_channel_modes.split(',').join('') + this.supported_prefixes[0];
var sortedChannelModes = sortModesAlphaCapsFirst(channelModes).replace(/,/g, '');
var sortedUserModes = sortModesAlphaCapsFirst(this.supported_user_modes); var sortedUserModes = sortModesAlphaCapsFirst(this.supported_user_modes);
socket.write(`:${this.servername} 004 ${nickname} ${this.servername} minisrv ${this.minisrv_config.version} ${sortedUserModes} ${sortedChannelModes} ${sortedModesWithParams}\r\n`); socket.write(`:${this.servername} 004 ${nickname} ${this.servername} minisrv ${this.minisrv_config.version} ${sortedUserModes} ${sortedChannelModes} ${sortedModesWithParams}\r\n`);
for (const caps of this.caps) { for (const caps of this.caps) {