Skip to content

Instantly share code, notes, and snippets.

@jcamenisch
Created September 28, 2012 17:23
Show Gist options
  • Save jcamenisch/3801126 to your computer and use it in GitHub Desktop.
Save jcamenisch/3801126 to your computer and use it in GitHub Desktop.
Gmail Snooze
var
MARK_UNREAD = true,
UNSNOOZED_LABEL = null,
LABEL_NAME_TEMPLATE = "Snooze/{{days}} days",
DEBUG_LEVEL = 0
;
var LABEL_REGEX = RegExp(LABEL_NAME_TEMPLATE.replace('{{days}}','(\\d+)'));
function debugLog(message, minDebugLevel) {
if (DEBUG_LEVEL > 0 && (!minDebugLevel || DEBUG_LEVEL >= minDebugLevel)) {
return Logger.log(message);
}
}
function getLabelName(days) {
days = ('00' + days);
days = days.substr(days.length - 3);
return LABEL_NAME_TEMPLATE.replace('{{days}}', days);
}
function getLabelDays(label) {
if (label.days) {
return +label.days;
} else {
if (label.name) label = label.name;
if (label.getName) label = label.getName();
if (typeof label == 'string') return +label.match(LABEL_REGEX)[1];
}
return null;
}
function sumLabelDays(labels) {
if (typeof labels == 'string') return getLabelDays(labels);
var ret = 0;
debugLog('Summing days for ' + labels.map(function(l){ return '"' + l.name + '"' }).join(','), 2);
labels.forEach(function(label) {
debugLog('Adding ' + getLabelDays(label) + ' days for ' + label.name, 3);
ret += (getLabelDays(label) || 0);
});
return ret;
}
function labelList() {
var ret = [], days, name, label;
for (var i = 0; i <= 7; ++i) {
days = Math.pow(2,i);
name = getLabelName(days);
label = GmailApp.getUserLabelByName(name);
ret.push({sys: label, name: name, days: days});
}
return ret;
}
function getSnoozeLabelsOn(thread) {
var ret = [], match;
thread.getLabels().sort().forEach(function(label) {
if (match = label.getName().match(LABEL_REGEX)) {
ret.push({sys: label, name: match[0], days: getLabelDays(match[0])});
}
});
return ret.sort(function(a, b){
return a.name > b.name ? 1 : -1
});
}
function setup() {
// Create the labels we’ll need for snoozing
GmailApp.createLabel("Snooze");
labelList().forEach(function(label) {
GmailApp.createLabel(label.name);
});
if (UNSNOOZED_LABEL) GmailApp.createLabel(UNSNOOZED_LABEL);
}
function moveSnoozes() {
var labelsOnThread, labelToRemove, daysToAdd;
labelList().forEach(function(label) {
debugLog('Processing label: ' + label.name);
label.sys.getThreads().forEach(function(thread) {
labelsOnThread = getSnoozeLabelsOn(thread);
if (2 * label.days > sumLabelDays(labelsOnThread)) { // Process a thread only when we get to its biggest label
debugLog('Processing thread: ' + thread.getFirstMessageSubject() + ' (' + sumLabelDays(labelsOnThread) + ' days to go)');
// Decrement the number of days
if (labelToRemove = labelsOnThread[0]) { // Remove the smallest label
debugLog('Removing label: ' + labelToRemove.name);
if ((daysToAdd = labelToRemove.days) > 1) {
while ((daysToAdd /= 2) >= 1) { // Add every label that's smaller than the former smallest label
debugLog('Adding label: ' + getLabelName(daysToAdd));
thread.addLabel(GmailApp.getUserLabelByName(getLabelName(daysToAdd)));
}
} else if (labelsOnThread.length == 1) {
// time to unsnooze it
debugLog('Unsnoozing thread');
thread.moveToInbox();
if (MARK_UNREAD) thread.markUnread();
if (UNSNOOZED_LABEL) {
thread.addLabel(GmailApp.getUserLabelByName(UNSNOOZED_LABEL));
}
}
labelToRemove.sys.removeFromThread(thread);
}
}
});
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment