// ==UserScript== // @name Flow Youtube Chat // @version 1.13.3 // @description Youtubeのチャットをニコニコ風に画面上へ流すスクリプトです(再アップ,絵文字バグ修正済み) // @match https://www.youtube.com/* // @namespace FlowYoutubeChatScript // @run-at document-end // @grant GM.setValue // @grant GM.getValue // @grant GM.deleteValue // @grant GM.listValues // @noframes // @license AGPL-3.0-or-later // @require https://cdn.jsdelivr.net/npm/sweetalert2@10.10.1/dist/sweetalert2.all.min.js#sha384-OCBhaEdUu7BFgaeRVey2PDeHof2MSQRFe/e6S8Q3XrmSV7wrKpLmhPj8FOldGiaF // @require https://unpkg.com/loglevel@1.7.0/dist/loglevel.min.js#sha384-7gGuWfek8Ql6j/uNDFrS0BCe4x2ZihD4B68w9Eu580OVHJBV+bl3rZmEWC7q5/Gj // @require https://unpkg.com/rxjs@7.0.0-beta.10/dist/bundles/rxjs.umd.min.js#sha384-+BwV2u+ZJFwj586/3PlpsZdYS1U/+hT/zpjYSznHH4XzUJqgshDzZITJ+zGeWl// // @downloadURL none // ==/UserScript== /* jshint esversion: 6 */ (()=>{var __webpack_modules__={494:function(module,exports,__webpack_require__){var __WEBPACK_AMD_DEFINE_RESULT__ !function(globals){"use strict" var messages,predicates,functions,assert,not,maybe,collections,hasOwnProperty,toString,keys,slice,isArray,neginf,posinf,haveSymbols,haveMaps,haveSets function assigned(data){return null!=data}function number(data){return"number"==typeof data&&data>neginf&&datarhs}function less(lhs,rhs){return number(lhs)&&lhs=rhs}function lessOrEqual(lhs,rhs){return number(lhs)&&lhs<=rhs}function string(data){return"string"==typeof data}function nonEmptyString(data){return string(data)&&""!==data}function object(data){return"[object Object]"===toString.call(data)}function some(data,predicate){for(var key in data)if(hasOwnProperty.call(data,key)&&predicate(key,data[key]))return!0 return!1}function instanceStrict(data,prototype){try{return data instanceof prototype}catch(error){return!1}}function like(data,archetype){var name for(name in archetype)if(hasOwnProperty.call(archetype,name)){if(!1===hasOwnProperty.call(data,name)||typeof data[name]!=typeof archetype[name])return!1 if(object(data[name])&&!1===like(data[name],archetype[name]))return!1}return!0}function arrayLike(data){return assigned(data)&&data.length>=0}function iterable(data){return haveSymbols?assigned(data)&&isFunction(data[Symbol.iterator]):arrayLike(data)}function contains(data,value){var iterator,iteration if(!assigned(data))return!1 if(haveSets&&instanceStrict(data,Set))return data.has(value) if(string(data))return-1!==data.indexOf(value) if(haveSymbols&&data[Symbol.iterator]&&isFunction(data.values)){iterator=data.values() do{if((iteration=iterator.next()).value===value)return!0}while(!iteration.done) return!1}return some(data,(function(key,dataValue){return dataValue===value}))}function containsKey(data,key){return!!assigned(data)&&(haveMaps&&instanceStrict(data,Map)?data.has(key):!(iterable(data)&&!number(+key))&&!!data[key])}function isFunction(data){return"function"==typeof data}function forEach(object,action){for(var key in object)hasOwnProperty.call(object,key)&&action(key,object[key])}function testArray(data,result){var i for(i=0;iy},s:"be between {e} and {e2}"},{n:"greaterOrEqual",f:greaterOrEqual,s:"be greater than or equal to {e}"},{n:"lessOrEqual",f:lessOrEqual,s:"be less than or equal to {e}"},{n:"inRange",f:function(data,x,y){if(x=y},s:"be in the range {e} to {e2}"},{n:"positive",f:function(data){return greater(data,0)},s:"be positive number"},{n:"negative",f:function(data){return less(data,0)},s:"be negative number"},{n:"string",f:string,s:"be String"},{n:"emptyString",f:function(data){return""===data},s:"be empty string"},{n:"nonEmptyString",f:nonEmptyString,s:"be non-empty string"},{n:"match",f:function(data,regex){return string(data)&&!!data.match(regex)},s:"match {e}"},{n:"boolean",f:function(data){return!1===data||!0===data},s:"be Boolean"},{n:"object",f:object,s:"be Object"},{n:"emptyObject",f:function(data){return object(data)&&!some(data,(function(){return!0}))},s:"be empty object"},{n:"nonEmptyObject",f:function(data){return object(data)&&some(data,(function(){return!0}))},s:"be non-empty object"},{n:"instanceStrict",f:instanceStrict,s:"be instanceof {t}"},{n:"thenable",f:function(data){return assigned(data)&&isFunction(data.then)},s:"be promise-like"},{n:"instance",f:function(data,prototype){try{return instanceStrict(data,prototype)||data.constructor.name===prototype.name||toString.call(data)==="[object "+prototype.name+"]"}catch(error){return!1}},s:"be {t}"},{n:"like",f:like,s:"be like {e}"},{n:"array",f:function(data){return isArray(data)},s:"be Array"},{n:"emptyArray",f:function(data){return isArray(data)&&0===data.length},s:"be empty array"},{n:"nonEmptyArray",f:function(data){return isArray(data)&&data.length>0},s:"be non-empty array"},{n:"arrayLike",f:arrayLike,s:"be array-like"},{n:"iterable",f:iterable,s:"be iterable"},{n:"date",f:function(data){return instanceStrict(data,Date)&&integer(data.getTime())},s:"be valid Date"},{n:"function",f:isFunction,s:"be Function"},{n:"hasLength",f:function(data,length){return assigned(data)&&data.length===length},s:"have length {e}"},{n:"throws",f:function(data){if(!isFunction(data))return!1 try{data()}catch(error){return!0}return!1},s:"throw"}].map((function(data){var n=data.n messages[n]="assert failed: expected {a} to "+data.s,predicates[n]=data.f})),functions={map:function map(data,predicates){var result result=isArray(data)?[]:{} if(isFunction(predicates))forEach(data,(function(key,value){result[key]=predicates(value)})) else{isArray(predicates)||assert.object(predicates) var dataKeys=keys(data||{}) forEach(predicates,(function(key,predicate){dataKeys.some((function(dataKey,index){return dataKey===key&&(dataKeys.splice(index,1),!0)})),isFunction(predicate)?not.assigned(data)?result[key]=!!predicate.m:result[key]=predicate(data[key]):result[key]=map(data[key],predicate)}))}return result},all:function(data){if(isArray(data))return testArray(data,!1) return assert.object(data),testObject(data,!1)},any:function(data){if(isArray(data))return testArray(data,!0) return assert.object(data),testObject(data,!0)}},collections=["array","arrayLike","iterable","object"],hasOwnProperty=Object.prototype.hasOwnProperty,toString=Object.prototype.toString,keys=Object.keys,slice=Array.prototype.slice,isArray=Array.isArray,neginf=Number.NEGATIVE_INFINITY,posinf=Number.POSITIVE_INFINITY,haveSymbols="function"==typeof Symbol,haveMaps="function"==typeof Map,haveSets="function"==typeof Set,functions=mixin(functions,predicates),assert=createModifiedPredicates(assertModifier,assertImpl),not=createModifiedPredicates(notModifier,notImpl),maybe=createModifiedPredicates((function(predicate){var modifiedPredicate=function(){return!!not.assigned(arguments[0])||predicate.apply(null,arguments)} return modifiedPredicate.l=predicate.length,modifiedPredicate.m=!0,modifiedPredicate}),(function(value){if(!1===assigned(value))return!0 return value})),assert.not=createModifiedModifier(assertModifier,not,"not "),assert.maybe=createModifiedModifier(assertModifier,maybe,"maybe "),collections.forEach((function(key){predicates[key].of=createModifiedFunctions([ofModifier.bind(null,null),predicates[key],predicates,{},""])})),createOfModifiers(assert,assertModifier),createOfModifiers(not,notModifier),collections.forEach((function(key){maybe[key].of=createModifiedFunctions([ofModifier.bind(null,"maybe"),predicates[key],predicates,{},""]),assert.maybe[key].of=createModifiedModifier(assertModifier,maybe[key].of),assert.not[key].of=createModifiedModifier(assertModifier,not[key].of)})),function(functions){void 0===(__WEBPACK_AMD_DEFINE_RESULT__=function(){return functions}.call(exports,__webpack_require__,exports,module))||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)}(mixin(functions,{assert,not,maybe}))}()},228:module=>{"use strict" const createAbortError=()=>{const error=new Error("Delay aborted") return error.name="AbortError",error},createDelay=({clearTimeout:defaultClear,setTimeout:set,willResolve})=>(ms,{value,signal}={})=>{if(signal&&signal.aborted)return Promise.reject(createAbortError()) let timeoutId,settle,rejectFn const clear=defaultClear||clearTimeout,signalListener=()=>{clear(timeoutId),rejectFn(createAbortError())},delayPromise=new Promise(((resolve,reject)=>{settle=()=>{signal&&signal.removeEventListener("abort",signalListener),willResolve?resolve(value):reject(value)},rejectFn=reject,timeoutId=(set||setTimeout)(settle,ms)})) return signal&&signal.addEventListener("abort",signalListener,{once:!0}),delayPromise.clear=()=>{clear(timeoutId),timeoutId=null,settle()},delayPromise},delay=createDelay({willResolve:!0}) delay.reject=createDelay({willResolve:!1}),delay.range=(minimum,maximum,options)=>delay(((minimum,maximum)=>Math.floor(Math.random()*(maximum-minimum+1)+minimum))(minimum,maximum),options),delay.createWithTimers=({clearTimeout,setTimeout})=>{const delay=createDelay({clearTimeout,setTimeout,willResolve:!0}) return delay.reject=createDelay({clearTimeout,setTimeout,willResolve:!1}),delay},module.exports=delay,module.exports.default=delay}},__webpack_module_cache__={} function __webpack_require__(moduleId){if(__webpack_module_cache__[moduleId])return __webpack_module_cache__[moduleId].exports var module=__webpack_module_cache__[moduleId]={exports:{}} return __webpack_modules__[moduleId].call(module.exports,module,module.exports,__webpack_require__),module.exports}__webpack_require__.n=module=>{var getter=module&&module.__esModule?()=>module.default:()=>module return __webpack_require__.d(getter,{a:getter}),getter},__webpack_require__.d=(exports,definition)=>{for(var key in definition)__webpack_require__.o(definition,key)&&!__webpack_require__.o(exports,key)&&Object.defineProperty(exports,key,{enumerable:!0,get:definition[key]})},__webpack_require__.o=(obj,prop)=>Object.prototype.hasOwnProperty.call(obj,prop),(()=>{"use strict" const external_log_namespaceObject=log var external_log_default=__webpack_require__.n(external_log_namespaceObject) const external_rxjs_namespaceObject=rxjs,external_rxjs_operators_namespaceObject=rxjs.operators,livePage_getPlayer=()=>{var _a return null!==(_a=document.querySelector("#movie_player"))&&void 0!==_a?_a:void 0},livePage_getMainVideo=()=>{var _a return null!==(_a=document.querySelector("video.video-stream.html5-main-video"))&&void 0!==_a?_a:void 0},livePage_getChatFrame=()=>{var _a return null!==(_a=document.querySelector("#chatframe"))&&void 0!==_a?_a:void 0},livePage_getChatField=()=>{var _a,_b,_c return null!==(_c=(null!==(_b=null===(_a=document.querySelector("#chatframe"))||void 0===_a?void 0:_a.contentDocument)&&void 0!==_b?_b:document).querySelector("#items.style-scope.yt-live-chat-item-list-renderer"))&&void 0!==_c?_c:void 0} const assert_lib=__webpack_require__(494).assert,tapIs=(constructor,x)=>(assert_lib(x instanceof constructor),x),changeChatAnimState=playing=>{var _a tapIs(CSSStyleRule,null===(_a=document.styleSheets.item(document.styleSheets.length-1))||void 0===_a?void 0:_a.cssRules.item(0)).style.animationPlayState=playing?"running":"paused"},checkBannedRegexpWords=(chatData,userConfig)=>userConfig.ngRegWords.some((word=>{const result=chatData.html.match(word) return!!result&&(external_log_default().debug(`Banned Word: "${result}" in "${chatData.html}"`),!0)})),checkBannedUsers=(chatData,userConfig)=>Boolean(chatData.authorID)&&userConfig.ngUsers.some((user=>{var _a const result=null===(_a=chatData.authorID)||void 0===_a?void 0:_a.match(user) return!!result&&(external_log_default().debug(`Banned User: "${result}" in "${chatData.html}"`),!0)})),checkBannedWords=(chatData,userConfig)=>userConfig.ngWords.some((word=>!!chatData.html.includes(word)&&(external_log_default().debug(`Banned Word: "${word}" in "${chatData.html}"`),!0))),tapNonNull=x=>(assert_lib(null!=x),x),convertChat=(chat,userConfig)=>{const{maxLength}=userConfig let html="",length=0 const isMember=Boolean(chat.querySelector(".member")) let authorID const color=chat.querySelector(".owner")?userConfig.colorOwner:chat.querySelector(".moderator")?userConfig.colorModerator:isMember?userConfig.colorMember:userConfig.color return Array.from(chat.children).forEach((child=>{var _a,_b,_c,_d,_e,_f,_g,_h const childID=child.id,message=child.querySelector("#message") if("content"===childID){chat.querySelector(".moderator")&&!0===userConfig.displayModeratorName&&(html+=`${null===(_a=child.querySelector("#author-name"))||void 0===_a?void 0:_a.innerText}: `);(null!==(_b=null==message?void 0:message.innerHTML.split(//g))&&void 0!==_b?_b:[]).some((part=>{var _a,_b if(part.match(["emoji","yt-formatted-string","style-scope","yt-live-chat-text-message-renderer"].join(" "))){const src=part.match(/src="(\\.|[^"\\])*"/g),size=Math.round((userConfig.size-.2)*((null!==(_b=null===(_a=livePage_getMainVideo())||void 0===_a?void 0:_a.clientHeight)&&void 0!==_b?_b:0)/userConfig.laneNum)*100)/100 html+=``,length+=1}else html+=part.length>=maxLength?part.substr(0,maxLength):part,length+=part.length return length>=maxLength}))}if("author-photo"===childID){const matches=((null===(_c=child.lastElementChild)||void 0===_c?void 0:_c.getAttribute("src"))||"").match(/ytc\/(.*)=/) authorID=matches?matches[matches.length-1]:void 0}if("card"===childID){if(child.className===["style-scope","yt-live-chat-paid-message-renderer"].join(" ")){const header=tapNonNull(child.querySelector("#header")),content=child.querySelector("#content"),headerColor=window.getComputedStyle(header,null).getPropertyValue("background-color"),paidColor=window.getComputedStyle(content,null).getPropertyValue("background-color"),authorName=child.querySelector("#author-name"),paidAmount=child.querySelector("#purchase-amount")||child.querySelector("#purchase-amount-chip"),text=null==message?void 0:message.innerText.substring(0,maxLength) html+=`${null==authorName?void 0:authorName.innerText}: ${text}${null==paidAmount?void 0:paidAmount.innerText}`,length+=(null!==(_d=null==text?void 0:text.length)&&void 0!==_d?_d:0)+(null!==(_f=null===(_e=null==paidAmount?void 0:paidAmount.innerText)||void 0===_e?void 0:_e.length)&&void 0!==_f?_f:0),authorID=void 0}if(child.className===["style-scope","yt-live-chat-paid-sticker-renderer"].join(" ")){const textColor=window.getComputedStyle(chat,null).getPropertyValue("--yt-live-chat-paid-sticker-chip-background-color"),amountColor=window.getComputedStyle(chat,null).getPropertyValue("--yt-live-chat-paid-sticker-background-color"),authorName=child.querySelector("#author-name"),paidAmount=child.querySelector("#purchase-amount")||child.querySelector("#purchase-amount-chip") html+=`${null==authorName?void 0:authorName.innerText}: `,html+=`${null==paidAmount?void 0:paidAmount.innerText}`,length+=null!==(_h=null===(_g=null==paidAmount?void 0:paidAmount.innerText)||void 0===_g?void 0:_g.length)&&void 0!==_h?_h:0,authorID=void 0}}})),{html,length,color,isMine:!1,isMember,authorID}},getFlowingChats=()=>document.querySelectorAll(".fyc_chat"),createChat=(chatData,userConfig)=>{var _a,_b,_c const screenHeight=null!==(_b=null===(_a=livePage_getMainVideo())||void 0===_a?void 0:_a.clientHeight)&&void 0!==_b?_b:0,chatHTML=chatData.html,chatLength=chatData.length,chatColor=chatData.color,chatIsMine=chatData.isMine,chatSize=Math.round((userConfig.size-.2)*(screenHeight/userConfig.laneNum)*100)/100,chatSpeed=((length,userConfig)=>720/(Math.min(length,userConfig.maxLength)+30)*(20/userConfig.speed))(chatLength,userConfig),chatLaneNum=((chatData,userConfig)=>{var _a,_b const screenWidth=null!==(_b=null===(_a=livePage_getPlayer())||void 0===_a?void 0:_a.clientWidth)&&void 0!==_b?_b:0,chats=getFlowingChats(),latestChatLength=chatData.length,acceptableLane=new Array(2*userConfig.laneNum-1).fill(!0) for(let i=0;i=3&&chatX>.8*screenWidth||latestChatLength-chatLength>=10&&chatX>.4*screenWidth?screenWidth-chatX+70:0 acceptableLane[chatLane]&&(acceptableLane[chatLane]=!(chatX+chatBoxAdjustment>screenWidth))}let resultLaneNum=0,i=0 for(;0===resultLaneNum;){if(1==acceptableLane[i]){resultLaneNum=i,i=0 break}if(i>3*userConfig.laneNum-1){resultLaneNum=0,i=0 break}0==acceptableLane[i]&&(resultLaneNum=0),i+=1}return resultLaneNum})(chatData,userConfig) let html="" if(html+=`${chatHTML}`,document.querySelector(".fyc_chat_usable")){const element=document.querySelectorAll(".fyc_chat_usable") element[element.length-1].outerHTML=html}else external_log_default().debug("AppendChat"),null===(_c=document.getElementById("fyc_chat_screen"))||void 0===_c||_c.insertAdjacentHTML("beforeend",html)},external_Swal_namespaceObject=Swal var external_Swal_default=__webpack_require__.n(external_Swal_namespaceObject) const defaultToast=()=>external_Swal_default().mixin({toast:!0,position:"bottom-left",timer:2500,timerProgressBar:!0,showConfirmButton:!1,didOpen:toast=>{toast.addEventListener("mouseenter",external_Swal_default().stopTimer),toast.addEventListener("mouseleave",external_Swal_default().resumeTimer)}}),logFyc=(...x)=>external_log_default().info(`【FYC】 ${x}`),createNgButton=(chat,id,userConfig)=>{var _a,_b,_c if(null===(_a=chat.children.namedItem("content"))||void 0===_a?void 0:_a.children.namedItem("fyc_ngbutton"))return if(chat.children.namedItem("card"))return const button=document.createElement("button") button.classList.add("style-scope","yt-icon-button","fyc_button"),button.id="fyc_ngbutton",button.style.padding="0px",button.style.width="20px",button.style.height="20px",button.setAttribute("aria-label","NGに入れる"),button.innerHTML='
',button.onclick=async()=>{try{logFyc(`Added to Banned Users: ${id}`),userConfig.ngUsers.push(id),await GM.setValue("FYC_NG_USERS",`${await GM.getValue("FYC_NG_USERS")}\n${id}`),tapNonNull(document.querySelector("#fyc_ngusers")).value=userConfig.ngUsers.join("\n"),chat.style.display="none",defaultToast().fire({title:`Added Banned User: ${id}`,icon:"success"})}catch(e){defaultToast().fire({title:`Error: ${e.message}`,icon:"error"})}},external_log_default().debug("AppendNgButton"),null===(_c=null===(_b=chat.children.namedItem("content"))||void 0===_b?void 0:_b.children.namedItem("message"))||void 0===_c||_c.appendChild(button)},deleteOldChats=userConfig=>{const chats=getFlowingChats() Array.from(chats).slice(0,Math.max(0,chats.length-userConfig.limit)).forEach((x=>{external_log_default().debug("RemoveOldChat"),x.remove()}))},findChatsOutOfScreen=()=>{const chats=getFlowingChats() for(let i=chats.length-1;i>=0;i-=1){const chat=chats[i],rect=chat.getBoundingClientRect() rect.x+rect.width<=0&&"fyc_chat fyc_chat_usable"!==chat.className&&(chat.className+=" fyc_chat_usable")}},setChatFieldSimplifyStyle=(chat,simplify)=>{if(chat.style.borderBottom=simplify?"1px solid var(--yt-spec-text-secondary)":"none",chat.querySelector(".style-scope.yt-live-chat-paid-message-renderer")||chat.querySelector(".owner"))return const authorPhoto=chat.children.namedItem("author-photo") authorPhoto&&(authorPhoto.style.display=simplify?"none":"block") const authorChip=chat.querySelector("yt-live-chat-author-chip.style-scope.yt-live-chat-text-message-renderer") authorChip&&(authorChip.style.display=simplify?"none":"inline-flex")} var delay=__webpack_require__(228),delay_default=__webpack_require__.n(delay) const createScriptCss=async userConfig=>{var _a,_b,_c,_d,_e,_f const screenWidth=null!==(_b=null===(_a=livePage_getPlayer())||void 0===_a?void 0:_a.clientWidth)&&void 0!==_b?_b:0,screenHeight=null!==(_d=null===(_c=livePage_getMainVideo())||void 0===_c?void 0:_c.clientHeight)&&void 0!==_d?_d:0,screenY=((null!==(_f=null===(_e=livePage_getPlayer())||void 0===_e?void 0:_e.clientHeight)&&void 0!==_f?_f:0)-screenHeight)/2,screenWidthLimit=4*-screenWidth,scriptCss=document.querySelector("#fyc_style") scriptCss&&(external_log_default().debug("RemoveCss"),scriptCss.remove()) let scriptCssHtml="" scriptCssHtml+='",external_log_default().debug("AppendCss"),document.body.insertAdjacentHTML("beforeend",scriptCssHtml),await(async(func,count,interval)=>{let exception,succeed=!1 for(let i=0;i{var _a,_b;(null===(_b=null===(_a=document.querySelector("#chatframe"))||void 0===_a?void 0:_a.contentDocument)||void 0===_b?void 0:_b.querySelector("#item-scroller.animated.yt-live-chat-item-list-renderer #item-offset.yt-live-chat-item-list-renderer")).style.overflow="unset"}),5,1e3)},createToggleChatDisplayButton=userConfig=>{if(document.getElementById("fyc_chat_visibility_button"))return const button=document.createElement("button") button.classList.add("ytp-button","fyc-chat-button"),button.id="fyc_chat_visibility_button",button.type="button",button.innerHTML=`` const label="コメント"+(userConfig.displayChats?"非表示":"表示") button.setAttribute("aria-label",label),button.setAttribute("title",label),button.addEventListener("click",(()=>(async userConfig=>{var _a,_b,_c const chats=getFlowingChats(),newDisplay=!userConfig.displayChats chats.forEach((x=>{x.style.visibility=newDisplay?"visible":"hidden"})),await GM.setValue("FYC_DISPLAY_COMMENTS",!userConfig.displayChats) const newLabel="コメント"+(newDisplay?"非表示":"表示") null===(_a=document.querySelector("#fyc_chat_visibility_button"))||void 0===_a||_a.setAttribute("aria-label",newLabel),null===(_b=document.querySelector("#fyc_chat_visibility_button"))||void 0===_b||_b.setAttribute("title",newLabel),null===(_c=document.querySelector("#chat_button_path"))||void 0===_c||_c.setAttribute("fill-opacity",newDisplay?"1":"0"),userConfig.displayChats=newDisplay})(userConfig))),external_log_default().debug("AppendToggleChatDisplayButton"),tapNonNull(document.querySelector(".ytp-right-controls")).appendChild(button)},requirementMet=()=>livePage_getChatFrame()&&livePage_getChatField()&&livePage_getPlayer(),initialize=async()=>{logFyc("Script started") const reinitSubject=new external_rxjs_namespaceObject.Subject,userConfig=await(async()=>({lang:tapNonNull(await GM.getValue("FYC_LANG","FYC_EN")),font:tapNonNull(await GM.getValue("FYC_FONT","")),opacity:tapNonNull(await GM.getValue("FYC_OPACITY",1)),color:tapNonNull(await GM.getValue("FYC_COLOR","#FFFFFF")),colorOwner:tapNonNull(await GM.getValue("FYC_COLOR_OWNER","#ffd600")),colorModerator:tapNonNull(await GM.getValue("FYC_COLOR_MODERATOR","#5e84f1")),colorMember:tapNonNull(await GM.getValue("FYC_COLOR_MEMBER","#2ba640")),size:tapNonNull(await GM.getValue("FYC_SIZE",1)),weight:tapNonNull(await GM.getValue("FYC_WEIGHT",730)),weightShadow:tapNonNull(await GM.getValue("FYC_WEIGHT_SHADOW",1)),limit:tapNonNull(await GM.getValue("FYC_LIMIT",25)),speed:tapNonNull(await GM.getValue("FYC_SPEED",18)),maxLength:tapNonNull(await GM.getValue("FYC_MAX",100)),laneNum:tapNonNull(await GM.getValue("FYC_LANE_DIV",12)),ngWords:tapNonNull(await GM.getValue("FYC_NG_WORDS","")).split(/\r\n|\n/).filter((x=>""!==x)),ngRegWords:tapNonNull(await GM.getValue("FYC_NG_REG_WORDS","")).split(/\r\n|\n/).filter((x=>""!==x)),ngUsers:tapNonNull(await GM.getValue("FYC_NG_USERS","")).split(/\r\n|\n/).filter((x=>""!==x)),createChats:tapNonNull(await GM.getValue("FYC_TOGGLE_CREATE_COMMENTS",!0)),displayChats:tapNonNull(await GM.getValue("FYC_DISPLAY_COMMENTS",!0)),createNgButtons:tapNonNull(await GM.getValue("FYC_NG_BUTTON",!0)),simpleChatField:tapNonNull(await GM.getValue("FYC_SIMPLE_CHAT_FIELD",!1)),displayModeratorName:tapNonNull(await GM.getValue("FYC_DISPLAY_MODERATOR_NAME",!0)),displaySettingPanel:!1}))(),chatObserver=(userConfig=>new MutationObserver((mutations=>{mutations.forEach((e=>{const addedChats=Array.from(e.addedNodes).filter((x=>x.children.length>0)) if(!(addedChats.length<=0))for(let i=0;i0?"block":"flex",userConfig.createChats&&(findChatsOutOfScreen(),createChat(chatData,userConfig)),userConfig.createNgButtons&&chatData.authorID&&!chat.querySelector(".owner")&&createNgButton(chat,chatData.authorID,userConfig),setChatFieldSimplifyStyle(chat,userConfig.simpleChatField),deleteOldChats(userConfig))}}))})))(userConfig),reinitialize=(observer=reinitSubject,value=>{observer.next(value)}) var observer let chatField reinitSubject.pipe((0,external_rxjs_operators_namespaceObject.switchMap)((()=>(0,external_rxjs_namespaceObject.interval)(800).pipe((0,external_rxjs_operators_namespaceObject.delay)(1),(0,external_rxjs_operators_namespaceObject.startWith)(0),(0,external_rxjs_operators_namespaceObject.map)(requirementMet),(0,external_rxjs_operators_namespaceObject.filter)((()=>{var _a,_b const chatFieldLost=chatField&&!(null===(_b=null===(_a=livePage_getChatFrame())||void 0===_a?void 0:_a.contentDocument)||void 0===_b?void 0:_b.contains(chatField))&&!document.contains(chatField) return chatFieldLost&&(logFyc("Chat container changed"),chatField=void 0,reinitialize()),!chatFieldLost})),(0,external_rxjs_operators_namespaceObject.startWith)(!1),(0,external_rxjs_operators_namespaceObject.distinctUntilChanged)(),(0,external_rxjs_operators_namespaceObject.tap)((x=>logFyc(x?"Found the chat container and the player":"Waiting to load..."))),(0,external_rxjs_operators_namespaceObject.filter)(Boolean)))),(0,external_rxjs_operators_namespaceObject.tap)((()=>logFyc("Wait for 3000ms..."))),(0,external_rxjs_operators_namespaceObject.delay)(3e3),(0,external_rxjs_operators_namespaceObject.tap)((()=>logFyc("Initializing..."))),(0,external_rxjs_operators_namespaceObject.tap)((()=>{var _a chatObserver.disconnect(),chatField=livePage_getChatField(),chatField?chatObserver.observe(chatField,{childList:!0}):reinitialize(),document.querySelector("#fyc_chat_screen")||(external_log_default().debug("AppendChatScreen"),null===(_a=livePage_getPlayer())||void 0===_a||_a.insertAdjacentHTML("afterbegin",'
')),createToggleChatDisplayButton(userConfig),((reinitializeChat,userConfig)=>{var _a,_b,_c if(document.querySelector(".fyc_settings"))return const htmlEn=`\n
\n
\n\n
\n
\n Language(Refresh after change)\n
\n \n
\n
\n\n
\n Font\n
\n \n Aa1あア亜\n
\n
\n\n
\n Color*\n
\n \n
\n
\n
\n Color(Owner)*\n
\n \n
\n
\n
\n Color(Moderator)*\n
\n \n
\n
\n
\n Color(Member)*\n
\n \n
\n
\n
\n * requires [Reload]\n
\n \n
\n\n
\n
\n Opacity\n
\n \n ${userConfig.opacity}\n
\n
\n
\n Size\n
\n \n ${userConfig.size}\n
\n
\n
\n Weight\n
\n \n ${userConfig.weight}\n
\n
\n
\n Weight(Shadow) *\n
\n \n ${userConfig.weightShadow}\n
\n
\n
\n Speed\n
\n \n ${userConfig.speed}\n
\n
\n
\n Max number of chats *\n
\n \n ${userConfig.limit}\n
\n
\n
\n Max number of characters *\n
\n \n ${userConfig.maxLength}\n
\n
\n
\n Number of Lines *\n
\n \n ${userConfig.laneNum}\n
\n
\n
\n\n
\n
\n Banned Words\n
\n \n
\n
\n
\n Banned Words(Regexp)\n
\n \n
\n
\n
\n Banned Users*\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n \n \n
\n
\n\n
\n
\n\n\n\n`,htmlJa=`\n
\n
\n\n
\n
\n 言語(要ページ再読み込み)\n
\n \n
\n
\n\n
\n フォント\n
\n \n Aa1あア亜\n
\n
\n\n
\n 色(通常)*\n
\n \n
\n
\n
\n 色(オーナー)*\n
\n \n
\n
\n
\n 色(モデレーター)*\n
\n \n
\n
\n
\n 色(メンバー)*\n
\n \n
\n
\n
\n *は要[再読み込み]\n
\n \n
\n\n
\n
\n 透明度\n
\n \n ${userConfig.opacity}\n
\n
\n
\n サイズ\n
\n \n ${userConfig.size}\n
\n
\n
\n 太さ\n
\n \n ${userConfig.weight}\n
\n
\n
\n 太さ(影) *\n
\n \n ${userConfig.weightShadow}\n
\n
\n
\n 速度\n
\n \n ${userConfig.speed}\n
\n
\n
\n 最大表示数 *\n
\n \n ${userConfig.limit}\n
\n
\n
\n 最大文字数 *\n
\n \n ${userConfig.maxLength}\n
\n
\n
\n 行数 *\n
\n \n ${userConfig.laneNum}\n
\n
\n
\n\n
\n
\n NGワード\n
\n \n
\n
\n
\n NGワード(正規表現)\n
\n \n
\n
\n
\n NGユーザー*\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n \n \n
\n\n
\n\n
\n
\n\n\n\n`,html="FYC_JA"===userConfig.lang?htmlJa:htmlEn,menuElement=tapIs(HTMLElement,null===(_a=document.querySelector("#menu-container"))||void 0===_a?void 0:_a.querySelector(".dropdown-trigger.style-scope.ytd-menu-renderer")) external_log_default().debug("AppendSettingPanel"),menuElement.insertAdjacentHTML("beforebegin",html) const settingPanel=tapIs(HTMLElement,document.querySelector("#fyc-setting-panel-block-or-hide")) null===(_b=document.querySelector("#fyc-setting-panel-button"))||void 0===_b||_b.addEventListener("click",(()=>{!1===userConfig.displaySettingPanel?(settingPanel.style.visibility="visible",userConfig.displaySettingPanel=!0):!0===userConfig.displaySettingPanel&&(settingPanel.style.visibility="hidden",userConfig.displaySettingPanel=!1)})),tapIs(HTMLInputElement,document.querySelector("#fyc_check_button_to_ban")).checked=userConfig.createNgButtons,tapIs(HTMLInputElement,document.querySelector("#fyc_check_display_moderator_name")).checked=userConfig.displayModeratorName,tapIs(HTMLInputElement,document.querySelector("#fyc_button_toggle_create_chats")).checked=userConfig.createChats,tapIs(HTMLInputElement,document.querySelector("#fyc_toggle_simple_chat_field")).checked=userConfig.simpleChatField,tapIs(HTMLSelectElement,document.querySelector("#fyc_input_font")).value=userConfig.font,tapIs(HTMLSelectElement,document.querySelector("#fyc_input_lang")).value=userConfig.lang,null===(_c=document.querySelector("#fyc_input_save_button"))||void 0===_c||_c.addEventListener("click",(async()=>{try{let val=tapIs(HTMLInputElement,document.querySelector("#fyc_input_color")).value userConfig.color=val,await GM.setValue("FYC_COLOR",val),val=tapIs(HTMLInputElement,document.querySelector("#fyc_input_color_owner")).value,userConfig.colorOwner=val,await GM.setValue("FYC_COLOR_OWNER",val),val=tapIs(HTMLInputElement,document.querySelector("#fyc_input_color_moderator")).value,userConfig.colorModerator=val,await GM.setValue("FYC_COLOR_MODERATOR",val),val=tapIs(HTMLInputElement,document.querySelector("#fyc_input_color_member")).value,userConfig.colorMember=val,await GM.setValue("FYC_COLOR_MEMBER",val),val=tapIs(HTMLTextAreaElement,document.querySelector("#fyc_ngwords")).value,userConfig.ngWords=val.split(/\r\n|\n/).filter((x=>""!==x)),await GM.setValue("FYC_NG_WORDS",userConfig.ngWords.join("\n")),val=tapIs(HTMLTextAreaElement,document.querySelector("#fyc_ngwords_reg")).value,userConfig.ngRegWords=val.split(/\r\n|\n/).filter((x=>""!==x)),await GM.setValue("FYC_NG_REG_WORDS",userConfig.ngRegWords.join("\n")),val=tapIs(HTMLTextAreaElement,document.querySelector("#fyc_ngusers")).value,userConfig.ngUsers=val.split(/\r\n|\n/).filter((x=>""!==x)),await GM.setValue("FYC_NG_USERS",userConfig.ngUsers.join("\n")) let val2=tapIs(HTMLInputElement,document.querySelector("#fyc_toggle_simple_chat_field")).checked userConfig.simpleChatField=val2,await GM.setValue("FYC_SIMPLE_CHAT_FIELD",val2),val2=tapIs(HTMLInputElement,document.querySelector("#fyc_check_button_to_ban")).checked,userConfig.createNgButtons=val2,await GM.setValue("FYC_NG_BUTTON",val2),val2=tapIs(HTMLInputElement,document.querySelector("#fyc_check_display_moderator_name")).checked,userConfig.displayModeratorName=val2,await GM.setValue("FYC_DISPLAY_MODERATOR_NAME",val2),val2=tapIs(HTMLInputElement,document.querySelector("#fyc_button_toggle_create_chats")).checked,userConfig.createChats=val2,await GM.setValue("FYC_TOGGLE_CREATE_COMMENTS",val2),defaultToast().fire({title:"Saved.",icon:"success"})}catch(e){defaultToast().fire({title:`Error: ${e.message}`,icon:"error"})}})),tapIs(HTMLSelectElement,document.querySelector("#fyc_input_font")).addEventListener("change",(async e=>{const val=tapIs(HTMLSelectElement,e.currentTarget).value tapIs(HTMLSpanElement,document.querySelector("#fyc_font_sample_text")).style.fontFamily=val,userConfig.font=val,await GM.setValue("FYC_FONT",val)})),tapIs(HTMLSelectElement,document.querySelector("#fyc_input_lang")).addEventListener("change",(async e=>{const val=tapIs(HTMLSelectElement,e.currentTarget).value userConfig.lang=val,await GM.setValue("FYC_LANG",val)})),tapIs(HTMLInputElement,document.querySelector("#fyc_range_opacity")).addEventListener("input",(async e=>{const val=parseFloat(tapIs(HTMLInputElement,e.currentTarget).value)/10 tapIs(HTMLOutputElement,document.querySelector("#output_opacity")).value=val.toString(),userConfig.opacity=val,await GM.setValue("FYC_OPACITY",val)})),tapIs(HTMLInputElement,document.querySelector("#fyc_range_size")).addEventListener("input",(async e=>{const val=parseFloat(tapIs(HTMLInputElement,e.currentTarget).value)/10 tapIs(HTMLOutputElement,document.querySelector("#output_size")).value=val.toString(),userConfig.size=val,await GM.setValue("FYC_SIZE",val)})),tapIs(HTMLInputElement,document.querySelector("#fyc_range_weight")).addEventListener("input",(async e=>{const val=10*parseFloat(tapIs(HTMLInputElement,e.currentTarget).value) tapIs(HTMLOutputElement,document.querySelector("#output_weight")).value=val.toString(),userConfig.weight=val,await GM.setValue("FYC_WEIGHT",val)})),tapIs(HTMLInputElement,document.querySelector("#fyc_range_weight_shadow")).addEventListener("input",(async e=>{const val=parseFloat(tapIs(HTMLInputElement,e.currentTarget).value)/10 tapIs(HTMLOutputElement,document.querySelector("#output_weight_shadow")).value=val.toString(),userConfig.weightShadow=val,await GM.setValue("FYC_WEIGHT_SHADOW",val)})),tapIs(HTMLInputElement,document.querySelector("#fyc_range_speed")).addEventListener("input",(async e=>{const val=parseFloat(tapIs(HTMLInputElement,e.currentTarget).value) tapIs(HTMLOutputElement,document.querySelector("#output_speed")).value=val.toString(),userConfig.speed=val,await GM.setValue("FYC_SPEED",val)})),tapIs(HTMLInputElement,document.querySelector("#fyc_range_limit")).addEventListener("input",(async e=>{const val=5*parseFloat(tapIs(HTMLInputElement,e.currentTarget).value) tapIs(HTMLOutputElement,document.querySelector("#output_limit")).value=val.toString(),userConfig.limit=val,await GM.setValue("FYC_LIMIT",val)})),tapIs(HTMLInputElement,document.querySelector("#fyc_range_max")).addEventListener("input",(async e=>{const val=5*parseFloat(tapIs(HTMLInputElement,e.currentTarget).value) tapIs(HTMLOutputElement,document.querySelector("#output_max")).value=val.toString(),userConfig.maxLength=val,await GM.setValue("FYC_MAX",val)})),tapIs(HTMLInputElement,document.querySelector("#fyc_range_line")).addEventListener("input",(async e=>{const val=parseFloat(tapIs(HTMLInputElement,e.currentTarget).value) tapIs(HTMLOutputElement,document.querySelector("#output_line")).value=val.toString(),userConfig.laneNum=val,await GM.setValue("FYC_LANE_DIV",val)})),tapIs(HTMLButtonElement,document.querySelector("#fyc_reload_button")).addEventListener("click",(async()=>{var _a,_b try{external_log_default().debug("RemoveChatScreen"),null===(_a=document.querySelector("#fyc_chat_screen"))||void 0===_a||_a.remove(),external_log_default().debug("RemoveToggleDisplayButton"),null===(_b=document.querySelector(".ytp-button.fyc-chat-button"))||void 0===_b||_b.remove(),await reinitializeChat(),defaultToast().fire({title:"Reloaded.",icon:"success"})}catch(e){defaultToast().fire({title:`Error: ${e.message}`,icon:"error"})}}))})((()=>reinitialize()),userConfig)})),(0,external_rxjs_operators_namespaceObject.switchMap)((()=>createScriptCss(userConfig))),(0,external_rxjs_operators_namespaceObject.switchMap)((()=>(0,external_rxjs_namespaceObject.merge)((()=>{const video=livePage_getMainVideo() return video?(0,external_rxjs_namespaceObject.merge)((0,external_rxjs_namespaceObject.fromEvent)(video,"playing"),(0,external_rxjs_namespaceObject.fromEvent)(video,"pause")).pipe((0,external_rxjs_operators_namespaceObject.map)((()=>!video.paused))):(0,external_rxjs_namespaceObject.of)(!0)})().pipe((0,external_rxjs_operators_namespaceObject.tap)(changeChatAnimState)),(0,external_rxjs_namespaceObject.interval)(1e3).pipe((0,external_rxjs_operators_namespaceObject.map)(livePage_getPlayer),(0,external_rxjs_operators_namespaceObject.filter)(Boolean),(0,external_rxjs_operators_namespaceObject.map)((x=>[x.clientWidth,x.clientHeight])),(0,external_rxjs_operators_namespaceObject.distinctUntilChanged)(((x,y)=>x[0]===y[0]&&x[1]===y[1]))).pipe((0,external_rxjs_operators_namespaceObject.skip)(1),(0,external_rxjs_operators_namespaceObject.tap)((x=>logFyc(`Resize detected: ${x}`))),(0,external_rxjs_operators_namespaceObject.tap)((()=>getFlowingChats().forEach((x=>{external_log_default().debug("RemoveAllChat"),x.remove()})))),(0,external_rxjs_operators_namespaceObject.tap)((()=>reinitialize()))))))).subscribe() let storedHref=window.location.href new MutationObserver((async()=>{storedHref!==window.location.href&&(storedHref=window.location.href,logFyc("URL Changed",storedHref,window.location.href),await reinitialize())})).observe(document,{childList:!0,subtree:!0}),await reinitialize()};(async()=>{external_log_namespaceObject.setLevel("info") try{await initialize()}catch(error){external_log_namespaceObject.error(error)}})()})()})()