// ==========================市场元数据=========================================
// [title: 爱快重拨]
// [version: 1.0.5]
// [description: 爱快软路由的线路重拨、重启等,首次使用会让设置登录参数,修改参数使用指令:爱快重置,使用指令:爱快重拨,自定义断开重连间隔时间:set otto ikuai_reconnect_interval 5,表示间隔5秒。设置默认线路:set otto ikuai_reconnect_default 0,0是全部重拨,1,2是表示线路1和2。设置网络类型:set otto ikuai_reconnect_type pppoe/vlan,pppoe表示多wan口多拨,vlan表示一口adsl多拨,不涉及多拨不用设置。支持外部调用,外部调用代码:autMan.Session("爱快重拨")。抓包:http://bbs.zhelee.cn:9999/forum.php?mod=viewthread&tid=28]
// [platform: qq,wx,tg,web,tb,wxmp]
// [public: true]
// [price: 0.00]
// [service: qq282617666]
// [class: 工具类]
//==========================函数解析元数据======================================
// [rule: ^爱快重拨$ ]
// [rule: ^爱快重置$]
// [priority: 99998 ]
// [admin: true]
// [disable:false]
//==========================参数配置数据(最下面)===============================
// [param: {"required":true,"key":"otto.ikuai_host","placeholder":"http://192.168.31.1","name":"爱快地址","desc":"爱快地址,例:http://192.168.31.1"}]
// [param: {"required":true,"key":"otto.ikuai_username","placeholder":"登陆名","name":"登录名","desc":"登录名,例:admin"}]
// [param: {"required":true,"key":"otto.ikuai_passwd","placeholder":"passwd","name":"passwd","desc":"抓包登录body密码参数passwd的值,应为32位字母数字"}]
// [param: {"required":true,"key":"otto.ikuai_pass","placeholder":"pass","name":"pass","desc":"抓包登录body参数pass的值"}]
// [param: {"required":true,"key":"otto.ikuai_reconnect_type","placeholder":"pppoe","name":"网络类型","desc":"pppoe表示多wan口多拨,vlan表示单网口adsl多拨"}]
// [param: {"required":true,"key":"otto.ikuai_reconnect_interval","placeholder":"3","name":"断开重连间隔时间","desc":"断开重连间隔时间,单位秒"}]
// [param: {"required":true,"key":"otto.ikuai_reconnect_default","placeholder":"2","name":"默认线路","desc":"默认线路,0是全部重拨,1,2是表示线路1和2"}]

// 获取内容
var msg = GetContent()
//存储cookie
var cookie = ""
//登陆参数
var login, host, username, passwd, pass
//断开网络和重连间隔时间
var sec = get("ikuai_reconnect_interval")
var seconds = 3
try {
    seconds = parseInt(sec)
} catch (err) {
    seconds = 3
}
//重拨间隔时间
var lastTime = parseInt(get("ikuai_reconnect_last"))

//网络类型
var itype = get("ikuai_reconnect_type")
if (!itype) {
    itype = "pppoe"
}

//默认线路
var dft = get("ikuai_reconnect_default")
if (!dft) {
    dft = "0"
}

function checkAllParams() {
    host = checkParams("爱快地址,例:http://192.168.31.1", "host")
    if (!host) {
        return false
    }
    username = checkParams("登录名,例:admin", "username")
    if (!username) {
        return false
    }
    passwd = checkParams("抓包登录body密码参数passwd的值,应为32位字母数字", "passwd")
    if (!passwd) {
        return false
    }
    pass = checkParams("抓包登录body参数pass的值", "pass")
    if (!pass) {
        return false
    }
    return true
}

//检查必要的参数,tip为说明,param为参数
function checkParams(tip, param) {
    v = get("ikuai_" + param)
    if (!v) {
        sendText(tip + "未设置\n请两分钟内输入" + tip + "参数值:")
        p = input(120000);
        if (p) {
            set("ikuai_" + param, p)
            v = p
            sendText(tip + "参数" + param + "设置成功")
        } else {
            sendText("输入有误, 请重新发送指令!");
        }
    }
    return v
}

//执行重拨
function pppoe(id, type) {
    Debug("重拨线路:" + id)
    let up_action = "link_pppoe_up"
    let down_action = "link_pppoe_down"
    if (type == "vlan") {
        up_action = "vlan_up"
        down_action = "vlan_down"
    }

    //var id = param(1)
    var stop, start

    //下线
    var url = host + "/Action/call"
    var body = {
        "func_name": "wan",
        "action": down_action,
        "param": {
            "id": id
        }
    }
    Debug(JSON.stringify(body))
    var down = post(url, body)
    Debug(JSON.stringify(down))
    for (var x = 0; x < 5; x++) {
        if (down.ErrMsg == "Success") {
            stop = "线路" + id + "停用成功"
            break
        } else {
            stop = "线路" + id + "停用失败"
            down = post(url, body)
        }
    }
    sleep(seconds * 1000)
    //上线
    var body = {
        "func_name": "wan",
        "action": up_action,
        "param": {
            "id": id
        }
    }
    Debug(JSON.stringify(body))
    var up = post(url, body)
    Debug(JSON.stringify(up))
    for (var x = 0; x < 5; x++) {
        if (up.ErrMsg == "Success") {
            start = "线路" + id + "启用成功"
            break
        } else {
            var start = "线路" + id + "启用失败"
            up = post(url, body)
        }
    }
    //Debug(stop + "\n" + start + "\n线路" + id + "重拨完成")
    sleep(3000)
    if (ImType() == "fake" || ImType() == "carry") {
        notifyMasters(stop + "\n" + start + "\n线路" + id + "重拨完成")
    } else {
        sendText(stop + "\n" + start + "\n线路" + id + "重拨完成")
    }
}

//访问接口
function post(url, body) {
    var jsons = request({
        "url": url,
        "method": "post",
        "dataType": "json",
        "headers": {
            "Cookie": cookie
        },
        "body": JSON.stringify(body)
    })
    return jsons
}

function main() {
    if (msg == "爱快重置") {
        del("ikuai_host")
        del("ikuai_username")
        del("ikuai_passwd")
        del("ikuai_pass")
    }

    //检查参数
    if (!checkAllParams()) {
        return
    }

    //赋值
    login = {
        "username": username,//"admin",
        "passwd": passwd,//"6d7fa0844a5cbc93e8b4f98d87728b43",
        "pass": pass,//"c2FsdF8xMUhkbGl6aGU4NTAzMTgqIw==",
        "remember_password": true
    }

    //登录
    var url = host + "/Action/login"
    request({
        "url": url,
        "method": "post",
        "dataType": "json",
        "body": JSON.stringify(login),
        "cookie": "username=" + login.username + "; login=1"
    }, function (error, response, header, body) {
        var content = header["Set-Cookie"]
        var pattern = /sess_key=.*?;/
        cookie = pattern.exec(content) + " username=" + login.username + "; login=1"
        //Debug(cookie)
    })

    //获取当前ikuai几条线路
    url = host + "/Action/call"
    bd = {
        "func_name": "monitor_iface",
        "action": "show",
        "param": {
            "TYPE": "iface_check,iface_stream"
        }
    }
    //Debug(JSON.stringify(bd))
    b = post(url, bd)
    wans = JSON.parse(JSON.stringify(b))
    wansNum = wans.Data.iface_check.length
    //notifyMasters("线路数量:" + wansNum)
    if (parseInt(wansNum) == 1) {
        //sendText("当前1条线路")
        if (ImType() == "carry" || ImType() == "fake") {
            // nowTime = Date.now()
            // if (nowTime - lastTime > 300000) {
            //     bucketSet("otto", "ikuai_reconnect_last", Date.now())
            //     pppoe("1", itype)
            // }
        } else {
            pppoe("1", itype)
        }
    } else {
        if (ImType() == "carry" || ImType() == "fake") {
            nowTime = Date.now()
            if (nowTime - lastTime > 300000) {
                let ps = dft.split(",")
                Debug(ps)
                for (i = 0; i < ps.length; i++) {
                    pppoe(ps[i].toString(), itype)
                }
                bucketSet("otto", "ikuai_reconnect_last", Date.now())
            }
        } else {
            sendText("当前" + wansNum + "条线路,请输入重拨线路:\n(注:0.全部线路\n1,3,5为第一、三、五这三条线路)")
            pi = input(60000);
            Debug("输入的重拨线路:" + pi)
            if (pi == 0) {
                for (i = 1; i <= wansNum; i++) {
                    pppoe(i.toString(), itype)
                }
            } else {
                let ps = pi.split(",")
                Debug(ps)
                for (i = 0; i < ps.length; i++) {
                    pppoe(ps[i].toString(), itype)
                }
            }
        }
    }
}

main()