中文PT站官邀查询器

中国私人追踪器官方招募路线

目前为 2024-08-24 提交的版本。查看 最新版本

// ==UserScript==
// @name         中文PT站官邀查询器
// @namespace    https://greasyfork.org/zh-CN/users/1270887-co-ob
// @version      0.2.1
// @description  中国私人追踪器官方招募路线
// @author       ChatGPT, cO_ob
// @match        https://tieba.baidu.com/*pt*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';
    window.addEventListener('load', function() {

        const routeInfo = {
            'AgsvPT': {
                'XingTan': [90, '', '', 2408],
                'Vicomo': [0, 'Power User', '', 2404]
            },
            'Audiences': {
                'GGPT': [0, '', '', 2311],
                'Hares': [0, '', '', 2408],
                'HDPT': [0, '', '', 2407],
                'HTPT': [0, '', '', 2311],
                'PANDA': [0, '', '', 2401],
                'TTG': [0, 'Extreme User', '做种时间 2000天', 2406],
                'U2': [540, 'Veteran User', '发布5个相关种子', 2405]
            },
            'BTSCHOOL': {
                'ECUSTPT': [0, 'Power User', '发布数 1', 2404],
                'Hares': [0, 'Crazy User', '', 2403],
                'HDPT': [0, 'Elite User', '', 2402],
                'PigGo': [0, 'Crazy User', '', 2408],
                'ZmPT': [0, 'Elite User', '做种体积 1T', 2310]
            },
            'DIC': {
                'GPW': [0, 'Power User', '发布数 5', 2407],
                'PuTao': [180, 'Elite', '注册时间 1年 或 Torrent Master', 2402],
                'Vicomo': [0, 'Power User', '', 2401],
                'ZmPT': [0, 'Power User', '', 2309]
            },
            'GPW': {
                'AgsvPT': [0, 'Power User', '', 2404],
                'M-Team': [60, 'Elite', '', 2401],
                'PuTao': [180, 'Elite', '注册时间 1年 或 Torrent Master', 2402],
                'U2': [84, 'Power User', '已审核ACG发布数 5', 2404],
                'Vicomo': [0, 'Power User', '', 2401],
                'ZmPT': [180, 'Elite', '', 2309]
            },
            'HDDolby': {
                'HDCity': [0, 'Elite User', '', 2406],
                'Hares': [0, 'Power User', '', 2408],
                'HUDBT': [0, 'Power User', '', 2406],
                'ptsbao': [0, 'Power User', '', 2407],
                'RedLeaves': [90, 'Power User', '', 2407]
            },
            'HHCLUB': {
                'ECUSTPT': [0, 'Power User', '', 2408],
                'HDPT': [0, 'Power User', '', 2406],
                'PigGo': [0, 'Crazy User', '', 2405]
            },
            'HD4FANS': {
                'PTerClub': [180, 'Crazy User', '', 2407],
                'TorrentCCF': [90, 'Power User', '', 2403],
                'Vicomo': [0, 'Power User', '', 2401]
            },
            'HDArea': {
                'Hares': [0, 'Crazy User', '', 2402]
            },
            'HDAtmos': {
                'ECUSTPT': [0, 'Power User', '发布数 1', 2404]
            },
            'HDFans': {
                'ECUSTPT': [0, 'Power User', '发布数 1', 2405],
                'HDKylin': [0, '', '', 2408],
                'HUDBT': [0, 'Power User', '学习类发布数 5 或上传量 50GB', 2407],
                'HDPT': [0, 'Elite User', '', 2408],
                'Hares': [0, 'Crazy User', '', 2408],
                'RedLeaves': [180, 'Veteran User', '做种体积 2T', 2406],
                'ZmPT': [0, 'Elite User', '做种体积 1T', 2309]
            },
            'HDHome': {
                'HDVideo': [0, 'Elite User', '', 2403],
                'HDKylin': [0, 'Power User', '', 2407],
                'Hares': [0, 'Crazy User', '', 2402],
                'RedLeaves': [0, 'Elite User', '做种体积 5TB', 2405],
                'U2': [210, 'Veteran User', 'ACG发布数 5', 2407]
            },
            'HDSky': {
                'DaJiao': [0, 'Elite User', '', 2407],
                'GPW': [0, 'Elite User', '发布数 1', 2401],
                'PT@KEEPFRDS': [0, 'Insane User', '做种时间 2000天', 2407],
                'HTPT': [0, 'Power User', '', 2408],
                'RedLeaves': [90, 'Veteran User', '或 官种 5T', 2405]
            },
            'M-Team': {
                'HDKylin': [0, '', '', 2408],
                'HDPT': [0, 'Elite User', '', 2408],
                'FSM': [0, '', '', 2408],
                'GPW': [84, 'Crazy User', '发布数 1 上传量 500GB', 2405],
                'DiscFan': [200, 'Elite User', '', 2408],
                'Hares': [0, 'Elite User', '', 2406],
                'ilolicon': [0, 'Crazy User', '', 2408],
                'DaJiao': [0, 'Elite User', '', 2405],
                'DragonHD': [0, '', '上传量 2TB 分享率 1', 2406],
                'RedLeaves': [90, 'Veteran User', '官种做种体积 2TB', 2407]
            },
            'OpenCD': {
                'PTerClub': [180, 'Crazy User', '', 2401],
                'SSD': [360, 'Veteran User', '已审核ACG发布数 5', 2402],
                'BYRBT': [0, '', '上传量 200G', 2407]
            },
            'OurBits': {
                'RedLeaves': [90, 'Power User', '', 2404],
                'SSD': [360, 'Veteran User', '发布数 10 注册时间 12月 做种时间 50000天', 2404],
                'MonikaDesign': [56, 'Elite User', '', 2406],
                'DiscFan': [56, 'Elite User', '', 2408]
            },
            'PT@KEEPFRDS': {
                'FSM': [0, 'Power User', '', 2312],
                'HDPOST': [0, 'Elite User', '', 2407],
                'PTerClub': [180, 'Crazy User', '', 2407],
                'TorrentCCF': [30, 'Crazy User', '', 2404]
            },
            'PTerClub': {
                'TorrentCCF': [180, 'Crazy User', '发布数 1', 2407],
                'PuTao': [180, 'Insane User', '', 2405],
                'M-Team': [0, 'Crazy User', '发布数 10 或 Insane User', 2408],
                'HITPT': [0, 'Power User', '', 2408],
                'XingTan': [0, 'Power User', '', 2406],
                'FSM': [0, '', '', 2408],
                'PT@KEEPFRDS': [0, 'Insane User', 'FRDS资源做种体积 1TB', 2408],
                'DaJiao': [0, 'Elite User', '', 2408],
                'Hares': [0, 'Power User', '', 2406],
                'OpenCD': [280, 'Veteran User', '已审核音乐发布数 10', 2407],
                'GPW': [0, 'Crazy User', '影视或音乐发布数 1', 2402],
                'HDFans': [0, 'Power User', '', 2405],
                'HDPT': [0, 'Power User', '', 2406],
                'HDVideo': [0, 'Elite User', '', 2403],
                'kamePT': [0, 'Elite User', '', 2406],
                'MonikaDesign': [56, 'Power User', '', 2405],
                'OKPT': [30, 'Power User', '', 2406],
                'U2': [112, 'Crazy User', 'ACG发布数 5', 2404],
                'TLFBits': [90, 'Crazy User', 'TLF资源 1TB', 2407],
                'SSD': [300, '', '1.下载量1024GB;2.分享率 3.55;3.做种积分 1500000;4.已审核存活发布数 30', 2407],
                'PigGo': [0, 'Crazy User', '', 2408],
                'PANDA': [0, 'Power User', '', 2405],
                'HUDBT': [0, 'Power User', '', 2401]
            },
            'RedLeaves': {
                'OKPT': [0, '', '', 2311],
                'ECUSTPT': [0, 'Power User', '发布数 1', 2402],
                'AgsvPT': [0, 'Elite User', '已审核发布数 10', 2402],
                'XingTan': [0, '', '', 2404],
                'BTSCHOOL': [0, '', '', 2403],
                'qingwa': [0, 'Power User', '', 2403],
                'HDKylin': [0, 'Power User', '', 2407],
                'HDFans': [0, 'Power User', '', 2404],
                'Vicomo': [0, 'Power User', '', 2311],
                'Ubits': [0, 'Power User', '', 2311],
                'GGPT': [0, '', '', 2403],
                'kamePT': [0, 'Crazy User', '上传量 5GB', 2404]
            },
            'SSD': {
                'PuTao': [210, 'Elite', '1.发布数 20 或 保种积分 800000 或 下载量 2TB 上传量 10TB', 2405],
                'PTerClub': [180, 'Elite', '保种上传 20GB/月 或 100GB 或 发布数 3', 2407],
                'HDVideo': [0, 'Elite', '', 2407],
                'U2': [175, 'Elite', '1.做种积分 400000;2.发布1相关种子或保种上传 500GB', 2406],
                'PigGo': [180, '', '', 2407],
                'FSM': [0, '', '', 2408],
                'TorrentCCF': [30, '', '发布数 1', 2407],
                'TTG': [0, 'Master', '做种时间 2000天', 2311],
                'OpenCD': [180, 'God', '保种上传 1024GB', 2406],
                'OurBits': [0, 'Master', '发布数 10;保种上传 300GB', 2403]
            },
            'TLFBits': {
                'Hares': [0, 'Power User', '', 2402],
                'Soulvoice': [0, 'Crazy User', '', 2407],
                'PTerClub': [180, 'Crazy User', '', 2407]
            },
            'TorrentCCF': {
                'BYRBT': [0, '', '上传量 500GB', 2402],
                'RedLeaves': [180, 'Veteran User', '', 2407],
                'PTerClub': [0, 'Veteran User', '发布数 5', 2407],
                'HITPT': [0, 'Power User', '', 2406]
            },
            'tjupt': {
                'TLFBits': [0, '', '', 2408],
                'PuTao': [180, 'Power User', '1.发布数 10 HnR 90或 2.Crazy User 且 做种 5000天 HnR 95', 2402],
                'PTerClub': [90, 'Crazy User', '', 2401],
                'RedLeaves': [180, 'Veteran User', '', 2406],
                'HDCity': [0, 'Elite User', '', 2406],
                'HDFans': [0, 'Power User', 'HnR 100', 2312],
                'XingTan': [90, 'Power User', '', 2408],
                'GPW': [0, 'Crazy User', '', 2404],
                'MonikaDesign': [0, '', '', 2309]
            },
            'TTG': {
                'Audiences': [0, 'PetaByte', '1.(Audiences官种发布数 10 且 Audiences做种数100 且 Audiences做种体积 1TB) 或 (Audiences做种数100 且 Audiences做种体积 2TB)', 2408],
                'TLFBits': [0, 'TeraByte', '', 2407],
                'SSD': [0, 'BrontoByte', '发布数 5 做种时间 40000天', 2404]
            },
            'U2': {
                'HDCity': [0, '', '上传量 500GB 或 (上传量300GB 且 下载量100GB)', 2406],
                'kamePT': [0, 'Elite User', '', 2408],
                'OpenCD': [180, 'Ultimate User', '', 2407],
                'SSD': [0, 'Insane User', '做种体积×做种天数 1000000', 2407],
                'XingTan': [0, 'Power User', '', 2407],
                'PTerClub': [180, 'Insane User', '', 2402],
                'GPW': [0, 'Crazy User', '发布数 1', 2404],
                'MonikaDesign': [28, 'Power User', '', 2406],
                'PigGo': [0, 'Insane User', '', 2407]
            },
            'Ubits': {
                'Vicomo': [0, 'Power User', '', 2311],
                'RedLeaves': [90, 'Veteran User', '做种体积 5T', 2405],
                'qingwa': [0, 'Power User', '', 2403],
                'HDKylin': [0, '', '', 2408],
                'DaJiao': [0, 'Power User', '', 2311],
                'PigGo': [0, 'Crazy User', '', 2408]
            },
            'ZHUQUE': {
                'Hares': [0, '结丹', '', 2309],
                'qingwa': [0, '元婴', '', 2406],
                'FSM': [0, '', '', 2401],
                'RedLeaves': [180, '合体', '', 2405],
                'ECUSTPT': [0, '结丹', '发布数 1', 2404],
                'ZmPT': ['', '原石 300000', 2309]
            },
        };
        const unlockInviteClass = {
            'AgsvPT': '',
            'Audiences': 'Elite User',
            'BTSCHOOL': '',
            'DIC': 'Power User',
            'GPW': 'Power User',
            'HDDolby': 'Elite User',
            'HHCLUB': '',
            'HD4FANS': '',
            'HDArea': '',
            'HDAtmos': '',
            'HDFans': '',
            'HDHome': 'Crazy User',
            'HDSky': 'Elite User',
            'M-Team': 'Elite User',
            'OpenCD': 'Elite User',
            'OurBits': 'Elite User',
            'PT@KEEPFRDS': 'Elite User',
            'PTerClub': 'Power User',
            'RedLeaves': '',
            'SSD': 'Elite',
            'TLFBits': '',
            'TorrentCCF': 'Elite User',
            'tjupt': '',
            'TTG': 'TeraByte',
            'U2': '',
            'Ubits': '',
            'ZHUQUE': ''
        }
        const classInfo = {
            'AgsvPT': {
                'Power User': [28, '50GB', 1.05, '做种积分 40000'],
                'Elite User': [56, '120GB', 1.55, '做种积分 80000'],
                'Crazy User': [84, '300GB', 2.05, '做种积分 150000'],
                'Insane User': [140, '500GB', 2.55, '做种积分 400000'],
                'Veteran User': [196, '750GB', 4.05, '做种积分 800000'],
                'Extreme User': [280, '1TB', 5.05, '做种积分 1400000'],
                'Ultimate User': [364, '1.5TB', 6.05, '做种积分 2200000'],
                'Nexus Master': [490, '3TB', 7.05, '做种积分 3200000']
            },
            'Audiences': {
                'Power User': [35, '120GB', 2.0, '做种积分 100000'],
                'Elite User': [105, '240GB', 2.5, '做种积分 200000'],
                'Crazy User': [168, '400GB', 3.0, '做种积分 400000'],
                'Insane User': [280, '600GB', 3.5, '做种积分 640000'],
                'Veteran User': [420, '1TB', 4.0, '做种积分 880000'],
                'Extreme User': [560, '2TB', 4.5, '做种积分 1200000'],
                'Ultimate User': [700, '4TB', 5.0, '做种积分 1500000'],
                'Nexus Master': [784, '8TB', 6.0, '做种积分 1800000']
            },
            'BTSCHOOL': {
                'Power User': [28, '50GB', 2.0, '做种积分 40000'],
                'Elite User': [56, '100GB', 2.5, '做种积分 80000'],
                'Crazy User': [105, '300GB', 3.0, '做种积分 150000'],
                'Insane User': [175, '500GB', 3.5, '做种积分 250000'],
                'Veteran User': [280, '1TB', 4.0, '做种积分 400000'],
                'Extreme User': [420, '2TB', 4.5, '做种积分 600000'],
                'Ultimate User': [560, '5TB', 5.0, '做种积分 800000'],
                'Nexus Master': [700, '10TB', 5.5, '做种积分 1000000']
            },
            'DIC': {
                'Member': [7, '10GB', 0.7, ''],
                'Power User': [14, '25GB', 1.05, '发布数 5'],
                'Elite': [28, '75GB', 1.05, '发布数 50'],
                'Torrent Master': [56, '200GB', 1.05, '发布数 150'],
                'Power Torrent Master': [56, '375GB', 1.05, '独特分组发布数 300'],
                'Elite Torrent Master': [84, '600GB', 1.05, 'FLAC/WAV完美发布数 500'],
                'Elite Torrent Master Plus': [84, '600GB', 1.05, 'FLAC完美发布数 500'],
                'Guru': [112, '1.2TB', 1.05, 'FLAC完美发布数 1000']
            },
            'GPW': {
                'Member': [7, '80GB', 0.8, ''],
                'Power User': [14, '200GB', 1.2, '发布数 1'],
                'Elite': [28, '500GB', 1.2, '发布数 25'],
                'Torrent Master': [56, '1TB', 1.2, '发布数 100'],
                'Power Torrent Master': [84, '2TB', 1.2, '发布数 250'],
                'Elite Torrent Master': [112, '5TB', 1.2, '发布数 500'],
                'Guru': [140, '10TB', 1.2, '发布数 1000']
            },
            'HHCLUB': {
                'Power User': [28, '50GB', 1.05, '做种积分 80000'],
                'Elite User': [56, '120GB', 1.55, '做种积分 150000'],
                'Crazy User': [105, '300GB', 2.05, '做种积分 300000'],
                'Insane User': [175, '500GB', 2.55, '做种积分 500000'],
                'Veteran User': [280, '750GB', 3.05, '做种积分 900000'],
                'Extreme User': [420, '1TB', 3.55, '做种积分 1100000'],
                'Ultimate User': [560, '1.5TB', 4.05, '做种积分 1300000'],
                'Nexus Master': [700, '3TB', 4.55, '做种积分 1500000']
            },
            'HD4FANS': {
                'Power User': [28, '50GB', 1.05, '做种积分 40000'],
                'Elite User': [56, '120GB', 1.55, '做种积分 80000'],
                'Crazy User': [105, '300GB', 2.05, '做种积分 150000'],
                'Insane User': [175, '500GB', 2.55, '做种积分 250000'],
                'Veteran User': [280, '750GB', 3.05, '做种积分 400000'],
                'Extreme User': [420, '1TB', 3.55, '做种积分 600000'],
                'Ultimate User': [560, '1.5TB', 4.05, '做种积分 800000'],
                'Nexus Master': [700, '3TB', 4.55, '做种积分 1000000']
            },
            'HDArea': {
                'Power User': [28, '50GB', 1.05, ''],
                'Elite User': [56, '120GB', 3.0, ''],
                'Crazy User': [70, '300GB', 3.5, ''],
                'Insane User': [84, '750GB', 4.0, ''],
                'Veteran User': [140, '1TB', 4.5, ''],
                'Extreme User': [175, '2TB', 5.0, ''],
                'Ultimate User': [210, '5TB', 5.5, ''],
                'Nexus Master': [280, '10TB', 6.0, '']
            },
            'HDAtmos': {
                'Power User': [28, '50GB', 1.05, ''],
                'Elite User': [56, '120GB', 1.55, ''],
                'Crazy User': [105, '300GB', 2.05, ''],
                'Insane User': [175, '500GB', 2.55, ''],
                'Veteran User': [280, '750GB', 3.05, ''],
                'Extreme User': [420, '1TB', 3.55, ''],
                'Ultimate User': [560, '1.5TB', 4.05, ''],
                'Nexus Master': [700, '3TB', 4.55, '']
            },
            'HDDolby': {
                'Power User': [14, '120GB', 2.0, '做种积分 60000'],
                'Elite User': [28, '256GB', 2.5, '做种积分 120000'],
                'Crazy User': [56, '512GB', 3.0, '做种积分 240000'],
                'Insane User': [84, '768GB', 3.5, '做种积分 360000'],
                'Veteran User': [140, '1TB', 4.0, '做种积分 600000'],
                'Extreme User': [196, '2TB', 4.5, '做种积分 720000'],
                'Ultimate User': [280, '4TB', 5.0, '做种积分 1200000'],
                'Nexus Master': [392, '8TB', 5.5, '做种积分 1680000']
            },
            'HDFans': {
                'Power User': [28, '50GB', 1.0, '做种积分 50000'],
                'Elite User': [56, '120GB', 1.5, '做种积分 100000'],
                'Crazy User': [105, '256GB', 2.0, '做种积分 250000'],
                'Insane User': [210, '512GB', 2.5, '做种积分 400000'],
                'Veteran User': [280, '1TB', 3.0, '做种积分 600000'],
                'Extreme User': [350, '2TB', 3.5, '做种积分 800000'],
                'Ultimate User': [420, '4TB', 4.0, '做种积分 1000000'],
                'Nexus Master': [700, '10TB', 5.0, '做种积分 1688888']
            },
            'HDHome': {
                'Power User': [35, '256GB', 2.0, '做种积分 40000'],
                'Elite User': [56, '386GB', 2.5, '做种积分 100000'],
                'Crazy User': [84, '512GB', 3.0, '做种积分 180000'],
                'Insane User': [112, '768GB', 3.5, '做种积分 280000'],
                'Veteran User': [140, '1TB', 4.0, '做种积分 400000'],
                'Extreme User': [168, '2TB', 4.5, '做种积分 540000'],
                'Ultimate User': [210, '8TB', 5.0, '做种积分 700000'],
                'Nexus Master': [252, '10TB', 10.0, '做种积分 1000000']
            },
            'HDSky': {
                'Power User': [35, '200GB', 2.0, ''],
                'Elite User': [70, '500GB', 2.5, ''],
                'Crazy User': [105, '1TB', 3.0, ''],
                'Insane User': [140, '2TB', 3.5, ''],
                'Veteran User': [175, '4TB', 4.0, ''],
                'Extreme User': [210, '6TB', 4.5, ''],
                'Ultimate User': [315, '8TB', 5.0, ''],
                'Nexus Master': [455, '10TB', 5.5, '']
            },
            'M-Team': {
                'Power User': [28, '200GB', 2.0, ''],
                'Elite User': [56, '400GB', 3.0, ''],
                'Crazy User': [84, '500GB', 4.0, ''],
                'Insane User': [112, '800GB', 5.0, ''],
                'Veteran User': [140, '1000GB', 6.0, ''],
                'Extreme User': [168, '2000GB', 7.0, ''],
                'Ultimate User': [196, '2500GB', 8.0, ''],
                'Nexus Master': [224, '3000GB', 9.0, '']
            },
            'OpenCD': {
                'Power User': [28, '20GB', 1.5, ''],
                'Elite User': [56, '60GB', 2.0, ''],
                'Crazy User': [105, '200GB', 2.5, ''],
                'Insane User': [140, '400GB', 3.0, ''],
                'Veteran User': [175, '600GB', 3.5, ''],
                'Extreme User': [175, '1TB', 4.0, ''],
                'Ultimate User': [210, '2TB', 4.5, ''],
                'Nexus Master': [210, '3TB', 5.0, '']
            },
            'OurBits': {
                'Power User': [35, '100GB', 2.0, ''],
                'Elite User': [70, '350GB', 2.5, ''],
                'Crazy User': [105, '500GB', 3.0, ''],
                'Insane User': [140, '1TB', 3.5, ''],
                'Veteran User': [175, '2TB', 4.0, ''],
                'Extreme User': [210, '4TB', 4.5, ''],
                'Ultimate User': [280, '6TB', 5.0, ''],
                'Nexus Master': [364, '8TB', 5.5, '']
            },
            'PT@KEEPFRDS': {
                'Power User': [35, '50GB', 1.0, '积分 3200'],
                'Elite User': [70, '150GB', 1.5, '积分 19200'],
                'Crazy User': [105, '300GB', 2.0, '积分 76800'],
                'Insane User': [210, '500GB', 2.5, '积分 256000'],
                'Veteran User': [420, '1TB', 3.5, '积分 640000'],
                'Extreme User': [630, '2TB', 4.0, '积分 1280000'],
                'Ultimate User': [840, '3TB', 4.5, '积分 1920000'],
                'Nexus Master': [1050, '4TB', 5.0, '积分 2560000']
            },
            'PTerClub': {
                'Power User': [35, '50GB', 1.05, '做种积分 10000'],
                'Elite User': [70, '120GB', 1.55, '做种积分 30000'],
                'Crazy User': [168, '300GB', 2.05, '做种积分 80000'],
                'Insane User': [224, '500GB', 2.55, '做种积分 150000'],
                'Veteran User': [280, '750GB', 3.05, '做种积分 300000 或 做种积分 900000 发布数 10'],
                'Extreme User': [336, '1TB', 3.55, '做种积分 600000 或 做种积分 1800000 发布数 10'],
                'Ultimate User': [392, '1.5TB', 4.05, '做种积分 1200000 或 做种积分 3600000 发布数 10'],
                'Nexus Master': [784, '3TB', 4.55, '做种积分 2400000 或 做种积分 9600000 发布数 10']
            },
            'RedLeaves': {
                'Power User': [28, '100GB', 1.05, '做种积分 60000'],
                'Elite User': [56, '200GB', 1.55, '做种积分 120000'],
                'Crazy User': [105, '400GB', 2.05, '做种积分 200000'],
                'Insane User': [175, '800GB', 2.55, '做种积分 400000'],
                'Veteran User': [280, '1600GB', 3.05, '做种积分 600000'],
                'Extreme User': [420, '2400GB', 3.55, '做种积分 800000'],
                'Ultimate User': [560, '3200GB', 4.05, '做种积分 1000000'],
                'Nexus Master': [700, '4000GB', 4.55, '做种积分 2000000']
            },
            'SSD': {
                'Elite': [105, '500GB', 1.2, '做种积分 100000 或 做种积分 150000'],
                'Master': [210, '1TB', 1.2, '做种积分 500000 或 做种积分 1000000'],
                'God': [420, '3TB', 2.0, '做种积分 1200000 或 做种积分 2400000']
            },
            'TLFBits': {
                'Power User': [28, '50GB', 1.5, ''],
                'Elite User': [56, '120GB', 2.55, ''],
                'Crazy User': [105, '300GB', 3.05, ''],
                'Insane User': [175, '500GB', 4.55, ''],
                'Veteran User': [280, '750GB', 5.05, ''],
                'Extreme User': [315, '1TB', 6.55, ''],
                'Ultimate User': [350, '1.5TB', 7.05, ''],
                'Nexus Master': [385, '3TB', 8.55, '']
            },
            'TorrentCCF': {
                'Power User': [14, '64GB', 1.05, ''],
                'Elite User': [42, '128GB', 1.55, ''],
                'Crazy User': [98, '258GB', 2.05, ''],
                'Insane User': [182, '512GB', 2.55, ''],
                'Veteran User': [266, '1TB', 3.05, ''],
                'Extreme User': [378, '2TB', 3.55, ''],
                'Ultimate User': [490, '4TB', 4.05, ''],
                'Nexus Master': [616, '8TB', 4.55, '']
            },
            'tjupt': {
                'Power User': [28, '50GB', 1.0, '积分消耗 10000'],
                'Elite User': [56, '200GB', 1.0, '积分消耗 30000'],
                'Crazy User': [112, '800GB', 1.0, '积分消耗 80000'],
                'Insane User': [168, '2000GB', 1.0, '积分消耗 150000'],
                'Veteran User': [336, '5000GB', 1.0, '积分消耗 300000'],
                'Extreme User': [504, '10000GB', 1.0, '积分消耗 400000'],
                'Ultimate User': [700, '20000GB', 1.0, '积分消耗 600000'],
                'Nexus Master': [924, '50000GB', 1.0, '积分消耗 1000000']
            },
            'TTG': {
                'KiloByte': [35, '60GB', 1.1, ''],
                'MegaByte': [56, '150GB', 2.0, ''],
                'GigaByte': [56, '250GB', 2.0, ''],
                'TeraByte': [56, '500GB', 2.5, ''],
                'PetaByte': [112, '750GB', 2.5, ''],
                'ExaByte': [168, '1TB', 3.0, ''],
                'ZettaByte': [168, '1.5TB', 3.5, ''],
                'YottaByte': [168, '2.5TB', 4.0, ''],
                'BrontoByte': [224, '3.5TB', 5.0, ''],
                'NonaByte': [336, '5TB', 6.0, ''],
                'DoggaByte': [336, '10TB', 6.0, '']
            },
            'U2': {
                'Power User': [28, '50GB', 1.05, ''],
                'Elite User': [56, '120GB', 1.55, ''],
                'Crazy User': [105, '300GB', 2.05, ''],
                'Insane User': [175, '500GB', 2.55, ''],
                'Veteran User': [280, '750GB', 3.05, ''],
                'Extreme User': [420, '1TB', 3.55, ''],
                'Ultimate User': [560, '1.5TB', 4.05, ''],
                'Nexus Master': [700, '3TB', 4.55, '']
            },
            'Ubits': {
                'Power User': [35, '200GB', 2.0, '做种积分 80000'],
                'Elite User': [70, '500GB', 3.0, '做种积分 150000'],
                'Crazy User': [105, '800GB', 4.0, '做种积分 300000'],
                'Insane User': [140, '1TB', 5.0, '做种积分 650000'],
                'Veteran User': [175, '1.5TB', 6.0, '做种积分 1000000'],
                'Extreme User': [210, '2TB', 7.0, '做种积分 2000000'],
                'Ultimate User': [280, '3TB', 8.0, '做种积分 3000000'],
                'Nexus Master': [420, '4TB', 10.0, '做种积分 5000000']
            },
            'ZHUQUE': {
                '结丹': [35, '10GiB', 2.0, ''],
                '元婴': [70, '25GiB', 2.0, ''],
                '出窍': [105, '50GiB', 2.0, ''],
                '炼虚': [140, '100GiB', 2.0, ''],
                '合体': [175, '200GiB', 4.0, ''],
                '大乘': [210, '300GiB', 6.0, ''],
                '真仙': [245, '400GiB', 8.0, '']
            },
        };
        const nicknameList = {
            'AgsvPT': '末日',
            'Audiences': '人人',
            'BTSCHOOL': '学校',
            'BYRBT': '北邮',
            'DaJiao': '打胶',
            'DIC': '海豚',
            'DiscFan': '碟粉',
            'DragonHD': '龙',
            'ECUSTPT': '花梨',
            'FSM': '拉面',
            'GGPT': 'GGPT',
            'GPW': '海豹',
            'Hares': '白兔',
            'HD4FANS': '兽',
            'HDArea': '好大',
            'HDAtmos': '阿童木',
            'HDCity': '城市',
            'HDDolby': '杜比',
            'HDFans': '红豆',
            'HDHome': '家园',
            'HDKylin': '麒麟',
            'HDPOST': '普斯特',
            'HDPT': '明教',
            'HDSky': '天空',
            'HdVideo': 'HdVideo',
            'HHCLUB': '聪明',
            'HITPT': '百川',
            'HTPT': '海棠',
            'HUDBT': '蝴蝶',
            'ilolicon': 'ilolicon',
            'kamePT': 'kamePT',
            'M-Team': '馒头',
            'MonikaDesign': '莫妮卡',
            'OurBits': '我堡',
            'OKPT': 'OKPT',
            'OpenCD': '皇后',
            'PANDA': '熊猫',
            'PigGo': '猪',
            'PT@KEEPFRDS': '月',
            'PTerClub': '猫',
            'ptsbao': '烧包',
            'PuTao': '葡萄',
            'qingwa': '青蛙',
            'RedLeaves': '红叶',
            'Soulvoice': '聆音',
            'SSD': '草莓',
            'tjupt': '北洋',
            'TLFBits': '吐鲁番',
            'TorrentCCF': '吹风',
            'TTG': '听歌',
            'U2': '花园',
            'Ubits': '你堡',
            'Vicomo': '象',
            'XingTan': '杏坛',
            'ZHUQUE': '朱雀',
            'ZmPT': '织梦'
        }

        var style = document.createElement('style');
        style.textContent = `
            #tb_header_search_form {
            align-items: center;
            flex-wrap: nowrap;
            overflow: hidden;
            white-space: nowrap;
			}
			.search_btn_wrap {
				margin-right: 5px;
			}
			.search_btn {
				display: inline-block;
				vertical-align: middle;
				text-decoration: none;
			}
			.official_invite {
				background-color: #fff;
				color: #38f !important;
				padding: 5px 10px;
				text-align: center;
				white-space: nowrap;
			}
			#routeCalcForm {
				--light: hsl(0, 0%, 100%);
				--background: linear-gradient(to right bottom, hsl(236, 50%, 50%), hsl(195, 50%, 50%));
				position: fixed;
				top: 50%;
				left: 50%;
				transform: translate(-50%, -50%);
				width: 700px;
				height: 400px;
				background: var(--background);
				border-radius: 12px;
				padding: 20px;
				user-select: none;
				z-index: 9999;
			}

			#routeCalcForm label {
				display: block;
				margin-bottom: 5px;
			}

			#routeCalcForm select {
				background: transparent;
				color: var(--light);
			}

			#routeCalcForm button {
				margin-bottom: 10px;
				padding: 16px 20px;
				color: var(--light);
				background: transparent;
				font-size: 16px;
				font-family: inherit;
				letter-spacing: 2px;
				transition: .2s;
				cursor: pointer;
			}

			#routeCalcForm #result {
				margin-top: 10px;
			}

			#routeContainer {
				display: flex;
				margin-top: 20px;
				align-items: center;
				justify-content: space-between;
				padding: 10px;
				position: relative;
			}

			#routeTitle {
				color: var(--light);
				background: transparent;
				font-size: 16px;
				text-align: center;
			}

			#routeCalcForm #leftButton {
				position: absolute;
				top: 30px;
				left: 80px;
				width: 180px;
				display: flex;
				flex-direction: column;
				justify-content: space-between;
			}

			#routeCalcForm #rightButton {
				position: absolute;
				top: 30px;
				right: 80px;
				width: 180px;
				display: flex;
				flex-direction: column;
				justify-content: space-between;
			}

            #routeCalcForm #rightButton #target,
            #routeCalcForm #leftButton #source {
                margin-top: -90px;
                padding: 80px 30px 30px 30px;
                color: var(--light);
                background: transparent;
                font-size: 16px;
                font-weight: bold;
                font-family: inherit;
                letter-spacing: 2px;
                transition: .2s;
                cursor: pointer;
                z-index: 6000;
            }

			#routeCalcForm #leftButton button,
            #routeCalcForm #rightButton button{
				margin-top: 10px;
				border: none;
				padding: 16px 25px;
				color: var(--light);
				background: transparent;
				font-size: 32px;
				font-family: inherit;
				letter-spacing: 2px;
				transition: .2s;
				cursor: pointer;
			}

			#routeCalcForm #bottomButtons {
				position: absolute;
				bottom: 20px;
				right: 20px;
			}

			#routeCalcForm #bottomButtons button {
				margin: 0;
				padding: 16px 25px;
				border: 1px solid hsla(0, 0%, 100%, .6);
				border-radius: 1600px;
				color: var(--light);
				background: transparent;
				font-size: 16px;
				font-family: inherit;
				letter-spacing: 2px;
				transition: .2s;
				cursor: pointer;
                right: 20px;
			}
			#prevroute, #nextroute {
				display: none;
				position: absolute;
				bottom: 0;
				padding: 8px 16px;
				color: var(--light);
				background: transparent;
				font-size: 48px;
				font-family: inherit;
				letter-spacing: 1px;
				cursor: pointer;
			}

			#prevroute {
				left: 0;
			}

			#nextroute {
				right: 0;
			}

			#routeText {
				padding: 10px;
				margin-top: 20px;
				color: var(--light);
				font-size: 13px;
				max-height: 200px;
				overflow: auto;
				line-height: 1.6;
			}

			#routeText::-webkit-scrollbar {
				width: 0;
				height: 0;
			}

			#routeText::-webkit-scrollbar-track {
				background: transparent;
			}

			#routeText::-webkit-scrollbar-thumb {
				background: transparent;
			}

			.separator {
				height: 1px;
				background-color: hsla(0, 0%, 100%, .4);
				margin: 10px 0;
			}

			#gridContainer {
				display: none;
				position: absolute;
				width: 600px;
				top: 130px;
				left: 60px;
                max-height: 200px;
                overflow: hidden;
				background: #f9f9f9;
				padding: 10px;
				box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
				border-radius: 8px;
                overflow-y: auto;
				z-index: 10000;
			}

            #gridContainer::-webkit-scrollbar {
                display: none;
            }

            #gridContainer {
                -ms-overflow-style: none;
                scrollbar-width: none;
            }

			#gridContainer div {
				padding: 8px;
				background: #fff;
				text-align: center;
				cursor: pointer;
			}

		`;
        document.head.appendChild(style);

        var form = document.querySelector('#tb_header_search_form');
        if (!form) return;

        var enterBaBtn = form.querySelector('.search_btn_enter_ba');
        var searchPostBtn = form.querySelector('.j_search_post');
        if (!enterBaBtn || !searchPostBtn) return;

        var newButton = document.createElement('span');
        newButton.className = 'search_btn_wrap';
        newButton.innerHTML = '<a rel="noopener" class="search_btn official_invite" href="#" onclick="return false;" onmousedown="this.className+=\' search_btn_down\'" onmouseout="this.className=this.className.replace(\' search_btn_down\',\'\')">车票查询</a>';
        enterBaBtn.parentNode.insertAdjacentElement('afterend', newButton);

        const inviteForm = document.createElement('form');
        inviteForm.id = 'routeCalcForm';
        inviteForm.style.display = 'none';
        inviteForm.innerHTML = `

			<div id="leftButton">
				<button type="button" id="sourcenick">始发站</button>
				<button type="button" id="source">From</button>
			</div>
			<div id="rightButton">
				<button type="button" id="targetnick">终点站</button>
				<button type="button" id="target">To</button>
			</div>
			<div id="routeContainer">
				<div id="routeTitle"></div>
				<div id="prevroute">&#8249;&#8249;</div>
				<div id="nextroute">&#8250;&#8250;</div>
			</div>
			<div id="routeText"></div>
			<div id="gridContainer"></div>
			<div id="bottomButtons">
				<button type="button" id="exit">佛系观影</button>
			</div>

		`;
        let allRoutes = [];
        let currentRouteIndex = 0;

        document.body.appendChild(inviteForm);
        document.querySelector('.official_invite').addEventListener('click', () => {
            inviteForm.style.display = inviteForm.style.display === 'none' ? 'block' : 'none';
        });

        waitForElement('a.search_btn.j_search_post', (button) => {
            button.remove();
        });

        document.getElementById('exit').addEventListener('click', function() {
            document.getElementById('routeCalcForm').style.display = 'none';
        });

        document.getElementById('source').addEventListener('click', function() {
            const gridContainer = document.getElementById('gridContainer');
            if (gridContainer.style.display === 'none' || gridContainer.style.display === '') {
                populateGrid('source');
                gridContainer.style.display = 'block';
            } else {
                gridContainer.style.display = 'none';
            }
        });

        document.getElementById('target').addEventListener('click', function() {
            const gridContainer = document.getElementById('gridContainer');
            if (gridContainer.style.display === 'none' || gridContainer.style.display === '') {
                populateGrid('target');
                gridContainer.style.display = 'block';
            } else {
                gridContainer.style.display = 'none';
            }
        });

        document.getElementById('prevroute').addEventListener('click', function() {
            showRoute(-1);
        });

        document.getElementById('nextroute').addEventListener('click', function() {
            showRoute(1);
        });

        function populateGrid(buttonId) {
            const gridContainer = document.getElementById('gridContainer');
            gridContainer.innerHTML = '';

            const uniqueKeys = Array.from(new Set(
                Object.keys(routeInfo)
                .flatMap(startKey => [startKey, ...Object.keys(routeInfo[startKey])])
            ))
            .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));

            if (buttonId === 'source') {
                uniqueKeys.unshift('From');
            } else if (buttonId === 'target') {
                uniqueKeys.unshift('To');
            }

            const container = document.createElement('div');
            container.style.display = 'grid';
            container.style.gridTemplateColumns = 'repeat(auto-fit, minmax(100px, auto))';
            container.style.gap = '0px';

            uniqueKeys.forEach(key => {
                const item = document.createElement('div');
                item.textContent = key;
                item.style.padding = '8px';
                item.style.background = '#fff';
                item.style.textAlign = 'center';
                item.style.cursor = 'pointer';
                item.style.whiteSpace = 'nowrap';
                item.style.minWidth = 'max-content';
                item.addEventListener('click', () => {
                    if (buttonId === 'source') {
                        if (key === 'From') {
                            setTextContent('source', 'From');
                            setTextContent('sourcenick', '始发站');
                        } else {
                            setTextContent('source', key);
                            setTextContent('sourcenick', nicknameList[key] || key);
                        }
                    } else if (buttonId === 'target') {
                        if (key === 'To') {
                            setTextContent('target', 'To');
                            setTextContent('targetnick', '终点站');
                        } else {
                            setTextContent('target', key);
                            setTextContent('targetnick', nicknameList[key] || key);
                        }
                    }
                    gridContainer.style.display = 'none';
                    calculateRoute();
                });
                container.appendChild(item);
            });

            gridContainer.appendChild(container);
        }

        function calculateRoute() {

            const routeContainer = document.getElementById('routeContainer');
            const resultTitle = document.getElementById('routeTitle');
            const resultDescription = document.getElementById('routeText');
            const prevRouteButton = document.getElementById('prevroute');
            const nextRouteButton = document.getElementById('nextroute');

            resultTitle.innerText = '';
            resultDescription.innerHTML = '';
            prevRouteButton.style.display = 'none';
            nextRouteButton.style.display = 'none';

            const start = document.getElementById('source').textContent.trim();
            const end = document.getElementById('target').textContent.trim();

            if (start === end) {
                resultTitle.innerText = '同站';
                resultDescription.innerText = '';
                routeContainer.style.display = 'block';
                return;
            }

            if (start === 'From') {
                if (end === 'To') {
                    resultTitle.innerText = '至少选一个';
                    resultDescription.innerText = '';
                    routeContainer.style.display = 'block';
                    return;
                }
                allRoutes = Object.keys(routeInfo)
                    .filter(node => routeInfo[node] && routeInfo[node][end])
                    .map(node => [node, end]);
            } else if (end === 'To') {
                if (!routeInfo[start]) {
                    resultTitle.innerText = '没有';
                    resultDescription.innerText = '';
                    routeContainer.style.display = 'block';
                    return;
                }
                allRoutes = Object.keys(routeInfo[start])
                    .map(node => [start, node])
                    .filter(([from, to]) => routeInfo[from] && routeInfo[from][to])
                    .map(([from, to]) => [from, to]);
            } else {
                if (!routeInfo[start]) {
                    resultTitle.innerText = '没有';
                    resultDescription.innerText = '';
                    routeContainer.style.display = 'block';
                    return;
                }
                allRoutes = findAllRoutes(start, end);
            }

            if (allRoutes.length === 0) {
                resultTitle.innerText = '到不了';
                resultDescription.innerText = '';
                routeContainer.style.display = 'block';
                return;
            }

            allRoutes = allRoutes.sort((a, b) => {
                const timeA = a.reduce((sum, node, index) => {
                    if (index < a.length - 1 && routeInfo[node] && routeInfo[node][a[index + 1]]) {
                        return sum + getMaxDays(node, a[index + 1]);
                    }
                    return sum;
                }, 0);

                const timeB = b.reduce((sum, node, index) => {
                    if (index < b.length - 1 && routeInfo[node] && routeInfo[node][b[index + 1]]) {
                        return sum + getMaxDays(node, b[index + 1]);
                    }
                    return sum;
                }, 0);

                return timeA - timeB;
            });

            currentRouteIndex = 0;
            showRoute(0);
        }

        function showRoute(direction) {
            if (allRoutes.length === 0) return;

            currentRouteIndex = (currentRouteIndex + direction + allRoutes.length) % allRoutes.length;

            const route = allRoutes[currentRouteIndex];
            const routeContainer = document.getElementById('routeContainer');
            const resultTitle = document.getElementById('routeTitle');
            const resultDescription = document.getElementById('routeText');
            const prevRouteButton = document.getElementById('prevroute');
            const nextRouteButton = document.getElementById('nextroute');

            const totalRoutes = allRoutes.length;
            const routeCountText = `第 ${currentRouteIndex + 1} 条 /总 ${totalRoutes} 条`;

            resultTitle.innerText = `${routeCountText}\n当前路线换乘 ${route.length - 2} 次 耗时 ${route.reduce((sum, node, index) => {
                if (index < route.length - 1 && routeInfo[node] && routeInfo[node][route[index + 1]]) {
                    return sum + getMaxDays(node, route[index + 1]);
                }
                return sum;
            }, 0)} 天`;

            const details = route.map((node, index) => {
                console.log("Processing node:", node);
                if (index < route.length - 1 && routeInfo[node] && routeInfo[node][route[index + 1]]) {
                    const nextNode = route[index + 1];
                    const maxDays = getMaxDays(node, nextNode);
                    const [time, userclass, requirement, lastActivity] = routeInfo[node][nextNode];
                    const formattedDate = formatDate(lastActivity);

                    const fromUserClassIndex = Object.keys(classInfo[node]).indexOf(userclass);
                    const unlockUserClassIndex = Object.keys(classInfo[node]).indexOf(unlockInviteClass[node]);

                    const higherUserClass = (unlockUserClassIndex !== -1)
                    ? (fromUserClassIndex > unlockUserClassIndex ? userclass : unlockInviteClass[node])
                    : userclass;

                    let upgradeReqText = '';
                    if (higherUserClass && Object.keys(classInfo[node]).includes(higherUserClass)) {
                        const upgradeReq = classInfo[node][higherUserClass];
                        const upgradeReqParts = [];
                        if (upgradeReq[0]) upgradeReqParts.push(`${upgradeReq[0]}天`);
                        if (upgradeReq[1]) upgradeReqParts.push(`下载量${upgradeReq[1]}`);
                        if (upgradeReq[2]) upgradeReqParts.push(`分享率${upgradeReq[2]}`);
                        if (upgradeReq[3]) upgradeReqParts.push(upgradeReq[3]);

                        upgradeReqText = upgradeReqParts.join(',');
                    }

                    let baseText = `<div class="separator"></div>${node} -> ${nextNode} 时间:${maxDays}天 ${userclass ? `申请等级:${userclass}` : ''}${unlockInviteClass[node] ? ` 解锁等级:${unlockInviteClass[node]}` : ''} 最近活动:${formattedDate}`;

                    if (userclass || unlockInviteClass[node]) {
                        baseText += `<br>升级要求:${upgradeReqText};`;
                    }

                    if (requirement) {
                        baseText += `<br>额外要求:${requirement};`;
                    }

                    return baseText;
                }
                return '';
            });

            resultDescription.innerHTML = details.join('');

            prevRouteButton.style.display = currentRouteIndex === 0 ? 'none' : 'inline';
            nextRouteButton.style.display = currentRouteIndex === allRoutes.length - 1 ? 'none' : 'inline';
            routeContainer.style.display = 'block';
        }

        function getMaxDays(start, end) {
            const days1 = routeInfo[start][end][0];
            const userclassRequirement = routeInfo[start][end][1];
            const days2 = (userclassRequirement === '') ? 0 : classInfo[start][userclassRequirement][0];
            let days3 = 0;
            const unlockUserClass = unlockInviteClass[start];
            if (unlockUserClass) {
                days3 = classInfo[start][unlockUserClass][0];
            }
            return Math.max(days1, days2, days3);
        }

        function findAllRoutes(start, end) {
            const result = [];
            const stack = [[start, [start]]];
            const visited = new Set();

            while (stack.length) {
                const [node, route] = stack.pop();

                if (node === end) {
                    result.push(route);
                    continue;
                }

                visited.add(node);

                for (const [next, _] of Object.entries(routeInfo[node] || {})) {
                    if (!route.includes(next) && !visited.has(next)) {
                        stack.push([next, [...route, next]]);
                    }
                }
            }

            return result;
        }

        function formatDate(dateString) {
            const year = Math.floor(dateString / 100);
            const month = dateString % 100;
            return `20${year}年${month.toString().padStart(2, '0')}月`;
        }

        function waitForElement(selector, callback) {
            const interval = setInterval(() => {
                const element = document.querySelector(selector);
                if (element) {
                    clearInterval(interval);
                    callback(element);
                }
            }, 100);
        }

        function setTextContent(id, text) {
            document.getElementById(id).textContent = text;
        }
    });
})();