· 5 years ago · May 29, 2020, 01:44 PM
1// ==UserScript==
2// @name ChatBot
3// @namespace http://tampermonkey.net/
4// @version 0.1
5// @description ChatBot!
6// @author BadNintendo
7// @grant none
8// @icon https://tinychat.com/webrtc/2.0.0-81/images/favicon.png
9// @match https://tinychat.com/room/*
10// @match https://tinychat.com/*
11// @exclude https://tinychat.com/settings/*
12// @exclude https://tinychat.com/subscription/*
13// @exclude https://tinychat.com/promote/*
14// @exclude https://tinychat.com/coins/*
15// @exclude https://tinychat.com/gifts*
16// @run-at document-start
17// ==/UserScript==
18(function() {
19 "use strict";
20 //DEBUGGER
21 window.DebugClear = true; // TRUE = CLEARS || FALSE = SHOWS
22 window.CTSVersion = {Major: 1, Minor: 6, Patch: 65};
23 var MainElement, ChatLogElement, VideoListElement, SideMenuElement, TitleElement, UserListElement,ModerationListElement, ChatListElement, UserContextElement, MicrophoneElement,
24 FeaturedCSS, VideoCSS, SideMenuCSS, MainCSS, RoomCSS, TitleCSS, ContextMenuCSS,ModeratorCSS, UserListCSS, ChatListCSS, NotificationCSS, ChatboxCSS;
25 //CTS MAIN VARIABLES
26 var CTS = {
27 Project: {Name: "CTS",Storage: "CTS_", isTouchScreen: false},
28 Chuck: {XHR: new XMLHttpRequest()}, Urb: {XHR: new XMLHttpRequest()}, Dad: {XHR: new XMLHttpRequest()}, Advice: {XHR: new XMLHttpRequest()},
29 //API_KEY FOR YOUTUBE CAN BE INSERTED BELOW (NO WHERE ELSE)
30 //TC KEY AIzaSyAf1XXorjOLdjS2j5PGi3SLCGl7LhyxQXs
31 YouTube: {API_KEY: "AIzaSyAf1XXorjOLdjS2j5PGi3SLCGl7LhyxQXs",XHR: new XMLHttpRequest(),Playing: false,MessageQueueList: [],NotPlayable: ["Private video", "Deleted video"],VideoID: undefined,Busy: false,DataReady: false,Clear: false,VideoReturn: false,SearchReturn: false,ListBuilt: true,PlayListCount: undefined,ShowQueue: false,CurrentTrack: {ID: undefined,duration: undefined,title: undefined,thumbnail: undefined}},
32 Me: [], Room: [],
33 ScriptInit: false,
34 MainBackground: undefined,
35 OGStyle: {HeightCounter: 3,WidthCounter: 1,SavedHeight: undefined,SavedWidth: undefined},NormalStyle: {ChatHide: false},FontSize: 20,ChatStyleCounter: 0,ChatHeight: 30,ChatWidth: 0,ChatDisplay: true,UserListDisplay: true,ChatStyles: undefined,MainBackgroundCounter: 0,
36 ChatLimit: 650,NotificationLimit: 100,
37 ChatScroll: true,NotificationScroll: true,NoGreet: false,Featured: true,Bot: true,AutoKick: false,AutoBan: false,GreetMode: false,PerformanceMode: false,CanTTS: false,VoteSystem: false,Popups: true,Avatar: true,Reminder: true,CanSeeGames: true,CanHostGames: false,imgur: true,Notification: true,UserYT: true,ThemeChange: true,TimeStampToggle: true,AutoMicrophone: false,GreenRoomToggle: true,PublicCommandToggle: true,
38 Game: {NoReset: false,Fish: {HighScore: ["CosmosisT", 13337],StartTimeout: undefined,RestockTimeout: undefined,ReCastTimeout: undefined,NotEnoughTimeout: undefined,Round: 0,Player: [],TypesOfFish: [["frog", 1, true],["sunfish", 2, true],["goldfish", 3, true],["fish swollowed hook", 4, false],["family of sardine", 5, true],["catfish", 6, true],["spotted bass", 7, true],["largemouth bass", 8, true],["family of shrimp", 9, true],["it pays to not drink,\ncrazy night however!", 10, false],["cisco", 11, true],["seaweed, still edible", 12, true],["snagged a tire and lost rod", 13, false],["snagged a tire and lost hook", 14, false],["lost their rod to a shark", 15, false],["rainbow trout", 16, true],["It's your turn for dinner", 80, false],["parrot fish", 17, true],["snagged a plastic bag,\n their hook is gone", 18, false],["walleye", 19, true],["Round Whitefish", 20, true],["family of clams", 21, true],["family of oyster", 22, true],["Round blackfish", 23, true],["dolphin", 24, true],["seagull,\n not a fish but will do", 25, true],["pufferfish", 26, true],["fined for smuggling\nmore than fish", 27, false],["lobster", 28, true],["tuna", 29, true],["electric eel", 30, true],["Eel electricuted you,\nrod is toast", 31, false],["swordfish", 32, true],["had bills at home to pay", 33, false],["slipped and lost equipment", 34, false],["bike, still good too", 35, true],["great white", 36, true],["octopus", 37, true],["serpeant", 38, true],["sea turtle", 39, true],["cleaned garbage from the lake", 40, true],["fined for capturing,\n a female whale", 41, false],["male whale", 42, true],["barracuda", 43, true],["pike", 44, true],["lochiness monster", 45, true],["anglerfish", 46, true],["small treasure chest", 47, true],["golden tuna", 48, true],["family of beautiful rims", 49, true],["red snapper", 50, true],["jaws", 51, true],["mermaid", 52, true],["holy grail,\nhow'd that get there?", 75, true],["secret formula", 100, true]]}},
39 TTS: {synth: undefined,voices: undefined},
40 hasGreetedWC: false,
41 Host: 0,HostAttempt: 0,HostWaiting: false,
42 WaitToVoteList: [],UserList: [],MentionList: [],TempIgnoreList: [],IgnoreList: [],BanList: [],KickList: [],BotOPList: [],BotModList: [],TTSList: [],BanKeywordList: [],KickKeywordList: [],HighlightList: [],GreetList: [],ReminderList: [],ReminderServerInList: [],Favorited: [],SafeList: [],GreenRoomIgnoreList: [],GreenRoomList: [],WatchList: [],KBQueue: [],
43 MessageCallback: [],Message: [[]],LastMessage: new Date(),ShowedSettings: false,SendQueue: [],MissedMsg: 0, ActiveMessage: 0,
44 Camera: {List: [],Sweep: false,SweepTimer: 5,clearRandom: undefined},
45 NotificationTimeOut: [],
46 };
47 //API_KEY SAVE (PLEASE ENTER YOUR KEY ABOVE NOT HERE)
48 if (CTS.YouTube.API_KEY !== "") Save("YouTubeAPI", CTS.YouTube.API_KEY);
49 //CTS SETTINGS
50 CTS.Game.Fish.HighScore = JSON.parse(Load("FishHighScore", JSON.stringify(["CosmosisT", 13337])));
51 CTS.PublicCommandToggle = JSON.parse(Load("PublicCommandToggle", JSON.stringify(true)));
52 CTS.CameraBorderToggle = JSON.parse(Load("CameraBorderToggle", JSON.stringify(true)));
53 CTS.OGStyle.SavedHeight = JSON.parse(Load("OGStyleHeight", "3"));
54 CTS.GreenRoomIgnoreList = JSON.parse(Load("GreenRoomIgnoreList", JSON.stringify([])));
55 CTS.OGStyle.SavedWidth = JSON.parse(Load("OGStyleWidth", "1"));
56 CTS.NotificationToggle = JSON.parse(Load("NotificationToggle", "0"));
57 CTS.ChatStyleCounter = JSON.parse(Load("ChatStyle", "0"));
58 CTS.KickKeywordList = JSON.parse(Load("KickKeywordList", JSON.stringify([])));
59 CTS.TimeStampToggle = JSON.parse(Load("TimeStampToggle", JSON.stringify(true)));
60 //API_KEY SAVE (PLEASE ENTER YOUR KEY ABOVE NOT HERE)
61 CTS.YouTube.API_KEY = Load("YouTubeAPI", "");
62 CTS.GreenRoomToggle = JSON.parse(Load("GreenRoomToggle", JSON.stringify(true)));
63 CTS.BanKeywordList = JSON.parse(Load("BanKeywordList", JSON.stringify([])));
64 CTS.GreenRoomList = JSON.parse(Load("GreenRoomList", JSON.stringify([])));
65 CTS.MainBackground = Load("MainBackground", "url(https://i.imgur.com/RC3bKe7.jpg) rgb(0, 0, 0) no-repeat");
66 CTS.HighlightList = JSON.parse(Load("HighlightList", JSON.stringify([])));
67 CTS.CanHostGames = JSON.parse(Load("CanHostGames", JSON.stringify(false)));
68 CTS.ReminderList = JSON.parse(Load("ReminderList", JSON.stringify([])));
69 CTS.MentionList = JSON.parse(Load("MentionList", JSON.stringify([])));
70 CTS.CanSeeGames = JSON.parse(Load("CanSeeGames", JSON.stringify(true)));
71 CTS.ThemeChange = JSON.parse(Load("ThemeChange", JSON.stringify(true)));
72 CTS.BotModList = JSON.parse(Load("BotModList", JSON.stringify([])));
73 CTS.IgnoreList = JSON.parse(Load("IgnoreList", JSON.stringify([])));
74 CTS.Favorited = JSON.parse(Load("Favorited", JSON.stringify([["stonercircle", "https://avatars.tinychat.com/da/838b96/5f/medium/phpKXAdEn.jpeg"], null, null, null, null])));
75 CTS.GreetList = JSON.parse(Load("GreetList", JSON.stringify([])));
76 CTS.BotOPList = JSON.parse(Load("BotOPList", JSON.stringify(["-ALL"])));
77 CTS.GreetMode = JSON.parse(Load("GreetMode", JSON.stringify(false)));
78 CTS.FontSize = JSON.parse(Load("FontSize", 20));
79 CTS.SafeList = JSON.parse(Load("AKB", JSON.stringify([])));
80 CTS.Featured = JSON.parse(Load("Featured", JSON.stringify(false)));
81 CTS.KickList = JSON.parse(Load("KickList", JSON.stringify([])));
82 CTS.Reminder = JSON.parse(Load("Reminder", JSON.stringify(true)));
83 CTS.TTSList = JSON.parse(Load("TTSList", JSON.stringify([])));
84 CTS.BanList = JSON.parse(Load("BanList", JSON.stringify([])));
85 CTS.UserYT = JSON.parse(Load("UserYT", JSON.stringify(true)));
86 CTS.Popups = JSON.parse(Load("Popups", JSON.stringify(true)));
87 CTS.Avatar = JSON.parse(Load("Avatar", JSON.stringify(true)));
88 CTS.imgur = JSON.parse(Load("imgur", JSON.stringify(true)));
89 CTS.Bot = JSON.parse(Load("Bot", JSON.stringify(true)));
90 //IS USER TOUCHSCREEN
91 CheckUserTouchScreen();
92
93 if (CTS.ThemeChange) {
94 FeaturedCSS = "#videos.column>.videos-items{background:#0000003b;height:20%}#videos.column>.videos-items+.videos-items{background:none;height:80%}#videos.row>.videos-items{background:#0000003b;width:20%}#videos.row>.videos-items+.videos-items{background:none;width:80%}#videos.row.featured-2>.videos-items{width:20%}#videos.row.featured-2>.videos-items+.videos-items{width:80%}#videos.column.featured-2>.videos-items{height:20%}#videos.column.featured-2>.videos-items+.videos-items{height:80%}#videos.row.featured-3>.videos-items{width:20%}#videos.row.featured-3>.videos-items+.videos-items{width:80%}#videos.column.featured-3>.videos-items{height:20%}#videos.column.featured-3>.videos-items+.videos-items{height:80%}";
95 ChatListCSS = "#chatlist{background:#00000075;}.list-item>span>img{top:6px;}.list-item>span.active>span{transition:none;box-shadow:none;background:transparent;visibility:hidden;}.list-item>span>span{top:-4px;background:transparent;box-shadow:none;}.list-item>span>span[data-messages]:before{background:#53b6ef;}.list-item>span[data-status=\"gold\"]:before,.list-item>span[data-status=\"extreme\"]:before,.list-item>span[data-status=\"pro\"]:before{top:5px;}#chatlist>#header>.list-item>span.active{background:#53b6ef;}#chatlist>#header{height:60px;top:30px}#chatlist>div>span{font-weight: 600;border-radius:unset;color:#FFFFFF;height:22px;line-height:22px;}#chatlist>div{height:22px;line-height:22px;}";
96 ChatboxCSS = "#chat-download:hover{cursor: pointer;-webkit-box-shadow: inset 0 0 20px #53b6ef;box-shadow: inset 0 0 20px 0 #53b6ef;}#chat-download{position: absolute;right: 0;height: 22px;width: 22px;background: url(\"https://i.imgur.com/Bb3fr6Q.png\") center;background-size: 22px;}#chatlog-button{display:none!important;}@media screen and (max-width: 1200px){#chat-hide{top: -46px!important;left: -1px!important;width: 100%!important;border-radius: 0!important;}}#chat-hide{top: calc(50% - 18px);position: absolute;display: block;height: 16px;width: 16px;left: -8px;margin-top: -20px;border-radius: 16px;font-size: 0;background:url(https://i.imgur.com/jFSLyDD.png) #000000 center no-repeat;background-size:16px;cursor: pointer;z-index: 1;-webkit-box-shadow: 0 0 6px #53b6ef;box-shadow: 0 0 6px #53b6ef;}#chat-instant.show{background:linear-gradient(0deg,rgb(0, 19, 29)0%,rgba(0, 0, 0, 0.85)50%,rgb(25, 29, 32)100%)!important;}#chat-wider:before{transition:.3s;margin: -4px 0 0 -4px;border-width: 6px 6px 6px 0;border-color: transparent #ffffff!important;}#chat-wider{-webkit-box-shadow: 0 0 6px #53b6ef;box-shadow: 0 0 6px #53b6ef;z-index: 2;background:#000000!important}#chat-wrapper{transition:none;}#fav-opt{display: inline-block;cursor: pointer;padding: 12px;background: #10131494;}#input-user:checked ~ #user-menu{display:inline-block;}#user-menu > a:hover #user-menu > span > a:hover{color: #FFFFFF}#user-menu > a, #user-menu > span > a {font-weight: 600;position: relative;display: inline-block;width:calc(100% - 30px);padding: 6px;box-sizing: border-box;font-size: 18px;color: #53b6ef;cursor: pointer;transition: .2s;}#user-menu {position: absolute;display: none;bottom: 50px;right: 0;border: 1px solid rgba(0, 0, 0, .06);box-sizing: border-box;border-radius: 3px;color: #FFFFFF;background: #101314;line-height: 1;box-shadow: 0 1px 4px 0 rgba(0, 0, 0, .09);z-index: 1;}#user-menu > span {display: inline-block;width: 100%;padding: 12px;box-sizing: border-box;font-size: 16px;font-weight: 500;white-space: nowrap;text-overflow: ellipsis;cursor: default;overflow: hidden;}#label-user > img {position: absolute;height: 100%;left: -8px;vertical-align: top;}#label-user{position: relative;display: inline-block;height: 48px;width: 48px;border-radius: 100%;overflow: hidden;cursor: pointer;}#header-user{text-shadow:-1px 0 black,0 1px black,1px 0 black,0 -1px black;position: absolute;top: 10px;right: 0;}#chat-wrapper.full-screen #chat-instant, #chatf-wrapper.full-screen #chat-instant>.avatar>.status-icon,#chat-wrapper.full-screen #chat-content>.message>.avatar>.status-icon {background:unset;}.cts-message-unread{display:block;border-radius:6px;padding:1px 6px 1px 6px;background:#53b6ef;text-shadow:-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;color:#FFF;font:bold 16px sans-serif;cursor:pointer}.ctstime{position:absolute;right:3px;top:3px;background: #101314;border: 1px solid black;border-radius: 6px;padding: 1px 6px;}#chat-instant>.avatar>div>img,#cts-chat-content>.message>.avatar>div>img{position:relative;height:100%;left:-7px}.message>#system_user{background:linear-gradient(0deg,rgb(0, 19, 29)0%,rgba(0, 0, 0, 0.85)50%,rgba(0, 0, 0, 0.72)100%);border: 1px solid black;border-radius: 6px;padding: 1px 6px 1px 6px;word-wrap: break-word;font-weight: 600;font-size: 16px;color: #FFF;text-decoration: none;overflow: hidden;text-overflow: ellipsis;}.message{color:#FFF;text-shadow:-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;font-family:sans-serif;font-weight:300;font-size:20px;white-space:pre-line;word-wrap:break-word}.message a, .message a:visited, .message a:hover, .message a:active{position:relative;transition:0.5s color ease;text-decoration:none;color:#53b6ef}.message a:hover{text-decoration:underline;}#chat{will-change: transform;min-height:unset;}#cts-chat-content{display:flex;flex-direction:column;justify-content:flex-end;min-height:100%}#cts-chat-content>.message{padding:3px 3px;background:#101314a8;position:relative;left:0;margin-bottom:3px;border-radius:6px}#cts-chat-content>.message.highlight,.message.common.highlight{background:#e24c05;-webkit-box-shadow: inset 0 0 20px #000000;box-shadow: inset 0 0 20px 0 #000000;}#cts-chat-content>.message.common{min-height: 50px;padding:3px 3px 3px 50px;box-sizing:border-box;text-align:left}#chat-instant>.avatar,#cts-chat-content>.message>.avatar{position:absolute;height:40px;width:40px;top:3px;left:3px;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);pointer-events:none;}#chat-instant>.avatar>div,#cts-chat-content>.message>.avatar>div{position:absolute;height:100%;width:100%;top:0;left:0;border-radius:100%;overflow:hidden}#notification-content .nickname{border-radius:6px;padding:1px 6px 1px 6px}.notification{padding:1px 0 1px 0;text-shadow:-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black}.time{position:absolute;right:5px}.notifbtn:hover{background:linear-gradient(0deg,rgb(0, 135, 186)0%,rgba(0, 49, 64, 0.94)75%,rgba(0, 172, 255, 0.6)100%);}.notifbtn{cursor: pointer;border-radius: 0 0 12px 12px;outline: none;background:linear-gradient(0deg,rgba(0, 0, 0, 0)0%,rgba(37, 37, 37, 0.32)75%,rgba(255, 255, 255, 0.6)100%);border: none;color: white;width: 100%;}#notification-content.large{height:50%;}#notification-content{will-change: transform;top:0;position:relative;scrollbar-width:none;background:#101314;text-shadow:-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;height:20%;min-height:38px;font:bold 16px sans-serif;color:#FFF;overflow-y:scroll;overflow-wrap:break-word;padding:0 6px 0 6px}#notification-content::-webkit-scrollbar{width:0;background:transparent}#cts-chat-content{display:flex;flex-direction:column;justify-content:flex-end;min-height:100%}#chat-instant>.avatar>.status-icon,#cts-chat-content>.message>.avatar>.status-icon{left:0!important}#chat-instant>.nickname{color:#53b6ef;text-shadow:-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;font-size: 20px;font-weight: 800;} nm#chat-instant::after{background:none;}.on-white-scroll{scrollbar-width: none;overflow-wrap: break-word;}.on-white-scroll::-webkit-scrollbar{width:0;background:transparent}#cts-chat-content>.message>.nickname{border:1px solid black;border-radius:6px;padding:1px 6px 1px 6px;word-wrap:break-word;max-width:calc(100% - 115px);font-weight:600;font-size:16px;color:#FFF;display:inline-block;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#input{padding-top:0}:host,#input>.waiting{background:#20262870}#input:before,#input:after{content:unset}#input>textarea::placeholder{color:#FFF}#input>textarea::-webkit-input-placeholder{color:#fff}#input>textarea:-moz-placeholder{color:#fff}#input>textarea{width: calc(100% - 57px);line-height:unset;min-height:65px;max-height:65px;border-radius:6px;scrollbar-width:none;background:#101314;text-shadow:-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;color:#FFF;font-size:" + (CTS.FontSize - 4) + "px;font-family:sans-serif;font-weight:300;}#chat-position{top:22px;left:6px;right:6px;bottom:5px;}.on-white-scroll::webkit-scrollbar{width:0;background:transparent;}";
97 MainCSS = "#mobile-app.show{display:none;}html{background:rgba(0,0,0,1);}#menu-icon{display:none;}body{background:" + CTS.MainBackground + ";background-position: center!important;background-size:cover!important;overflow:hidden;}#nav-static-wrapper {display:none;}#content{padding:0!important;}";
98 VideoCSS = "#videolist[data-mode=\"dark\"]{background-color:unset;}@media screen and (max-width: 1200px){#videos-footer{right: unset!important;bottom: -22px!important;top: unset!important;}}#videos-footer-broadcast-wrapper{margin-top:16px;}#youtube.video > div > .overlay, .video > div > .overlay{display:block!important}.tcsettings{display:none}#videos-header{background:#101314;}#videos-footer-broadcast-wrapper.active>#videos-footer-broadcast,#videos-footer-broadcast-wrapper.active>#videos-footer-submenu-button,#videos-footer-broadcast-wrapper.active>#videos-footer-submenu-button:focus{background-color:#2d373a!important;}.js-video.broken{display:none;}.videos-header-volume {border-color:#202627;}.tcsettings:hover{background:#008cda;}.tcsettings{cursor: pointer;outline: none;background:#101314;border: none;color: white;}.music-radio-info>.description{cursor:default;overflow-wrap: break-word;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}.music-radio-info>.volume{bottom: 0;position: absolute;background: #2a6a89;height: 6px;width: 100%;line-height: 24px;overflow-wrap: break-word;white-space: nowrap;overflow: hidden;text-overflow: ellipsis}.music-radio-info{top: -50px;position: absolute;background: #071c19f0;height: 50px;width: 336px;line-height: 24px;}.ctsdrop{position:fixed;display:inline-block;top:3px;left:4px;z-index:5;min-width: 46px;}.ctsdrop-content{position:absolute;top:28px;right:0;background:#101314;min-width:46px;width: 46px;padding:0;z-index:1;display:none;}.ctsdrop:hover .ctsdrop-content{display:block;}.ctsoptions:hover{background:#53b6ef}.ctsoptions{width:46px;height:28px;z-index: 2;cursor: pointer;top: 4px;background: #10131475;border: none;padding: 5% 0;display: inline-block;}#youtube{padding: unset}#grab{left: 0;background:#2d373a;border-radius: 12px;visibility: hidden;top: -36px;position: absolute;display: flex}#videos-footer #music-radio .music-radio-playpause{position:absolute;top:0;left:30px;height:100%;width:60px;}#videos-footer #music-radio .music-radio-vol{position: absolute;right: 0;top: 0;}#videos-footer #music-radio button{line-height: 14px;background: #101314;border: none;font-size: 18px;color: white;height: 50%;display: block;width: 30px;}#videos-footer #videos-footer-youtube{left: 120px;border-radius: 0;display:none;}#videos-footer #videos-footer-soundcloud{display:none;border-radius: 0;left: 240px}#videos-footer #videos-footer-youtube,#videos-footer #videos-footer-soundcloud,#videos-footer #music-radio{transition: .2s;line-height: 33px;bottom: -64px;visibility: hidden;height: 36px;margin: unset;width: 120px;position: absolute;z-index: 1;}#videos-footer-push-to-talk{border-radius: unset}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{border-radius: unset;}#videos-footer-broadcast-wrapper.moderation>#videos-footer-broadcast{padding: unset}#videos-footer #music-radio button:hover{background: #53b6ef;cursor: pointer;}#videos-footer #music-radio{left: 0;border-radius: 12px;background: #101314;}#videos-footer:hover #videos-footer-youtube,#videos-footer:hover #videos-footer-soundcloud,#videos-footer:hover #music-radio{visibility: visible}#videos-footer:hover{background:linear-gradient(0deg,rgba(255, 255, 255, 0)0%,rgba(24, 60, 62, 0.29)50%,rgb(83, 182, 239)100%);}#videos-footer{background: linear-gradient(0deg,rgba(255, 255, 255, 0)0%,rgba(24, 60, 62, 0.29)50%,rgba(200, 200, 200, 0.26)100%);cursor:pointer;top:0;display:block;padding: 2px 0 0 11px;text-shadow: -1px 0 black,0 1px black,1px 0 black,0 -1px black;font: 800 14px sans-serif;color: #FFFFFF;left: unset;right: -70px;height: 22px;min-height: 22px;z-index: 2;width: 70px;position: absolute}#videos-footer-broadcast{border-radius:unset;z-index: 1;padding: unset!important;white-space: pre}span[title=\"Settings\"]>svg{padding:4px;height:24px;width:24px}#seek-duration{pointer-events: none;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;font: 600 20px sans-serif}#videos{bottom: 0;left: 0;right: 0;top: 0}:host,#videolist{background:unset!important;}.video:after{content: unset;border:unset;}#videos-header-mic>svg{padding: 2px 10px;}#videos-header>span{display:block;}#videos-header-sound>svg{padding: 4px}#videos-header-fullscreen > svg {padding: 7px 8px;}";
99 RoomCSS = "tc-title{display:flex!important;}#room-content{padding-top:0!important;background:unset!important;}";
100 TitleCSS = "#room-header-avatar{display:none}#room-header-gifts{display:none}#room-header-info-text{display:none}#room-header-info-details{display:none}#room-header-mobile-button{display:none}#room-header{display:none;}";
101 SideMenuCSS = "#sidemenu{left:0;}@media screen and (max-width: 1000px){#sidemenu{left:-270px;}}#sidemenu.full-screen{left:-270px;}#user-info{display:none;}#top-buttons-wrapper{display:none;}#sidemenu-content{scrollbar-width:none;padding-top:unset;}#sidemenu-wider:before{margin: -4px 0 0 -4px;border-width: 6px 6px 6px 0;border-color: transparent #ffffff;}#sidemenu-wider{-webkit-box-shadow: 0 0 6px #53b6ef;box-shadow: 0 0 6px #53b6ef;z-index: 2;display:block;background-color: #000000;}#sidemenu-content::-webkit-scrollbar{display: none;}#sidemenu.wider {left: -270px;}";
102 NotificationCSS = "#videos-header > span {background-color: unset!important;line-height: unset;}.PMTime{display:inline-block;padding:0 6px 0 0;margin:0 8px 0 0;border-right:4px groove #797979;}.PMName{display:inline-block;}#popup div{word-break:break-word;user-select: text;-webkit-user-select: text;-moz-user-select: text;color:#FFFFFF;text-shadow:-1px 0 black,0 1px black,1px 0 black,0 -1px black;font-weight: 300;font-size: 18px;font-family: sans-serif;z-index:1;}.PMOverlay{height: calc(100% - 92px);overflow: hidden;pointer-events:none;position:absolute;padding-top:12px;top:0;bottom:0;left:0;right:0;visibility:visible;}.PMPopup{pointer-events:all;margin:5px auto;width:50%;position:relative;color: #FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}.PMPopup a, .PMPopup a:visited, .PMPopup a:hover, .PMPopup a:active{position:relative;transition:0.5s color ease;text-decoration:none;color:#53b6ef}.PMPopup a:hover{color:#FFFFFF;text-decoration:underline;}.PMPopup h2{border-radius:5px 5px 0 0;background:linear-gradient(0deg,rgb(24, 29, 30) 0%,rgb(24, 29, 30) 52%,rgb(60, 117, 148) 100%);margin:0;padding:5px;font-size:16px;}.PMPopup .PMContent {border-radius: 0 0 5px 5px;padding:5px;max-height:30%;overflow:hidden;word-break:break-all;background:#202628;}";
103 UserListCSS = ".list-item>span>span{padding: 0 8px;top:-2px}.list-item > span:hover > span{background-color:unset;box-shadow:unset;}#userlist{background: #00000075;}.js-user-list-item{background: linear-gradient(0deg,rgb(0, 0, 0) 2px,rgba(0, 0, 0, 0.25) 2px,rgba(0, 0, 0, 0.59) 32%);}.list-item>span>span[data-cam=\"1\"]:after{height:15px;width:15px;background-image:url(https://i.imgur.com/QKSbq8d.png);}.list-item>span>span[data-moderator=\"1\"]:before{margin-right:3px;width:15px;height:15px;background-image:url(https://i.imgur.com/CEA9aro.png);}.list-item>span>span{background:transparent;box-shadow:none;}.list-item>span>span>.send-gift{top:5px;}.list-item>span>img{top:6px;}#button-banlist{border-radius:unset;top:-1px;right:10px;}.list-item>span[data-status=\"gold\"]:before,.list-item>span[data-status=\"extreme\"]:before,.list-item>span[data-status=\"pro\"]:before{top:5px;}#userlist>div{height:22px;}#userlist>div>span{font-weight: 600;color:#FFFFFF;height:22px;line-height:22px;}#userlist>#header{height:40px;top:10px;}";
104 ModeratorCSS = ".video{min-width: 114px;max-width: 114px;}#moderatorlist:after{right:5px;color:#FFFFFF;background:#53b6ef;}#moderatorlist>#header>span>button>svg path{fill:#FFFFFF;}#moderatorlist>#header>span>button{top:-2px;background: #20262870;}#moderatorlist.show>#header>span>button>svg path{fill:#FFFFFF;}#moderatorlist{max-height:60px;background: #00000075;}#moderatorlist>#header{height:60px;font-size:16px;font-weight:600;font-family:sans-serif;color:#FFFFFF;text-shadow:-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}#moderatorlist.show[data-videos-count=\"1\"], #moderatorlist.show[data-videos-count=\"2\"] {max-height:205px;}#moderatorlist.show[data-videos-count=\"3\"], #moderatorlist.show[data-videos-count=\"4\"] {max-height:290px;}#moderatorlist.show[data-videos-count=\"5\"], #moderatorlist.show[data-videos-count=\"6\"] {max-height:400px;}#moderatorlist.show[data-videos-count=\"7\"], #moderatorlist.show[data-videos-count=\"8\"] {max-height:460px;}#moderatorlist.show[data-videos-count=\"9\"], #moderatorlist.show[data-videos-count=\"10\"] {max-height:545px;}#moderatorlist.show[data-videos-count=\"11\"], #moderatorlist.show[data-videos-count=\"12\"] {max-height:630px;}";
105 } else {
106 //OG CTS
107 FeaturedCSS = "#videos.column>.videos-items{background:#0000003b;height:20%}#videos.column>.videos-items+.videos-items{background:none;height:80%}#videos.row>.videos-items{background:#0000003b;width:20%}#videos.row>.videos-items+.videos-items{background:none;width:80%}#videos.row.featured-2>.videos-items{width:20%}#videos.row.featured-2>.videos-items+.videos-items{width:80%}#videos.column.featured-2>.videos-items{height:20%}#videos.column.featured-2>.videos-items+.videos-items{height:80%}#videos.row.featured-3>.videos-items{width:20%}#videos.row.featured-3>.videos-items+.videos-items{width:80%}#videos.column.featured-3>.videos-items{height:20%}#videos.column.featured-3>.videos-items+.videos-items{height:80%}";
108 VideoCSS = "#videolist[data-mode=\"dark\"]{background-color:unset;}#youtube.video > div > .overlay, .video > div > .overlay{display:block!important}.js-video.broken{display:none;}#videos-footer-broadcast-wrapper.show-ptt > #videos-footer-submenu{right:0;}#videos-footer-submenu{width: calc(100% - 14px);right:0;bottom:-2px;}.videos-header-volume {border-color:#202627;}.tcsettings:hover{background:#008cda;}.tcsettings{cursor: pointer;outline: none;background:#101314;border: none;color: white;}.music-radio-info>.description{cursor:default;overflow-wrap: break-word;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}.music-radio-info>.volume{bottom: 0;position: absolute;background: #2a6a89;height: 6px;width: 100%;line-height: 24px;overflow-wrap: break-word;white-space: nowrap;overflow: hidden;text-overflow: ellipsis}.music-radio-info{top: -50px;position: absolute;background: #071c19f0;height: 50px;width: 336px;line-height: 24px;}.ctsdrop{position:fixed;display:inline-block;top:3px;right:4px;z-index:5;min-width: 46px;}.ctsdrop-content{position:absolute;top:28px;right:0;background:#101314;min-width:46px;width: 46px;padding:0;z-index:1;display:none;}.ctsdrop:hover .ctsdrop-content{display:block;}.ctsoptions:hover{background:#53b6ef}.ctsoptions{width:46px;height:28px;z-index: 2;cursor: pointer;top: 4px;background: #101314;border: none;padding: 5% 0;display: inline-block;}#youtube{padding: unset}#grab{left: 0;background:#2d373a;border-radius: 12px;visibility: hidden;top: -36px;position: absolute;display: flex}#videos-footer-broadcast-wrapper>.video{position: fixed;display: none;width: 5%;top: 0;left: 0}#videos-footer-broadcast-wrapper.active>#videos-footer-submenu-button:hover{background: #1f2223!important}#videos-footer-broadcast-wrapper.active>#videos-footer-submenu-button{background: #2d373a!important}#videos-footer #music-radio .music-radio-playpause{position:absolute;top:0;left:30px;height:100%;width:60px;}#videos-footer #music-radio .music-radio-vol{position: absolute;right: 0;top: 0;}#videos-footer #music-radio button{line-height: 14px;background: #101314;border: none;font-size: 18px;color: white;height: 50%;display: block;width: 30px;}#videos-footer #videos-footer-youtube{left: 120px;border-radius: 0;display:none;}#videos-footer #videos-footer-soundcloud{display:none;border-radius: 0;left: 240px}#videos-footer #videos-footer-youtube,#videos-footer #videos-footer-soundcloud,#videos-footer #music-radio{transition: .2s;line-height: 33px;bottom: 21px;visibility: hidden;height: 36px;margin: unset;width: 120px;position: absolute;z-index: 1;}#videos-footer-push-to-talk{border-radius: unset}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{border-radius: unset;}#videos-footer-broadcast-wrapper.moderation>#videos-footer-broadcast{padding: unset}#videos-footer #music-radio button:hover{background: #53b6ef;cursor: pointer;}#videos-footer #music-radio{left: 0;border-radius: 12px;background: #101314;}#videos-footer:hover #videos-footer-youtube,#videos-footer:hover #videos-footer-soundcloud,#videos-footer:hover #music-radio{visibility: visible}#videos-footer:hover{background:linear-gradient(0deg,rgba(255, 255, 255, 0)0%,rgba(24, 60, 62, 0.29)50%,rgb(83, 182, 239)100%);}#videos-footer{background: linear-gradient(0deg,rgba(255, 255, 255, 0)0%,rgba(24, 60, 62, 0.29)50%,rgba(200, 200, 200, 0.26)100%);cursor:pointer;top: calc(30% + 119px);display:block;padding: 2px 0 0 11px;text-shadow: -1px 0 black,0 1px black,1px 0 black,0 -1px black;font: 800 14px sans-serif;color: #FFFFFF;left: unset;right: -70px;height: 22px;min-height: 22px;z-index: 2;width: 70px;position: absolute}#videos-footer-broadcast{border-radius:unset;z-index: 1;padding: unset!important;white-space: pre}#videos-footer-broadcast-wrapper{z-index: 0;visibility: visible;height: 50px;min-height: 50px;width: 400px;padding: unset;right: 0;left: unset;position: fixed;top: calc(30% + 34px)}span[title=\"Settings\"]>svg{padding:4px;height:24px;width:24px}#seek-duration{pointer-events: none;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;font: 600 20px sans-serif}#videos{bottom: 0;left: 0;right: 0;top: 0}:host,#videolist{background:unset!important;}.video:after{content: unset;border:unset;}#videos-header-mic>svg{padding: 2px 10px;}#videos-header{z-index: 3;background:#101314;transition: none;left: unset;right: 0;width: 400px;top: calc(30%);position: fixed;max-height: 34px;min-height: 34px;}#videos-header>span{display:block;line-height: unset;}#videos-header-sound>svg{padding: 4px}#videos-header-fullscreen > svg {padding: 7px 8px;}";
109 SideMenuCSS = "#close-users{display:none!important;}#user-info{display:none;}#top-buttons-wrapper{display:none;}@media screen and (max-width: 600px) {#sidemenu {top:unset;z-index:2;padding-bottom:0;margin-top:0;}}#sidemenu-wider{display:none;}#sidemenu-content::-webkit-scrollbar{width:0;background:transparent;}#sidemenu{text-shadow:-1px 0 black,0 1px black,1px 0 black,0 -1px black;font:300 20px sans-serif;left:unset!important;right:0!important;padding-bottom:0;height:30%!important;min-width:400px;max-width:400px;}#sidemenu-content{scrollbar-width:none;padding-top:unset;}";
110 MainCSS = "#mobile-app.show{display:none;}html{background:rgba(0,0,0,1);}#users-icon{display:none;}#menu-icon{display:none;}body{background:" + CTS.MainBackground + ";background-position: center!important;background-size:cover!important;overflow:hidden;}#content{width:calc(100% - 400px);padding:0!important;}#nav-static-wrapper, #nav-fixed-wrapper{display:none;}";
111 RoomCSS = "tc-title{display:flex!important;}#room{padding:0!important;}#room-content{padding-top:0!important;background:unset!important;}";
112 TitleCSS = "#room-header-avatar{display:none}#room-header-gifts{display:none}#room-header-info-text{display:none}#room-header-info-details{display:none}#room-header-mobile-button{display:none}#room-header{border:unset;z-index:1;min-height:36px!important;max-height:36px!important;min-width:400px;max-width:400px;top:calc(30% + 84px);right:0;position:fixed;background: linear-gradient(0deg,rgb(0, 19, 29)0%,rgba(0, 0, 0, 0.85)50%,rgb(9, 41, 57)100%);}#room-header-info>h1{height:100%;top: unset;left: unset;right: unset;text-transform:uppercase;text-shadow:-1px 0 black,0 1px black,1px 0 black,0 -1px black;font:600 20px sans-serif;color:#FFFFFF;}#room-header-info>h1:after{content:unset;}#room-header-info {padding: 7px 0 0 6px!important;box-sizing: border-box;width: 100%!important;top: 0!important;left: 0!important;right: 0!important;}#room-he#room-header-info>span{right: 8px;position: absolute;top:7px;margin-top:0!important;}";
113 ContextMenuCSS = ".context.show{height:100%;}.context:after{content:unset;}.context>span{text-shadow:-1px 0 black,0 1px black,1px 0 black,0 -1px black;font:800 14px sans-serif;color:#FFFFFF;display:inline-block;padding:1px 1%;line-height:17px;height:17px;}.context{background:#101314;position:unset;padding:0;height:0;transition:.25s;}";
114 ModeratorCSS = ".video{min-width: 114px;max-width: 114px;}#moderatorlist:after{right:5px;color:#FFFFFF;background:#53b6ef;}#moderatorlist>#header>span>button>svg path{fill:#FFFFFF;}#moderatorlist>#header>span>button{top:-2px;background: #20262870;}#moderatorlist.show>#header>span>button>svg path{fill:#FFFFFF;}#moderatorlist{max-height:60px;}#moderatorlist>#header{height:60px;font-size:16px;font-weight:600;font-family:sans-serif;color:#FFFFFF;text-shadow:-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}#moderatorlist.show[data-videos-count=\"1\"], #moderatorlist.show[data-videos-count=\"2\"] {max-height:205px;}#moderatorlist.show[data-videos-count=\"3\"], #moderatorlist.show[data-videos-count=\"4\"] {max-height:290px;}#moderatorlist.show[data-videos-count=\"5\"], #moderatorlist.show[data-videos-count=\"6\"] {max-height:400px;}#moderatorlist.show[data-videos-count=\"7\"], #moderatorlist.show[data-videos-count=\"8\"] {max-height:460px;}#moderatorlist.show[data-videos-count=\"9\"], #moderatorlist.show[data-videos-count=\"10\"] {max-height:545px;}#moderatorlist.show[data-videos-count=\"11\"], #moderatorlist.show[data-videos-count=\"12\"] {max-height:630px;}";
115 UserListCSS = "#userlist{padding-bottom:40px;}.list-item>span>span[data-cam=\"1\"]:after{height:15px;width:15px;background-image:url(https://i.imgur.com/QKSbq8d.png);}.list-item>span>span[data-moderator=\"1\"]:before{margin-right:3px;width:15px;height:15px;background-image:url(https://i.imgur.com/CEA9aro.png);}.list-item>span>span{background:transparent;box-shadow:none;}.list-item>span>span>.send-gift{top:4px;}.list-item>span>img{top:6px;}#button-banlist{color:#53b6ef;transition:none;top:calc(30% + 89px);right:3px;position:fixed;}.list-item>span[data-status=\"gold\"]:before,.list-item>span[data-status=\"extreme\"]:before,.list-item>span[data-status=\"pro\"]:before{top:5px;}#userlist>div{height:22px;}#userlist>div>span{color:#FFFFFF;font:bold 16px sans-serif;height:22px;line-height:22px;}#userlist>#header{height:40px;top:10px;}#contextmenu {top:unset!important;bottom:0!important;right:0!important;left:0!important;}";
116 ChatListCSS = ".list-item>span>img{top:6px;}.list-item>span.active>span{transition:none;box-shadow:none;background:transparent;visibility:hidden;}.list-item>span>span{top:-4px;background:transparent;box-shadow:none;}.list-item>span>span[data-messages]:before{background:#53b6ef;}.list-item>span[data-status=\"gold\"]:before,.list-item>span[data-status=\"extreme\"]:before,.list-item>span[data-status=\"pro\"]:before{top:5px;}#chatlist>#header>.list-item>span.active{background:#53b6ef;}#chatlist>#header{height:60px;top:30px}#chatlist>div>span{color:#FFFFFF;font:bold 16px sans-serif;height:22px;line-height:22px;}#chatlist>div{height:22px;line-height:22px;}";
117 NotificationCSS = "#videos-header > span {background-color: unset!important;line-height: unset;}.PMTime{display:inline-block;padding:0 6px 0 0;margin:0 8px 0 0;border-right:4px groove #797979;}.PMName{display:inline-block;}#popup div{word-break:break-word;user-select: text;-webkit-user-select: text;-moz-user-select: text;color:#FFFFFF;text-shadow:-1px 0 black,0 1px black,1px 0 black,0 -1px black;font-weight: 300;font-size: 18px;font-family: sans-serif;z-index:1;}.PMOverlay{height: calc(100% - 92px);overflow: hidden;pointer-events:none;position:absolute;padding-top:12px;top:0;bottom:0;left:0;right:0;visibility:visible;}.PMPopup{pointer-events:all;margin:5px auto;width:50%;position:relative;color: #FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}.PMPopup a, .PMPopup a:visited, .PMPopup a:hover, .PMPopup a:active{position:relative;transition:0.5s color ease;text-decoration:none;color:#53b6ef}.PMPopup a:hover{color:#FFFFFF;text-decoration:underline;}.PMPopup h2{border-radius:5px 5px 0 0;background:linear-gradient(0deg,rgb(24, 29, 30) 0%,rgb(24, 29, 30) 52%,rgb(60, 117, 148) 100%);margin:0;padding:5px;font-size:16px;}.PMPopup .PMContent {border-radius: 0 0 5px 5px;padding:5px;max-height:30%;overflow:hidden;word-break:break-all;background:#202628;}";
118 ChatboxCSS = "#chat-download:hover{cursor: pointer;-webkit-box-shadow: inset 0 0 20px #53b6ef;box-shadow: inset 0 0 20px 0 #53b6ef;}#chat-download{position: absolute;right: 0;height: 22px;width: 22px;background: url(\"https://i.imgur.com/Bb3fr6Q.png\") center;background-size: 22px;}#chatlog-button{display:none!important;}#chat-instant.show{background:linear-gradient(0deg,rgb(0, 19, 29)0%,rgba(0, 0, 0, 0.85)50%,rgb(25, 29, 32)100%)!important;}#chat-wider{display:none;}#fav-opt{display: inline-block;cursor: pointer;padding: 12px;background: #10131494;}#input-user:checked ~ #user-menu{display:inline-block;}#user-menu > a:hover #user-menu > span > a:hover{color: #FFFFFF}#user-menu > a, #user-menu > span > a {font-weight: 600;position: relative;display: inline-block;width:calc(100% - 30px);padding: 6px;box-sizing: border-box;font-size: 18px;color: #53b6ef;cursor: pointer;transition: .2s;}#user-menu {position: absolute;display: none;bottom: 50px;right: 0;border: 1px solid rgba(0, 0, 0, .06);box-sizing: border-box;border-radius: 3px;color: #FFFFFF;background: #101314;line-height: 1;box-shadow: 0 1px 4px 0 rgba(0, 0, 0, .09);z-index: 1;}#user-menu > span {display: inline-block;width: 100%;padding: 12px;box-sizing: border-box;font-size: 16px;font-weight: 500;white-space: nowrap;text-overflow: ellipsis;cursor: default;overflow: hidden;}#label-user > img {position: absolute;height: 100%;left: -8px;vertical-align: top;}#label-user{position: relative;display: inline-block;height: 48px;width: 48px;border-radius: 100%;overflow: hidden;cursor: pointer;}#header-user{text-shadow:-1px 0 black,0 1px black,1px 0 black,0 -1px black;position: absolute;top: 10px;right: 0;}#chat-wrapper.full-screen #chat-instant, #chatf-wrapper.full-screen #chat-instant>.avatar>.status-icon,#chat-wrapper.full-screen #chat-content>.message>.avatar>.status-icon {background:unset;}.cts-message-unread{display:block;border-radius:6px;padding:1px 6px 1px 6px;background:#53b6ef;text-shadow:-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;color:#FFF;font:bold 16px sans-serif;cursor:pointer}.ctstime{position:absolute;right:3px;top:3px;background: #101314;border: 1px solid black;border-radius: 6px;padding: 1px 6px;}#chat-instant>.avatar>div>img,#cts-chat-content>.message>.avatar>div>img{position:relative;height:100%;left:-7px}.message>#system_user{background:linear-gradient(0deg,rgb(0, 19, 29)0%,rgba(0, 0, 0, 0.85)50%,rgba(0, 0, 0, 0.72)100%);border: 1px solid black;border-radius: 6px;padding: 1px 6px 1px 6px;word-wrap: break-word;font-weight: 600;font-size: 16px;color: #FFF;text-decoration: none;overflow: hidden;text-overflow: ellipsis;}.message{color:#FFF;text-shadow:-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;font-family:sans-serif;font-weight:300;font-size:20px;white-space:pre-line;word-wrap:break-word}.message a, .message a:visited, .message a:hover, .message a:active{position:relative;transition:0.5s color ease;text-decoration:none;color:#53b6ef}.message a:hover{text-decoration:underline;}#chat{will-change: transform;min-height:unset;}#cts-chat-content{display:flex;flex-direction:column;justify-content:flex-end;min-height:100%}#cts-chat-content>.message{padding:3px 3px;background:#101314a8;position:relative;left:0;margin-bottom:3px;border-radius:6px}#cts-chat-content>.message.highlight,.message.common.highlight{background:#e24c05;-webkit-box-shadow:inset 0 0 20px #000000;box-shadow: inset 0 0 20px 0 #000000;}#cts-chat-content>.message.common{min-height: 50px;padding:3px 3px 3px 50px;box-sizing:border-box;text-align:left}#chat-instant>.avatar,#cts-chat-content>.message>.avatar{position:absolute;height:40px;width:40px;top:3px;left:3px;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);pointer-events:none;}#chat-instant>.avatar>div,#cts-chat-content>.message>.avatar>div{position:absolute;height:100%;width:100%;top:0;left:0;border-radius:100%;overflow:hidden}#notification-content .nickname{border-radius:6px;padding:1px 6px 1px 6px}.notification{padding:1px 0 1px 0;text-shadow:-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black}.time{position:absolute;right:5px}.notifbtn:hover{background:linear-gradient(0deg,rgb(0, 135, 186)0%,rgba(0, 49, 64, 0.94)75%,rgba(0, 172, 255, 0.6)100%);}.notifbtn{cursor: pointer;border-radius: 0 0 12px 12px;outline: none;background:linear-gradient(0deg,rgba(0, 0, 0, 0)0%,rgba(37, 37, 37, 0.32)75%,rgba(255, 255, 255, 0.6)100%);border: none;color: white;width: 100%;}#notification-content.large{height:50%;}#notification-content{will-change: transform;top:0;position:relative;scrollbar-width:none;background:#101314;text-shadow:-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;height: 15%;min-height:38px;font:bold 16px sans-serif;color:#FFF;overflow-y:scroll;overflow-wrap:break-word;padding:0 6px 0 6px}#notification-content::-webkit-scrollbar{width:0;background:transparent}#cts-chat-content{display:flex;flex-direction:column;justify-content:flex-end;min-height:100%}#chat-instant>.avatar>.status-icon,#cts-chat-content>.message>.avatar>.status-icon{left:0!important}#chat-instant>.nickname{color:#53b6ef;text-shadow:-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;font-size: 20px;font-weight: 800;}#chat-instant::after{background:none;}.on-white-scroll{scrollbar-width: none;overflow-wrap: break-word;}.on-white-scroll::-webkit-scrollbar{width:0;background:transparent}#cts-chat-content>.message>.nickname{border:1px solid black;border-radius:6px;padding:1px 6px 1px 6px;word-wrap:break-word;max-width:calc(100% - 115px);font-weight:600;font-size:16px;color:#FFF;display:inline-block;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#input{padding-top:0}:host,#input>.waiting{background:#20262870}#input:before,#input:after{content:unset}#input>textarea::placeholder{color:#FFF}#input>textarea::-webkit-input-placeholder{color:#fff}#input>textarea:-moz-placeholder{color:#fff}#input>textarea{width: calc(100% - 57px);line-height:unset;min-height:65px;max-height:65px;border-radius:6px;scrollbar-width:none;background:#101314;text-shadow:-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;color:#FFF;font-size:" + (CTS.FontSize - 4) + "px;font-family:sans-serif;font-weight:300;}#chat-wrapper{border:none;transition:none;bottom:0;right:0!important;max-height:calc(70% - 119px)!important;min-height:calc(70% - 119px)!important;position:fixed!important;min-width:400px;max-width:400px;}#chat-position{top:22px;left:6px;right:6px;bottom:5px;}.on-white-scroll::webkit-scrollbar{width:0;background:transparent;}";
119 }
120 //INITIATE
121 CTSInit();
122
123 function CTSInit() {
124 //INITIATE CTS
125 var err_out=0;
126 CTS.ScriptLoading = setInterval(function() {
127 err_out++;
128 if (document.querySelector("tinychat-webrtc-app")) {
129 if (document.querySelector("tinychat-webrtc-app").shadowRoot) CTSRoomInject();
130 debug("TINYCHAT::LOAD", "ROOM");
131 } else if (document.querySelector("#welcome-wrapper")) {
132 CTSHomeInject();
133 debug("TinyChat::LOAD", "HOME");
134 } else {
135 err_out++;
136 }
137 if (err_out == 50) {
138 clearInterval(CTS.ScriptLoading);
139 clearInterval(CTS.FullLoad);
140 }
141 }, 200);
142 //WEBSOCKET HOOK
143 if (!document.URL.match(/^https:\/\/tinychat.com(\/$|\/#)/i)) {
144 new MutationObserver(function() {
145 this.disconnect();
146 CTSWebSocket();
147 }).observe(document, {
148 subtree: true,
149 childList: true
150 });
151 }
152 //FULLY LOADED -> RUNALL
153 CTS.FullLoad = setInterval(function() {
154 if (CTS.ScriptInit && CTS.SocketConnected) {
155 clearInterval(CTS.FullLoad);
156 if (CTS.Me.mod) {
157 if (CTS.Bot) CheckHost();
158 if (CTS.Room.YT_ON) VideoListElement.querySelector("#videos-footer>#videos-footer-youtube").style.cssText = "display:block;";
159 if (CTS.Room.YT_ON && CTS.Project.isTouchScreen) VideoListElement.querySelector("#videos-footer>#videos-footer-youtube").classList.toggle("hidden");
160 //VideoListElement.querySelector("#videos-footer>#videos-footer-soundcloud").style.cssText = "display:block;";
161 }
162 //PTT AUTO
163 if (CTS.Room.PTT) {
164 VideoListElement.querySelector("#videos-footer-push-to-talk").addEventListener("mouseup", function(e) {
165 if (e.which == 1) CTS.AutoMicrophone = false;
166 if (e.which == 1 && e.ctrlKey === true) CTS.AutoMicrophone = !CTS.AutoMicrophone;
167 if (e.which == 2) CTS.AutoMicrophone = !CTS.AutoMicrophone;
168 }, {
169 passive: true
170 });
171 }
172 //FAVORITE ROOM
173 var favorited_rooms = "",
174 len = CTS.Favorited.length,
175 script = document.createElement("script"),
176 elem = document.getElementsByTagName("script")[0];
177 script.text = 'function AddFavorite(obj, index) {\n var val = JSON.parse(localStorage.getItem("' + CTS.Project.Storage + 'Favorited"));\n val[index]=["' + CTS.Room.Name + '","' + CTS.Room.Avatar + '"];\n localStorage.setItem("' + CTS.Project.Storage + 'Favorited", JSON.stringify(val));\n obj.href ="https://tinychat.com/room/' + CTS.Room.Name + '";\n obj.innerText = "' + CTS.Room.Name + '";\n obj.onclick = null;\n return false;\n}';
178 elem.parentNode.insertBefore(script, elem);
179 for (var i = 0; i < len; i++) favorited_rooms += CTS.Favorited[i] !== null ? "#" + (i + 1) + '<a href="https://tinychat.com/room/' + CTS.Favorited[i][0] + '">' + CTS.Favorited[i][0] + "</a>" : "#" + (i + 1) + '<a href="#" onclick="return AddFavorite(this,' + i + ');">ADD ROOM</a>';
180 ChatLogElement.querySelector("#input").insertAdjacentHTML("afterbegin", '<div id="header-user"><label id="label-user" for="input-user"><img class="switcher" src="' + (CTS.Me.avatar ? CTS.Me.avatar : "https://avatars.tinychat.com/standart/small/eyePink.png") + '"></label><input type="checkbox" id="input-user" hidden=""><div id="user-menu"><span id="nickname">FAVORITED ROOMS</span>' + favorited_rooms + '<span id="nickname">' + CTS.Me.username + '</span><a href="https://tinychat.com/settings/gifts"> My Gifts</a><a href="https://tinychat.com/settings/profile">Profile</a><a href="https://tinychat.com/room/' + CTS.Me.username + '">My Room</a><a href="https://tinychat.com/#">Directory</a></div></div>');
181 //RECENT GIFTS
182 var recent_gifts = "\n";
183 for (var g = 0; g < CTS.Room.Recent_Gifts.length; g++) recent_gifts += "<img src=\""+CTS.Room.Recent_Gifts[g]+"\" />";
184 //ALERT
185 Settings("<center><u>" + CTS.Room.Name.toUpperCase() + "</u>" + (CTS.Room.Avatar ? '\n<img src="' + CTS.Room.Avatar + '">' : "") + "\n" + CTS.Room.Bio + '\n<a href="' + CTS.Room.Website + '" target="_blank">' + CTS.Room.Website + "</a>"+((recent_gifts!="")?recent_gifts:"")+"\n\nROOM CONFIGURATION:\nYouTube Mode: " + ((CTS.Room.YT_ON) ? "ON" : "OFF") + "\n\n</center>");
186 CTS.ShowedSettings = true;
187 AddUserNotification(2, CTS.Me.namecolor, CTS.Me.nick, CTS.Me.username, false);
188 //FEATURE LAUNCH
189 SoundMeter();
190 Reminder();
191 }
192 }, 500);
193 }
194
195 function CTSHomeInject() {
196 var HomeCSS = '@media screen and (max-width: 1000px){.nav-menu {background-color: #181e1f;}}.nav-sandwich-menu-button{background-color:unset;}#modalfree-wrapper{display: none;}.tile-header > img {transition:unset;}.tile-favroom-opt{cursor:pointer;position: absolute;right: 0;top: 0;padding: 1px;background:#10131494;}.tile-favroom-opt:hover{background:#ff00008c;}#content{padding-bottom:unset;}.tile-content{height:180px;}.cts-footer-contents .tile-info{height:20px}.cts-footer-contents .tile-header>img{cursor:pointer;height: 220px;}.tile-header>img{height: 230px;width: 100%;max-width: 100%;}.cts-footer:hover .cts-footer-contents .tile{font-size: 18px;font-weight: 800;width:20%;display:inline-block;}.cts-footer-contents .tile {background: #00a2ff;text-align: center;border:unset;height:unset;display:none;margin: unset;}.cts-footer {background:#10131494;width: 100%;position: fixed;bottom: 0;left: 0;}#catalog > div {display: inline-block;padding: 5px;box-sizing: border-box;}.tile[data-status="pro"], .tile[data-status="extreme"], .tile[data-status="gold"] {margin-top: 12px;}.tile-header {border-radius: 12px 12px 0 0;}#promoted .tile-header > img{width:100%;}#navigation > label{border-radius:12px;}#welcome>div{padding-top:0}.tile-statistic{padding-top:0;padding-bottom:4px;background: #000000a6;}.tile-name{padding-top:unset;}#promote-button{border-radius: 12px 12px 0 0;}tile-name{padding-top:unset;}.tile-info{bottom:unset;top:0;height:28px;}.cts-footer > h2, #promoted-wrapper > h2, #trended-wrapper > h2, #header-for-all{text-align: center;font-size: 30px;font-weight: 800;}body{background:' + CTS.MainBackground + ';background-size:cover;background-attachment: fixed;}.tile-content-info-icon > img {display:none;}.tile-content-info{font-size: 14px;font-weight: 600;}#promoted .tile-content-info-text{word-break: break-word;max-height:95px;}.tile{border:2px solid #fff;margin-top: 13px;height:425px;}#loadmore-no-more {background:#101314;}.tile-content > img{display:none;}#welcome-wrapper{background: #10131494;border-bottom:unset;}#loadmore{background: #00a2ff;font-weight: 600;}#user-menu{background: #101314;}#nav-static-wrapper {-webkit-box-shadow: 0 0 20px 17px #53b6ef;box-shadow: 0 0 20px 17px #53b6ef;background:#101314;}#up-button:hover > #up-button-content {background: #10131459;}#nav-fixed{border-bottom:unset;}#nav-fixed-wrapper{-webkit-box-shadow: 0 0 20px 17px #53b6ef;box-shadow: 0 0 20px 17px #53b6ef;background: #101314;}#nav-static {border-bottom:unset;}#welcome{padding:12px 30px 24px;}.tile{border-radius: 12px;background: #101314b3;}div, span, a, h1, h2, h3, h4, h5, h6, p {text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;color: #FFFFFF!important;}#promoted-wrapper > div, #trended-wrapper > div {background: #00a2ff;border-radius: 12px;}.tile-content-info-text {word-break: break-word;width:100%;}.tile-content-info.with-icon {display: contents;}#navigation > label:not([for="input-catalog-navigation"]) {font-weight:600;background: #000000;}';
197 //INSERT HTML/CSS
198 document.body.querySelector("style").insertAdjacentHTML("beforeend", HomeCSS);
199 document.body.insertAdjacentHTML("beforeend", '<div class="cts-footer"><h2>FAVORITED ROOMS</h2><div class="cts-footer-contents"></div></div>');
200 //INSERT SCRIPT
201 var script = document.createElement("script"),
202 elem = document.getElementsByTagName("script")[0];
203 script.text = 'function RemoveFavorite(obj, index) {\n var val = JSON.parse(localStorage.getItem("' + CTS.Project.Storage + 'Favorited"));\n val[index]=null;\n localStorage.setItem("' + CTS.Project.Storage + 'Favorited", JSON.stringify(val));\n return obj.parentNode.parentNode.remove();\n}';
204 elem.parentNode.insertBefore(script, elem);
205 var len = CTS.Favorited.length;
206 for (var i = 0; i < len; i++) document.body.querySelector(".cts-footer-contents").insertAdjacentHTML("beforeend", CTS.Favorited[i] !== null ? '<div class="tile" data-room-name="' + CTS.Favorited[i][0] + '">Favorite #' + (i + 1) + ' <div class="tile-header"><img id="tile-header-image" src="' + (CTS.Favorited[i][1] ? CTS.Favorited[i][1] : "https://i.imgur.com/VnVFEv7.png") + '" onclick="locationTo(\'/room/' + CTS.Favorited[i][0] + '\');"><div class="tile-info"><div class="tile-favroom-opt" onclick="RemoveFavorite(this,' + i + ')">X</div><div class="tile-name">' + CTS.Favorited[i][0] + '</div></div></div></div>' : '<div class="tile">Favorite #' + (i + 1) + "</div>");
207 //SCRIPT INIT -> PREPARE()
208 clearInterval(CTS.ScriptLoading);
209 CTS.ScriptInit = true;
210 CTSHomePrepare();
211 }
212
213 function CTSHomePrepare() {
214 //FUNCTION BYPASS
215 window.ModalFreeTrialPro = function() {};
216 //REMOVE
217 Remove(document, "#footer");
218 Remove(document, ".nav-logo");
219 }
220
221 function CTSRoomInject() {
222 // PUBLIC / ADDON GRABBERS
223 window.CTSImages = [
224 "https://i.imgur.com/8M0NPCv.png", "https://i.imgur.com/6IAL4aM.png", "https://i.imgur.com/QdOTqIR.jpg", "https://i.imgur.com/qqFsein.jpg", "https://i.imgur.com/vVD5pUb.jpg", "https://i.imgur.com/Sux2Age.jpg", "https://i.imgur.com/cIKznlf.jpg", "https://i.imgur.com/iEMP5I6.jpg", "https://i.imgur.com/rEGy1tK.jpg", "https://i.imgur.com/JR6Ped5.jpg", "https://i.imgur.com/m3dX7yn.jpg", "https://i.imgur.com/2cJqV1K.jpg", "https://i.imgur.com/QL1M4yG.jpg", "https://i.imgur.com/Syy1mUU.jpg", "https://i.imgur.com/sRpDOp3.jpg", "https://i.imgur.com/Im7dWdM.jpg", "https://i.imgur.com/9uCdYyq.png", "https://i.imgur.com/X9Kp6ka.jpg", "https://i.imgur.com/TOZTx1M.jpg", "https://i.imgur.com/wcjxVjk.png", "https://i.imgur.com/UZfmih9.png", "https://i.imgur.com/mkauZUT.jpg", "https://i.imgur.com/GfPqv7d.jpg", "https://i.imgur.com/R7AOtjV.jpg", "https://i.imgur.com/Qso6n8k.jpg", "https://i.imgur.com/vVfj23z.jpg", "https://i.imgur.com/BYPsShX.jpg", "https://i.imgur.com/1EWYBQw.jpg", "https://i.imgur.com/Oaq0eip.jpg", "https://i.imgur.com/HVHaJ1r.jpg", "https://i.imgur.com/SImcSc2.png", "https://i.imgur.com/CgRDCdy.jpg", "https://i.imgur.com/VMtXsES.png", "https://i.imgur.com/oxHz9un.jpg", "https://i.imgur.com/VN6x9QA.jpg", "https://i.imgur.com/9KhjWvW.jpg", "https://i.imgur.com/fu0eiv4.jpg", "https://i.imgur.com/QgcvxZf.jpg", "https://i.imgur.com/2kz8Roz.jpg", "https://i.imgur.com/A2AdQd8.jpg", "https://i.imgur.com/zuNUJ4J.jpg", "https://i.imgur.com/CW4mVWE.jpg", "https://i.imgur.com/0NGecGX.jpg", "https://i.imgur.com/4IEcVlr.jpg", "https://i.imgur.com/JDnQzF4.jpg", "https://i.imgur.com/Ye6iIrw.jpg", "https://i.imgur.com/DVlwQFN.jpg", "https://i.imgur.com/G6Oa9s6.jpg", "https://i.imgur.com/cXpEHvX.jpg", "https://i.imgur.com/ANXRz54.jpg", "https://i.imgur.com/i7KvpAf.jpg", "https://i.imgur.com/kJ44IQQ.jpg", "https://i.imgur.com/5ONal5c.jpg", "https://i.imgur.com/nWuC5FK.jpg", "https://i.imgur.com/ZYNsEN6.jpg", "https://i.imgur.com/C3aVnBq.jpg", "https://i.imgur.com/8Kts9t7.jpg", "https://i.imgur.com/QiaDx3C.jpg", "https://i.imgur.com/wrt6zBN.jpg", "https://i.imgur.com/3YgGoV0.jpg", "https://i.imgur.com/HPsbhiF.jpg", "https://i.imgur.com/X4wSs8f.jpg", "https://i.imgur.com/cqeMox0.jpg", "https://i.imgur.com/apNgmSO.jpg", "https://i.imgur.com/YjYcyCn.jpg", "https://i.imgur.com/2hUFTDv.png", "https://i.imgur.com/7lDQKff.jpg", "https://i.imgur.com/yuQTkOy.png", "https://i.imgur.com/7zvCOpV.jpg", "https://i.imgur.com/L5v6bcs.jpg", "https://i.imgur.com/5h3N2HY.jpg", "https://i.imgur.com/AvhrIcv.jpg", "https://i.imgur.com/DsAMAG1.jpg", "https://i.imgur.com/dDvOwXi.jpg", "https://i.imgur.com/ii00Lnl.jpg",
225 "https://i.imgur.com/vHDQY7N.jpg", "https://i.imgur.com/czfeyXQ.jpg", "https://i.imgur.com/pHEAee2.jpg", "https://i.imgur.com/txu4z7B.jpg", "https://i.imgur.com/NOapG69.jpg", "https://i.imgur.com/cxA4ist.jpg", "https://i.imgur.com/2keIszu.jpg", "https://i.imgur.com/q2Kpinf.jpg", "https://i.imgur.com/nDiFD2D.jpg", "https://i.imgur.com/Lvk0Lql.jpg", "https://i.imgur.com/QcRIeBr.jpg", "https://i.imgur.com/GlBONNB.jpg", "https://i.imgur.com/jVmJ9Iz.jpg", "https://i.imgur.com/9h2N288.png", "https://i.imgur.com/q0Rm3dS.jpg", "https://i.imgur.com/1tTKfKM.png", "https://i.imgur.com/nEwJBan.jpg", "https://i.imgur.com/NgE4lXY.jpg", "https://i.imgur.com/I4Pv5Zc.jpg", "https://i.imgur.com/QVDBSEm.jpg", "https://i.imgur.com/N9KfkgT.jpg", "https://i.imgur.com/mLIDP8a.jpg", "https://i.imgur.com/C8fAtMn.jpg", "https://i.imgur.com/e2Pubr3.jpg", "https://i.imgur.com/6drF4lG.jpg", "https://i.imgur.com/JcFhmPT.jpg", "https://i.imgur.com/wQQlX06.jpg", "https://i.imgur.com/qPTFnVp.jpg", "https://i.imgur.com/KWto7ab.jpg", "https://i.imgur.com/DHEdXnE.jpg", "https://i.imgur.com/49vqbrB.jpg", "https://i.imgur.com/TK4I9DI.jpg", "https://i.imgur.com/o5QNrcQ.jpg", "https://i.imgur.com/49adw4l.jpg", "https://i.imgur.com/vyYOZkE.jpg", "https://i.imgur.com/sBaXCoY.jpg", "https://i.imgur.com/dH0M8aN.png", "https://i.imgur.com/aqZ4VDh.jpg", "https://i.imgur.com/hMpMR84.jpg", "https://i.imgur.com/5zR2i8W.jpg", "https://i.imgur.com/oUPXbGf.jpg", "https://i.imgur.com/YW5tv1t.jpg", "https://i.imgur.com/JgKwHXs.jpg", "https://i.imgur.com/2k9JihV.jpg", "https://i.imgur.com/V5MUGj4.jpg", "https://i.imgur.com/3dUgoAf.jpg", "https://i.imgur.com/Q6aJgBM.jpg", "https://i.imgur.com/gRSmljE.jpg", "https://i.imgur.com/nkhsbE9.jpg", "https://i.imgur.com/I6LMqZq.jpg", "https://i.imgur.com/7OzdeRk.jpg", "https://i.imgur.com/wW94Pvc.jpg", "https://i.imgur.com/jQrTdv2.jpg", "https://i.imgur.com/UDgQ2Fh.jpg", "https://i.imgur.com/qjdMmPf.jpg", "https://i.imgur.com/yh7QoUN.jpg", "https://i.imgur.com/XchwuKo.jpg", "https://i.imgur.com/fdPaQbz.jpg", "https://i.imgur.com/zNfKy8I.jpg", "https://i.imgur.com/TaOf7dX.jpg", "https://i.imgur.com/bZxfyu8.jpg", "https://i.imgur.com/ccZRfsA.jpg", "https://i.imgur.com/wlbmT74.jpg", "https://i.imgur.com/29ffHeU.jpg", "https://i.imgur.com/30HbBAA.jpg", "https://i.imgur.com/4pO8b0B.jpg", "https://i.imgur.com/kD6BveQ.jpg", "https://i.imgur.com/LrCsiQj.jpg", "https://i.imgur.com/QN5NcXK.jpg", "https://i.imgur.com/MWW5cOv.jpg", "https://i.imgur.com/7LvskAH.jpg", "https://i.imgur.com/S7kLNct.jpg", "https://i.imgur.com/rL0olge.jpg", "https://i.imgur.com/0Apm59C.jpg", "https://i.imgur.com/ZMRBVvO.jpg",
226 "https://i.imgur.com/xFNZTwS.jpg", "https://i.imgur.com/iqq8ECW.jpg", "https://i.imgur.com/xEth2qp.jpg", "https://i.imgur.com/8ijIZMj.jpg", "https://i.imgur.com/zSB1DOw.jpg", "https://i.imgur.com/6TzjZSd.jpg", "https://i.imgur.com/Gf9yAwP.jpg", "https://i.imgur.com/u5ifVZy.jpg", "https://i.imgur.com/4ibO4FN.jpg", "https://i.imgur.com/bDCygo7.jpg", "https://i.imgur.com/lqktMar.jpg", "https://i.imgur.com/b2jAXiC.jpg", "https://i.imgur.com/oPE32ni.jpg", "https://i.imgur.com/YRjfPjP.jpg", "https://i.imgur.com/1FRwNEb.jpg", "https://i.imgur.com/dzgvlEx.jpg", "https://i.imgur.com/3FCAMiu.jpg", "https://i.imgur.com/wF5k6Ux.jpg", "https://i.imgur.com/mkuNYYa.jpg", "https://i.imgur.com/Y2Yu3yA.jpg", "https://i.imgur.com/Zchlast.jpg", "https://i.imgur.com/2FbH2jq.jpg", "https://i.imgur.com/Bb4iyy0.jpg", "https://i.imgur.com/7rjAtTt.jpg", "https://i.imgur.com/g1rNC8Z.jpg", "https://i.imgur.com/RC3bKe7.jpg", "https://i.imgur.com/qloc683.jpg", "https://i.imgur.com/irmzqz7.jpg", "https://i.imgur.com/pvmhbwL.jpg", "https://i.imgur.com/Xti1aEf.jpg", "https://i.imgur.com/FqFYows.jpg", "https://i.imgur.com/92zz2Zu.jpg", "https://i.imgur.com/jWrqBga.jpg", "https://i.imgur.com/OMSQsDe.jpg", "https://i.imgur.com/bvTtaLQ.jpg", "https://i.imgur.com/vxt6B7Y.jpg", "https://i.imgur.com/siw7Ipn.jpg", "https://i.imgur.com/paQsmXk.jpg", "https://i.imgur.com/VLHs9cT.png", "https://i.imgur.com/6VSxbJY.jpg", "https://i.imgur.com/C3Xn1WD.jpg", "https://i.imgur.com/d6BBFfS.jpg", "https://i.imgur.com/HyK1BFP.jpg", "https://i.imgur.com/2InicOt.jpg", "https://i.imgur.com/IVM4luE.jpg", "https://i.imgur.com/VLE0zNA.jpg", "https://i.imgur.com/rfgwqVI.jpg", "https://i.imgur.com/GsTMYfk.jpg", "https://i.imgur.com/yMEdYBN.jpg", "https://i.imgur.com/LvrO8oB.jpg", "https://i.imgur.com/1VBNkJP.jpg", "https://i.imgur.com/beuJiKd.jpg", "https://i.imgur.com/61h9Twq.jpg", "https://i.imgur.com/mnszrZ3.jpg", "https://i.imgur.com/He8K7kF.jpg", "https://i.imgur.com/id5BSLh.jpg", "https://i.imgur.com/huazhWL.jpg", "https://i.imgur.com/ttc4EYq.jpg", "https://i.imgur.com/HTO5tGy.jpg", "https://i.imgur.com/Pg1NrT1.jpg", "https://i.imgur.com/HEubZeG.jpg", "https://i.imgur.com/yk4XVVu.jpg", "https://i.imgur.com/Q6xqV8U.jpg", "https://i.imgur.com/ROTOMPV.jpg", "https://i.imgur.com/5DBP49J.jpg", "https://i.imgur.com/1pafkRu.jpg", "https://i.imgur.com/ZYJW79s.jpg", "https://i.imgur.com/5hJnezu.jpg", "https://i.imgur.com/LHRwsur.jpg", "https://i.imgur.com/858hMb9.jpg", "https://i.imgur.com/WOtpN81.jpg", "https://i.imgur.com/ITCxNl1.jpg", "https://i.imgur.com/OvXfe6w.jpg", "https://i.imgur.com/EVYKONX.jpg", "https://i.imgur.com/9nP4KwW.jpg",
227 "https://i.imgur.com/1SaESYp.jpg", "https://i.imgur.com/xBQlQKh.jpg", "https://i.imgur.com/yonFqV5.jpg", "https://i.imgur.com/go0xMSw.png", "https://i.imgur.com/jJhFpGw.jpg", "https://i.imgur.com/fcULcZq.jpg", "https://i.imgur.com/66l2lHM.jpg", "https://i.imgur.com/bujMfoQ.jpg", "https://i.imgur.com/JdbenHz.jpg", "https://i.imgur.com/merXbme.jpg", "https://i.imgur.com/ogrqxoQ.jpg", "https://i.imgur.com/fCstr3I.jpg", "https://i.imgur.com/t4d6ngW.jpg", "https://i.imgur.com/QzTlCSw.png", "https://i.imgur.com/CjrvvRI.jpg", "https://i.imgur.com/Du0abK6.jpg", "https://i.imgur.com/fZxRbtq.jpg", "https://i.imgur.com/zJB8VZc.jpg", "https://i.imgur.com/5lFG1Bf.jpg", "https://i.imgur.com/hvGzGNb.png", "https://i.imgur.com/UHZ8gC6.jpg", "https://i.imgur.com/ZIlJIIZ.png", "https://i.imgur.com/H7SjU1N.jpg", "https://i.imgur.com/yxxQsmf.jpg", "https://i.imgur.com/1TBkVzd.jpg", "https://i.imgur.com/3WffDw4.jpg", "https://i.imgur.com/XQU3W19.png", "https://i.imgur.com/2YxUgbQ.jpg", "https://i.imgur.com/8TVSB7D.jpg", "https://i.imgur.com/lNfEZwF.jpg", "https://i.imgur.com/2CgZewR.jpg", "https://i.imgur.com/ZJMFXGM.jpg", "https://i.imgur.com/9pZLYVF.jpg", "https://i.imgur.com/i9KaWdK.jpg", "https://i.imgur.com/X0hUxMg.jpg", "https://i.imgur.com/cWNLBLC.jpg", "https://i.imgur.com/oVQ1qmK.jpg", "https://i.imgur.com/MFa4WPr.jpg", "https://i.imgur.com/QalYWeA.png", "https://i.imgur.com/bLAlVzX.jpg", "https://i.imgur.com/OEXO2kT.jpg", "https://i.imgur.com/MnK5lmL.jpg", "https://i.imgur.com/dVMdMZh.jpg", "https://i.imgur.com/nNfOFvX.png", "https://i.imgur.com/yzoTLrK.jpg", "https://i.imgur.com/b1mTB58.jpg", "https://i.imgur.com/uWMQpMV.jpg", "https://i.imgur.com/TVGqTdH.jpg", "https://i.imgur.com/GFfZk0L.jpg", "https://i.imgur.com/aS5RCaX.jpg", "https://i.imgur.com/TTWYjDg.png", "https://i.imgur.com/OKUbuLl.jpg", "https://i.imgur.com/FyIJb7S.jpg", "https://i.imgur.com/KVTNHKB.jpg", "https://i.imgur.com/G9cpqNM.jpg", "https://i.imgur.com/cFf5e30.jpg", "https://i.imgur.com/1Nok0ho.jpg", "https://i.imgur.com/ozEWuPz.jpg", "https://i.imgur.com/QhHTLxc.jpg", "https://i.imgur.com/YYto1AX.jpg", "https://i.imgur.com/1THGvEA.jpg", "https://i.imgur.com/Rt3mp6H.jpg", "https://i.imgur.com/M2tiiNS.jpg", "https://i.imgur.com/lRtAxDM.jpg", "https://i.imgur.com/dlqkyFg.jpg", "https://i.imgur.com/lSLHeHM.png", "https://i.imgur.com/wKBOEof.png", "https://i.imgur.com/0aF2Si4.jpg", "https://i.imgur.com/bPDtdqH.jpg", "https://i.imgur.com/wZ08FwN.jpg", "https://i.imgur.com/gEtlvpr.jpg", "https://i.imgur.com/sTrwc9U.jpg", "https://i.imgur.com/nPEjErr.png", "https://i.imgur.com/bRaK26l.jpg", "https://i.imgur.com/vwJe85N.jpg",
228 "https://i.imgur.com/F8RFA5t.jpg", "https://i.imgur.com/M08DwfB.jpg", "https://i.imgur.com/gvF4hmM.jpg", "https://i.imgur.com/vINAgNJ.jpg", "https://i.imgur.com/ZzIHnk7.png", "https://i.imgur.com/IaYE1SA.png", "https://i.imgur.com/h3uA809.jpg", "https://i.imgur.com/uSxy1TH.jpg", "https://i.imgur.com/ihUpL67.jpg", "https://i.imgur.com/JA5pSwV.jpg", "https://i.imgur.com/S5PaNRb.jpg", "https://i.imgur.com/vPKxrIj.jpg", "https://i.imgur.com/Zb2vtPA.jpg", "https://i.imgur.com/uUkxBYp.jpg", "https://i.imgur.com/fpsAui6.jpg", "https://i.imgur.com/Ns5gM3Y.jpg", "https://i.imgur.com/qUFLtvX.jpg", "https://i.imgur.com/JsVmBaH.jpg", "https://i.imgur.com/DUFEeDG.jpg", "https://i.imgur.com/VkT9WNe.jpg", "https://i.imgur.com/7rHa1t1.jpg", "https://i.imgur.com/6rt4Xsc.jpg", "https://i.imgur.com/1woJRNz.jpg", "https://i.imgur.com/DZizgSe.jpg", "https://i.imgur.com/WcPkq2p.jpg", "https://i.imgur.com/FWgshWM.jpg", "https://i.imgur.com/ce28KTw.jpg", "https://i.imgur.com/Z1kgLE9.jpg", "https://i.imgur.com/qmTDbVf.jpg", "https://i.imgur.com/Glfmlwk.jpg", "https://i.imgur.com/1ZlA3eI.jpg", "https://i.imgur.com/FyY9zQB.jpg", "https://i.imgur.com/5vION1i.jpg", "https://i.imgur.com/GN8VSLo.jpg", "https://i.imgur.com/fMHj9aD.png", "https://i.imgur.com/AZKVqlm.jpg", "https://i.imgur.com/N6yrNAp.jpg", "https://i.imgur.com/mzfGu1K.jpg", "https://i.imgur.com/PbDAvp8.jpg", "https://i.imgur.com/PeKxWNd.png", "https://i.imgur.com/q6HucmK.jpg", "https://i.imgur.com/PcpoEr9.jpg", "https://i.imgur.com/m8MKD34.jpg", "https://i.imgur.com/rEfHYFj.png", "https://i.imgur.com/YOnQC7m.jpg", "https://i.imgur.com/IKZ1dnz.png", "https://i.imgur.com/7dKl6GR.jpg", "https://i.imgur.com/7QTdYyC.jpg", "https://i.imgur.com/VY6CRU9.jpg", "https://i.imgur.com/JbbTXGZ.jpg", "https://i.imgur.com/LiWognc.jpg", "https://i.imgur.com/lAlCmCS.jpg", "https://i.imgur.com/tuoVfDz.jpg", "https://i.imgur.com/jDtr7VV.jpg", "https://i.imgur.com/Fmq1w0x.jpg", "https://i.imgur.com/SW9tEby.jpg", "https://i.imgur.com/OIeGtF1.jpg", "https://i.imgur.com/y28VX6l.jpg", "https://i.imgur.com/SmN01pH.jpg", "https://i.imgur.com/pYIHV3V.jpg", "https://i.imgur.com/4mefbZJ.jpg", "https://i.imgur.com/CrnksCn.jpg", "https://i.imgur.com/DqdQHU5.jpg", "https://i.imgur.com/Kyp7Mrq.jpg", "https://i.imgur.com/5uUI0FK.jpg", "https://i.imgur.com/nYyKnjc.jpg", "https://i.imgur.com/8yngY9r.png", "https://i.imgur.com/LXTztRk.jpg", "https://i.imgur.com/YW9f04H.jpg", "https://i.imgur.com/VEOTdF4.jpg", "https://i.imgur.com/CNcnljn.jpg", "https://i.imgur.com/cVyPQRQ.jpg", "https://i.imgur.com/QVnisWP.jpg", "https://i.imgur.com/xkOmSt2.jpg", "https://i.imgur.com/OWqkrGA.jpg",
229 "https://i.imgur.com/407ypHE.jpg", "https://i.imgur.com/q7CBMPA.jpg", "https://i.imgur.com/jLgvLEB.jpg", "https://i.imgur.com/ZgRybJZ.jpg", "https://i.imgur.com/BCiqZoY.jpg", "https://i.imgur.com/C4FCE08.jpg", "https://i.imgur.com/mwQMddH.jpg", "https://i.imgur.com/c9Na9m7.jpg", "https://i.imgur.com/rvkOyhW.jpg", "https://i.imgur.com/fXikj5n.jpg", "https://i.imgur.com/B9nwfN2.jpg", "https://i.imgur.com/NitZTxZ.jpg", "https://i.imgur.com/4U7Wc6E.jpg", "https://i.imgur.com/wk2byhf.jpg", "https://i.imgur.com/kmeF9zK.jpg", "https://i.imgur.com/fpOurZh.jpg", "https://i.imgur.com/A6t86N6.jpg", "https://i.imgur.com/CnGthdb.jpg", "https://i.imgur.com/FgCA3uK.jpg", "https://i.imgur.com/sCYYhqf.jpg", "https://i.imgur.com/2NopGqw.jpg", "https://i.imgur.com/fzYZGdC.jpg", "https://i.imgur.com/nZufx8p.jpg", "https://i.imgur.com/IjMMreD.jpg", "https://i.imgur.com/HEpf4Eb.jpg", "https://i.imgur.com/jZeIfAc.jpg", "https://i.imgur.com/ZxaX4j0.jpg", "https://i.imgur.com/DXetwFt.jpg", "https://i.imgur.com/euIXHlP.jpg", "https://i.imgur.com/U4Mo2Hn.jpg", "https://i.imgur.com/w4pR6Hp.jpg", "https://i.imgur.com/79GciEk.jpg", "https://i.imgur.com/WpDbcAA.jpg", "https://i.imgur.com/YODAe6Z.jpg", "https://i.imgur.com/4It1NIe.jpg", "https://i.imgur.com/ALkfNHF.jpg", "https://i.imgur.com/xJOaHZP.jpg", "https://i.imgur.com/nFCIuJo.jpg", "https://i.imgur.com/oXgFh2K.jpg", "https://i.imgur.com/Vcs3jXT.jpg", "https://i.imgur.com/XGtJE58.jpg", "https://i.imgur.com/q4WalQY.jpg", "https://i.imgur.com/WFIyruV.jpg", "https://i.imgur.com/sItJMKv.jpg", "https://i.imgur.com/LAQ3Wpl.jpg", "https://i.imgur.com/C64XPAR.jpg", "https://i.imgur.com/hyehxek.jpg", "https://i.imgur.com/4XYBWKu.jpg", "https://i.imgur.com/KU1adf4.jpg", "https://i.imgur.com/L3sbodb.png", "https://i.imgur.com/JPMfbL9.jpg", "https://i.imgur.com/ieae2zo.jpg", "https://i.imgur.com/VVswQpo.jpg", "https://i.imgur.com/fWUr6ic.jpg", "https://i.imgur.com/juRIj2L.jpg", "https://i.imgur.com/2Mq8ZR8.jpg", "https://i.imgur.com/ibC5gSl.jpg", "https://i.imgur.com/63uHgyR.jpg", "https://i.imgur.com/xs3yEut.jpg", "https://i.imgur.com/0SYzA7u.jpg", "https://i.imgur.com/hRKhVTS.jpg", "https://i.imgur.com/IGv4V1p.jpg", "https://i.imgur.com/hmlxgXG.jpg", "https://i.imgur.com/q97Z7Nc.jpg", "https://i.imgur.com/1A6NPKj.jpg", "https://i.imgur.com/y97L14a.jpg", "https://i.imgur.com/DPohLPu.jpg", "https://i.imgur.com/JvXJ74s.jpg", "https://i.imgur.com/mA5b8Y1.jpg", "https://i.imgur.com/FVNerO1.jpg", "https://i.imgur.com/KNsh665.jpg", "https://i.imgur.com/Z9b0Gme.jpg", "https://i.imgur.com/z90LZmp.jpg", "https://i.imgur.com/tfXYXr7.png", "https://i.imgur.com/atHkjXl.jpg",
230 "https://i.imgur.com/u1l34Vi.jpg", "https://i.imgur.com/X0yROLr.jpg", "https://i.imgur.com/EpHkJZI.jpg", "https://i.imgur.com/TIKipWb.jpg", "https://i.imgur.com/Lq4qnDF.jpg", "https://i.imgur.com/N1KmzQo.jpg", "https://i.imgur.com/pAReFTB.jpg", "https://i.imgur.com/ZKMQwxk.jpg", "https://i.imgur.com/aSDE7i4.jpg", "https://i.imgur.com/kabITqS.jpg", "https://i.imgur.com/W7oaDNe.jpg", "https://i.imgur.com/VHYmth8.jpg",
231 ];
232 window.CTSEightBall = ["It is certain.", "It is decidedly so.", "Without a doubt.", "Yes - definitely.", "You may rely on it.", "As I see it, yes.", "Most Likely.", "Outlook good.", "Yes.", "Signs point to yes.", "Reply hazy, try again.", "Ask again later.", "Better not tell you now.", "Cannot predict now.", "Concentrate and ask again.", "Don't count on it.", "My reply is no.", "My sources say no.", "Outlook not so good.", "Very doubtful."];
233 window.CTSWelcomes = ["Hey ", "What's crackin ", "Hello ", "Good to see you ", "Howdy ", "Hey there ", "Yo ", "What's up ", "Greetings ", "What's hangin' "];
234 window.CTSSound = {
235 C: new Audio("https://media.vocaroo.com/mp3/e3VIvvFqdHe"),
236 HIGHLIGHT: new Audio("https://media.vocaroo.com/mp3/mjS6tza4Tu4"),
237 GREET: new Audio("https://media.vocaroo.com/mp3/mjS6tza4Tu4"),
238 MENTION: new Audio("https://media.vocaroo.com/mp3/gsrjQNCdhlX"),
239 MSG: new Audio("https://tinychat.com"+window.rootDir+"/sound/pop.mp3"),
240 GIFT: new Audio("https://tinychat.com"+window.rootDir+"/sound/magic.mp3"),
241 PVTMSG: new Audio("https://media.vocaroo.com/mp3/1eX3L752VdQ")
242 };
243 window.CTSRadioStations = [
244 ["Flex 98.5FM", "https://edge1-b.exa.live365.net/a23768"],
245 ["The Loop 97.9", "https://16883.live.streamtheworld.com/WLUPFMAAC.aac"],
246 ["HOT899", "https://newcap.leanstream.co/CIHTFM"],
247 ["chillstep.info", "https://chillstep.info/listen.ogg"],
248 ["HOT997", "https://ice5.securenetsystems.net/KHHK"],
249 ["Dance365", "https://edge1-b.exa.live365.net/a93720"],
250 ["kexp.org", "https://kexp-mp3-128.streamguys1.com/kexp128.mp3"],
251 ["Classic Deep Cuts", "https://edge1-b.exa.live365.net/a72496"],
252 ["Divas Hustle Radio", "https://edge1-b.exa.live365.net/a72972"],
253 ["Retro 8089", "https://edge1-b.exa.live365.net/a53202"],
254 ["Teerex Radio Teerex", "https://edge1-b.exa.live365.net/a74387"],
255 ["NGI Radio", "https://edge1-b.exa.live365.net/a24650"],
256 ["Legend Oldies", "https://edge1-b.exa.live365.net/a88135"],
257 ["Music City Roadhouse", "https://edge1-b.exa.live365.net/a73754"],
258 ["Mashrup Reggae Radio", "https://edge1-b.exa.live365.net/a00564"],
259 ["97.5 Dance Hits", "https://edge1-b.exa.live365.net/a50365"]
260 ];
261 window.CTSNameColor = ["#3f69c0", "#b63fc0", "#001f3f", "#0074D9", "#7FDBFF", "#39CCCC", "#3D9970", "#26a635", "#00b34d", "#e6c700", "#FF851B", "#FF4136", "#c81e70", "#f00fbb", "#B10DC9", "#111111", "#AAAAAA", "#cc6600", "#009933", "#003366", "#660033", "#804000"];
262 window.CTSChatCSS = [
263 [ //STYLE #0
264 ["#chat-wrapper{background:linear-gradient(0deg,rgba(32,38,40,0.59)0%,rgba(16,14,14,0.76)calc(100% - 62px),rgba(45,55,58,0.72)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
265 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(19,19,19,0.73)8px,rgba(0,0,0,0.34)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
266 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(19,19,19,0.73)8px,rgba(0,0,0,0.34)100%);}"]
267 ],
268 [ //STYLE #1
269 ["#chat-wrapper{background:linear-gradient(0deg,rgb(255,255,255)0%,rgba(99,99,99)calc(100% - 62px),rgba(255,255,255)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
270 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(58, 58, 58)8px,rgb(30, 30, 30)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
271 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(25,25,25)8px,rgb(76,76,76)100%);}"]
272 ],
273 [ //STYLE #2
274 ["#chat-wrapper{background:linear-gradient(0deg,rgb(121,24,188)0%,rgb(36,15,45)calc(100% - 62px),rgb(121,24,188)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
275 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(83, 17, 128)8px,rgb(68, 15, 103)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#7918bc;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#7918bc!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#460b6f!important;}#videos-footer-push-to-talk{background:#7918bc}#videos-footer-push-to-talk:hover{background:#460b6f}#videos-footer-broadcast:hover{background:#460b6f}#videos-footer-broadcast{background:#7918bc;}"],
276 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(13,5,15)8px,rgb(121,24,188)100%);}"]
277 ],
278 [ //STYLE #3
279 ["#chat-wrapper{background:linear-gradient(0deg,rgb(248,5,5)0%,rgb(81,22,22)calc(100% - 62px),rgba(204,0,0)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
280 [".PMPopup .PMContent{background:#2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(121, 3, 3)8px,rgb(176, 2, 2)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#c10101;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#c10101!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#6b0f0f!important;}#videos-footer-push-to-talk{background:#c10101}#videos-footer-push-to-talk:hover{background:#6b0f0f}#videos-footer-broadcast:hover{background:#6b0f0f}#videos-footer-broadcast{background:#c10101;}"],
281 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(15,5,5)8px,rgb(193,1,1)100%);}"]
282 ],
283 [ //STYLE #4
284 ["#chat-wrapper{background:linear-gradient(0deg,rgb(65,144,219)0%,rgb(7,69,97)calc(100% - 62px),rgb(37,179,222)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
285 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(26, 59, 75)8px,rgb(59, 130, 170)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
286 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(5,14,15)8px,rgb(83,182,239)100%);}"]
287 ],
288 [ //STYLE #5
289 ["#chat-wrapper{background:linear-gradient(0deg,rgb(0,158,5)0%,rgb(5,15,5)calc(100% - 62px),rgb(13,181,0)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
290 [".PMPopup .PMContent{background:#2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(13, 96, 7)8px,rgb(8, 48, 6)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#0cae00;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#0cae00!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#054c00!important;}#videos-footer-push-to-talk{background:#0cae00}#videos-footer-push-to-talk:hover{background:#054c00}#videos-footer-broadcast:hover{background:#054c00}#videos-footer-broadcast{background:#0cae00;}"],
291 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(5,15,5)8px,rgb(14,104,7)100%);}"]
292 ],
293 [ //STYLE #6
294 ["#chat-wrapper{background:linear-gradient(0deg,rgba(0, 0, 0, 0.69)0%,rgba(0, 0, 0, 0.56)calc(100% - 62px),rgb(13, 179, 0)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
295 [".PMPopup .PMContent{background:#2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(13, 96, 7)8px,rgb(8, 48, 6)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#0cae00;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#0cae00!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#054c00!important;}#videos-footer-push-to-talk{background:#0cae00}#videos-footer-push-to-talk:hover{background:#054c00}#videos-footer-broadcast:hover{background:#054c00}#videos-footer-broadcast{background:#0cae00;}"],
296 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(5, 15, 5, 0.72)8px,rgba(0, 0, 0, 0.42)100%);}"]
297 ],
298 [ //STYLE #7
299 ["#chat-wrapper{background: linear-gradient(0deg,rgb(255, 255, 255)0%,rgba(255, 255, 255, 0.82)calc(100% - 62px),rgb(255, 255, 255)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
300 [".PMPopup .PMContent{background:#2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(255, 255, 255, 0.72)8px,rgba(255, 255, 255, 0.81)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
301 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(255, 255, 255, 0.72)8px,rgba(255, 255, 255, 0.81)100%);}"]
302 ],
303 [ //STYLE #8
304 ["#chat-wrapper{background: linear-gradient(0deg,rgba(255, 255, 0, 1)0%,rgba(255, 255, 0, 0.82)calc(100% - 62px),rgba(255, 255, 0, 1)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
305 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(234, 236, 5)8px,rgb(180, 187, 15)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
306 ["#sidemenu{background: linear-gradient(0deg,rgb(56, 50, 6)0%,rgb(149, 158, 22)8px,rgba(255, 255, 0, 1)100%);}"]
307 ],
308 [ //STYLE #9
309 ["#chat-wrapper{background: linear-gradient(0deg,rgb(119, 45, 2) 0%,rgb(24, 29, 30) 52%,rgb(234, 129, 38) 100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
310 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(226, 92, 19)8px,rgb(158, 73, 16)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
311 ["#sidemenu{background: linear-gradient(0deg,rgb(154, 51, 1)0%,rgba(255, 125, 0, 1)8px,rgba(255, 125, 0, 1)100%);}"]
312 ],
313 [ //STYLE #10
314 ["#chat-wrapper{background: linear-gradient(0deg,rgb(141, 36, 95)0%,rgba(191, 0, 255, 0.82)calc(100% - 62px),rgb(255, 0, 202)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
315 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(150, 0, 175)8px,rgb(176, 0, 226)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
316 ["#sidemenu{background: linear-gradient(0deg,rgb(94, 3, 62)0%,rgb(191, 0, 255)8px,rgb(71, 0, 20)100%);}"]
317 ],
318 [ //STYLE #11
319 ["#cts-chat-content>.message{background:#101314;}#chat-wrapper{background: repeating-linear-gradient(-45deg,rgb(0, 0, 0)1px,rgb(0, 186, 255)3px,rgba(0, 115, 255, 0.49)15px)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
320 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:repeating-linear-gradient(-45deg,rgb(0, 0, 0)1px,rgb(0, 186, 255)3px,rgba(0, 115, 255, 0.49)15px);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
321 ["#sidemenu{background: repeating-linear-gradient(-45deg,rgb(0, 0, 0)1px,rgb(0, 186, 255)3px,rgba(0, 115, 255, 0.49)15px);}"]
322 ],
323 [ //STYLE #12
324 ["#chat-wrapper{background: #fff!important;}.message>#system_user{color:#FFFFFF}#cts-chat-content>.message{background:#00000000}.message{color:#000000;text-shadow: unset;}"],
325 [".PMPopup .PMContent{background:#2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(255, 255, 255, 0.72)8px,rgba(255, 255, 255, 0.81)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
326 ["#sidemenu{background: #2d373a;}"]
327 ],
328 [ //STYLE #13
329 ["#chat-wrapper{background: url(https://i.imgur.com/ek4TEsz.jpg)!important;}#cts-chat-content>.message{background:#17951a8c;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
330 [".PMPopup .PMContent{background:#2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(37, 101, 27)8px,rgb(36, 98, 25)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
331 ["#sidemenu{background: url(https://i.imgur.com/LCOulGB.png) repeat-x bottom;}"]
332 ],
333 [ //STYLE #14
334 ["#chat-wrapper{background:linear-gradient(0deg,rgba(32,38,40,0.59)0%,rgba(16,14,14,0.76)calc(100% - 62px),rgba(45,55,58,0.72)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
335 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(19,19,19,0.73)8px,rgba(0,0,0,0.34)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
336 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(19,19,19,0.73)8px,rgba(0,0,0,0.34)100%);}"]
337 ],
338 [ //STYLE #14
339 ["#chat-wrapper{background:linear-gradient(0deg,rgb(255,255,255)0%,rgba(99,99,99)calc(100% - 62px),rgba(255,255,255)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
340 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(58, 58, 58)8px,rgb(30, 30, 30)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
341 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(19,19,19,0.73)8px,rgba(0,0,0,0.34)100%);}"]
342 ],
343 [ //STYLE #15
344 ["#chat-wrapper{background:linear-gradient(0deg,rgb(121,24,188)0%,rgb(36,15,45)calc(100% - 62px),rgb(121,24,188)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
345 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(83, 17, 128)8px,rgb(68, 15, 103)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#7918bc;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#7918bc!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#460b6f!important;}#videos-footer-push-to-talk{background:#7918bc}#videos-footer-push-to-talk:hover{background:#460b6f}#videos-footer-broadcast:hover{background:#460b6f}#videos-footer-broadcast{background:#7918bc;}"],
346 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(19,19,19,0.73)8px,rgba(0,0,0,0.34)100%);}"]
347 ],
348 [ //STYLE #16
349 ["#chat-wrapper{background:linear-gradient(0deg,rgb(248,5,5)0%,rgb(81,22,22)calc(100% - 62px),rgba(204,0,0)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
350 [".PMPopup .PMContent{background:#2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(121, 3, 3)8px,rgb(176, 2, 2)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#c10101;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#c10101!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#6b0f0f!important;}#videos-footer-push-to-talk{background:#c10101}#videos-footer-push-to-talk:hover{background:#6b0f0f}#videos-footer-broadcast:hover{background:#6b0f0f}#videos-footer-broadcast{background:#c10101;}"],
351 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(19,19,19,0.73)8px,rgba(0,0,0,0.34)100%);}"]
352 ],
353 [ //STYLE #17
354 ["#chat-wrapper{background:linear-gradient(0deg,rgb(65,144,219)0%,rgb(7,69,97)calc(100% - 62px),rgb(37,179,222)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
355 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(26, 59, 75)8px,rgb(59, 130, 170)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
356 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(19,19,19,0.73)8px,rgba(0,0,0,0.34)100%);}"]
357 ],
358 [ //STYLE #18
359 ["#chat-wrapper{background:linear-gradient(0deg,rgb(0,158,5)0%,rgb(5,15,5)calc(100% - 62px),rgb(13,181,0)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
360 [".PMPopup .PMContent{background:#2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(13, 96, 7)8px,rgb(8, 48, 6)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#0cae00;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#0cae00!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#054c00!important;}#videos-footer-push-to-talk{background:#0cae00}#videos-footer-push-to-talk:hover{background:#054c00}#videos-footer-broadcast:hover{background:#054c00}#videos-footer-broadcast{background:#0cae00;}"],
361 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(19,19,19,0.73)8px,rgba(0,0,0,0.34)100%);}"]
362 ],
363 [ //STYLE #19
364 ["#chat-wrapper{background: linear-gradient(0deg,rgb(255, 255, 255)0%,rgba(255, 255, 255, 0.82)calc(100% - 62px),rgb(255, 255, 255)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
365 [".PMPopup .PMContent{background:#2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(255, 255, 255, 0.72)8px,rgba(255, 255, 255, 0.81)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
366 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(19,19,19,0.73)8px,rgba(0,0,0,0.34)100%);}"]
367 ],
368 [ //STYLE #20
369 ["#chat-wrapper{background: linear-gradient(0deg,rgba(255, 255, 0, 1)0%,rgba(255, 255, 0, 0.82)calc(100% - 62px),rgba(255, 255, 0, 1)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
370 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(234, 236, 5)8px,rgb(180, 187, 15)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
371 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(19,19,19,0.73)8px,rgba(0,0,0,0.34)100%);}"]
372 ],
373 [ //STYLE #21
374 ["#chat-wrapper{background: linear-gradient(0deg,rgb(119, 45, 2) 0%,rgb(24, 29, 30) 52%,rgb(234, 129, 38) 100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
375 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(226, 92, 19)8px,rgb(158, 73, 16)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
376 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(19,19,19,0.73)8px,rgba(0,0,0,0.34)100%);}"]
377 ],
378 [ //STYLE #22
379 ["#chat-wrapper{background: linear-gradient(0deg,rgb(141, 36, 95)0%,rgba(191, 0, 255, 0.82)calc(100% - 62px),rgb(255, 0, 202)100%)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
380 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:linear-gradient(0deg,rgb(0, 0, 0)0%,rgb(150, 0, 175)8px,rgb(176, 0, 226)100%);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
381 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(19,19,19,0.73)8px,rgba(0,0,0,0.34)100%);}"]
382 ],
383 [ //STYLE #23
384 ["#cts-chat-content>.message{background:#101314;}#chat-wrapper{background: repeating-linear-gradient(-45deg,rgb(0, 0, 0)1px,rgb(0, 186, 255)3px,rgba(0, 115, 255, 0.49)15px)!important;}#cts-chat-content>.message{background:#101314a8;}.message{color:#FFF;text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;}"],
385 [".PMPopup .PMContent{background: #2d373ADB;}.PMPopup h2{background:repeating-linear-gradient(-45deg,rgb(0, 0, 0)1px,rgb(0, 186, 255)3px,rgba(0, 115, 255, 0.49)15px);}#videos-footer-broadcast-wrapper>.waiting{background:#53b6ef;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button{background:#53b6ef!important;}#videos-footer-broadcast-wrapper>#videos-footer-submenu-button:hover{background:#3d89b5!important;}#videos-footer-push-to-talk{background:#53b6ef}#videos-footer-push-to-talk:hover{background:#3d89b5}#videos-footer-broadcast:hover{background:#3d89b5}#videos-footer-broadcast{background:#53b6ef;}"],
386 ["#sidemenu{background: linear-gradient(0deg,rgb(0, 0, 0)0%,rgba(19,19,19,0.73)8px,rgba(0,0,0,0.34)100%);}"]
387 ]
388 ];
389 //INSERT SCRIPT
390 var script = document.createElement("script"),
391 elem = document.getElementsByTagName("script")[0];
392 script.text = 'var StationSelected = 0,\n StationPlay = false,\n StationVol = 1;\nfunction VolStation(elem, vol){\n var StationElem = elem.parentElement.nextSibling;\n var StationVolElem = elem.parentElement.querySelector(".music-radio-info>.volume");\nStationVol += vol;\n if (StationVol < 0){\n StationVol = 0;\n } else if (StationVol > 1) {\n StationVol = 1.0;\n }\n StationElem.volume = StationVol;\nStationVolElem.style.width=((StationVol * 100)+"%");}\nfunction PlayPauseStation(elem) {\n var StationPlayPauseBtn = elem.parentElement.querySelector(".music-radio-playpause");\n var StationElem=elem.parentElement.nextSibling;\nvar StationDescElem=elem.parentElement.querySelector(".music-radio-info>.description");\n StationPlay=!StationPlay;\n if (StationPlay) {\n StationElem.volume = StationVol;\n StationElem.play();\n StationPlayPauseBtn.innerText="❚❚"; StationDescElem.innerText = ("Playing: "+window.CTSRadioStations[StationSelected][0]+"\\nURL: "+window.CTSRadioStations[StationSelected][1]);\n} else {\n StationElem.pause();\nStationPlayPauseBtn.innerText="▶";\n StationDescElem.innerText = ("Paused: "+window.CTSRadioStations[StationSelected][0]+"\\nURL: "+window.CTSRadioStations[StationSelected][1]);}\n}\nfunction SeekStation(elem, direction) {\n var StationElem = elem.parentElement.nextSibling;\n var StationDescElem = elem.parentElement.querySelector(".music-radio-info>.description");\nvar StationPlayPauseBtn = elem.parentElement.querySelector(".music-radio-playpause");\n StationPlay = true;\n StationSelected += direction;\n \n if (StationSelected > window.CTSRadioStations.length-1) {\n StationSelected = 0;\n } else if (StationSelected < 0){\n StationSelected = window.CTSRadioStations.length-1;\n }\n StationElem.pause();\n StationElem.setAttribute("src", window.CTSRadioStations[StationSelected][1]);\n StationElem.load();\n StationElem.volume = StationVol;\nStationPlayPauseBtn.innerText="❚❚";\n StationElem.play();\nStationDescElem.innerText = ("Playing: "+window.CTSRadioStations[StationSelected][0]+"\\nURL: "+window.CTSRadioStations[StationSelected][1]);\n}';
393 elem.parentNode.insertBefore(script, elem);
394 //LOCALSETTINGS
395 CTS.enablePMs = (window.localStorage.tinychat_settings) ? JSON.parse(window.localStorage.tinychat_settings).enablePMs : true;
396 CTS.enableSound = (window.localStorage.tinychat_settings) ? JSON.parse(window.localStorage.tinychat_settings).enableSound : true;
397 //TTS (TEXT-TO-SPEECH)
398 if (CTS.enableSound === true && "speechSynthesis" in window) {
399 CTS.TTS.synth = window.speechSynthesis;
400 CTS.TTS.voices = CTS.TTS.synth.getVoices();
401 }
402 //ELEMENT DEFINE
403 MainElement = document.querySelector("tinychat-webrtc-app").shadowRoot;
404 ChatLogElement = MainElement.querySelector("tc-chatlog").shadowRoot;
405 VideoListElement = MainElement.querySelector("tc-videolist").shadowRoot;
406 MicrophoneElement = document.createEvent("MouseEvent");
407 SideMenuElement = MainElement.querySelector("tc-sidemenu").shadowRoot;
408 TitleElement = MainElement.querySelector("tc-title").shadowRoot;
409 UserListElement = SideMenuElement.querySelector("tc-userlist").shadowRoot;
410 ModerationListElement = SideMenuElement.querySelector("tc-video-moderation").shadowRoot;
411 ChatListElement = SideMenuElement.querySelector("tc-chatlist").shadowRoot;
412 UserContextElement = UserListElement.querySelector("tc-user-contextmenu").shadowRoot;
413 var insert = TitleElement.querySelector('span[title="Settings"]');
414 VideoListElement.querySelector("#videos-header").appendChild(insert);
415 //INSERT HTML/CSS
416 if (!CTS.Project.isTouchScreen) {
417 insert = VideoListElement.querySelector("#videos-footer-broadcast-wrapper");
418 VideoListElement.querySelector("#videolist").appendChild(insert);
419 VideoListElement.querySelector("#videos-footer").insertAdjacentHTML("afterbegin", "Media");
420 VideoListElement.querySelector("#videos-footer").insertAdjacentHTML("beforeend", '<div id="music-radio"><div class="music-radio-info"><div class="description">Playing: None<br>URL: None</div><div class="volume"></div></div><button class="music-radio-seek" onclick="SeekStation(this,-1);">←</button><button class="music-radio-seek" onclick="SeekStation(this,1);">→</button><button class="music-radio-playpause" onclick="PlayPauseStation(this);">▶</button><button class="music-radio-vol" onclick="VolStation(this,.05);">+</button><button class="music-radio-vol" style="top:50%" onclick="VolStation(this,-.05);">-</button></div><audio id="music-radio-audio" src="' + window.CTSRadioStations[0][1] + '"></audio>');
421 TitleCSS +="span[title=\"Follow\"], span[title=\"Share room\"]{display:none!important;}";
422 } else {
423 VideoCSS = "#videos-footer-broadcast{border-radius:unset!important;}#videos-footer-broadcast-wrapper > #videos-footer-submenu-button{border-radius:unset;}#videos-footer-push-to-talk{margin-left:0!important;border-radius:unset;}#videos-footer-youtube, #videos-footer-soundcloud{min-width:35px;border-radius:unset;margin-right: 0;}@media screen and (max-width: 600px){#videos-footer-broadcast, #videos-footer-broadcast-wrapper.hide-submenu > #videos-footer-broadcast {height:50px;line-height:50px;}#videos-footer{min-height: 50px;padding:0}}span[title=\"Settings\"]>svg{padding:7px 10px;height:24px;width:24px;}#videolist[data-mode=\"dark\"]{background-color:unset;}#videos-footer-broadcast-wrapper{display:contents;}.video:after{content: unset;border:unset;}#videos-header{padding:0;background:#181d1e;}.ctsdrop{position:fixed;display:inline-block;top:3px;left:4px;z-index:5;min-width: 46px;}.ctsdrop-content{position:absolute;top:28px;right:0;background:#181d1e;min-width:46px;width: 46px;padding:0;z-index:1;display:none;}.ctsdrop:hover .ctsdrop-content{display:block;}.ctsoptions:hover{background:#53b6ef}.ctsoptions{width:46px;height:28px;z-index: 2;cursor: pointer;top: 4px;background: #181d1e75;border: none;padding: 5% 0;display: inline-block;}";
424 MainCSS += "body{overflow:auto;}";
425 ContextMenuCSS = ".context.show{height:100%;}.context:after{content:unset;}.context>span{text-shadow:-1px 0 black,0 1px black,1px 0 black,0 -1px black;font:800 14px sans-serif;color:#FFFFFF;display:inline-block;padding:1px 1%;line-height:17px;height:17px;}.context{background:#101314;position:unset;padding:0;height:0;transition:.25s;}";
426 UserListCSS += "#contextmenu{top:unset;bottom:0;left:0;}";
427 }
428 ChatLogElement.querySelector("style").insertAdjacentHTML("beforeend", ChatboxCSS);
429 StyleSet();
430 document.body.querySelector("style").insertAdjacentHTML("beforeend", MainCSS);
431 MainElement.querySelector("style").insertAdjacentHTML("beforeend", RoomCSS);
432 VideoListElement.querySelector("style").insertAdjacentHTML("beforeend", NotificationCSS);
433 VideoListElement.querySelector("style").insertAdjacentHTML("beforeend", VideoCSS);
434 SideMenuElement.querySelector("style").insertAdjacentHTML("beforeend", SideMenuCSS);
435 UserListElement.querySelector("style").insertAdjacentHTML("beforeend", UserListCSS);
436 ChatListElement.querySelector("style").insertAdjacentHTML("beforeend", ChatListCSS);
437 ModerationListElement.querySelector("style").insertAdjacentHTML("beforeend", ModeratorCSS);
438 UserContextElement.querySelector("style").insertAdjacentHTML("beforeend", ContextMenuCSS);
439 TitleElement.querySelector("style").insertAdjacentHTML("beforeend", TitleCSS);
440 UserListElement.querySelector("#button-banlist").insertAdjacentHTML("beforebegin", "<span>1</span>");
441 VideoListElement.querySelector("#videos-header").insertAdjacentHTML("afterbegin", "<button style=\"display:"+((CTS.Project.isTouchScreen)?"none":"block")+"\" class=\"tcsettings\">⯇</button>");
442 VideoListElement.querySelector("#videos-content").insertAdjacentHTML("beforeend", '<div id="popup" class="PMOverlay"></div>');
443 VideoListElement.querySelector("#videolist").insertAdjacentHTML("afterbegin", '<div class="ctsdrop"><button class="ctsoptions" title="CTS Options"><img src="https://i.imgur.com/nvr9FjM.png" /></button><div class="ctsdrop-content"><div style="height:6px;background:#624482;"></div><button id="BackgroundUpdateRight" class="ctsoptions" title="Background"><img src="https://i.imgur.com/Zn97vqS.png" /></button><button id="BackgroundUpdateLeft" class="ctsoptions" title="Background"><img src="https://i.imgur.com/OAcfZRy.png" /></button><div style="height:6px;background:#624482;"></div><button id="FontSizeUpdate" class="ctsoptions" title="Font Size"><img src="https://i.imgur.com/eVc0N5A.png" /></button><div style="height:6px;background:#624482;"></div><button id="ChatColor" class="ctsoptions" title="Chat Style"><img src="https://i.imgur.com/62jpRbt.png" /></button><button id="CameraBorderToggled" class="ctsoptions" title="Camera Border"><img src="https://i.imgur.com/BXK3MR2.png" /></button><button id="FeaturedToggled" class="ctsoptions" title="YouTube/Featured Resize"><img src="https://i.imgur.com/u8mBZYJ.png" /></button>' + ((!CTS.ThemeChange) ? '<button id="ChatWidthToggled" class="ctsoptions" title="Chat Resize"><img src="https://i.imgur.com/G95jVFI.png" /></button><button id="ChatHeightToggled" class="ctsoptions" title="Chat Resize"><img src="https://i.imgur.com/AGc7mLN.png" /></button><div style="height:6px;background:#624482;"></div>' : '')+ '<button id="PerformanceModeToggled" class="ctsoptions" title="Performance Mode"><img src="https://i.imgur.com/qoKTU4y.png" /></button>' + ((!CTS.Project.isTouchScreen)?'<div style="height:6px;background:#624482;"></div><button id="ThemeChange" class="ctsoptions" title="Switch CTS Theme Mode"><img src="https://i.imgur.com/NF6U3Us.png" /></button></div></div>':''));
444 ChatLogElement.querySelector("#chat-position").insertAdjacentHTML("afterbegin", '<div id="notification-content"></div><button class="notifbtn">▼</button>');
445 ChatLogElement.querySelector("#chat").insertAdjacentHTML("beforeend", '<div id="cts-chat-content"></div>');
446 ChatLogElement.querySelector("#chat").insertAdjacentHTML("afterend", '<div class="cts-message-unread" style="display:none;">There are unread messages!</div>');
447 //SCRIPT INIT -> PREPARE()
448 clearInterval(CTS.ScriptLoading);
449 CTS.ScriptInit = true;
450 CTSRoomPrepare();
451 }
452
453 function CTSRoomPrepare() {
454 //FUNCTION BYPASS
455 window.TinychatApp.BLL.Videolist.prototype.blurOtherVids = function() {};
456 window.TinychatApp.BLL.SoundPlayer.playMessage = function() {};
457 window.TinychatApp.BLL.SoundPlayer.playGift = function() {};
458 window.TinychatApp.BLL.User.isSubscription = function() {return true;};
459 window.TinychatApp.BLL.User.canUseFilters = function() {return true;};
460 window.TinychatApp.BLL.MediaConnection.prototype.Close = function() {RTC(this);};
461 window.TinychatApp.BLL.ChatRoom.prototype.sendPushForUnreadPrivateMessage = function() {};
462 if (!CTS.Project.isTouchScreen) {
463 window.TinychatApp.BLL.ChatRoom.prototype.BroadcastStart = function(a) {
464 var b = this,
465 d = this.settings.getSettings();
466 if (d.video === null) {
467 return void this.app.MediaSettings(() => {
468 this.BroadcastStart();
469 });
470 }
471 this.videolist.AddingVideoSelf(this.self_handle);
472 var e = {};
473 if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {
474 e.audio = true;
475 e.video = {width: {min: 320,max: 4096},height: {min: 240,max: 2160},frameRate: {min: 15,ideal: 30,max: 60}};
476 } else {
477 navigator.mediaDevices.enumerateDevices().then(g => {
478 var h = false;
479 var len = g.length;
480 for (var c = 0; c < len; c++) {
481 if (g[c].kind === "videoinput") {
482 if (e.video === void 0) e.video = {width: {min: 320,max: 4096},height: {min: 240,max: 2160},frameRate: {min: 15,ideal: 30,max: 60}};
483 if (h) {
484 d.video = g[c];
485 h = false;
486 this.settings.saveSettings(d);
487 } else if (d.video === null) {
488 d.video = g[c];
489 this.settings.saveSettings(d);
490 } else if (d.video !== null && typeof d.video == "object" && d.video.deviceId == g[c].deviceId && d.video.deviceId !== a) {
491 e.video.deviceId = {
492 exact: d.video.deviceId
493 };
494 } else if (d.video.deviceId === a) {
495 h = true;
496 }
497 }
498 if (g[c].kind === "audioinput") {
499 if (e.audio === void 0) e.audio = {};
500 if (d.audio !== null && typeof d.audio == "object" && d.audio.deviceId == g[c].deviceId) {
501 e.audio = {
502 deviceId: {
503 exact: d.audio.deviceId
504 },
505 };
506 }
507 }
508 }
509 if (e.video !== null && d.video !== null && d.video.deviceId == b.id__miconly) delete e.video;
510 let i = navigator.mediaDevices.getSupportedConstraints();
511 for (let a in i) {
512 if (i.hasOwnProperty(a) && "echoCancellation" == a && e.audio) e.audio[a] = this.settings.isAcousticEchoCancelation();
513 }
514 if (!(e.audio || e.video)) {
515 b.onMediaFailedCallback(new Error("No media devices to start broadcast."));
516 } else if ("https:" === location.protocol || this.app.isDebug()) {
517 debug("BROADCAST", "Initiating Media...");
518 var m = new window.TinychatApp.BLL.BroadcastProgressEvent(window.TinychatApp.BLL.BroadcastProgressEvent.MEDIA_START);
519 this.EventBus.broadcast(window.TinychatApp.BLL.BroadcastProgressEvent.ID, m);
520 b.mediaLastConstraints = e;
521 navigator.mediaDevices.getUserMedia(e).then(m => {
522 b.onMediaSuccessCallback(m);
523 });
524 }
525 }).catch(er => {
526 debug("CAMERA::ERROR", er);
527 });
528 }
529 };
530 }
531 window.TinychatApp.BLL.Userlist.prototype.ignore = function(a) {
532 var b = a.isUsername ? a.username : a.nickname;
533 if (this.isIgnored(a) || this.ignored.push(b)) {
534 var c = new window.TinychatApp.BLL.IgnorelistUpdateUserEvent(a);
535 this.EventBus.broadcast(window.TinychatApp.BLL.IgnorelistUpdateUserEvent.ID, c);
536 this.app.showToast(b + " ignored successfully till they leave or you refresh!");
537 CTS.TempIgnoreList.push(b.toUpperCase());
538 Cameras();
539 }
540 };
541 window.TinychatApp.BLL.Userlist.prototype.unignore = function(a) {
542 var b = a.isUsername ? a.username : a.nickname,
543 len = this.ignored.length;
544 for (var TI = 0; TI < len; TI++) {
545 if (CTS.TempIgnoreList[TI] === b.toUpperCase()) {
546 this.ignored.splice(TI, 1);
547 break;
548 }
549 }
550 len = CTS.TempIgnoreList.length;
551 for (TI = 0; TI < len; TI++) {
552 if (CTS.TempIgnoreList[TI] === b.toUpperCase()) {
553 CTS.TempIgnoreList.splice(TI, 1);
554 break;
555 }
556 }
557 var e = new window.TinychatApp.BLL.IgnorelistUpdateUserEvent(a);
558 this.EventBus.broadcast(window.TinychatApp.BLL.IgnorelistUpdateUserEvent.ID, e);
559 this.app.showToast(a.username + " unignored");
560 };
561 //REMOVE
562 Remove(ChatLogElement, 'span[id="input-unread"]');
563 Remove(ChatLogElement, "#chat-content");
564 //PARAM REMOVE
565 if (CTS.enablePMs === false) Remove(ChatListElement, "#chatlist");
566 //LOAD
567 CTSRoomLoad();
568 }
569
570 function CTSRoomLoad() {
571 //EVENT LISTENERS
572 if (!CTS.ThemeChange) {
573 // BOOT UP OG THEME
574 var finishoff = false;
575 while (CTS.OGStyle.SavedHeight !== CTS.OGStyle.HeightCounter || CTS.OGStyle.SavedWidth !== CTS.OGStyle.WidthCounter) {
576 if (CTS.OGStyle.SavedHeight !== CTS.OGStyle.HeightCounter) {
577 ChatHeightToggled();
578 } else {
579 finishoff = true;
580 }
581 if (CTS.OGStyle.SaveWidth !== CTS.OGStyle.WidthCounter && finishoff) ChatWidthToggled();
582 }
583 VideoListElement.querySelector("#ChatHeightToggled").addEventListener("click", function() {
584 ChatHeightToggled();
585 Save("OGStyleHeight", CTS.OGStyle.HeightCounter);
586 }, {
587 passive: true
588 });
589 VideoListElement.querySelector("#ChatWidthToggled").addEventListener("click", function() {
590 ChatWidthToggled();
591 Save("OGStyleWidth", JSON.stringify(CTS.OGStyle.WidthCounter));
592 }, {
593 passive: true
594 });
595 } else {
596 if (!CTS.Project.isTouchScreen) {
597 ChatLogElement.querySelector("#chat-wider").insertAdjacentHTML("beforebegin", "<div id=\"chat-hide\"></div>");
598 ChatLogElement.querySelector("#chat-hide").addEventListener("click", function() {
599 ChatHide();
600 }, {
601 passive: true
602 });
603 }
604 }
605 if (!CTS.Project.isTouchScreen) {
606 ChatLogElement.querySelector("#chat-wrapper").insertAdjacentHTML("afterbegin", "<div id=\"chat-download\"></div>");
607 ChatLogElement.querySelector("#chat-download").addEventListener("click", function() {
608 var len = CTS.UserList.length,
609 t = "Users : "+len+"\n",
610 c;
611 for (c = 0; c < len; c++) {
612 if (c){ // 0 = false
613 t+= ", ";
614 if (c % 10 === 0) t += "\n";
615 }
616 t += CTS.UserList[c].username +" ("+CTS.UserList[c].nick+")";
617 }
618 t += "\n\n";
619 len = CTS.Message[CTS.ActiveMessage].length;
620 for (c = 0; c < len; c++) t += "["+CTS.Message[CTS.ActiveMessage][c].time+"]["+CTS.Message[CTS.ActiveMessage][c].username+"("+CTS.Message[CTS.ActiveMessage][c].nick+")]: "+(CTS.Message[CTS.ActiveMessage][c].msg.replace(/(\r\n|\n|\r)/gm,"")+"\n");
621 Download("TinyChat_"+CTS.Room.Name.toUpperCase()+" "+DateTime()+".log", "Room : "+CTS.Room.Name+"\n"+t);
622 }, {
623 passive: true
624 });
625 VideoListElement.querySelector("#ThemeChange").addEventListener("click", function() {
626 CTS.ThemeChange = !CTS.ThemeChange;
627 Save("ThemeChange", JSON.stringify(CTS.ThemeChange));
628 location.reload();
629 }, {
630 passive: true
631 });
632 }
633 VideoListElement.querySelector("#PerformanceModeToggled").addEventListener("click", function() {
634 if (CTS.ChatDisplay) {
635 CTS.PerformanceMode = !CTS.PerformanceMode;
636 PerformanceModeInit(CTS.PerformanceMode);
637 }
638 }, {
639 passive: true
640 });
641 VideoListElement.querySelector("#FeaturedToggled").addEventListener("click", function() {
642 CTS.Featured = !CTS.Featured;
643 Save("Featured", JSON.stringify(CTS.Featured));
644 FeaturedCameras(CTS.Featured);
645 Resize();
646 }, {
647 passive: true
648 });
649 VideoListElement.querySelector("#CameraBorderToggled").addEventListener("click", function() {
650 CTS.CameraBorderToggle = !CTS.CameraBorderToggle;
651 Save("CameraBorderToggle", JSON.stringify(CTS.CameraBorderToggle));
652 Cameras();
653 Resize();
654 }, {
655 passive: true
656 });
657 VideoListElement.querySelector("#ChatColor").addEventListener("click", function() {
658 CTS.ChatStyleCounter++;
659 Remove(VideoListElement, "style[id=\"" + (CTS.ChatStyleCounter - 1) + "\"]");
660 Remove(ChatLogElement, "style[id=\"" + (CTS.ChatStyleCounter - 1) + "\"]");
661 Remove(SideMenuElement, "style[id=\"" + (CTS.ChatStyleCounter - 1) + "\"]");
662 var len = window.CTSChatCSS.length - 1;
663 if (CTS.ChatStyleCounter > len) CTS.ChatStyleCounter = 0;
664 StyleSet();
665 Save("ChatStyle", CTS.ChatStyleCounter);
666 }, {
667 passive: true
668 });
669 ChatLogElement.querySelector(".cts-message-unread").addEventListener("click", function() {
670 UpdateScroll(1, true);
671 CheckUnreadMessage();
672 }, {
673 passive: true
674 });
675 ChatLogElement.querySelector("#chat").addEventListener("scroll", function(event) {
676 var element = event.target;
677
678 if (Math.floor(element.scrollTop + 50) >= (element.scrollHeight - element.offsetHeight)) CheckUnreadMessage(true);
679 }, {
680 passive: true
681 });
682 ChatLogElement.querySelector("#notification-content").addEventListener("scroll", function(event) {
683 var element = event.target;
684 if (Math.floor(element.scrollTop + 50) >= (element.scrollHeight - element.offsetHeight)) CTS.NotficationScroll = true;
685 }, {
686 passive: true
687 });
688 if (CTS.NotificationToggle === 0) {
689 ChatLogElement.querySelector(".notifbtn").addEventListener("click", NotificationResize, {
690 passive: true
691 });
692 }
693 VideoListElement.querySelector(".tcsettings").addEventListener("click", function(event) {
694 var arg;
695 if (this.innerText === "⯈") {
696 this.innerText = "⯇";
697 arg = "block";
698 } else {
699 this.innerText = "⯈";
700 arg = "none";
701 }
702 VideoListElement.querySelector("#videos-header-sound").style.display = arg;
703 if (CTS.Room.PTT === false) VideoListElement.querySelector("#videos-header-mic").style.display = arg;
704 //VideoListElement.querySelector("#videos-header-snapshot").style.display = arg;
705 VideoListElement.querySelector("#videos-header-fullscreen").style.display = arg;
706 VideoListElement.querySelector("span[title=\"Settings\"]").style.display = arg;
707 }, {
708 passive: true
709 });
710 VideoListElement.querySelector("button[id=\"BackgroundUpdateLeft\"]").addEventListener("click", function() {
711 if (!Addon.active("BGIMG")) {
712 CTS.MainBackgroundCounter++;
713 if (CTS.MainBackgroundCounter === window.CTSImages.length) CTS.MainBackgroundCounter = 0;
714 var background = "url(\"" + window.CTSImages[CTS.MainBackgroundCounter] + "\") rgb(0, 0, 0) no-repeat";
715 document.body.style.background = background;
716 Save("MainBackground", background);
717 }
718 }, {
719 passive: true
720 });
721 VideoListElement.querySelector("button[id=\"BackgroundUpdateRight\"]").addEventListener("click", function() {
722 if (!Addon.active("BGIMG")) {
723 CTS.MainBackgroundCounter--;
724 if (CTS.MainBackgroundCounter === -1) CTS.MainBackgroundCounter = window.CTSImages.length - 1;
725 var background = "url(\"" + window.CTSImages[CTS.MainBackgroundCounter] + "\") rgb(0, 0, 0) no-repeat";
726 document.body.style.background = background;
727 Save("MainBackground", background);
728 }
729 }, {
730 passive: true
731 });
732 VideoListElement.querySelector("button[id=\"FontSizeUpdate\"]").addEventListener("click", function() {
733 CTS.FontSize += 5;
734 if (CTS.FontSize >= 40) CTS.FontSize = 15;
735 Save("FontSize", CTS.FontSize);
736 ChatLogElement.querySelector("#textarea").style.fontSize = (CTS.FontSize - 4) + "px";
737 }, {
738 passive: true
739 });
740 //MUTATION OBSERVERS
741 new MutationObserver(function() {
742 LoadMessage();
743 }).observe(ChatLogElement.querySelector("#chat-instant"), {
744 attributes: true,
745 attributeFilter: ["class"],
746 childList: false,
747 characterData: false
748 });
749 new MutationObserver(function() {
750 Cameras();
751 }).observe(VideoListElement.querySelector(".videos-items:first-child"), {
752 childList: true
753 });
754 new MutationObserver(function() {
755 Cameras();
756 }).observe(VideoListElement.querySelector(".videos-items:last-child"), {
757 childList: true
758 });
759 new MutationObserver(function() {
760 if (CTS.AutoMicrophone) {
761 OpenMicrophone();
762 }
763 }).observe(VideoListElement.querySelector("#videos-footer-broadcast-wrapper"), {
764 attributes: true,
765 attributeFilter: ["class"]
766 });
767 //BOOT UP - FIRST START
768 NotificationDisplay();
769 FeaturedCameras(CTS.Featured);
770 Cameras();
771 }
772 //YOUTUBE FUNCTIONS
773 function CheckHost() {
774 if (CTS.Host === 0) {
775 Send("msg", "!whoisbot");
776 CTS.HostAttempt = 0;
777 CTS.HostWaiting = true;
778 }
779 }
780
781 function SetBot() {
782 if (arguments[0]) CTS.Game.NoReset = true;
783 Send("msg", "!bot");
784 CTS.HostWaiting = false;
785 }
786
787 function CheckYouTube() {
788 //CHECK YOUTUBE LINK VIA REGEX (NEARLY EVERY LINK ALLOWED SOME FORMATTING REQUIRED ON PLAYLIST)
789 if (arguments[3] === undefined) arguments[3] = true;
790 CTS.YouTube.XHR.type = arguments[1];
791 var videoid = arguments[0].match(/http(?:s)?(?:\:\/\/)(?:w{1,3}\.)?(?:youtu(?:\.be|be.com))(?:\/v\/|\/)?(?:watch\?|playlist\?|embed\/|user\/|v\/|\/)(list\=[a-z0-9\-\_]{1,34}|(?:v\=)?[a-z0-9\-\_]{1,11})/i);
792 if (videoid !== null) {
793 videoid = videoid[1].replace(/v\=/g, "");
794 //LINK IS PLAYLIST
795 if (videoid.match(/list\=/i)) {
796 if (arguments[3]) {
797 videoid = videoid.replace(/list\=/, "");
798 debug("YOUTUBE::PLAYLIST LINK GATHERER", videoid);
799 CTS.YouTube.XHR.open("GET", "https://www.googleapis.com/youtube/v3/playlistItems?playlistId=" + videoid + "&part=snippet&maxResults=25" + ((arguments[2] !== undefined) ? "&pageToken=" + arguments[2] : "") + "&type=video&eventType=completed&key=" + CTS.YouTube.API_KEY);
800 CTS.YouTube.XHR.send();
801 }
802 } else {
803 //LINK IS REGULAR
804 CTS.YouTube.XHR.videoid = videoid;
805 CTS.YouTube.VideoReturn = true;
806 CTS.YouTube.XHR.open("GET", "https://www.googleapis.com/youtube/v3/videos?id=" + CTS.YouTube.XHR.videoid + "&type=video&eventType=completed&part=contentDetails,snippet&fields=items/snippet/title,items/snippet/thumbnails/medium,items/contentDetails/duration&eventType=completed&key=" + CTS.YouTube.API_KEY);
807 CTS.YouTube.XHR.send();
808 debug("YOUTUBE::LINK SEARCH", CTS.YouTube.XHR.videoid);
809 }
810 } else {
811 //KEYWORD SEARCH
812 if (CTS.YouTube.MessageQueueList.length <= 0) {
813 arguments[0] = arguments[0].replace(/^(!yt )/, "");
814 CTS.YouTube.SearchReturn = true;
815 CTS.YouTube.XHR.open("GET", "https://www.googleapis.com/youtube/v3/search?key=" + CTS.YouTube.API_KEY + "&maxResults=1&q=" + encodeURI(arguments[0]) + "&type=video&part=snippet");
816 CTS.YouTube.XHR.send();
817 debug("YOUTUBE::KEYWORD SEARCH", arguments[0]);
818 }
819 }
820 }
821
822 function YouTubePlayList() {
823 CTS.YouTube.ShowQueue = (arguments[0] !== undefined) ? true : false;
824 if ((!CTS.YouTube.Playing && CTS.Host == CTS.Me.handle) || CTS.YouTube.Clear === true || CTS.YouTube.ShowQueue === true) Send("yut_playlist");
825 }
826
827 function YouTubeTrackAdd() {
828 if (CTS.YouTube.MessageQueueList[0] !== undefined) {
829 if (CTS.YouTube.Busy === false) {
830 if (CTS.YouTube.MessageQueueList.length > 0) {
831 debug("YOUTUBE::ID", CTS.YouTube.MessageQueueList[0].snippet.resourceId.videoId);
832 CTS.YouTube.XHR.open("GET", "https://www.googleapis.com/youtube/v3/videos?id=" + CTS.YouTube.MessageQueueList[0].snippet.resourceId.videoId + "&type=video&eventType=completed&part=contentDetails,snippet&fields=items/snippet/title,items/snippet/thumbnails/medium,items/contentDetails/duration&eventType=completed&key=" + CTS.YouTube.API_KEY);
833 CTS.YouTube.XHR.videoid = CTS.YouTube.MessageQueueList[0].snippet.resourceId.videoId;
834 CTS.YouTube.XHR.send();
835 CTS.YouTube.MessageQueueList.shift();
836 }
837 }
838 }
839 }
840
841 function YouTubePlayListItems() {
842 var len = arguments[0].length;
843 for (var i = 0; i < len; i++) {
844 if (CTS.YouTube.NotPlayable.includes(arguments[0][i].snippet.title) === false) {
845 CTS.YouTube.MessageQueueList.push(arguments[0][i]);
846 }
847 }
848 }
849
850 function YouTubeTimeConvert() {
851 //TIME CONVERSION FOR APPROPRIATE YOUTUBE DURATION TO SEND BACK
852 var a = arguments[0].match(/\d+/g);
853 if (arguments[0].indexOf("M") >= 0 && arguments[0].indexOf("H") == -1 && arguments[0].indexOf("S") == -1) a = [0, a[0], 0];
854 if (arguments[0].indexOf("H") >= 0 && arguments[0].indexOf("M") == -1) a = [a[0], 0, a[1]];
855 if (arguments[0].indexOf("H") >= 0 && arguments[0].indexOf("M") == -1 && arguments[0].indexOf("S") == -1) a = [a[0], 0, 0];
856 var len = a.length;
857 arguments[0] = 0;
858 if (len == 3) {
859 arguments[0] = arguments[0] + parseInt(a[0]) * 3600;
860 arguments[0] = arguments[0] + parseInt(a[1]) * 60;
861 arguments[0] = arguments[0] + parseInt(a[2]);
862 }
863 if (len == 2) {
864 arguments[0] = arguments[0] + parseInt(a[0]) * 60;
865 arguments[0] = arguments[0] + parseInt(a[1]);
866 }
867 if (len == 1) arguments[0] = arguments[0] + parseInt(a[0]);
868 return arguments[0];
869 }
870
871 function BotCommandCheck() {
872 //USER COMMANDS TO HOST
873 if (isCommand(arguments[1])) {
874 if (arguments[1].match(/^!whoisbot$/i)) BotCommand(5, arguments[0]);
875 if (arguments[1].match(/^!vote\s/i)) Vote(arguments[0], arguments[1]);
876 // PUBLIC COMMANDS
877 if (CTS.PublicCommandToggle) {
878 if (arguments[1].match(/^!8ball\s.*\??/i)) Send("msg", "[8BALL]\n" + window.CTSEightBall[Rand(0, window.CTSEightBall.length - 1)]);
879 if (arguments[1].match(/^!coin$/i)) Send("msg", "[COIN FLIP]\nThe coin landed on " + ((Rand(0, 1) == 1) ? "heads" : "tails") + "!");
880 if (arguments[1].match(/^!chuck$/i)) Chuck();
881 if (arguments[1].match(/^!urb\s/i)) Urb(arguments[1]);
882 if (arguments[1].match(/^!dad$/i)) Dad();
883 if (arguments[1].match(/^!advice$/i)) Advice();
884 }
885 //MOD/JR.MOD
886 if (CTS.BotModList.includes(CTS.UserList[arguments[0]].username) || CTS.UserList[arguments[0]].mod) {
887 if (arguments[1].match(/^!kick\s/i)) ModCommand("kick", arguments[1]);
888 if (arguments[1].match(/^!ban\s/i)) ModCommand("ban", arguments[1]);
889 if (arguments[1].match(/^!close\s/i)) ModCommand("stream_moder_close", arguments[1]);
890 }
891 //ROOM IS PAID AND YOUTUBE IS ONLINE (TC SET)
892 if (CTS.Room.YT_ON) {
893 if (arguments[1].match(/^!play$/i)) YouTubePlayList();
894 if (arguments[1].match(/^!yt\s/i)) BotCommand(1, arguments[0], arguments[1]);
895 if (arguments[1].match(/^!ytbypass\s/i)) BotCommand(6, arguments[0], arguments[1]);
896 if (arguments[1].match(/^!ytclear$/i)) BotCommand(2, arguments[0]);
897 if (arguments[1].match(/^!ytskip$/i)) BotCommand(3, arguments[0]);
898 if (arguments[1].match(/^!ytqueue$/i)) BotCommand(4, arguments[0]);
899 }
900 }
901 //USER CAN GAME THEY'VE BEEN VERIFIED
902 if (CTS.UserList[arguments[0]].canGame) FishCommandCheck(arguments[0], arguments[1]);
903 }
904
905 function BotCheck() {
906 if (CTS.UserList[arguments[0]].mod) {
907 //CHECK HOST
908 if (arguments[1].match(/^!bot$/i)) {
909 //SET HOST
910 CTS.Host = arguments[2].handle;
911 CTS.HostWaiting = false;
912 //RESET GAMES
913 if (CTS.Host != CTS.Me.handle && CTS.Game.NoReset) CTS.Game.NoReset = false;
914 if (arguments[2].handle === CTS.Host && CTS.HostWaiting === false && !CTS.Game.NoReset) {
915 if (CTS.Me.handle !== arguments[2].handle) {
916 CTS.Game.NoReset = false;
917 Fish.reset(true);
918 }
919 }
920 //IF CLIENT(ME) BECOMES HOST CHECK YOUTUBE IF ENABLED
921 if (CTS.Me.handle == arguments[2].handle && CTS.Room.YT_ON) YouTubePlayList();
922 //ELSE KEEP ON UNLESS HOSTWAITING (!WHOISBOT)
923 } else if (CTS.HostWaiting === true) {
924 CTS.HostAttempt++;
925 //SET BOT IF NO RESPONSE IN 10 MESSAGES or 10 SECONDS
926 if (CTS.HostAttempt == 1) {
927 setTimeout(function() {
928 //CHECK WAITING STATE OR IF HOST HAS CHANGED
929 if (CTS.HostWaiting === true && CTS.Host === 0) SetBot(false);
930 }, 10000);
931 }
932 //SETS BOT FORCEFULLY ON 10 MESSAGES CANCELING TIMER EVENT WHEN IT QUEUES
933 if (CTS.HostAttempt == 10) SetBot(false);
934 }
935 }
936 }
937
938 function Chuck() {
939 //OPEN REQUEST
940 CTS.Chuck.XHR.open("GET", "https://api.chucknorris.io/jokes/random");
941 CTS.Chuck.XHR.send();
942 }
943
944 function Urb() {
945 //CHECK TERM
946 var urban = arguments[0].match(/\!urb\s(.*)/i);
947 if (urban !== null) {
948 //OPEN REQUEST
949 CTS.Urb.XHR.open("GET", "https://api.urbandictionary.com/v0/define?term=" + urban[1]);
950 CTS.Urb.XHR.send();
951 }
952 }
953
954 function Dad() {
955 //OPEN REQUEST
956 CTS.Dad.XHR.open("GET", "https://icanhazdadjoke.com/");
957 CTS.Dad.XHR.setRequestHeader("Accept", "application/json");
958 CTS.Dad.XHR.send();
959 }
960
961 function Advice() {
962 //OPEN REQUEST
963 CTS.Advice.XHR.open("GET", "https://api.adviceslip.com/advice");
964 CTS.Advice.XHR.setRequestHeader("Accept", "application/json");
965 CTS.Advice.XHR.send();
966 }
967 //MESSAGE FUNCTION
968 function CreateMessage() {
969 //SCROLLED UP? MISSED A MESSAGE?
970 CheckUnreadMessage();
971 // POST NEW CHAT ITEM AND IF ACTIVECHAT IS OUR CURRENT
972 if (arguments[7] == GetActiveChat()) ChatLogElement.querySelector("#cts-chat-content").insertAdjacentHTML("beforeend", "<div class=\"message" + ((CTS.Avatar) ? " common " : " ") + ((CTS.HighlightList.includes(arguments[3]) || arguments[6]) ? "highlight" : "") + "\" " + ((arguments[2] === "") ? "style=\"padding-left:3px;\"" : "") + ">" + ((arguments[2]=="")?"":((CTS.Avatar) ? "<a href=\"#\" class=\"avatar\"><div><img src=\"" + arguments[2] + "\"></div></a>" : "")) + "<div class=\"nickname\" style=\"background:" + arguments[1] + ";\">" + arguments[4] + (CTS.TimeStampToggle ? "<div class=\"ctstime\"> " + arguments[0] + " </div>" : "") + "</div><div class=\"content\"><cts-message-html><span id=\"html\" class=\"message common\"style=\"font-size:" + CTS.FontSize + "px;\">" + arguments[5] + "</span></CTS-message-html></div></div>");
973 //CHAT CLEANUP
974 var Chat = ChatLogElement.querySelectorAll("#cts-chat-content>.message");
975 var len = Chat.length;
976 if (len > CTS.ChatLimit + 50) {
977 CTS.ChatScroll = true;
978 //REMOVE 50 MESSAGES (CAN BE DONE CLEANER BUT NO BIG DEAL FOR OUR USE)
979 len = Chat.length - CTS.ChatLimit;
980 var ChatIndex = 0;
981 for (ChatIndex; ChatIndex < len; ChatIndex++) {
982 Chat[ChatIndex].parentNode.removeChild(Chat[ChatIndex]);
983 CTS.Message[arguments[7]].shift();
984 //CLEANING TC ITEMS THAT FILL UP OVERTIME
985 window.TinychatApp.getInstance().defaultChatroom._chatlog.items = [];
986 }
987 }
988 UpdateScroll(1, false);
989 }
990
991 function AKB() {
992 //WATCH OR REMOVE USERS
993 if ((CTS.AutoKick === false && CTS.AutoBan === false) && arguments[0] === true) {
994 CTS.WatchList.push([arguments[2], arguments[1], new Date()]);
995 debug("WATCHLIST::ADDED", arguments[2] + ":" + arguments[1]);
996 } else {
997 if (CTS.Me.mod) {
998 if (CTS.AutoKick === true) {
999 CTS.NoGreet = true;
1000 Send("kick", arguments[1]);
1001 } else if (CTS.AutoBan === true) {
1002 CTS.NoGreet = true;
1003 Send("ban", arguments[1]);
1004 }
1005 }
1006 }
1007 }
1008
1009 function AKBS() {
1010 if (arguments[0].username !== "") {
1011 //EXTENDED SAFELIST
1012 var temp = [];
1013 if (Addon.active("AKB")) temp = Addon.get("AKB");
1014 //DEFAULT SAFELIST
1015 if (!isSafeListed(arguments[0].username.toUpperCase())) {
1016 if (arguments[0].giftpoints > 0 || arguments[0].subscription > 0 || arguments[0].mod === true) {
1017 if (CTS.SafeList.length < 2500) {
1018 CTS.SafeList.push(arguments[0].username.toUpperCase());
1019 Save("AKB", JSON.stringify(CTS.SafeList));
1020 debug("SAFELIST::ADDED", arguments[0].username.toUpperCase() + ":" + arguments[0].handle);
1021 }
1022 } else {
1023 if (arguments[0].lurker === false) {
1024 AKB(true, arguments[0].handle, arguments[0].username.toUpperCase());
1025 } else {
1026 AKB(false, arguments[0].handle);
1027 }
1028 }
1029 }
1030 } else {
1031 AKB(false, arguments[0].handle);
1032 }
1033 }
1034
1035 function CheckSafeList() {
1036 var target = User(arguments[0]);
1037 if (target !== -1) {
1038 var a = CTS.SafeList.indexOf(CTS.UserList[target].username);
1039 if (a !== -1) {
1040 //REMOVE
1041 if (arguments[1]) {
1042 debug("SAFELIST::", "REMOVE USER " + CTS.UserList[target].username + " FROM SAFELIST");
1043 Alert(GetActiveChat(), "?Removing "+CTS.UserList[target].username+" from safelist!");
1044 CommandList.saferemove(a);
1045 } else {
1046 //GETID
1047 return a;
1048 }
1049 }
1050 }
1051 }
1052
1053 function LoadMessage() {
1054 var ChatIndex, index, Chat = ChatLogElement.querySelector("#cts-chat-content");
1055 CTS.ChatScroll = true;
1056 if (!CTS.MessageCallback[CTS.ActiveMessage]) CTS.MessageCallback[CTS.ActiveMessage] = [];
1057 CTS.MessageCallback[CTS.ActiveMessage].html = Chat.innerHTML;
1058 CTS.MessageCallback[CTS.ActiveMessage].len = (Chat.innerHTML === "") ? 0 : CTS.Message[CTS.ActiveMessage].length;
1059 Chat.innerHTML = "";
1060 CheckUnreadMessage();
1061 CTS.ActiveMessage = GetActiveChat();
1062 if (CTS.Message[CTS.ActiveMessage]) {
1063 index = (CTS.MessageCallback[CTS.ActiveMessage]) ? CTS.MessageCallback[CTS.ActiveMessage].len : 0;
1064 if (index > 0) Chat.innerHTML = CTS.MessageCallback[CTS.ActiveMessage].html;
1065 var len = CTS.Message[CTS.ActiveMessage].length;
1066 for (ChatIndex = index; ChatIndex < len; ChatIndex++) ChatLogElement.querySelector("#cts-chat-content").insertAdjacentHTML("beforeend", "<div class=\"message" + ((CTS.Avatar) ? " common " : " ") + ((CTS.HighlightList.includes(CTS.Message[CTS.ActiveMessage][ChatIndex].username) || CTS.Message[CTS.ActiveMessage][ChatIndex].mention) ? "highlight" : "") + "\" " + ((CTS.Message[CTS.ActiveMessage][ChatIndex].avatar === "") ? "style=\"padding-left:3px;\"" : "") + ">" + ((CTS.Avatar) ? "<a href=\"#\" class=\"avatar\"><div><img src=\"" + (CTS.Message[CTS.ActiveMessage][ChatIndex].avatar) + "\"></div></a>" : "") + "<div class=\"nickname\" style=\"-webkit-box-shadow: 0 0 6px " + CTS.Message[CTS.ActiveMessage][ChatIndex].namecolor + ";box-shadow: 0 0 6px " + CTS.Message[CTS.ActiveMessage][ChatIndex].namecolor + ";background:" + CTS.Message[CTS.ActiveMessage][ChatIndex].namecolor + ";\">" + CTS.Message[CTS.ActiveMessage][ChatIndex].nick + (CTS.TimeStampToggle ? "<div class=\"ctstime\"> " + CTS.Message[CTS.ActiveMessage][ChatIndex].time + " </div>" : "") + "</div><div class=\"content\"><cts-message-html><span id=\"html\" class=\"message common\" style=\"font-size:" + CTS.FontSize + "px;\">" + CTS.Message[CTS.ActiveMessage][ChatIndex].msg + "</span></CTS-message-html></div></div>");
1067 } else {
1068 CTS.Message[CTS.ActiveMessage] = [];
1069 }
1070 UpdateScroll(1, false);
1071 UpdateScroll(2, false);
1072 }
1073
1074 function CheckUnreadMessage() {
1075 if ((Math.floor(ChatLogElement.querySelector("#chat").scrollTop + 50) >= (ChatLogElement.querySelector("#chat").scrollHeight - ChatLogElement.querySelector("#chat").offsetHeight)) || arguments[0] !== undefined) {
1076 CTS.MissedMsg = 0;
1077 CTS.ChatScroll = true;
1078 ChatLogElement.querySelector(".cts-message-unread").style.display = "none";
1079 } else {
1080 CTS.MissedMsg++;
1081 CTS.ChatScroll = false;
1082 ChatLogElement.querySelector(".cts-message-unread").style.display = "block";
1083 ChatLogElement.querySelector(".cts-message-unread").innerHTML = "There are " + CTS.MissedMsg + " unread message(s)!";
1084 }
1085 }
1086
1087 function GetActiveChat() {
1088 var elem = ChatListElement.querySelector(".active");
1089 if (elem) return elem.getAttribute("data-chat-id");
1090 return 0;
1091 }
1092
1093 function CheckImgur() {
1094 if (CTS.imgur) {
1095 var i = arguments[0].match(/https?:\/\/i\.imgur\.com\/[a-zA-Z0-9]*\.(jpeg|jpg|gif|png|mp4)/);
1096 if (i !== null) {
1097 arguments[0] = (i[1] == "mp4") ? "<center>(Video Below)\n<video onclick=\"if (this.paused) {this.play();}else{this.pause();}\" oncontextmenu=\"return false;\" width=\"288px\" height=\"162px\"><source src=\"" + i[0] + "\" type=\"video/mp4\" /><source src=\"https://i.imgur.com/qLOIgom.mp4\" type=\"video/mp4\" /></video>\n<a href=\"" + i[0] + "\" target=\"_blank\">Direct Link</a></center>" : "<center><img src=\"" + i[0] + "\" width=\"320px\" height=\"240px\" />\n<a href=\"" + i[0] + "\" target=\"_blank\">Direct Link</a></center>";
1098 }
1099 }
1100 return arguments[0];
1101 }
1102
1103 function TTS() {
1104 var utter = new window.SpeechSynthesisUtterance(arguments[0]);
1105 utter.voice = CTS.TTS.voices[0];
1106 utter.rate = 1.0;
1107 utter.pitch = 0.5;
1108 CTS.TTS.synth.speak(utter);
1109 }
1110
1111 function isCommand() {
1112 return arguments[0].match(/^!/);
1113 }
1114
1115 function RoomUsers() {
1116 if (CTS.ScriptInit) UserListElement.querySelector("#header>span>span").innerText = " : " + CTS.UserList.length;
1117 }
1118
1119 function SpamPrevention() {
1120 var LineBreaks = (arguments[0].match(/\n|\r/g) || []).length;
1121 if (LineBreaks >= 14 && arguments[1] === false) return true;
1122 return false;
1123 }
1124
1125 function GamePrevention() {
1126 if (!CTS.CanSeeGames && arguments[1] && arguments[0].match(/^\[(?:FISHING\sBOAT)\]/i)) return false;
1127 return true;
1128 }
1129
1130 function UpdateScroll() {
1131 if (arguments[0] === 1 && (CTS.ChatScroll || arguments[1] === true)) ChatLogElement.querySelector("#chat").scrollTop = ChatLogElement.querySelector("#chat").scrollHeight;
1132 if (arguments[0] === 2 && (CTS.NotificationScroll || arguments[1] === true) && CTS.NotificationToggle == 0) ChatLogElement.querySelector("#notification-content").scrollTop = ChatLogElement.querySelector("#notification-content").scrollHeight;
1133 }
1134
1135 function DecodeTXT() {
1136 var txt = document.createElement("textarea");
1137 txt.innerHTML = arguments[0];
1138 return txt.value;
1139 }
1140
1141 function HTMLtoTXT() {
1142 var p = document.createElement("p");
1143 p.appendChild(document.createTextNode(arguments[0]));
1144 return p.innerHTML.replace(/(?:(?:(?:https?|ftps?):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?/igm, "<a href=\"$&\" target=\"_blank\">$&</a>").replace(/[\u2680-\u2685]/g, "<span style=\"font-size:275%;\">$&</span>").replace(/\n|\r/g,"<br>");
1145 }
1146
1147 function IgnoreText() {
1148 if (arguments[0] !== "") {
1149 if (arguments[0].match(/^(\r|\n|\s).*/)) return false;
1150 return true;
1151 }
1152 }
1153
1154 function TimeToDate() {
1155 if (arguments[1] === undefined) arguments[1] = new Date();
1156 var match = arguments[0].trim().match(/(\d+):(\d+)\s?((am|AM|aM|Am)|(pm|PM|pM|Pm))/);
1157 var t = {
1158 hours: parseInt(match[1]),
1159 minutes: parseInt(match[2]),
1160 period: match[3].toLowerCase()
1161 };
1162 if (t.hours === 12) {
1163 if (t.period === "am") arguments[1].setHours(t.hours - 12, t.minutes, 0);
1164 if (t.period === "pm") arguments[1].setHours(t.hours, t.minutes, 0);
1165 } else {
1166 if (t.period === "am") arguments[1].setHours(t.hours, t.minutes, 0);
1167 if (t.period === "pm") arguments[1].setHours(t.hours + 12, t.minutes, 0);
1168 }
1169 return arguments[1];
1170 }
1171
1172 function PushPM() {
1173 var list = (arguments[2] !== undefined) ? CTS.UserList[arguments[2]] : CTS.Me;
1174
1175 CTS.Message[arguments[0]].push({
1176 "time": Time(),
1177 "namecolor": list.namecolor,
1178 "avatar": list.avatar,
1179 "username": list.username,
1180 "nick": list.nick,
1181 "msg": CheckImgur(HTMLtoTXT(arguments[1])),
1182 "mention": false
1183 });
1184
1185 if (arguments[0] == GetActiveChat()) {
1186 var msg = CTS.Message[arguments[0]][CTS.Message[arguments[0]].length - 1];
1187 CreateMessage(msg.time, list.namecolor, list.avatar, list.username, list.nick, msg.msg, msg.mention, arguments[0]);
1188 UpdateScroll(1, false);
1189 }
1190 }
1191
1192 function Time() {
1193 return (new Date().toLocaleString("en-US", {
1194 hour: "numeric",
1195 minute: "numeric",
1196 second: "numeric",
1197 hour12: true
1198 }));
1199 }
1200 function DateTime() {
1201 return (new Date().toLocaleString("en-US", {
1202 year: 'numeric',
1203 month: 'numeric',
1204 day: 'numeric',
1205 hour: "numeric",
1206 minute: "numeric",
1207 second: "numeric",
1208 hour12: true
1209 }));
1210 }
1211 //FEATURES
1212 function Download() {
1213 var element = document.createElement('a');
1214 element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(arguments[1]));
1215 element.setAttribute('download', arguments[0]);
1216 element.style.display = 'none';
1217 document.body.appendChild(element);
1218 element.click();
1219 document.body.removeChild(element);
1220 }
1221
1222 function StyleSet() {
1223 var style = document.createElement('style');
1224 style.setAttribute('id', CTS.ChatStyleCounter);
1225 style.innerHTML = window.CTSChatCSS[CTS.ChatStyleCounter][0]+":host, #videolist {background-color:unset;}";
1226 ChatLogElement.appendChild(style);
1227
1228 style = document.createElement('style');
1229 style.setAttribute('id', CTS.ChatStyleCounter);
1230 style.innerHTML = window.CTSChatCSS[CTS.ChatStyleCounter][1]+":host, #videolist {background-color:unset;}";
1231 VideoListElement.appendChild(style);
1232
1233 style = document.createElement('style');
1234 style.setAttribute('id', CTS.ChatStyleCounter);
1235 style.innerHTML = window.CTSChatCSS[CTS.ChatStyleCounter][2]+":host, #videolist {background-color:unset;}";
1236 SideMenuElement.appendChild(style);
1237 }
1238
1239 function ChatHeightToggled() {
1240 CTS.OGStyle.HeightCounter++;
1241 if (!CTS.ChatDisplay) {
1242 CTS.ChatWidth += 5;
1243 CTS.ChatDisplay = true;
1244 }
1245 CTS.ChatHeight -= 5;
1246 CTS.UserListDisplay = true;
1247 if (CTS.ChatHeight == 20) {
1248 CTS.ChatHeight = 45;
1249 CTS.UserListDisplay = false;
1250 CTS.OGStyle.HeightCounter = 0;
1251 }
1252
1253 ChatLogElement.querySelector("#chat-wrapper").style.cssText = "min-width:400px;width:calc(400px + " + CTS.ChatWidth + "%);max-width:calc(400px + " + CTS.ChatWidth + "%);" + (CTS.UserListDisplay ? "top:unset;min-height:calc(100% - " + CTS.ChatHeight + "% - 119px)!important;max-height:calc(100% - " + CTS.ChatHeight + "% - 119px)!important;" : "bottom:0;min-height:calc(100% - 120px)!important;max-height: calc(100% - 120px)!important;");
1254 TitleElement.querySelector("#room-header").style.cssText = "min-width:400px;width:calc(400px + " + CTS.ChatWidth + "%);max-width:calc(400px + " + CTS.ChatWidth + "%)!important;top:" + (CTS.UserListDisplay ? "calc(" + CTS.ChatHeight + "% + 84px);" : "84px;");
1255 VideoListElement.querySelector("#videos-footer-broadcast-wrapper").style.cssText = "bottom:unset;min-width:400px;width:calc(400px + " + CTS.ChatWidth + "%);max-width:calc(400px + " + CTS.ChatWidth + "%);top:" + (CTS.UserListDisplay ? "calc(" + CTS.ChatHeight + "% + 34px);" : "unset;top:34px;");
1256 VideoListElement.querySelector("#videos-header").style.cssText = !CTS.UserListDisplay ? "top:0;right: 54px;" : "bottom:unset;top:" + CTS.ChatHeight + "%;";
1257 SideMenuElement.querySelector("#sidemenu").style.cssText = !CTS.UserListDisplay ? "display:none" : "min-width:400px;width:calc(400px + " + CTS.ChatWidth + "%);max-width:calc(400px + " + CTS.ChatWidth + "%)!important;height:" + CTS.ChatHeight + "%!important;";
1258 UserListElement.querySelector("#button-banlist").style.cssText = "top:calc(" + CTS.ChatHeight + "% + 89px);";
1259 document.querySelector("#content").style.cssText = "width:calc(100% " + (CTS.ChatDisplay ? "- (400px + " + CTS.ChatWidth + "%)" : "") + ")";
1260 VideoListElement.querySelector("#videos-footer").style.cssText = "display:block;top:" + (CTS.UserListDisplay ? "calc(" + CTS.ChatHeight + "% + 119px);" : "119px;") + "right:-70px;display:block;";
1261 PerformanceModeInit(CTS.PerformanceMode);
1262 UpdateScroll(1, true);
1263 UpdateScroll(2, true);
1264 Resize();
1265 }
1266
1267 function ChatWidthToggled() {
1268 CTS.OGStyle.WidthCounter++;
1269 CTS.ChatWidth += 5;
1270 CTS.ChatDisplay = true;
1271 if (CTS.ChatWidth == 25) {
1272 CTS.ChatWidth = -5;
1273 CTS.ChatDisplay = false;
1274 CTS.OGStyle.WidthCounter = 0;
1275 }
1276 ChatLogElement.querySelector("#chat-wrapper").style.cssText = (!CTS.ChatDisplay) ? "display:none" : "min-width:400px;width:calc(400px + " + CTS.ChatWidth + "%);max-width:calc(400px + " + CTS.ChatWidth + "%);" + ((CTS.UserListDisplay) ? "top:unset;min-height:calc(100% - " + CTS.ChatHeight + "% - 119px)!important;max-height:calc(100% - " + CTS.ChatHeight + "% - 119px)!important;" : "bottom:0;;min-height:calc(100% - 120px)!important;max-height: calc(100% - 120px)!important;");
1277 TitleElement.querySelector("#room-header").style.cssText = (!CTS.ChatDisplay) ? "display:none" : "min-width:400px;width:calc(400px + " + CTS.ChatWidth + "%);max-width:calc(400px + " + CTS.ChatWidth + "%)!important;top:" + ((CTS.UserListDisplay) ? "calc(" + CTS.ChatHeight + "% + 84px);" : "84px;");
1278 VideoListElement.querySelector("#videos-footer-broadcast-wrapper").style.cssText = (!CTS.ChatDisplay) ? "bottom:0;top:unset;width:100%;position:relative;" : "bottom:unset;min-width:400px;width:calc(400px + " + CTS.ChatWidth + "%);max-width:calc(400px + " + CTS.ChatWidth + "%);top:" + ((CTS.UserListDisplay) ? "calc(" + CTS.ChatHeight + "% + 34px);" : "34px;bottom:unset;");
1279 VideoListElement.querySelector("#videos-header").style.cssText = (!CTS.ChatDisplay) ? "display:none" : ((CTS.UserListDisplay) ? "bottom:unset;top:" + CTS.ChatHeight + "%;" : "bottom:unset;top: 0;right: 54px;");
1280 SideMenuElement.querySelector("#sidemenu").style.cssText = (!CTS.ChatDisplay || !CTS.UserListDisplay) ? "display:none" : "min-width:400px;width:calc(400px + " + CTS.ChatWidth + "%);max-width:calc(400px + " + CTS.ChatWidth + "%)!important;height:" + CTS.ChatHeight + "%!important;";
1281 UserListElement.querySelector("#button-banlist").style.cssText = (!CTS.ChatDisplay) ? "display:none" : "top:calc(" + CTS.ChatHeight + "% + 89px);";
1282 document.querySelector("#content").style.cssText = "width:calc(100% " + ((CTS.ChatDisplay) ? "- (400px + " + CTS.ChatWidth + "%)" : "") + ")";
1283 VideoListElement.querySelector("#videos-footer").style.cssText = "display:block;top:" + ((CTS.UserListDisplay) ? "calc(" + CTS.ChatHeight + "% + 119px);" : "119px;") + "right:-70px;display:block;";
1284 CTS.PerformanceMode = false;
1285 PerformanceModeInit(CTS.PerformanceMode);
1286 UpdateScroll(1, true);
1287 UpdateScroll(2, true);
1288 Resize();
1289 }
1290
1291 function ChatHide() {
1292 CTS.NormalStyle.ChatHide = !CTS.NormalStyle.ChatHide;
1293 ChatLogElement.querySelector("#chat-wrapper").style.display = (CTS.NormalStyle.ChatHide ? "none" : "block");
1294 UpdateScroll(1, true);
1295 UpdateScroll(2, true);
1296 Resize();
1297 }
1298
1299 function SoundMeter() {
1300 //MICROPHONE INDICATOR
1301 setTimeout(function() {
1302 var Camera = VideoListElement.querySelectorAll(".videos-items tc-video-item"),
1303 Featured = VideoListElement.querySelectorAll(".videos-items:first-child tc-video-item"),
1304 TCCameraList = window.TinychatApp.getInstance().defaultChatroom._videolist.items.length,
1305 CameraLen = Camera.length,
1306 users;
1307 if (Featured.length > 0) {
1308 for (var x = 0; x < TCCameraList; x++) {
1309 if (CameraLen < 1) break;
1310 for (users = 0; users < CameraLen; users++) {
1311 if (Camera[users].shadowRoot.querySelector(".video > div > video").getAttribute("data-video-id") == window.TinychatApp.getInstance().defaultChatroom._videolist.items[x].userentity.path) {
1312 Camera[users].shadowRoot.querySelector(".video > div > .overlay").setAttribute("data-mic-level", window.TinychatApp.getInstance().defaultChatroom._videolist.items[x].audiolevel);
1313 Camera[users].shadowRoot.querySelector(".video > div > svg").setAttribute("data-mic-level", 0);
1314 break;
1315 }
1316 }
1317 }
1318 } else {
1319 for (users = 0; users < CameraLen; users++) {
1320 Camera[users].shadowRoot.querySelector(".video > div > .overlay").setAttribute("data-mic-level", window.TinychatApp.getInstance().defaultChatroom._videolist.items[users].audiolevel);
1321 Camera[users].shadowRoot.querySelector(".video > div > svg").setAttribute("data-mic-level", 0);
1322 }
1323 }
1324 //REPEAT
1325 SoundMeter();
1326 }, 200);
1327 }
1328
1329 function RTC() {
1330 if (null != arguments[0].rtc) {
1331 let a = arguments[0].rtc;
1332 arguments[0].rtc = null;
1333 MS(arguments[0], a);
1334 }
1335 }
1336
1337 function Vote() {
1338 var ChecksOut = CTS.VoteSystem,
1339 len = CTS.WaitToVoteList.length;
1340 if (len > 0 && ChecksOut) {
1341 for (var i = 0; i < len; i++) {
1342 if (CTS.WaitToVoteList[i][0] === CTS.UserList[arguments[0]].username.toUpperCase()) {
1343 Send("msg", "Please wait several minutes till you can cast your vote again!");
1344 ChecksOut = false;
1345 break;
1346 }
1347 }
1348 }
1349 if (ChecksOut) {
1350 if (isSafeListed(CTS.UserList[arguments[0]].username.toUpperCase())) {
1351 var targetname = arguments[1].match(/\!vote\s(guest-[0-9]{1,26}|[a-z0-9_]{1,32})$/i);
1352 if (targetname !== null) {
1353 var Target = UsernameToUser(targetname[1].toUpperCase());
1354 if (Target !== -1) {
1355 if (CTS.UserList[Target].broadcasting) {
1356 if (CTS.Me.owner || !CTS.UserList[Target].mod) {
1357 Send("msg", "Your vote has been cast, you may vote again shortly!");
1358 CTS.WaitToVoteList.push([CTS.UserList[arguments[0]].username.toUpperCase(), new Date()]);
1359 CTS.UserList[Target].vote += 1;
1360 if (CTS.UserList[Target].vote === 3) {
1361 CTS.UserList[Target].vote = 0;
1362 Send("msg", CTS.UserList[Target].nick + "!\nYou've been voted off camera!");
1363 Send("stream_moder_close", CTS.UserList[Target].handle);
1364 }
1365 } else {
1366 Send("msg", "I cannot do that!");
1367 }
1368 }
1369 } else {
1370 Send("msg", "The user is not broadcasting...");
1371 }
1372 } else {
1373 Send("msg", "The nickname or username does not exist!");
1374 }
1375 }
1376 }
1377 }
1378
1379 function MessagePopUp() {
1380 if (CTS.Popups) {
1381 var push = false;
1382 if (arguments[0] != -1) {
1383 if (ChatListElement.querySelector(".list-item .active")) {
1384 if (ChatListElement.querySelector(".active").innerHTML.includes(CTS.UserList[arguments[0]].nick) && !ChatListElement.querySelector(".active").innerHTML.includes("(offline)")) {
1385 if (arguments[2]) push = true;
1386 } else {
1387 push = true;
1388 }
1389 } else if (!arguments[2]) {
1390 push = true;
1391 }
1392 }
1393 if (arguments[3]) push = true;
1394 if (push || !CTS.ChatDisplay) {
1395 if (VideoListElement.querySelector(".PMOverlay .PMPopup:nth-child(5)")) {
1396 Remove(VideoListElement, ".PMOverlay .PMPopup:first-child");
1397 clearTimeout(CTS.NotificationTimeOut[0]);
1398 CTS.NotificationTimeOut.shift();
1399 }
1400 VideoListElement.querySelector(".PMOverlay").insertAdjacentHTML("beforeend", "<div class=\"PMPopup\"><h2><div class=\"PMTime\">" + Time() + "</div><div class=\"PMName\">" + ((arguments[3]) ? "YouTube" : (CTS.UserList[arguments[0]].nick + " in " + ((arguments[2]) ? "Main" : "PM"))) + "</div></h2><div class=\"PMContent\"style=\"font-size:" + CTS.FontSize + "px\">" + arguments[1] + "</div></div>");
1401 CTS.NotificationTimeOut.push(setTimeout(function() {
1402 if (VideoListElement.querySelector(".PMOverlay .PMPopup")) {
1403 Remove(VideoListElement, ".PMOverlay .PMPopup:first-child");
1404 CTS.NotificationTimeOut.shift();
1405 }
1406 }, 11100));
1407 }
1408 }
1409 }
1410
1411 function Reminder() {
1412 var temp,
1413 i,
1414 len = CTS.ReminderServerInList.length;
1415 for (i = 0; i < len; i++) clearTimeout(CTS.ReminderServerInList[i]);
1416 CTS.ReminderServerInList = [];
1417 if (CTS.Reminder === true) {
1418 var OffsetTime;
1419 len = CTS.ReminderList.length;
1420 for (i = 0; i < len; i++) {
1421 temp = TimeToDate(CTS.ReminderList[i][0]);
1422 CTS.RecentTime = new Date();
1423 if (temp < CTS.RecentTime) temp.setDate(temp.getDate() + 1);
1424 OffsetTime = temp - CTS.RecentTime;
1425 CTS.ReminderServerInList.push(setTimeout(AddReminder, OffsetTime, CTS.ReminderList[i][1]));
1426 }
1427 if (Addon.active("ReminderList")) {
1428 len = Addon.get("ReminderList").length;
1429 for (i = 0; i < len; i++) {
1430 temp = TimeToDate(Addon.get("ReminderList")[i][0]);
1431 CTS.RecentTime = new Date();
1432 if (temp < CTS.RecentTime) temp.setDate(temp.getDate() + 1);
1433 OffsetTime = temp - CTS.RecentTime;
1434 CTS.ReminderServerInList.push(setTimeout(AddReminder, OffsetTime, Addon.get("ReminderList")[i][1]));
1435 }
1436 }
1437 }
1438 }
1439
1440 function AddReminder() {
1441 Send("msg", "? " + arguments[0]);
1442 setTimeout(Reminder, 5000);
1443 }
1444
1445 function NotificationDisplay() {
1446 ChatLogElement.querySelector("#notification-content").style.cssText = "display:" + ((CTS.NotificationToggle == 0) ? "block" : "none") + ";";
1447 ChatLogElement.querySelector(".notifbtn").style.cssText = "display:" + ((CTS.NotificationToggle == 0) ? "block" : "none") + ";";
1448 if (CTS.NotificationToggle == 0) {
1449 ChatLogElement.querySelector(".notifbtn").addEventListener("click", NotificationResize, {
1450 passive: true
1451 });
1452 } else {
1453 ChatLogElement.querySelector(".notifbtn").removeEventListener("click", NotificationResize, {
1454 passive: true
1455 });
1456 }
1457 UpdateScroll(1, true);
1458 UpdateScroll(2, true);
1459 }
1460
1461 function NotificationResize() {
1462 ChatLogElement.querySelector("#notification-content").classList.toggle("large");
1463 if (ChatLogElement.querySelector(".notifbtn").innerText === "▼") {
1464 ChatLogElement.querySelector(".notifbtn").innerText = "▲";
1465 ChatLogElement.querySelector("#chat").style.height = "50%%";
1466 } else {
1467 ChatLogElement.querySelector(".notifbtn").innerText = "▼";
1468 ChatLogElement.querySelector("#chat").style.height = "100%";
1469 }
1470 UpdateScroll(1, false);
1471 UpdateScroll(2, true);
1472 }
1473
1474 function Dice() {
1475 return String.fromCharCode("0x268" + Rand(0, 5));
1476 }
1477
1478 function Rand() {
1479 arguments[0] = Math.ceil(arguments[0]);
1480 arguments[1] = Math.floor(arguments[1]);
1481 return Math.floor(Math.random() * (arguments[1] - arguments[0] + 1)) + arguments[0];
1482 }
1483
1484 function OpenMicrophone() {
1485 MicrophoneElement.initMouseEvent("mousedown");
1486 VideoListElement.querySelector("#videos-footer-push-to-talk").dispatchEvent(MicrophoneElement);
1487 }
1488
1489 function Cameras() {
1490 var Camera = VideoListElement.querySelectorAll(".videos-items tc-video-item"),
1491 Len = Camera.length;
1492 for (var user = 0; user < Len; user++) {
1493 var isIgnored = User(Camera[user].shadowRoot.querySelector(".video > div > video").getAttribute("data-video-id"));
1494 if (CheckUserIgnore(isIgnored) || CheckUserTempIgnore(isIgnored) && !Camera[user].shadowRoot.querySelector(".not-visible")) Camera[user].shadowRoot.querySelector("button[class=\"icon-visibility\"]").click();
1495 Camera[user].shadowRoot.querySelector(".video").style.padding = (CTS.CameraBorderToggle) ? "5px" : "0";
1496 if (!Camera[user].shadowRoot.querySelector(".video #fixed")) Camera[user].shadowRoot.querySelector(".video").insertAdjacentHTML("afterbegin", "<style id=\"fixed\">@media screen and (max-width: 1827px){.video.large{width:100%!important;}}.video.large{position: absolute;left:0;top: 0;z-index: 2;max-width: 1827px;}.video>div>.overlay[data-mic-level=\"1\"] {-webkit-box-shadow: inset 0 0 2px 3px #53b6ef;box-shadow: inset 0 0 2px 3px #53b6ef;}.video>div>.overlay[data-mic-level=\"2\"] {-webkit-box-shadow: inset 0 0 4px 3px #53b6ef;box-shadow: inset 0 0 4px 3px #53b6ef;}.video>div>.overlay[data-mic-level=\"3\"],.video>div>.overlay[data-mic-level=\"4\"], .video>div>.overlay[data-mic-level=\"5\"], .video>div>.overlay[data-mic-level=\"6\"], .video>div>.overlay[data-mic-level=\"7\"], .video>div>.overlay[data-mic-level=\"8\"], .video>div>.overlay[data-mic-level=\"9\"], .video>div>.overlay[data-mic-level=\"10\"] {-webkit-box-shadow: inset 0 0 6px 3px #53b6ef;box-shadow: inset 0 0 6px 3px #53b6ef;}.video:after{content:unset;}</style>");
1497 }
1498 Resize();
1499 }
1500
1501 function FeaturedCameras() {
1502 if (arguments[0] === true) {
1503 if (VideoListElement.querySelector("#SmallFTYT")) {
1504 Remove(VideoListElement, "#SmallFTYT");
1505 }
1506 } else {
1507 var node = document.createElement("style");
1508 node.appendChild(document.createTextNode(FeaturedCSS));
1509 node.setAttribute("id", "SmallFTYT");
1510 VideoListElement.appendChild(node);
1511 }
1512 }
1513
1514 function Resize() {
1515 window.dispatchEvent(new Event("resize"));
1516 }
1517
1518 function PerformanceModeInit() {
1519 if (!CTS.ThemeChange) {
1520 var value = ((arguments[0]) ? "100%" : "calc(400px + " + CTS.ChatWidth + "%)");
1521 ChatLogElement.querySelector("#chat-wrapper").style.minWidth = value;
1522 ChatLogElement.querySelector("#chat-wrapper").style.maxWidth = value;
1523 ChatLogElement.querySelector("#chat-wrapper").style.width = value;
1524 TitleElement.querySelector("#room-header").style.minWidth = value;
1525 TitleElement.querySelector("#room-header").style.maxWidth = value;
1526 TitleElement.querySelector("#room-header").style.width = value;
1527 VideoListElement.querySelector("#videos-footer-broadcast-wrapper").style.minWidth = ((!CTS.ChatDisplay) ? "100%" : value);
1528 VideoListElement.querySelector("#videos-footer-broadcast-wrapper").style.maxWidth = ((!CTS.ChatDisplay) ? "100%" : value);
1529 VideoListElement.querySelector("#videos-footer-broadcast-wrapper").style.width = ((!CTS.ChatDisplay) ? "100%" : value);
1530 VideoListElement.querySelector("#videos-header").style.minWidth = ((!CTS.UserListDisplay) ? "calc(" + value + " - 54px)" : value);
1531 VideoListElement.querySelector("#videos-header").style.maxWidth = ((!CTS.UserListDisplay) ? "calc(" + value + " - 54px)" : value);
1532 VideoListElement.querySelector("#videos-header").style.width = ((!CTS.UserListDisplay) ? "calc(" + value + " - 54px)" : value);
1533 SideMenuElement.querySelector("#sidemenu").style.minWidth = value;
1534 SideMenuElement.querySelector("#sidemenu").style.maxWidth = value;
1535 SideMenuElement.querySelector("#sidemenu").style.width = value;
1536 document.querySelector("#content").style.width = ((!arguments[0]) ? "calc(100% " + (CTS.ChatDisplay ? "- (400px + " + CTS.ChatWidth + "%)" : "") + ")" : "0%");
1537 VideoListElement.querySelector("#videos").style.display = ((!arguments[0]) ? "block!important" : "none!important");
1538
1539 } else {
1540 if (arguments[0]) {
1541 VideoListElement.querySelector("#videos-content").style.display = "none";
1542 ChatLogElement.querySelector("#chat-wrapper").style.width ="100%";
1543 ChatLogElement.querySelector("#chat-wrapper").style.position = "fixed";
1544 ChatLogElement.querySelector("#chat-wrapper").style.left = "0";
1545 ChatLogElement.querySelector("#chat-wrapper").style.bottom = "0";
1546 ChatLogElement.querySelector("#chat-wrapper").style.minHeight = "100%";
1547 VideoListElement.querySelector("#videos-footer-broadcast-wrapper").style.display = "none";
1548 VideoListElement.querySelector("#videos-header").style.display = "none";
1549 VideoListElement.querySelector("#videos-footer").style.display = "none";
1550 } else {
1551 VideoListElement.querySelector("#videos-content").style.removeProperty("display");
1552 ChatLogElement.querySelector("#chat-wrapper").style.removeProperty("width");
1553 ChatLogElement.querySelector("#chat-wrapper").style.removeProperty("position");
1554 ChatLogElement.querySelector("#chat-wrapper").style.removeProperty("left");
1555 ChatLogElement.querySelector("#chat-wrapper").style.removeProperty("bottom");
1556 ChatLogElement.querySelector("#chat-wrapper").style.removeProperty("min-height");
1557 VideoListElement.querySelector("#videos-footer-broadcast-wrapper").style.removeProperty("display");
1558 VideoListElement.querySelector("#videos-header").style.removeProperty("display");
1559 VideoListElement.querySelector("#videos-footer").style.removeProperty("display");
1560 }
1561 }
1562 UpdateScroll(1, true);
1563 UpdateScroll(2, true);
1564 Resize();
1565 }
1566
1567 function OwnerCommand() {
1568 //MESSAGE FROM OWNER
1569 if (isCommand(arguments[1])) {
1570 if (CTS.UserList[arguments[0]].owner) {
1571 if (arguments[1].match(/^!closeall$/i)) {
1572 for (var a = 0; a < CTS.Camera.List.length; a++) {
1573 if (CTS.Me.handle !== CTS.Camera.List[a]) Send("stream_moder_close", CTS.Camera.List[a]);
1574 }
1575 }
1576 if (arguments[1].match(/^!kickall$/i)) {
1577 for (var b = 0; b < CTS.UserList.length; b++) {
1578 if (CTS.Me.handle !== CTS.UserList[b].handle) Send("kick", CTS.UserList[b].handle);
1579 }
1580 }
1581 }
1582 }
1583 }
1584
1585 function Command() {
1586 var UserCommand = arguments[0].match(/^!([a-z0-9]*)(?:\s?)(.*)/i);
1587 if (UserCommand) {
1588 if (typeof CommandList[UserCommand[1].toLowerCase()] == "function") {
1589 debug("COMMAND::" + ((arguments[1]) ? "PM" : "MAIN"), UserCommand[1] + ":" + UserCommand[2]);
1590 CommandList[UserCommand[1].toLowerCase()](UserCommand[2], arguments[1]);
1591 }
1592 }
1593 }
1594 //ALERT FUNCTIONS
1595 function Settings() {
1596 Alert(GetActiveChat(), ((arguments[0] !== undefined) ? arguments[0] : "") + "<center>CTS BOT CONFIGURATION:\nBot Mode: " + ((CTS.Bot) ? "ON" : "OFF") + "\nOperator Mode: " + ((CTS.UserYT) ? "ON" : "OFF") + "\nPublic Command Mode: " + ((CTS.PublicCommandToggle) ? "ON" : "OFF") + "\nGreen Room Mode:\n" + ((CTS.GreenRoomToggle) ? "AUTO ALLOW" : "MANUAL") + "\nReminder Mode: " + ((CTS.Reminder) ? "ON" : "OFF") + "\nGame View: " + ((CTS.CanSeeGames) ? "ON" : "OFF") + "\nGame Host: " + ((CTS.CanHostGames) ? "ON" : "OFF") + "\n\nAvatar Display: " + ((CTS.Avatar) ? "SHOW" : "HIDE") + "\nNotification Display: " + ((CTS.NotificationToggle != 2) ? "SHOW("+CTS.NotificationToggle+")" : "HIDE") + "\nPopup Display: " + ((CTS.Popups) ? "SHOW" : "HIDE") + "\nFont Size: " + CTS.FontSize + "PX\n\nFOR LIST OF COMMANDS:\n!CTS</center>");
1597 }
1598
1599 function Alert() {
1600 CTS.Message[arguments[0]].push({
1601 "time": Time(),
1602 "namecolor": (arguments[2] !== undefined) ? "#000000" : "#3f69c0",
1603 "avatar": (arguments[2] !== undefined) ? ("") : ("https://i.imgur.com/S09irS7.png"),
1604 "username": "",
1605 "nick": (arguments[2] !== undefined) ? (arguments[2]) : ("CTS Version: " + Ver()),
1606 "msg": ((arguments[2] !== undefined) ? ("<div id=\"system_user\">" + arguments[1] + "</div>") : arguments[1]),
1607 "mention": ((arguments[2] !== undefined) ? false : true)
1608 });
1609 var len = CTS.Message[arguments[0]].length - 1;
1610 arguments[1] = CTS.Message[arguments[0]][len];
1611 CreateMessage(arguments[1].time, arguments[1].namecolor, arguments[1].avatar, arguments[1].username, arguments[1].nick, arguments[1].msg, arguments[1].mention, arguments[0]);
1612 }
1613
1614 function Ver() {
1615 return window.CTSVersion.Major + "." + window.CTSVersion.Minor + "." + window.CTSVersion.Patch;
1616 }
1617
1618 function AddUserNotification() {
1619 if (CTS.FullLoad && CTS.ShowedSettings) {
1620 var chat = ChatLogElement.querySelector("#notification-content"),
1621 Notification;
1622 CTS.NotificationScroll = (Math.floor(chat.scrollTop) + 5 >= (chat.scrollHeight - chat.offsetHeight)) ? true : false;
1623 if (arguments[0] == 1) {
1624 Notification = arguments[3] + ((arguments[4]) ? " is " : " has stopped ") + "broadcasting!";
1625 } else if (arguments[0] == 2) {
1626 Notification = arguments[3] + " has " + ((!arguments[4]) ? "joined!" : "left");
1627 } else if (arguments[0] == 3) {
1628 Notification = arguments[2] + "has mentioned you!";
1629 if (CTS.NotificationToggle == 0) ChatLogElement.querySelector("#notification-content").insertAdjacentHTML("beforeend", "<div class=\"list-item\"><div class=\"notification\"><span style=\"background:" + arguments[1] + "\" class=\"nickname\">" + arguments[2] + "</span>"+((CTS.TimeStampToggle)?"<span class=\"time\"> " + Time() + " </span>":"")+"<br/> has mentioned you.</div></div>");
1630 UpdateScroll(2, true);
1631 } else if (arguments[0] == 4) {
1632 Notification = "with the account name " + arguments[3] + " changed their name to " + arguments[5];
1633 }
1634 if (arguments[0] != 3 && CTS.NotificationToggle == 0) ChatLogElement.querySelector("#notification-content").insertAdjacentHTML("beforeend", "<div class=\"list-item\"><div class=\"notification\"><span class=\"nickname\" style=\"background:" + arguments[1] + ";\">" + arguments[2] + "</span>"+((CTS.TimeStampToggle)?"<span class=\"time\"> " + Time() + " </span>":"")+"<br/>" + Notification + "</div></div>");
1635 if (CTS.NotificationToggle == 1) Alert(0, Notification, arguments[2]);
1636 if (CTS.TTS.synth !== undefined && (CTS.TTSList.includes(arguments[2].toUpperCase()) || CTS.TTSList.includes(arguments[3]) || CTS.TTSList.includes("-ALL") || CTS.TTSList.includes("-EVENT"))) TTS(arguments[2] + ((arguments[0] == 4) ? " " : "as ") + Notification);
1637 UpdateScroll(2, false);
1638 var Notifications = ChatLogElement.querySelectorAll(".notification");
1639 if (Notifications.length > CTS.NotificationLimit + 25) {
1640 for (var NotificationIndex = 0; NotificationIndex < Notifications.length - CTS.NotificationLimit; NotificationIndex++) Notifications[NotificationIndex].parentNode.removeChild(Notifications[NotificationIndex]);
1641 }
1642 }
1643 }
1644
1645 function AddSystemNotification() {
1646 if (CTS.FullLoad && CTS.ShowedSettings) {
1647 if (CTS.NotificationToggle == 0) {
1648 ChatLogElement.querySelector("#notification-content").insertAdjacentHTML("beforeend", "<div class=\"list-item\"><span class=\"nickname\"style=\"background:#F00\">SYSTEM</span>"+((CTS.TimeStampToggle)?"<span class=\"time\"> " + Time() + " </span>":"")+"<br/>" + arguments[0] + "</div>");
1649 } else if (CTS.NotificationToggle == 1) {
1650 Alert(0, arguments[0], "SYSTEM");
1651 }
1652 if (CTS.TTS.synth !== undefined && (CTS.TTSList.includes("-ALL") || CTS.TTSList.includes("-EVENT"))) TTS(arguments[0]);
1653 UpdateScroll(2, false);
1654 }
1655 }
1656 //USER FUNCTION
1657 function AddUser() {
1658 CTS.UserList.push({
1659 "handle": arguments[0],
1660 "username": arguments[5],
1661 "nick": arguments[4],
1662 "owner": arguments[7],
1663 "mod": arguments[1],
1664 "namecolor": arguments[2],
1665 "avatar": arguments[3],
1666 "canGame": arguments[6],
1667 "broadcasting": false,
1668 "vote": 0
1669 });
1670 if (CTS.ScriptInit) AddUserNotification(2, arguments[2], arguments[4], arguments[5], false);
1671 }
1672
1673 function User() {
1674 for (var user = 0; user < CTS.UserList.length; user++) {
1675 if (CTS.UserList[user].handle == arguments[0]) return user;
1676 }
1677 return -1;
1678 }
1679
1680 function UsernameToHandle() {
1681 for (var user = 0; user < CTS.UserList.length; user++) {
1682 if (CTS.UserList[user].username.toUpperCase() == arguments[0] || CTS.UserList[user].nick.toUpperCase() == arguments[0]) return CTS.UserList[user].handle;
1683 }
1684 return -1;
1685 }
1686
1687 function UsernameToUser() {
1688 for (var user = 0; user < CTS.UserList.length; user++) {
1689 if (CTS.UserList[user].username.toUpperCase() == arguments[0] || CTS.UserList[user].nick.toUpperCase() == arguments[0]) return user;
1690 }
1691 return -1;
1692 }
1693
1694 function NicknameToAccount() {
1695 for (var user = 0; user < CTS.UserList.length; user++) {
1696 if (CTS.UserList[user].nick.toUpperCase() == arguments[0]) return user;
1697 }
1698 return -1;
1699 }
1700
1701 function CheckUserListSafe() {
1702 var len = CTS.UserList.length;
1703 var temp = [];
1704 if (Addon.active("AKB")) temp = Addon.get("AKB");
1705 for (var user = 0; user < len; user++) {
1706 if (!CTS.UserList[user].mod && !isSafeListed(CTS.UserList[user].username)) {
1707 CTS.KBQueue.push(CTS.UserList[user].handle);
1708 }
1709 }
1710 len = CTS.KBQueue.length;
1711 for (var kb = 0; kb < len; kb++) {
1712 Send(arguments[0], CTS.KBQueue[kb]);
1713 }
1714 CTS.KBQueue = [];
1715 }
1716
1717 function isSafeListed() {
1718 var temp = [];
1719 if (Addon.active("AKB")) temp = Addon.get("AKB");
1720 return (CTS.SafeList.includes(arguments[0]) || temp.includes(arguments[0]));
1721 }
1722
1723 function CheckUserTempIgnore() {
1724 if (CTS.TempIgnoreList.includes(CTS.UserList[arguments[0]].username) || CTS.TempIgnoreList.includes(CTS.UserList[arguments[0]].nick.toUpperCase())) return true;
1725 return false;
1726 }
1727
1728 function CheckUserIgnore() {
1729 if (CTS.IgnoreList.includes(CTS.UserList[arguments[0]].username) || CTS.IgnoreList.includes(CTS.UserList[arguments[0]].nick.toUpperCase())) return true;
1730 return false;
1731 }
1732
1733 function CheckUserTouchScreen() {
1734 if (/Mobi|Android/i.test(navigator.userAgent) || 'ontouchstart' in document.documentElement) {
1735 CTS.Project.isTouchScreen = true;
1736 CTS.ThemeChange = true;
1737 }
1738 }
1739
1740 function CheckUserAbuse() {
1741 var action = false;
1742 if (CTS.Me.mod) {
1743 if ((CTS.KickList.includes(arguments[1]) || CTS.KickList.includes(arguments[2]))) {
1744 CTS.NoGreet = true;
1745 Send("kick", arguments[0]);
1746 action = true;
1747 }
1748 if (!action) {
1749 if ((CTS.BanList.includes(arguments[1]) || CTS.BanList.includes(arguments[2]))) {
1750 CTS.NoGreet = true;
1751 Send("ban", arguments[0]);
1752 }
1753 }
1754 }
1755 }
1756
1757 function CheckUserWordAbuse() {
1758 if (CTS.UserList[arguments[0]].handle != CTS.Me.handle && !CTS.UserList[arguments[0]].mod) {
1759 var action = false; //LETS NOT REPEAT/KICK
1760 var len = CTS.KickKeywordList.length;
1761 for (var i = 0; i < len; i++) {
1762 if (arguments[1].includes(CTS.KickKeywordList[i])) {
1763 Send("kick", CTS.UserList[arguments[0]].handle);
1764 action = true;
1765 break;
1766 }
1767 }
1768 if (!action) {
1769 len = CTS.BanKeywordList.length;
1770 for (i = 0; i < len; i++) {
1771 if (arguments[1].includes(CTS.BanKeywordList[i])) {
1772 Send("ban", CTS.UserList[arguments[0]].handle);
1773 break;
1774 }
1775 }
1776 }
1777 }
1778 }
1779
1780 function RemoveUserCamera() {
1781 var len = CTS.Camera.List.length;
1782 if (len > 0) {
1783 for (var i = 0; i < len; i++) {
1784 if (CTS.Camera.List[i] === arguments[0]) {
1785 CTS.Camera.List.splice(i, 1);
1786 clearTimeout(CTS.Camera.clearRandom);
1787 break;
1788 }
1789 }
1790 }
1791 }
1792
1793 function CheckUserStream() {
1794 if (CTS.Me.mod) {
1795 var user = User(arguments[0]);
1796 if (user != -1) {
1797 if (arguments[1]) {
1798 //PUSH UPDATE
1799 CTS.Camera.List.push(CTS.UserList[user].handle);
1800 CTS.UserList[user].broadcasting = true;
1801 var len = CTS.Camera.List.length;
1802 if (CTS.UserList[user].username !== "GUEST" && !CTS.GreenRoomList.includes(CTS.UserList[user].username)) {
1803 CTS.GreenRoomList.push(CTS.UserList[user].username);
1804 Save("GreenRoomList", JSON.stringify(CTS.GreenRoomList));
1805 }
1806 //CLEAR TIMERS
1807 clearTimeout(CTS.Camera.clearRandom);
1808 //CAMERA SWEEP FUNCTION
1809 if (len >= 12 && CTS.Me.handle === CTS.Host && CTS.Camera.Sweep) {
1810 CTS.Camera.clearRandom = setTimeout(function() {
1811 var rand = Rand(0, len - 1);
1812 if (CTS.Camera.List[rand] !== CTS.Me.handle && CTS.Camera.Sweep) {
1813 var target = User(CTS.Camera.List[rand]);
1814 if (CTS.Me.owner || !CTS.UserList[target].mod) {
1815 Send("msg", "[Camera Clear]\n" + CTS.UserList[target].nick + "!\nYou've been randomly selected. You win, a cam close!");
1816 Send("stream_moder_close", CTS.Camera.List[rand]);
1817 CTS.Camera.List.splice(rand, 1);
1818 }
1819 }
1820 }, CTS.Camera.SweepTimer * 60000);
1821 }
1822 } else {
1823 clearTimeout(CTS.Camera.clearRandom);
1824 RemoveUserCamera(CTS.UserList[user].handle);
1825 CTS.UserList[user].broadcasting = false;
1826 }
1827 CTS.UserList[user].broadcasting = arguments[1];
1828 if (CTS.ScriptInit) AddUserNotification(1, CTS.UserList[user].namecolor, CTS.UserList[user].nick, CTS.UserList[user].username, arguments[1]);
1829 }
1830 }
1831 }
1832
1833 function CheckUserName() {
1834 return arguments[0].match(/^(-all|[a-z0-9_]{1,32})$/i);
1835 }
1836
1837 function CheckUserNameStrict() {
1838 return arguments[0].match(/^([a-z0-9_]{1,32})$/i);
1839 }
1840
1841 function MSR() {
1842 if (arguments[0]) {
1843 arguments[1].videolist.RemoveVideoRemote(arguments[1].handle);
1844 } else {
1845 arguments[1].mediaStream.stop();
1846 arguments[1].mediaStream = null;
1847 }
1848 }
1849
1850 function MS() {
1851 if (arguments[0].mediaStream !== null) {
1852 if (arguments[0].mediaStream.active && arguments[1].signalingState !== "closed" && typeof arguments[1].removeStream === "function" && arguments[1].removeStream(arguments[0].mediaStream)) MSR(false, arguments[0]);
1853 } else {
1854 MSR(true, arguments[0]);
1855 }
1856 if (arguments[1].signalingState !== "closed" && arguments[1].close());
1857 }
1858 //LOAD/SAVE FUNCTION
1859 function Load() {
1860 var val = localStorage.getItem(CTS.Project.Storage + arguments[0]);
1861 if (null === val && "undefined" != typeof arguments[1]) {
1862 Save(arguments[0], arguments[1]);
1863 return arguments[1];
1864 }
1865 return val;
1866 }
1867
1868 function Save() {
1869 localStorage.setItem(CTS.Project.Storage + arguments[0], arguments[1]);
1870 }
1871 //SOCKET FUNCTION
1872 function CTSWebSocket() {
1873 if (window.Proxy === undefined) return;
1874 var handler = {
1875 set: function(Target, prop, value) {
1876 if (prop == "onmessage") {
1877 var oldMessage = value;
1878 value = function(event) {
1879 ServerMsg(JSON.parse(event.data), Target);
1880 oldMessage(event);
1881 };
1882 }
1883 return (Target[prop] = value);
1884 },
1885 get: function(Target, prop) {
1886 var value = Target[prop];
1887 if (prop == "send") {
1888 value = function(event) {
1889 ClientMsg(JSON.parse(event), Target);
1890 Target.send(event);
1891 };
1892 } else if (typeof value == 'function') {
1893 value = value.bind(Target);
1894 }
1895 return value;
1896 }
1897 };
1898 var WebSocketProxy = new window.Proxy(window.WebSocket, {
1899 construct: function(Target, args) {
1900 CTS.SocketTarget = new Target(args[0]);
1901 debug("SOCKET::CONNECTING", args[0]);
1902 return new window.Proxy(CTS.SocketTarget, handler);
1903 }
1904 });
1905 window.WebSocket = WebSocketProxy;
1906 }
1907
1908 function ModCommand() {
1909 var name = arguments[1].match(/\!(?:kick|ban|close)\s(guest-[0-9]{1,26}|[a-z0-9_]{1,32})$/i);
1910 if (name !== null) {
1911 var target = UsernameToUser(name[1].toUpperCase());
1912 if (target != -1) { // USER ONLINE
1913 if (CTS.UserList[target].handle !== CTS.Me.handle && !CTS.BotModList.includes(CTS.UserList[target].username) && !CTS.UserList[target].mod) {
1914 //IF USER IS NOT HOST/MODERATOR/JR.MODERATOR
1915 if (arguments[0] === "stream_moder_close") {
1916 if (CTS.UserList[target].broadcasting) Send(arguments[0], CTS.UserList[target].handle);
1917 } else {
1918 Send(arguments[0], CTS.UserList[target].handle);
1919 }
1920 } else {
1921 Send("msg", "This users authorization is similar or above yours!");
1922 }
1923 }
1924 }
1925 }
1926
1927 function BotCommand() {
1928 var len = CTS.YouTube.MessageQueueList.length;
1929 if (len <= 0) {
1930 // Moderator Control
1931 if (CTS.UserList[arguments[1]].mod) {
1932 if (arguments[0] == 2) {
1933 if (CTS.YouTube.CurrentTrack.ID !== undefined) {
1934 CTS.YouTube.Clear = true;
1935 YouTubePlayList();
1936 }
1937 }
1938 if (arguments[0] == 5) SetBot(true);
1939 }
1940 // User and Moderator Control
1941 if ((CTS.UserYT && CTS.SafeList.includes(CTS.UserList[arguments[1]].username) && (CTS.BotOPList.includes(CTS.UserList[arguments[1]].username) || CTS.BotOPList.includes("-ALL"))) || CTS.UserList[arguments[1]].mod || CTS.BotModList.includes(CTS.UserList[arguments[1]].username)) {
1942 if (arguments[0] == 1) CheckYouTube(arguments[2], true, undefined, CTS.UserList[arguments[1]].mod);
1943 if (arguments[0] == 4) YouTubePlayList(true);
1944 if (arguments[0] == 6) {
1945 if (CTS.UserList[arguments[1]].mod || CTS.BotModList.includes(CTS.UserList[arguments[1]].username)) {
1946 var videoid = arguments[2].match(/http(?:s)?(?:\:\/\/)(?:w{1,3}\.)?(?:youtu(?:\.be|be.com))(?:\/v\/|\/)?(?:watch\?|embed\/|user\/|v\/|\/)(?:v\=)?([a-z0-9\-\_]{1,11})/i);
1947 if (videoid !== null) {
1948 CTS.SocketTarget.send(JSON.stringify({
1949 "tc": "yut_play",
1950 "item": {
1951 "id": videoid[1],
1952 "duration": 7200,
1953 "offset": 0,
1954 "title": "YOUTUBE IS BYPASSED - MODS ONLY"
1955 }
1956 }));
1957 debug("YOUTUBE::LINK BYPASS", videoid[1]);
1958 }
1959 } else {
1960 Send("msg", "Ask a moderator to play your request.");
1961 }
1962 }
1963 if (arguments[0] == 3) {
1964 if (CTS.YouTube.CurrentTrack.ID !== undefined) {
1965 Send("yut_stop", [CTS.YouTube.CurrentTrack.ID, CTS.YouTube.CurrentTrack.duration, CTS.YouTube.CurrentTrack.title, CTS.YouTube.CurrentTrack.thumbnail, 0]);
1966 Send("msg", "?" + CTS.YouTube.CurrentTrack.title + " has been skipped!?");
1967 }
1968 }
1969 }
1970 } else {
1971 if (CTS.YouTube.ListBuilt === false) {
1972 Send("msg", "? Playlist search is happening, please wait! ?\n" + CTS.YouTube.MessageQueueList.length + " tracks found.");
1973 } else {
1974 Send("msg", "? Playlist items are being added,a please wait! ?\n" + CTS.YouTube.MessageQueueList.length + " tracks remaining.");
1975 }
1976 }
1977 }
1978
1979 function ServerMsg() {
1980 if (typeof ServerInList[arguments[0].tc] == "function") {
1981 debug(("SERVER::" + arguments[0].tc.toUpperCase()), arguments[0]);
1982 ServerInList[arguments[0].tc](arguments[0]);
1983 }
1984 }
1985
1986 function ClientMsg() {
1987 if (typeof ServerOutList[arguments[0].tc] == "function") {
1988 debug(("CLIENT::" + arguments[0].tc.toUpperCase()), arguments[0]);
1989 ServerOutList[arguments[0].tc](arguments[0]);
1990 }
1991 }
1992
1993 function Send() {
1994 ServerSendList[arguments[0]](arguments[0], arguments[1], arguments[2]);
1995 if (arguments[1] === undefined) arguments[1] = "Open Request";
1996 debug(("CLIENT::SEND::" + arguments[0].toUpperCase()), arguments[1]);
1997 }
1998 //GAME FUNCTION
1999 //FISHING BOAT
2000 function FishUpgradeStatus(playerExist, type) {
2001 var msg = "[FISHING BOAT]\n";
2002 if (type != 7) msg += playerExist.Nickname + ":\n";
2003 if (type == 0 || type == 1) msg += "[NET]Lv. " + playerExist.Upgrades.Net + "\n" + ((playerExist.Upgrades.Net >= 10) ? "[MAXED]" : "[COSTS $" + Fish.pricelist(playerExist, 0) + " to UPGRADE]\n\n");
2004 if (type == 0 || type == 2) msg += "[RADAR]Lv. " + playerExist.Upgrades.Radar + "\n" + ((playerExist.Upgrades.Radar >= 20) ? "[MAXED]" : "[COSTS $" + Fish.pricelist(playerExist, 1) + " to UPGRADE]") + "\n\n";
2005 if (type == 0 || type == 3) msg += "[INSURANCE]\n" + ((playerExist.Upgrades.Insurance) ? "[OWNED]" : "[COSTS $" + Fish.pricelist(playerExist, 3) + " per ROUND]") + "\n\n";
2006 if (type == 0 || type == 4) msg += "[SHOP]Lv. " + playerExist.Upgrades.Store + "\n" + ((playerExist.Upgrades.Store >= 6) ? "[MAXED]" : "[COSTS $" + Fish.pricelist(playerExist, 2) + " to UPGRADE]") + "\n\n";
2007 if (type == 6) msg += "HELP:\n!fish\n!fishbank\n!fishsplit user|nick\n!fishgamble\n[COSTS $" + Fish.pricelist(playerExist, 6) + "]\n!fishrob user|nick\n[COSTS $" + Fish.pricelist(playerExist, 4) + "]\n!fishslap user|nick\n[COSTS $" + Fish.pricelist(playerExist, 5) + "]\n!fishupgrade\n!fishupgrade\n[Net|Radar|Insurance|Shop]\n\n";
2008 Send("msg", msg);
2009 }
2010
2011 function FishTimerCheck(playerExist) {
2012 if (new Date() - playerExist.LastCheck >= 5000) {
2013 playerExist.LastCheck = new Date();
2014 return true;
2015 }
2016 return false;
2017 }
2018
2019 function FishCommandCheck() {
2020 var command,
2021 playerExist = Fish.getPlayer(CTS.UserList[arguments[0]].handle, false, true),
2022 FishCommand = arguments[1].match(/^\!(fish(?:rob|slap|split|help|upgrade)?)\s?(?:([a-z0-9_]*)|net|shop|radar|insurance)?$/i);
2023 if (FishCommand) {
2024 if (FishCommand[1] === "fishslap" || FishCommand[1] === "fishrob" || FishCommand[1] === "fishsplit") {
2025 if (FishCommand[2] !== undefined) {
2026 if (typeof FishList[FishCommand[1].toLowerCase()] == "function") FishList[FishCommand[1].toLowerCase()](playerExist, FishCommand[2]);
2027 }
2028 } else {
2029 command = ((FishCommand[2] !== undefined) ? FishCommand[1] + FishCommand[2] : FishCommand[1]);
2030 if (typeof FishList[command.toLowerCase()] == "function") FishList[command.toLowerCase()](playerExist, CTS.UserList[arguments[0]]);
2031 }
2032 }
2033 }
2034
2035 function FishTransfer(playerExist, target, cost, deduct, rob) {
2036 if (target !== undefined && target !== -1) {
2037 if (playerExist.Points > cost) {
2038 if (rob) {
2039 playerExist.Points -= cost;
2040 if (target.Points <= deduct) {
2041 deduct = target.Points;
2042 target.Points -= deduct;
2043 playerExist.Points += deduct;
2044 Send("msg", "[FISHING BOAT]\n" + playerExist.Nickname + " destroyed " + target.Nickname + "\nMoney made $" + deduct + "!");
2045 Fish.getPlayer(target.Handle, true);
2046 } else {
2047 target.Points -= deduct;
2048 playerExist.Points += deduct;
2049 Send("msg", "[FISHING BOAT]\n" + playerExist.Nickname + " robbed " + target.Nickname + " for $" + deduct + "!");
2050 }
2051 } else {
2052 playerExist.Points = deduct;
2053 target.Points += deduct;
2054 Send("msg", "[FISHING BOAT]\n" + playerExist.Nickname + " split their money with " + target.Nickname + "!");
2055 }
2056 } else {
2057 Send("msg", "[FISHING BOAT]\n" + playerExist.Nickname + " are you kidding me?\nTalk to me when you have money!");
2058 }
2059 }
2060 }
2061
2062 function FishTransaction(playerExist, cost, status) {
2063 if (playerExist.Points > cost) {
2064 playerExist.Points -= cost;
2065 return true;
2066 } else {
2067 Send("msg", "[FISHING BOAT]\n" + playerExist.Nickname + ", are you kidding me?\nTalk to me when you have money!");
2068 return false;
2069 }
2070 }
2071 //SERVER/CLIENT LIST FUNCTION
2072 var UnicodeConversionList = {
2073 convert: function() {
2074 return this.numerical(arguments[0]).replace(/[A-Za-z]/g, this.alphabet);
2075 },
2076 alphabet: function() {
2077 return String.fromCodePoint(arguments[0].codePointAt(0) + ((/[A-Z]/.test(arguments[0])) ? "?".codePointAt(0) - "A".codePointAt(0) : "?".codePointAt(0) - "a".codePointAt(0)));
2078 },
2079 numerical: function() {
2080 return arguments[0].replace(/\d/g, function(c) {
2081 return String.fromCodePoint(0x1D79E + c.charCodeAt(0));
2082 });
2083 }
2084 };
2085 var CommandList = {
2086 cts: function() {
2087 Alert(GetActiveChat(), "<b style=\"color:#ee3636;\">Owner Commands:</b>\n!raid <b style=\"color:#ffff00;\">tc link</b>\n!closeall\n!kickall\n!version\n\n<b style=\"color:#ee3636;\">Moderator Commands:</b>\n!whoisbot\n!bot\n!bottoggle\n!greenroomtoggle\n!publiccommandtoggle\n!camsweep\n!votetoggle\n!autokick (be careful!)\n!autoban (be careful!)\n\n!ytbypass <b style=\"color:#ffff00;\">link (no playlists)</b>\n!yt <b style=\"color:#ffff00;\">link | keyword</b>\n!ytclear\n\n!banlist\n!banlistclear\n!banadd <b style=\"color:#ffff00;\">user | nick</b>\n!banremove <b style=\"color:#ffff00;\">#</b>\n\n!bankeywordlist\n!bankeywordlistclear\n!bankeywordadd <b style=\"color:#ffff00;\">keyword | phrase</b>\n!bankeywordremove <b style=\"color:#ffff00;\">#</b>\n\n!kicklist\n!kicklistclear\n!kickadd <b style=\"color:#ffff00;\">user | nick</b>\n!kickremove <b style=\"color:#ffff00;\">#</b>\n\n!kickkeywordlist\n!kickkeywordlistclear\n!kickkeywordadd <b style=\"color:#ffff00;\">keyword | phrase</b>\n!kickkeywordremove <b style=\"color:#ffff00;\">#</b>\n\n!oplist\n!oplistclear\n!opadd <b style=\"color:#ffff00;\">user | -all</b>\n!opremove <b style=\"color:#ffff00;\">#</b>\n!optoggle\n\n<b style=\"color:#ee3636;\">Jr. Moderator Commands:</b>\n!ban <b style=\"color:#ffff00;\">user | nick</b>\n!kick <b style=\"color:#ffff00;\">user | nick</b>\n!close <b style=\"color:#ffff00;\">user | nick</b>\n\n<b style=\"color:#ee3636;\">User Commands:</b>\n!yt <b style=\"color:#ffff00;\">link | keyword</b>\n!ytskip\n!ytqueue\n\n!mentionlist\n!mentionlistclear\n!mentionadd <b style=\"color:#ffff00;\">keyword</b>\n!mentionremove <b style=\"color:#ffff00;\">#</b>\n\n!ignorelist\n!ignorelistclear\n!ignoreadd <b style=\"color:#ffff00;\">user | nick</b>\n!ignoreremove <b style=\"color:#ffff00;\">#</b>\n\n!greetlist\n!greetlistclear\n!greetadd <b style=\"color:#ffff00;\">user | nick | -all</b>\n!greetremove <b style=\"color:#ffff00;\">#</b>\n\n!ttslist\n!ttslistclear\n!ttsadd <b style=\"color:#ffff00;\">user | nick | -all | -event</b>\n!ttsremove <b style=\"color:#ffff00;\">#</b>\n\n!highlightlist\n!highlightlistclear\n!highlightadd <b style=\"color:#ffff00;\">user | nick</b>\n!highlightremove <b style=\"color:#ffff00;\">#</b>\n\n!reminderlist\n!reminderlistclear\n!reminderadd <b style=\"color:#ffff00;\">user | nick</b>\n!reminderremove <b style=\"color:#ffff00;\">#</b>\n!remindertoggle\n\n!safelist\n!safelistclear\n!safeadd <b style=\"color:#ffff00;\">user</b>\n!saferemove <b style=\"color:#ffff00;\">#</b>\n\n!greenroomlist\n!greenroomlistclear\n!greenroomadd <b style=\"color:#ffff00;\">user</b>\n!greenroomremove <b style=\"color:#ffff00;\">#</b>\n\n!greenroomignorelist\n!greenroomignorelistclear\n!greenroomignoreadd <b style=\"color:#ffff00;\">user</b>\n!greenroomignoreremove <b style=\"color:#ffff00;\">#</b>\n\n!lists\n!listsclear\n\n!greetmode\n!imgurtoggle\n!avatartoggle\n!notificationtoggle <b style=\"color:#ffff00;\"></b>\n!popuptoggle\n!timestamptoggle\n\n!coin\n!advice\n!8ball <b style=\"color:#ffff00;\">question</b>\n!roll <b style=\"color:#ffff00;\">#</b>\n!chuck\n!dad\n\n!vote <b style=\"color:#ffff00;\">user | nick</b>\n\n!clr\n!settings\n!share\n\n<b style=\"color:#ee3636;\">Game Commands:</b>\n!gamehost\n!gameview\n!fish");
2088 },
2089 help: function() {
2090 this.cts();
2091 },
2092 mentionadd: function() {
2093 if (arguments[0] === "") {
2094 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2095 } else {
2096 if (CheckUserNameStrict(arguments[0])) {
2097 CTS.MentionList.push(arguments[0].toUpperCase());
2098 Save("MentionList", JSON.stringify(CTS.MentionList));
2099 Alert(GetActiveChat(), "?Command Accepted!");
2100 } else {
2101 Alert(GetActiveChat(), "?Command Rejected!\nArgument passed didn't match criteria!");
2102 }
2103 }
2104 },
2105 mentionremove: function() {
2106 if (arguments[0] === "" || isNaN(arguments[0])) {
2107 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2108 } else {
2109 if (CTS.MentionList[arguments[0]] !== undefined) {
2110 CTS.MentionList.splice(arguments[0], 1);
2111 Save("MentionList", JSON.stringify(CTS.MentionList));
2112 Alert(GetActiveChat(), "?Command Accepted!");
2113 } else {
2114 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2115 }
2116 }
2117 },
2118 mentionlistclear: function() {
2119 CTS.MentionList = [];
2120 Save("MentionList", JSON.stringify(CTS.MentionList));
2121 Alert(GetActiveChat(), "?Command Accepted!");
2122 },
2123 mentionlist: function() {
2124 Alert(GetActiveChat(), SettingsList.MentionList());
2125 },
2126 ignoreadd: function() {
2127 if (arguments[0] === "") {
2128 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2129 } else {
2130 if (CheckUserNameStrict(arguments[0])) {
2131 CTS.IgnoreList.push(arguments[0].toUpperCase());
2132 Cameras();
2133 Save("IgnoreList", JSON.stringify(CTS.IgnoreList));
2134 Alert(GetActiveChat(), "?Command Accepted!");
2135 } else {
2136 Alert(GetActiveChat(), "?Command Rejected!\nArgument passed didn't match criteria!");
2137 }
2138 }
2139 },
2140 ignoreremove: function() {
2141 if (arguments[0] === "" || isNaN(arguments[0])) {
2142 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2143 } else {
2144 if (CTS.IgnoreList[arguments[0]] !== undefined) {
2145 CTS.IgnoreList.splice(arguments[0], 1);
2146 Save("IgnoreList", JSON.stringify(CTS.IgnoreList));
2147 Alert(GetActiveChat(), "?Command Accepted!");
2148 } else {
2149 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2150 }
2151 }
2152 },
2153 ignorelistclear: function() {
2154 CTS.IgnoreList = [];
2155 Save("IgnoreList", JSON.stringify(CTS.IgnoreList));
2156 Alert(GetActiveChat(), "?Command Accepted!");
2157 },
2158 ignorelist: function() {
2159 Alert(GetActiveChat(), SettingsList.IgnoreList());
2160 },
2161 banadd: function() {
2162 if (arguments[0] === "") {
2163 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2164 } else {
2165 if (CheckUserNameStrict(arguments[0])) {
2166 CTS.BanList.push(arguments[0].toUpperCase());
2167 Save("BanList", JSON.stringify(CTS.BanList));
2168 Alert(GetActiveChat(), "?Command Accepted!");
2169 var check = UsernameToHandle(arguments[0].toUpperCase());
2170 if (check != -1 && CTS.Me.mod) Send("ban", check);
2171 } else {
2172 Alert(GetActiveChat(), "?Command Rejected!\nArgument passed didn't match criteria!");
2173 }
2174 }
2175 },
2176 banremove: function() {
2177 if (arguments[0] === "" || isNaN(arguments[0])) {
2178 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2179 } else {
2180 if (CTS.BanList[arguments[0]] !== undefined) {
2181 CTS.BanList.splice(arguments[0], 1);
2182 Save("BanList", JSON.stringify(CTS.BanList));
2183 Alert(GetActiveChat(), "?Command Accepted!");
2184 } else {
2185 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2186 }
2187 }
2188 },
2189 banlistclear: function() {
2190 CTS.BanList = [];
2191 Save("BanList", JSON.stringify(CTS.BanList));
2192 Alert(GetActiveChat(), "?Command Accepted!");
2193 },
2194 banlist: function() {
2195 Alert(GetActiveChat(), SettingsList.BanList());
2196 },
2197 kickadd: function() {
2198 if (arguments[0] === "") {
2199 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2200 } else {
2201 if (CheckUserNameStrict(arguments[0])) {
2202 CTS.KickList.push(arguments[0].toUpperCase());
2203 Save("KickList", JSON.stringify(CTS.KickList));
2204 Alert(GetActiveChat(), "?Command Accepted!");
2205 var check = UsernameToHandle(arguments[0].toUpperCase());
2206 if (check != -1 && CTS.Me.mod) Send("kick", check);
2207 } else {
2208 Alert(GetActiveChat(), "?Command Rejected!\nArgument passed didn't match criteria!");
2209 }
2210 }
2211 },
2212 kickremove: function() {
2213 if (arguments[0] === "" || isNaN(arguments[0])) {
2214 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2215 } else {
2216 if (CTS.KickList[arguments[0]] !== undefined) {
2217 CTS.KickList.splice(arguments[0], 1);
2218 Save("KickList", JSON.stringify(CTS.KickList));
2219 Alert(GetActiveChat(), "?Command Accepted!");
2220 } else {
2221 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2222 }
2223 }
2224 },
2225 kicklistclear: function() {
2226 CTS.KickList = [];
2227 Save("KickList", JSON.stringify(CTS.KickList));
2228 Alert(GetActiveChat(), "?Command Accepted!");
2229 },
2230 kicklist: function() {
2231 Alert(GetActiveChat(), SettingsList.KickList());
2232 },
2233 bankeywordadd: function() {
2234 if (arguments[0] === "") {
2235 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2236 } else {
2237 CTS.BanKeywordList.push(arguments[0]);
2238 Save("BanKeywordList", JSON.stringify(CTS.BanKeywordList));
2239 Alert(GetActiveChat(), "?Command Accepted!");
2240 }
2241 },
2242 bankeywordremove: function() {
2243 if (arguments[0] === "" || isNaN(arguments[0])) {
2244 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2245 } else {
2246 if (CTS.BanKeywordList[arguments[0]] !== undefined) {
2247 CTS.BanKeywordList.splice(arguments[0], 1);
2248 Save("BanKeywordList", JSON.stringify(CTS.BanKeywordList));
2249 Alert(GetActiveChat(), "?Command Accepted!");
2250 } else {
2251 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2252 }
2253 }
2254 },
2255 bankeywordlistclear: function() {
2256 CTS.BanKeywordList = [];
2257 Save("BanKeywordList", JSON.stringify(CTS.BanKeywordList));
2258 Alert(GetActiveChat(), "?Command Accepted!");
2259 },
2260 bankeywordlist: function() {
2261 Alert(GetActiveChat(), SettingsList.BanKeywordList());
2262 },
2263 kickkeywordadd: function() {
2264 if (arguments[0] === "") {
2265 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2266 } else {
2267 CTS.KickKeywordList.push(arguments[0]);
2268 Save("KickKeywordList", JSON.stringify(CTS.KickKeywordList));
2269 Alert(GetActiveChat(), "?Command Accepted!");
2270 }
2271 },
2272 kickkeywordremove: function() {
2273 if (arguments[0] === "" || isNaN(arguments[0])) {
2274 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2275 } else {
2276 if (CTS.KickKeywordList[arguments[0]] !== undefined) {
2277 CTS.KickKeywordList.splice(arguments[0], 1);
2278 Save("KickKeywordList", JSON.stringify(CTS.KickKeywordList));
2279 Alert(GetActiveChat(), "?Command Accepted!");
2280 } else {
2281 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2282 }
2283 }
2284 },
2285 kickkeywordlistclear: function() {
2286 CTS.KickKeywordList = [];
2287 Save("KickKeywordList", JSON.stringify(CTS.KickKeywordList));
2288 Alert(GetActiveChat(), "?Command Accepted!");
2289 },
2290 kickkeywordlist: function() {
2291 Alert(GetActiveChat(), SettingsList.KickKeywordList());
2292 },
2293 greetadd: function() {
2294 if (arguments[0] === "") {
2295 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2296 } else {
2297 if (CheckUserName(arguments[0])) {
2298 CTS.GreetList.push(arguments[0].toUpperCase());
2299 Save("GreetList", JSON.stringify(CTS.GreetList));
2300 Alert(GetActiveChat(), "?Command Accepted!");
2301 } else {
2302 Alert(GetActiveChat(), "?Command Rejected!\nArgument passed didn't match criteria!");
2303 }
2304 }
2305 },
2306 greetremove: function() {
2307 if (arguments[0] === "" || isNaN(arguments[0])) {
2308 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2309 } else {
2310 if (CTS.GreetList[arguments[0]] !== undefined) {
2311 CTS.GreetList.splice(arguments[0], 1);
2312 Save("GreetList", JSON.stringify(CTS.GreetList));
2313 Alert(GetActiveChat(), "?Command Accepted!");
2314 } else {
2315 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2316 }
2317 }
2318 },
2319 greetlistclear: function() {
2320 CTS.GreetList = [];
2321 Save("GreetList", JSON.stringify(CTS.GreetList));
2322 Alert(GetActiveChat(), "?Command Accepted!");
2323 },
2324 greetlist: function() {
2325 Alert(GetActiveChat(), SettingsList.GreetList());
2326 },
2327 highlightadd: function() {
2328 if (arguments[0] === "") {
2329 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2330 } else {
2331 if (CheckUserNameStrict(arguments[0])) {
2332 CTS.HighlightList.push(arguments[0].toUpperCase());
2333 Save("HighlightList", JSON.stringify(CTS.HighlightList));
2334 Alert(GetActiveChat(), "?Command Accepted!");
2335 } else {
2336 Alert(GetActiveChat(), "?Command Rejected!\nArgument passed didn't match criteria!");
2337 }
2338 }
2339 },
2340 highlightremove: function() {
2341 if (arguments[0] === "" || isNaN(arguments[0])) {
2342 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2343 } else {
2344 if (CTS.HighlightList[arguments[0]] !== undefined) {
2345 CTS.HighlightList.splice(arguments[0], 1);
2346 Save("HighlightList", JSON.stringify(CTS.HighlightList));
2347 Alert(GetActiveChat(), "?Command Accepted!");
2348 } else {
2349 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2350 }
2351 }
2352 },
2353 highlightlistclear: function() {
2354 CTS.HighlightList = [];
2355 Save("HighlightList", JSON.stringify(CTS.HighlightList));
2356 Alert(GetActiveChat(), "?Command Accepted!");
2357 },
2358 highlightlist: function() {
2359 Alert(GetActiveChat(), SettingsList.HighlightList());
2360 },
2361 opadd: function() {
2362 if (arguments[0] === "") {
2363 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2364 } else {
2365 if (CheckUserName(arguments[0])) {
2366 CTS.BotOPList.push(arguments[0].toUpperCase());
2367 Save("BotOPList", JSON.stringify(CTS.BotOPList));
2368 Alert(GetActiveChat(), "?Command Accepted!");
2369 } else {
2370 Alert(GetActiveChat(), "?Command Rejected!\nArgument passed didn't match criteria!");
2371 }
2372 }
2373 },
2374 opremove: function() {
2375 if (arguments[0] === "" || isNaN(arguments[0])) {
2376 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2377 } else {
2378 if (CTS.BotOPList[arguments[0]] !== undefined) {
2379 CTS.BotOPList.splice(arguments[0], 1);
2380 Save("BotOPList", JSON.stringify(CTS.BotOPList));
2381 Alert(GetActiveChat(), "?Command Accepted!");
2382 } else {
2383 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2384 }
2385 }
2386 },
2387 oplistclear: function() {
2388 CTS.BotOPList = [];
2389 Save("BotOPList", JSON.stringify(CTS.BotOPList));
2390 Alert(GetActiveChat(), "?Command Accepted!");
2391 },
2392 oplist: function() {
2393 Alert(GetActiveChat(), SettingsList.BotOPList());
2394 },
2395 modadd: function() {
2396 if (arguments[0] === "") {
2397 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2398 } else {
2399 if (CheckUserNameStrict(arguments[0])) {
2400 CTS.BotModList.push(arguments[0].toUpperCase());
2401 Save("BotModList", JSON.stringify(CTS.BotModList));
2402 Alert(GetActiveChat(), "?Command Accepted!");
2403 } else {
2404 Alert(GetActiveChat(), "?Command Rejected!\nArgument passed didn't match criteria!");
2405 }
2406 }
2407 },
2408 modremove: function() {
2409 if (arguments[0] === "" || isNaN(arguments[0])) {
2410 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2411 } else {
2412 if (CTS.BotModList[arguments[0]] !== undefined) {
2413 CTS.BotModList.splice(arguments[0], 1);
2414 Save("BotModList", JSON.stringify(CTS.BotModList));
2415 Alert(GetActiveChat(), "?Command Accepted!");
2416 } else {
2417 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2418 }
2419 }
2420 },
2421 modlistclear: function() {
2422 CTS.BotModList = [];
2423 Save("BotModList", JSON.stringify(CTS.BotModList));
2424 Alert(GetActiveChat(), "?Command Accepted!");
2425 },
2426 modlist: function() {
2427 Alert(GetActiveChat(), SettingsList.BotModList());
2428 },
2429 ttsadd: function() {
2430 if (arguments[0] === "") {
2431 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2432 } else {
2433 if (arguments[0].match(/^(-all|-event|[a-z0-9_]){1,32}$/i)) {
2434 CTS.TTSList.push(arguments[0].toUpperCase());
2435 Save("TTSList", JSON.stringify(CTS.TTSList));
2436 Alert(GetActiveChat(), "?Command Accepted!");
2437 } else {
2438 Alert(GetActiveChat(), "?Command Rejected!\nArgument passed didn't match criteria!");
2439 }
2440 }
2441 },
2442 ttsremove: function() {
2443 if (arguments[0] === "" || isNaN(arguments[0])) {
2444 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2445 } else {
2446 if (CTS.TTSList[arguments[0]] !== undefined) {
2447 CTS.TTSList.splice(arguments[0], 1);
2448 Save("TTSList", JSON.stringify(CTS.TTSList));
2449 Alert(GetActiveChat(), "?Command Accepted!");
2450 } else {
2451 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2452 }
2453 }
2454 },
2455 ttslistclear: function() {
2456 CTS.TTSList = [];
2457 Save("TTSList", JSON.stringify(CTS.TTSList));
2458 Alert(GetActiveChat(), "?Command Accepted!");
2459 },
2460 ttslist: function() {
2461 Alert(GetActiveChat(), SettingsList.TTSList());
2462 },
2463 reminderadd: function() {
2464 if (arguments[0] === "") {
2465 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2466 } else {
2467 var reminder = arguments[0].match(/^((?:1[0-2]|0?[1-9]):(?:[0-5][0-9])\s?(?:[AaPp][Mm]))\s(.*)/);
2468 if (reminder === null) {
2469 Alert(GetActiveChat(), "?Command Rejected!\n!reminderadd 4:18 PM This is an example you can try!");
2470 } else {
2471 CTS.ReminderList.push([reminder[1], reminder[2]]);
2472 Save("ReminderList", JSON.stringify(CTS.ReminderList));
2473 Alert(GetActiveChat(), "?Command Accepted!");
2474 Reminder();
2475 }
2476 }
2477 },
2478 reminderremove: function() {
2479 if (arguments[0] === "" || isNaN(arguments[0])) {
2480 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2481 } else {
2482 if (CTS.ReminderList[arguments[0]] !== undefined) {
2483 CTS.ReminderList.splice(arguments[0], 1);
2484 Save("ReminderList", JSON.stringify(CTS.ReminderList));
2485 Reminder();
2486 Alert(GetActiveChat(), "?Command Accepted!");
2487 } else {
2488 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2489 }
2490 }
2491 },
2492 reminderlistclear: function() {
2493 CTS.ReminderList = [];
2494 Save("ReminderList", JSON.stringify(CTS.ReminderList));
2495 Alert(GetActiveChat(), "?Command Accepted!");
2496 },
2497 reminderlist: function() {
2498 Alert(GetActiveChat(), SettingsList.ReminderList());
2499 },
2500 remindertoggle: function() {
2501 CTS.Reminder = !CTS.Reminder;
2502 Save("Reminder", JSON.stringify(CTS.Reminder));
2503 Reminder();
2504 Settings();
2505 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.Reminder) ? "Reminders are now on!\n" : "Reminders are now off!\n "));
2506 },
2507 timestamptoggle: function() {
2508 CTS.TimeStampToggle = !CTS.TimeStampToggle;
2509 Save("TimeStampToggle", JSON.stringify(CTS.TimeStampToggle));
2510 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.TimeStampToggle) ? "Timestamps are now on!\n" : "Timestamps are now off\n "));
2511 },
2512 safeadd: function() {
2513 if (arguments[0] === "" || arguments[0].toUpperCase() === "GUEST") { // Can't protect guests;
2514 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2515 } else {
2516 if (CheckUserNameStrict(arguments[0])) {
2517 if (!CTS.SafeList.includes(arguments[0].toUpperCase())) {
2518 CTS.SafeList.push(arguments[0].toUpperCase());
2519 Save("AKB", JSON.stringify(CTS.SafeList));
2520 Alert(GetActiveChat(), "?Command Accepted!");
2521 } else {
2522 Alert(GetActiveChat(), "?Name already exists!");
2523 }
2524 } else {
2525 Alert(GetActiveChat(), "?Command Rejected!\nArgument passed didn't match criteria!");
2526 }
2527 }
2528 },
2529 saferemove: function() {
2530 if (arguments[0] === "" || isNaN(arguments[0])) {
2531 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2532 } else {
2533 if (CTS.SafeList[arguments[0]] !== undefined) {
2534 CTS.SafeList.splice(arguments[0], 1);
2535 Save("AKB", JSON.stringify(CTS.SafeList));
2536 Alert(GetActiveChat(), "?Command Accepted!");
2537 } else {
2538 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2539 }
2540 }
2541 },
2542 safelistclear: function() {
2543 CTS.SafeList = [];
2544 Save("AKB", JSON.stringify(CTS.SafeList));
2545 Alert(GetActiveChat(), "?Command Accepted!");
2546 },
2547 safelist: function() {
2548 Alert(GetActiveChat(), SettingsList.SafeList());
2549 },
2550 greenroomadd: function() {
2551 if (arguments[0] === "" || arguments[0].toUpperCase() === "GUEST") { // Can't protect guests;
2552 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2553 } else {
2554 if (CheckUserNameStrict(arguments[0])) {
2555 if (!CTS.GreenRoomList.includes(arguments[0].toUpperCase())) {
2556 CTS.GreenRoomList.push(arguments[0].toUpperCase());
2557 Save("GreenRoomList", JSON.stringify(CTS.GreenRoomList));
2558 Alert(GetActiveChat(), "?Command Accepted!");
2559 } else {
2560 Alert(GetActiveChat(), "?Name already exists!");
2561 }
2562 } else {
2563 Alert(GetActiveChat(), "?Command Rejected!\nArgument passed didn't match criteria!");
2564 }
2565 }
2566 },
2567 greenroomremove: function() {
2568 if (arguments[0] === "" || isNaN(arguments[0])) {
2569 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2570 } else {
2571 if (CTS.GreenRoomList[arguments[0]] !== undefined) {
2572 CTS.GreenRoomList.splice(arguments[0], 1);
2573 Save("GreenRoomList", JSON.stringify(CTS.GreenRoomList));
2574 Alert(GetActiveChat(), "?Command Accepted!");
2575 } else {
2576 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2577 }
2578 }
2579 },
2580 greenroomlistclear: function() {
2581 CTS.GreenRoomList = [];
2582 Save("GreenRoomList", JSON.stringify(CTS.GreenRoomList));
2583 Alert(GetActiveChat(), "?Command Accepted!");
2584 },
2585 greenroomlist: function() {
2586 Alert(GetActiveChat(), SettingsList.GreenRoomList());
2587 },
2588 greenroomignoreadd: function() {
2589 if (arguments[0] === "" || arguments[0].toUpperCase() === "GUEST") { // Can't protect guests;
2590 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2591 } else {
2592 if (CheckUserNameStrict(arguments[0])) {
2593 if (!CTS.GreenRoomIgnoreList.includes(arguments[0].toUpperCase())) {
2594 CTS.GreenRoomIgnoreList.push(arguments[0].toUpperCase());
2595 Save("GreenRoomIgnoreList", JSON.stringify(CTS.GreenRoomIgnoreList));
2596 Alert(GetActiveChat(), "?Command Accepted!");
2597 } else {
2598 Alert(GetActiveChat(), "?Name already exists!");
2599 }
2600 } else {
2601 Alert(GetActiveChat(), "?Command Rejected!\nArgument passed didn't match criteria!");
2602 }
2603 }
2604 },
2605 greenroomignoreremove: function() {
2606 if (arguments[0] === "" || isNaN(arguments[0])) {
2607 Alert(GetActiveChat(), "?Command Rejected!\nParameter was missing/incorrect\nUse <b>!cts</b> for help.");
2608 } else {
2609 if (CTS.GreenRoomIgnoreList[arguments[0]] !== undefined) {
2610 CTS.GreenRoomIgnoreList.splice(arguments[0], 1);
2611 Save("GreenRoomIgnoreList", JSON.stringify(CTS.GreenRoomIgnoreList));
2612 Alert(GetActiveChat(), "?Command Accepted!");
2613 } else {
2614 Alert(GetActiveChat(), "?Command Rejected!\nID was not found!");
2615 }
2616 }
2617 },
2618 greenroomignorelistclear: function() {
2619 CTS.GreenRoomIgnoreList = [];
2620 Save("GreenRoomIgnoreList", JSON.stringify(CTS.GreenRoomIgnoreList));
2621 Alert(GetActiveChat(), "?Command Accepted!");
2622 },
2623 greenroomignorelist: function() {
2624 Alert(GetActiveChat(), SettingsList.GreenRoomIgnoreList());
2625 },
2626 optoggle: function() {
2627 CTS.UserYT = !CTS.UserYT;
2628 Save("UserYT", JSON.stringify(CTS.UserYT));
2629 Settings();
2630 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.UserYT) ? "Operators can now use YouTube.\n" : "Operators cannot use YouTube.\n"));
2631 },
2632 avatartoggle: function() {
2633 CTS.Avatar = !CTS.Avatar;
2634 Save("Avatar", JSON.stringify(CTS.Avatar));
2635 Settings();
2636 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.Avatar) ? "Avatars from now on will be visible!\n " : "Avatars from now on will hidden!\n"));
2637 },
2638 popuptoggle: function() {
2639 CTS.Popups = !CTS.Popups;
2640 Save("Popups", JSON.stringify(CTS.Popups));
2641 Settings();
2642 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.Popups) ? "Popups from now on will be visible!\n " : "Popups from now on will hidden!\n"));
2643 },
2644 notificationtoggle: function() {
2645 CTS.NotificationToggle++;
2646 if (CTS.NotificationToggle >= 3) CTS.NotificationToggle = 0;
2647 Save("NotificationToggle", JSON.stringify(CTS.NotificationToggle));
2648 NotificationDisplay();
2649 Settings();
2650 Alert(GetActiveChat(), "?Command Accepted!\nNotifications " + ((CTS.NotificationToggle==0) ? "above chat enabled" : (CTS.NotificationToggle==1)?"in chat enabled":"disabled")+".");
2651 },
2652 greetmode: function() {
2653 CTS.GreetMode = !CTS.GreetMode;
2654 Save("GreetMode", JSON.stringify(CTS.GreetMode));
2655 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.GreetMode) ? "Server like greet is enabled." : "Server like greet is disabled."));
2656 },
2657 imgurtoggle: function() {
2658 CTS.imgur = !CTS.imgur;
2659 Save("imgur", JSON.stringify(CTS.imgur));
2660 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.imgur) ? "Imgur preview is enabled." : "Imgur preview is disabled."));
2661 },
2662 publiccommandtoggle: function() {
2663 CTS.PublicCommandToggle = !CTS.PublicCommandToggle;
2664 Save("PublicCommandToggle", JSON.stringify(CTS.PublicCommandToggle));
2665 Settings();
2666 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.PublicCommandToggle) ? "Public commands (8Ball, Advice, Chuck, Coin, Dad, Urb) are enabled." : "Public commands (8Ball, Advice, Chuck, Coin, Dad, Urb) are disabled."));
2667 },
2668 greenroomtoggle: function() {
2669 CTS.GreenRoomToggle = !CTS.GreenRoomToggle;
2670 Save("GreenRoomToggle", JSON.stringify(CTS.GreenRoomToggle));
2671 Settings();
2672 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.GreenRoomToggle) ? "Green Room Auto Allow ON!" : "Green Room Auto Allow OFF!"));
2673 },
2674 clr: function() {
2675 CTS.MessageCallback = [];
2676 CTS.Message = [];
2677 CTS.Message[0] = [];
2678 window.TinychatApp.getInstance().defaultChatroom._chatlog.items = [];
2679 ChatLogElement.querySelector("#cts-chat-content").innerHTML = "";
2680 },
2681 autokick: function() {
2682 if (arguments[1] === false && CTS.Me.mod) {
2683 CTS.AutoKick = !CTS.AutoKick;
2684 CTS.AutoBan = false;
2685 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.AutoKick) ? "AUTO KICK IS NOW ON!" : "AUTO KICK IS NOW OFF!"));
2686 if (CTS.AutoKick === true) CheckUserListSafe("kick");
2687 }
2688 },
2689 autoban: function() {
2690 if (arguments[1] === false && CTS.Me.mod) {
2691 CTS.AutoBan = !CTS.AutoBan;
2692 CTS.AutoKick = false;
2693 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.AutoBan) ? "AUTO BAN IS NOW ON!" : "AUTO BAN IS NOW OFF!"));
2694 if (CTS.AutoBan === true) CheckUserListSafe("ban");
2695 }
2696 },
2697 camsweep: function() {
2698 if (CTS.Me.mod && CTS.Host === CTS.Me.handle) {
2699 CTS.Camera.SweepTimer = arguments[0] === "" || isNaN(arguments[0]) ? 5 : (arguments[0] > 30) ? 30 : (arguments[0] < 1) ? 1 : parseInt(arguments[0]);
2700 CTS.Camera.Sweep = !CTS.Camera.Sweep;
2701 clearTimeout(CTS.Camera.clearRandom);
2702 Settings();
2703 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.Camera.Sweep) ? "Camera sweep is now on!\nTime set: " + CTS.Camera.SweepTimer + "min(s)" : "Camera sweep is now off!"));
2704 }
2705 },
2706 bottoggle: function() {
2707 CTS.Bot = !CTS.Bot;
2708 Save("Bot", JSON.stringify(CTS.Bot));
2709 Settings();
2710 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.Bot) ? "You'll now ask !bot bypass on load." : "You'll not !bot bypass on load."));
2711 },
2712 votetoggle: function() {
2713 if (CTS.Me.mod) {
2714 CTS.VoteSystem = !CTS.VoteSystem;
2715 CTS.WaitToVoteList = [];
2716 var len = CTS.UserList.length;
2717 if (len > 0) {
2718 for (var i = 0; i < len; i++) CTS.UserList[i].vote = 0;
2719 }
2720 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.VoteSystem) ? "VOTING IS NOW ON!" : "VOTING IS NOW OFF!"));
2721 }
2722 },
2723 bot: function() {
2724 if (arguments[1] === false && CTS.Me.mod) Alert(0, "?Command Accepted!\nBot bypass was called!");
2725 },
2726 share: function() {
2727 var msg = "CosmosisT's TinyChat Script:\nInstall...\n1. (Tamper Monkey Link)\nhttps://www.tampermonkey.net/\n2. (CTS Link)\nhttps://greasyfork.org/en/scripts/392086\nCTS Discord:\nhttps://discord.gg/cHEf8z7";
2728 if (GetActiveChat() !== 0) {
2729 Send("pvtmsg", msg, GetActiveChat());
2730 PushPM(GetActiveChat(), msg);
2731 } else {
2732 Send("msg", msg);
2733 }
2734 },
2735 gameview: function() {
2736 CTS.CanSeeGames = !CTS.CanSeeGames;
2737 Save("CanSeeGames", JSON.stringify(CTS.CanSeeGames));
2738 Settings();
2739 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.CanSeeGames) ? "GAME VIEW IS NOW ON!" : "GAME VIEW IS NOW OFF!"));
2740 },
2741 gamehost: function() {
2742 CTS.CanHostGames = !CTS.CanHostGames;
2743 Save("CanHostGames", JSON.stringify(CTS.CanHostGames));
2744 Fish.reset(true, true);
2745 Settings();
2746 Alert(GetActiveChat(), "?Command Accepted!\n" + ((CTS.CanHostGames) ? "GAME HOSTING IS NOW ON!" : "GAME HOSTING IS NOW OFF!"));
2747 },
2748 version: function() {
2749
2750 },
2751 roll: function() {
2752 var dice,
2753 msg = "";
2754 dice = (arguments[0] === "" || isNaN(arguments[0])) ? 1 : (arguments[0] < 12) ? arguments[0] : 12;
2755 for (var i = 0; i < dice; i++) msg += Dice();
2756 if (GetActiveChat() !== 0) {
2757 Send("pvtmsg", msg, GetActiveChat());
2758 PushPM(GetActiveChat(), msg);
2759 } else {
2760 Send("msg", msg);
2761 }
2762 },
2763 coin: function() {
2764 if (CTS.Host == 0 || GetActiveChat() !== 0) {
2765 var msg = "The coin landed on " + ((Rand(0, 1) == 1) ? "heads" : "tails") + "!";
2766 if (GetActiveChat() !== 0) {
2767 Send("pvtmsg", msg, GetActiveChat());
2768 } else {
2769 Send("msg", msg);
2770 }
2771 }
2772 },
2773 settings: function() {
2774 Settings();
2775 },
2776 lists: function() {
2777 Alert(GetActiveChat(), SettingsList.BanList() + SettingsList.BanKeywordList() + SettingsList.KickList() + SettingsList.KickKeywordList() + SettingsList.BotOPList() + SettingsList.BotModList() + SettingsList.MentionList() + SettingsList.IgnoreList() + SettingsList.GreetList() + SettingsList.TTSList() + SettingsList.HighlightList() + SettingsList.ReminderList());
2778 },
2779 listsclear: function() {
2780 CTS.MentionList = [];
2781 CTS.IgnoreList = [];
2782 CTS.BanList = [];
2783 CTS.KickList = [];
2784 CTS.BanKeywordList = [];
2785 CTS.KickKeywordList = [];
2786 CTS.GreetList = [];
2787 CTS.HighlightList = [];
2788 CTS.ReminderList = [];
2789 CTS.TTSList = [];
2790 CTS.BotOPList = [];
2791 CTS.BotModList = [];
2792 Save("MentionList", JSON.stringify(CTS.MentionList));
2793 Save("IgnoreList", JSON.stringify(CTS.IgnoreList));
2794 Save("BanList", JSON.stringify(CTS.BanList));
2795 Save("KickList", JSON.stringify(CTS.KickList));
2796 Save("BanKeywordList", JSON.stringify(CTS.BanKeywordList));
2797 Save("KickKeywordList", JSON.stringify(CTS.KickKeywordList));
2798 Save("GreetList", JSON.stringify(CTS.GreetList));
2799 Save("HighlightList", JSON.stringify(CTS.HighlightList));
2800 Save("ReminderList", JSON.stringify(CTS.ReminderList));
2801 Save("TTSList", JSON.stringify(CTS.TTSList));
2802 Save("BotModList", JSON.stringify(CTS.BotModList));
2803 Save("BotOPList", JSON.stringify(CTS.BotOPList));
2804 Alert(GetActiveChat(), "?Command Accepted!\nItems Mentionlist, igore");
2805 },
2806 ytqueue: function() {},
2807 ytclear: function() {},
2808 ytskip: function() {},
2809 yt: function() {},
2810 ytbypass: function() {}
2811 };
2812 var SettingsList = {
2813 BanList: function() {
2814 var index,
2815 msg,
2816 len = CTS.BanList.length;
2817 msg = "<b style=\"color:#ee3636;\"><u>Ban list:</u></b>\n" + ((!len) ? "empty\n" : "");
2818 for (index = 0; index < len; index++) msg += index + " : " + CTS.BanList[index] + "\n";
2819 return msg;
2820 },
2821 BanKeywordList: function() {
2822 var index,
2823 msg,
2824 len = CTS.BanKeywordList.length;
2825 msg = "<b style=\"color:#ee3636;\"><u>Ban Keyword list:</u></b>\n" + ((!len) ? "empty\n" : "");
2826 for (index = 0; index < len; index++) msg += index + " : " + HTMLtoTXT(CTS.BanKeywordList[index]) + "\n";
2827 return msg;
2828 },
2829 KickList: function() {
2830 var index,
2831 msg,
2832 len = CTS.KickList.length;
2833 msg = "<b style=\"color:#ee3636;\"><u>Kick list:</u></b>\n" + ((!len) ? "empty\n" : "");
2834 for (index = 0; index < len; index++) msg += index + " : " + CTS.KickList[index] + "\n";
2835 return msg;
2836 },
2837 KickKeywordList: function() {
2838 var index,
2839 msg,
2840 len = CTS.KickKeywordList.length;
2841 msg = "<b style=\"color:#ee3636;\"><u>Kick Keyword list:</u></b>\n" + ((!len) ? "empty\n" : "");
2842 for (index = 0; index < len; index++) msg += index + " : " + HTMLtoTXT(CTS.KickKeywordList[index]) + "\n";
2843 return msg;
2844 },
2845 BotOPList: function() {
2846 var index,
2847 msg,
2848 len = CTS.BotOPList.length;
2849 msg = "<b style=\"color:#ee3636;\"><u>Bot OP list:</u></b>\n" + ((!len) ? "empty\n" : "");
2850 for (index = 0; index < len; index++) msg += index + " : " + CTS.BotOPList[index] + "\n";
2851 return msg;
2852 },
2853 BotModList: function() {
2854 var index,
2855 msg,
2856 len = CTS.BotModList.length;
2857 msg = "<b style=\"color:#ee3636;\"><u>Bot Mod list:</u></b>\n" + ((!len) ? "empty\n" : "");
2858 for (index = 0; index < len; index++) msg += index + " : " + CTS.BotModList[index] + "\n";
2859 return msg;
2860 },
2861 MentionList: function() {
2862 var index,
2863 msg,
2864 len = CTS.MentionList.length;
2865 msg = "<b style=\"color:#ee3636;\"><u>Mention list:</u></b>\n" + ((!len) ? "empty\n" : "");
2866 for (index = 0; index < len; index++) msg += index + " : " + HTMLtoTXT(CTS.MentionList[index]) + "\n";
2867 return msg;
2868 },
2869 IgnoreList: function() {
2870 var index,
2871 msg,
2872 len = CTS.IgnoreList.length;
2873 msg = "<b style=\"color:#ee3636;\"><u>Ignore list:</u></b>\n" + ((!len) ? "empty\n" : "");
2874 for (index = 0; index < len; index++) msg += index + " : " + CTS.IgnoreList[index] + "\n";
2875 return msg;
2876 },
2877 GreetList: function() {
2878 var index,
2879 msg,
2880 len = CTS.GreetList.length;
2881 msg = "<b style=\"color:#ee3636;\"><u>Greet list:</u></b>\n" + ((!len) ? "empty\n" : "");
2882 for (index = 0; index < len; index++) msg += index + " : " + CTS.GreetList[index] + "\n";
2883 return msg;
2884 },
2885 TTSList: function() {
2886 var index,
2887 msg,
2888 len = CTS.TTSList.length;
2889 msg = "<b style=\"color:#ee3636;\"><u>TTS list:</u></b>\n" + ((!len) ? "empty\n" : "");
2890 for (index = 0; index < len; index++) msg += index + " : " + CTS.TTSList[index] + "\n";
2891 return msg;
2892 },
2893 HighlightList: function() {
2894 var index,
2895 msg,
2896 len = CTS.HighlightList.length;
2897 msg = "<b style=\"color:#ee3636;\"><u>Highlight list:</u></b>\n" + ((!len) ? "empty\n" : "");
2898 for (index = 0; index < len; index++) msg += index + " : " + CTS.HighlightList[index] + "\n";
2899 return msg;
2900 },
2901 ReminderList: function() {
2902 var index,
2903 msg,
2904 len = CTS.ReminderList.length;
2905 msg = "<b style=\"color:#ee3636;\"><u>Reminder list:</u></b>\n" + ((!len) ? "empty\n" : "");
2906 for (index = 0; index < len; index++) msg += index + ": [" + CTS.ReminderList[index][0] + "] " + HTMLtoTXT(CTS.ReminderList[index][1]) + "\n";
2907 return msg;
2908 },
2909 SafeList: function() {
2910 var index,
2911 msg,
2912 len = CTS.SafeList.length;
2913 msg = "<b style=\"color:#ee3636;\"><u>Safe list:</u></b>\n" + ((!len) ? "empty\n" : "");
2914 for (index = 0; index < len; index++) msg += index + ": " + CTS.SafeList[index] + "\n";
2915 return msg;
2916 },
2917 GreenRoomList: function() {
2918 var index,
2919 msg,
2920 len = CTS.GreenRoomList.length;
2921 msg = "<b style=\"color:#ee3636;\"><u>Green Room list:</u></b>\n" + ((!len) ? "empty\n" : "");
2922 for (index = 0; index < len; index++) msg += index + ": " + CTS.GreenRoomList[index] + "\n";
2923 return msg;
2924 },
2925 GreenRoomIgnoreList: function() {
2926 var index,
2927 msg,
2928 len = CTS.GreenRoomIgnoreList.length;
2929 msg = "<b style=\"color:#ee3636;\"><u>Green Room Ignore list:</u></b>\n" + ((!len) ? "empty\n" : "");
2930 for (index = 0; index < len; index++) msg += index + ": " + CTS.GreenRoomIgnoreList[index] + "\n";
2931 return msg;
2932 }
2933 };
2934 var MessageQueueList = {
2935 add: function() {
2936 CTS.SendQueue.push(arguments[0]);
2937 MessageQueueList.run();
2938 },
2939 run: function() {
2940 if (CTS.SendQueue !== undefined && CTS.SendQueue.length > 0) {
2941 setTimeout(function() {
2942 var temp = new Date();
2943 var OffsetTime = temp - CTS.LastMessage;
2944 if (OffsetTime >= 1500) {
2945 CTS.LastMessage = new Date();
2946 CTS.SocketTarget.send(CTS.SendQueue[0]);
2947 CTS.SendQueue.shift();
2948 }
2949 MessageQueueList.run();
2950 }, 1600, CTS.LastMessage);
2951 }
2952 }
2953 };
2954 var ServerSendList = {
2955 msg: function() {
2956 var obj = {
2957 "tc": arguments[0]
2958 };
2959 if (arguments[2] !== undefined) {
2960 obj.handle = arguments[1];
2961 CTS.SocketTarget.send(JSON.stringify(obj));
2962 } else {
2963 if (arguments[1] !== undefined) {
2964 obj.text = arguments[1];
2965 MessageQueueList.add(JSON.stringify(obj));
2966 } else {
2967 CTS.SocketTarget.send(JSON.stringify(obj));
2968 }
2969 }
2970 },
2971 pvtmsg: function() {
2972 var obj = {
2973 "tc": arguments[0],
2974 "text": arguments[1],
2975 "handle": Number(arguments[2])
2976 };
2977 MessageQueueList.add(JSON.stringify(obj));
2978 },
2979 kick: function() {
2980 CheckSafeList(arguments[1], true);
2981 ServerSendList.msg(arguments[0], arguments[1], "kick");
2982 },
2983 ban: function() {
2984 CheckSafeList(arguments[1], true);
2985 ServerSendList.msg(arguments[0], arguments[1], "ban");
2986 },
2987 nick: function() {
2988 var obj = {
2989 "tc": "nick",
2990 "nick": arguments[1]
2991 };
2992 CTS.SocketTarget.send(JSON.stringify(obj));
2993 },
2994 stream_moder_close: function() {
2995 CheckSafeList(arguments[1], true);
2996 ServerSendList.msg(arguments[0], arguments[1], "stream_moder_close");
2997 },
2998 stream_moder_allow: function() {
2999 ServerSendList.msg(arguments[0], arguments[1], "stream_moder_allow");
3000 },
3001 yut_playlist_add: function() {
3002 var obj = {
3003 "tc": arguments[0],
3004 "item": {
3005 "id": arguments[1][0],
3006 "duration": arguments[1][1] + 10,
3007 "title": arguments[1][2],
3008 "image": arguments[1][3]
3009 }
3010 };
3011 if (arguments[1][4] !== undefined) obj.item.offset = arguments[1][4];
3012 CTS.SocketTarget.send(JSON.stringify(obj));
3013 },
3014 yut_playlist_remove: function() {
3015 ServerSendList.yut_playlist_add(arguments[0], arguments[1]);
3016 },
3017 yut_stop: function() {
3018 ServerSendList.yut_playlist_add(arguments[0], arguments[1]);
3019 },
3020 yut_play: function() {
3021 ServerSendList.yut_playlist_add(arguments[0], arguments[1]);
3022 },
3023 yut_playlist: function() {
3024 ServerSendList.msg("yut_playlist");
3025 },
3026 yut_playlist_clear: function() {
3027 ServerSendList.msg("yut_playlist_clear");
3028 }
3029 };
3030 var ServerInList = {
3031 joined: function() {
3032 Reset();
3033 CTS.Me = {
3034 "handle": arguments[0].self.handle,
3035 "username": (arguments[0].self.username === "") ? "GUEST" : arguments[0].self.username.toUpperCase(),
3036 "nick": arguments[0].self.nick,
3037 "owner": arguments[0].self.owner,
3038 "mod": arguments[0].self.mod,
3039 "namecolor": window.CTSNameColor[Rand(0, window.CTSNameColor.length - 1)],
3040 "avatar": arguments[0].self.avatar
3041 };
3042 if (CTS.Me.nick.match(/^guest(?:\-[0-9]{1,10})?/i) && CTS.Me.username !== "GUEST") Send("nick", CTS.Me.username); //AUTO CORRECT NAME
3043 if (CTS.Me.mod && CTS.Bot && CTS.ScriptInit && CTS.SocketConnected) CheckHost();
3044 CTS.Room = {
3045 "Avatar": arguments[0].room.avatar,
3046 "Bio": arguments[0].room.biography,
3047 "Name": arguments[0].room.name,
3048 "PTT": arguments[0].room.pushtotalk,
3049 "Website": arguments[0].room.website,
3050 "YT_ON": arguments[0].room.youtube_enabled,
3051 "Recent_Gifts": arguments[0].room.recent_gifts
3052 };
3053 CTS.SocketConnected = true;
3054 },
3055 userlist: function() {
3056 var len = arguments[0].users.length;
3057 for (var user = 0; user < len; user++) {
3058 AKBS(arguments[0].users[user]);
3059 var username = (arguments[0].users[user].username === "") ? "GUEST" : arguments[0].users[user].username.toUpperCase();
3060 CheckUserAbuse(arguments[0].users[user].handle, username, arguments[0].users[user].nick.toUpperCase());
3061 CTS.UserList.push({
3062 "handle": arguments[0].users[user].handle,
3063 "username": username,
3064 "nick": arguments[0].users[user].nick,
3065 "owner": arguments[0].users[user].owner,
3066 "mod": arguments[0].users[user].mod,
3067 "namecolor": window.CTSNameColor[Rand(0, window.CTSNameColor.length - 1)],
3068 "avatar": (arguments[0].users[user].avatar === "") ? "https://avatars.tinychat.com/standart/small/eyePink.png" : arguments[0].users[user].avatar,
3069 "canGame": (arguments[0].users[user].username !== "GUEST") ? true : false,
3070 "broadcasting": false,
3071 "vote": 0
3072 });
3073 }
3074 RoomUsers();
3075 debug();
3076 },
3077 join: function() {
3078 AKBS(arguments[0]);
3079 var user = (arguments[0].username === "") ? "GUEST" : arguments[0].username.toUpperCase();
3080 CheckUserAbuse(arguments[0].handle, user, arguments[0].nick.toUpperCase());
3081 if (CTS.HighlightList.includes(user) || CTS.HighlightList.includes(arguments[0].nick.toUpperCase())) {
3082 if (CTS.enableSound === true) window.CTSSound.HIGHLIGHT.play();
3083 }
3084 if (user === "COSMOSIST" && CTS.Room.Name.toUpperCase() !== "STONERCIRCLE" && !CTS.hasGreetedWC) { // Meet your creator
3085 CTS.hasGreetedWC = true;
3086 if (CTS.enableSound === true) window.CTSSound.C.play();
3087 Send("msg", UnicodeConversionList.convert("HI! " + arguments[0].nick.toUpperCase()) + "!");
3088 } else {
3089 if ((CTS.GreetList.includes(user) || CTS.GreetList.includes(arguments[0].nick.toUpperCase()) || (CTS.Host == CTS.Me.handle && CTS.GreetList.includes("-ALL"))) && CTS.NoGreet === false) {
3090 Send("msg", UnicodeConversionList.convert(((window.CTSWelcomes[Rand(0, window.CTSWelcomes.length - 1)] + arguments[0].nick.toUpperCase()) + ((CTS.GreetMode) ? ".\n" + (((user != "GUEST") ? "You are signed in as " + user : "You are not signed in") + ".\nWelcome to the room!") : "!"))));
3091 if (CTS.enableSound === true) window.CTSSound.GREET.play();
3092 }
3093 }
3094 CTS.NoGreet = false;
3095 AddUser(arguments[0].handle, arguments[0].mod, window.CTSNameColor[Rand(0, window.CTSNameColor.length - 1)], (arguments[0].avatar === "") ? "https://avatars.tinychat.com/standart/small/eyePink.png" : arguments[0].avatar, arguments[0].nick, user, ((user !== "GUEST") ? true : false), arguments[0].owner);
3096 RoomUsers();
3097 debug();
3098 },
3099 sysmsg: function() {
3100 if (CTS.Me.mod) {
3101 var action = arguments[0].text.match(/^([a-z0-9_]{1,32}):?\s(closed|banned|kicked)\s([a-z0-9_]{1,32})$/i);
3102 if (action !== null) {
3103 var user;
3104 if (action[2] == "closed" || action[2] == "banned" || action[2] == "kicked") {
3105 user = NicknameToAccount(action[3].toUpperCase());
3106 if (user != -1) {
3107 var a = CTS.GreenRoomList.indexOf(CTS.UserList[user].username);
3108 if (a !== -1) {
3109 //REMOVE
3110 debug("GREENROOMLIST::", "REMOVE USER " + CTS.UserList[user].username + " FROM GREENROOMLIST");
3111 Alert(GetActiveChat(), "?Removing "+CTS.UserList[user].username+" from greenroomlist!");
3112 CommandList.greenroomremove(a);
3113 }
3114 }
3115 }
3116 }
3117 }
3118 AddSystemNotification(HTMLtoTXT(arguments[0].text));
3119 debug();
3120 },
3121 nick: function() {
3122 var user = User(arguments[0].handle);
3123 if (user != -1) {
3124
3125 AddUserNotification(4, CTS.UserList[user].namecolor, CTS.UserList[user].nick, CTS.UserList[user].username, true, arguments[0].nick);
3126
3127 if ((CTS.GreetList.includes(CTS.UserList[user].username) || CTS.GreetList.includes(CTS.UserList[user].nick.toUpperCase()) || (CTS.Host == CTS.Me.handle && CTS.GreetList.includes("-ALL"))) && CTS.NoGreet === false) {
3128 Send("msg", UnicodeConversionList.convert(CTS.UserList[user].nick + "\nwith the account name " + CTS.UserList[user].username + " changed their name to " + arguments[0].nick));
3129 if (CTS.enableSound === true) window.CTSSound.GREET.play();
3130 }
3131
3132 CTS.UserList[user].nick = arguments[0].nick;
3133 if (CTS.Me.handle == arguments[0].handle) CTS.Me.nick = arguments[0].nick;
3134 }
3135 debug();
3136 },
3137 stream_connected: function() {
3138 if (CTS.Host === CTS.Me.handle && CTS.GreenRoomToggle && arguments[0].publish == false && CTS.Me.handle !== arguments[0].handle && !CTS.Camera.List.includes(arguments[0].handle)) {
3139 //USER IS NOT ON CAMERA START AUTO ACCEPT PROCESS
3140 var user = User(arguments[0].handle);
3141 if (user != -1) {
3142 debug("CAMERA::WAITING", "nickname:" + CTS.UserList[user].nick);
3143 if (!CTS.GreenRoomIgnoreList.includes(CTS.UserList[user].username) && CTS.GreenRoomList.includes(CTS.UserList[user].username)) Send("stream_moder_allow", CTS.UserList[user].handle);
3144 }
3145 }
3146 debug();
3147 },
3148 stream_closed: function() {
3149 debug();
3150 },
3151 publish: function() { //ADD GLOBAL CAMERA
3152 CheckUserStream(arguments[0].handle, true);
3153 debug();
3154 },
3155 unpublish: function() { //REMOVE GLOBAL CAMERA
3156 CheckUserStream(arguments[0].handle, false);
3157 debug();
3158 },
3159 ping: function() {
3160 if (CTS.ScriptInit) {
3161 var verify;
3162 if (CTS.WatchList.length > 0) {
3163 verify = new Date() - CTS.WatchList[0][2];
3164 debug("WATCHLIST::LIST", CTS.WatchList);
3165 debug("WATCHLIST::VERIFYING", CTS.WatchList[0][0] + " " + verify + "/600000");
3166 if (CTS.SafeList.indexOf(CTS.WatchList[0][0]) === -1) { //LET'S NOT ADD TWICE
3167 if (verify > 600000) {
3168 debug("WATCHLIST::VERIFIED", CTS.WatchList[0][0] + " " + verify + "/600000");
3169 CTS.SafeList.push(CTS.WatchList[0][0]);
3170 CTS.WatchList.shift();
3171 }
3172 } else {
3173 CTS.WatchList.shift();
3174 }
3175 }
3176 if (CTS.WaitToVoteList.length > 0) {
3177 verify = new Date() - CTS.WaitToVoteList[0][1];
3178 debug("VOTE::LIST", CTS.WaitToVoteList);
3179 debug("VOTE::WAIT", CTS.WaitToVoteList[0][0] + " " + verify + "/300000");
3180 if (verify > 300000) {
3181 debug("VOTE::READY", CTS.WaitToVoteList[0][0] + " " + verify + "/300000");
3182 CTS.WaitToVoteList.shift();
3183 }
3184 }
3185 }
3186 //DISPOSE OF ITEMS
3187 window.TinychatApp.getInstance().defaultChatroom.packetWorker.queue = {};
3188 debug();
3189 },
3190 quit: function() {
3191 if (CTS.ScriptInit) {
3192 if (CTS.WatchList.length > 0) {
3193 var len = CTS.WatchList.length;
3194 for (var i = 0; i < len; i++) {
3195 if (CTS.WatchList[i][1] == arguments[0].handle) {
3196 CTS.WatchList.splice(i, 1);
3197 break;
3198 }
3199 }
3200 }
3201 if (CTS.Me.mod) RemoveUserCamera(arguments[0].handle);
3202 var user = User(arguments[0].handle);
3203 if (user != -1) {
3204 if (CTS.Me.handle === CTS.Host) {
3205 if (Fish.getPlayer(arguments[0].handle, true, false)) {
3206 Send("msg", CTS.Game.Fish.UserQuitLast + ", has slipped off the boat; I don't think we should look back.");
3207 }
3208 }
3209 //SEND THEM OUT
3210 AddUserNotification(2, CTS.UserList[user].namecolor, CTS.UserList[user].nick, CTS.UserList[user].username, true);
3211 CTS.UserList.splice(user, 1);
3212 }
3213 RoomUsers();
3214 if (CTS.Host == arguments[0].handle) {
3215 CTS.Host = 0;
3216 CTS.Camera.Sweep = false;
3217 if (CTS.Me.mod && CTS.Bot) {
3218 setTimeout(function(handle) {
3219 if (CTS.Host == 0) SetBot(false);
3220 }, (Rand(10, 30) * 1000), arguments[0].handle);
3221 }
3222 }
3223 }
3224 debug();
3225 },
3226 msg: function() {
3227 if (CTS.ScriptInit) {
3228 var user = User(arguments[0].handle);
3229 if (user != -1) {
3230 if (!SpamPrevention(arguments[0].text, CTS.UserList[user].mod)) {
3231 if (GamePrevention(arguments[0].text, CTS.UserList[user].mod)) {
3232 var text = HTMLtoTXT(arguments[0].text);
3233 //ALL USERS REPORT
3234 OwnerCommand(user, arguments[0].text);
3235 BotCheck(user, text, arguments[0]);
3236 //MODERATORS
3237 if (CTS.Me.mod) {
3238 if (CTS.Host == CTS.Me.handle) BotCommandCheck(user, text);
3239 CheckUserWordAbuse(user, arguments[0].text);
3240 }
3241
3242 if (!CheckUserIgnore(user) && !CheckUserTempIgnore(user) && IgnoreText(text)) {
3243 //PUSH MESSAGE
3244 CTS.Message[0].push({
3245 "time": Time(),
3246 "namecolor": CTS.UserList[user].namecolor,
3247 "avatar": CTS.UserList[user].avatar,
3248 "username": CTS.UserList[user].username,
3249 "nick": CTS.UserList[user].nick,
3250 "msg": CheckImgur(text),
3251 "mention": false
3252 });
3253 var msg = CTS.Message[0][CTS.Message[0].length - 1];
3254 if (CTS.Me.handle !== arguments[0].handle) {
3255 if (CTS.UserList[user].mod && (text.match(/^!autokick$/i) || text.match(/^!autoban$/i))) {
3256 Alert(GetActiveChat(), "?AntiSpam Watch List CLEARED!\nAnother user has initiated autokick/autoban.");
3257 CTS.AutoKick = false;
3258 CTS.AutoBan = false;
3259 }
3260 if (CTS.enableSound === true) {
3261 if (CTS.UserList.length <= 14) window.CTSSound.MSG.play();
3262 if (CTS.TTS.synth !== undefined && (CTS.TTSList.includes(CTS.UserList[user].username) || CTS.TTSList.includes(CTS.UserList[user].nick.toUpperCase()) || CTS.TTSList.includes("-ALL"))) TTS(CTS.UserList[user].nick + ((!text.match(/(?:^\!)|(?:https?|www|\uD83C\uDFB5)/gim)) ? " said, " + text : "is box banging!"));
3263 }
3264 var len = CTS.MentionList.length;
3265 for (var i = 0; i < len; i++) {
3266 if (text.toUpperCase().includes(CTS.MentionList[i])) {
3267 if (CTS.enableSound === true) window.CTSSound.MENTION.play();
3268 msg.mention = true;
3269 AddUserNotification(3, CTS.UserList[user].namecolor, CTS.UserList[user].nick, CTS.UserList[user].username, true);
3270 }
3271 }
3272 }
3273 if (GetActiveChat() === 0) CreateMessage(msg.time, msg.namecolor, msg.avatar, msg.username, msg.nick, msg.msg, msg.mention, 0);
3274 MessagePopUp(user, text, true, false);
3275 }
3276 }
3277 } else {
3278 if (CTS.Me.mod) Send("kick", arguments[0].handle);
3279 }
3280 }
3281 }
3282 debug();
3283 },
3284 pvtmsg: function() {
3285 if (CTS.ScriptInit) {
3286 if (CTS.enablePMs === true) {
3287 if (arguments[0].handle != CTS.Me.handle) {
3288 var user = User(arguments[0].handle);
3289 if (user != -1) {
3290 if (!SpamPrevention(arguments[0].text, CTS.UserList[user].mod)) {
3291 if (GamePrevention(arguments[0].text, CTS.UserList[user].mod)) {
3292 var text = arguments[0].text;
3293 if (CTS.Me.mod) CheckUserWordAbuse(user, arguments[0].text);
3294 if (!CheckUserIgnore(user) && !CheckUserTempIgnore(user) && IgnoreText(text)) {
3295 if (!CTS.Message[arguments[0].handle]) CTS.Message[arguments[0].handle] = [];
3296 PushPM(arguments[0].handle, text, user);
3297 if (CTS.enableSound === true) {
3298 window.CTSSound.PVTMSG.play();
3299 if (CTS.TTS.synth !== undefined && (CTS.TTSList.includes(CTS.UserList[user].username) || CTS.TTSList.includes(CTS.UserList[user].nick.toUpperCase()) || CTS.TTSList.includes("-ALL"))) TTS(CTS.UserList[user].nick + ((!text.match(/(?:^\!)|(?:https?|www)/gim)) ? " said, " + text : "is box banging!"));
3300 }
3301 MessagePopUp(user, CheckImgur(HTMLtoTXT(text)), false, false);
3302 }
3303 }
3304 } else {
3305 if (CTS.Me.mod) Send("kick", arguments[0].handle);
3306 }
3307 }
3308 }
3309 }
3310 }
3311 debug();
3312 },
3313 gift: function(parse) {
3314 window.DebugClear = false;
3315 Alert(GetActiveChat(), "USER HAS SENT A GIFT--CHECK PACKET OUT!!!\n");
3316 //coming soon a handler near you! :D
3317 console.log(parse);
3318 debug();
3319 },
3320 yut_playlist_add: function() {
3321 if (CTS.ScriptInit) {
3322 if (!CTS.YouTube.Playing) {
3323 if (CTS.PlayListStart === true) CTS.PlayListStart = false;
3324 if (CTS.Host != CTS.Me.handle) {
3325 Send("msg", "!play");
3326 } else {
3327 YouTubePlayList();
3328 }
3329 }
3330 }
3331 debug();
3332 },
3333 yut_playlist: function() {
3334 if (CTS.ScriptInit) {
3335 if (CTS.Me.mod && CTS.Me.handle == CTS.Host) {
3336 if (CTS.YouTube.Clear === true) {
3337 if (arguments[0].items !== null) Send("yut_playlist_clear");
3338 CTS.YouTube.MessageQueueList = [];
3339 Send("msg", "?YouTube cleared!?");
3340 CTS.YouTube.Clear = false;
3341 } else {
3342 if (arguments[0].items === null) {
3343 CTS.PlayListStart = true;
3344 } else {
3345 CTS.YouTube.PlayListCount = arguments[0].items.length;
3346 CTS.PlayListStart = false;
3347 if (CTS.YouTube.ShowQueue === true) {
3348 var msg = "?" + CTS.YouTube.PlayListCount + " track(s) in queue!?";
3349 for (var i = 0; i < 3; i++) {
3350 if (arguments[0].items[i] === undefined) break;
3351 msg = msg + "\n" + (i + 1) + ": " + arguments[0].items[i].title + "\n[" + Math.floor(arguments[0].items[i].duration / 60) + "M" + (arguments[0].items[i].duration % 60) + "S]";
3352 }
3353 Send("msg", msg);
3354 }
3355 }
3356 if (arguments[0].items !== null && CTS.Host == CTS.Me.handle && CTS.YouTube.Playing === false) CheckYouTube("https://www.youtube.com/watch?v=" + arguments[0].items[0].id, false);
3357 }
3358 CTS.YouTube.ShowQueue = false;
3359 }
3360 }
3361 debug();
3362 },
3363 yut_play: function() {
3364 if (CTS.ScriptInit) {
3365 if (CTS.YouTube.CurrentTrack.ID != arguments[0].item.id) {
3366 CTS.YouTube.CurrentTrack.ID = arguments[0].item.id;
3367 CTS.YouTube.CurrentTrack.duration = arguments[0].item.duration;
3368 CTS.YouTube.CurrentTrack.title = arguments[0].item.title;
3369 CTS.YouTube.CurrentTrack.thumbnail = arguments[0].item.image;
3370 MessagePopUp(-1, CTS.YouTube.CurrentTrack.title + " is now playing!", true, true);
3371 }
3372 CTS.YouTube.Playing = true;
3373 YouTubePlayList();
3374 }
3375 debug();
3376 },
3377 yut_stop: function() {
3378 if (CTS.ScriptInit) {
3379 CTS.YouTube.CurrentTrack.ID = undefined;
3380 CTS.YouTube.CurrentTrack.duration = undefined;
3381 CTS.YouTube.CurrentTrack.title = undefined;
3382 CTS.YouTube.CurrentTrack.thumbnail = undefined;
3383 CTS.YouTube.Playing = false;
3384 YouTubePlayList();
3385 }
3386 debug();
3387 }
3388 };
3389 var ServerOutList = {
3390 pvtmsg: function() {
3391 if (CTS.ScriptInit) {
3392 Command(arguments[0].text, true);
3393 var text = arguments[0].text;
3394 if (!CTS.Message[arguments[0].handle]) CTS.Message[arguments[0].handle] = [];
3395 PushPM(arguments[0].handle, text);
3396 }
3397 debug();
3398 },
3399 msg: function() {
3400 if (CTS.ScriptInit) {
3401 CTS.LastMessage = new Date();
3402 Command(arguments[0].text, false);
3403 }
3404 debug();
3405 },
3406 ban: function() {
3407 CheckSafeList(arguments[0].handle, true);
3408 debug();
3409 },
3410 kick: function() {
3411 CheckSafeList(arguments[0].handle, true);
3412 debug();
3413 },
3414 stream_moder_close: function() {
3415 CheckSafeList(arguments[0].handle, true);
3416 debug();
3417 }
3418 };
3419 //ADDON
3420 var Addon = {
3421 active: function() {
3422 if (window.CTSAddon !== undefined) {
3423 if (window.CTSAddon[arguments[0]] !== undefined) {
3424 return true;
3425 }
3426 }
3427 return false;
3428 },
3429 get: function() {
3430 return window.CTSAddon[arguments[0]];
3431 }
3432 };
3433 //XMLHttpRequest
3434 CTS.YouTube.XHR.onload = function() {
3435 var response = JSON.parse(CTS.YouTube.XHR.responseText);
3436 if (response.error) {
3437 Send("msg", "⛔" + ((response.error.errors[0].reason) ? response.error.errors[0].reason : "Track could not be added!") + "⛔");
3438 } else {
3439 if (response.kind == "youtube#playlistItemListResponse" && response.nextPageToken === undefined && response.items.length === 0) {
3440 CTS.YouTube.ListBuilt = true;
3441 Send("msg", "?Found " + CTS.YouTube.MessageQueueList.length + " tracks!\nThis may take a few moments to add, requests can be made shortly.?");
3442 CTS.YouTube.DataReady = true;
3443 CTS.YouTube.Busy = false;
3444 YouTubeTrackAdd();
3445 }
3446 CTS.YouTube.DataReady = false;
3447 if (response.items[0]) {
3448 CTS.YouTube.Busy = true;
3449 if (response.items[0].id) {
3450 if (response.kind == "youtube#playlistItemListResponse") {
3451 YouTubePlayListItems(response.items);
3452 } else {
3453 CTS.YouTube.VideoID = response.items[0].id.videoId;
3454 CTS.YouTube.XHR.open("GET", "https://www.googleapis.com/youtube/v3/videos?id=" + CTS.YouTube.VideoID + "&type=video&eventType=completed&part=contentDetails,snippet&fields=items/snippet/title,items/snippet/thumbnails/medium,items/contentDetails/duration&eventType=completed&key=" + CTS.YouTube.API_KEY);
3455 CTS.YouTube.XHR.send();
3456 }
3457 } else if (response.items[0].contentDetails.duration) {
3458 CTS.YouTube.DataReady = true;
3459 }
3460 if (CTS.YouTube.DataReady === false) {
3461 CTS.YouTube.Busy = false;
3462 if (response.kind == "youtube#searchListResponse") CTS.YouTube.XHR.videoid = response.items[0].id.videoId;
3463 if (response.kind == "youtube#playlistItemListResponse") {
3464 CTS.YouTube.ListBuilt = true;
3465 Send("msg", "?Adding " + CTS.YouTube.MessageQueueList.length + " track(s) to queue!?\nEnjoy!");
3466 CTS.YouTube.Busy = false;
3467 }
3468 } else {
3469 CTS.YouTube.VideoID = (CTS.YouTube.XHR.videoid) ? CTS.YouTube.XHR.videoid : CTS.YouTube.MessageQueueList[0].snippet.resourceId.videoId;
3470 if (CTS.YouTube.Playing === true) {
3471 MessagePopUp(-1, "Added " + ((response.items[0] === undefined) ? response.items.snippet.title : response.items[0].snippet.title), true, true);
3472 Send("yut_playlist_add", [CTS.YouTube.VideoID, YouTubeTimeConvert(response.items[0].contentDetails.duration), ((response.items[0] === undefined) ? response.items.snippet.title : response.items[0].snippet.title), (response.items[0] === undefined) ? response.items.snippet.thumbnails.medium.url : response.items[0].snippet.thumbnails.medium.url]);
3473 CTS.YouTube.Busy = false;
3474 } else {
3475 if (response.items[0].snippet.title !== undefined) {
3476 Send("yut_play", [CTS.YouTube.VideoID, YouTubeTimeConvert(response.items[0].contentDetails.duration), response.items[0].snippet.title, response.items[0].snippet.thumbnails.medium.url, 0]);
3477 Send("yut_playlist_remove", [CTS.YouTube.XHR.videoid, YouTubeTimeConvert(response.items[0].contentDetails.duration), response.items[0].snippet.title, response.items[0].snippet.thumbnails.medium.url]);
3478 CTS.YouTube.Playing = true;
3479 }
3480 CTS.YouTube.Busy = false;
3481 }
3482 }
3483 }
3484 if (CTS.YouTube.SearchReturn === true || (CTS.YouTube.SearchReturn === false && CTS.YouTube.VideoReturn === true && CTS.YouTube.XHR.type === true)) {
3485 var title = "";
3486 CTS.YouTube.SearchReturn = false;
3487 CTS.YouTube.VideoReturn = false;
3488 if (response.items[0] !== undefined) {
3489 if (response.items[0].length > 0) title = response.items[0].snippet.title;
3490 }
3491 if (response.items !== undefined) {
3492 if (response.items.length > 0) title = response.items[0].snippet.title;
3493 }
3494 Send("msg", ((title === "") ? "⛔Track could not be added!⛔" : "?Added " + DecodeTXT(title) + " to queue!?"));
3495 }
3496 if (CTS.YouTube.MessageQueueList.length > 0) YouTubeTrackAdd();
3497 }
3498 };
3499 //Chuck Norris Jokes API (https://api.chucknorris.io/)
3500 CTS.Chuck.XHR.onload = function() {
3501 var resp = JSON.parse(CTS.Chuck.XHR.responseText),
3502 msg = "[CHUCK NORRIS]\n" + resp.value;
3503 if (resp !== null) Send("msg", msg.substr(0, 499));
3504 };
3505 //https://api.Urb.com/
3506 CTS.Urb.XHR.onload = function() {
3507 var resp = JSON.parse(CTS.Urb.XHR.responseText),
3508 msg = "[URBAN DICTIONARY]\n" + ((resp.list[0] !== undefined) ? resp.list[0].word + "\n" + resp.list[0].definition : "Nothing was found!");
3509 if (resp !== null) Send("msg", msg.substr(0, 499));
3510 };
3511 //icanhazdadjoke API (https://icanhazdadjoke.com/)
3512 CTS.Dad.XHR.onload = function() {
3513 var resp = JSON.parse(CTS.Dad.XHR.responseText),
3514 msg = "[DAD JOKE]\n" + resp.joke;
3515 if (resp !== null) Send("msg", msg.substr(0, 499));
3516 };
3517 //adviceslip API (https://api.adviceslip.com/advice)
3518 CTS.Advice.XHR.onload = function() {
3519 var resp = JSON.parse(CTS.Advice.XHR.responseText),
3520 msg = "[ADVICE]\n" + resp.slip.advice;
3521 if (resp !== null) Send("msg", msg.substr(0, 499));
3522 };
3523 //GAME LIST FUNCTION
3524 var Fish = {
3525 //INIT
3526 init: function() {
3527 if (CTS.Me.handle == CTS.Host && CTS.CanHostGames === true) {
3528 Send("msg", "[FISH]\n!fish at any time and upgrade your way up!\n\n!gameview to show/hide game.\n\nRemember there's a five second delay for all commands, don't spam!\nFor commands type !fishhelp!");
3529 CTS.Game.Fish.StartTimeout = setTimeout(function(g) {
3530 g.cast();
3531 }, 5000, this);
3532 }
3533 },
3534 //PLAYERS
3535 addPlayer: function(handle, username, nickname) {
3536 if (!this.getPlayer(handle, false, false) && CTS.CanHostGames === true) {
3537 if (isSafeListed(username)) {
3538 CTS.Game.Fish.Player.push({
3539 Handle: handle,
3540 Username: username,
3541 Nickname: nickname,
3542 LastCheck: new Date() - 5000,
3543 Points: 5000,
3544 Upgrades: {
3545 Net: 1,
3546 Store: 1,
3547 Radar: 1,
3548 Insurance: false
3549 },
3550 });
3551 Send("msg", "[FISHING BOAT]\n" + nickname.substr(0, 16) + "...\n has jumped aboard.\nType !fishhelp for commands if you don't already know!");
3552 if (this.getPlayer() == 0) this.init();
3553 }
3554 }
3555 },
3556
3557 getPlayer: function(handle, del, exists) {
3558 var len = CTS.Game.Fish.Player.length;
3559 if (handle !== undefined) {
3560 for (var player = 0; player < len; player++) {
3561 if (CTS.Game.Fish.Player[player].Handle == handle) {
3562 if (exists) return CTS.Game.Fish.Player[player];
3563 if (del) {
3564 CTS.Game.Fish.UserQuitLast = CTS.Game.Fish.Player[player].Nickname;
3565 CTS.Game.Fish.Player.splice(player, 1);
3566 }
3567 if (!exists) return true;
3568 }
3569 }
3570 if (!exists) {
3571 return false;
3572 } else {
3573 return -1;
3574 }
3575 } else {
3576 return len - 1;
3577 }
3578 },
3579
3580 listPlayers: function() {
3581 var msg = "[FISHING BOAT]\nTOP 5 PLAYERS:\n",
3582 place = 0;
3583 for (var u = arguments[0]; u >= 0; u--) {
3584 place++;
3585 if (u < 5) {
3586 msg += place + ":" + CTS.Game.Fish.Player[u].Nickname + "[$" + CTS.Game.Fish.Player[u].Points + "]\n";
3587 }
3588 CTS.Game.Fish.Player[u].Upgrades.Insurance = false;
3589 CTS.Game.Fish.Player[u].Points += 10000;
3590 }
3591 Send("msg", msg);
3592 },
3593
3594 winner: function() {
3595 CTS.Game.Fish.Player.sort(function(a, b) {
3596 return a.Points - b.Points;
3597 });
3598 if (CTS.Game.Fish.HighScore[1] < CTS.Game.Fish.Player[0].Points) {
3599 Send("msg", "[FISHING HIGH SCORE]\nNEW HIGH SCORE,\nKeep going " + CTS.Game.Fish.Player[0].Nickname + "!");
3600 CTS.Game.Fish.HighScore = [CTS.Game.Fish.Player[0].Nickname, CTS.Game.Fish.Player[0].Points];
3601 Save("FishHighScore", JSON.stringify(CTS.Game.Fish.HighScore));
3602 }
3603 var len = CTS.Game.Fish.Player.length - 1;
3604 Send("msg", "[FISHING BOAT HIGH SCORE]\nHIGH SCORE:\n" + CTS.Game.Fish.HighScore[0] + " : $" + CTS.Game.Fish.HighScore[1] + "\n\nROUND WINNER:\n" + CTS.Game.Fish.Player[len].Nickname + " : $" + CTS.Game.Fish.Player[len].Points + "!\n\nNext round will start in thirty seconds!");
3605 this.listPlayers(len);
3606 CTS.Game.Fish.RestockTimeout = setTimeout(function(g) {
3607 g.reset(false, true);
3608 }, 30000, this);
3609 },
3610 //PRICELIST
3611 pricelist: function(playerExist, item) {
3612 if (item == 0) { // net
3613 return (1000 * playerExist.Upgrades.Net * playerExist.Upgrades.Net * playerExist.Upgrades.Net);
3614 } else if (item == 1) { // radar
3615 return (1000 * playerExist.Upgrades.Radar * 2) + 3500;
3616 } else if (item == 2) { // shop
3617 return (playerExist.Upgrades.Store * playerExist.Upgrades.Store * 25000);
3618 } else if (item == 3) { // insurance
3619 return (20000);
3620 } else if (item == 4) { // rob
3621 return (10000);
3622 } else if (item == 5) { // slap
3623 return (50000);
3624 } else if (item == 6) { // split (min$) / gamble
3625 return (1000);
3626 }
3627 },
3628 //GAMEPLAY
3629 cast: function() {
3630 clearTimeout(CTS.Game.Fish.StartTimeout);
3631 if (CTS.Host === CTS.Me.handle) {
3632 if (this.getPlayer() >= 0) {
3633 if (CTS.Game.Fish.Round < 10) {
3634 CTS.Game.Fish.Round++;
3635 var playerlen,
3636 fishlen = CTS.Game.Fish.TypesOfFish.length - 1,
3637 id,
3638 type,
3639 handle,
3640 eliminate = false,
3641 msgeliminate,
3642 value,
3643 msg = "[FISHING BOAT]\n";
3644 for (var cast = 0; cast <= 2; cast++) {
3645 playerlen = this.getPlayer();
3646 id = Rand(0, playerlen);
3647 type = Rand(CTS.Game.Fish.Player[id].Upgrades.Radar, fishlen);
3648 if (Rand(0, 100) <= Rand(10, 70)) {
3649 var net = Rand(1, CTS.Game.Fish.Player[id].Upgrades.Net);
3650 value = (net * CTS.Game.Fish.TypesOfFish[type][1] * 40 * CTS.Game.Fish.Player[id].Upgrades.Store);
3651 if (CTS.Game.Fish.TypesOfFish[type][2] === true) {
3652 CTS.Game.Fish.Player[id].Points += value;
3653 msg += (CTS.Game.Fish.Player[id].Nickname.substr(0, 16) + "...[$" + CTS.Game.Fish.Player[id].Points + "]:\n?" + net + " x " + CTS.Game.Fish.TypesOfFish[type][0] + " +$" + value + "\n");
3654 } else {
3655 if (!CTS.Game.Fish.Player[id].Upgrades.Insurance) {
3656 CTS.Game.Fish.Player[id].Points -= value;
3657 msg += (CTS.Game.Fish.Player[id].Nickname.substr(0, 16) + "..." + ((CTS.Game.Fish.Player[id].Points < 0) ? "[broke]" : "[$" + CTS.Game.Fish.Player[id].Points + "]") + ":\n?" + CTS.Game.Fish.TypesOfFish[type][0] + " -$" + value + "\n");
3658 } else {
3659 msg += (CTS.Game.Fish.Player[id].Nickname.substr(0, 16) + "...[$" + CTS.Game.Fish.Player[id].Points + "]:\n?" + net + " x " + CTS.Game.Fish.TypesOfFish[type][0] + " -$0\n");
3660 }
3661 }
3662 } else {
3663 cast--;
3664 }
3665 if (this.getPlayer() == -1) break;
3666 if (CTS.Game.Fish.Player[id].Points < 0) {
3667 eliminate = true;
3668 handle = CTS.Game.Fish.Player[id].Handle;
3669 msgeliminate = "[FISHING BOAT]\n" + (CTS.Game.Fish.Player[id].Nickname.substr(0, 16) + "...\nCan walk the plank for costing me my moneys!");
3670 CTS.Game.Fish.Player.splice(id, 1);
3671 break;
3672 }
3673 }
3674 if (msg !== "[FISHING BOAT]\n") Send("msg", msg);
3675 if (eliminate) {
3676 eliminate = false;
3677 Send("msg", msgeliminate);
3678 }
3679 CTS.Game.Fish.ReCastTimeout = setTimeout(function(g) {
3680 g.cast();
3681 }, Rand(90000, 120000), this);
3682 } else {
3683 this.winner();
3684 }
3685 } else {
3686 //RESTART
3687 Fish.stop();
3688 }
3689 }
3690 },
3691 //STOPPERS
3692 reset: function(stop, bypass) {
3693 var get = this.getPlayer();
3694 if (get !== undefined) {
3695 if (get >= 0 && !CTS.Game.NoReset || bypass !== undefined) {
3696 CTS.Game.Fish.Round = 0;
3697 clearTimeout(CTS.Game.Fish.StartTimeout);
3698 clearTimeout(CTS.Game.Fish.RestockTimeout);
3699 clearTimeout(CTS.Game.Fish.ReCastTimeout);
3700 clearTimeout(CTS.Game.Fish.NotEnoughTimeout);
3701 if (!stop) {
3702 this.init();
3703 } else {
3704 if (CTS.Game.Fish.Player.length > 0) Send("msg", "[FISHING BOAT]\nWelp... Boat sank! I'm not refunding anyone!");
3705 CTS.Game.Fish.Player = [];
3706 }
3707 }
3708 }
3709 },
3710
3711 stop: function() {
3712 CTS.Game.NoReset = false;
3713 this.reset(true, true);
3714 }
3715 };
3716 var FishList = {
3717 fish: function(playerExist, user) {
3718 Fish.addPlayer(user.handle, user.username, user.nick);
3719 },
3720
3721 fishbank: function(playerExist) {
3722 if (playerExist !== -1 && FishTimerCheck(playerExist)) Send("msg", "[FISHING BOAT]\n" + playerExist.Nickname.substr(0, 16) + ", you have $" + playerExist.Points + ".");
3723 },
3724
3725 fishrob: function(playerExist, target) {
3726 if (playerExist !== -1 && FishTimerCheck(playerExist)) {
3727 var CanEliminate = Fish.getPlayer(UsernameToHandle(target.toUpperCase()), false, true);
3728 FishTransfer(playerExist, CanEliminate, Fish.pricelist(playerExist, 4), Rand(5000, 20000), true);
3729 }
3730 },
3731 fishgamble: function(playerExist) {
3732 if (playerExist !== -1 && FishTimerCheck(playerExist)) {
3733 if (FishTransaction(playerExist, Fish.pricelist(playerExist, 6))) {
3734 var winnings;
3735 if (Rand(1, 10) === 7) { // 10% chance
3736 winnings = Rand(1000, 25000);
3737 playerExist.Points += winnings;
3738 Send("msg", "[FISHING BOAT]\n" + playerExist.Nickname + " you've won $" + winnings);
3739 } else {
3740 if (Rand(1, 7) === 4) { // 15%
3741 winnings = Rand(1000, 5000);
3742 playerExist.Points += winnings;
3743 Send("msg", "[FISHING BOAT]\n" + playerExist.Nickname + " you've won $" + winnings);
3744 } else {
3745 Send("msg", "[FISHING BOAT]\n" + playerExist.Nickname + " tough luck, you lost $1000!");
3746 }
3747 }
3748 }
3749 }
3750 },
3751 fishslap: function(playerExist, target) {
3752 if (playerExist !== -1 && FishTimerCheck(playerExist)) {
3753 var user = UsernameToUser(target.toUpperCase());
3754 if (user !== -1) {
3755 if (CTS.UserList[user].broadcasting && CTS.UserList[user].handle !== CTS.Me.handle) {
3756 if (CTS.Me.owner || !CTS.UserList[user].mod) {
3757 if (FishTransaction(playerExist, Fish.pricelist(playerExist, 5))) {
3758 Send("stream_moder_close", CTS.UserList[user].handle);
3759 Send("msg", playerExist.Nickname + " has paid to close your camera " + CTS.UserList[user].nick + "!");
3760 }
3761 } else {
3762 Send("msg", "Cannot close moderator!");
3763 }
3764 } else {
3765 Send("msg", "Cannot close user!");
3766 }
3767 }
3768 }
3769 },
3770
3771 fishsplit: function(playerExist, target) {
3772 if (playerExist !== -1 && FishTimerCheck(playerExist)) {
3773 var CanEliminate = Fish.getPlayer(UsernameToHandle(target.toUpperCase()), false, true);
3774 FishTransfer(playerExist, CanEliminate, Fish.pricelist(playerExist, 6), Math.round(playerExist.Points / 2), false);
3775 }
3776 },
3777
3778 fishupgrade: function(playerExist) {
3779 if (playerExist !== -1 && FishTimerCheck(playerExist)) FishUpgradeStatus(playerExist, 0);
3780 },
3781
3782 fishhelp: function(playerExist) {
3783 if (playerExist !== -1 && FishTimerCheck(playerExist)) FishUpgradeStatus(playerExist, 6);
3784 },
3785
3786 fishupgradenet: function(playerExist) {
3787 if (playerExist !== -1 && FishTimerCheck(playerExist)) {
3788 if (playerExist.Upgrades.Net >= 10) {
3789 Send("msg", playerExist.Nickname + ", you own all upgrades.");
3790 } else {
3791 if (FishTransaction(playerExist, Fish.pricelist(playerExist, 0))) {
3792 playerExist.Upgrades.Net += 1;
3793 FishUpgradeStatus(playerExist, 1);
3794 }
3795 }
3796 }
3797 },
3798
3799 fishupgradeshop: function(playerExist) {
3800 if (playerExist !== -1 && FishTimerCheck(playerExist)) {
3801 if (playerExist.Upgrades.Store >= 6) {
3802 Send("msg", playerExist.Nickname + ", you own them all already!");
3803 } else {
3804 if (FishTransaction(playerExist, Fish.pricelist(playerExist, 2))) {
3805 playerExist.Upgrades.Store += 1;
3806 FishUpgradeStatus(playerExist, 4);
3807 }
3808 }
3809 }
3810 },
3811
3812 fishupgraderadar: function(playerExist) {
3813 if (playerExist !== -1 && FishTimerCheck(playerExist)) {
3814 if (playerExist.Upgrades.Radar >= 20) {
3815 Send("msg", playerExist.Nickname + ", you own all upgrades.");
3816 } else {
3817 if (FishTransaction(playerExist, Fish.pricelist(playerExist, 1))) {
3818 playerExist.Upgrades.Radar += 5;
3819 FishUpgradeStatus(playerExist, 2);
3820 }
3821 }
3822 }
3823 },
3824
3825 fishupgradeinsurance: function(playerExist) {
3826 if (playerExist !== -1 && FishTimerCheck(playerExist)) {
3827 if (playerExist.Upgrades.Insurance === true) {
3828 Send("msg", playerExist.Nickname + ", you already have insurance!");
3829 } else {
3830 if (FishTransaction(playerExist, Fish.pricelist(playerExist, 3))) {
3831 playerExist.Upgrades.Insurance = true;
3832 FishUpgradeStatus(playerExist, 3);
3833 }
3834 }
3835 }
3836 }
3837 };
3838 //MISC FUNCTION
3839 function debug() {
3840 if (window.DebugClear === false) {
3841 if (arguments[0] !== undefined) {
3842 var msg = "CTS::" + arguments[0];
3843 if (arguments[1]) msg = msg + "\n" + JSON.stringify(arguments[1]);
3844 console.log(msg);
3845 }
3846 } else {
3847 console.clear();
3848 }
3849 }
3850
3851 function Reset() {
3852 CTS.UserList = [];
3853 CTS.Me = [];
3854 CTS.Room = [];
3855 CTS.SendQueue = [];
3856 CTS.Camera.List = [];
3857 CTS.Camera.List = [];
3858 CTS.WaitToVoteList = [];
3859 CTS.WatchList = [];
3860 CTS.Host = 0;
3861 CTS.HostAttempt = 0;
3862 CTS.HostWaiting = false;
3863 CTS.TempIgnoreList = [];
3864 // Fish Reset
3865 Fish.stop();
3866 }
3867
3868 function Remove() {
3869 return (arguments[1] !== undefined) ? arguments[0].querySelector(arguments[1]).parentNode.removeChild(arguments[0].querySelector(arguments[1])) : arguments[0].parentNode.removeChild(arguments[0]);
3870 }
3871})();