NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name dAmn Friends
// @namespace http://djordjeungar.com/js/damnfriends/
// @description Highlights friends in the members column of the dAmn chat
// @copyright 2007, ArtBIT (http://artbit.deviantart.com)
// @oujs:author artbit
// @homepageURL http://fav.me/d118nn6
// @homeURL https://openuserjs.org/scripts/artbit/dAmn_Friends
// @include http://chat.deviantart.com*
// @grant none
// @version 0.53
// ==/UserScript==
// Creating the script node and adding to the head of the page, thus avoiding the use of unsafeWindow
// Thanks userscripts.org
function wrapper_function() {
function initDamnFriends() {
//Catch and rewire(tm) dAmn functions
var SCRIPT_NAME = "dAmn Friends";
var SCRIPT_VERSION = "0.53";
var SCRIPT_DECRIPTION = "Sets the color of the deviants listed in the members column of the dAmn chat.";
var dAmnFriendGroups = [];
var dAmnFriends = [];
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;
};
var 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();
};
var loadDeviantFriends = function() {
DiFi.pushPost('Friends', 'getFriendsMenu', [1], function(success, data){
var usersinfo = data.response.content;
var users = [];
for (var i = 0; i < usersinfo.length; i++) {
users.push(usersinfo[i].username);
}
dAmnFriendGroups.push({
name: 'dAfriends',
col: '#FF0',
list: users
});
dAmnFriends_Refresh();
});
DiFi.send();
};
var dAmnFriends_loadFriends = function() {
dAmnFriendGroups = [];
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({
name: group[0],
col: group[1],
list: group[2].split(',')
});
}
}
loadDeviantFriends();
dAmnFriends_Refresh();
};
var 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;
};
var 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;
};
var 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);
};
var 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({
name: name,
col: colour,
list: []
});
dAmnFriends_showResult("Group <b>" + name + "</b> [" + colour + "] successfully created.");
dAmnFriends_storeFriends();
};
var 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();
};
var 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 (dAmnFriendGroups[grpID].list.length) {
var user = dAmnFriendGroups[grpID].list.pop();
dAmnFriends_highlightFriend(user, "#000000");
}
dAmnFriends_showResult("Removed group '" + name + "' from your group list.");
dAmnFriendGroups.splice(grpID, 1);
dAmnFriends_storeFriends();
};
var 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 (dAmnFriendGroups[srcGroup].list.length) {
var user = dAmnFriendGroups[srcGroup].list.pop();
dAmnFriends_addFriend(destinationGroup, user);
}
//show info
dAmnFriendGroups.splice(srcGroup, 1);
dAmnFriends_storeFriends();
};
var 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);
};
var dAmnFriends_listGroups = function() {
var msg = "You have the following groups created: <br />--<br />";
var len = dAmnFriendGroups.length;
var i = len;
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(', '));
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);
};
var 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);
};
var dAmnFriends_addFriend = function(group, deviants) {
//if the group doesn't exist - display error and exit
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();
};
var 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();
};
var 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);
user = String(member.innerHTML).toLowerCase();
user = user.replace(/\[\d+\]/, "");
user = user.match(/[a-z0-9_\-]+$/)
member.style.color = dAmnFriends_userColour(user);
}
};
var dAmnFriends_Refresh = function() {
var a = [];
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;
};
var dAmnFriends_userColour = function(user) {
user = String(user).toLowerCase();
if (dAmnFriends[user]) return dAmnFriends[user];
return '#000000';
};
var 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);
}
};
var 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;
};
var 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);
};
var dAmnFriends_showResult = function(msg) {
dAmn_addTimedDiv(dAmnChats[dAmnChatTab_active].channels.main.info_el, "dAmnFriends_Result", msg);
};
var 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;
var prms, users, grp, usr, msg;
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':
prms = param.split(' ');
grp = prms[0];
prms[0] = '';
users = prms.join(' ');
dAmnFriends_addFriend(grp, users);
didsmth = true;
break;
case 'groupdeluser':
dAmnFriends_removeFriend(param);
didsmth = true;
break;
case 'groupadd':
prms = param.split(' ');
dAmnFriends_addGroup(prms[0], prms[1]);
didsmth = true;
break;
case 'groupupdate':
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':
prms = param.split(' ');
dAmnFriends_mergeGroups(prms[0], prms[1]);
didsmth = true;
break;
case 'grouphelp':
dAmnFriends_showDamnFriendsHelp();
didsmth = true;
break;
case 'groupsay':
prms = param.split(' ');
group = prms[0];
prms[0] = '';
msg = prms.join(' ');
dAmnFriends_sayGroup(group, msg);
didsmth = true;
break;
case 'groupnote':
prms = param.split(' ');
group = prms[0];
prms[0] = '';
msg = prms.join(' ');
dAmnFriends_noteGroup(group, msg);
didsmth = true;
break;
case 'groupcheck':
prms = param.split(' ');
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 wrapper_function
var daway_script = document.createElement('script')
daway_script.appendChild(document.createTextNode('(' + wrapper_function + ')();'));
document.body.appendChild(daway_script);