flash-Zentao

禅道与飞书的bug通信

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         flash-Zentao
// @namespace    https://www.flashmoney.com/
// @version      2.1.1
// @description  禅道与飞书的bug通信
// @grant        GM_addStyle
// @run-at       document-end
// @author       ll
// @match        https://project.flashexpress.pub/bug-*
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    $('body')
    .delegate('#submit', 'click', function(event) {
        const href = window.top.location.href

        if(href.indexOf('bug-create') > -1) {
            // 影响版本
            const _require = $('#openedBuild_chosen .search-choice >span').text()
            // 标题
            const _bugTitle = $('.input-control #title').val()
            // 指派给
            const bugUserName = $("#assignedTo_chosen >.chosen-single-with-deselect >span").text()

            if (_require && _bugTitle) {
                sendMessageFeiShu(_bugTitle, bugUserName)
            }
        } else {
            const _bugUserName = $(".picker-selections .picker-selection-text").text()
            const _bugTitle = $('.input-control #title').val() || $('.main-header >h2').children().eq(1).text()

            // 状态置为解决不发送
            const _resolution = $('#resolution_chosen')
            if (_resolution.length) return

            sendMessageFeiShu(_bugTitle, _bugUserName)
        }

        });

    // send飞书
    function sendMessageFeiShu(_title, _name){
        const _emailElement = $(`#assignedTo option:contains(${_name})`)
        const email = _emailElement && _emailElement.val()

        // 白名单:不发送的email
        const whiteEmail = ['yanxuesong']
        if(whiteEmail.includes(email)) return

        // 发送人
        const _sendName = window.top.$("#header #userNav .user-name").text()
        // bug地址
        const href = window.top.location.href

        const query = {
            email: `${email}@flashexpress.com`,
            msg_type: "interactive",
            card: {
                "config": {
                    "update_multi": true,
                    "wide_screen_mode": true
                },
                "header": {
                    "title": {
                        "tag": "plain_text",
                        "content": '🥺【bug】' + _name,
                    },
                    "template": "red"
                },
                "elements": [
                    {
                        "tag": "div",
                        "text": {
                            "tag": "lark_md",
                            "content": `**bug:**[${_title}](${href})`
                        }
                    },
                    {
                        "tag": "div",
                        "text": {
                            "tag": "lark_md",
                            "content": `**发送人:**${_sendName}`
                        }
                    },
                    {
                        "tag": "div",
                        "text": {
                            "tag": "lark_md",
                            "content": `**发送时间:**${formatTimestamp(new Date(), "yyyy-MM-dd hh:mm:ss")}`
                        }
                    },
                    {
                        "tag": "action",
                        "actions": [
                            {
                                "tag": "button",
                                "text": {
                                    "tag":"plain_text",
                                    "content":'禅道bug地址' //指定按钮文本
                                },
                                "url": href,
                                "type": "danger"
                            }
                        ]
                    }
                ]
            }
        }

        let apiUrl = 'https://feishu-api.flashfin.com/send-message'

        // 针对没有邮箱的,url不一样
        // const whiteName = ['W:王雪晴', 'D:段飞扬']
        // if(whiteName.includes(_name)) {
        // apiUrl = 'https://open.feishu.cn/open-apis/bot/v2/hook/2cb384af-73a4-4590-9bf9-31acaf7ddc12'
        // }

        $.ajax({
            url: apiUrl,
            type: "post",
            headers:{'Content-Type':'application/json'},
            dataType: 'json',
            data: JSON.stringify(query),
            success:function(result){
                console.log('send success')
            }
        });
    }

    // 格式化时间
    function formatTimestamp (date, fmt) {
        if (!date) return date
        if (typeof date === 'string') {
            // 解决IOS上无法从dateStr parse 到Date类型问题
            date = date.replace(/-/g, '/')
            date = new Date(date)
        }
        const o = {
            'M+': date.getMonth() + 1, // 月份
            'd+': date.getDate(), // 日
            'h+': date.getHours(), // 小时
            'm+': date.getMinutes(), // 分
            's+': date.getSeconds(), // 秒
            'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
            S: date.getMilliseconds() // 毫秒
        }
        if (/(y+)/.test(fmt)) {
            fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
        }
        for (const k in o) {
            if (new RegExp('(' + k + ')').test(fmt)) {
                fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
            }
        }
        return fmt
    }
})();