diff --git a/hookshot/tinker-tickets.js b/hookshot/tinker-tickets.js index 7767be1..47d29bc 100644 --- a/hookshot/tinker-tickets.js +++ b/hookshot/tinker-tickets.js @@ -1,31 +1,80 @@ -var id = data.ticket_id || '?'; -var title = data.title || 'Untitled'; -var priority = parseInt(data.priority) || 4; -var category = data.category || 'General'; -var type = data.type || 'Issue'; -var source = data.source || ''; -var url = data.url || ''; -var trigger = data.trigger || 'manual'; +// Tinker Tickets hookshot transform — handles all event types emitted by NotificationHelper +// result must be assigned without var/let/const (QuickJS sandbox) + +var event = data.event || 'ticket_created'; +var id = data.ticket_id || '?'; +var title = data.title || 'Untitled'; +var url = data.url || ''; var notifyUsers = data.notify_users || []; -var priorityEmojis = ['', '🔴', '🟠', '🔵', '🟢', '⚫']; + +var priorityEmojis = ['', '\ud83d\udd34', '\ud83d\udfe0', '\ud83d\udd35', '\ud83d\udfe2', '\u26ab']; var priorityLabels = ['', 'P1 Critical', 'P2 High', 'P3 Medium', 'P4 Low', 'P5 Info']; -var emoji = (priority >= 1 && priority <= 5) ? priorityEmojis[priority] : '⚫'; -var pLabel = (priority >= 1 && priority <= 5) ? priorityLabels[priority] : 'P' + priority; -var tLabel = trigger === 'automated' ? 'Automated' : 'Manual'; -var meta = pLabel + ' \u00b7 ' + category + ' \u00b7 ' + type + (source ? ' \u00b7 ' + source : '') + ' [' + tLabel + ']'; + +// Build mention strings var mentionPlain = ''; -var mentionHtml = ''; +var mentionHtml = ''; if (notifyUsers.length > 0) { var pParts = [], hParts = []; for (var i = 0; i < notifyUsers.length; i++) { - var uid = notifyUsers[i]; + var uid = notifyUsers[i]; var disp = uid.replace(/^@/, '').split(':')[0]; pParts.push(uid); hParts.push('' + disp + ''); } mentionPlain = '\n' + pParts.join(' '); - mentionHtml = '
' + hParts.join(' '); + mentionHtml = '
' + hParts.join(' '); } -var plain = emoji + ' New Ticket #' + id + ': ' + title + '\n' + meta + (url ? '\n' + url : '') + mentionPlain; -var html = '' + emoji + ' #' + id + ': ' + title + '
' + meta + mentionHtml; -result = { version: 'v2', plain: plain, html: html, msgtype: 'm.text' }; \ No newline at end of file + +var ticketLink = url ? ('#' + id + '') : ('#' + id); + +var plain, html; + +if (event === 'ticket_created') { + var priority = parseInt(data.priority) || 4; + var category = data.category || 'General'; + var type = data.type || 'Issue'; + var source = data.source || ''; + var trigger = data.trigger || 'manual'; + var emoji = (priority >= 1 && priority <= 5) ? priorityEmojis[priority] : '\u26ab'; + var pLabel = (priority >= 1 && priority <= 5) ? priorityLabels[priority] : 'P' + priority; + var tLabel = trigger === 'automated' ? 'Automated' : 'Manual'; + var meta = pLabel + ' \u00b7 ' + category + ' \u00b7 ' + type + (source ? ' \u00b7 ' + source : '') + ' [' + tLabel + ']'; + + plain = emoji + ' New Ticket #' + id + ': ' + title + '\n' + meta + (url ? '\n' + url : '') + mentionPlain; + html = '' + emoji + ' ' + ticketLink + ': ' + title + '
' + meta + mentionHtml; + +} else if (event === 'status_changed') { + var oldStatus = data.old_status || '?'; + var newStatus = data.new_status || '?'; + var changedBy = data.changed_by ? (' by ' + data.changed_by) : ''; + + plain = '\ud83d\udd04 Status changed' + changedBy + ': ' + oldStatus + ' \u2192 ' + newStatus + '\n#' + id + ': ' + title + (url ? '\n' + url : '') + mentionPlain; + html = '\ud83d\udd04 Status changed' + changedBy + ': ' + oldStatus + ' \u2192 ' + newStatus + '
' + ticketLink + ': ' + title + mentionHtml; + +} else if (event === 'comment_added') { + var author = data.author || 'Someone'; + var preview = data.preview || ''; + + plain = '\ud83d\udcac ' + author + ' commented on #' + id + ': ' + title + (preview ? '\n"' + preview + '"' : '') + (url ? '\n' + url : '') + mentionPlain; + html = '\ud83d\udcac ' + author + ' commented on ' + ticketLink + ': ' + title + (preview ? '
"' + preview + '"' : '') + mentionHtml; + +} else if (event === 'mention') { + var author = data.author || 'Someone'; + var preview = data.preview || ''; + + plain = '\ud83d\udce3 ' + author + ' mentioned you in #' + id + ': ' + title + (preview ? '\n"' + preview + '"' : '') + (url ? '\n' + url : '') + mentionPlain; + html = '\ud83d\udce3 ' + author + ' mentioned you in ' + ticketLink + ': ' + title + (preview ? '
"' + preview + '"' : '') + mentionHtml; + +} else if (event === 'assigned') { + var assignee = data.assignee || 'someone'; + var changedBy = data.changed_by ? (' by ' + data.changed_by) : ''; + + plain = '\ud83d\udc64 Ticket #' + id + ' assigned to ' + assignee + changedBy + ': ' + title + (url ? '\n' + url : '') + mentionPlain; + html = '\ud83d\udc64 ' + ticketLink + ' assigned to ' + assignee + '' + changedBy + ': ' + title + mentionHtml; + +} else { + plain = '[tinker-tickets] event: ' + event + ' ticket #' + id; + html = '[tinker-tickets] event: ' + event + ' ticket #' + id; +} + +result = { version: 'v2', plain: plain, html: html, msgtype: 'm.text' };