it would have actually been more useful to have a shortcut for it, but the terminal to bbcode thing is just a sidebar button. the chatbox button i have is [P], for Pomf, because it's what i used to use before szyup before eeprom
i am here once again with a usage survey
Does anyone use the umi:message_add
event in general, or the message
field of the umi:ui:message_add
event at all?
If so, can you modify it to just use the element
field of umi:ui:message_add
instead? (please do not use the dataset fields and expect them to exist in the future, they are subject to change)
If not, what data from the message object are you using?
i dont know if there's a better way to do this, but ui for deleting message
// ==UserScript==
// @name Flashii Delete Message Button
// @namespace http://no.com
// @version 1.3
// @description Adds a delete button to each of your own message in Flashii Chat
// @author no
// @match *://chat.flashii.net/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
// Ensures chat is loaded
window.addEventListener('umi:connect', function(ev) {
// Function to add delete button to your own messages
function addDeleteButtons() {
const userId = Umi.User.getCurrentUser().id;
const messages = document.querySelectorAll('.message');
messages.forEach(message => {
const messageId = message.getAttribute('data-id');
const messageAuthor = message.getAttribute('data-author');
const messageBody = message.getAttribute('data-body');
// Exclude messages containing join and leave phrases, and with the class message-tiny
const excludedPhrases = ["has disconnected", "has joined"];
const containsExcludedPhrase = excludedPhrases.some(phrase => messageBody.includes(phrase));
const isTinyMessage = message.classList.contains('message-tiny');
if ((messageAuthor === userId && !containsExcludedPhrase && !message.querySelector('.delete-button')) ||
(isTinyMessage && messageAuthor === userId && !containsExcludedPhrase && !message.querySelector('.delete-button'))) {
const deleteButton = document.createElement('button');
deleteButton.innerHTML = '×'; // Cross symbol
deleteButton.className = 'delete-button';
deleteButton.style.position = 'absolute';
deleteButton.style.right = '10px';
deleteButton.style.top = '50%';
deleteButton.style.transform = 'translateY(-50%)';
deleteButton.style.backgroundColor = '#333';
deleteButton.style.color = '#fff';
deleteButton.style.border = 'none';
deleteButton.style.padding = '2px 5px';
deleteButton.style.borderRadius = '1px';
deleteButton.style.cursor = 'pointer';
deleteButton.addEventListener('click', () => {
Umi.Server.SendMessage(`/delete ${messageId}`);
}
);
message.style.position = 'relative';
message.appendChild(deleteButton);
}
});
}
// Add delete buttons when the script is loaded
addDeleteButtons();
// Observe mutations to add delete buttons to new messages
const observer = new MutationObserver(addDeleteButtons);
observer.observe(document.body, { childList: true, subtree: true });
});
})();
---

nook remover
// ==UserScript==
// @name Nook Remover Reimagined
// @namespace https://saikuru.net/
// @version 2024-11-24
// @description Automatically removes embeds from nook
// @author You
// @match https://chat.flashii.net/
// @icon https://www.google.com/s2/favicons?sz=64&domain=flashii.net
// @grant none
// ==/UserScript==
(function () {
'use strict';
const observer = new MutationObserver((mutationsList) => {
mutationsList.forEach((mutation) => {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === Node.ELEMENT_NODE) {
const element = node;
if (element.matches && element.matches('div.message--user-181')) {
element.querySelectorAll('embed, iframe, object, img, video, audio').forEach((embeddable) => {
embeddable.remove();
});
}
}
});
});
});
observer.observe(document.body, { childList: true, subtree: true });
})();
// ==UserScript==
// @name Flashii Chat - Better Quotes & Delete Button
// @version 2.0
// @description Adds additional behaviour to quote selected text in messages, adds buttons to quote whole messages, and delete your own messages.
// @author lester
// @match *://chat.flashii.net/*
// @grant none
// ==/UserScript==
(function(){
let selectedText = '';
document.addEventListener('mouseup', () => {
const sel = window.getSelection();
if (!sel || sel.isCollapsed) return;
const range = sel.getRangeAt(0);
const container = range.commonAncestorContainer;
const inside = container.nodeType === 1 ? container.closest('#umi-messages') : container.parentElement?.closest('#umi-messages');
if (inside) selectedText = sel.toString().trim();
});
document.addEventListener('click', e => {
const t = e.target;
if (t.matches('button.markup__button') && t.textContent.trim().toLowerCase() === 'quote') {
setTimeout(() => {
const input = document.querySelector('textarea.input__text');
if (input && selectedText) {
input.value = input.value.trim() === '[quote][/quote]' ? `[quote]${selectedText}[/quote]` : input.value + `[quote]${selectedText}[/quote]`;
input.focus();
selectedText = '';
}
}, 50);
}
});
window.addEventListener('umi:connect', () => {
const userId = Umi.User.getCurrentUser().id;
const rgbToHex = rgb => {
const m = rgb.match(/\d+/g);
return !m || m.length < 3 ? '#000000' : '#' + m.slice(0, 3).map(x => parseInt(x).toString(16).padStart(2, '0')).join('');
};
const injectCSS = () => {
if (!document.getElementById('chat-enhance-style')) {
const s = document.createElement('style');
s.id = 'chat-enhance-style';
s.textContent = `
.message .quote-button, .message .delete-button {
opacity: 0;
transition: opacity 0.2s ease;
}
.message:hover .quote-button, .message:hover .delete-button {
opacity: 1;
}
`;
document.head.appendChild(s);
}
};
const addButtons = () => {
injectCSS();
const input = document.querySelector('textarea.input__text');
document.querySelectorAll('.message').forEach(msg => {
const id = msg.getAttribute('data-id');
const author = msg.getAttribute('data-author');
const body = msg.getAttribute('data-body');
const isTiny = msg.classList.contains('message-tiny');
const skip = ['has disconnected', 'has joined'].some(p => body.includes(p));
const hasQuote = msg.querySelector('.quote-button');
const hasDelete = msg.querySelector('.delete-button');
const textEl = msg.querySelector('.message__text');
const userEl = msg.querySelector('.message__user');
const timeEl = msg.querySelector('.message__time');
if (!hasQuote && textEl && userEl && timeEl && input) {
const b = document.createElement('button');
b.className = 'quote-button';
b.textContent = 'Quote';
b.title = 'Quote this message';
Object.assign(b.style, {
position: 'absolute',
right: '10px',
top: '50%',
transform: 'translateY(-50%)',
backgroundColor: '#333',
color: '#fff',
border: 'none',
padding: '2px 6px',
borderRadius: '2px',
cursor: 'pointer',
fontSize: '13px'
});
b.addEventListener('click', () => {
const name = userEl.textContent.trim() || 'Unknown';
const time = timeEl.textContent.trim();
const msgText = textEl.textContent.trim();
const raw = userEl.style.color;
const userColor = (!raw || raw === 'inherit') ? '#ffffff' : rgbToHex(raw);
const quote = `[color=${userColor}][b]${name}[/b][/color][color=#c0c0c0] @ ${time} — [/color][quote]${msgText}[/quote]`;
input.value += quote;
input.focus();
});
msg.style.position = 'relative';
msg.appendChild(b);
}
if (!hasDelete && author === userId && !skip && input && (textEl || isTiny)) {
const d = document.createElement('button');
d.className = 'delete-button';
d.innerHTML = '×';
d.title = 'Delete this message';
Object.assign(d.style, {
position: 'absolute',
right: '60px',
top: '50%',
transform: 'translateY(-50%)',
backgroundColor: '#333',
color: '#fff',
border: 'none',
padding: '2px 5px',
borderRadius: '1px',
cursor: 'pointer',
fontSize: '13px'
});
d.addEventListener('click', () => {
Umi.Server.SendMessage(`/delete ${id}`);
});
msg.style.position = 'relative';
msg.appendChild(d);
}
});
};
addButtons();
const observer = new MutationObserver(addButtons);
observer.observe(document.body, { childList: true, subtree: true });
});
})();
---
