Skip to content

Instantly share code, notes, and snippets.

@John-Chan
Created January 22, 2024 08:25
Show Gist options
  • Save John-Chan/d6cdcd75d108c3f4f146ed1f74b103f5 to your computer and use it in GitHub Desktop.
Save John-Chan/d6cdcd75d108c3f4f146ed1f74b103f5 to your computer and use it in GitHub Desktop.

Revisions

  1. John-Chan created this gist Jan 22, 2024.
    166 changes: 166 additions & 0 deletions ClashVergRevProfile.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,166 @@
    // This script used to enhance clash rules

    // rules maintained by yourself
    const local_rules = [
    "DOMAIN-SUFFIX,example.local,DIRECT,no-resolve"
    ];


    // copy from https://github.com/Loyalsoldier/clash-rules
    const extra_rules = [
    "RULE-SET,applications,DIRECT",
    "DOMAIN,clash.razord.top,DIRECT",
    "DOMAIN,yacd.haishan.me,DIRECT",
    "RULE-SET,private,DIRECT",
    "RULE-SET,reject,REJECT",
    "RULE-SET,icloud,DIRECT",
    "RULE-SET,apple,DIRECT",
    "RULE-SET,google,DIRECT",
    "RULE-SET,proxy,PROXY",
    "RULE-SET,direct,DIRECT",
    "RULE-SET,lancidr,DIRECT",
    "RULE-SET,cncidr,DIRECT",
    "RULE-SET,telegramcidr,PROXY",
    "GEOIP,LAN,DIRECT",
    "GEOIP,CN,DIRECT",
    "MATCH,PROXY"
    ];

    // copy from https://github.com/Loyalsoldier/clash-rules
    const extra_providers = {
    "reject": {
    "type": "http",
    "behavior": "domain",
    "url": "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt",
    "path": "./ruleset/reject.yaml",
    "interval": 86400
    },
    "icloud": {
    "type": "http",
    "behavior": "domain",
    "url": "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt",
    "path": "./ruleset/icloud.yaml",
    "interval": 86400
    },
    "apple": {
    "type": "http",
    "behavior": "domain",
    "url": "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt",
    "path": "./ruleset/apple.yaml",
    "interval": 86400
    },
    "google": {
    "type": "http",
    "behavior": "domain",
    "url": "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt",
    "path": "./ruleset/google.yaml",
    "interval": 86400
    },
    "proxy": {
    "type": "http",
    "behavior": "domain",
    "url": "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt",
    "path": "./ruleset/proxy.yaml",
    "interval": 86400
    },
    "direct": {
    "type": "http",
    "behavior": "domain",
    "url": "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt",
    "path": "./ruleset/direct.yaml",
    "interval": 86400
    },
    "private": {
    "type": "http",
    "behavior": "domain",
    "url": "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt",
    "path": "./ruleset/private.yaml",
    "interval": 86400
    },
    "gfw": {
    "type": "http",
    "behavior": "domain",
    "url": "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt",
    "path": "./ruleset/gfw.yaml",
    "interval": 86400
    },
    "tld-not-cn": {
    "type": "http",
    "behavior": "domain",
    "url": "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt",
    "path": "./ruleset/tld-not-cn.yaml",
    "interval": 86400
    },
    "telegramcidr": {
    "type": "http",
    "behavior": "ipcidr",
    "url": "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt",
    "path": "./ruleset/telegramcidr.yaml",
    "interval": 86400
    },
    "cncidr": {
    "type": "http",
    "behavior": "ipcidr",
    "url": "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt",
    "path": "./ruleset/cncidr.yaml",
    "interval": 86400
    },
    "lancidr": {
    "type": "http",
    "behavior": "ipcidr",
    "url": "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt",
    "path": "./ruleset/lancidr.yaml",
    "interval": 86400
    },
    "applications": {
    "type": "http",
    "behavior": "classical",
    "url": "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt",
    "path": "./ruleset/applications.yaml",
    "interval": 86400
    }
    };

    function apply_rules(params){
    /// merge rule-providers
    const original_providers = params['rule-providers'] || {};
    params['rule-providers'] = { ...original_providers, ...extra_providers};
    /// append rules
    const original_rules = params['rules'] || [];
    params['rules'] = [...local_rules, ...original_rules,...extra_rules];
    return params;
    }

    function enhance(params){
    console.log(`check rules`);
    // if no proxies,skip
    let proxy_names = (params['proxies'] || []).map((o) => o['name']).filter((str) => str !== '');
    if(proxy_names.length === 0){
    console.log('proxies is empty, skip');
    return params;
    }

    console.log(`found ${proxy_names.length} proxies,add rules`);

    /// makesure the 'PROXY' proxy group exists
    let default_group = (params['proxy-groups'] || []).find((o) => o['name'] ==='PROXY');
    if(!default_group){
    default_group = { name: "PROXY", type: "select", proxies: proxy_names };
    params['proxy-groups'] = [default_group,...params['proxy-groups']];
    }
    return apply_rules(params);
    }

    // The entry function used by clash-verg-rev
    function main(params) {
    //console.log(JSON.stringify(params));
    try{
    const ret = enhance(params);
    console.log('process completed');
    return ret;
    }catch(e){
    console.log(`error: ${JSON.stringify(e)}`);
    return params;
    }

    }