Google Voice Favicon Alerts

Alerts you to the number of unread items in Google Voice.

目前為 2017-01-28 提交的版本,檢視 最新版本

// ==UserScript==
// @name           Google Voice Favicon Alerts
// @description    Alerts you to the number of unread items in Google Voice.
// @version        1.0.7
// @date           2017-01-27
// @author         Peter Wooley
// @author         Ben999_
// @namespace      http://peterwooley.com
// @include        htt*://voice.google.*
// @grant          none
// ==/UserScript==

// Wait for the window to load to try and initialize
window.addEventListener('load', function() {
			instance = new GVoiceFaviconAlerts;
}, true);
	
function GVoiceFaviconAlerts() {
	var self = this;
	
	this.construct = function() {
		this.head = document.getElementsByTagName("head")[0];
		this.pixelMaps = {
			icons: {
				'unread':
					[["rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(78, 149, 242, 0.035156)","rgba(87, 152, 243, 0.36328)","rgba(83, 146, 244, 0.68359)","rgba(80, 146, 244, 0.64063)","rgba(60, 133, 244, 0.63672)","rgba(56, 130, 244, 0.63672)","rgba(65, 136, 245, 0.63672)","rgba(79, 145, 245, 0.63672)","rgba(75, 142, 244, 0.63672)","rgba(75, 142, 244, 0.63672)","rgba(72, 140, 244, 0.63672)","rgba(72, 140, 243, 0.63672)","rgba(71, 139, 243, 0.64063)","rgba(69, 138, 243, 0.68359)","rgba(67, 138, 243, 0.35938)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(81, 146, 244, 0.20313)","rgba(85, 146, 244, 0.91406)","rgba(84, 144, 245, 0.99609)","rgba(82, 144, 245, 0.99609)","rgba(86, 147, 245, 0.99609)","rgba(83, 144, 245, 0.99609)","rgba(81, 143, 246, 0.99609)","rgba(77, 141, 246, 0.99609)","rgba(76, 140, 245, 0.99609)","rgba(76, 140, 245, 0.99609)","rgba(75, 138, 245, 0.99609)","rgba(73, 138, 244, 0.99609)","rgba(73, 137, 244, 0.99609)","rgba(71, 137, 244, 0.99609)","rgba(69, 136, 244, 0.91016)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(85, 144, 246, 0.29297)","rgba(84, 143, 245, 0.99609)","rgba(73, 138, 245, 0.99609)","rgba(87, 146, 245, 0.99609)","rgba(229, 234, 243, 0.99609)","rgba(243, 247, 245, 0.99609)","rgba(168, 191, 235, 0.99609)","rgba(56, 124, 241, 0.99609)","rgba(76, 141, 248, 0.99609)","rgba(76, 140, 245, 0.99609)","rgba(75, 138, 245, 0.99609)","rgba(74, 138, 244, 0.99609)","rgba(73, 137, 244, 0.99609)","rgba(71, 136, 244, 0.99609)","rgba(70, 135, 244, 0.99609)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(83, 144, 245, 0.26563)","rgba(83, 144, 245, 0.94531)","rgba(74, 139, 245, 0.99609)","rgba(81, 142, 245, 0.99609)","rgba(232, 235, 241, 0.99609)","rgba(255, 255, 245, 0.99609)","rgba(225, 227, 234, 0.99609)","rgba(63, 119, 226, 0.99609)","rgba(70, 135, 245, 0.99609)","rgba(76, 141, 248, 0.99609)","rgba(74, 139, 245, 0.99609)","rgba(73, 137, 244, 0.99609)","rgba(73, 137, 244, 0.99609)","rgba(70, 136, 244, 0.99609)","rgba(70, 135, 244, 0.94531)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(81, 143, 245, 0.26563)","rgba(81, 143, 245, 0.94531)","rgba(79, 141, 245, 0.99609)","rgba(59, 129, 245, 0.99609)","rgba(189, 210, 243, 0.99609)","rgba(255, 255, 243, 0.99609)","rgba(176, 191, 229, 0.99609)","rgba(58, 112, 218, 0.99609)","rgba(67, 125, 231, 0.99609)","rgba(75, 138, 245, 0.99609)","rgba(74, 140, 246, 0.99609)","rgba(73, 138, 244, 0.99609)","rgba(73, 137, 244, 0.99609)","rgba(70, 136, 244, 0.99609)","rgba(69, 135, 244, 0.94531)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(79, 142, 245, 0.26563)","rgba(79, 142, 245, 0.94531)","rgba(80, 142, 245, 0.99609)","rgba(55, 127, 245, 0.99609)","rgba(146, 184, 246, 0.99609)","rgba(254, 246, 237, 0.99609)","rgba(56, 106, 213, 0.99609)","rgba(50, 110, 223, 0.99609)","rgba(73, 127, 226, 0.99609)","rgba(66, 126, 233, 0.99609)","rgba(66, 133, 244, 0.99609)","rgba(71, 137, 245, 0.99609)","rgba(71, 137, 244, 0.99609)","rgba(71, 135, 244, 0.99609)","rgba(69, 135, 244, 0.94531)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(79, 142, 245, 0.26563)","rgba(79, 142, 245, 0.94531)","rgba(79, 142, 245, 0.99609)","rgba(74, 138, 245, 0.99609)","rgba(61, 130, 245, 0.99609)","rgba(221, 229, 243, 0.99609)","rgba(184, 199, 230, 0.99609)","rgba(33, 98, 222, 0.99609)","rgba(49, 113, 228, 0.99609)","rgba(60, 122, 232, 0.99609)","rgba(66, 129, 238, 0.99609)","rgba(50, 124, 244, 0.99609)","rgba(69, 137, 246, 0.99609)","rgba(71, 136, 244, 0.99609)","rgba(69, 135, 244, 0.94531)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(78, 140, 245, 0.26563)","rgba(78, 140, 245, 0.94531)","rgba(78, 140, 245, 0.99609)","rgba(79, 142, 245, 0.99609)","rgba(57, 129, 245, 0.99609)","rgba(85, 145, 245, 0.99609)","rgba(250, 250, 243, 0.99609)","rgba(187, 202, 233, 0.99609)","rgba(59, 119, 230, 0.99609)","rgba(179, 201, 239, 0.99609)","rgba(222, 231, 241, 0.99609)","rgba(166, 192, 238, 0.99609)","rgba(70, 133, 241, 0.99609)","rgba(65, 133, 246, 0.99609)","rgba(68, 134, 244, 0.94531)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(76, 140, 245, 0.26563)","rgba(76, 140, 245, 0.94531)","rgba(76, 140, 245, 0.99609)","rgba(76, 139, 245, 0.99609)","rgba(79, 141, 245, 0.99609)","rgba(50, 124, 246, 0.99609)","rgba(84, 144, 243, 0.99609)","rgba(217, 224, 239, 0.99609)","rgba(255, 251, 240, 0.99609)","rgba(255, 255, 245, 0.99609)","rgba(255, 255, 244, 0.99609)","rgba(255, 255, 239, 0.99609)","rgba(72, 126, 227, 0.99609)","rgba(56, 127, 244, 0.99609)","rgba(68, 135, 245, 0.94531)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(76, 139, 245, 0.26563)","rgba(76, 139, 245, 0.94531)","rgba(76, 139, 245, 0.99609)","rgba(76, 139, 245, 0.99609)","rgba(76, 139, 245, 0.99609)","rgba(77, 141, 245, 0.99609)","rgba(54, 128, 245, 0.99609)","rgba(55, 124, 241, 0.99609)","rgba(134, 169, 233, 0.99609)","rgba(181, 198, 232, 0.99609)","rgba(230, 232, 238, 0.99609)","rgba(224, 227, 236, 0.99609)","rgba(68, 123, 226, 0.99609)","rgba(56, 124, 238, 0.99609)","rgba(67, 135, 245, 0.99609)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(74, 139, 245, 0.26563)","rgba(74, 139, 245, 0.94531)","rgba(74, 138, 244, 0.99609)","rgba(73, 139, 245, 0.99609)","rgba(73, 139, 245, 0.99609)","rgba(73, 137, 243, 0.99609)","rgba(74, 138, 244, 0.99609)","rgba(68, 136, 246, 0.99609)","rgba(46, 119, 242, 0.99609)","rgba(45, 110, 230, 0.99609)","rgba(64, 122, 228, 0.99609)","rgba(68, 125, 230, 0.99609)","rgba(65, 128, 235, 0.99609)","rgba(65, 130, 239, 0.99609)","rgba(66, 131, 242, 0.91016)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(73, 137, 244, 0.26172)","rgba(73, 137, 244, 0.94141)","rgba(73, 139, 246, 0.99609)","rgba(73, 138, 244, 0.99609)","rgba(72, 133, 239, 0.48047)","rgba(71, 133, 239, 0.39063)","rgba(71, 133, 239, 0.40625)","rgba(71, 132, 239, 0.40625)","rgba(71, 134, 242, 0.40625)","rgba(65, 129, 237, 0.40625)","rgba(56, 118, 230, 0.40625)","rgba(55, 119, 232, 0.40625)","rgba(64, 127, 235, 0.41016)","rgba(65, 130, 238, 0.44922)","rgba(67, 122, 233, 0.16797)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(73, 138, 245, 0.29688)","rgba(73, 139, 246, 0.99609)","rgba(72, 135, 243, 0.90234)","rgba(76, 125, 229, 0.21484)","rgba(74, 130, 234, 0)","rgba(71, 134, 240, 0)","rgba(71, 133, 239, 0)","rgba(71, 132, 239, 0)","rgba(70, 133, 240, 0)","rgba(67, 129, 235, 0)","rgba(65, 123, 229, 0)","rgba(64, 124, 231, 0)","rgba(64, 126, 234, 0)","rgba(64, 129, 237, 0)","rgba(67, 121, 232, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(70, 135, 242, 0.30859)","rgba(69, 134, 241, 0.69531)","rgba(71, 128, 235, 0.12109)","rgba(77, 121, 223, 0)","rgba(74, 132, 236, 0)","rgba(71, 134, 240, 0)","rgba(71, 133, 239, 0)","rgba(71, 132, 239, 0)","rgba(70, 133, 240, 0)","rgba(67, 129, 235, 0)","rgba(65, 123, 229, 0)","rgba(64, 124, 231, 0)","rgba(64, 126, 234, 0)","rgba(64, 129, 237, 0)","rgba(67, 122, 233, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(69, 132, 239, 0.089844)","rgba(69, 130, 237, 0.074219)","rgba(71, 128, 235, 0)","rgba(77, 123, 225, 0)","rgba(74, 132, 236, 0)","rgba(71, 134, 240, 0)","rgba(71, 133, 239, 0)","rgba(71, 132, 239, 0)","rgba(70, 133, 240, 0)","rgba(67, 129, 235, 0)","rgba(65, 123, 229, 0)","rgba(64, 124, 231, 0)","rgba(64, 126, 234, 0)","rgba(64, 129, 237, 0)","rgba(67, 122, 233, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"]]
				},
			numbers: {
				0: [
					[1,1,1],
					[1,0,1],
					[1,0,1],
					[1,0,1],
					[1,1,1]
				],
				1: [
					[0,1,0],
					[1,1,0],
					[0,1,0],
					[0,1,0],
					[1,1,1]
				],
				2: [
					[1,1,1],
					[0,0,1],
					[1,1,1],
					[1,0,0],
					[1,1,1]
				],
				3: [
					[1,1,1],
					[0,0,1],
					[0,1,1],
					[0,0,1],
					[1,1,1]
				],
				4: [
					[0,0,1],
					[0,1,1],
					[1,0,1],
					[1,1,1],
					[0,0,1]
				],
				5: [
					[1,1,1],
					[1,0,0],
					[1,1,1],
					[0,0,1],
					[1,1,1]
				],
				6: [
					[0,1,1],
					[1,0,0],
					[1,1,1],
					[1,0,1],
					[1,1,1]
				],
				7: [
					[1,1,1],
					[0,0,1],
					[0,0,1],
					[0,1,0],
					[0,1,0]
				],
				8: [
					[1,1,1],
					[1,0,1],
					[1,1,1],
					[1,0,1],
					[1,1,1]
				],
				9: [
					[1,1,1],
					[1,0,1],
					[1,1,1],
					[0,0,1],
					[1,1,0]
				],
				'+': [
					[0,0,0],
					[0,1,0],
					[1,1,1],
					[0,1,0],
					[0,0,0],
				],
				'k': [
					[1,0,1],
					[1,1,0],
					[1,1,0],
					[1,0,1],
					[1,0,1],
				]
			}
		};
		
		this.timer = setInterval(this.poll, 500);
		this.poll();
		
		return true;
	}
	
	this.drawUnreadCount = function(unread) {
		if(!self.textedCanvas) {
			self.textedCanvas = [];
		}
		
		if(!self.textedCanvas[unread]) {
			var iconCanvas = self.getUnreadCanvas();
			var textedCanvas = document.createElement('canvas');
			textedCanvas.height = textedCanvas.width = iconCanvas.width;
			var ctx = textedCanvas.getContext('2d');
			ctx.drawImage(iconCanvas, 0, 0);
			
			ctx.fillStyle = "#fef4ac";
			ctx.strokeStyle = "#dabc5c";
			ctx.strokeWidth = 1;
			
			var count = unread.length;
			
			if(count > 4) {
				unread = "1k+";
				count = unread.length;
			}
			
			var bgHeight = self.pixelMaps.numbers[0].length;
			var bgWidth = 0;
			var padding = count < 4 ? 1 : 0;
			var topMargin = 6;
			
			for(var index = 0; index < count; index++) {
				bgWidth += self.pixelMaps.numbers[unread[index]][0].length;
				if(index < count-1) {
					bgWidth += padding;
				}
			}
			bgWidth = bgWidth > textedCanvas.width-4 ? textedCanvas.width-4 : bgWidth;
			
			ctx.fillRect(textedCanvas.width-bgWidth-4,topMargin,bgWidth+4,bgHeight+4);
			
			var digit;
			var digitsWidth = bgWidth;
			for(var index = 0; index < count; index++) {
				digit = unread[index];
				
				if (self.pixelMaps.numbers[digit]) {
					var map = self.pixelMaps.numbers[digit];
					var height = map.length;
					var width = map[0].length;
					
					ctx.fillStyle = "#2c3323";
					
					for (var y = 0; y < height; y++) {
						for (var x = 0; x < width; x++) {
							if(map[y][x]) {
								ctx.fillRect(14- digitsWidth + x, y+topMargin+2, 1, 1);
							}
						}
					}
					
					digitsWidth -= width + padding;
				}
			}	
			
			ctx.strokeRect(textedCanvas.width-bgWidth-3.5,topMargin+.5,bgWidth+3,bgHeight+3);
			
			self.textedCanvas[unread] = textedCanvas;
		}
		
		return self.textedCanvas[unread];
	}
	this.getIcon = function() {
		return self.getUnreadCanvas().toDataURL('image/png');
	}	
	this.getUnreadCanvas = function() {
		if(!self.unreadCanvas) {
			self.unreadCanvas = document.createElement('canvas');
			self.unreadCanvas.height = self.unreadCanvas.width = 16;
			
			var ctx = self.unreadCanvas.getContext('2d');
			
			for (var y = 0; y < self.unreadCanvas.width; y++) {
				for (var x = 0; x < self.unreadCanvas.height; x++) {
					if (self.pixelMaps.icons.unread[y][x]) {
						ctx.fillStyle = self.pixelMaps.icons.unread[y][x];
						ctx.fillRect(x, y, 1, 1);
					}
				}
			}
		}
		
		return self.unreadCanvas;
	}
	this.getUnreadCountMessages = function() {
		matches = self.getSearchTextMessages().match(/\d+/g); //parse numerics
		//console.log(matches + ' unread messages found');
    return matches ? matches[0] : false;
	}
  this.getUnreadCountCalls = function() {
		matches = self.getSearchTextCalls().match(/\d+/g); //parse numerics
    //console.log(matches + ' unread calls found');
    return matches ? matches[0] : false;
	}
	this.getUnreadCountVoicemail = function() {
		matches = self.getSearchTextVoicemail().match(/\d+/g); //parse numerics
		//console.log(matches + ' unread voicemails found');
    return matches ? matches[0] : false;
	}
	this.getUnreadCountArchived = function() {
		matches = self.getSearchTextArchived().match(/\d+/g); //parse numerics
		//console.log(matches + ' unread archived items found');
    return matches ? matches[0] : false;
	}
	this.getUnreadCountIcon = function() {
		var unreadMessages = self.getUnreadCountMessages();
		var unreadCalls = self.getUnreadCountCalls();	
		var unreadVoicemail = self.getUnreadCountVoicemail();
		var unreadArchived = self.getUnreadCountArchived();
		var totalUnread = 0;
    
    if (unreadMessages) {
      totalUnread += parseInt(unreadMessages);
    }
    if (unreadCalls) {
      totalUnread += parseInt(unreadCalls);
    }
    if (unreadVoicemail) {
      totalUnread += parseInt(unreadVoicemail);
    }
		if (unreadArchived) {
      totalUnread += parseInt(unreadArchived);
    }
    //console.log(totalUnread + ' unread items detected');
		return self.drawUnreadCount(totalUnread.toString()).toDataURL('image/png');
	}
	this.getSearchTextMessages = function() {
		var text = "";
		// messages = element 0
		if (document.getElementsByClassName('md-caption HMBDBe-ho7Xm-NnAfwf')) {
			text = top.document.getElementsByClassName('md-caption HMBDBe-ho7Xm-NnAfwf')[0].textContent;
		}
		return text;
	}
	this.getSearchTextCalls = function() {
		var text = "";
		// calls = element 1
		if (document.getElementsByClassName('md-caption HMBDBe-ho7Xm-NnAfwf')) {
			text = top.document.getElementsByClassName('md-caption HMBDBe-ho7Xm-NnAfwf')[1].textContent;
		}
		return text;
	}
  this.getSearchTextVoicemail = function() {
		var text = "";
		// voicemail = element 2
		if (document.getElementsByClassName('md-caption HMBDBe-ho7Xm-NnAfwf')) {
			text = top.document.getElementsByClassName('md-caption HMBDBe-ho7Xm-NnAfwf')[2].textContent;
		}
		return text;
	}
  this.getSearchTextArchived = function() {
		var text = "";
		// archived = element 3
		if (document.getElementsByClassName('md-caption HMBDBe-ho7Xm-NnAfwf')) {
			text = top.document.getElementsByClassName('md-caption HMBDBe-ho7Xm-NnAfwf')[3].textContent;
		}
		return text;
	}
	this.poll = function() {
    if (self.getUnreadCountMessages() || self.getUnreadCountCalls() || self.getUnreadCountVoicemail() || self.getUnreadCountArchived()) {
      self.setIcon(self.getUnreadCountIcon());
		} else {
			self.setIcon(self.getIcon());
		}
	}
	
	this.setIcon = function(icon) {
		var links = self.head.getElementsByTagName("link");
		for (var i = 0; i < links.length; i++)
			if (links[i].type == "image/x-icon" && 
			   (links[i].rel.toLowerCase() == "shortcut icon" || links[i].rel.toLowerCase() == "icon") &&
			   links[i].href != icon)
				self.head.removeChild(links[i]);
			else if(links[i].href == icon)
				return;

		var newIcon = document.createElement("link");
		newIcon.type = "image/x-icon";
		newIcon.rel = "shortcut icon";
		newIcon.href = icon;
		self.head.appendChild(newIcon);

    setTimeout(function() {
      var shim = document.createElement('iframe');
      shim.width = shim.height = 0;
      document.body.appendChild(shim);
      shim.src = "icon";
      document.body.removeChild(shim);
    }, 499);

	}
	
	this.toString = function() { return '[object GVoiceFaviconAlerts]'; }
	
	return this.construct();
}

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址