peka2tv chat v1.x

sc2tv.ru chat extra features

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        peka2tv chat v1.x
// @namespace   sc2tv.ru
// @description sc2tv.ru chat extra features
// @author      Winns
// @copyright   27.04.2013, Winns
// @include     http://chat.sc2tv.ru/*
// @version     1.1.5
// @grant       GM_getValue
// @grant       GM_setValue
// @grant       GM_addStyle
// @grant       GM_getResourceText
// @require     http://code.jquery.com/jquery-2.0.2.min.js
// @resource    peka2tv_chat_style https://raw.github.com/Winns/p2tv/master/peka2tv_chat/peka2tv_chat.css
// ==/UserScript==

GM_addStyle (GM_getResourceText ("peka2tv_chat_style"));

$(document).ready(function() {
	// variables
		var msgsLimit	= 20,
			linksLimit	= 20,
			uMsgLimit	= 20,
			doScroll	= true,
			chatHeight	= $('#chat').height();
	// variables end

	// functions begin
		// handle chat config box open/close
		function p2tv_chat_box_openclose(e) {
			var e = $( e ); 
			if ( e.is(':visible') ) {
				e.fadeOut(150);
			} else {
				e.fadeIn(150);
			}
		}

		function p2tv_chat_checkInputLength() {
			if ( ($('[name="chat-text"]').val().length) > 21 ) {
				$('#chat').css('height', (chatHeight - 36) + 'px');
				$('#chat').scrollTop( $('#chat').prop('scrollHeight') );
				$('[name="chat-text"]').css('height', '54px');
			} else {
				$('#chat').stop().css('height', chatHeight + 'px');
				$('#chat').scrollTop( $('#chat').prop('scrollHeight') );
				$('[name="chat-text"]').css('height', '18px');
			}
		}
		
		function p2tv_chat_setCursorToEnd() {
			var e = $('[name="chat-text"]');
			e.focus();
			e[0].setSelectionRange(e.val().length, e.val().length);
		}
	// functions end
	
	
	// handle chat input size
		// get chat height on fullscreen button click
		$('#chat-switch-screen-btn').on('mouseup', function(){
			chatHeight = $('#chat').height();
		});

		// replace chat input with textarea 
		$('[name="chat-text"]').replaceWith('<textarea name="chat-text" class="chat-text"></textarea>');
		
		// handle input size 
		$('[name="chat-text"]').on('keyup keypress blur focus change', function(){
			p2tv_chat_checkInputLength();
		});
		// force textarea message submit on enter
		$('[name="chat-text"]').on('keypress', function(e){
			if(e.which == 13){
				e.preventDefault();
				unsafeWindow.WriteMessage();
				return false; 
			}
		});
		

	
	// config frame
		// create config box
		$('<div id="p2tv_chat_config_wrapper" class="p2tv_chat_widget_wrapper">'
			+'<div id="p2tv_chat_config_close" class="p2tv_chat_widget_close"><em>CONFIG</em>CLOSE</div>'
			+'</div>'
		).appendTo( '#chat-form' );
		$('#chat-form').contents().not('form', '#p2tv_chat_config_wrapper').appendTo('#p2tv_chat_config_wrapper');
			
		// create config button
		$('<a href="javascript:// config" id="p2tv_chat_configbox_btn" class="p2tv_chat_widget_btn" data-target="#p2tv_chat_config_wrapper" title="open/close">CFG</a>')
		.appendTo( '#chat-form' );
		
		// handle chat config box open/close
		$('#p2tv_chat_configbox_btn').on('click', function() {
			p2tv_chat_box_openclose( '#p2tv_chat_config_wrapper' );
		});
		// handle chat config box close
		$('#p2tv_chat_config_close').on('click', function() {
			$('#p2tv_chat_config_wrapper').fadeOut(300);
		});	
	
	
	
	
	// admins msg's frame
		// create admins msg's button
		$('<a href="javascript:// config" id="p2tv_chat_adminsbox_btn" class="p2tv_chat_widget_btn" data-target="#p2tv_chat_adminsbox_wrapper" title="open/close">COL. MSG\'S</a>')
		.appendTo( '#chat-form' );
		
		// create admins msg's box
		$('<div id="p2tv_chat_adminsbox_wrapper" class="p2tv_chat_widget_wrapper">'
			+'<div id="p2tv_chat_adminsbox_close" class="p2tv_chat_widget_close"><em>"COLORED NICKS" MESSAGES</em>CLOSE</div>'
			+'<div id="p2tv_chat_adminsbox" class="p2tv_chat_widget_content"></div>'
			+'</div>'
		).appendTo( '#chat-form' );

		function p2tv_getAdminsMsgsFromChat( scroll ) {
			if ( typeof(scroll)==='undefined' ) { scroll = doScroll; }

			// push adms msgs
			var msgsSelect = $('#chat .mess .nick').not('.role-user');
			msgsSelect.each(function() {
				$('<div class="p2tv_chat_adminsbox_msg p2tv_chat_widget_msg" data-unique="'+ $(this).parent().attr('class') +'">'
						+$(this).prop('outerHTML')
						+$(this).parent().find('.text').prop('outerHTML')
					+'</div>'
				).appendTo( '#p2tv_chat_adminsbox' );
			});
			
			// remove duplicates
			if ( msgsSelect.length < msgsLimit ) {
				var p2tv_adminsmsgs_duplicateCheck = {};
				$( $('.p2tv_chat_adminsbox_msg').get().reverse() ).each (function () {
					if (p2tv_adminsmsgs_duplicateCheck.hasOwnProperty( $(this).attr('data-unique') )) {
						$(this).remove();
					} else {
						p2tv_adminsmsgs_duplicateCheck[ $(this).attr('data-unique') ] = true;
					}
				});
			}
			
			// delete amd msgs if over limit
			var msgsInFrame = $('.p2tv_chat_adminsbox_msg');
			if ( msgsInFrame.length > msgsLimit ) {
				msgsInFrame.slice(0, msgsInFrame.length - msgsLimit).remove();
			}

			if ( scroll == true ) {
				$('#p2tv_chat_adminsbox').scrollTop( $('#p2tv_chat_adminsbox').prop('scrollHeight') );
			}
		}

		// handle chat admins msg's box open/close
		$('#p2tv_chat_adminsbox_btn').on('click', function() {
			p2tv_chat_box_openclose( '#p2tv_chat_adminsbox_wrapper' );
			p2tv_getAdminsMsgsFromChat();
		});
		// handle chat admins msg's box close
		$('#p2tv_chat_adminsbox_close').on('click', function() {
			$('#p2tv_chat_adminsbox_wrapper').fadeOut(300);
		});
		
		
		

	// links frame	
		// create links button
		$('<a href="javascript:// config" id="p2tv_chat_linksbox_btn" class="p2tv_chat_widget_btn" data-target="#p2tv_chat_links_wrapper" title="open/close">LINKS</a>')
		.appendTo( '#chat-form' );

		// create links box
		$('<div id="p2tv_chat_links_wrapper" class="p2tv_chat_widget_wrapper">'
			+'<div id="p2tv_chat_links_close" class="p2tv_chat_widget_close"><em>LINKS</em>CLOSE</div>'
			+'<div id="p2tv_chat_links" class="p2tv_chat_widget_content"></div>'
			+'</div>'
		).appendTo( '#chat-form' );
		
		// get links from chat
		function p2tv_getLinksFromChat( scroll ) {
			if ( typeof(scroll)==='undefined' ) { scroll = doScroll; }

			// push links
			var linksSelect = $('#chat .mess .text a');
			linksSelect.each(function() {
				$('<div class="p2tv_chat_link_msg p2tv_chat_widget_msg" data-unique="'+ $(this).parent().parent().attr('class') +'">'
						+$(this).parent().parent().find('.nick').prop('outerHTML')
						+'<a href="'+ $(this).attr('href') +'" target="_blank">'+ $(this).attr('href') +'</a>'
					+'</div>'
				).appendTo( '#p2tv_chat_links' );
			});
			
			// remove duplicates
			if ( linksSelect.length < linksLimit ) {
				var p2tv_links_duplicateCheck = {};
				$( $('.p2tv_chat_link_msg').get().reverse() ).each (function () {
					if (p2tv_links_duplicateCheck.hasOwnProperty( $(this).attr('data-unique') )) {
						$(this).remove();
					} else {
						p2tv_links_duplicateCheck[ $(this).attr('data-unique') ] = true;
					}
				});
			}
			
			// delete links if over limit
			var linksInFrame = $('.p2tv_chat_link_msg');
			if (linksInFrame.length > linksLimit) {
				linksInFrame.slice(0, linksInFrame.length - linksLimit).remove();
			}

			if ( scroll == true ) {
				$('#p2tv_chat_links').scrollTop( $('#p2tv_chat_links').prop('scrollHeight') );
			}
		}
		
		// handle chat links box open/close
		$('#p2tv_chat_linksbox_btn').on('click', function() {
			p2tv_chat_box_openclose( '#p2tv_chat_links_wrapper' );
			p2tv_getLinksFromChat();
		});
		// handle chat links box close
		$('#p2tv_chat_links_close').on('click', function() {
			$('#p2tv_chat_links_wrapper').fadeOut(300);
		});

		
		
	// msg's for user frame	
		// msg's for user button
		$('<a href="javascript:// config" id="p2tv_chat_usermsg_btn" class="p2tv_chat_widget_btn" data-target="#p2tv_chat_usermsg_wrapper" title="open/close">4 YOU</a>')
		.appendTo( '#chat-form' );

		// msg's for user box
		$('<div id="p2tv_chat_usermsg_wrapper" class="p2tv_chat_widget_wrapper">'
			+'<div id="p2tv_chat_usermsg_close" class="p2tv_chat_widget_close"><em>MESSAGES FOR YOU</em>CLOSE</div>'
			+'<div id="p2tv_chat_usermsg" class="p2tv_chat_widget_content"></div>'
			+'</div>'
		).appendTo( '#chat-form' );
		
		// get msgs from chat
		function p2tv_getUserMsgFromChat( scroll ) {
			if ( typeof(scroll)==='undefined' ) { scroll = doScroll; }

			// push user msgs
			var uMsgSelect = $('#chat .mess .message-to-user');
			uMsgSelect.each(function() {
				$('<div class="p2tv_chat_usermsg_msg p2tv_chat_widget_msg" data-unique="'+ $(this).parent().attr('class') +'">'
						+$(this).parent().find('.nick').prop('outerHTML')
						+$(this).prop('outerHTML')
					+'</div>'
				).appendTo( '#p2tv_chat_usermsg' );
			});
			
			// remove duplicates
			if ( uMsgSelect.length < uMsgLimit ) {
				var p2tv_uMsg_duplicateCheck = {};
				$( $('.p2tv_chat_usermsg_msg').get().reverse() ).each (function () {
					if (p2tv_uMsg_duplicateCheck.hasOwnProperty( $(this).attr('data-unique') )) {
						$(this).remove();
					} else {
						p2tv_uMsg_duplicateCheck[ $(this).attr('data-unique') ] = true;
					}
				});
			}
			
			// delete user msgs if over limit
			var uMsgInFrame = $('.p2tv_chat_usermsg_msg');
			if (uMsgInFrame.length > uMsgLimit) {
				uMsgInFrame.slice(0, uMsgInFrame.length - uMsgLimit).remove();
			}

			if ( scroll == true ) {
				$('#p2tv_chat_usermsg').scrollTop( $('#p2tv_chat_usermsg').prop('scrollHeight') );
			}
		}
		
		// handle msg's for user box open/close
		$('#p2tv_chat_usermsg_btn').on('click', function() {
			p2tv_chat_box_openclose( '#p2tv_chat_usermsg_wrapper' );
			p2tv_getUserMsgFromChat();
		});
		// handle chat links box close
		$('#p2tv_chat_usermsg_close').on('click', function() {
			$('#p2tv_chat_usermsg_wrapper').fadeOut(300);
		});
		
		
		
	// smiles frame
		// create new siles box
		$('<div id="p2tv_chat_smiles_wrapper" class="p2tv_chat_widget_wrapper">'
			+'<div id="p2tv_chat_smiles_close" class="p2tv_chat_widget_close"><em>SMILES</em>CLOSE</div>'
			+'<div id="p2tv_chat_smiles"></div>'
			+'</div>'
		).appendTo( '#chat-form' );
		
		// insert smiles to new siles box
		$('#chat-smile-panel img').each(function() {
			$(this).appendTo('#p2tv_chat_smiles');
		});
		
		// del old smile button and insert new
		$('#smile-btn').remove();
		$('<a href="javascript:// view smiles" id="p2tv_chat_smilesbox_btn" class="p2tv_chat_widget_btn" data-target="#p2tv_chat_smiles_wrapper" title="open/close">SML</a>')
		.appendTo( '#chat-form' );
		
		// handle chat smile box open/close
		$('#p2tv_chat_smilesbox_btn').on('click', function() {
			p2tv_chat_box_openclose( '#p2tv_chat_smiles_wrapper' );
		});
		// handle chat smile box close
		$('#p2tv_chat_smiles_close').on('click', function() {
			$('#p2tv_chat_smiles_wrapper').fadeOut(300);
		});
			
		// handle smile insert on click
		$('#p2tv_chat_smiles img').on('click', function() {
			$('#p2tv_chat_smiles_wrapper').fadeOut(300);
			p2tv_chat_checkInputLength();
			p2tv_chat_setCursorToEnd();
		});
		
		
	// handle widgets close
		$('.p2tv_chat_widget_btn').on('click', function() {
			$('.p2tv_chat_widget_wrapper').not( $($(this).attr('data-target')) ).hide();
		});
		
	
	
	// handele widgets scroll
		$('.p2tv_chat_widget_content').scroll( function(){
			if ( $(this).outerHeight() == ($(this).get(0).scrollHeight - $(this).scrollTop())) {
				doScroll = false;
			} else {
				doScroll = true;
			}
		});
		
		
		
	// modify chat default function to update widgets
		unsafeWindow.PutDataToChat = function( data ) {
			unsafeWindow.channelId = unsafeWindow.GetChannelId( unsafeWindow.chat_channel_id );

			if( unsafeWindow.$.cookie( 'is_moderator') ) {
				data = data.replace('class="censured"', 'class="red"');
				unsafeWindow.$( '#chat' ).html( data );
				unsafeWindow.AddChannelTitles();
				channelClassPath = 'div.channel-' + unsafeWindow.channelId;
				unsafeWindow.$( channelClassPath ).attr(
					'style', 'background-color:#333333 !important;'
				);
			}
			else {
				DIV = document.createElement( 'DIV' );
				DIV.innerHTML = data;
				unsafeWindow.$( '#chat' ).html( $( 'div.channel-' + unsafeWindow.channelId, DIV) );
			}
			
			if (unsafeWindow.autoScroll == 1) {
				unsafeWindow.$("#chat").scrollTop(10000000);
			}
			
			// new
			p2tv_getAdminsMsgsFromChat( false );
			p2tv_getLinksFromChat( false );
			p2tv_getUserMsgFromChat( false );
		}
		
	// chrome cursor position fix (textarea)
		var orgFocus = unsafeWindow.$.fn.focus;
		unsafeWindow.$.fn.focus = function( arg1, arg2 ){
			// call original Function
			var result = orgFocus.apply( this, arguments );
	
			// do additional functionality
			p2tv_chat_checkInputLength();
			p2tv_chat_setCursorToEnd();
	
			return result;
		}
});