Display Sock Chat protocol errors are dialog boxes.

This commit is contained in:
flash 2024-05-16 21:02:30 +00:00
parent 5b35595fea
commit 4a619312eb
3 changed files with 74 additions and 26 deletions

View file

@ -3,6 +3,7 @@
#include messages.js #include messages.js
#include parsing.js #include parsing.js
#include users.js #include users.js
#include sockchat/modal.js
#include ui/baka.jsx #include ui/baka.jsx
#include ui/emotes.js #include ui/emotes.js
#include ui/markup.js #include ui/markup.js
@ -23,6 +24,7 @@ const MamiSockChatHandlers = function(ctx, client, setLoadingOverlay, sockChatRe
if(!(pingToggle instanceof Element)) if(!(pingToggle instanceof Element))
throw 'pingToggle must be an instance of Element'; throw 'pingToggle must be an instance of Element';
const modals = new MamiSockChatModals(ctx.settings, ctx.msgbox, ctx.sound);
const handlers = {}; const handlers = {};
let dumpEvents = false; let dumpEvents = false;
@ -345,6 +347,11 @@ const MamiSockChatHandlers = function(ctx, client, setLoadingOverlay, sockChatRe
} }
if(typeof type !== 'string') { if(typeof type !== 'string') {
if(modals.handled(botInfo.type)) {
modals.show(botInfo.type, botInfo.args);
return;
}
type = `legacy:${botInfo.type}`; type = `legacy:${botInfo.type}`;
detail = { detail = {
error: botInfo.isError, error: botInfo.isError,

View file

@ -0,0 +1,67 @@
const MamiSockChatModals = function(settings, msgbox, sound) {
const strings = {
'crchan': { text: 'Channel %0 has been created.' },
'delchan': { text: 'Channel %0 has been deleted.' },
'cpwdchan': { text: 'Channel password has been changed.' },
'cprivchan': { text: 'Channel access level has been changed.' },
'flwarn': { text: 'You are about to hit the flood limit! If you continue you will be kicked.' },
'unban': { text: '%0 is no longer banned.', sound: ['unban', 'server'] },
'generr': { text: 'Something unexpected happened.', error: true },
'delerr': { text: 'You are not allowed to delete this message.', error: true },
'notban': { text: '%0 is not banned.', error: true },
'whoerr': { text: '%0 does not exist.', error: true },
'cmdna': { text: 'You are not allowed to use %0.', error: true },
'nocmd': { text: 'Command %0 does not exist.', error: true },
'cmderr': { text: 'You did not use that command correctly.', error: true },
'usernf': { text: '%0 is not logged in right now!', error: true },
'kickna': { text: 'You are not allowed to kick %0.', error: true },
'samechan': { text: 'You are already in channel %0.', error: true },
'ipchan': { text: 'You are not allowed to join channel %0.', error: true },
'nochan': { text: 'Channel %0 does not exist.', error: true },
'nopwchan': { text: 'Channel %0 requires a password. Use /join %0 <password>', error: true },
'ipwchan': { text: 'Wrong password for channel %0.', error: true },
'inchan': { text: 'Channel name contains invalid characters.', error: true },
'nischan': { text: 'A channel with the name %0 already exists.', error: true },
'ndchan': { text: 'You are not allowed to deleted channel %0.', error: true },
'namchan': { text: 'You are not allowed to edit channel %0.', error: true },
'nameinuse': { text: 'Someone else is already using the name %0.', error: true },
'rankerr': { text: 'You cannot set the access level of a channel higher than that of your own.', error: true },
};
const formatTemplate = (template, args) => {
if(typeof template !== 'string')
template = '';
if(Array.isArray(args))
for(let i = 0; i < args.length; ++i) {
const arg = args[i] === undefined || args[i] === null ? '' : args[i].toString();
template = template.replace(new RegExp(`%${i}`, 'g'), arg);
}
return template;
};
return {
handled: type => type in strings,
show: async (type, args) => {
if(!(type in strings))
throw 'type is not a registered string';
const info = strings[type];
const message = formatTemplate(info.text, args);
if(settings.get(info.error ? 'soundEnableError' : 'soundEnableServer')) {
let soundName;
if('sound' in info)
soundName = sound.pack.getEventSound(info.sound);
if(soundName === undefined)
soundName = sound.pack.getEventSound(info.error ? 'error' : 'server');
sound.library.play(soundName);
}
await msgbox.show({ body: [message] });
},
};
};

View file

@ -31,12 +31,6 @@ Umi.UI.Messages = (function() {
const botMsgs = { const botMsgs = {
'say': { text: '%0' }, 'say': { text: '%0' },
'generr': { text: 'Something unexpected happened.' },
'flwarn': { text: 'You are about to hit the flood limit! If you continue you will be kicked.' },
'unban': { text: '%0 is no longer banned.', sound: 'unban' },
'delerr': { text: 'You are not allowed to delete this message.' },
'notban': { text: '%0 is not banned.' },
'whoerr': { text: '%0 does not exist.' },
'join': { text: '%0 has joined.', action: 'has joined', sound: 'join' }, 'join': { text: '%0 has joined.', action: 'has joined', sound: 'join' },
'leave': { text: '%0 has disconnected.', action: 'has disconnected', avatar: 'greyscale', sound: 'leave' }, 'leave': { text: '%0 has disconnected.', action: 'has disconnected', avatar: 'greyscale', sound: 'leave' },
'jchan': { text: '%0 has joined the channel.', action: 'has joined the channel', sound: 'join' }, 'jchan': { text: '%0 has joined the channel.', action: 'has joined the channel', sound: 'join' },
@ -45,27 +39,7 @@ Umi.UI.Messages = (function() {
'flood': { text: '%0 got kicked for flood protection.', action: 'got kicked for flood protection', avatar: 'invert', sound: 'flood' }, 'flood': { text: '%0 got kicked for flood protection.', action: 'got kicked for flood protection', avatar: 'invert', sound: 'flood' },
'timeout': { text: '%0 exploded.', action: 'exploded', avatar: 'greyscale', sound: 'timeout' }, 'timeout': { text: '%0 exploded.', action: 'exploded', avatar: 'greyscale', sound: 'timeout' },
'nick': { text: '%0 changed their name to %1.', action: 'changed their name to %1' }, 'nick': { text: '%0 changed their name to %1.', action: 'changed their name to %1' },
'crchan': { text: 'Channel %0 has been created.' },
'delchan': { text: 'Channel %0 has been deleted.' },
'cpwdchan': { text: 'Channel password has been changed.' },
'cprivchan': { text: 'Channel access level has been changed.' },
'ipaddr': { text: 'IP address of %0 is %1.' }, 'ipaddr': { text: 'IP address of %0 is %1.' },
'cmdna': { text: 'You are not allowed to use %0.' },
'nocmd': { text: 'Command %0 does not exist.' },
'cmderr': { text: 'You did not use that command correctly.' },
'usernf': { text: '%0 is not logged in right now!' },
'kickna': { text: 'You are not allowed to kick %0.' },
'samechan': { text: 'You are already in channel %0.' },
'ipchan': { text: 'You are not allowed to join channel %0.' },
'nochan': { text: 'Channel %0 does not exist.' },
'nopwchan': { text: 'Channel %0 requires a password. Use /join %0 <password>' },
'ipwchan': { text: 'Wrong password for channel %0.' },
'inchan': { text: 'Channel name contains invalid characters.' },
'nischan': { text: 'A channel with the name %0 already exists.' },
'ndchan': { text: 'You are not allowed to deleted channel %0.' },
'namchan': { text: 'You are not allowed to edit channel %0.' },
'nameinuse': { text: 'Someone else is already using the name %0.' },
'rankerr': { text: 'You cannot set the access level of a channel higher than that of your own.' },
'banlist': { 'banlist': {
text: 'Banned: %0', text: 'Banned: %0',
filter: args => { filter: args => {