// 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 = ['', '\ud83d\udd34', '\ud83d\udfe0', '\ud83d\udd35', '\ud83d\udfe2', '\u26ab']; var priorityLabels = ['', 'P1 Critical', 'P2 High', 'P3 Medium', 'P4 Low', 'P5 Info']; // Build mention strings var mentionPlain = ''; var mentionHtml = ''; if (notifyUsers.length > 0) { var pParts = [], hParts = []; for (var i = 0; i < notifyUsers.length; i++) { var uid = notifyUsers[i]; var disp = uid.replace(/^@/, '').split(':')[0]; pParts.push(uid); hParts.push('' + disp + ''); } mentionPlain = '\n' + pParts.join(' '); mentionHtml = '
' + hParts.join(' '); } 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' };