您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
PIU Phoenix Score&Title Analyser Patch 1.0.2
// ==UserScript== // @name PIU Phoenix // @license MIT // @namespace https://github.com/numbuh1/pump-it-up-phoenix-bookmarklet // @version 1.2 // @description PIU Phoenix Score&Title Analyser Patch 1.0.2 // @author numbuh1 // @match https://piugame.com/my_page/my_best_score.php // @icon <$ICON$> // @require https://code.jquery.com/jquery-3.7.0.min.js // ==/UserScript== const rating_text = { 'sss_p': 'SSS+', 'sss': 'SSS', 'ss_p': 'SS+', 'ss': 'SS', 's_p': 'S+', 's': 'S', 'aaa_p': 'AAA+', 'aaa': 'AAA', 'aa_p': 'AA+', 'aa': 'AA', 'a_p': 'A+', 'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D', 'f': 'F', }; const plate_text = { 'pg': 'PERFECT GAME', 'ug': 'ULTIMATE GAME', 'eg': 'EXTREME GAME', 'sg': 'SUPERB GAME', 'mg': 'MARVELOUS GAME', 'tg': 'TALENTED GAME', 'fg': 'FAIR GAME', 'rg': 'ROUGH GAME' }; const expert_titles = [ { name: 'THE MASTER', description: '[Lv.28] 1,900 rating', tier: 'platinum', type: 'rating', level: '28', rating: '1900' }, { name: 'EXPERT Lv.10', description: '[Lv.27] 7,000 rating', tier: 'platinum', type: 'rating', level: '27', rating: '7000' }, { name: 'EXPERT Lv.9', description: '[Lv.27] 3,500 rating', tier: 'gold', type: 'rating', level: '27', rating: '3500' }, { name: 'EXPERT Lv.8', description: '[Lv.26] 26,000 rating', tier: 'gold', type: 'rating', level: '26', rating: '26000' }, { name: 'EXPERT Lv.7', description: '[Lv.26] 13,000 rating', tier: 'gold', type: 'rating', level: '26', rating: '13000' }, { name: 'EXPERT Lv.6', description: '[Lv.25] 40,000 rating', tier: 'gold', type: 'rating', level: '25', rating: '40000' }, { name: 'EXPERT Lv.5', description: '[Lv.25] 20,000 rating', tier: 'gold', type: 'rating', level: '25', rating: '20000' }, { name: 'EXPERT Lv.4', description: '[Lv.24] 60,000 rating', tier: 'gold', type: 'rating', level: '24', rating: '60000' }, { name: 'EXPERT Lv.3', description: '[Lv.24] 30,000 rating', tier: 'gold', type: 'rating', level: '24', rating: '30000' }, { name: 'EXPERT Lv.2', description: '[Lv.23] 80,000 rating', tier: 'gold', type: 'rating', level: '23', rating: '80000' }, { name: 'EXPERT Lv.1', description: '[Lv.23] 40,000 rating', tier: 'gold', type: 'rating', level: '23', rating: '40000' }, { name: 'ADVANCED Lv.10', description: '[Lv.22] 70,000 rating', tier: 'silver', type: 'rating', level: '22', rating: '70000' }, { name: 'ADVANCED Lv.9', description: '[Lv.22] 52,500 rating', tier: 'silver', type: 'rating', level: '22', rating: '52500' }, { name: 'ADVANCED Lv.8', description: '[Lv.22] 35,000 rating', tier: 'silver', type: 'rating', level: '22', rating: '35000' }, { name: 'ADVANCED Lv.7', description: '[Lv.22] 17,500 rating', tier: 'silver', type: 'rating', level: '22', rating: '17500' }, { name: 'ADVANCED Lv.6', description: '[Lv.21] 45,000 rating', tier: 'silver', type: 'rating', level: '21', rating: '45000' }, { name: 'ADVANCED Lv.5', description: '[Lv.21] 30,000 rating', tier: 'silver', type: 'rating', level: '21', rating: '30000' }, { name: 'ADVANCED Lv.4', description: '[Lv.21] 15,000 rating', tier: 'silver', type: 'rating', level: '21', rating: '15000' }, { name: 'ADVANCED Lv.3', description: '[Lv.20] 39,000 rating', tier: 'silver', type: 'rating', level: '20', rating: '39000' }, { name: 'ADVANCED Lv.2', description: '[Lv.20] 26,000 rating', tier: 'silver', type: 'rating', level: '20', rating: '26000' }, { name: 'ADVANCED Lv.1', description: '[Lv.20] 13,000 rating', tier: 'silver', type: 'rating', level: '20', rating: '13000' }, { name: 'INTERMEDIATE Lv.10', description: '[Lv.19] 11,000 rating', tier: 'bronze', type: 'rating', level: '19', rating: '11000' }, { name: 'INTERMEDIATE Lv.9', description: '[Lv.18] 9,200 rating', tier: 'bronze', type: 'rating', level: '18', rating: '9200' }, { name: 'INTERMEDIATE Lv.8', description: '[Lv.17] 7,600 rating', tier: 'bronze', type: 'rating', level: '17', rating: '7600' }, { name: 'INTERMEDIATE Lv.7', description: '[Lv.16] 6,200 rating', tier: 'bronze', type: 'rating', level: '16', rating: '6200' }, { name: 'INTERMEDIATE Lv.6', description: '[Lv.15] 5,000 rating', tier: 'bronze', type: 'rating', level: '15', rating: '5000' }, { name: 'INTERMEDIATE Lv.5', description: '[Lv.14] 4,000 rating', tier: 'bronze', type: 'rating', level: '14', rating: '4000' }, { name: 'INTERMEDIATE Lv.4', description: '[Lv.13] 3,200 rating', tier: 'bronze', type: 'rating', level: '13', rating: '3200' }, { name: 'INTERMEDIATE Lv.3', description: '[Lv.12] 2,600 rating', tier: 'bronze', type: 'rating', level: '12', rating: '2600' }, { name: 'INTERMEDIATE Lv.2', description: '[Lv.11] 2,200 rating', tier: 'bronze', type: 'rating', level: '11', rating: '2200' }, { name: 'INTERMEDIATE Lv.1', description: '[Lv.10] 2,000 rating', tier: 'bronze', type: 'rating', level: '10', rating: '2000' }, { name: 'SPECIALIST', description: 'All skill titles', tier: 'platinum', type: 'skill_collect', collect_type: 'skill', count: 60 }, { name: '[BRACKET] EXPERT', description: 'All Bracket titles', tier: 'platinum', type: 'skill_collect', collect_type: 'bracket', count: 10 }, { name: '[BRACKET] Lv.10', description: 'Phalanx D24', tier: 'platinum', type: 'skill', collect_type: 'bracket', song: 'Phalanx', diff: 'D24' }, { name: '[BRACKET] Lv.9', description: 'Scorpion King D23', tier: 'platinum', type: 'skill', collect_type: 'bracket', song: 'Scorpion King', diff: 'D23' }, { name: '[BRACKET] Lv.8', description: 'Pop Sequence D23', tier: 'gold', type: 'skill', collect_type: 'bracket', song: 'Pop Sequence', diff: 'D23' }, { name: '[BRACKET] Lv.7', description: 'What Happened D23', tier: 'gold', type: 'skill', collect_type: 'bracket', song: 'What Happened', diff: 'D23' }, { name: '[BRACKET] Lv.6', description: 'Meteo5cience D22', tier: 'silver', type: 'skill', collect_type: 'bracket', song: 'Meteo5cience', diff: 'D22' }, { name: '[BRACKET] Lv.5', description: 'Phalanx S22', tier: 'silver', type: 'skill', collect_type: 'bracket', song: 'Phalanx', diff: 'S22' }, { name: '[BRACKET] Lv.4', description: 'What Happened S21', tier: 'silver', type: 'skill', collect_type: 'bracket', song: 'What Happened', diff: 'S21' }, { name: '[BRACKET] Lv.3', description: 'Meteo5cience D21', tier: 'bronze', type: 'skill', collect_type: 'bracket', song: 'Meteo5cience', diff: 'D21' }, { name: '[BRACKET] Lv.2', description: 'Mad5cience S20', tier: 'bronze', type: 'skill', collect_type: 'bracket', song: 'Mad5cience', diff: 'S20' }, { name: '[BRACKET] Lv.1', description: 'Allegro furioso D20', tier: 'bronze', type: 'skill', collect_type: 'bracket', song: 'Allegro furioso', diff: 'D20' }, { name: '[HALF] EXPERT', description: 'All Half titles', tier: 'platinum', type: 'skill_collect', collect_type: 'half', count: 10 }, { name: '[HALF] Lv.10', description: 'Imprinting D24', tier: 'platinum', type: 'skill', collect_type: 'half', song: 'Imprinting', diff: 'D24' }, { name: '[HALF] Lv.9', description: 'Love is a Danger Zone 2 Try To B.P.M D23', tier: 'platinum', type: 'skill', collect_type: 'half', song: 'Love is a Danger Zone 2 Try To B.P.M', diff: 'D23' }, { name: '[HALF] Lv.8', description: 'Redline D22', tier: 'gold', type: 'skill', collect_type: 'half', song: 'Redline', diff: 'D22' }, { name: '[HALF] Lv.7', description: 'Witch Doctor #1 D21', tier: 'gold', type: 'skill', collect_type: 'half', song: 'Witch Doctor #1', diff: 'D21' }, { name: '[HALF] Lv.6', description: 'Utsushiyo No Kaze D20', tier: 'silver', type: 'skill', collect_type: 'half', song: 'Utsushiyo No Kaze', diff: 'D20' }, { name: '[HALF] Lv.5', description: 'Phantom D19', tier: 'silver', type: 'skill', collect_type: 'half', song: 'Phantom', diff: 'D19' }, { name: '[HALF] Lv.4', description: 'Super Fantasy D18', tier: 'silver', type: 'skill', collect_type: 'half', song: 'Super Fantasy', diff: 'D18' }, { name: '[HALF] Lv.3', description: 'Shub Niggurath D18', tier: 'bronze', type: 'skill', collect_type: 'half', song: 'Shub Niggurath', diff: 'D18' }, { name: '[HALF] Lv.2', description: 'Butterfly D17', tier: 'bronze', type: 'skill', collect_type: 'half', song: 'Butterfly', diff: 'D17' }, { name: '[HALF] Lv.1', description: 'Mopemope D17', tier: 'bronze', type: 'skill', collect_type: 'half', song: 'Mopemope', diff: 'D17' }, { name: '[GIMMICK] EXPERT', description: 'All Gimmick titles', tier: 'platinum', type: 'skill_collect', collect_type: 'gimmick', count: 10 }, { name: '[GIMMICK] Lv.10', description: 'Everybody Got 2 Know S21', tier: 'platinum', type: 'skill', collect_type: 'gimmick', song: 'Everybody Got 2 Know', diff: 'S21' }, { name: '[GIMMICK] Lv.9', description: '8 6 S20', tier: 'platinum', type: 'skill', collect_type: 'gimmick', song: '8 6', diff: 'S20' }, { name: '[GIMMICK] Lv.8', description: 'Twist of Fate (feat. Ruriling) S19', tier: 'gold', type: 'skill', collect_type: 'gimmick', song: 'Twist of Fate (feat. Ruriling)', diff: 'S19' }, { name: '[GIMMICK] Lv.7', description: 'Nakakapagpabagabag S19', tier: 'gold', type: 'skill', collect_type: 'gimmick', song: 'Nakakapagpabagabag', diff: 'S19' }, { name: '[GIMMICK] Lv.6', description: 'Miss S\' story S19', tier: 'silver', type: 'skill', collect_type: 'gimmick', song: 'Miss S\' story', diff: 'S19' }, { name: '[GIMMICK] Lv.5', description: 'Rock the house - SHORT CUT - S18', tier: 'silver', type: 'skill', collect_type: 'gimmick', song: 'Rock the house - SHORT CUT -', diff: 'S18' }, { name: '[GIMMICK] Lv.4', description: 'Come to Me S17', tier: 'silver', type: 'skill', collect_type: 'gimmick', song: 'Come to Me', diff: 'S17' }, { name: '[GIMMICK] Lv.3', description: 'Ugly Dee S17', tier: 'bronze', type: 'skill', collect_type: 'gimmick', song: 'Ugly Dee', diff: 'S17' }, { name: '[GIMMICK] Lv.2', description: '8 6 S16', tier: 'bronze', type: 'skill', collect_type: 'gimmick', song: '8 6', diff: 'S16' }, { name: '[GIMMICK] Lv.1', description: 'Yeo rae a S13', tier: 'bronze', type: 'skill', collect_type: 'gimmick', song: 'Yeo rae a', diff: 'S13' }, { name: '[DRILL] EXPERT', description: 'All Drill titles', tier: 'platinum', type: 'skill_collect', collect_type: 'drill', count: 10 }, { name: '[DRILL] Lv.10', description: 'WI-EX-DOC-VA D24', tier: 'platinum', type: 'skill', collect_type: 'drill', song: 'WI-EX-DOC-VA', diff: 'D24' }, { name: '[DRILL] Lv.9', description: 'Witch Doctor D23', tier: 'platinum', type: 'skill', collect_type: 'drill', song: 'Witch Doctor', diff: 'D23' }, { name: '[DRILL] Lv.8', description: 'Rock the house D22', tier: 'gold', type: 'skill', collect_type: 'drill', song: 'Rock the house', diff: 'D22' }, { name: '[DRILL] Lv.7', description: 'Sorceress Elise S21', tier: 'gold', type: 'skill', collect_type: 'drill', song: 'Sorceress Elise', diff: 'S21' }, { name: '[DRILL] Lv.6', description: 'Overblow S20', tier: 'silver', type: 'skill', collect_type: 'drill', song: 'Overblow', diff: 'S20' }, { name: '[DRILL] Lv.5', description: 'Vacuum S19', tier: 'silver', type: 'skill', collect_type: 'drill', song: 'Vacuum', diff: 'S19' }, { name: '[DRILL] Lv.4', description: 'Moonlight S18', tier: 'silver', type: 'skill', collect_type: 'drill', song: 'Moonlight', diff: 'S18' }, { name: '[DRILL] Lv.3', description: 'Gun Rock S17', tier: 'bronze', type: 'skill', collect_type: 'drill', song: 'Gun Rock', diff: 'S17' }, { name: '[DRILL] Lv.2', description: 'Vook S16', tier: 'bronze', type: 'skill', collect_type: 'drill', song: 'Vook', diff: 'S16' }, { name: '[DRILL] Lv.1', description: 'Hellfire S13', tier: 'bronze', type: 'skill', collect_type: 'drill', song: 'Hellfire', diff: 'S13' }, { name: '[RUN] EXPERT', description: 'All Run titles', tier: 'platinum', type: 'skill_collect', collect_type: 'run', count: 10 }, { name: '[RUN] Lv.10', description: 'Yog-Sothoth D24', tier: 'platinum', type: 'skill', collect_type: 'run', song: 'Yog-Sothoth', diff: 'D24' }, { name: '[RUN] Lv.9', description: 'Baroque Virus - FULL SONG - D23', tier: 'platinum', type: 'skill', collect_type: 'run', song: 'Baroque Virus - FULL SONG -', diff: 'D23' }, { name: '[RUN] Lv.8', description: 'Gargoyle - FULL SONG - D22', tier: 'gold', type: 'skill', collect_type: 'run', song: 'Gargoyle - FULL SONG -', diff: 'D22' }, { name: '[RUN] Lv.7', description: 'Sarabande D21', tier: 'gold', type: 'skill', collect_type: 'run', song: 'Sarabande', diff: 'D21' }, { name: '[RUN] Lv.6', description: 'Bee D20', tier: 'silver', type: 'skill', collect_type: 'run', song: 'Bee', diff: 'D20' }, { name: '[RUN] Lv.5', description: 'Napalm S19', tier: 'silver', type: 'skill', collect_type: 'run', song: 'Napalm', diff: 'S19' }, { name: '[RUN] Lv.4', description: 'Gothique Resonance S18', tier: 'silver', type: 'skill', collect_type: 'run', song: 'Gothique Resonance', diff: 'S18' }, { name: '[RUN] Lv.3', description: 'Pavane S17', tier: 'bronze', type: 'skill', collect_type: 'run', song: 'Pavane', diff: 'S17' }, { name: '[RUN] Lv.2', description: 'Super Fantasy S16', tier: 'bronze', type: 'skill', collect_type: 'run', song: 'Super Fantasy', diff: 'S16' }, { name: '[RUN] Lv.1', description: 'Switronic S13', tier: 'bronze', type: 'skill', collect_type: 'run', song: 'Switronic', diff: 'S13' }, { name: '[TWIST] EXPERT', description: 'All Twist titles', tier: 'platinum', type: 'skill_collect', collect_type: 'twist', count: 10 }, { name: '[TWIST] Lv.10', description: 'Bee D24', tier: 'platinum', type: 'skill', collect_type: 'twist', song: 'Bee', diff: 'D24' }, { name: '[TWIST] Lv.9', description: 'Love Is A Danger Zone(Cranky Mix) D23', tier: 'platinum', type: 'skill', collect_type: 'twist', song: 'Love Is A Danger Zone(Cranky Mix)', diff: 'D23' }, { name: '[TWIST] Lv.8', description: 'Super Fantasy D22', tier: 'gold', type: 'skill', collect_type: 'twist', song: 'Super Fantasy', diff: 'D22' }, { name: '[TWIST] Lv.7', description: 'Love is a Danger Zone D21', tier: 'gold', type: 'skill', collect_type: 'twist', song: 'Love is a Danger Zone', diff: 'D21' }, { name: '[TWIST] Lv.6', description: 'Witch Doctor #1 D20', tier: 'silver', type: 'skill', collect_type: 'twist', song: 'Witch Doctor #1', diff: 'D20' }, { name: '[TWIST] Lv.5', description: 'U GOT 2 KNOW S19', tier: 'silver', type: 'skill', collect_type: 'twist', song: 'U GOT 2 KNOW', diff: 'S19' }, { name: '[TWIST] Lv.4', description: 'Solitary 2 S18', tier: 'silver', type: 'skill', collect_type: 'twist', song: 'Solitary 2', diff: 'S18' }, { name: '[TWIST] Lv.3', description: 'U Got Me Rocking S17', tier: 'bronze', type: 'skill', collect_type: 'twist', song: 'U Got Me Rocking', diff: 'S17' }, { name: '[TWIST] Lv.2', description: 'Street show down S16', tier: 'bronze', type: 'skill', collect_type: 'twist', song: 'Street show down', diff: 'S16' }, { name: '[TWIST] Lv.1', description: 'Scorpion King S13', tier: 'bronze', type: 'skill', collect_type: 'twist', song: 'Scorpion King', diff: 'S13' }, { name: '[XX] Double', description: '1949 D28', tier: 'platinum', type: 'boss', song: '1949', diff: 'D28' }, { name: '[XX] Single', description: 'ERRORCODE: 0 S25', tier: 'gold', type: 'boss', song: 'ERRORCODE: 0', diff: 'S25' }, { name: '[PRIME2] Double', description: 'Shub Sothoth D27', tier: 'platinum', type: 'boss', song: 'Shub Sothoth', diff: 'D27' }, { name: '[PRIME2] Single', description: 'Shub Sothoth S25', tier: 'gold', type: 'boss', song: 'Shub Sothoth', diff: 'S25' }, { name: '[PRIME] Double', description: 'Paradoxx D28', tier: 'platinum', type: 'boss', song: 'Paradoxx', diff: 'D28' }, { name: '[PRIME] Single', description: 'Paradoxx S26', tier: 'gold', type: 'boss', song: 'Paradoxx', diff: 'S26' }, { name: '[FIESTA2] Double', description: 'Ignis Fatuus D25', tier: 'gold', type: 'boss', song: 'Ignis Fatuus', diff: 'D25' }, { name: '[FIESTA2] Single', description: 'Ignis Fatuus S22', tier: 'silver', type: 'boss', song: 'Ignis Fatuus', diff: 'S22' }, { name: '[FIESTA EX] Double', description: 'Vacuum Cleaner D26', tier: 'gold', type: 'boss', song: 'Vacuum Cleaner', diff: 'D26' }, { name: '[FIESTA EX] Single', description: 'Vacuum Cleaner S25', tier: 'gold', type: 'boss', song: 'Vacuum Cleaner', diff: 'S25' }, { name: '[FIESTA] Double', description: 'Vacuum D25', tier: 'gold', type: 'boss', song: 'Vacuum', diff: 'D25' }, { name: '[FIESTA] Single', description: 'Vacuum S23', tier: 'silver', type: 'boss', song: 'Vacuum', diff: 'S23' }, { name: '[NXA] Double', description: 'Final Audition Ep. 2-X D24', tier: 'gold', type: 'boss', song: 'Final Audition Ep. 2-X', diff: 'D24' }, { name: '[NXA] Single', description: 'Final Audition Ep. 2-X S23', tier: 'silver', type: 'boss', song: 'Final Audition Ep. 2-X', diff: 'S23' }, { name: '[NX2] Double', description: 'Banya-P Guitar Remix D24', tier: 'gold', type: 'boss', song: 'Banya-P Guitar Remix', diff: 'D24' }, { name: '[NX2] Single', description: 'Banya-P Guitar Remix S22', tier: 'silver', type: 'boss', song: 'Banya-P Guitar Remix', diff: 'S22' }, { name: '[NX] Double', description: 'Bemera D26', tier: 'gold', type: 'boss', song: 'Bemera', diff: 'D26' }, { name: '[NX] Single', description: 'Bemera S24', tier: 'silver', type: 'boss', song: 'Bemera', diff: 'S24' }, { name: '[ZERO] Double', description: 'Love is a Danger Zone pt. 2 D24', tier: 'silver', type: 'boss', song: 'Love is a Danger Zone pt. 2', diff: 'D24' }, { name: '[ZERO] Single', description: 'Love is a Danger Zone pt. 2 S22', tier: 'silver', type: 'boss', song: 'Love is a Danger Zone pt. 2', diff: 'S22' }, { name: '[EXCEED2] Double', description: 'Canon D D23', tier: 'silver', type: 'boss', song: 'Canon D', diff: 'D23' }, { name: '[EXCEED2] Single', description: 'Canon D S20', tier: 'silver', type: 'boss', song: 'Canon D', diff: 'S20' }, { name: '[EXCEED] Double', description: 'Dignity D24', tier: 'gold', type: 'boss', song: 'Dignity', diff: 'D24' }, { name: '[EXCEED] Single', description: 'Dignity S21', tier: 'silver', type: 'boss', song: 'Dignity', diff: 'S21' }, { name: '[THE PREX3]', description: 'Bee S17', tier: 'bronze', type: 'boss', song: 'Bee', diff: 'S17' }, { name: '[THE REBIRTH]', description: 'Love is a Danger Zone S17', tier: 'bronze', type: 'boss', song: 'Love is a Danger Zone', diff: 'S17' }, { name: '[EXTRA]', description: 'Radetzky Can Can D18', tier: 'bronze', type: 'boss', song: 'Radetzky Can Can', diff: 'D18' }, { name: '[Perfect Collection]', description: 'Slam S18', tier: 'bronze', type: 'boss', song: 'Slam', diff: 'S18' }, { name: '[The O.B.G SE]', description: 'Mr. Larpus S15', tier: 'bronze', type: 'boss', song: 'Mr. Larpus', diff: 'S15' }, { name: '[The O.B.G]', description: 'Turkey March S12', tier: 'bronze', type: 'boss', song: 'Turkey March', diff: 'S12' }, { name: '[The 2nd]', description: 'Extravaganza S11', tier: 'bronze', type: 'boss', song: 'Extravaganza', diff: 'S11' }, { name: '[The 1st]', description: 'Another Truth S6', tier: 'bronze', type: 'boss', song: 'Another Truth', diff: 'S6' }, ]; fetchAllScores(); function fetchAllScores() { let pages = parseInt($('.board_paging button:last').attr('onclick').split('=')[2].split('\'')[0]); $('head').append( $('<link rel="stylesheet" type="text/css" />').attr('href', 'https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css') ); $('#contents').css('background', '#1a1b1e'); $('#header').remove(); $('.pageWrap').html(''); showProgress(pages); let scores = []; let current_url = window.location.href; if(window.location.href.indexOf('?') == -1) { current_url = current_url + '?'; } let mark = 1; for (var i = 1; i <= pages; i++) { fetchScores(current_url + '&&page=' + i) .then((score) => { console.log(mark + '/' + pages); $('#current_progress_page').html(mark); $('#fetch_progress_bar').css('width', ((mark/pages)*100) + '%'); for (var j = score.length - 1; j >= 0; j--) { scores.push(score[j]) } if(mark == pages) { $('#progress_pane').hide(); run(scores) } mark++; }); } } function run(scores) { scores.sort(function(a, b){ var a1 = a.rating, b1 = b.rating; if(a1 == b1) { var a2 = a.score, b2 = b.score; if(a2 == b2) { return 0; } return a2 > b2 ? -1 : 1; } return a1 > b1 ? -1 : 1; }); createAnalytic(scores); } function showProgress(page) { $('.pageWrap').prepend('<div id="progress_pane"><h1 style="color:white">Fetching scores:</h1><div id="fetch_progress" class="progress" style="height: 30px;"></div>'); $('#fetch_progress').append('<div id="fetch_progress_bar" class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" ' + 'aria-valuenow="0" aria-valuemin="0" aria-valuemax="' + page + '" style="width: 0%">'+ '<div style="position: absolute; text-align: center; line-height: 20px; overflow: hidden; color: black; right: 0; left: 0; top: 0;">'+ '<span style="font-size: 20px;"><span id="current_progress_page">0</span>/' + page + '</span></div></div>'); } function createAnalytic(scores) { console.log("Run Analytics"); $('.pageWrap').prepend('<div id="table_pane" class="row"><div id="table_pane_body" class="col-md-6"><table id="main_table" class="table table-dark table-striped"></table></div></div>'); $('#main_table').append('<thead class="thead-dark"><tr><th width="30">#</th><th>Song</th><th width="50">Diff</th><th width="100">Score</th><th width="50">Rank</th><th width="70">Rating</th></tr></thead>'); //$('#main_table').css(''); $('#main_table').append('<tbody id="main_table_body"><tbody>'); for (var i = 0; i < scores.length; i++) { switch(scores[i].level_type) { case 'single': var level_style = 'style="font-weight: bolder; color: orangered;"'; break; case 'double': level_style = 'style="font-weight: bolder; color: lawngreen;"'; break; case 'coop': level_style = 'style="font-weight: bolder; color: yellow;"'; break; default: level_style = ''; } switch(scores[i].score_rate) { case 'sss_p': case 'sss': var score_style = 'style="font-weight: bolder; color: cyan;"'; break; case 'ss_p': case 'ss': case 's_p': case 's': score_style = 'style="font-weight: bolder; color: gold;"'; break; case 'aaa_p': case 'aaa': score_style = 'style="font-weight: bolder; color: silver;"'; break; case 'aa_p': case 'aa': case 'a_p': case 'a': score_style = 'style="font-weight: bolder; color: orangered;"'; break; default: score_style = 'style="font-weight: bolder; color: greenyellow;"'; } $('#main_table_body').append('<tr>' + '<td>' + (i+1) + '</td>' + '<td>' + scores[i].name + '</td>' + '<td ' + level_style + '>' + scores[i].level_text + '</td>' + '<td>' + scores[i].score_text + '</td>' + '<td ' + score_style + '>' + scores[i].score_rate_text + '</td>' + '<td>' + scores[i].rating + '</td>'); } $('#table_pane').append('<div id="table_pane_progress" class="col-md-6"><table id="progress_table" class="table table-dark table-striped"></table></div>'); $('#progress_table').append('<thead class="thead-dark"><tr><th width="180">Title</th><th width="180">Description</th><th>Progress</th></tr></thead>'); $('#progress_table').append('<tbody id="progress_table_body"><tbody>'); var level_progress = []; var level_progress_list = []; var score_progress = scores; score_progress.reduce(function(res, value) { if (!res[value.level]) { res[value.level] = { diff: value.level, rating: 0 }; level_progress_list.push(res[value.level]) } res[value.level].rating += parseInt(value.rating); return res; }, {}); for (let i = 0; i < level_progress_list.length; i++) { level_progress[level_progress_list[i].diff] = level_progress_list[i].rating; } for (let i = 0; i < expert_titles.length; i++) { switch(expert_titles[i].tier) { case 'platinum': var title_style = 'style="font-weight: bolder; color: cyan;"'; break; case 'gold': title_style = 'style="font-weight: bolder; color: gold;"'; break; case 'silver': title_style = 'style="font-weight: bolder; color: silver;"'; break; case 'bronze': title_style = 'style="font-weight: bolder; color: orangered;"'; break; default: title_style = ''; } switch(expert_titles[i].type) { case 'rating': var current_level = expert_titles[i].level; var current_rating = level_progress[current_level] ? level_progress[current_level] : 0; var max_rating = parseInt(expert_titles[i].rating); var progress = Math.round((current_rating / max_rating) * 100); if(progress >= 100) { var bar_bg = 'bg-success'; } else { bar_bg = 'bg-danger'; } $('#progress_table_body').append('<tr>' + '<td ' + title_style + '>' + expert_titles[i].name + '</td>' + '<td>' + expert_titles[i].description + '</td>' + '<td><div class="progress" style="position: relative;">' + '<div class="progress-bar ' + bar_bg + ' progress-bar-striped progress-bar-animated" role="progressbar"' + 'aria-valuenow="' + current_rating + '" aria-valuemin="0" aria-valuemax="' + max_rating + '" style="width: ' + progress + '%"></div>' + '<div style="position: absolute; text-align: center; line-height: 20px; overflow: hidden; color: black; right: 0; left: 0; top: 0;">' + current_rating.toLocaleString() + '/' + max_rating.toLocaleString() + '</div>' + '</div></td></tr>'); break; case 'skill_collect': $('#progress_table_body').append('<tr>' + '<td ' + title_style + '>' + expert_titles[i].name + '</td>' + '<td>' + expert_titles[i].description + '</td>' + '<td><div class="progress" style="position: relative;">' + '<div id="progress_bar_' + expert_titles[i].collect_type + '" class="progress-bar bg-danger progress-bar-striped progress-bar-animated" role="progressbar"' + 'aria-valuenow="0" aria-valuemin="0" aria-valuemax="' + expert_titles[i].count + '" style="width: 0%"></div>' + '<div id="progress_bar_' + expert_titles[i].collect_type + '_text" style="position: absolute; text-align: center; line-height: 20px; overflow: hidden; color: black; right: 0; left: 0; top: 0;">0/' + expert_titles[i].count + '</div>' + '</div></td><tr><input type="hidden" id="skill_count_' + expert_titles[i].collect_type + '" value="0">'); break; case 'skill': var current_song = scores.find(o => o.name === expert_titles[i].song && o.level_text === expert_titles[i].diff); if(current_song == undefined) { var current_song_score = 0; var score_text = 0; } else { current_song_score = current_song.score; score_text = current_song.score_text; } progress = Math.round(parseInt(current_song_score) / 1000000 * 100); if(current_song_score > 990000) { bar_bg = 'bg-success'; var skill_count = parseInt($('#skill_count_skill').val()) + 1; $('#skill_count_skill').val(skill_count); $('#progress_bar_skill').css('width', skill_count/60*100 + '%'); $('#progress_bar_skill_text').html(skill_count + '/60'); if(skill_count == 60) { $('#progress_bar_skill').removeClass('bg-danger'); $('#progress_bar_skill').addClass('bg-success'); } var sub_skill_count = parseInt($('#skill_count_' + expert_titles[i].collect_type).val()) + 1; $('#skill_count_' + expert_titles[i].collect_type).val(sub_skill_count); $('#progress_bar_' + expert_titles[i].collect_type).css('width', sub_skill_count/10*100 + '%'); $('#progress_bar_' + expert_titles[i].collect_type + '_text').html(sub_skill_count + '/10'); if(sub_skill_count == 10) { $('#progress_bar_' + expert_titles[i].collect_type).removeClass('bg-danger'); $('#progress_bar_' + expert_titles[i].collect_type).addClass('bg-success'); } } else { bar_bg = 'bg-danger'; } $('#progress_table_body').append('<tr>' + '<td ' + title_style + '>' + expert_titles[i].name + '</td>' + '<td>' + expert_titles[i].description + '</td>' + '<td><div class="progress" style="position: relative;">' + '<div class="progress-bar ' + bar_bg + ' progress-bar-striped progress-bar-animated" role="progressbar"' + 'aria-valuenow="' + current_song_score + '" aria-valuemin="0" aria-valuemax="1000000" style="width: ' + progress + '%"></div>' + '<div style="position: absolute; text-align: center; line-height: 20px; overflow: hidden; color: black; right: 0; left: 0; top: 0;">' + score_text + '/1,000,000</div>' + '</div></td>'); break; case 'boss': current_song = scores.find(o => o.name === expert_titles[i].song && o.level_text === expert_titles[i].diff); if(current_song == undefined) { current_song_score = 0; score_text = 0; bar_bg = 'bg-danger'; } else { current_song_score = current_song.score; score_text = current_song.score_text; bar_bg = 'bg-success'; } progress = Math.round(parseInt(current_song_score) / 1000000 * 100); $('#progress_table_body').append('<tr>' + '<td ' + title_style + '>' + expert_titles[i].name + '</td>' + '<td>' + expert_titles[i].description + '</td>' + '<td><div class="progress" style="position: relative;">' + '<div class="progress-bar ' + bar_bg + ' progress-bar-striped progress-bar-animated" role="progressbar"' + 'aria-valuenow="' + current_song_score + '" aria-valuemin="0" aria-valuemax="1000000" style="width: ' + progress + '%"></div>' + '<div style="position: absolute; text-align: center; line-height: 20px; overflow: hidden; color: black; right: 0; left: 0; top: 0;">' + score_text + '/1,000,000</div>' + '</div></td>'); break; default: continue; } } } async function fetchScores(url) { var dom = await fetchPage(url); const rows = dom.querySelectorAll('.my_best_scoreList .in'); var songs = []; for (var i = 0; i < rows.length; i++) { var song = $(dom.querySelectorAll('.my_best_scoreList .in .song_name p')[i]).html(); var score = $(dom.querySelectorAll('.my_best_scoreList .in .num')[i]).html(); var score_rate = $(dom.querySelectorAll('.my_best_scoreList .in .etc_con .img:not(.st1) img')[i]).attr('src'); score_rate = score_rate.split('/grade/')[1].split('.png')[0]; var score_plate = $(dom.querySelectorAll('.my_best_scoreList .in .etc_con .st1 img')[i]).attr('src'); score_plate = score_plate.split('/plate/')[1].split('.png')[0]; var level_type_data = $(dom.querySelectorAll('.my_best_scoreList .in .stepBall_in')[i]).attr('style').split('full/')[1].split('_bg')[0]; switch(level_type_data) { case 's': var level_type = 'single'; break; case 'd': level_type = 'double'; break; default: level_type = 'coop'; } var level = ''; var levels = $(dom.querySelectorAll('.my_best_scoreList .in .stepBall_in')[0]).find('.imG'); switch(level_type_data) { case 's': case 'd': for (var j = 0; j < levels.length; j++) { url = $(dom.querySelectorAll('.my_best_scoreList .in .stepBall_in')[i]).find('.imG img').eq(j).attr('src'); level += url.split('num_')[1].split('.png')[0]; } var rating = calculateRating(level, rating_text[score_rate], 'normal'); var level_text = level_type_data + level; level_text = level_text.toUpperCase(); break; default: url = $(dom.querySelectorAll('.my_best_scoreList .in .stepBall_in')[i]).find('.imG img').eq(1).attr('src'); level = url.split('num_')[1].split('.png')[0]; rating = calculateRating(null, rating_text[score_rate], 'coop'); level_text = 'Cx' + level; } song = { name: song, level_text: level_text, score_text: score, score_rate_text: rating_text[score_rate], rating: rating, score_plate_text: plate_text[score_plate], level_type: level_type, level: level, score: score.replaceAll(',',''), score_rate: score_rate, score_plate: score_plate, } songs.push(song); } songs.sort(function(a, b){ var a1 = a.rating, b1 = b.rating; if(a1 == b1) { var a2 = a.score, b2 = b.score; if(a2 == b2) { return 0; } return a2 > b2 ? -1 : 1; } return a1 > b1 ? -1 : 1; }); return songs; } async function fetchPage(url) { const response = await fetch(url, {redirect: 'error'}); const html = await response.text(); const parser = new DOMParser(); return parser.parseFromString(html, 'text/html'); } function calculateRating(level, rate, type) { var rate_index = { 'A':0.9, 'A+':0.95, 'AA':1, 'AA+':1.05, 'AAA':1.1, 'AAA+':1.15, 'S':1.2, 'S+':1.26, 'SS':1.32, 'SS+':1.38, 'SSS':1.44, 'SSS+':1.5, }; if(type == 'normal') { var level_base = { '10':100, '11':110, '12':130, '13':160, '14':200, '15':250, '16':310, '17':380, '18':460, '19':550, '20':650, '21':760, '22':880, '23':1010, '24':1150, '25':1300, '26':1460, '27':1630, '28':1810, }; if(level < 10) return 0; var rating = parseInt(level_base[level]) * parseFloat(rate_index[rate]); } else if(type == 'coop') { level_base = 2000; rating = parseInt(level_base) * parseFloat(rate_index[rate]); } return Math.round(rating.toFixed(2)); }