dAmn Friends

By ArtBIT Last update Oct 8, 2008 — Installed 1,561 times. Daily Installs: 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 2, 4, 0, 0, 0, 0, 3, 7, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0

There are 1 previous version of this script.

Add Syntax Highlighting (this will take a few seconds, probably freezing your browser while it works)

// ==UserScript==

// @name           	dAmn Friends

// @namespace	http://djordje.ungar.on.neobee.net/js/damnfriends/

// @description	Highlights friends in the members column of the dAmn chat

// @include		http://chat.deviantart.com*

// @creator		http://artbit.deviantart.com

// ==/UserScript==



// Creating the script node and adding to the head of the page, thus avoiding the use of unsafeWindow
// Thanks userscripts.org

var daway_script = document.createElement('script')

	daway_script.appendChild(document.createTextNode((<r><![CDATA[
	// start script source

function initDamnFriends() {

//Catch and rewire(tm) dAmn functions


var SCRIPT_NAME    = "dAmn Friends";

var SCRIPT_VERSION = "0.263";

var SCRIPT_DECRIPTION = "Sets the color of the deviants listed in the members column of the dAmn chat.";

var dAmnFriendGroups = new Array();

var dAmnFriends = new Array();





var dAmnFriends_trim = function(stringToTrim) { return stringToTrim.replace(/^\s+|\s+$/g,""); }	

var	dAmnFriends_sSuffix = function(num) 

	{

		return ( (num % 10 != 1) || (num % 100 == 11) ) ? "s" : "";

	}

var dAmnFriends_setCookie = function (name, value) {

	d=new Date();

	d.setTime(d.getTime()+(100 * 24 * 60 * 60 * 1000));

	document.cookie = name + "=" + escape(value) + "; expires=" +  d.toGMTString() + "; path=/; domain=deviantart.com";

}



var dAmnFriends_deleteCookie = function (name, path) {

	if (dAmnFriends_getCookie(name)) {

		document.cookie = name + "=; path=/; domain=deviantart.com; expires=Thu, 01-Jan-70 00:00:01 GMT";

	}

}



var dAmnFriends_getCookie = function (name) {

	var cookies = document.cookie.split(/; /);

	for (var i = 0; i < cookies.length; i++) {

		var d = cookies[i].split(/=/);

		if (d[0] == name)

			return unescape(d[1]);

	}

	return null;

}



dAmnFriends_storeFriends=function()

{

	var allFriends = friendsInGroup = '';

	var i = dAmnFriendGroups.length;

	while(i--) {

		friendsInGroup = dAmnFriendGroups[i].name + ";" + dAmnFriendGroups[i].col + ";" + dAmnFriendGroups[i].list.join(',');

		allFriends += friendsInGroup + "|";

	}

	dAmnFriends_setCookie("friendList",allFriends);

	dAmnFriends_Refresh();

}

dAmnFriends_loadFriends=function()

{

	dAmnFriendGroups = new Array();

	var cookieVal = dAmnFriends_getCookie("friendList");

	if(!cookieVal) return;

	var groupsData = cookieVal.split("|");

	

	var i = groupsData.length;

	while(i--) {

		if(groupsData[i]!="") {

			var group = groupsData[i].split(";");

			dAmnFriendGroups.push(

				new Object({

					name: group[0],

					col:  group[1],

					list: group[2].split(',')

				})

			);

		}

	}

	dAmnFriends_Refresh();

}



dAmnFriends_findFriendInGroup = function(deviant,group) {

	deviant = String(deviant).toLowerCase()



	var i = group.list.length;

	while(i--) {

		if(group.list[i] == deviant) {

			return i;

		}

	}

	return -1;	

}



dAmnFriends_friendExists = function(deviant) {

	if(deviant!='' && deviant!=',' && deviant!=' ') {

		var i = dAmnFriendGroups.length;

		while(i--) 

			if( dAmnFriends_findFriendInGroup(deviant,dAmnFriendGroups[i]) >= 0) return i;

	}

	return -1;

}



dAmnFriends_findGroup = function(group) {

	group = String(group).toLowerCase();

	var i = dAmnFriendGroups.length;

	while(i--) 

		if(dAmnFriendGroups[i].name == group) {

			return i;

		}

	return -1;

}

dAmnFriends_groupCheck = function(usr) {

	var deviant = String(dAmnFriends_trim(usr)).toLowerCase();

	var grpID = dAmnFriends_friendExists(deviant);

	var msg;

		if(grpID>=0) {

			var spanstart = "<span style='color:"+dAmnFriendGroups[grpID].col+"'>";

			var spanend = "</span>";

			msg = "User '"+spanstart+deviant+spanend+"' found in group ["+spanstart+dAmnFriendGroups[grpID].name+spanend+"</span>].";

		} else

			msg = "User '"+deviant+"' does not belong to any group.";

		dAmnFriends_showInfoBox(msg);

	

}

dAmnFriends_addGroup = function(name, colour) {

	//check if group already exists

	name = String(name).toLowerCase();

	if(!colour) colour = "#333333";

	colour = String(colour).toUpperCase();

	var re = new RegExp(/^#[0-9ABCDEF]{3,6}$/);

	var m = re.exec(colour);

	if(m == null) {

		dAmnFriends_showError("Invalid colour",colour,"should be a HTML colour (e.g. #ffffff)");

		return;

	}

	var grpID = dAmnFriends_findGroup(name);

	if(grpID>=0) {

		//group exists, just update the colour

		dAmnFriends_updateGroup(name, colour);

		return;

	}

	dAmnFriendGroups.push(new Object({name:name, col:colour, list: new Array()}))

	dAmnFriends_showResult("Group <b>"+name+"</b> ["+colour+"] successfully created.");

	dAmnFriends_storeFriends();

}

dAmnFriends_updateGroup = function(name, colour) {

	//check if group already exists

	name = String(name).toLowerCase();

	if(!colour) colour = "#333333";

	colour = String(colour).toUpperCase();

	var re = new RegExp(/^#[0-9ABCDEF]{3,6}$/);

	var m = re.exec(colour);

	if(m == null) {

		dAmnFriends_showError("Invalid colour",colour,"should be a HTML colour (e.g. #ffffff)");

		return;

	}	

	

	var grpID = dAmnFriends_findGroup(name);

	if(grpID<0) {

		dAmnFriends_showError("Unknown group",name);

		return;

	}

	

	dAmnFriendGroups[grpID].col = colour;

	dAmnFriends_showResult("Color for the group '"+name+"' successfully updated to "+colour+".");

	dAmnFriends_storeFriends();

	dAmnFriends_highlightFriends();

}

dAmnFriends_removeGroup = function(name) {

	//check if group already exists

	name = String(name).toLowerCase();

	var grpID = dAmnFriends_findGroup(name);

	if(grpID<0) {

		dAmnFriends_showError("Unknown group",name);

		return;

	}	

	

	while(user = dAmnFriendGroups[grpID].list.pop()) dAmnFriends_highlightFriend(user,"#000000");

	dAmnFriends_showResult("Removed group '"+name+"' from your group list.")

	dAmnFriendGroups.splice(grpID,1);

	dAmnFriends_storeFriends();

}

dAmnFriends_mergeGroups = function(sourceGroup, destinationGroup) {

	

	sourceGroup = String(sourceGroup).toLowerCase();

	var srcGroup = dAmnFriends_findGroup(sourceGroup);

	if(srcGroup<0) {

		dAmnFriends_showError("Unknown group",sourceGroup);

		return;

	}	

	

	destinationGroup = String(destinationGroup).toLowerCase();

	var destGroup = dAmnFriends_findGroup(destinationGroup);	

	if(destGroup<0) {

		dAmnFriends_showError("Unknown group",destinationGroup);

		return;

	}	

	

	while(user = dAmnFriendGroups[srcGroup].list.pop()) dAmnFriends_addFriend(destinationGroup,user);

	//show info

	dAmnFriendGroups.splice(srcGroup,1);

	dAmnFriends_storeFriends();

}



dAmnFriends_listGroup = function(name) {

	var grpID = dAmnFriends_findGroup(name);

	if(grpID<0) {

		dAmnFriends_showError("Unknown group",group);

		return;

	}

	var msg = "You have no group by that name.";	

	

	var i = dAmnFriendGroups[grpID].list.length;

	msg = "The group '"+name+"' contains "+i+" deviant"+dAmnFriends_sSuffix(i)+": <br />--<br />";

	

	var usrs = String(dAmnFriendGroups[grpID].list.join(', '));

		usrs = usrs.substr(0,usrs.length);

		msg += usrs;

	

	dAmnFriends_showInfoBox(msg);

}



dAmnFriends_listGroups = function() {

	var msg = "You have the following groups created: <br />--<br />";

	var len = i = dAmnFriendGroups.length;

	if(len) msg += "<table cellpadding='2px' cellspacing='5px' style='padding:5px;'><thead><tr><td><b>Name</b></td><td><b>Color</b></td><td><b>Count</b></td><td><b>User list</b></td></tr></thead><tbody>";

	while(i--) {

		var usrs = String(dAmnFriendGroups[i].list.join(', '));

		var len = usrs.length;

			

			usrs = (len < 100) ? usrs.substr(0, len) : (usrs.substr(0,100)+"...");

			

		msg += "<tr><td>"+ dAmnFriendGroups[i].name + "</td><td><code><span style='color:"+dAmnFriendGroups[i].col+"'>"+String(dAmnFriendGroups[i].col).toUpperCase()+"</span></code></td><td>"+dAmnFriendGroups[i].list.length+"</td><td>"+usrs+"</td></tr>";

	}

	if(len) msg += "</tbody></table>";

	dAmnFriends_showInfoBox(msg);

}

dAmnFriends_noteGroup = function (group, subj) {

	group = String(group).toLowerCase();

	var grpID = dAmnFriends_findGroup(group);

	if(grpID<0) {

		dAmnFriends_showError("Unknown group",group);

		return;

	}

	if(dAmnFriendGroups[grpID].list.length>10) dAmnFriends_showResult("Your conscience: 'Spamming is a cardinal sin.'");

	var link = "http://my.deviantart.com/notes/?to="+dAmnFriendGroups[grpID].list.join(', ');

	subj = dAmnFriends_trim(subj);

	if(subj) link+="&subject="+subj;

	window.open(link)

}

dAmnFriends_addFriend = function(group,deviants) {

	//if the group doesn't exist - display error and exit

	var group = String(group).toLowerCase()

	var groupID = dAmnFriends_findGroup(group);

	if(groupID==-1) {

		//group doesn't exists

		dAmnFriends_showError("Unknown group",group);

		return;

	}

	var deviantsString = String(dAmnFriends_trim(deviants)).toLowerCase();

	deviants = deviantsString;

	deviants = deviants.split(' ');

	var num = deviants.length;

	for(var i=0; i< deviants.length; i++) {

		var deviant = deviants[i];

		if(deviant!='' && deviant!=',' && deviant!=' ') {

			

			if(dAmnFriends_friendExists(deviant)>=0) dAmnFriends_removeFriend(deviant);

			dAmnFriendGroups[groupID].list.push(deviant);

		}

	}

	dAmnFriends_showResult("Added "+num+" deviant"+dAmnFriends_sSuffix(num)+" ("+deviantsString+") to the group '"+group+"'.");

	

	dAmnFriends_storeFriends();

	dAmnFriends_highlightFriends();

}

dAmnFriends_removeFriend = function(deviants) {

	var deviantsString = String(dAmnFriends_trim(deviants)).toLowerCase();

	deviants = deviantsString.split(' ');

	var num = deviants.length;

	

	for(var i=0; i< deviants.length; i++) {

		var deviant = deviants[i];

		if(deviant!='' && deviant!=','  && deviant!=' ') 

		for(var j=0; j<dAmnFriendGroups.length; j++) {

			var group = dAmnFriendGroups[j];

			var friendID = dAmnFriends_findFriendInGroup(deviant,group);

			if( friendID >= 0) {

				dAmnFriends_highlightFriend(group.list[friendID],"#000000");

				group.list.splice(friendID,1);

			}

		}

	}

	dAmnFriends_showResult("Removed "+num+" deviant"+dAmnFriends_sSuffix(num)+" from your groups. ("+deviantsString+").");

	dAmnFriends_storeFriends();

}

dAmnFriends_highlightFriend = function(user) {

	var damnChatSpace = document.getElementById("damn-chatspace");

	var members, member;

	members = document.evaluate(

	    "//dd[@class='dAmnChatMember']",

	    document,

	    null,

	    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,

	    null);

	for (var i = 0; i < members.snapshotLength; i++) {

	    member = members.snapshotItem(i);

		var user = String(member.innerHTML).toLowerCase();

		user = user.replace(/\[\d+\]/,"");

		user = user.match(/[a-z0-9_\-]+$/)

		member.style.color = dAmnFriends_userColour(user);

	}	

}



dAmnFriends_Refresh = function() {

	var a = new Array();

	var i = dAmnFriendGroups.length;

	while(i--) {

		var colour = dAmnFriendGroups[i].col;

		var j      = dAmnFriendGroups[i].list.length;

		while(j--)   a[dAmnFriendGroups[i].list[j]] = colour;

	}

	a.sort();

	dAmnFriends = a;

}



dAmnFriends_userColour = function(user) {

	user = String(user).toLowerCase();

	if(dAmnFriends[user]) return dAmnFriends[user];

	return '#000000';

}



dAmnFriends_highlightFriends = function() {

	var damnChatSpace = document.getElementById("damn-chatspace");

	var members, member;

	members = document.evaluate(

	    "//dd[@class='dAmnChatMember']",

	    document,

	    null,

	    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,

	    null);

	for (var i = 0; i < members.snapshotLength; i++) {

	    member = members.snapshotItem(i);

		var user = String(member.innerHTML).toLowerCase();

		user = user.replace(/\[\d+\]/,"");

		user = user.match(/[a-z0-9_\-]+$/)

		member.style.color = dAmnFriends_userColour(user);

	}	

}



dAmnFriends_showDamnFriendsHelp = function() {

	dAmnFriends_showInfoBox('<span style="font-size:1.1em;"><a href="http://djordje.ungar.on.neobee.net/js/damnfriends/damnfriends.user.js"><b>'+SCRIPT_NAME+'</b> v'+SCRIPT_VERSION+'</a> by <a href="http://artbit.deviantart.com">ArtBIT</a></span> - '+SCRIPT_DECRIPTION+'<br /><br />'

			+'<b>Here is the list of commands: </b><br />'

			+'<table style="padding:5px;"><thead></thead>'

			+'<tr><td><b>/groupadd <i>name</i> <i>color</i> </b> - creates a new friend group. <b><i>color</i></b> must be in HTML format (#000000 - #FFFFFF)</td></tr>'

			+'<tr><td><b>/groupdel <i>name</i> </b> - deletes the group with the given <i>name</i> and removes all users that belonged to it.</td></tr>'

			+'<tr><td><b>/groupupdate <i>name</i> <i>color</i> </b> - sets the new color for the group</td></tr>'

			+'<tr><td><b>/groupmerge <i>group1</i> <i>group2</i> </b> - adds all the users from <i>group1</i> to <i>group2</i> and removes the <i>group1</i> </td></tr>'

			+'<tr><td><b>/groupinfo <i>group</i></b> - Shows info for the <i>group</i> or if <i>group</i> is not specified, for all the groups you created.</td></tr>'

			+'<tr><td><b>/groupcheck <i>user</i></b> - Checks if the <i>user</i> belongs to any group.</td></tr>'

			

			+'<tr><td><b>/groupadduser <i>group</i> <i>user1 (user2 user3 ... userN)</i> </b> - adds the specified user(s) to the <i>group</i>.</td></tr>'

			+'<tr><td><b>/groupdeluser <i>user1 (user2 user3 ... userN)</i> </b> - deletes the specified user(s) from all the groups</td></tr>'

			+'<tr><td><b>/groupsay <i>group</i> <i>message</i> </b> - highlights all the members of the group with your message.</td></tr>'

			+'<tr><td><b>/groupnote <i>group</i> <i>(subject)</i> </b> - opens the dA note page and sets all the group members as recipients.</td></tr>'

			+'<tr><td><b>/grouphelp </b> - This screen</td></tr>'			

			

			+'</tbody></table>'

			);

}



dAmnFriends_loadFriends();





	var lastGroupSay = 0;

	

	dAmnFriends_sayGroup = function (group, msg) {

		var now = new Date().getTime();

		if(now-lastGroupSay < 60000) {

			dAmnFriends_showResult("Wait at least 1 minute before using /groupsay again.");

			return;

		}

		group = String(group).toLowerCase();

		var grpID = dAmnFriends_findGroup(group);

		if(grpID<0) {

			dAmnFriends_showError("Unknown group",group);

			return;

		}

		var i = dAmnFriendGroups[grpID].list.length;

		if(i>10) dAmnFriends_showResult("Your conscience: 'Please avoid highlighting many people at once. Thanks.'");

		var users = "<abbr title='";

		while(i--) {

			users += dAmnFriendGroups[grpID].list[i]+" ";

		}

		users += "'></abbr>";

		dAmnChats[dAmnChatTab_active].channels.main.cr.Send( 'msg','main', users+msg)

		lastGroupSay = now;

	}

	

    dAmnFriends_showInfoBox = function(body )

    {

		var channel = dAmnChats[dAmnChatTab_active].channels.main;

        var o = dAmn_MakeDiv( "userinfo-outer" )

        var i = dAmn_AddDiv( o, "userinfo-inner" );

        var u = dAmn_AddDiv( i, "userinfo alt0" );

        var t = this;

        dAmnChat_AddImgBox( u, "damncr-close", 'close', 'close', function(el){ dAmn_DeleteSelf(el); t.scroll_once = true;  dAmn_InvalidateLayout(); }, o );

        var r = dAmn_AddDiv( u, 'bodyarea alt1-left-border' );

        var b = dAmn_AddDiv( r, 'b read pcusers' );

		dAmn_AddDiv(b,'read',body);

		channel.addDiv( o, null, 0 );

    }

	

	dAmnFriends_showResult = function(msg) {

		dAmn_addTimedDiv( dAmnChats[dAmnChatTab_active].channels.main.info_el, "dAmnFriends_Result", msg );

	}

	

	dAmnFriends_showError = function(ev, arg1, arg2) {

		dAmnChats[dAmnChatTab_active].channels.main.onErrorEvent(ev, arg1, arg2);

	}

	

	dAmnChanChat.prototype.dAmnFriends_Init = dAmnChanChat.prototype.Init;

	dAmnChanChat.prototype.Init = function( cr, name, parent_el ) 

	{

		 this.dAmnFriends_Init( cr, name, parent_el );

		 var cie=this.input;

		 cie.cmds['groupadduser']=[0,''];

		 cie.cmds['groupdeluser']=[0,''];

		 cie.cmds['groupadd']=[0,''];

		 cie.cmds['groupdel']=[0,''];		 

		 cie.cmds['groupupdate']=[0,''];

		 cie.cmds['groupinfo']=[0,''];

		 cie.cmds['groupmerge']=[0,''];	 

		 cie.cmds['grouphelp']=[0,''];

		 cie.cmds['groupsay']=[0,''];

		 cie.cmds['groupnote']=[0,''];

		 cie.cmds['groupcheck']=[0,''];

		 cie.cmds['test']=[0,''];

	}

		

	dAmnFriends_dAmnFriends_onKey = dAmnChatInput_onKey;

	dAmnChatInput_onKey = function (e,kc,force)	{

		var didsmth = false;

		var el = this.chatinput_el;

		if( kc == 13 && ( force || !this.multiline || e.shiftKey || e.ctrlKey ) ) {

			var input = el.value;

			var rex = /^\/(\S*)\s*(.*)$/i.exec(input);

			if(rex) {

				var cmd = rex[1];

				var param = rex.slice(2).join(' ');

				var link ="";

				if(cmd) {

					switch(cmd) {

						case 'groupadduser':

							

							var prms = param.split(' ');

							var grp = prms[0];

								prms[0] = '';

							var users = prms.join(' ');

							dAmnFriends_addFriend(grp,users);

							didsmth = true;

							break;

						case 'groupdeluser':

							dAmnFriends_removeFriend(param);

							didsmth = true;

							break;

							

						case 'groupadd':

							var prms = param.split(' ');

							dAmnFriends_addGroup(prms[0],prms[1]);

							didsmth = true;

							break;	

						case 'groupupdate':

							var prms = param.split(' ');

							dAmnFriends_updateGroup(prms[0],prms[1]);

							didsmth = true;

							break;	

						case 'groupdel':

							dAmnFriends_removeGroup(param);

							didsmth = true;

							break;

						case 'groupinfo':

							if(param)

								dAmnFriends_listGroup(param);

							else

								dAmnFriends_listGroups();

							didsmth = true;

							break;

						case 'groupmerge':

							var prms = param.split(' ');

							dAmnFriends_mergeGroups(prms[0],prms[1]);

							didsmth = true;

							break;

						case 'grouphelp':

							dAmnFriends_showDamnFriendsHelp();

							didsmth = true;

							break;

						case 'groupsay' :

							var prms = param.split(' ');

							var group = prms[0];

								prms[0]='';

							var msg = prms.join(' ');

							dAmnFriends_sayGroup(group, msg);

							

							didsmth = true;

							break;

						case 'groupnote' :

							var prms = param.split(' ');

							var group = prms[0];

								prms[0]='';

							var msg = prms.join(' ');

							dAmnFriends_noteGroup(group, msg);

							

							didsmth = true;

							break;

						case 'groupcheck' :

							var prms = param.split(' ');

							var usr = prms[0];

							dAmnFriends_groupCheck(usr);

							

							didsmth = true;

							break;							

					} //end case

						

					if(didsmth) {

						if (el.value) {

							//add to history array

							if (this.history_pos != -1  && this.history[this.history_pos] == el.value) { // posting from history.. move to the end

								var before = this.history.slice(0,this.history_pos);

								var after  = this.history.slice(this.history_pos+1);

								this.history = before.concat(after).concat( this.history[this.history_pos] );

							} else {

								// add to history -- limit to 300

								this.history = this.history.concat( el.value );

								if( this.history.length > 300 )

									this.history = this.history.slice(1);

							}

							//alert(this.history);

							this.history_pos = -1;

							el.value = '';

							if(link) window.open(link);

							el.focus();

						}

					}

				}

			}

		}

		if(!didsmth) return this.dAmnFriends_dAmnFriends_onKey(e,kc,force)?true:false;

		else return false;

	}

	

	dAmnChatInput.prototype.onKey = dAmnChatInput_onKey;

	dAmnChatInput.prototype.dAmnFriends_dAmnFriends_onKey = dAmnFriends_dAmnFriends_onKey;



	dAmnFriends_dAmnChatMembers_AddMember = dAmnChatMembers.prototype.AddMember;

	dAmnChatMembers_AddMember = function(name,info,updatedisplay,count) {

		dAmnFriends_dAmnChatMembers_AddMember.call(this,name,info,updatedisplay,count);

		dAmnFriends_highlightFriend(name);

	}

	

	dAmnChatMembers.prototype.AddMember = dAmnChatMembers_AddMember;



	dAmnFriends_dAmnChatMembers_Refresh = dAmnChatMembers.prototype.Refresh ;

	dAmnChatMembers_Refresh = function() {

		dAmnFriends_dAmnChatMembers_Refresh.call(this);

		dAmnFriends_highlightFriends();

	}

	

	dAmnChatMembers.prototype.Refresh = dAmnChatMembers_Refresh;

}

var tries = 0;
var maxTries = 100;
function tryInit() {
	//alert(unsafeWindow.dAmnChanChat.prototype);
	if (dAmnChanChat && dAmnChanChat.prototype) {
		initDamnFriends();		
	} else {
		if(tries++ < maxTries) setTimeout(tryInit,100);
	}
}

tryInit();

// end script source
]]></r>).toString()))



document.getElementsByTagName('head')[0].appendChild(daway_script)