Added site-wide emote support.

This commit is contained in:
rainbow napkin 2024-12-20 01:42:48 -05:00
parent 41d0302ded
commit 97717b525c
11 changed files with 122 additions and 22 deletions

View file

@ -102,19 +102,14 @@ img.admin-list-entry-item{
width: 11em;
}
#toke-command-list-div{
/*Maybe I suck at CSS but I can't get relative percentage-based heights to play nice here.
Either way sizing this by total viewheight isn't too big a deal. At least here...*/
min-height: 9em;
max-height: 20vh;
}
div.toke-command-list{
display: grid;
grid-template-columns: repeat(auto-fit, minmax(15em, 1fr));
text-align: center;
padding: 1em;
overflow-y: auto;
min-height: 0.8em;
max-height: 5.5em;
}
span.toke-command-list{
@ -131,16 +126,13 @@ i.toke-command-list{
margin: 0.2em;
}
#emote-list-div{
height: 30vh;
}
#emote-list{
display: grid;
grid-template-columns: repeat(auto-fit, minmax(10em, 1fr));
padding: 1em;
overflow-y: auto;
justify-items: center;
max-height: 19.8em;
}
div.emote-list-emote{

View file

@ -269,11 +269,12 @@ span.user-entry{
.toke{
text-align: center;
margin: 0.2em auto;
font-size: 9pt;
font-size: 9.5pt;
}
.tokewhisper{
.serverwhisper{
font-size: 9pt;
font-style: italic;
}
.chat-img, .chat-video{

View file

@ -26,8 +26,9 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.*/
--bg2-alt0: rgb(200, 200, 200);
--bg2-alt1: rgb(180, 180, 180);
--accent0: rgb(48, 47, 47);
--accent0: rgb(47, 47, 47);
--accent0-alt0: rgb(34, 34, 34);
--accent0-alt1: rgb(70, 70, 70);
--accent1: rgb(245, 245, 245);
--accent1-alt0: rgb(185, 185, 185);
--accent2: var(--accent0-alt0);
@ -240,6 +241,10 @@ p.channel-guide-entry-item{
border-bottom: 1px solid var(--bg2-alt1);
}
.serverwhisper{
color: var(--accent0-alt1)
}
.userlist-color0{/*green0*/
color: var(--userlist-color0);
text-shadow: none;

View file

@ -27,7 +27,7 @@ class chatBox{
//Preprocessor objects
this.commandPreprocessor = new commandPreprocessor(client);
this.chatPostprocessor = new chatPostprocessor();
this.chatPostprocessor = new chatPostprocessor(client);
//Element Nodes
this.chatPanel = document.querySelector("#chat-panel-div");

View file

@ -1,5 +1,6 @@
class chatPostprocessor{
constructor(){
constructor(client){
this.client = client;
}
preprocess(chatEntry, rawData){
@ -91,6 +92,15 @@ class chatPostprocessor{
img.classList.add('chat-img');
img.src = wordObj.link;
//Look for an emote by link since emotes are tx'd as bare links
const emote = this.client.chatBox.commandPreprocessor.getEmoteByLink(wordObj.link);
//If this is a known emote
if(emote != null){
//Set the hover text to the emote's name
img.title = `[${emote.name}]`;
}
//Append node to chatBody
injectNode(wordObj, img);
}else if(wordObj.type == 'video'){
@ -103,6 +113,15 @@ class chatPostprocessor{
vid.loop = true;
vid.muted = true;
//Look for an emote by link since emotes are tx'd as bare links
const emote = this.client.chatBox.commandPreprocessor.getEmoteByLink(wordObj.link);
//If this is a known emote
if(emote != null){
//Set the hover text to the emote's name
vid.title = `[${emote.name}]`;
}
injectNode(wordObj, vid);
}
});
@ -216,7 +235,7 @@ class chatPostprocessor{
userNode.classList.add('announcement-title');
this.chatBody.classList.add('announcement-body');
this.chatEntry.classList.add('announcement');
}else if(this.rawData.type == "toke" || this.rawData.type == "tokewhisper"){
}else if(this.rawData.type == "toke"){
//Squash the high-level
this.chatEntry.querySelector('.high-level').remove();
@ -224,7 +243,16 @@ class chatPostprocessor{
this.chatEntry.querySelector('.chat-entry-username').remove();
//Add toke/tokewhisper class
this.chatBody.classList.add(this.rawData.type);
this.chatBody.classList.add("toke");
}else if(this.rawData.type == "tokewhisper"){
//Squash the high-level
this.chatEntry.querySelector('.high-level').remove();
//remove the username
this.chatEntry.querySelector('.chat-entry-username').remove();
//Add toke/tokewhisper class
this.chatBody.classList.add("tokewhisper","serverwhisper");
}
}
}

View file

@ -2,6 +2,19 @@ class commandPreprocessor{
constructor(client){
this.client = client;
this.commandProcessor = new commandProcessor(client);
this.emotes = {
site: [],
chan: [],
personal: []
}
//define listeners
this.defineListeners();
}
defineListeners(){
//When we receive site-wide emote list
this.client.socket.on("siteEmotes", this.setSiteEmotes.bind(this));
}
preprocess(command){
@ -13,6 +26,7 @@ class commandPreprocessor{
if(this.sendFlag){
this.message = command;
this.processEmotes();
this.processLinks();
this.sendRemoteCommand();
}
@ -38,6 +52,14 @@ class commandPreprocessor{
}
}
processEmotes(){
//Does checking each word for an emote use more or less cycles than running replace against each emote?
//Not sure, but it's sure as fuck easier to write it that way lmao
this.emotes.site.forEach((emote) => {
this.message = this.message.replaceAll(`[${emote.name}]`, emote.link);
});
}
processLinks(){
//Strip out file seperators in-case the user is being a smart-ass
this.message = this.message.replaceAll('␜','');
@ -66,6 +88,25 @@ class commandPreprocessor{
this.client.socket.emit("chatMessage",{msg: this.message, links: this.links});
}
setSiteEmotes(data){
this.emotes.site = data;
}
getEmoteByLink(link){
//Create an empty variable to hold the found emote
var foundEmote = null;
//For every site-wide emote
this.emotes.site.forEach((emote) => {
//if we found a match
if(emote.link == link){
//return the match
foundEmote = emote;
}
});
return foundEmote;
}
}