Added channel-wide !announce command
This commit is contained in:
parent
0182c6927e
commit
375cdfb3d8
10 changed files with 78 additions and 17 deletions
98
www/js/channel/chatPostprocessor.js
Normal file
98
www/js/channel/chatPostprocessor.js
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
class chatPostprocessor{
|
||||
constructor(){
|
||||
}
|
||||
|
||||
preprocess(chatEntry, rawData){
|
||||
this.rawData = rawData;
|
||||
//Set current chat nodes
|
||||
this.chatEntry = chatEntry;
|
||||
this.chatBody = this.chatEntry.querySelector(".chat-entry-body");
|
||||
//Split the chat body into an array of objects representing each word
|
||||
//We could pass this through arguments but these functions wont be very interoperable anyways since they expect a purpose-made hashtable
|
||||
this.splitBody();
|
||||
|
||||
//Inject whitespace into un-processed words
|
||||
this.addWhitespace();
|
||||
|
||||
//Handle non-standard chat types
|
||||
this.handleChatType();
|
||||
|
||||
//Inject the pre-processed chat into the chatEntry node
|
||||
this.injectBody();
|
||||
//Return the pre-processed node
|
||||
return this.chatEntry;
|
||||
}
|
||||
|
||||
splitBody(){
|
||||
//Create an empty array to hold the body
|
||||
this.bodyArray = [];
|
||||
//Split string by words
|
||||
const splitString = this.chatBody.innerHTML.split(/\b/g); //Group words together
|
||||
|
||||
//for each word in the splitstring
|
||||
splitString.forEach((string) => {
|
||||
//create a word object
|
||||
const wordObj = {
|
||||
string: string,
|
||||
type: "word"
|
||||
}
|
||||
|
||||
//Add it to our body array
|
||||
this.bodyArray.push(wordObj);
|
||||
});
|
||||
}
|
||||
|
||||
injectBody(){
|
||||
//Create empty array to hold strings
|
||||
var stringArray = [];
|
||||
|
||||
//Extract strings into the empty array
|
||||
this.bodyArray.forEach((wordObj) => {
|
||||
stringArray.push(wordObj.string);
|
||||
});
|
||||
|
||||
//Join the strings to fill the chat entry
|
||||
this.chatBody.innerHTML = stringArray.join("");
|
||||
}
|
||||
|
||||
addWhitespace(){
|
||||
//for each word object in the body
|
||||
this.bodyArray.forEach((wordObj, wordIndex) => {
|
||||
//if the word object hasn't been pre-processed elsewhere
|
||||
if(wordObj.type == "word"){
|
||||
var wordArray = [];
|
||||
//Add invisible whitespace in-between characters to keep it from breaking page layout
|
||||
//this.bodyArray[index].string = wordObj.string.split("").join("ㅤ");
|
||||
this.bodyArray[wordIndex].string.split("").forEach((char, charIndex) => {
|
||||
wordArray.push(char);
|
||||
//After eight characters
|
||||
if(charIndex > 8){
|
||||
//Push an invisible line-break character between every character
|
||||
wordArray.push("ㅤ");
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
this.bodyArray[wordIndex].string = wordArray.join("");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
handleChatType(){
|
||||
if(this.rawData.type == "whisper"){
|
||||
this.chatBody.classList.add('whisper');
|
||||
}else if(this.rawData.type == "announcement"){
|
||||
//Squash the high-level
|
||||
this.chatEntry.querySelector('.high-level').remove();
|
||||
|
||||
//Get the username and make it into an announcement title (little hacky but this *IS* postprocessing)
|
||||
const userNode = this.chatEntry.querySelector('.chat-entry-username');
|
||||
userNode.innerHTML = `${userNode.innerHTML.slice(0,-2)} Announcement`;
|
||||
//Add/remove relevant classes
|
||||
userNode.classList.remove('chat-entry-username');
|
||||
userNode.classList.add('announcement-title');
|
||||
this.chatBody.classList.add('announcement-body');
|
||||
this.chatEntry.classList.add('announcement');
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue