// ==UserScript== // @name SE Chat Status // @description Adds status coloring and messages to Stack Exchange Chat // @include http://chat.meta.stackoverflow.com/rooms/* // @include http://chat.stackexchange.com/rooms/* // @include http://chat.stackoverflow.com/rooms/* // @include http://chat.askubuntu.com/rooms/* // @author Josh Gitlin // @version v0.1a2 Alpha 2 // ==/UserScript== /* * Injects functions into the page so they can freely interact with existing code */ function inject() { for (var i = 0; i < arguments.length; ++i) { if (typeof(arguments[i]) == 'function') { var script = document.createElement('script'); script.type = 'text/javascript'; script.textContent = '(' + arguments[i].toString() + ')(jQuery)'; document.body.appendChild(script); } } } inject(function($) { window.SEChatStatus = publicObj = { debug: false, statusControlRoomId: 359, userGravatarBorder: '2px solid', userGravatarMargin: '2px', getStatusTypes: function(){ return myStatusTypes; }, setStatus: function(newStatus,statusType) { return myUpdateStatus(newStatus, statusType); } } var myStatusTypes = $.makeArray(['available', 'busy', 'away']); var myUserStatuses = {}; var myGetCurrentUserid = function() { return $('#active-user').data('user'); } var myUpdateStatus = function(newStatus, statusType) { var statusMsg = 'Status: '; if((typeof statusType == 'number') && statusType < myStatusTypes.length && statusType >= 0) statusMsg += myStatusTypes[statusType]; else if((typeof statusType == 'string') && myStatusTypes.indexOf(statusType.toLowerCase()) != -1) statusMsg += statusType; else statusMsg += myStatusTypes[0]; statusMsg += ' - '+newStatus; $.ajax({ url:'/chats/'+publicObj.statusControlRoomId+'/messages/new', type:'POST', data: { 'fkey':fkey().fkey, 'text':statusMsg }, cache:true }); $.ajax({ url:'/users/usermessage/'+myGetCurrentUserid(), type: 'POST', data: { 'fkey':fkey().fkey, 'message': statusMsg } }); return true; } var myStatusSlashcommandHandler = function() { var args = $.makeArray(arguments), statusType = myStatusTypes.indexOf(args[0].toLowerCase()); if(statusType != -1) args.shift() myUpdateStatus(args.join(' '),statusType); } var myJoinControlRoom = function() { $.ajax('/rooms/'+publicObj.statusControlRoomId); } var myRefreshUserStatus = function(userId) { if(!users[userId]) { console.log("Could not find users["+userId+"]"); } var status = myUserStatuses['u'+userId] ? myUserStatuses['u'+userId] : {'type':-1, 'msg':''}; var newTitle = users[userId].name + (status.msg.length ? ' - ' + status.msg : ''); if(publicObj.debug) console.log('Refresh status for user:',userId,newTitle); var userGravatar = $('#present-user-'+userId+' img'); userGravatar[0].title = newTitle; var border; switch(status.type) { case 2: border = publicObj.userGravatarBorder+' #c00'; break; case 1: border = publicObj.userGravatarBorder+' #c90'; break; case 0: border = publicObj.userGravatarBorder+' #0c0'; break; default: border = publicObj.userGravatarBorder+' #999'; break; } userGravatar.css('border',border).css('margin', publicObj.userGravatarMargin); if(publicObj.debug) console.log('Set border style',userGravatar,border); } var myRefreshAllUserStatuses = function() { userIdRe=/present-user-([0-9]+)/; $('#present-users li').each(function(index,userLi){ var userId = userLi.id.match(userIdRe)[1]; myRefreshUserStatus(userId); }); } var myParseControlRoomEventFeed = function(data) { if(data.e instanceof Array) { var len = data.e.length; for(e=0; e