diff options
Diffstat (limited to 'ffxiv')
264 files changed, 6272 insertions, 0 deletions
diff --git a/ffxiv/bg-tile.png b/ffxiv/bg-tile.png Binary files differnew file mode 100644 index 0000000..cd1f769 --- /dev/null +++ b/ffxiv/bg-tile.png diff --git a/ffxiv/character-frame.png b/ffxiv/character-frame.png Binary files differnew file mode 100644 index 0000000..5512a73 --- /dev/null +++ b/ffxiv/character-frame.png diff --git a/ffxiv/character-frame1.png b/ffxiv/character-frame1.png Binary files differnew file mode 100644 index 0000000..e6a6b4d --- /dev/null +++ b/ffxiv/character-frame1.png diff --git a/ffxiv/data/gc_adder.csv b/ffxiv/data/gc_adder.csv new file mode 100644 index 0000000..54b713a --- /dev/null +++ b/ffxiv/data/gc_adder.csv @@ -0,0 +1,23 @@ +key,0,1,2,3,4,5,6,7,8,9 +#,Singular,Adjective,Plural,PossessivePronoun,StartsWithVowel,,Pronoun,Article,Name{Rank}, +int32,str,sbyte,str,sbyte,sbyte,sbyte,sbyte,sbyte,str,str +0,"",0,"",0,0,0,0,0,"","" +1,"Serpent Private Third Class",0,"Serpent Privates Third Class",0,0,0,0,0,"private","" +2,"Serpent Private Second Class",0,"Serpent Privates Second Class",0,0,0,0,0,"private","" +3,"Serpent Private First Class",0,"Serpent Privates First Class",0,0,0,0,0,"private","" +4,"Serpent Corporal",0,"Serpent Corporals",0,0,0,0,0,"corporal","" +5,"Serpent Sergeant Third Class",0,"Serpent Sergeants Third Class",0,0,0,0,0,"sergeant","" +6,"Serpent Sergeant Second Class",0,"Serpent Sergeants Second Class",0,0,0,0,0,"sergeant","" +7,"Serpent Sergeant First Class",0,"Serpent Sergeants First Class",0,0,0,0,0,"sergeant","" +8,"Chief Serpent Sergeant",0,"Chief Serpent Sergeants",0,0,0,0,0,"sergeant","" +9,"Second Serpent Lieutenant",0,"Second Serpent Lieutenants",0,0,0,0,0,"lieutenant","" +10,"First Serpent Lieutenant",0,"First Serpent Lieutenants",0,0,0,0,0,"lieutenant","" +11,"Serpent Captain",0,"Serpent Captains",0,0,0,0,0,"captain","" +12,"Second Serpent Commander",0,"Second Serpent Commanders",0,0,0,0,0,"commander","" +13,"First Serpent Commander",0,"First Serpent Commanders",0,0,0,0,0,"commander","" +14,"High Serpent Commander",0,"High Serpent Commanders",0,0,0,0,0,"commander","" +15,"Rear Serpent Marshal",0,"Rear Serpent Marshals",0,0,0,0,0,"rear marshal","" +16,"Vice Serpent Marshal",0,"Vice Serpent Marshals",0,0,0,0,0,"vice marshal","" +17,"Serpent Marshal",0,"Serpent Marshals",0,0,0,0,0,"marshal","" +18,"Grand Serpent Marshal",0,"Grand Serpent Marshals",0,0,0,0,0,"grand marshal","" +19,"Serpent Champion",0,"Serpent Champions",0,0,0,0,0,"champion","" diff --git a/ffxiv/data/gc_flames.csv b/ffxiv/data/gc_flames.csv new file mode 100644 index 0000000..3417b9d --- /dev/null +++ b/ffxiv/data/gc_flames.csv @@ -0,0 +1,23 @@ +key,0,1,2,3,4,5,6,7,8,9 +#,Singular,Adjective,Plural,PossessivePronoun,StartsWithVowel,,Pronoun,Article,Name{Rank}, +int32,str,sbyte,str,sbyte,sbyte,sbyte,sbyte,sbyte,str,str +0,"",0,"",0,0,0,0,0,"","" +1,"Flame Private Third Class",0,"Flame Privates Third Class",0,0,0,0,0,"private","" +2,"Flame Private Second Class",0,"Flame Privates Second Class",0,0,0,0,0,"private","" +3,"Flame Private First Class",0,"Flame Privates First Class",0,0,0,0,0,"private","" +4,"Flame Corporal",0,"Flame Corporals",0,0,0,0,0,"corporal","" +5,"Flame Sergeant Third Class",0,"Flame Sergeants Third Class",0,0,0,0,0,"sergeant","" +6,"Flame Sergeant Second Class",0,"Flame Sergeants Second Class",0,0,0,0,0,"sergeant","" +7,"Flame Sergeant First Class",0,"Flame Sergeants First Class",0,0,0,0,0,"sergeant","" +8,"Chief Flame Sergeant",0,"Chief Flame Sergeants",0,0,0,0,0,"sergeant","" +9,"Second Flame Lieutenant",0,"Second Flame Lieutenants",0,0,0,0,0,"lieutenant","" +10,"First Flame Lieutenant",0,"First Flame Lieutenants",0,0,0,0,0,"lieutenant","" +11,"Flame Captain",0,"Flame Captains",0,0,0,0,0,"captain","" +12,"Second Flame Commander",0,"Second Flame Commanders",0,0,0,0,0,"commander","" +13,"First Flame Commander",0,"First Flame Commanders",0,0,0,0,0,"commander","" +14,"High Flame Commander",0,"High Flame Commanders",0,0,0,0,0,"commander","" +15,"Rear Flame Marshal",0,"Rear Flame Marshals",0,0,0,0,0,"rear marshal","" +16,"Vice Flame Marshal",0,"Vice Flame Marshals",0,0,0,0,0,"vice marshal","" +17,"Flame Marshal",0,"Flame Marshals",0,0,0,0,0,"marshal","" +18,"Grand Flame Marshal",0,"Grand Flame Marshals",0,0,0,0,0,"grand marshal","" +19,"Flame Champion",0,"Flame Champions",0,0,0,0,0,"champion",""
\ No newline at end of file diff --git a/ffxiv/data/gc_maelstrom.csv b/ffxiv/data/gc_maelstrom.csv new file mode 100644 index 0000000..52e0e89 --- /dev/null +++ b/ffxiv/data/gc_maelstrom.csv @@ -0,0 +1,23 @@ +key,0,1,2,3,4,5,6,7,8,9 +#,Singular,Adjective,Plural,PossessivePronoun,StartsWithVowel,,Pronoun,Article,Name{Rank}, +int32,str,sbyte,str,sbyte,sbyte,sbyte,sbyte,sbyte,str,str +0,"",0,"",0,0,0,0,0,"","" +1,"Storm Private Third Class",0,"Storm Privates Third Class",0,0,0,0,0,"private","" +2,"Storm Private Second Class",0,"Storm Privates Second Class",0,0,0,0,0,"private","" +3,"Storm Private First Class",0,"Storm Privates First Class",0,0,0,0,0,"private","" +4,"Storm Corporal",0,"Storm Corporals",0,0,0,0,0,"corporal","" +5,"Storm Sergeant Third Class",0,"Storm Sergeants Third Class",0,0,0,0,0,"sergeant","" +6,"Storm Sergeant Second Class",0,"Storm Sergeants Second Class",0,0,0,0,0,"sergeant","" +7,"Storm Sergeant First Class",0,"Storm Sergeants First Class",0,0,0,0,0,"sergeant","" +8,"Chief Storm Sergeant",0,"Chief Storm Sergeants",0,0,0,0,0,"sergeant","" +9,"Second Storm Lieutenant",0,"Second Storm Lieutenants",0,0,0,0,0,"lieutenant","" +10,"First Storm Lieutenant",0,"First Storm Lieutenants",0,0,0,0,0,"lieutenant","" +11,"Storm Captain",0,"Storm Captains",0,0,0,0,0,"captain","" +12,"Second Storm Commander",0,"Second Storm Commanders",0,0,0,0,0,"commander","" +13,"First Storm Commander",0,"First Storm Commanders",0,0,0,0,0,"commander","" +14,"High Storm Commander",0,"High Storm Commanders",0,0,0,0,0,"commander","" +15,"Rear Storm Marshal",0,"Rear Storm Marshals",0,0,0,0,0,"rear marshal","" +16,"Vice Storm Marshal",0,"Vice Storm Marshals",0,0,0,0,0,"vice marshal","" +17,"Storm Marshal",0,"Storm Marshals",0,0,0,0,0,"marshal","" +18,"Grand Storm Marshal",0,"Grand Storm Marshals",0,0,0,0,0,"grand marshal","" +19,"Storm Champion",0,"Storm Champions",0,0,0,0,0,"champion","" diff --git a/ffxiv/data/grandcompanies.csv b/ffxiv/data/grandcompanies.csv new file mode 100644 index 0000000..b787cd3 --- /dev/null +++ b/ffxiv/data/grandcompanies.csv @@ -0,0 +1,7 @@ +key,0,1,2,3,4,5,6,7,8,9 +#,Name,,,,,,,,, +int32,str,sbyte,str,sbyte,sbyte,sbyte,sbyte,sbyte,str,sbyte +0,"None",0,"",0,0,0,0,0,"",127 +1,"Maelstrom",0,"",0,0,0,0,0,"",8 +2,"Order of the Twin Adder",0,"",0,0,0,0,0,"",9 +3,"Immortal Flames",0,"",0,0,0,0,0,"",10 diff --git a/ffxiv/data/races.csv b/ffxiv/data/races.csv new file mode 100644 index 0000000..a25472b --- /dev/null +++ b/ffxiv/data/races.csv @@ -0,0 +1,9 @@ +ID,Icon,Name,Url +1,,Hyur,/Race/1 +2,,Elezen,/Race/2 +3,,Lalafell,/Race/3 +4,,Miqo'te,/Race/4 +5,,Roegadyn,/Race/5 +6,,Au Ra,/Race/6 +7,,Hrothgar,/Race/7 +8,,Viera,/Race/8
\ No newline at end of file diff --git a/ffxiv/data/titles.csv b/ffxiv/data/titles.csv new file mode 100644 index 0000000..183900a --- /dev/null +++ b/ffxiv/data/titles.csv @@ -0,0 +1,598 @@ +key,0,1,2,3 +#,Masculine,Feminine,IsPrefix,Order +int32,str,str,bit&01,uint16 +0,"","",False,0 +1,"The Insatiable","The Insatiable",False,1 +2,"The True","The True",False,2 +3,"Coeurlfist","Coeurlfist",True,3 +4,"Ironeater","Ironeater",True,4 +5,"Of the Vengeful Lance","Of the Vengeful Lance",False,5 +6,"The Godsbow","The Godsbow",False,6 +7,"The White","The White",False,7 +8,"Starcaller","Starcaller",True,8 +9,"The Exterminator","The Exterminator",False,50 +10,"Notorious Monster Hunter","Notorious Monster Hunter",True,60 +11,"Honest Gillionaire","Honest Gillionaire",True,80 +12,"Ruthless Gillionaire","Ruthless Gillionaire",True,80 +13,"Warmonger","Warmonger",True,100 +14,"Archmage","Archmage",True,101 +15,"Builder of the Realm","Builder of the Realm",False,102 +16,"Provider of the Realm","Provider of the Realm",False,103 +17,"Of the Golden Saw","Of the Golden Saw",False,150 +18,"Of the Golden Anvil","Of the Golden Anvil",False,151 +19,"Of the Golden Hammer","Of the Golden Hammer",False,152 +20,"Of the Golden Leaf","Of the Golden Leaf",False,153 +21,"Of the Golden Hide","Of the Golden Hide",False,154 +22,"Of the Golden Needle","Of the Golden Needle",False,155 +23,"Of the Golden Lead","Of the Golden Lead",False,156 +24,"Of the Golden Ladle","Of the Golden Ladle",False,157 +25,"Meadowbreaker","Meadowbreaker",True,200 +26,"Forestbreaker","Forestbreaker",True,201 +27,"Desertbreaker","Desertbreaker",True,202 +28,"Of the Meadow Mines","Of the Meadow Mines",False,203 +29,"Of the Forest Mines","Of the Forest Mines",False,204 +30,"Of the Desert Mines","Of the Desert Mines",False,205 +31,"Meadowreaper","Meadowreaper",True,206 +32,"Forestreaper","Forestreaper",True,207 +33,"Desertreaper","Desertreaper",True,208 +34,"Of the Meadow Grasses","Of the Meadow Grasses",False,209 +35,"Of the Forest Grasses","Of the Forest Grasses",False,210 +36,"Of the Desert Grasses","Of the Desert Grasses",False,211 +37,"Meadowcaster","Meadowcaster",True,212 +38,"Forestcaster","Forestcaster",True,213 +39,"Desertcaster","Desertcaster",True,214 +40,"Of the Meadow Pools","Of the Meadow Pools",False,215 +41,"Of the Forest Pools","Of the Forest Pools",False,216 +42,"Of the Desert Pools","Of the Desert Pools",False,217 +43,"Carrier of the Cauldron","Carrier of the Cauldron",False,250 +44,"The Assimilator","The Assimilator",False,251 +45,"Seeker of Blood","Seeker of Blood",False,300 +46,"Seeker of Truth","Seeker of Truth",False,301 +47,"Seeker of Skill","Seeker of Skill",False,302 +48,"Seeker of Bounty","Seeker of Bounty",False,303 +49,"Sidestepper","Sidestepper",True,350 +50,"Lord Protector","Lady Protector",True,351 +51,"Lord Creator","Lady Creator",True,352 +52,"Peacemaker","Peacemaker",True,353 +53,"The Last Resort","The Last Resort",False,354 +54,"The Sword of La Noscea","The Sword of La Noscea",False,355 +55,"The Sword of the Shroud","The Sword of the Shroud",False,356 +56,"The Sword of Thanalan","The Sword of Thanalan",False,357 +57,"The Sword of Eorzea","The Sword of Eorzea",False,358 +58,"The Shield of La Noscea","The Shield of La Noscea",False,359 +59,"The Shield of the Shroud","The Shield of the Shroud",False,360 +60,"The Shield of Thanalan","The Shield of Thanalan",False,361 +61,"The Shield of Eorzea","The Shield of Eorzea",False,362 +62,"Brother of the Broken Blade","Sister of the Broken Blade",True,363 +63,"The Warden's Wall","The Warden's Wall",False,364 +64,"Bearer of the Horn","Bearer of the Horn",True,365 +65,"The Uncommitted","The Uncommitted",False,366 +66,"The Professional","The Professional",False,400 +67,"Inquisitor","Inquisitor",True,450 +68,"Divine Crusher","Divine Crusher",True,451 +69,"Stonesplitter","Stonesplitter",True,452 +70,"A Kobold's Worst Nightmare","A Kobold's Worst Nightmare",False,453 +71,"An Ixal's Worst Nightmare","An Ixal's Worst Nightmare",False,454 +72,"An Amalj'aa's Worst Nightmare","An Amalj'aa's Worst Nightmare",False,455 +73,"The Guardian of Aleport","The Guardian of Aleport",False,456 +74,"The Guardian of Hyrstmill","The Guardian of Hyrstmill",False,457 +75,"The Guardian of the Golden Bazaar","The Guardian of the Golden Bazaar",False,458 +76,"The Wind of Aleport","The Wind of Aleport",False,459 +77,"The Wind of Hyrstmill","The Wind of Hyrstmill",False,460 +78,"The Wind of the Golden Bazaar","The Wind of the Golden Bazaar",False,461 +79,"The Hand of Aleport","The Hand of Aleport",False,462 +80,"The Hand of Hyrstmill","The Hand of Hyrstmill",False,463 +81,"The Hand of the Golden Bazaar","The Hand of the Golden Bazaar",False,464 +82,"Wild Thing","Wild Thing",True,500 +83,"The Winter Wyrm","The Winter Wyrm",False,501 +84,"Messenger of Love","Messenger of Love",True,502 +85,"Royal Seneschal","Princess for a Day",True,503 +86,"Dreamseeker","Dreamseeker",True,504 +87,"Cascadier","Cascadier",True,505 +88,"Crystal Bearer","Crystal Bearer",True,506 +89,"Stormlord","Stormlady",True,550 +90,"Serpentlord","Serpentlady",True,551 +91,"Flamelord","Flamelady",True,552 +92,"The Stormsworn","The Stormsworn",False,553 +93,"The Serpentsworn","The Serpentsworn",False,554 +94,"The Flamesworn","The Flamesworn",False,555 +95,"Stormcarrier","Stormcarrier",True,556 +96,"Serpentcarrier","Serpentcarrier",True,557 +97,"Flamecarrier","Flamecarrier",True,558 +98,"Stormbringer","Stormbringer",True,559 +99,"Serpentbringer","Serpentbringer",True,560 +100,"Flamebringer","Flamebringer",True,561 +101,"Featherfoot","Featherfoot",True,600 +102,"A Bo's Best Friend","A Bo's Best Friend",True,601 +103,"Lightning","Lightning",True,602 +104,"Cavalier","Cavalier",True,603 +105,"The Wanderer's Shadow","The Wanderer's Shadow",False,604 +106,"Green Eyes","Green Eyes",False,605 +107,"The Strategist","The Strategist",False,606 +108,"The Reaper","The Reaper",False,607 +109,"Dungeon Master","Dungeon Master",True,608 +110,"Tempter of Fate","Temptress of Fate",False,609 +111,"Elite Cascadier","Elite Cascadier",True,610 +112,"Storm Puppy","Storm Puppy",True,650 +113,"Storm Howler","Storm Howler",True,651 +114,"Storm Growler","Storm Growler",True,652 +115,"Storm Hound","Storm Hound",True,653 +116,"Storm Stalker","Storm Stalker",True,654 +117,"Storm Chaser","Storm Chaser",True,655 +118,"Naago's Friend","Naago's Friend",True,1448 +119,"Naago's Partner","Naago's Partner",True,1449 +120,"Wings of Steel","Wings of Steel",False,1450 +121,"Wings of Fire","Wings of Fire",False,1451 +122,"Serpent Puppy","Serpent Puppy",True,660 +123,"Serpent Howler","Serpent Howler",True,661 +124,"Serpent Growler","Serpent Growler",True,662 +125,"Serpent Hound","Serpent Hound",True,663 +126,"Serpent Stalker","Serpent Stalker",True,664 +127,"Serpent Chaser","Serpent Chaser",True,665 +128,"Deep Canal Raider","Deep Canal Raider",True,1452 +129,"Deep Canal Dweller","Deep Canal Dweller",True,1453 +130,"The Luckiest of Lords","The Luckiest of Ladies",False,1454 +131,"Crimson Explorer","Crimson Explorer",True,1455 +132,"Flame Puppy","Flame Puppy",True,670 +133,"Flame Howler","Flame Howler",True,671 +134,"Flame Growler","Flame Growler",True,672 +135,"Flame Hound","Flame Hound",True,673 +136,"Flame Stalker","Flame Stalker",True,674 +137,"Flame Chaser","Flame Chaser",True,675 +138,"The Legend","The Legend",False,1456 +139,"Raubahn's Left Arm","Raubahn's Left Arm",True,1457 +140,"Of the Blue","Of the Blue",False,1458 +141,"Fashion Leader","Fashion Leader",False,1459 +142,"The Ravenous Wolf","The Ravenous Wolf",False,700 +143,"The Alpha Wolf","The Alpha Wolf",False,701 +144,"The Heart of the Party","The Heart of the Party",False,750 +145,"Brother of Ash","Sister of Ash",True,751 +146,"Sylph-Friend","Sylph-Friend",True,752 +147,"Treasure Hunter","Treasure Hunter",True,753 +148,"789th Order Champion","789th Order Champion",True,754 +149,"Novv Clutchmate","Novv Clutchmate",True,755 +150,"The Ambitious Angler","The Ambitious Angler",False,756 +151,"The Meat Shield","The Meat Shield",False,757 +152,"The Meat Axe","The Meat Axe",False,758 +153,"Of the Stalwart Shield","Of the Stalwart Shield",False,759 +154,"Of the Stalwart Axe","Of the Stalwart Axe",False,760 +155,"Frontline Forerunner","Frontline Forerunner",True,761 +156,"Storm Forerunner","Storm Forerunner",True,762 +157,"Flame Forerunner","Flame Forerunner",True,764 +158,"Serpent Forerunner","Serpent Forerunner",True,763 +159,"Drone Sniper","Drone Sniper",True,765 +160,"Heliodrome Hero","Heliodrome Hero",True,766 +161,"Hunter for Hire","Hunter for Hire",True,800 +162,"Seeker of Fortune","Seeker of Fortune",True,801 +163,"Seasoned Tracker","Seasoned Tracker",True,802 +164,"Bounty Hunter","Bounty Hunter",True,803 +165,"Soldier of Fortune","Soldier of Fortune",True,804 +166,"Captain of the Hunt","Captain of the Hunt",False,805 +167,"Rafflesia Reaper","Rafflesia Reaper",True,850 +168,"Melusine Mauler","Melusine Mauler",True,851 +169,"The Avatar","The Avatar",False,852 +170,"Domitor","Domitrix",False,853 +171,"The Disassembler","The Disassembler",True,900 +172,"Eversharp","Eversharp",False,1460 +173,"Bearer of the Coffer","Bearer of the Coffer",True,902 +174,"Defender of Eorzea","Defender of Eorzea",False,950 +175,"The Postman","The Postwoman",False,951 +176,"Ehcatl Blackguard","Ehcatl Blackguard",True,952 +177,"The Negotiator","The Negotiator",False,953 +178,"The Final Witness","The Final Witness",False,954 +179,"Of Dragons Deep","Of Dragons Deep",False,955 +180,"Master Caster","Master Caster",True,956 +181,"The New Sun","The New Sun",False,1461 +182,"The Shadow","The Shadow",False,958 +183,"Icebreaker","Icebreaker",True,959 +184,"Of the Silver Lining","Of the Silver Lining",False,960 +185,"Gentleman","Gentlewoman",True,961 +186,"Cupid","Cupid",True,962 +187,"Tamer of Steeds","Tamer of Steeds",False,963 +188,"The Unsevered","The Unsevered",False,964 +189,"Slaughterhouse","Slaughterhouse",True,965 +190,"The Hand of Mercy","The Hand of Mercy",False,966 +191,"The Light in Hand","The Light in Hand",False,967 +192,"The Light of the Land","The Light of the Land",False,968 +193,"Z","Z",False,969 +194,"Golemancer","Golemancer",True,970 +195,"Gambler","Gambler",True,1000 +196,"High Roller","High Roller",True,1001 +197,"Chocobo Breeder","Chocobo Breeder",True,1002 +198,"Chocobo Trainer","Chocobo Trainer",True,1003 +199,"Bug Boy","Bug Girl",True,1004 +200,"Senior Jockey","Senior Jockey",True,1005 +201,"Veteran Jockey","Veteran Jockey",True,1006 +202,"The First Across","The First Across",False,1007 +203,"Deck Holder","Deck Holder",True,1008 +204,"Deck Hoarder","Deck Hoarder",True,1009 +205,"The Trinity","The Trinity",False,1010 +206,"Duelist","Duelist",True,1011 +207,"Keymaster","Gatekeeper",True,1012 +208,"The Fungah","The Fungah",False,1013 +209,"Moneybags","Moneybags",True,1014 +210,"Raiser of Mountains","Raiser of Mountains",False,1015 +211,"Bearer of the Torch","Bearer of the Torch",False,1050 +212,"Postmaster","Postmaster",True,1051 +213,"Half-boiled Hero","Half-boiled Heroine",True,1052 +214,"Unbeliever","Unbeliever",True,1053 +215,"The Redeemed","The Redeemed",False,1054 +216,"Nidhogg Slayer","Nidhogg Slayer",True,1055 +217,"Of the Silver Fuller","Of the Silver Fuller",False,1056 +218,"Imperial Nuisance","Imperial Nuisance",False,1057 +219,"Under-archon","Under-archon",True,1058 +220,"The End of Ascalon","The End of Ascalon",True,1059 +221,"Snake in the Grass","Snake in the Grass",True,1462 +222,"The Oathkeeper","The Oathkeeper",False,1100 +223,"Of the 14th Chakra","Of the 14th Chakra",False,1101 +224,"The Mythril Heart","The Mythril Heart",False,1102 +225,"The Azure Dragoon","The Azure Dragoon",False,1103 +226,"Skysinger","Skysinger",False,1104 +227,"Pure White","Pure White",True,1105 +228,"Annihilator","Annihilator",True,1106 +229,"Dreadspawn","Dreadspawn",False,1107 +230,"Nymian Marine","Nymian Marine",True,1108 +231,"The Darkest Shadow","The Darkest Shadow",False,1109 +232,"Blackblood","Blackblood",False,1110 +233,"Liberator","Liberator",True,1111 +234,"Stargazer","Stargazer",True,1112 +235,"Illuminati Quencher","Illuminati Quencher",True,1150 +236,"Finder of False Gods","Finder of False Gods",False,1151 +237,"Lighter than Air","Lighter than Air",True,1152 +238,"","",False,0 +239,"Grandmaster of War","Grandmaster of War",True,1200 +240,"Grandmaster of Magic","Grandmaster of Magic",True,1201 +241,"Dark Driver","Dark Driver",True,1202 +242,"Of the Stalwart Sword","Of the Stalwart Sword",False,1203 +243,"Keeper of Knowledge","Keeper of Knowledge",True,1204 +244,"Canal Dweller","Canal Dweller",True,1445 +245,"Canal Lord","Canal Lady",True,1446 +246,"The Necromancer","The Necromancer",False,1447 +247,"","",False,0 +248,"Grandmaster of the Hand","Grandmaster of the Hand",True,1209 +249,"Grandmaster of the Land","Grandmaster of the Land",True,1210 +250,"Molder of Masterpieces","Molder of Masterpieces",True,1211 +251,"Amasser of Masterpieces","Amasser of Masterpieces",True,1212 +252,"Business Associate","Business Associate",True,1213 +253,"Master Carpenter","Master Carpenter",True,1214 +254,"Master Blacksmith","Master Blacksmith",True,1215 +255,"Master Armorer","Master Armorer",True,1216 +256,"Master Goldsmith","Master Goldsmith",True,1217 +257,"Master Leatherworker","Master Leatherworker",True,1218 +258,"Master Weaver","Master Weaver",True,1219 +259,"Master Alchemist","Master Alchemist",True,1220 +260,"Master Culinarian","Master Culinarian",True,1221 +261,"Master Miner","Master Miner",True,1222 +262,"Master Botanist","Master Botanist",True,1223 +263,"Master Fisher","Master Fisher",True,1224 +264,"The Fortunate","The Fortunate",False,1225 +265,"Good Samaritan","Good Samaritan",True,1226 +266,"Minion Collector","Minion Collector",True,1227 +267,"Minion Master","Minion Master",True,1228 +268,"Mammeteer","Mammeteer",True,1229 +269,"Prince of Verminion","Princess of Verminion",False,1230 +270,"Lord of Verminion","Lady of Verminion",False,1231 +271,"House Fortemps Knight","House Fortemps Knight",False,1232 +272,"Sky Pirate","Sky Pirate",True,1233 +273,"The Noumenon","The Noumenon",False,1234 +274,"Sundrop Dancer","Sundrop Dancer",True,1235 +275,"Myth Breaker","Myth Breaker",True,1236 +276,"Veteran Explorer","Veteran Explorer",True,1237 +277,"Special Advisor","Special Advisor",True,1238 +278,"Notorious Monster Slayer","Notorious Monster Slayer",True,1239 +279,"Hungry Wolf","Hungry Wolf",True,1240 +280,"The Devourer","The Devourer",False,1241 +281,"The Unmoving","The Unmoving",False,1242 +282,"The Unrelenting","The Unrelenting",False,1243 +283,"The Unseen","The Unseen",False,1244 +284,"The Unleashed","The Unleashed",False,1245 +285,"The Undamaged","The Undamaged",False,1246 +286,"Mentor","Mentor",True,1247 +287,"Mentor of Mentors","Mentor of Mentors",True,1248 +288,"Carrier of the Kettle","Carrier of the Kettle",True,1249 +289,"The Gear of Change","The Gear of Change",False,1250 +290,"Allthoughts","Allthoughts",False,1251 +291,"The Newmind","The Newmind",False,1252 +292,"The Dragonsong","The Dragonsong",False,1253 +293,"Polis Raider","Polis Raider",True,1254 +294,"Polis Dweller","Polis Dweller",True,1255 +295,"Polis Lord","Polis Lady",True,1256 +296,"Pom Friend","Pom Friend",True,1257 +297,"Leader of the Pack","Leader of the Pack",True,1258 +298,"Beta Wolf","Beta Wolf",True,1259 +299,"Hunter Wolf","Hunter Wolf",True,1260 +300,"Bronze Wolf","Bronze Wolf",True,1261 +301,"Silver Wolf","Silver Wolf",True,1262 +302,"Gold Wolf","Gold Wolf",True,1263 +303,"Platinum Wolf","Platinum Wolf",True,1264 +304,"Diamond Wolf","Diamond Wolf",True,1265 +305,"Of the First Pack","Of the First Pack",False,1266 +306,"Of the Second Pack","Of the Second Pack",False,1267 +307,"Of the Hungry Pack","Of the Hungry Pack",False,1268 +308,"Of the Bronze Pack","Of the Bronze Pack",False,1269 +309,"Of the Silver Pack","Of the Silver Pack",False,1270 +310,"Of the Gold Pack","Of the Gold Pack",False,1271 +311,"Of the Platinum Pack","Of the Platinum Pack",False,1272 +312,"Of the Diamond Pack","Of the Diamond Pack",False,1273 +313,"The Knight of Glory","The Knight of Glory",False,1300 +314,"The Chief Mourner","The Chief Mourner",False,1310 +315,"The Wings of Time","The Wings of Time",False,1311 +316,"Surrenderer of Souls","Surrenderer of Souls",False,1312 +317,"Khloe's Friend","Khloe's Friend",True,1313 +318,"Khloe's Best Friend","Khloe's Best Friend",True,1314 +319,"Hero of Gelmorra","Hero of Gelmorra",False,1315 +320,"Lightbringer","Lightbringer",False,1316 +321,"Lonely Explorer","Lonely Explorer",True,1317 +322,"The Lucky","The Lucky",False,1318 +323,"Of the Sixth Sense","Of the Sixth Sense",False,1319 +324,"Corpse Dancer","Corpse Dancer",True,1320 +325,"Makai Master","Makai Master",True,1350 +326,"Garo","Garo",True,1351 +327,"Makai Monk","Makai Monk",True,1352 +328,"Barago","Barago",True,1353 +329,"Dan","Dan",True,1354 +330,"Makai Bard","Makai Bard",True,1355 +331,"Makai Black Mage","Makai Black Mage",True,1356 +332,"Makai White Mage","Makai White Mage",True,1357 +333,"Zero","Zero",True,1358 +334,"Makai Summoner","Makai Summoner",True,1359 +335,"Makai Scholar","Makai Scholar",True,1360 +336,"Kiba","Kiba",True,1361 +337,"Makai Machinist","Makai Machinist",True,1362 +338,"Makai Astrologian","Makai Astrologian",True,1363 +339,"Moonlifter","Moonlifter",True,1400 +340,"The Finest Pupil's Ally","The Finest Pupil's Ally",False,1401 +341,"Fatewalker","Fatewalker",True,1402 +342,"Of the Holy Body","Of the Holy Body",False,1403 +343,"Gigi's Best Friend","Gigi's Best Friend",True,1404 +344,"Tamer of the Undying Flame","Tamer of the Undying Flame",False,1405 +345,"Mortal Fist","Mortal Fist",True,1406 +346,"Rhalgr's Right Fist","Rhalgr's Right Fist",False,1407 +347,"Tablesetter","Tablesetter",True,1408 +348,"Halone's Cup Bearer","Halone's Cup Bearer",False,1409 +349,"Zhloe's Friend","Zhloe's Friend",True,1410 +350,"Zhloe's Best Friend","Zhloe's Best Friend",True,1411 +351,"Survivor of the Song","Survivor of the Song",False,1412 +352,"Ijin Traveler","Ijin Traveler",True,1413 +353,"Confederate","Confederate",True,1414 +354,"Adversary","Adversary",True,1415 +355,"Steppe Warrior","Steppe Warrior",True,1416 +356,"The Returned","The Returned",False,1417 +357,"Lyse's Right Fist","Lyse's Right Fist",True,1418 +358,"The Liberator","The Liberator",False,1419 +359,"Deltascape Deleter","Deltascape Deleter",True,1420 +360,"Ul Cup Champion","Ul Cup Champion",True,1421 +361,"The Fistful","The Fistful",False,1422 +362,"Loved by the Axe","Loved by the Axe",False,1423 +363,"The Blood Dragoon","The Blood Dragoon",False,1424 +364,"Of the True Autumn","Of the True Autumn",False,1425 +365,"Padjal Protector","Padjal Protector",True,1426 +366,"Gembreaker","Gembreaker",True,1427 +367,"The First Caller","The First Caller",False,1428 +368,"Keeper of the Lilacs","Keeper of the Lilacs",True,1429 +369,"Eorzean Ninja","Eorzean Ninja",True,1430 +370,"Of the Swirling Abyss","Of the Swirling Abyss",False,1431 +371,"The Howler","The Howler",False,1432 +372,"Of the Eastern Skies","Of the Eastern Skies",False,1433 +373,"The Red","The Red",False,1434 +374,"Muso","Muso",False,1435 +375,"God of War","Goddess of War",True,1436 +376,"God of Magic","Goddess of Magic",True,1437 +377,"God of the Hand","Goddess of the Hand",True,1438 +378,"God of the Land","Goddess of the Land",True,1439 +379,"Of the Longest Hunt","Of the Longest Hunt",False,1440 +380,"Of the Endless Hunt","Of the Endless Hunt",False,1441 +381,"Thrillseeker","Thrillseeker",True,1442 +382,"Ultimate Thrillseeker","Ultimate Thrillseeker",True,1443 +383,"Canal Raider","Canal Raider",True,1444 +384,"Hiruko Hunter","Hiruko Hunter",True,1472 +385,"Heavenly Gate Crasher","Heavenly Gate Crasher",True,1473 +386,"True Hero","True Hero",True,1474 +387,"Lone Hero","Lone Hero",True,1475 +388,"Hoarder","Hoarder",True,1476 +389,"Vanguard","Vanguard",True,1466 +390,"Kurenai's Best Friend","Kurenai's Best Friend",True,1467 +391,"Kurenai's Partner","Kurenai's Partner",True,1468 +392,"Under the Moonlight","Under the Moonlight",False,1469 +393,"Siltwater Socialite","Siltwater Socialite",True,1463 +394,"Matchmaker","Matchmaker",True,1464 +395,"Eorzean Ninja Warrior","Eorzean Ninja Warrior",True,1465 +396,"Calamatologist","Calamatologist",True,1471 +397,"The Ultimate Legend","The Ultimate Legend",False,1470 +398,"Monster Hunter","Monster Hunter",True,1477 +399,"FRC 2018 Champion","FRC 2018 Champion",True,0 +400,"FRC 2018 Finalist","FRC 2018 Finalist",True,0 +401,"FRC 2018 Ranker","FRC 2018 Ranker",True,0 +402,"Prelude in Violet","Prelude in Violet",True,1478 +403,"Philanthropist","Philanthropist",False,1479 +404,"Altar Boy","Altar Girl",True,1480 +405,"The Devout","The Devout",False,1481 +406,"Invoker of Gods","Invoker of Gods",True,1482 +407,"Grandmaster Caster","Grandmaster Caster",True,1497 +408,"Kyubi Tamer","Kyubi Tamer",False,1483 +409,"Mahjong Enthusiast","Mahjong Enthusiast",True,1484 +410,"Mahjong Master","Mahjong Master",True,1485 +411,"Little Piggy","Little Piggy",True,1486 +412,"Tough Customer","Tough Customer",True,1487 +413,"Blue Blood","Blue Blood",True,1488 +414,"Mask of the Blue","Mask of the Blue",False,1489 +415,"Perfect Blue","Perfect Blue",True,1490 +416,"Eurekan Explorer","Eurekan Explorer",True,1491 +417,"A Requiem For Heroes","A Requiem For Heroes",False,1492 +418,"The Soboro","The Soboro",False,1493 +419,"Kageyama Killer","Kageyama Killer",False,1494 +420,"Kingsglaive","Kingsglaive",True,1495 +421,"Lord of the Fetch","Lady of the Fetch",False,1496 +422,"Soul of War","Soul of War",True,1498 +423,"Soul of Magic","Soul of Magic",True,1499 +424,"Soul of the Craft","Soul of the Craft",True,1500 +425,"Soul of the Harvest","Soul of the Harvest",True,1501 +426,"Outlander","Outlander",True,1502 +427,"The Fae-touched","The Fae-touched",False,1503 +428,"Seeker of Hidden Truths","Seeker of Hidden Truths",True,1504 +429,"Of the Sunless Sea","Of the Sunless Sea",False,1505 +430,"Enemy of Innocence","Enemy of Innocence",True,1506 +431,"Shadowbringer","Shadowbringer",True,1507 +432,"Sworn Protector","Sworn Protector",True,1508 +433,"The Heart's Beat","The Heart's Beat",False,1509 +434,"Living Memory","Living Memory",True,1510 +435,"Bulwark between Worlds","Bulwark between Worlds",True,1511 +436,"The Transcendent","The Transcendent",False,1512 +437,"Worldcleaver","Worldcleaver",True,1513 +438,"Bolt from the Black","Bolt from the Black",True,1514 +439,"The Song upon the Wind","The Song upon the Wind",False,1515 +440,"Firstblessed","Firstblessed",True,1516 +441,"Of Stranger Shadow","Of Stranger Shadow",False,1517 +442,"Farcaller","Farcaller",True,1518 +443,"Knower of Twin Worlds","Knower of Twin Worlds",True,1519 +444,"Shadow of the Other","Shadow of the Other",True,1520 +445,"The Boundless Dark","The Boundless Dark",False,1521 +446,"The Shot Heard Across Worlds","The Shot Heard Across Worlds",False,1522 +447,"Distant Stargazer","Distant Stargazer",True,1523 +448,"Dualistic Duelist","Dualistic Duelist",True,1524 +449,"Samurai in a Strange Land","Samurai in a Strange Land",True,1525 +450,"Wandering Vanguard","Wandering Vanguard",True,1526 +451,"Riftdancer","Riftdancer",True,1527 +452,"Otherworld Smith","Otherworld Smith",True,1528 +453,"Otherworld Artisan","Otherworld Artisan",True,1529 +454,"Otherworld Apothecary","Otherworld Apothecary",True,1530 +455,"Otherworld Seeker","Otherworld Seeker",True,1531 +456,"Otherworld Angler","Otherworld Angler",True,1532 +457,"The Multifaceted","The Multifaceted",False,1533 +458,"Trusted Friend","Trusted Friend",True,1534 +459,"The Invisible Hand","The Invisible Hand",False,1535 +460,"Charming Brute","Charming Brute",True,1536 +461,"The Fabulously Feral","The Fabulously Feral",False,1537 +462,"Of Unyielding Oath","Of Unyielding Oath",False,1538 +463,"Of Unyielding Steel","Of Unyielding Steel",False,1539 +464,"Of Unyielding Principle","Of Unyielding Principle",False,1540 +465,"Of Unyielding Lealty","Of Unyielding Lealty",False,1541 +466,"Dungeon Raider","Dungeon Raider",True,1542 +467,"Dungeon Dweller","Dungeon Dweller",True,1543 +468,"Dungeon Lord","Dungeon Lady",True,1544 +469,"Kindred Sword","Kindred Sword",True,1545 +470,"","",False,0 +471,"","",False,0 +472,"","",False,0 +473,"","",False,0 +474,"","",False,0 +475,"","",False,0 +476,"Of Virtuous Deeds","Of Virtuous Deeds",False,1546 +477,"Kai-Shirr's Best Mate","Kai-Shirr's Best Mate",True,1547 +478,"Honeybee","Honeybee",True,1548 +479,"Sweet Dreamer","Sweet Dreamer",True,1549 +480,"The Perfect Legend","The Perfect Legend",False,1550 +481,"Blue to the Bone","Blue to the Bone",True,1551 +482,"Blue Luminary","Blue Luminary",True,1552 +483,"Masked of the Round","Masked of the Round",True,1553 +484,"Unbound Blue","Unbound Blue",True,1554 +485,"Blue Justice","Blue Justice",True,1555 +486,"The Battleforged","The Battleforged",False,1556 +487,"Champion of the Blue","Champion of the Blue",True,1557 +488,"Saint of the Firmament","Saint of the Firmament",True,10000 +489,"Beatus of the Firmament","Beata of the Firmament",True,10010 +490,"Frame of the Firmament","Frame of the Firmament",True,1560 +491,"Forge of the Firmament","Forge of the Firmament",True,1561 +492,"Hammer of the Firmament","Hammer of the Firmament",True,1562 +493,"Jewel of the Firmament","Jewel of the Firmament",True,1563 +494,"Knife of the Firmament","Knife of the Firmament",True,1564 +495,"Weave of the Firmament","Weave of the Firmament",True,1565 +496,"Panacea of the Firmament","Panacea of the Firmament",True,1566 +497,"Pan of the Firmament","Pan of the Firmament",True,1567 +498,"Pick of the Firmament","Pick of the Firmament",True,1568 +499,"Hatchet of the Firmament","Hatchet of the Firmament",True,1569 +500,"Rod of the Firmament","Rod of the Firmament",True,1570 +501,"The Hand of Creation","The Hand of Creation",False,1571 +502,"Divine Provider","Divine Provider",True,1572 +503,"The Nest's Own Carpenter","The Nest's Own Carpenter",False,1573 +504,"The Nest's Own Blacksmith","The Nest's Own Blacksmith",False,1574 +505,"The Nest's Own Armorer","The Nest's Own Armorer",False,1575 +506,"The Nest's Own Goldsmith","The Nest's Own Goldsmith",False,1576 +507,"The Nest's Own Leatherworker","The Nest's Own Leatherworker",False,1577 +508,"The Nest's Own Weaver","The Nest's Own Weaver",False,1578 +509,"The Nest's Own Alchemist","The Nest's Own Alchemist",False,1579 +510,"The Nest's Own Culinarian","The Nest's Own Culinarian",False,1580 +511,"The Nest's Own Miner","The Nest's Own Miner",False,1581 +512,"The Nest's Own Botanist","The Nest's Own Botanist",False,1582 +513,"The Nest's Own Fisher","The Nest's Own Fisher",False,1583 +514,"Fortune's Favored Kupo","Fortune's Favored Kupo",True,1584 +515,"Ocean Fisher","Ocean Fisher",True,1585 +516,"Octopus Traveler","Octopus Traveler",True,1586 +517,"Shark Hunter","Shark Hunter",True,1587 +518,"Jellyfish Fanatic","Jellyfish Fanatic",True,1588 +519,"Sea Dragoon","Sea Dragoon",True,1589 +520,"Echo of a Fallen Star","Echo of a Fallen Star",True,1590 +521,"Ronkan Historian","Ronkan Historian",True,1591 +522,"A Dragon's Best Friend","A Dragon's Best Friend",True,1592 +523,"Tinker Tutor","Tinker Tutor",True,1593 +524,"Partner in Teatime","Partner in Teatime",True,1594 +525,"Vrai Ami","Vraie Amie",True,1595 +526,"Tank Technician","Tank Technician",True,1596 +527,"Shepherd to the Stars","Shepherd to the Stars",True,1597 +528,"Featherfall's Finest Carpenter","Featherfall's Finest Carpenter",True,1598 +529,"Featherfall's Finest Blacksmith","Featherfall's Finest Blacksmith",True,1599 +530,"Featherfall's Finest Armorer","Featherfall's Finest Armorer",True,1600 +531,"Featherfall's Finest Goldsmith","Featherfall's Finest Goldsmith",True,1601 +532,"Featherfall's Finest Leatherworker","Featherfall's Finest Leatherworker",True,1602 +533,"Featherfall's Finest Weaver","Featherfall's Finest Weaver",True,1603 +534,"Featherfall's Finest Alchemist","Featherfall's Finest Alchemist",True,1604 +535,"Featherfall's Finest Culinarian","Featherfall's Finest Culinarian",True,1605 +536,"Featherfall's Finest Miner","Featherfall's Finest Miner",True,1606 +537,"Featherfall's Finest Botanist","Featherfall's Finest Botanist",True,1607 +538,"Featherfall's Finest Fisher","Featherfall's Finest Fisher",True,1608 +539,"The Decisive Blow","The Decisive Blow",False,1609 +540,"Skirmisher","Skirmisher",True,1610 +541,"Siege Liege","Siege Liege",True,1611 +542,"Gabriel's Downfall","Gabriel's Downfall",True,1612 +543,"Queller of Beasts","Queller of Beasts",True,1613 +544,"The Death of Flame","The Death of Flame",False,1614 +545,"Sword of the South","Sword of the South",True,1615 +546,"Guardian Angel","Guardian Angel",True,1616 +547,"Saint of the Firmament","Saint of the Firmament",True,10001 +548,"Beatus of the Firmament","Beata of the Firmament",True,10011 +549,"Writer of Histories","Writer of Histories",True,1617 +550,"Of the Truest Blue","Of the Truest Blue",False,1618 +551,"Blue Ranger","Blue Ranger",True,1619 +552,"The Azure and Omega","The Azure and Omega",False,1620 +553,"Balloon Catcher","Balloon Catcher",True,1621 +554,"Deadliest Catcher","Deadliest Catcher",True,1622 +555,"Manta Maniac","Manta Maniac",True,1623 +556,"World-class Troller","World-class Troller",True,1624 +557,"Saint of the Firmament","Saint of the Firmament",True,10002 +558,"Beatus of the Firmament","Beata of the Firmament",True,10012 +559,"Tournament Leader","Tournament Leader",True,1625 +560,"Secret Finder","Secret Finder",True,1626 +561,"Secret Keeper","Secret Keeper",True,1627 +562,"Gaolbreaker","Gaolbreaker",True,1628 +563,"Master of the Sea","Master of the Sea",True,1629 +564,"Delubrum Delver","Delubrum Delver",True,1630 +565,"The Risensung Carpenter","The Risensung Carpenter",False,1631 +566,"The Risensung Blacksmith","The Risensung Blacksmith",False,1632 +567,"The Risensung Armorer","The Risensung Armorer",False,1633 +568,"The Risensung Goldsmith","The Risensung Goldsmith",False,1634 +569,"The Risensung Leatherworker","The Risensung Leatherworker",False,1635 +570,"The Risensung Weaver","The Risensung Weaver",False,1636 +571,"The Risensung Alchemist","The Risensung Alchemist",False,1637 +572,"The Risensung Culinarian","The Risensung Culinarian",False,1638 +573,"The Risensung Miner","The Risensung Miner",False,1639 +574,"The Risensung Botanist","The Risensung Botanist",False,1640 +575,"The Risensung Fisher","The Risensung Fisher",False,1641 +576,"Jack of All Cards","Jack of All Cards",True,1642 +577,"Speed Demon","Speed Demon",True,1643 +578,"The Indefatigable","The Indefatigable",False,1644 +579,"Lord of Far Waters","Lady of Far Waters",True,1645 +580,"Big Fish","Big Fish",True,1646 +581,"Charlemend's Angel","Charlemend's Angel",True,1647 +582,"Lifesaver","Lifesaver",True,1648 +583,"Dawn Treader","Dawn Treader",True,1649 +584,"Witness to the Dark Apocalypse","Witness to the Dark Apocalypse",True,1650 +585,"Dalriada Raider","Dalriada Raider",True,1651 +586,"The Hypertuned","The Hypertuned",False,1652 +587,"Commander Conqueror","Commander Conqueror",True,1653 +588,"Lyon Tamer","Lyon Tamer",True,1654 +589,"Hero of Zadnor","Hero of Zadnor",True,1655 +590,"Gunnhildr's Blade","Gunnhildr's Blade",True,1656 +591,"The Emblazoned","The Emblazoned",False,1657 +592,"Queen's Elect","Queen's Elect",True,1658 +593,"","",False,0 +594,"","",False,0 diff --git a/ffxiv/data/tribes.csv b/ffxiv/data/tribes.csv new file mode 100644 index 0000000..5a3a88a --- /dev/null +++ b/ffxiv/data/tribes.csv @@ -0,0 +1,20 @@ +key,0,1,2,3,4,5,6,7,8,9 +#,Masculine,Feminine,Hp,Mp,STR,VIT,DEX,INT,MND,PIE +int32,str,str,sbyte,sbyte,sbyte,sbyte,sbyte,sbyte,sbyte,sbyte +0,"","",0,0,0,0,0,0,0,0 +1,"Midlander","Midlander",0,0,2,0,-1,3,-1,0 +2,"Highlander","Highlander",0,0,3,2,0,-2,0,0 +3,"Wildwood","Wildwood",0,0,0,-1,3,2,-1,0 +4,"Duskwight","Duskwight",0,0,0,-1,0,3,1,0 +5,"Plainsfolk","Plainsfolk",0,0,-1,-1,3,2,0,0 +6,"Dunesfolk","Dunesfolk",0,0,-1,-2,1,2,3,0 +7,"Seeker of the Sun","Seeker of the Sun",0,0,2,0,3,-1,-1,0 +8,"Keeper of the Moon","Keeper of the Moon",0,0,-1,-2,2,1,3,0 +9,"Sea Wolf","Sea Wolf",0,0,2,3,-1,-2,1,0 +10,"Hellsguard","Hellsguard",0,0,0,3,-2,0,2,0 +11,"Raen","Raen",0,0,-1,-1,2,0,3,0 +12,"Xaela","Xaela",0,0,3,2,0,0,-2,0 +13,"Helions","Helions",0,0,3,3,-3,-3,3,0 +14,"The Lost","The Lost",0,0,3,3,-3,-3,3,0 +15,"Rava","Rava",0,0,0,-2,3,1,1,0 +16,"Veena","Veena",0,0,-1,-1,0,3,2,0 diff --git a/ffxiv/ffxiv_core.py b/ffxiv/ffxiv_core.py new file mode 100644 index 0000000..92e87e6 --- /dev/null +++ b/ffxiv/ffxiv_core.py @@ -0,0 +1,506 @@ +import json +import os +import time +from datetime import datetime, timedelta + +import psycopg2 +from PIL import Image, ImageFont, ImageDraw +from io import BytesIO +import csv +import requests +from pathlib import Path + +from psycopg2.extras import RealDictRow +# from ratelimit import sleep_and_retry, limits + +from ffxiv.pystone.definition import Definition + + +class ScrapeLodestone: + def __init__(self, character_id): + self.character_id = character_id + + @staticmethod + def scrape_data(filename, player_id): + # argv1 = 'lodestone-css-selectors-0.46.0' + argv1 = 'lodestone-css-selectors-0.52.0' + region = 'eu' + + definition_file = f'profile/{filename}.json' + base = Path(argv1) + path = base / definition_file + + with open(os.path.dirname(__file__) / base / 'meta.json') as f: + meta = json.loads(f.read()) + + definition = Definition( + os.path.dirname(__file__) / path, + meta['applicableUris'][definition_file] + ) + + definition.process((region, player_id)) + # character_definition.process({'region': region, 'id': player_id}) + return definition.to_json() + + def character(self): + char = self.scrape_data('character', self.character_id) + char['character']['classjobs'] = self.scrape_data('classjob', self.character_id) + char['character']['gender'] = 'm' if char['character']['gender'] == '♂' else 'f' + return char + + +class FFXIVCharacter: + def __init__(self, character_id): + self.character_id = character_id + self.name = None + self.gender = None + self.title = None + self.race = None + self.free_company = None + self.clan = None + self.race_clan_gender = None + self.portrait = None + self.server = None + self.image = None + self.grand_company = None + self.title_is_prefix = None + self.get_grand_company() + + self.combat_levels_earned = 0 + self.combat_levels_max = 0 + self.crafter_levels_earned = 0 + self.crafter_levels_max = 0 + + self.db_con = psycopg2.connect(database=os.environ.get('db_name'), + user=os.environ.get('db_user'), + password=os.environ.get('db_pass'), + host=os.environ.get('db_host'), + port=os.environ.get('db_port')) + self.db_cur = self.db_con.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor) + + self.paladin = None + self.warrior = None + self.darkknight = None + self.gunbreaker = None + self.whitemage = None + self.scholar = None + self.astrologian = None + self.sage = None + self.monk = None + self.dragoon = None + self.ninja = None + self.samurai = None + self.reaper = None + self.bard = None + self.machinist = None + self.dancer = None + self.blackmage = None + self.summoner = None + self.redmage = None + self.bluemage = None + self.carpenter = None + self.blacksmith = None + self.armorer = None + self.goldsmith = None + self.leatherworker = None + self.weaver = None + self.alchemist = None + self.culinarian = None + self.miner = None + self.botanist = None + self.fisher = None + self.achievements = None + self.mounts_max = 219 + self.mounts_owned = None + self.minion_max = 442 + self.minion_owned = None + + self.font_job_level = ImageFont.truetype("./fonts/steelfish/steelfish bd.ttf", 33) + self.font_job_name = ImageFont.truetype("./fonts/roboto/Roboto-Regular.ttf", 16) + self.font_job_experience = ImageFont.truetype("./fonts/calibri/calibri.ttf", 35) + + self.font_character_name = ImageFont.truetype("./fonts/calibri/calibri.ttf", 35) + self.font_character_title_name = ImageFont.truetype("./fonts/roboto/Roboto-Regular.ttf", 22) + + self.font_character_label = ImageFont.truetype("./fonts/calibri/calibrib.ttf", 15) + self.font_character_value = ImageFont.truetype("./fonts/roboto/Roboto-Regular.ttf", 16) + + self.font_footer_label = ImageFont.truetype("./fonts/roboto/Roboto-Regular.ttf", 13) + self.font_footer_value = ImageFont.truetype("./fonts/roboto/Roboto-Regular.ttf", 12) + + self.font_colour_maxed = (240, 142, 55, 255) + self.font_colour_job_specialist = (170, 128, 255, 255) + self.font_colour_standard = (204, 204, 204, 255) + self.font_colour_darkgrey = (90, 90, 90, 255) + self.font_colour_lightblue = (170, 253, 255, 255) + self.font_colour_text_title = (202, 175, 117, 255) + self.font_colour_text_label = (160, 160, 160, 255) + self.font_colour_text_value = (238, 225, 197, 255) + + async def build_character_view(self): + # response_image = requests.get(self.portrait) + self.base_image() + self.image_header() + self.image_information() + self.image_classjobs() + self.image_footer() + + self.image.save('character.png') + + def base_image(self): + """Generates the base image, with character portait.""" + self.image = Image.new('RGBA', (1050, 873), color='#000000') + img_tile = Image.open("./ffxiv/bg-tile.png") + img_tile_x, img_tile_y = img_tile.size + + cur_x, cur_y = 0, 0 + img_x, img_y = self.image.size + while cur_x < img_x and cur_y < img_y: + self.image.paste(img_tile, (cur_x, cur_y)) + + cur_x += img_tile_x + if cur_x > img_x and cur_y > img_y: + break + + elif cur_x > img_x: + cur_x = 0 + cur_y += img_tile_y + + # Place portrait onto character view + response_image = requests.get(self.portrait) + img_portait = Image.open(BytesIO(response_image.content)) + self.image.paste(img_portait) + + # Place frame over image + img_frame = Image.open(f'./ffxiv/character-frame.png') + self.image.paste(img_frame, mask=img_frame) + + self.add_corners(self.image, 24) + + @staticmethod + def add_corners(im, rad): + circle = Image.new('L', (rad * 2, rad * 2), 0) + draw = ImageDraw.Draw(circle) + draw.ellipse((0, 0, rad * 2, rad * 2), fill=255) + alpha = Image.new('L', im.size, 255) + w, h = im.size + alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0)) + alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad)) + alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0)) + alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad)) + im.putalpha(alpha) + return im + + def image_header(self): + """Add character name, title and server""" + d = ImageDraw.Draw(self.image) + + name_w, name_h = d.textsize(self.name, font=self.font_character_name) + title_w, title_h = d.textsize(self.title, font=self.font_character_title_name) + realm_w, realm_h = d.textsize(self.server, font=self.font_character_value) + + # Determine title/name heights + if self.title_is_prefix: + char_name_offset = 23 + title_name_offset = 0 + else: + char_name_offset = 0 + title_name_offset = 29 + + x_offset = 0 + # Add text + d.text((645 + x_offset + (376-name_w)/2, 10 + char_name_offset), self.name, font=self.font_character_name, fill=self.font_colour_text_value) + d.text((645 + x_offset + (376-title_w)/2, 10 + title_name_offset), self.title, font=self.font_character_title_name, fill=self.font_colour_text_title) + d.text((645 + x_offset + (376-realm_w)/2, 65), self.server, font=self.font_character_value, fill=self.font_colour_text_label) + + def image_information(self): + """Adds characters information to image""" + x_offset = 19 + label_offset_y = 95 + + # grand_company_rank = "" + + ffxiv_races = ["Hyur", "Elezen", "Lalafell", "Miqo'te", "Roegadyn", "Au Ra", "Viera", "Hrothgar"] + for ffxiv_race in ffxiv_races: + if ffxiv_race in self.race_clan_gender: + self.race = ffxiv_race + self.clan = self.race_clan_gender.split(ffxiv_race)[1] + + d = ImageDraw.Draw(self.image) + + d.text((650 + x_offset, 0 + label_offset_y), "Race", font=self.font_character_label, fill=self.font_colour_text_label) + d.text((660 + x_offset, 15 + label_offset_y), f"{self.race}, {self.clan}", font=self.font_character_value, fill=self.font_colour_text_value) + + d.text((650 + x_offset, 50 + label_offset_y), "Free Company", font=self.font_character_label, fill=self.font_colour_text_label) + d.text((660 + x_offset, 65 + label_offset_y), self.free_company, font=self.font_character_value, fill=self.font_colour_text_value) + + d.text((650 + x_offset, 100 + label_offset_y), "Grand Company", font=self.font_character_label, fill=self.font_colour_text_label) + d.text((660 + x_offset, 115 + label_offset_y), self.grand_company, font=self.font_character_value, fill=self.font_colour_text_value) + # d.text((660 + x_offset, 135 + label_offset_y), self.grand_company, font=font_character_value, fill=font_colour_text_value)+ + + label_offset_x_col_r = -20 + d.text((890 + x_offset + label_offset_x_col_r, 0 + label_offset_y), "Mounts", font=self.font_character_label, fill=self.font_colour_text_label) + d.text((900 + x_offset + label_offset_x_col_r, 15 + label_offset_y), f"{self.mounts_owned} / {self.mounts_max}", font=self.font_character_value, fill=self.font_colour_text_value) + + d.text((890 + x_offset + label_offset_x_col_r, 50 + label_offset_y), "Minions", font=self.font_character_label, fill=self.font_colour_text_label) + d.text((900 + x_offset + label_offset_x_col_r, 65 + label_offset_y), f"{self.minion_owned} / {self.minion_max}", font=self.font_character_value, fill=self.font_colour_text_value) + + d.text((890 + x_offset + label_offset_x_col_r, 100 + label_offset_y), "Achievement Points", font=self.font_character_label, fill=self.font_colour_text_label) + d.text((900 + x_offset + label_offset_x_col_r, 115 + label_offset_y), self.achievements, font=self.font_character_value, fill=self.font_colour_text_value) + + def image_classjobs(self): + """Adds character class/jobs to image""" + # Buddy up the jobs into groups for image modularity + tank_jobs = [self.paladin, self.warrior, self.darkknight, self.gunbreaker] + healer_jobs = [self.whitemage, self.scholar, self.astrologian, self.sage] + dps_jobs = [self.monk, self.dragoon, self.ninja, self.samurai, self.reaper] + rdps_jobs = [self.bard, self.machinist, self.dancer] + mdps_jobs = [self.blackmage, self.summoner, self.redmage, self.bluemage] + hand_jobs = [self.carpenter, self.blacksmith, self.armorer, self.goldsmith, self.leatherworker, self.weaver, self.alchemist, self.culinarian] + land_jobs = [self.miner, self.botanist, self.fisher] + # extra_jobs = [self.eureka, self.bozja] + + self.assemble_jobs(tank_jobs, 668, 250, True) + self.assemble_jobs(healer_jobs, 668, 400, True) + + self.assemble_jobs(dps_jobs, 860, 250, True) + self.assemble_jobs(rdps_jobs, 860, 433, True) + self.assemble_jobs(mdps_jobs, 860, 550, True) + + self.assemble_jobs(land_jobs, 860, 715, False) + self.assemble_jobs(hand_jobs, 668, 550, False) + + def image_footer(self): + """Adds footer level totals to image""" + x_offset = 0 + x_pos = 710 + ldata = [{"label": "DoW/DoM", "value": f"{self.combat_levels_earned}/{self.combat_levels_max} - {round((self.combat_levels_earned*100)/self.combat_levels_max, 2)}%"}, + {"label": "DoL/DoH", "value": f"{self.crafter_levels_earned}/{self.crafter_levels_max} - {round((self.crafter_levels_earned*100)/self.crafter_levels_max, 2)}%"}, + {"label": "Total", "value": f"{self.combat_levels_earned+self.crafter_levels_earned}/{self.combat_levels_max+self.crafter_levels_max} - {round(((self.combat_levels_earned+self.crafter_levels_earned)*100)/(self.combat_levels_max+self.crafter_levels_max), 2)}%"}] + + for l in ldata: + label_w, label_h = self.draw.textsize(l['label'], font=self.font_footer_label) + value_w, value_h = self.draw.textsize(l['value'], font=self.font_footer_value) + + # if "100.0%" in l['value']: + # font_colour = self.font_colour_maxed + # else: + # font_colour = self.font_colour_standard + + self.draw.text((x_pos + x_offset + (0-label_w)/2, 836), l['label'], font=self.font_footer_label, fill=self.font_colour_text_label) + self.draw.text((x_pos + x_offset + (0-value_w)/2, 850), l['value'], font=self.font_footer_value, fill=self.font_colour_standard) + x_offset += 130 + + def assemble_jobs(self, jobs: list, increment_x=0, increment_y=0, is_combat=True): + # total_level_max = 0 + for job in jobs: + # print(f"working on {job}") + if job['unlockstate'] in ['bozja', 'eureka']: + continue + + # Get job image + job_icon = Image.open(f'./ffxiv/jobs/{job["unlockstate"].replace(" ", "").lower()}.png',) + job_icon = job_icon.resize((30, 30)) + + # Job XP + job_xp = 0 if job["exp"] in ['-', '--'] else ((int(job["exp"].replace(",", "")) * 100) / int(job["exp_max"].replace(",", ""))) / 100 + # job['level'] = "0" if job["level"] == '-' else job['level'] + + # Determine levels at max, and acquire total levels data + if is_combat: + self.combat_levels_max += int(job['max_level']) + if job["level"] in ['-', '--']: + level_maxed = False + elif str(job['level']).isnumeric() and int(job['level']) == job['max_level']: + self.combat_levels_earned += int(job['max_level']) + level_maxed = True + else: + self.combat_levels_earned += int(job['level']) + level_maxed = False + + elif not is_combat: + self.crafter_levels_max += int(job['max_level']) + if job["level"] in ['-', '--']: + level_maxed = False + elif int(job['level']) == job['max_level']: + self.crafter_levels_earned += int(job['max_level']) + level_maxed = True + else: + self.crafter_levels_earned += int(job['level']) + level_maxed = False + + if 'specialist' in job and job['specialist']: + job_colour = self.font_colour_job_specialist + else: + job_colour = self.font_colour_standard + + self.draw = ImageDraw.Draw(self.image) + + job_level_w, job_level_h = self.draw.textsize(job["level"], font=self.font_job_level) + + # Job Icon + self.image.paste(job_icon, (increment_x, increment_y), mask=job_icon) + # Job Level + self.draw.text((increment_x + 42 - (job_level_w/2), increment_y - 7), job["level"], font=self.font_job_level, fill=self.font_colour_maxed if level_maxed else self.font_colour_standard) + # Job Name + self.draw.text((increment_x + 55, increment_y - 1), job['unlockstate'], font=self.font_job_name, fill=job_colour) + # Job XP Meter + self.draw_progress_bar(self.draw, increment_x + 53, increment_y + 20, w=110, h=5, progress=job_xp) + increment_y += 33 + + def draw_progress_bar(self, draw, x, y, w: int, h: int, progress): + # draw background bar and progress bar + draw.rectangle((x+(h/2), y, x+w+(h/2), y+h), fill=self.font_colour_darkgrey) + if progress > 0: + w *= progress + draw.rectangle((x+(h/2), y, x+w+(h/2), y+h), fill=self.font_colour_standard) + return draw + + def get_title(self): + with open("./ffxiv/data/titles.csv", "r") as file: + data = csv.reader(file, delimiter=',', quotechar='"') + for title in data: + if title[1] == self.title: + self.title_is_prefix = True if title[3] == "True" else False + if self.gender == 'm': + self.title = title[1] + + elif self.gender == 'f': + self.title = title[2] + return + return + + def get_grand_company(self): + with open("./ffxiv/data/grandcompanies.csv", "r") as file: + data = csv.reader(file, delimiter=',', quotechar='"') + for row in data: + if self.grand_company in ['Maelstrom', 'Adder', 'Flames'] and self.grand_company in row[1]: + self.grand_company = row[1] + return + + async def obtain_character_data(self): + cur = self.db_con.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor) + cur.execute('SELECT * FROM database1.synthy.ffxiv WHERE id = %s', (self.character_id,)) + character = cur.fetchone() + + if character.character_data is None or (character.character_epoch is not None and (int(time.time()) - character.character_epoch) > timedelta(hours=2).seconds): + await self.update_character_data() + if character.classjob_data is None or (character.classjob_epoch is not None and (int(time.time()) - character.classjob_epoch) > timedelta(hours=2).seconds): + await self.update_classjob_data() + if character.minion_data is None or (character.minion_epoch is not None and (int(time.time()) - character.minion_epoch) > timedelta(hours=23).seconds): + await self.update_minion_data() + if character.mount_data is None or (character.mount_epoch is not None and (int(time.time()) - character.mount_epoch) > timedelta(hours=23).seconds): + await self.update_mount_data() + if character.achievement_data is None or (character.achievement_epoch is not None and (int(time.time()) - character.achievement_epoch) > timedelta(hours=23).seconds): + await self.update_achievement_data() + + await self.read_character_data() + await self.read_classjob_data() + await self.read_minion_data() + await self.read_mount_data() + await self.read_achievement_data() + + async def update_character_data(self): + data_scraped = ScrapeLodestone.scrape_data('character', self.character_id) + self.db_cur.execute('UPDATE "database1".synthy.ffxiv SET character_data = %s, character_epoch = %s WHERE id = %s', (json.dumps(data_scraped['character']), int(time.time()), self.character_id,)) + self.db_con.commit() + + async def update_classjob_data(self): + data_scraped = ScrapeLodestone.scrape_data('classjob', self.character_id) + self.db_cur.execute('UPDATE "database1".synthy.ffxiv SET classjob_data = %s, classjob_epoch = %s WHERE id = %s', (json.dumps(data_scraped), int(time.time()), self.character_id,)) + self.db_con.commit() + + async def update_minion_data(self): + data_scraped = ScrapeLodestone.scrape_data('minion', self.character_id) + self.db_cur.execute('UPDATE "database1".synthy.ffxiv SET minion_data = %s, minion_epoch = %s WHERE id = %s', (json.dumps(data_scraped['minion']), int(time.time()), self.character_id,)) + self.db_con.commit() + + async def update_mount_data(self): + try: + data_scraped = ScrapeLodestone.scrape_data('mount', self.character_id) + data = json.dumps(data_scraped['mount']) + except: + data = json.dumps({"total": "Not Unlocked"}) + self.db_cur.execute('UPDATE "database1".synthy.ffxiv SET mount_data = %s, mount_epoch = %s WHERE id = %s', (data, int(time.time()), self.character_id,)) + self.db_con.commit() + + async def update_achievement_data(self): + try: + data_scraped = ScrapeLodestone.scrape_data('achievements', self.character_id) + data = json.dumps(data_scraped['achievements']) + except: + data = json.dumps({"total_achievements": "Private", "achievement_points": "Private"}) + self.db_cur.execute('UPDATE "database1".synthy.ffxiv SET achievement_data = %s, achievement_epoch = %s WHERE id = %s', (data, int(time.time()), self.character_id,)) + self.db_con.commit() + + async def update_data_titles(self): + d = requests.get('https://raw.githubusercontent.com/xivapi/ffxiv-datamining/master/csv/Title.csv') + d = d.content.decode() + with open("./ffxiv/data/titles.csv", "w") as file: + file.write(d) + + async def read_character_data(self): + self.db_cur.execute('SELECT character_data from "database1".synthy.ffxiv WHERE id = %s', (self.character_id,)) + data = json.loads(self.db_cur.fetchone()[0]) + self.name = data['name'] + self.gender = 'm' if data['gender'] == '♂' else 'f' + self.title = data['title'] + self.free_company = "N/A" if data['free_company']['free_company']['name'] == '' else data['free_company']['free_company']['name'] + self.race_clan_gender = data['race_clan_gender'] + self.server = data['server'] + self.grand_company = data['grand_company'] + self.portrait = data['portrait'] + + self.get_title() + self.get_grand_company() + + async def read_classjob_data(self): + self.db_cur.execute('SELECT classjob_data from "database1".synthy.ffxiv WHERE id = %s', (self.character_id,)) + data = json.loads(self.db_cur.fetchone()[0]) + + self.paladin = {**data['classjob']['paladin']['paladin'], **{'max_level': 90}} + self.warrior = {**data['classjob']['warrior']['warrior'], **{'max_level': 90}} + self.darkknight = {**data['classjob']['darkknight']['darkknight'], **{'max_level': 90}} + self.gunbreaker = {**data['classjob']['gunbreaker']['gunbreaker'], **{'max_level': 90}} + self.whitemage = {**data['classjob']['whitemage']['whitemage'], **{'max_level': 90}} + self.scholar = {**data['classjob']['scholar']['scholar'], **{'max_level': 90}} + self.astrologian = {**data['classjob']['astrologian']['astrologian'], **{'max_level': 90}} + self.sage = {**data['classjob']['sage']['sage'], **{'max_level': 90}} + self.monk = {**data['classjob']['monk']['monk'], **{'max_level': 90}} + self.dragoon = {**data['classjob']['dragoon']['dragoon'], **{'max_level': 90}} + self.ninja = {**data['classjob']['ninja']['ninja'], **{'max_level': 90}} + self.samurai = {**data['classjob']['samurai']['samurai'], **{'max_level': 90}} + self.reaper = {**data['classjob']['reaper']['reaper'], **{'max_level': 90}} + self.bard = {**data['classjob']['bard']['bard'], **{'max_level': 90}} + self.machinist = {**data['classjob']['machinist']['machinist'], **{'max_level': 90}} + self.dancer = {**data['classjob']['dancer']['dancer'], **{'max_level': 90}} + self.blackmage = {**data['classjob']['blackmage']['blackmage'], **{'max_level': 90}} + self.summoner = {**data['classjob']['summoner']['summoner'], **{'max_level': 90}} + self.redmage = {**data['classjob']['redmage']['redmage'], **{'max_level': 90}} + self.bluemage = {**data['classjob']['bluemage']['bluemage'], **{'max_level': 70}} + self.carpenter = {**data['classjob']['carpenter']['carpenter'], **{'max_level': 90}} + self.blacksmith = {**data['classjob']['blacksmith']['blacksmith'], **{'max_level': 90}} + self.armorer = {**data['classjob']['armorer']['armorer'], **{'max_level': 90}} + self.goldsmith = {**data['classjob']['goldsmith']['goldsmith'], **{'max_level': 90}} + self.leatherworker = {**data['classjob']['leatherworker']['leatherworker'], **{'max_level': 90}} + self.weaver = {**data['classjob']['weaver']['weaver'], **{'max_level': 90}} + self.alchemist = {**data['classjob']['alchemist']['alchemist'], **{'max_level': 90}} + self.culinarian = {**data['classjob']['culinarian']['culinarian'], **{'max_level': 90}} + self.miner = {**data['classjob']['miner']['miner'], **{'max_level': 90}} + self.botanist = {**data['classjob']['botanist']['botanist'], **{'max_level': 90}} + self.fisher = {**data['classjob']['fisher']['fisher'], **{'max_level': 90}} + + async def read_minion_data(self): + self.db_cur.execute('SELECT minion_data from "database1".synthy.ffxiv WHERE id = %s', (self.character_id,)) + data = json.loads(self.db_cur.fetchone()[0]) + self.minion_owned = data['total'] + + async def read_mount_data(self): + self.db_cur.execute('SELECT mount_data from "database1".synthy.ffxiv WHERE id = %s', (self.character_id,)) + data = json.loads(self.db_cur.fetchone()[0]) + self.mounts_owned = data['total'] + + async def read_achievement_data(self): + self.db_cur.execute('SELECT achievement_data from "database1".synthy.ffxiv WHERE id = %s', (self.character_id,)) + data = json.loads(self.db_cur.fetchone()[0]) + self.achievements = data['achievement_points'] diff --git a/ffxiv/grandcompany/immortal_flames/1.png b/ffxiv/grandcompany/immortal_flames/1.png Binary files differnew file mode 100644 index 0000000..63edb16 --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/1.png diff --git a/ffxiv/grandcompany/immortal_flames/10.png b/ffxiv/grandcompany/immortal_flames/10.png Binary files differnew file mode 100644 index 0000000..cf85208 --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/10.png diff --git a/ffxiv/grandcompany/immortal_flames/11.png b/ffxiv/grandcompany/immortal_flames/11.png Binary files differnew file mode 100644 index 0000000..48998ec --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/11.png diff --git a/ffxiv/grandcompany/immortal_flames/12.png b/ffxiv/grandcompany/immortal_flames/12.png Binary files differnew file mode 100644 index 0000000..1b4a9d1 --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/12.png diff --git a/ffxiv/grandcompany/immortal_flames/13.png b/ffxiv/grandcompany/immortal_flames/13.png Binary files differnew file mode 100644 index 0000000..d54407e --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/13.png diff --git a/ffxiv/grandcompany/immortal_flames/14.png b/ffxiv/grandcompany/immortal_flames/14.png Binary files differnew file mode 100644 index 0000000..291c6ee --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/14.png diff --git a/ffxiv/grandcompany/immortal_flames/15.png b/ffxiv/grandcompany/immortal_flames/15.png Binary files differnew file mode 100644 index 0000000..73937cb --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/15.png diff --git a/ffxiv/grandcompany/immortal_flames/16.png b/ffxiv/grandcompany/immortal_flames/16.png Binary files differnew file mode 100644 index 0000000..ed1c076 --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/16.png diff --git a/ffxiv/grandcompany/immortal_flames/17.png b/ffxiv/grandcompany/immortal_flames/17.png Binary files differnew file mode 100644 index 0000000..f8032b8 --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/17.png diff --git a/ffxiv/grandcompany/immortal_flames/18.png b/ffxiv/grandcompany/immortal_flames/18.png Binary files differnew file mode 100644 index 0000000..e65c826 --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/18.png diff --git a/ffxiv/grandcompany/immortal_flames/19.png b/ffxiv/grandcompany/immortal_flames/19.png Binary files differnew file mode 100644 index 0000000..2b4c7b1 --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/19.png diff --git a/ffxiv/grandcompany/immortal_flames/2.png b/ffxiv/grandcompany/immortal_flames/2.png Binary files differnew file mode 100644 index 0000000..1bbd7da --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/2.png diff --git a/ffxiv/grandcompany/immortal_flames/3.png b/ffxiv/grandcompany/immortal_flames/3.png Binary files differnew file mode 100644 index 0000000..cd765b5 --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/3.png diff --git a/ffxiv/grandcompany/immortal_flames/4.png b/ffxiv/grandcompany/immortal_flames/4.png Binary files differnew file mode 100644 index 0000000..59dc695 --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/4.png diff --git a/ffxiv/grandcompany/immortal_flames/5.png b/ffxiv/grandcompany/immortal_flames/5.png Binary files differnew file mode 100644 index 0000000..5bd9b35 --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/5.png diff --git a/ffxiv/grandcompany/immortal_flames/6.png b/ffxiv/grandcompany/immortal_flames/6.png Binary files differnew file mode 100644 index 0000000..c187830 --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/6.png diff --git a/ffxiv/grandcompany/immortal_flames/7.png b/ffxiv/grandcompany/immortal_flames/7.png Binary files differnew file mode 100644 index 0000000..955b1ee --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/7.png diff --git a/ffxiv/grandcompany/immortal_flames/8.png b/ffxiv/grandcompany/immortal_flames/8.png Binary files differnew file mode 100644 index 0000000..a8cf5b3 --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/8.png diff --git a/ffxiv/grandcompany/immortal_flames/9.png b/ffxiv/grandcompany/immortal_flames/9.png Binary files differnew file mode 100644 index 0000000..82e44ee --- /dev/null +++ b/ffxiv/grandcompany/immortal_flames/9.png diff --git a/ffxiv/grandcompany/maelstrom/1.png b/ffxiv/grandcompany/maelstrom/1.png Binary files differnew file mode 100644 index 0000000..257ffb3 --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/1.png diff --git a/ffxiv/grandcompany/maelstrom/10.png b/ffxiv/grandcompany/maelstrom/10.png Binary files differnew file mode 100644 index 0000000..14ceb82 --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/10.png diff --git a/ffxiv/grandcompany/maelstrom/11.png b/ffxiv/grandcompany/maelstrom/11.png Binary files differnew file mode 100644 index 0000000..604ad4f --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/11.png diff --git a/ffxiv/grandcompany/maelstrom/12.png b/ffxiv/grandcompany/maelstrom/12.png Binary files differnew file mode 100644 index 0000000..33c6db7 --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/12.png diff --git a/ffxiv/grandcompany/maelstrom/13.png b/ffxiv/grandcompany/maelstrom/13.png Binary files differnew file mode 100644 index 0000000..068fbf0 --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/13.png diff --git a/ffxiv/grandcompany/maelstrom/14.png b/ffxiv/grandcompany/maelstrom/14.png Binary files differnew file mode 100644 index 0000000..92d0f00 --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/14.png diff --git a/ffxiv/grandcompany/maelstrom/15.png b/ffxiv/grandcompany/maelstrom/15.png Binary files differnew file mode 100644 index 0000000..1d7ab11 --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/15.png diff --git a/ffxiv/grandcompany/maelstrom/16.png b/ffxiv/grandcompany/maelstrom/16.png Binary files differnew file mode 100644 index 0000000..ab48546 --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/16.png diff --git a/ffxiv/grandcompany/maelstrom/17.png b/ffxiv/grandcompany/maelstrom/17.png Binary files differnew file mode 100644 index 0000000..d3e758a --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/17.png diff --git a/ffxiv/grandcompany/maelstrom/18.png b/ffxiv/grandcompany/maelstrom/18.png Binary files differnew file mode 100644 index 0000000..5ed7fe8 --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/18.png diff --git a/ffxiv/grandcompany/maelstrom/19.png b/ffxiv/grandcompany/maelstrom/19.png Binary files differnew file mode 100644 index 0000000..c4cadb1 --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/19.png diff --git a/ffxiv/grandcompany/maelstrom/2.png b/ffxiv/grandcompany/maelstrom/2.png Binary files differnew file mode 100644 index 0000000..a1ab5a4 --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/2.png diff --git a/ffxiv/grandcompany/maelstrom/3.png b/ffxiv/grandcompany/maelstrom/3.png Binary files differnew file mode 100644 index 0000000..70d810c --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/3.png diff --git a/ffxiv/grandcompany/maelstrom/4.png b/ffxiv/grandcompany/maelstrom/4.png Binary files differnew file mode 100644 index 0000000..9c46bb9 --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/4.png diff --git a/ffxiv/grandcompany/maelstrom/5.png b/ffxiv/grandcompany/maelstrom/5.png Binary files differnew file mode 100644 index 0000000..dcabb02 --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/5.png diff --git a/ffxiv/grandcompany/maelstrom/6.png b/ffxiv/grandcompany/maelstrom/6.png Binary files differnew file mode 100644 index 0000000..40601cf --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/6.png diff --git a/ffxiv/grandcompany/maelstrom/7.png b/ffxiv/grandcompany/maelstrom/7.png Binary files differnew file mode 100644 index 0000000..7d9042a --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/7.png diff --git a/ffxiv/grandcompany/maelstrom/8.png b/ffxiv/grandcompany/maelstrom/8.png Binary files differnew file mode 100644 index 0000000..227c16f --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/8.png diff --git a/ffxiv/grandcompany/maelstrom/9.png b/ffxiv/grandcompany/maelstrom/9.png Binary files differnew file mode 100644 index 0000000..9e235e0 --- /dev/null +++ b/ffxiv/grandcompany/maelstrom/9.png diff --git a/ffxiv/grandcompany/twin_adder/1.png b/ffxiv/grandcompany/twin_adder/1.png Binary files differnew file mode 100644 index 0000000..2c26e53 --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/1.png diff --git a/ffxiv/grandcompany/twin_adder/10.png b/ffxiv/grandcompany/twin_adder/10.png Binary files differnew file mode 100644 index 0000000..f97b638 --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/10.png diff --git a/ffxiv/grandcompany/twin_adder/11.png b/ffxiv/grandcompany/twin_adder/11.png Binary files differnew file mode 100644 index 0000000..21b430f --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/11.png diff --git a/ffxiv/grandcompany/twin_adder/12.png b/ffxiv/grandcompany/twin_adder/12.png Binary files differnew file mode 100644 index 0000000..2a03655 --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/12.png diff --git a/ffxiv/grandcompany/twin_adder/13.png b/ffxiv/grandcompany/twin_adder/13.png Binary files differnew file mode 100644 index 0000000..10c04a9 --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/13.png diff --git a/ffxiv/grandcompany/twin_adder/14.png b/ffxiv/grandcompany/twin_adder/14.png Binary files differnew file mode 100644 index 0000000..d1768ac --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/14.png diff --git a/ffxiv/grandcompany/twin_adder/15.png b/ffxiv/grandcompany/twin_adder/15.png Binary files differnew file mode 100644 index 0000000..bdf6aa8 --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/15.png diff --git a/ffxiv/grandcompany/twin_adder/16.png b/ffxiv/grandcompany/twin_adder/16.png Binary files differnew file mode 100644 index 0000000..9aeee5b --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/16.png diff --git a/ffxiv/grandcompany/twin_adder/17.png b/ffxiv/grandcompany/twin_adder/17.png Binary files differnew file mode 100644 index 0000000..68c74dd --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/17.png diff --git a/ffxiv/grandcompany/twin_adder/18.png b/ffxiv/grandcompany/twin_adder/18.png Binary files differnew file mode 100644 index 0000000..488bc32 --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/18.png diff --git a/ffxiv/grandcompany/twin_adder/19.png b/ffxiv/grandcompany/twin_adder/19.png Binary files differnew file mode 100644 index 0000000..4d4ea82 --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/19.png diff --git a/ffxiv/grandcompany/twin_adder/2.png b/ffxiv/grandcompany/twin_adder/2.png Binary files differnew file mode 100644 index 0000000..8071382 --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/2.png diff --git a/ffxiv/grandcompany/twin_adder/3.png b/ffxiv/grandcompany/twin_adder/3.png Binary files differnew file mode 100644 index 0000000..061cb1b --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/3.png diff --git a/ffxiv/grandcompany/twin_adder/4.png b/ffxiv/grandcompany/twin_adder/4.png Binary files differnew file mode 100644 index 0000000..ac0ed49 --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/4.png diff --git a/ffxiv/grandcompany/twin_adder/5.png b/ffxiv/grandcompany/twin_adder/5.png Binary files differnew file mode 100644 index 0000000..15ab299 --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/5.png diff --git a/ffxiv/grandcompany/twin_adder/6.png b/ffxiv/grandcompany/twin_adder/6.png Binary files differnew file mode 100644 index 0000000..afe37fc --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/6.png diff --git a/ffxiv/grandcompany/twin_adder/7.png b/ffxiv/grandcompany/twin_adder/7.png Binary files differnew file mode 100644 index 0000000..6c4fddb --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/7.png diff --git a/ffxiv/grandcompany/twin_adder/8.png b/ffxiv/grandcompany/twin_adder/8.png Binary files differnew file mode 100644 index 0000000..a00d446 --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/8.png diff --git a/ffxiv/grandcompany/twin_adder/9.png b/ffxiv/grandcompany/twin_adder/9.png Binary files differnew file mode 100644 index 0000000..1cb7189 --- /dev/null +++ b/ffxiv/grandcompany/twin_adder/9.png diff --git a/ffxiv/icons/alchemist.png b/ffxiv/icons/alchemist.png Binary files differnew file mode 100644 index 0000000..7f561ae --- /dev/null +++ b/ffxiv/icons/alchemist.png diff --git a/ffxiv/icons/arcanist.png b/ffxiv/icons/arcanist.png Binary files differnew file mode 100644 index 0000000..667dba7 --- /dev/null +++ b/ffxiv/icons/arcanist.png diff --git a/ffxiv/icons/archer.png b/ffxiv/icons/archer.png Binary files differnew file mode 100644 index 0000000..f0efe42 --- /dev/null +++ b/ffxiv/icons/archer.png diff --git a/ffxiv/icons/armorer.png b/ffxiv/icons/armorer.png Binary files differnew file mode 100644 index 0000000..6b02c6e --- /dev/null +++ b/ffxiv/icons/armorer.png diff --git a/ffxiv/icons/astrologian.png b/ffxiv/icons/astrologian.png Binary files differnew file mode 100644 index 0000000..0a27df2 --- /dev/null +++ b/ffxiv/icons/astrologian.png diff --git a/ffxiv/icons/bard.png b/ffxiv/icons/bard.png Binary files differnew file mode 100644 index 0000000..4c5abd5 --- /dev/null +++ b/ffxiv/icons/bard.png diff --git a/ffxiv/icons/blackmage.png b/ffxiv/icons/blackmage.png Binary files differnew file mode 100644 index 0000000..1761143 --- /dev/null +++ b/ffxiv/icons/blackmage.png diff --git a/ffxiv/icons/blacksmith.png b/ffxiv/icons/blacksmith.png Binary files differnew file mode 100644 index 0000000..792949b --- /dev/null +++ b/ffxiv/icons/blacksmith.png diff --git a/ffxiv/icons/bluemage(limitedjob).png b/ffxiv/icons/bluemage(limitedjob).png Binary files differnew file mode 100644 index 0000000..d0f442a --- /dev/null +++ b/ffxiv/icons/bluemage(limitedjob).png diff --git a/ffxiv/icons/botanist.png b/ffxiv/icons/botanist.png Binary files differnew file mode 100644 index 0000000..4d0fcb5 --- /dev/null +++ b/ffxiv/icons/botanist.png diff --git a/ffxiv/icons/carpenter.png b/ffxiv/icons/carpenter.png Binary files differnew file mode 100644 index 0000000..81e2442 --- /dev/null +++ b/ffxiv/icons/carpenter.png diff --git a/ffxiv/icons/conjurer.png b/ffxiv/icons/conjurer.png Binary files differnew file mode 100644 index 0000000..8403d1f --- /dev/null +++ b/ffxiv/icons/conjurer.png diff --git a/ffxiv/icons/culinarian.png b/ffxiv/icons/culinarian.png Binary files differnew file mode 100644 index 0000000..47a412e --- /dev/null +++ b/ffxiv/icons/culinarian.png diff --git a/ffxiv/icons/dancer.png b/ffxiv/icons/dancer.png Binary files differnew file mode 100644 index 0000000..8a24468 --- /dev/null +++ b/ffxiv/icons/dancer.png diff --git a/ffxiv/icons/darkknight.png b/ffxiv/icons/darkknight.png Binary files differnew file mode 100644 index 0000000..335dac6 --- /dev/null +++ b/ffxiv/icons/darkknight.png diff --git a/ffxiv/icons/dragoon.png b/ffxiv/icons/dragoon.png Binary files differnew file mode 100644 index 0000000..3dd0f8c --- /dev/null +++ b/ffxiv/icons/dragoon.png diff --git a/ffxiv/icons/fisher.png b/ffxiv/icons/fisher.png Binary files differnew file mode 100644 index 0000000..e44bdd2 --- /dev/null +++ b/ffxiv/icons/fisher.png diff --git a/ffxiv/icons/gladiator.png b/ffxiv/icons/gladiator.png Binary files differnew file mode 100644 index 0000000..d7d91e9 --- /dev/null +++ b/ffxiv/icons/gladiator.png diff --git a/ffxiv/icons/goldsmith.png b/ffxiv/icons/goldsmith.png Binary files differnew file mode 100644 index 0000000..fcfe48f --- /dev/null +++ b/ffxiv/icons/goldsmith.png diff --git a/ffxiv/icons/gunbreaker.png b/ffxiv/icons/gunbreaker.png Binary files differnew file mode 100644 index 0000000..66a8937 --- /dev/null +++ b/ffxiv/icons/gunbreaker.png diff --git a/ffxiv/icons/lancer.png b/ffxiv/icons/lancer.png Binary files differnew file mode 100644 index 0000000..f88670e --- /dev/null +++ b/ffxiv/icons/lancer.png diff --git a/ffxiv/icons/leatherworker.png b/ffxiv/icons/leatherworker.png Binary files differnew file mode 100644 index 0000000..c69175e --- /dev/null +++ b/ffxiv/icons/leatherworker.png diff --git a/ffxiv/icons/machinist.png b/ffxiv/icons/machinist.png Binary files differnew file mode 100644 index 0000000..2f8898a --- /dev/null +++ b/ffxiv/icons/machinist.png diff --git a/ffxiv/icons/marauder.png b/ffxiv/icons/marauder.png Binary files differnew file mode 100644 index 0000000..013169b --- /dev/null +++ b/ffxiv/icons/marauder.png diff --git a/ffxiv/icons/miner.png b/ffxiv/icons/miner.png Binary files differnew file mode 100644 index 0000000..01f6453 --- /dev/null +++ b/ffxiv/icons/miner.png diff --git a/ffxiv/icons/monk.png b/ffxiv/icons/monk.png Binary files differnew file mode 100644 index 0000000..9b57649 --- /dev/null +++ b/ffxiv/icons/monk.png diff --git a/ffxiv/icons/ninja.png b/ffxiv/icons/ninja.png Binary files differnew file mode 100644 index 0000000..95ecde9 --- /dev/null +++ b/ffxiv/icons/ninja.png diff --git a/ffxiv/icons/paladin.png b/ffxiv/icons/paladin.png Binary files differnew file mode 100644 index 0000000..3833f61 --- /dev/null +++ b/ffxiv/icons/paladin.png diff --git a/ffxiv/icons/pugilist.png b/ffxiv/icons/pugilist.png Binary files differnew file mode 100644 index 0000000..9570442 --- /dev/null +++ b/ffxiv/icons/pugilist.png diff --git a/ffxiv/icons/redmage.png b/ffxiv/icons/redmage.png Binary files differnew file mode 100644 index 0000000..cd7a53a --- /dev/null +++ b/ffxiv/icons/redmage.png diff --git a/ffxiv/icons/rogue.png b/ffxiv/icons/rogue.png Binary files differnew file mode 100644 index 0000000..05af990 --- /dev/null +++ b/ffxiv/icons/rogue.png diff --git a/ffxiv/icons/role_dps_magic.png b/ffxiv/icons/role_dps_magic.png Binary files differnew file mode 100644 index 0000000..01cebf8 --- /dev/null +++ b/ffxiv/icons/role_dps_magic.png diff --git a/ffxiv/icons/role_dps_melee.png b/ffxiv/icons/role_dps_melee.png Binary files differnew file mode 100644 index 0000000..3a4af90 --- /dev/null +++ b/ffxiv/icons/role_dps_melee.png diff --git a/ffxiv/icons/role_dps_ranged.png b/ffxiv/icons/role_dps_ranged.png Binary files differnew file mode 100644 index 0000000..e331709 --- /dev/null +++ b/ffxiv/icons/role_dps_ranged.png diff --git a/ffxiv/icons/role_hand.png b/ffxiv/icons/role_hand.png Binary files differnew file mode 100644 index 0000000..db60614 --- /dev/null +++ b/ffxiv/icons/role_hand.png diff --git a/ffxiv/icons/role_healer.png b/ffxiv/icons/role_healer.png Binary files differnew file mode 100644 index 0000000..224a383 --- /dev/null +++ b/ffxiv/icons/role_healer.png diff --git a/ffxiv/icons/role_land.png b/ffxiv/icons/role_land.png Binary files differnew file mode 100644 index 0000000..d0c2b49 --- /dev/null +++ b/ffxiv/icons/role_land.png diff --git a/ffxiv/icons/role_tank.png b/ffxiv/icons/role_tank.png Binary files differnew file mode 100644 index 0000000..fd80c75 --- /dev/null +++ b/ffxiv/icons/role_tank.png diff --git a/ffxiv/icons/samurai.png b/ffxiv/icons/samurai.png Binary files differnew file mode 100644 index 0000000..1b3d843 --- /dev/null +++ b/ffxiv/icons/samurai.png diff --git a/ffxiv/icons/scholar.png b/ffxiv/icons/scholar.png Binary files differnew file mode 100644 index 0000000..62a151c --- /dev/null +++ b/ffxiv/icons/scholar.png diff --git a/ffxiv/icons/summoner.png b/ffxiv/icons/summoner.png Binary files differnew file mode 100644 index 0000000..f5d35dc --- /dev/null +++ b/ffxiv/icons/summoner.png diff --git a/ffxiv/icons/thaumaturge.png b/ffxiv/icons/thaumaturge.png Binary files differnew file mode 100644 index 0000000..c34456f --- /dev/null +++ b/ffxiv/icons/thaumaturge.png diff --git a/ffxiv/icons/warrior.png b/ffxiv/icons/warrior.png Binary files differnew file mode 100644 index 0000000..c928b75 --- /dev/null +++ b/ffxiv/icons/warrior.png diff --git a/ffxiv/icons/weaver.png b/ffxiv/icons/weaver.png Binary files differnew file mode 100644 index 0000000..1b0e815 --- /dev/null +++ b/ffxiv/icons/weaver.png diff --git a/ffxiv/icons/whitemage.png b/ffxiv/icons/whitemage.png Binary files differnew file mode 100644 index 0000000..c63e504 --- /dev/null +++ b/ffxiv/icons/whitemage.png diff --git a/ffxiv/jobs/alchemist.png b/ffxiv/jobs/alchemist.png Binary files differnew file mode 100644 index 0000000..7f561ae --- /dev/null +++ b/ffxiv/jobs/alchemist.png diff --git a/ffxiv/jobs/arcanist.png b/ffxiv/jobs/arcanist.png Binary files differnew file mode 100644 index 0000000..667dba7 --- /dev/null +++ b/ffxiv/jobs/arcanist.png diff --git a/ffxiv/jobs/archer.png b/ffxiv/jobs/archer.png Binary files differnew file mode 100644 index 0000000..f0efe42 --- /dev/null +++ b/ffxiv/jobs/archer.png diff --git a/ffxiv/jobs/armorer.png b/ffxiv/jobs/armorer.png Binary files differnew file mode 100644 index 0000000..6b02c6e --- /dev/null +++ b/ffxiv/jobs/armorer.png diff --git a/ffxiv/jobs/astrologian.png b/ffxiv/jobs/astrologian.png Binary files differnew file mode 100644 index 0000000..0a27df2 --- /dev/null +++ b/ffxiv/jobs/astrologian.png diff --git a/ffxiv/jobs/bard.png b/ffxiv/jobs/bard.png Binary files differnew file mode 100644 index 0000000..4c5abd5 --- /dev/null +++ b/ffxiv/jobs/bard.png diff --git a/ffxiv/jobs/blackmage.png b/ffxiv/jobs/blackmage.png Binary files differnew file mode 100644 index 0000000..1761143 --- /dev/null +++ b/ffxiv/jobs/blackmage.png diff --git a/ffxiv/jobs/blacksmith.png b/ffxiv/jobs/blacksmith.png Binary files differnew file mode 100644 index 0000000..792949b --- /dev/null +++ b/ffxiv/jobs/blacksmith.png diff --git a/ffxiv/jobs/bluemage(limitedjob).png b/ffxiv/jobs/bluemage(limitedjob).png Binary files differnew file mode 100644 index 0000000..d0f442a --- /dev/null +++ b/ffxiv/jobs/bluemage(limitedjob).png diff --git a/ffxiv/jobs/bluemage.png b/ffxiv/jobs/bluemage.png Binary files differnew file mode 100644 index 0000000..d0f442a --- /dev/null +++ b/ffxiv/jobs/bluemage.png diff --git a/ffxiv/jobs/botanist.png b/ffxiv/jobs/botanist.png Binary files differnew file mode 100644 index 0000000..4d0fcb5 --- /dev/null +++ b/ffxiv/jobs/botanist.png diff --git a/ffxiv/jobs/carpenter.png b/ffxiv/jobs/carpenter.png Binary files differnew file mode 100644 index 0000000..81e2442 --- /dev/null +++ b/ffxiv/jobs/carpenter.png diff --git a/ffxiv/jobs/conjurer.png b/ffxiv/jobs/conjurer.png Binary files differnew file mode 100644 index 0000000..8403d1f --- /dev/null +++ b/ffxiv/jobs/conjurer.png diff --git a/ffxiv/jobs/culinarian.png b/ffxiv/jobs/culinarian.png Binary files differnew file mode 100644 index 0000000..47a412e --- /dev/null +++ b/ffxiv/jobs/culinarian.png diff --git a/ffxiv/jobs/dancer.png b/ffxiv/jobs/dancer.png Binary files differnew file mode 100644 index 0000000..8a24468 --- /dev/null +++ b/ffxiv/jobs/dancer.png diff --git a/ffxiv/jobs/darkknight.png b/ffxiv/jobs/darkknight.png Binary files differnew file mode 100644 index 0000000..335dac6 --- /dev/null +++ b/ffxiv/jobs/darkknight.png diff --git a/ffxiv/jobs/dragoon.png b/ffxiv/jobs/dragoon.png Binary files differnew file mode 100644 index 0000000..3dd0f8c --- /dev/null +++ b/ffxiv/jobs/dragoon.png diff --git a/ffxiv/jobs/fisher.png b/ffxiv/jobs/fisher.png Binary files differnew file mode 100644 index 0000000..e44bdd2 --- /dev/null +++ b/ffxiv/jobs/fisher.png diff --git a/ffxiv/jobs/gladiator.png b/ffxiv/jobs/gladiator.png Binary files differnew file mode 100644 index 0000000..d7d91e9 --- /dev/null +++ b/ffxiv/jobs/gladiator.png diff --git a/ffxiv/jobs/goldsmith.png b/ffxiv/jobs/goldsmith.png Binary files differnew file mode 100644 index 0000000..fcfe48f --- /dev/null +++ b/ffxiv/jobs/goldsmith.png diff --git a/ffxiv/jobs/gunbreaker.png b/ffxiv/jobs/gunbreaker.png Binary files differnew file mode 100644 index 0000000..66a8937 --- /dev/null +++ b/ffxiv/jobs/gunbreaker.png diff --git a/ffxiv/jobs/lancer.png b/ffxiv/jobs/lancer.png Binary files differnew file mode 100644 index 0000000..f88670e --- /dev/null +++ b/ffxiv/jobs/lancer.png diff --git a/ffxiv/jobs/leatherworker.png b/ffxiv/jobs/leatherworker.png Binary files differnew file mode 100644 index 0000000..c69175e --- /dev/null +++ b/ffxiv/jobs/leatherworker.png diff --git a/ffxiv/jobs/machinist.png b/ffxiv/jobs/machinist.png Binary files differnew file mode 100644 index 0000000..2f8898a --- /dev/null +++ b/ffxiv/jobs/machinist.png diff --git a/ffxiv/jobs/marauder.png b/ffxiv/jobs/marauder.png Binary files differnew file mode 100644 index 0000000..013169b --- /dev/null +++ b/ffxiv/jobs/marauder.png diff --git a/ffxiv/jobs/miner.png b/ffxiv/jobs/miner.png Binary files differnew file mode 100644 index 0000000..01f6453 --- /dev/null +++ b/ffxiv/jobs/miner.png diff --git a/ffxiv/jobs/monk.png b/ffxiv/jobs/monk.png Binary files differnew file mode 100644 index 0000000..9b57649 --- /dev/null +++ b/ffxiv/jobs/monk.png diff --git a/ffxiv/jobs/ninja.png b/ffxiv/jobs/ninja.png Binary files differnew file mode 100644 index 0000000..95ecde9 --- /dev/null +++ b/ffxiv/jobs/ninja.png diff --git a/ffxiv/jobs/paladin.png b/ffxiv/jobs/paladin.png Binary files differnew file mode 100644 index 0000000..3833f61 --- /dev/null +++ b/ffxiv/jobs/paladin.png diff --git a/ffxiv/jobs/pugilist.png b/ffxiv/jobs/pugilist.png Binary files differnew file mode 100644 index 0000000..9570442 --- /dev/null +++ b/ffxiv/jobs/pugilist.png diff --git a/ffxiv/jobs/reaper.png b/ffxiv/jobs/reaper.png Binary files differnew file mode 100644 index 0000000..b3dfafc --- /dev/null +++ b/ffxiv/jobs/reaper.png diff --git a/ffxiv/jobs/redmage.png b/ffxiv/jobs/redmage.png Binary files differnew file mode 100644 index 0000000..cd7a53a --- /dev/null +++ b/ffxiv/jobs/redmage.png diff --git a/ffxiv/jobs/rogue.png b/ffxiv/jobs/rogue.png Binary files differnew file mode 100644 index 0000000..05af990 --- /dev/null +++ b/ffxiv/jobs/rogue.png diff --git a/ffxiv/jobs/sage.png b/ffxiv/jobs/sage.png Binary files differnew file mode 100644 index 0000000..dbceb24 --- /dev/null +++ b/ffxiv/jobs/sage.png diff --git a/ffxiv/jobs/samurai.png b/ffxiv/jobs/samurai.png Binary files differnew file mode 100644 index 0000000..1b3d843 --- /dev/null +++ b/ffxiv/jobs/samurai.png diff --git a/ffxiv/jobs/scholar.png b/ffxiv/jobs/scholar.png Binary files differnew file mode 100644 index 0000000..62a151c --- /dev/null +++ b/ffxiv/jobs/scholar.png diff --git a/ffxiv/jobs/summoner.png b/ffxiv/jobs/summoner.png Binary files differnew file mode 100644 index 0000000..f5d35dc --- /dev/null +++ b/ffxiv/jobs/summoner.png diff --git a/ffxiv/jobs/thaumaturge.png b/ffxiv/jobs/thaumaturge.png Binary files differnew file mode 100644 index 0000000..c34456f --- /dev/null +++ b/ffxiv/jobs/thaumaturge.png diff --git a/ffxiv/jobs/warrior.png b/ffxiv/jobs/warrior.png Binary files differnew file mode 100644 index 0000000..c928b75 --- /dev/null +++ b/ffxiv/jobs/warrior.png diff --git a/ffxiv/jobs/weaver.png b/ffxiv/jobs/weaver.png Binary files differnew file mode 100644 index 0000000..1b0e815 --- /dev/null +++ b/ffxiv/jobs/weaver.png diff --git a/ffxiv/jobs/whitemage.png b/ffxiv/jobs/whitemage.png Binary files differnew file mode 100644 index 0000000..c63e504 --- /dev/null +++ b/ffxiv/jobs/whitemage.png diff --git a/ffxiv/jobs_plain/alchemist.png b/ffxiv/jobs_plain/alchemist.png Binary files differnew file mode 100644 index 0000000..1c2f9cc --- /dev/null +++ b/ffxiv/jobs_plain/alchemist.png diff --git a/ffxiv/jobs_plain/arcanist.png b/ffxiv/jobs_plain/arcanist.png Binary files differnew file mode 100644 index 0000000..1c9e9a0 --- /dev/null +++ b/ffxiv/jobs_plain/arcanist.png diff --git a/ffxiv/jobs_plain/archer.png b/ffxiv/jobs_plain/archer.png Binary files differnew file mode 100644 index 0000000..be2a860 --- /dev/null +++ b/ffxiv/jobs_plain/archer.png diff --git a/ffxiv/jobs_plain/armorer.png b/ffxiv/jobs_plain/armorer.png Binary files differnew file mode 100644 index 0000000..451ea5c --- /dev/null +++ b/ffxiv/jobs_plain/armorer.png diff --git a/ffxiv/jobs_plain/astrologian.png b/ffxiv/jobs_plain/astrologian.png Binary files differnew file mode 100644 index 0000000..f639782 --- /dev/null +++ b/ffxiv/jobs_plain/astrologian.png diff --git a/ffxiv/jobs_plain/bard.png b/ffxiv/jobs_plain/bard.png Binary files differnew file mode 100644 index 0000000..fd5a952 --- /dev/null +++ b/ffxiv/jobs_plain/bard.png diff --git a/ffxiv/jobs_plain/black mage.png b/ffxiv/jobs_plain/black mage.png Binary files differnew file mode 100644 index 0000000..1774842 --- /dev/null +++ b/ffxiv/jobs_plain/black mage.png diff --git a/ffxiv/jobs_plain/blackmage.png b/ffxiv/jobs_plain/blackmage.png Binary files differnew file mode 100644 index 0000000..1774842 --- /dev/null +++ b/ffxiv/jobs_plain/blackmage.png diff --git a/ffxiv/jobs_plain/blacksmith.png b/ffxiv/jobs_plain/blacksmith.png Binary files differnew file mode 100644 index 0000000..6a5cefa --- /dev/null +++ b/ffxiv/jobs_plain/blacksmith.png diff --git a/ffxiv/jobs_plain/blue mage (limited job).png b/ffxiv/jobs_plain/blue mage (limited job).png Binary files differnew file mode 100644 index 0000000..8feadf3 --- /dev/null +++ b/ffxiv/jobs_plain/blue mage (limited job).png diff --git a/ffxiv/jobs_plain/bluemage(limitedjob).png b/ffxiv/jobs_plain/bluemage(limitedjob).png Binary files differnew file mode 100644 index 0000000..8feadf3 --- /dev/null +++ b/ffxiv/jobs_plain/bluemage(limitedjob).png diff --git a/ffxiv/jobs_plain/botanist.png b/ffxiv/jobs_plain/botanist.png Binary files differnew file mode 100644 index 0000000..023b75f --- /dev/null +++ b/ffxiv/jobs_plain/botanist.png diff --git a/ffxiv/jobs_plain/carpenter.png b/ffxiv/jobs_plain/carpenter.png Binary files differnew file mode 100644 index 0000000..4e459bc --- /dev/null +++ b/ffxiv/jobs_plain/carpenter.png diff --git a/ffxiv/jobs_plain/conjurer.png b/ffxiv/jobs_plain/conjurer.png Binary files differnew file mode 100644 index 0000000..8b7bc3d --- /dev/null +++ b/ffxiv/jobs_plain/conjurer.png diff --git a/ffxiv/jobs_plain/culinarian.png b/ffxiv/jobs_plain/culinarian.png Binary files differnew file mode 100644 index 0000000..4aeef51 --- /dev/null +++ b/ffxiv/jobs_plain/culinarian.png diff --git a/ffxiv/jobs_plain/dancer.png b/ffxiv/jobs_plain/dancer.png Binary files differnew file mode 100644 index 0000000..29f1e20 --- /dev/null +++ b/ffxiv/jobs_plain/dancer.png diff --git a/ffxiv/jobs_plain/dark knight.png b/ffxiv/jobs_plain/dark knight.png Binary files differnew file mode 100644 index 0000000..4aa7220 --- /dev/null +++ b/ffxiv/jobs_plain/dark knight.png diff --git a/ffxiv/jobs_plain/darkknight.png b/ffxiv/jobs_plain/darkknight.png Binary files differnew file mode 100644 index 0000000..4aa7220 --- /dev/null +++ b/ffxiv/jobs_plain/darkknight.png diff --git a/ffxiv/jobs_plain/dragoon.png b/ffxiv/jobs_plain/dragoon.png Binary files differnew file mode 100644 index 0000000..9d826b9 --- /dev/null +++ b/ffxiv/jobs_plain/dragoon.png diff --git a/ffxiv/jobs_plain/fisher.png b/ffxiv/jobs_plain/fisher.png Binary files differnew file mode 100644 index 0000000..70ad8a5 --- /dev/null +++ b/ffxiv/jobs_plain/fisher.png diff --git a/ffxiv/jobs_plain/gladiator.png b/ffxiv/jobs_plain/gladiator.png Binary files differnew file mode 100644 index 0000000..1daa67f --- /dev/null +++ b/ffxiv/jobs_plain/gladiator.png diff --git a/ffxiv/jobs_plain/goldsmith.png b/ffxiv/jobs_plain/goldsmith.png Binary files differnew file mode 100644 index 0000000..96afc1b --- /dev/null +++ b/ffxiv/jobs_plain/goldsmith.png diff --git a/ffxiv/jobs_plain/gunbreaker.png b/ffxiv/jobs_plain/gunbreaker.png Binary files differnew file mode 100644 index 0000000..022e9c3 --- /dev/null +++ b/ffxiv/jobs_plain/gunbreaker.png diff --git a/ffxiv/jobs_plain/lancer.png b/ffxiv/jobs_plain/lancer.png Binary files differnew file mode 100644 index 0000000..a331f3f --- /dev/null +++ b/ffxiv/jobs_plain/lancer.png diff --git a/ffxiv/jobs_plain/machinist.png b/ffxiv/jobs_plain/machinist.png Binary files differnew file mode 100644 index 0000000..96b5331 --- /dev/null +++ b/ffxiv/jobs_plain/machinist.png diff --git a/ffxiv/jobs_plain/marauder.png b/ffxiv/jobs_plain/marauder.png Binary files differnew file mode 100644 index 0000000..6f6c546 --- /dev/null +++ b/ffxiv/jobs_plain/marauder.png diff --git a/ffxiv/jobs_plain/miner.png b/ffxiv/jobs_plain/miner.png Binary files differnew file mode 100644 index 0000000..c2e823a --- /dev/null +++ b/ffxiv/jobs_plain/miner.png diff --git a/ffxiv/jobs_plain/monk.png b/ffxiv/jobs_plain/monk.png Binary files differnew file mode 100644 index 0000000..21f33b3 --- /dev/null +++ b/ffxiv/jobs_plain/monk.png diff --git a/ffxiv/jobs_plain/ninja.png b/ffxiv/jobs_plain/ninja.png Binary files differnew file mode 100644 index 0000000..7437214 --- /dev/null +++ b/ffxiv/jobs_plain/ninja.png diff --git a/ffxiv/jobs_plain/paladin.png b/ffxiv/jobs_plain/paladin.png Binary files differnew file mode 100644 index 0000000..46c4906 --- /dev/null +++ b/ffxiv/jobs_plain/paladin.png diff --git a/ffxiv/jobs_plain/pugilist.png b/ffxiv/jobs_plain/pugilist.png Binary files differnew file mode 100644 index 0000000..52b25a2 --- /dev/null +++ b/ffxiv/jobs_plain/pugilist.png diff --git a/ffxiv/jobs_plain/reaper.png b/ffxiv/jobs_plain/reaper.png Binary files differnew file mode 100644 index 0000000..19dd72e --- /dev/null +++ b/ffxiv/jobs_plain/reaper.png diff --git a/ffxiv/jobs_plain/red mage.png b/ffxiv/jobs_plain/red mage.png Binary files differnew file mode 100644 index 0000000..3d23aae --- /dev/null +++ b/ffxiv/jobs_plain/red mage.png diff --git a/ffxiv/jobs_plain/redmage.png b/ffxiv/jobs_plain/redmage.png Binary files differnew file mode 100644 index 0000000..3d23aae --- /dev/null +++ b/ffxiv/jobs_plain/redmage.png diff --git a/ffxiv/jobs_plain/rogue.png b/ffxiv/jobs_plain/rogue.png Binary files differnew file mode 100644 index 0000000..a3979b8 --- /dev/null +++ b/ffxiv/jobs_plain/rogue.png diff --git a/ffxiv/jobs_plain/sage.png b/ffxiv/jobs_plain/sage.png Binary files differnew file mode 100644 index 0000000..72750df --- /dev/null +++ b/ffxiv/jobs_plain/sage.png diff --git a/ffxiv/jobs_plain/samurai.png b/ffxiv/jobs_plain/samurai.png Binary files differnew file mode 100644 index 0000000..9b66bfc --- /dev/null +++ b/ffxiv/jobs_plain/samurai.png diff --git a/ffxiv/jobs_plain/scholar.png b/ffxiv/jobs_plain/scholar.png Binary files differnew file mode 100644 index 0000000..9eb4bc6 --- /dev/null +++ b/ffxiv/jobs_plain/scholar.png diff --git a/ffxiv/jobs_plain/summoner.png b/ffxiv/jobs_plain/summoner.png Binary files differnew file mode 100644 index 0000000..29720a1 --- /dev/null +++ b/ffxiv/jobs_plain/summoner.png diff --git a/ffxiv/jobs_plain/warrior.png b/ffxiv/jobs_plain/warrior.png Binary files differnew file mode 100644 index 0000000..ea6b984 --- /dev/null +++ b/ffxiv/jobs_plain/warrior.png diff --git a/ffxiv/jobs_plain/weaver.png b/ffxiv/jobs_plain/weaver.png Binary files differnew file mode 100644 index 0000000..c7ce479 --- /dev/null +++ b/ffxiv/jobs_plain/weaver.png diff --git a/ffxiv/jobs_plain/white mage.png b/ffxiv/jobs_plain/white mage.png Binary files differnew file mode 100644 index 0000000..0fa86b9 --- /dev/null +++ b/ffxiv/jobs_plain/white mage.png diff --git a/ffxiv/jobs_plain/whitemage.png b/ffxiv/jobs_plain/whitemage.png Binary files differnew file mode 100644 index 0000000..0fa86b9 --- /dev/null +++ b/ffxiv/jobs_plain/whitemage.png diff --git a/ffxiv/lodestone-css-selectors-0.46.0/LICENSE b/ffxiv/lodestone-css-selectors-0.46.0/LICENSE new file mode 100644 index 0000000..fdddb29 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to <https://unlicense.org> diff --git a/ffxiv/lodestone-css-selectors-0.46.0/README.md b/ffxiv/lodestone-css-selectors-0.46.0/README.md new file mode 100644 index 0000000..da1fd4b --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/README.md @@ -0,0 +1,26 @@ +# lodestone-css-selectors +CSS selectors for The Lodestone. These selectors are all made for non-browser clients; they may break in various browsers +due to DOM elements being injected by the browser itself. Please test them in a parser before reporting any errors. + +## Character Profile +Do note that in Firefox, some page elements are slightly different from in other browsers. Use no user agent or try the provided ones in `meta.json`. + +### Character info (`profile/character.json`) +Basic character data is on the main profile page. + +### Attributes (`profile/attributes.json`) +Attribute data is on the main profile page. + +### Gearset (`profile/gearset.json`) +Gearset data is on the main profile page. + +### Classjobs (`profile/classjob.json`) +Classjob data is on the `/class_job` endpoint. + +### Mounts/Minions (`profile/minion.json` and `profile/mount.json`) +Mount and minion data are on their own `/mount` and `/minion` endpoints, and need to be scraped using a mobile user agent. With a desktop UA, the mount/minion names are +injected into the page with AJAX, and separate requests need to be made to get every single one. + +### Achievements (`profile/achievements.json`) +Achievements are on the `/achievement` endpoint. Use the list selector to get the list of achievements on the page, and then get their IDs from the `href` attribute +of the link. Use the next button's selector to request the next page and scrape the next set of achievements until the href is `javascript:void(0);`. diff --git a/ffxiv/lodestone-css-selectors-0.46.0/cwls/cwls.json b/ffxiv/lodestone-css-selectors-0.46.0/cwls/cwls.json new file mode 100644 index 0000000..4c4b007 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/cwls/cwls.json @@ -0,0 +1,9 @@ +{ + "NAME": { + "selector": ".heading__linkshell__name", + "regex": "\\s*(?P<Name>\\S*)" + }, + "DC": { + "selector": ".heading__cwls__dcname" + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/cwls/members.json b/ffxiv/lodestone-css-selectors-0.46.0/cwls/members.json new file mode 100644 index 0000000..4c86578 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/cwls/members.json @@ -0,0 +1,51 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "AVATAR": { + "selector": ".entry__chara__face img", + "attribute": "src" + }, + "ID": { + "selector": ".entry__link", + "attribute": "href", + "regex": "/lodestone/character/(?P<ID>\\d*)/" + }, + "NAME": { + "selector": ".entry__name" + }, + "RANK": { + "selector": ".entry__chara_info > .js__tooltip", + "attribute": "data-tooltip", + "regex": "/ (?P<RankName>.+)" + }, + "RANK_ICON": { + "selector": ".entry__chara_info > .js__tooltip > img", + "attribute": "src" + }, + "LINKSHELL_RANK": { + "selector": ".entry__chara_info__linkshell > span" + }, + "LINKSHELL_RANK_ICON": { + "selector": ".entry__chara_info__linkshell > img", + "attribute": "src" + }, + "SERVER": { + "selector": ".entry__world", + "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(5) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager:nth-child(5) > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/freecompany/focus.json b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/focus.json new file mode 100644 index 0000000..44850be --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/focus.json @@ -0,0 +1,131 @@ +{ + "NOT_SPECIFIED": { + "selector": "p.freecompany__text:nth-child(7)" + }, + "RP": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(1) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(1) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(1)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "LEVELING": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(2) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "CASUAL": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "HARDCORE": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(4) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(4) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(4)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "DUNGEONS": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(5) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(5) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(5)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "GUILDHESTS": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(6) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(6) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(6)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "TRIALS": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(7) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(7) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(7)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "RAIDS": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(8) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(8) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(8)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "PVP": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(9) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(9) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(9)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/freecompany/freecompany.json b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/freecompany.json new file mode 100644 index 0000000..2ac1048 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/freecompany.json @@ -0,0 +1,80 @@ +{ + "ACTIVE_STATE": { + "selector": "p.freecompany__text:nth-child(3)", + "regex": "\\s*(?P<ActiveState>\\S+\\s?\\S*)" + }, + "ACTIVE_MEMBER_COUNT": { + "selector": "p.freecompany__text:nth-child(12)" + }, + "CREST_LAYERS": { + "BOTTOM": { + "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > img:nth-child(1)", + "attribute": "src" + }, + "MIDDLE": { + "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > img:nth-child(2)", + "attribute": "src" + }, + "TOP": { + "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > img:nth-child(3)", + "attribute": "src" + } + }, + "ESTATE": { + "NO_ESTATE": { + "selector": ".freecompany__estate__none" + }, + "GREETING": { + "selector": ".freecompany__estate__greeting" + }, + "NAME": { + "selector": ".freecompany__estate__name" + }, + "PLOT": { + "selector": ".freecompany__estate__text" + } + }, + "FORMED": { + "selector": "p.freecompany__text:nth-child(10) > script", + "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)" + }, + "GRAND_COMPANY": { + "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(2) > p:nth-child(1)", + "regex": "(?P<Name>\\w.*)<(?P<Rank>\\w*)>" + }, + "ID": { + "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1)", + "attribute": "href", + "regex": "/lodestone/freecompany/(?P<ID>\\d*)/" + }, + "NAME": { + "selector": ".freecompany__text__name" + }, + "RANK": { + "selector": "p.freecompany__text:nth-child(14)" + }, + "RANKING": { + "WEEKLY": { + "selector": ".character__ranking__data tr:nth-child(1) > th:nth-child(1)", + "regex": "Weekly Rank:(?P<Rank>.+) \\(previous week\\)" + }, + "MONTHLY": { + "selector": ".character__ranking__data tr:nth-child(2) > th:nth-child(1)", + "regex": "Monthly Rank:(?P<Rank>.*) \\(previous month\\)" + } + }, + "RECRUITMENT": { + "selector": "p.freecompany__text:nth-child(5)", + "regex": "\\s*(?P<ActiveState>\\S*)" + }, + "SERVER": { + "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(2) > p:nth-child(3)", + "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)" + }, + "SLOGAN": { + "selector": ".freecompany__text__message" + }, + "TAG": { + "selector": ".freecompany__text.freecompany__text__tag" + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/freecompany/members.json b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/members.json new file mode 100644 index 0000000..0723bc5 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/members.json @@ -0,0 +1,44 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "li.entry", + "multiple": true + }, + "AVATAR": { + "selector": ".entry__chara__face > img", + "attribute": "src" + }, + "ID": { + "selector": ".entry__bg", + "attribute": "href", + "regex": "/lodestone/character/(?P<ID>\\d*)/" + }, + "NAME": { + "selector": ".entry__name" + }, + "RANK": { + "selector": ".entry__freecompany__info > .js__tooltip", + "attribute": "data-tooltip", + "regex": "/ (?P<RankName>.+)" + }, + "RANK_ICON": { + "selector": ".entry__freecompany__info > .js__tooltip > img", + "attribute": "src" + }, + "SERVER": { + "selector": ".entry__world", + "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(4) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager:nth-child(4) > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/freecompany/reputation.json b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/reputation.json new file mode 100644 index 0000000..c88df40 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/reputation.json @@ -0,0 +1,41 @@ +{ + "MAELSTROM": { + "NAME": { + "selector": "div.freecompany__reputation:nth-child(16) > div:nth-child(2) > p:nth-child(1)" + }, + "PROGRESS": { + "selector": "div.freecompany__reputation:nth-child(16) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)", + "attribute": "style", + "regex": "width:(?P<Progress>\\d+)%;" + }, + "RANK": { + "selector": "div.freecompany__reputation:nth-child(16) > div:nth-child(2) > p:nth-child(2)" + } + }, + "ADDERS": { + "NAME": { + "selector": "div.freecompany__reputation:nth-child(17) > div:nth-child(2) > p:nth-child(1)" + }, + "PROGRESS": { + "selector": "div.freecompany__reputation:nth-child(17) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)", + "attribute": "style", + "regex": "width:(?P<Progress>\\d+)%;" + }, + "RANK": { + "selector": "div.freecompany__reputation:nth-child(17) > div:nth-child(2) > p:nth-child(2)" + } + }, + "FLAMES": { + "NAME": { + "selector": "div.freecompany__reputation:nth-child(18) > div:nth-child(2) > p:nth-child(1)" + }, + "PROGRESS": { + "selector": "div.freecompany__reputation:nth-child(18) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)", + "attribute": "style", + "regex": "width:(?P<Progress>\\d+)%;" + }, + "RANK": { + "selector": "div.freecompany__reputation:nth-child(18) > div:nth-child(2) > p:nth-child(2)" + } + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/freecompany/seeking.json b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/seeking.json new file mode 100644 index 0000000..164c01a --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/seeking.json @@ -0,0 +1,75 @@ +{ + "NOT_SPECIFIED": { + "selector": "p.parts__text:nth-child(9)" + }, + "TANK": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(1) > p:nth-child(2)" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(1)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(1) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + } + }, + "HEALER": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(2) > p:nth-child(2)" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(2)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(2) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + } + }, + "DPS": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(3) > p:nth-child(2)" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(3)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(3) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + } + }, + "CRAFTER": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(4) > p:nth-child(2)" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(4)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(4) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + } + }, + "GATHERER": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(5) > p:nth-child(2)" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(5)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(5) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + } + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/linkshell/ls.json b/ffxiv/lodestone-css-selectors-0.46.0/linkshell/ls.json new file mode 100644 index 0000000..c33ccb5 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/linkshell/ls.json @@ -0,0 +1,5 @@ +{ + "NAME": { + "selector": ".heading__linkshell__name" + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/linkshell/members.json b/ffxiv/lodestone-css-selectors-0.46.0/linkshell/members.json new file mode 100644 index 0000000..4c86578 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/linkshell/members.json @@ -0,0 +1,51 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "AVATAR": { + "selector": ".entry__chara__face img", + "attribute": "src" + }, + "ID": { + "selector": ".entry__link", + "attribute": "href", + "regex": "/lodestone/character/(?P<ID>\\d*)/" + }, + "NAME": { + "selector": ".entry__name" + }, + "RANK": { + "selector": ".entry__chara_info > .js__tooltip", + "attribute": "data-tooltip", + "regex": "/ (?P<RankName>.+)" + }, + "RANK_ICON": { + "selector": ".entry__chara_info > .js__tooltip > img", + "attribute": "src" + }, + "LINKSHELL_RANK": { + "selector": ".entry__chara_info__linkshell > span" + }, + "LINKSHELL_RANK_ICON": { + "selector": ".entry__chara_info__linkshell > img", + "attribute": "src" + }, + "SERVER": { + "selector": ".entry__world", + "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(5) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager:nth-child(5) > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/meta.json b/ffxiv/lodestone-css-selectors-0.46.0/meta.json new file mode 100644 index 0000000..1ed21fd --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/meta.json @@ -0,0 +1,35 @@ +{ + "version": "0.45.0", + "userAgentDesktop": "curl/7.73.0", + "userAgentMobile": "Mozilla/5.0 (iPhone; CPU OS 10_15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Mobile/14E304 Safari/605.1.15", + "applicableUris": { + "freecompany/focus.json": "https://{region}.finalfantasyxiv.com/lodestone/freecompany/%s/", + "freecompany/freecompany.json": "https://{region}.finalfantasyxiv.com/lodestone/freecompany/%s/", + "freecompany/members.json": "https://{region}.finalfantasyxiv.com/lodestone/freecompany/%s/member/", + "freecompany/reputation.json": "https://{region}.finalfantasyxiv.com/lodestone/freecompany/%s/", + "freecompany/seeking.json": "https://{region}.finalfantasyxiv.com/lodestone/freecompany/%s/", + + "cwls/cwls.json": "https://{region}.finalfantasyxiv.com/lodestone/crossworld_linkshell/%s/", + "cwls/members.json": "https://{region}.finalfantasyxiv.com/lodestone/crossworld_linkshell/%s/", + + "linkshell/ls.json": "https://{region}.finalfantasyxiv.com/lodestone/linkshell/%s/", + "linkshell/members.json": "https://{region}.finalfantasyxiv.com/lodestone/linkshell/%s/", + + "profile/achievements.json": "https://{region}.finalfantasyxiv.com/lodestone/character/{id}/achievement/", + "profile/attributes.json": "https://{region}.finalfantasyxiv.com/lodestone/character/{id}/", + "profile/character.json": "https://{region}.finalfantasyxiv.com/lodestone/character/{id}/", + "profile/classjob.json": "https://{region}.finalfantasyxiv.com/lodestone/character/{id}/class_job/", + "profile/gearset.json": "https://{region}.finalfantasyxiv.com/lodestone/character/{id}/", + "profile/minion.json": "https://{region}.finalfantasyxiv.com/lodestone/character/{id}/", + "profile/mount.json": "https://{region}.finalfantasyxiv.com/lodestone/character/{id}/", + + "pvpteam/members.json": "https://{region}.finalfantasyxiv.com/lodestone/pvpteam/%s/", + "pvpteam/pvpteam.json": "https://{region}.finalfantasyxiv.com/lodestone/pvpteam/%s/", + + "search/character.json": "https://{region}.finalfantasyxiv.com/lodestone/character/", + "search/cwls.json": "https://{region}.finalfantasyxiv.com/lodestone/crossworld_linkshell/", + "search/freecompany.json": "https://{region}.finalfantasyxiv.com/lodestone/freecompany/", + "search/linkshell.json": "https://{region}.finalfantasyxiv.com/lodestone/linkshell/", + "search/pvpteam.json": "https://{region}.finalfantasyxiv.com/lodestone/pvpteam/" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.46.0/profile/achievements.json b/ffxiv/lodestone-css-selectors-0.46.0/profile/achievements.json new file mode 100644 index 0000000..532c5b5 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/profile/achievements.json @@ -0,0 +1,45 @@ +{ + "ROOT": { + "selector": ".ldst__achievement" + }, + "ENTRY": { + "ROOT": { + "selector": ".entry", + "multiple": true + }, + "NAME": { + "selector": ".entry__activity__txt", + "regex": "(?P<NameDE>.*) aus der Kategorie „|.*[\\\"「](?P<Name>.*)[\\\"」]" + }, + "ID": { + "selector": ".entry__achievement", + "attribute": "href", + "regex": "/lodestone/character/\\d*/achievement/detail/(?P<ID>\\d*)/" + }, + "TIME": { + "selector": ".entry__activity__time > script", + "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(2) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager:nth-child(2) > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + }, + "NO_RESULTS_FOUND": { + "selector": ".parts__zero" + }, + "TOTAL_ACHIEVEMENTS": { + "selector": ".parts__total", + "regex": "(?P<TotalAchievements>[0-9]*) \\D+" + }, + "ACHIEVEMENT_POINTS": { + "selector": ".achievement__point" + }, + "ACTIVITY_DESCRIPTION": { + "selector": ".entry__activity__txt" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.46.0/profile/attributes.json b/ffxiv/lodestone-css-selectors-0.46.0/profile/attributes.json new file mode 100644 index 0000000..c031c20 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/profile/attributes.json @@ -0,0 +1,62 @@ +{ + "STRENGTH": { + "selector": "table.character__param__list:nth-child(2) tr:nth-child(1) > td:nth-child(2)" + }, + "DEXTERITY": { + "selector": "table.character__param__list:nth-child(2) tr:nth-child(2) > td:nth-child(2)" + }, + "VITALITY": { + "selector": "table.character__param__list:nth-child(2) tr:nth-child(3) > td:nth-child(2)" + }, + "INTELLIGENCE": { + "selector": "table.character__param__list:nth-child(2) tr:nth-child(4) > td:nth-child(2)" + }, + "MIND": { + "selector": "table.character__param__list:nth-child(2) tr:nth-child(5) > td:nth-child(2)" + }, + "CRITICAL_HIT_RATE": { + "selector": "table.character__param__list:nth-child(4) tr:nth-child(1) > td:nth-child(2)" + }, + "DETERMINATION": { + "selector": "table.character__param__list:nth-child(4) tr:nth-child(2) > td:nth-child(2)" + }, + "DIRECT_HIT_RATE": { + "selector": "table.character__param__list:nth-child(4) tr:nth-child(3) > td:nth-child(2)" + }, + "DEFENSE": { + "selector": "table.character__param__list:nth-child(6) tr:nth-child(1) > td:nth-child(2)" + }, + "MAGIC_DEFENSE": { + "selector": "table.character__param__list:nth-child(6) tr:nth-child(2) > td:nth-child(2)" + }, + "ATTACK_POWER": { + "selector": "table.character__param__list:nth-child(8) tr:nth-child(1) > td:nth-child(2)" + }, + "SKILL_SPEED": { + "selector": "table.character__param__list:nth-child(8) tr:nth-child(2) > td:nth-child(2)" + }, + "ATTACK_MAGIC_POTENCY": { + "selector": "table.character__param__list:nth-child(10) tr:nth-child(1) > td:nth-child(2)" + }, + "HEALING_MAGIC_POTENCY": { + "selector": "table.character__param__list:nth-child(10) tr:nth-child(2) > td:nth-child(2)" + }, + "SPELL_SPEED": { + "selector": "table.character__param__list:nth-child(10) tr:nth-child(3) > td:nth-child(2)" + }, + "TENACITY": { + "selector": "table.character__param__list:nth-child(12) tr:nth-child(1) > td:nth-child(2)" + }, + "PIETY": { + "selector": "table.character__param__list:nth-child(12) tr:nth-child(2) > td:nth-child(2)" + }, + "HP": { + "selector": ".character__param > ul:nth-child(1) > li:nth-child(1) > div:nth-child(1) > span:nth-child(2)" + }, + "MP_GP_CP": { + "selector": ".character__param > ul:nth-child(1) > li:nth-child(2) > div:nth-child(1) > span:nth-child(2)" + }, + "MP_GP_CP_PARAMETER_NAME": { + "selector": ".character__param > ul > li:nth-child(2) .character__param__text" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.46.0/profile/character.json b/ffxiv/lodestone-css-selectors-0.46.0/profile/character.json new file mode 100644 index 0000000..8a65066 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/profile/character.json @@ -0,0 +1,114 @@ +{ + "ACTIVE_CLASSJOB": { + "selector": ".character__class_icon > img:nth-child(1)", + "attribute": "src" + }, + "ACTIVE_CLASSJOB_LEVEL": { + "selector": ".character__class__data > p:nth-child(1)", + "regex": "LEVEL (?P<Level>\\d*)" + }, + "AVATAR": { + "selector": ".frame__chara__face > img:nth-child(1)", + "attribute": "src" + }, + "BIO": { + "selector": ".character__selfintroduction" + }, + "CLASSJOB_ICONS": { + "ROOT": { + "selector": "li", + "multiple": true + }, + "ICON": { + "selector": "div.character__class_icon > img", + "attribute": "src" + } + }, + "FREE_COMPANY": { + "NAME": { + "selector": ".character__freecompany__name > h4:nth-child(2) > a:nth-child(1)" + }, + "ICON_LAYERS": { + "BOTTOM": { + "selector": "div.character__freecompany__crest > div > img:nth-child(1)", + "attribute": "src" + }, + "MIDDLE": { + "selector": "div.character__freecompany__crest > div > img:nth-child(1)", + "attribute": "src" + }, + "TOP": { + "selector": "div.character__freecompany__crest > div > img:nth-child(1)", + "attribute": "src" + } + } + }, + "GRAND_COMPANY": { + "selector": "div.character-block:nth-child(4) > div:nth-child(2) > p:nth-child(2)", + "regex": "(?P<Name>\\S*) \/ (?P<Rank>.*)" + }, + "GUARDIAN_DEITY": { + "NAME": { + "selector": "p.character-block__name:nth-child(4)" + }, + "ICON": { + "selector": "#character > div.character__content.selected > div.character__profile.clearfix > div.character__profile__data > div:nth-child(1) > div > div:nth-child(2) > img", + "attribute": "src" + } + }, + "GENDER": { + "selector": "p.character-block__name:nth-child(2)", + "regex": "(.$)" + }, + "NAME": { + "selector": "div.frame__chara__box:nth-child(2) > .frame__chara__name" + }, + "NAMEDAY": { + "selector": ".character-block__birth" + }, + "PORTRAIT": { + "selector": ".js__image_popup > img:nth-child(1)", + "attribute": "src" + }, + "PVP_TEAM": { + "NAME": { + "selector": ".character__pvpteam__name > h4:nth-child(2) > a:nth-child(1)", + "attribute": "href", + "regex": "/lodestone/pvpteam/(?P<ID>.+)/" + }, + "ICON_LAYERS": { + "BOTTOM": { + "selector": ".character__pvpteam__crest__image img:nth-child(1)", + "attribute": "src" + }, + "MIDDLE": { + "selector": ".character__pvpteam__crest__image img:nth-child(2)", + "attribute": "src" + }, + "TOP": { + "selector": ".character__pvpteam__crest__image img:nth-child(3)", + "attribute": "src" + } + } + }, + "RACE_CLAN_GENDER": { + "selector": "div.character-block:nth-child(1) > div:nth-child(2) > p:nth-child(2)", + "regex": "(?P<Race>.*)(?P<Tribe>.*) \\/ (?P<Gender>.)" + }, + "SERVER": { + "selector": "p.frame__chara__world:last-of-type", + "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)" + }, + "TITLE": { + "selector": ".frame__chara__title" + }, + "TOWN": { + "NAME": { + "selector": "div.character-block:nth-child(3) > div:nth-child(2) > p:nth-child(2)" + }, + "ICON": { + "selector": "#character > div.character__content.selected > div.character__profile.clearfix > div.character__profile__data > div:nth-child(1) > div > div:nth-child(3) > img", + "attribute": "src" + } + } +} diff --git a/ffxiv/lodestone-css-selectors-0.46.0/profile/classjob.json b/ffxiv/lodestone-css-selectors-0.46.0/profile/classjob.json new file mode 100644 index 0000000..9a0c80a --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/profile/classjob.json @@ -0,0 +1,550 @@ +{ + "BOZJA": { + "LEVEL": { + "selector": "div.character__content > div:nth-child(7) > div.character__job__level" + }, + "NAME": { + "selector": "div.character__content > div:nth-child(7) > div.character__job__name" + }, + "METTLE": { + "selector": "div.character__content > div:nth-child(7) > div.character__job__exp", + "regex": "(?P<Mettle>\\S+) \\/" + } + }, + "EUREKA": { + "LEVEL": { + "selector": "div.character__content > div:nth-child(9) > div.character__job__level" + }, + "NAME": { + "selector": "div.character__content > div:nth-child(9) > div.character__job__name" + }, + "EXP": { + "selector": "div.character__content > div:nth-child(9) > div.character__job__exp", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.character__content > div:nth-child(9) > div.character__job__exp", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "PALADIN": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "WARRIOR": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "DARKKNIGHT": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "GUNBREAKER": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "MONK": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "DRAGOON": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "NINJA": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "SAMURAI": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "REAPER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "WHITEMAGE": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "SCHOLAR": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "ASTROLOGIAN": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "SAGE": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "BARD": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "MACHINIST": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "DANCER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "BLACKMAGE": { + "LEVEL": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "SUMMONER": { + "LEVEL": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "REDMAGE": { + "LEVEL": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "BLUEMAGE": { + "LEVEL": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "CARPENTER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3).character__job__name--meister" + } + }, + "BLACKSMITH": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3).character__job__name--meister" + } + }, + "ARMORER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3).character__job__name--meister" + } + }, + "GOLDSMITH": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3).character__job__name--meister" + } + }, + "LEATHERWORKER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3).character__job__name--meister" + } + }, + "WEAVER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(3).character__job__name--meister" + } + }, + "ALCHEMIST": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(3).character__job__name--meister" + } + }, + "CULINARIAN": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(3).character__job__name--meister" + } + }, + "MINER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "BOTANIST": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "FISHER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/profile/gearset.json b/ffxiv/lodestone-css-selectors-0.46.0/profile/gearset.json new file mode 100644 index 0000000..9488f7d --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/profile/gearset.json @@ -0,0 +1,527 @@ +{ + "MAINHAND": { + "NAME": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "OFFHAND": { + "NAME": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "HEAD": { + "NAME": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "BODY": { + "NAME": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "HANDS": { + "NAME": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "WAIST": { + "NAME": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "LEGS": { + "NAME": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "FEET": { + "NAME": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "EARRINGS": { + "NAME": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "NECKLACE": { + "NAME": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "BRACELETS": { + "NAME": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "RING1": { + "NAME": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "RING2": { + "NAME": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "SOULCRYSTAL": { + "NAME": { + "selector": ".icon-c--13 > div:nth-child(3) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + } + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/profile/minion.json b/ffxiv/lodestone-css-selectors-0.46.0/profile/minion.json new file mode 100644 index 0000000..05e22de --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/profile/minion.json @@ -0,0 +1,18 @@ +{ + "MINIONS": { + "ROOT": { + "selector": ".minion__list__item", + "multiple": true + }, + "NAME": { + "selector": ".minion__name" + }, + "ICON": { + "selector": ".minion__list__icon__image", + "attribute": "src" + } + }, + "TOTAL": { + "selector": ".minion__sort__total > span:nth-child(1)" + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/profile/mount.json b/ffxiv/lodestone-css-selectors-0.46.0/profile/mount.json new file mode 100644 index 0000000..5bca606 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/profile/mount.json @@ -0,0 +1,18 @@ +{ + "MOUNTS": { + "ROOT": { + "selector": ".mount__list__item", + "multiple": true + }, + "NAME": { + "selector": ".mount__name" + }, + "ICON": { + "selector": ".mount__list__icon__image", + "attribute": "src" + } + }, + "TOTAL": { + "selector": ".minion__sort__total > span:nth-child(1)" + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/pvpteam/members.json b/ffxiv/lodestone-css-selectors-0.46.0/pvpteam/members.json new file mode 100644 index 0000000..202b4d8 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/pvpteam/members.json @@ -0,0 +1,39 @@ +{ + "ROOT": { + "selector": ".pvpteam__member" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "AVATAR": { + "selector": ".entry__chara__face img", + "attribute": "src" + }, + "ID": { + "selector": ".entry__bg", + "attribute": "href", + "regex": "/lodestone/character/(?P<ID>\\d*)/" + }, + "NAME": { + "selector": ".entry__name" + }, + "MATCHES": { + "selector": ".entry__freecompany__info > li:last-of-type > span" + }, + "RANK": { + "selector": ".entry__freecompany__info > .js__tooltip", + "attribute": "data-tooltip", + "regex": "/ (?P<RankName>.+)" + }, + "RANK_ICON": { + "selector": ".entry__freecompany__info > .js__tooltip > img", + "attribute": "src" + }, + "SERVER": { + "selector": ".entry__world", + "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)" + } + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/pvpteam/pvpteam.json b/ffxiv/lodestone-css-selectors-0.46.0/pvpteam/pvpteam.json new file mode 100644 index 0000000..6bb7cf8 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/pvpteam/pvpteam.json @@ -0,0 +1,26 @@ +{ + "NAME": { + "selector": ".entry__pvpteam__name--team" + }, + "DC": { + "selector": ".entry__pvpteam__name--dc" + }, + "FORMED": { + "selector": ".entry__pvpteam__data--formed > script", + "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)" + }, + "CREST_LAYERS": { + "BOTTOM": { + "selector": ".entry__pvpteam__crest__image > img:nth-child(1)", + "attribute": "src" + }, + "MIDDLE": { + "selector": ".entry__pvpteam__crest__image > img:nth-child(2)", + "attribute": "src" + }, + "TOP": { + "selector": ".entry__pvpteam__crest__image > img:nth-child(3)", + "attribute": "src" + } + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.46.0/search/character.json b/ffxiv/lodestone-css-selectors-0.46.0/search/character.json new file mode 100644 index 0000000..119e679 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/search/character.json @@ -0,0 +1,50 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "AVATAR": { + "selector": ".entry__chara__face > img", + "attribute": "src" + }, + "ID": { + "selector": ".entry__link", + "attribute": "href", + "regex": "/lodestone/character/(?P<ID>\\d*)/" + }, + "LANG": { + "selector": ".entry__chara__lang" + }, + "NAME": { + "selector": ".entry__name" + }, + "RANK": { + "selector": ".entry__chara_info > .js__tooltip", + "attribute": "data-tooltip", + "regex": "/ (?P<RankName>.+)" + }, + "RANK_ICON": { + "selector": ".entry__chara_info > .js__tooltip > img", + "attribute": "src" + }, + "SERVER": { + "selector": ".entry__world", + "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)" + } + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + }, + "PAGE_INFO": { + "selector": "ul.btn__pager > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "NO_RESULTS_FOUND": { + "selector": ".parts__zero" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.46.0/search/cwls.json b/ffxiv/lodestone-css-selectors-0.46.0/search/cwls.json new file mode 100644 index 0000000..7efe25a --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/search/cwls.json @@ -0,0 +1,36 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "ID": { + "selector": ".entry__link--line", + "attribute": "href", + "regex": "/lodestone/crossworld_linkshell/(?P<ID>\\w*)/" + }, + "NAME": { + "selector": ".entry__name" + }, + "DC": { + "selector": ".entry__world" + }, + "ACTIVE_MEMBERS": { + "selector": ".entry__linkshell__member > div > span" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + }, + "NO_RESULTS_FOUND": { + "selector": ".parts__zero" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.46.0/search/freecompany.json b/ffxiv/lodestone-css-selectors-0.46.0/search/freecompany.json new file mode 100644 index 0000000..0d93137 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/search/freecompany.json @@ -0,0 +1,69 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "CREST_LAYERS": { + "BOTTOM": { + "selector": ".entry__freecompany__crest__image > img:nth-child(1)", + "attribute": "src" + }, + "MIDDLE": { + "selector": ".entry__freecompany__crest__image > img:nth-child(2)", + "attribute": "src" + }, + "TOP": { + "selector": ".entry__freecompany__crest__image > img:nth-child(3)", + "attribute": "src" + } + }, + "ID": { + "selector": ".entry__block", + "attribute": "href", + "regex": "/lodestone/freecompany/(?P<ID>\\d*)/" + }, + "GRAND_COMPANY": { + "selector": ".entry__world:nth-child(1)" + }, + "NAME": { + "selector": ".entry__name" + }, + "SERVER": { + "selector": ".entry__world:nth-child(3)", + "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)" + }, + "ACTIVE": { + "selector": "li.entry__freecompany__fc-active:nth-child(4)", + "regex": "Active:\\s+(?P<State>\\w*)" + }, + "ACTIVE_MEMBERS": { + "selector": ".entry__freecompany__fc-member" + }, + "RECRUITMENT_OPEN": { + "selector": "li.entry__freecompany__fc-active:nth-child(5)", + "regex": "Recruitment:\\s+(?P<State>\\w*)" + }, + "ESTATE_BUILT": { + "selector": ".entry__freecompany__fc-housing" + }, + "FORMED": { + "selector": ".entry__freecompany__fc-day > script", + "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + }, + "NO_RESULTS_FOUND": { + "selector": ".parts__zero" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.46.0/search/linkshell.json b/ffxiv/lodestone-css-selectors-0.46.0/search/linkshell.json new file mode 100644 index 0000000..5ff2015 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/search/linkshell.json @@ -0,0 +1,37 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "ID": { + "selector": ".entry__link--line", + "attribute": "href", + "regex": "/lodestone/linkshell/(?P<ID>\\d*)/" + }, + "NAME": { + "selector": ".entry__name" + }, + "SERVER": { + "selector": ".entry__world", + "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)" + }, + "ACTIVE_MEMBERS": { + "selector": ".entry__linkshell__member > div > span" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + }, + "NO_RESULTS_FOUND": { + "selector": ".parts__zero" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.46.0/search/pvpteam.json b/ffxiv/lodestone-css-selectors-0.46.0/search/pvpteam.json new file mode 100644 index 0000000..ae1c51d --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.46.0/search/pvpteam.json @@ -0,0 +1,47 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "CREST_LAYERS": { + "BOTTOM": { + "selector": ".entry__pvpteam__search__crest__image > img:nth-child(1)", + "attribute": "src" + }, + "MIDDLE": { + "selector": ".entry__pvpteam__search__crest__image > img:nth-child(2)", + "attribute": "src" + }, + "TOP": { + "selector": ".entry__pvpteam__search__crest__image > img:nth-child(3)", + "attribute": "src" + } + }, + "ID": { + "selector": ".entry__block", + "attribute": "href", + "regex": "/lodestone/pvpteam/(?P<ID>\\w*)/" + }, + "NAME": { + "selector": ".entry__name" + }, + "DC": { + "selector": ".entry__world" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + }, + "NO_RESULTS_FOUND": { + "selector": ".parts__zero" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/LICENSE b/ffxiv/lodestone-css-selectors-0.52.0/LICENSE new file mode 100644 index 0000000..fdddb29 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to <https://unlicense.org> diff --git a/ffxiv/lodestone-css-selectors-0.52.0/README.md b/ffxiv/lodestone-css-selectors-0.52.0/README.md new file mode 100644 index 0000000..da1fd4b --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/README.md @@ -0,0 +1,26 @@ +# lodestone-css-selectors +CSS selectors for The Lodestone. These selectors are all made for non-browser clients; they may break in various browsers +due to DOM elements being injected by the browser itself. Please test them in a parser before reporting any errors. + +## Character Profile +Do note that in Firefox, some page elements are slightly different from in other browsers. Use no user agent or try the provided ones in `meta.json`. + +### Character info (`profile/character.json`) +Basic character data is on the main profile page. + +### Attributes (`profile/attributes.json`) +Attribute data is on the main profile page. + +### Gearset (`profile/gearset.json`) +Gearset data is on the main profile page. + +### Classjobs (`profile/classjob.json`) +Classjob data is on the `/class_job` endpoint. + +### Mounts/Minions (`profile/minion.json` and `profile/mount.json`) +Mount and minion data are on their own `/mount` and `/minion` endpoints, and need to be scraped using a mobile user agent. With a desktop UA, the mount/minion names are +injected into the page with AJAX, and separate requests need to be made to get every single one. + +### Achievements (`profile/achievements.json`) +Achievements are on the `/achievement` endpoint. Use the list selector to get the list of achievements on the page, and then get their IDs from the `href` attribute +of the link. Use the next button's selector to request the next page and scrape the next set of achievements until the href is `javascript:void(0);`. diff --git a/ffxiv/lodestone-css-selectors-0.52.0/cwls/cwls.json b/ffxiv/lodestone-css-selectors-0.52.0/cwls/cwls.json new file mode 100644 index 0000000..4c4b007 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/cwls/cwls.json @@ -0,0 +1,9 @@ +{ + "NAME": { + "selector": ".heading__linkshell__name", + "regex": "\\s*(?P<Name>\\S*)" + }, + "DC": { + "selector": ".heading__cwls__dcname" + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.52.0/cwls/members.json b/ffxiv/lodestone-css-selectors-0.52.0/cwls/members.json new file mode 100644 index 0000000..05e7e41 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/cwls/members.json @@ -0,0 +1,51 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "AVATAR": { + "selector": ".entry__chara__face img", + "attribute": "src" + }, + "ID": { + "selector": ".entry__link", + "attribute": "href", + "regex": "/lodestone/character/(?P<ID>\\d*)/" + }, + "NAME": { + "selector": ".entry__name" + }, + "RANK": { + "selector": ".entry__chara_info > .js__tooltip", + "attribute": "data-tooltip", + "regex": "/ (?P<RankName>.+)" + }, + "RANK_ICON": { + "selector": ".entry__chara_info > .js__tooltip > img", + "attribute": "src" + }, + "LINKSHELL_RANK": { + "selector": ".entry__chara_info__linkshell > span" + }, + "LINKSHELL_RANK_ICON": { + "selector": ".entry__chara_info__linkshell > img", + "attribute": "src" + }, + "SERVER": { + "selector": ".entry__world", + "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(5) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager:nth-child(5) > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/freecompany/focus.json b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/focus.json new file mode 100644 index 0000000..44850be --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/focus.json @@ -0,0 +1,131 @@ +{ + "NOT_SPECIFIED": { + "selector": "p.freecompany__text:nth-child(7)" + }, + "RP": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(1) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(1) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(1)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "LEVELING": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(2) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "CASUAL": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "HARDCORE": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(4) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(4) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(4)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "DUNGEONS": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(5) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(5) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(5)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "GUILDHESTS": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(6) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(6) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(6)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "TRIALS": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(7) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(7) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(7)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "RAIDS": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(8) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(8) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(8)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + }, + "PVP": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(9) > p:nth-child(2)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(9) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(9)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + } + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.52.0/freecompany/freecompany.json b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/freecompany.json new file mode 100644 index 0000000..63cc831 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/freecompany.json @@ -0,0 +1,80 @@ +{ + "ACTIVE_STATE": { + "selector": "p.freecompany__text:nth-child(3)", + "regex": "\\s*(?P<ActiveState>\\S+\\s?\\S*)" + }, + "ACTIVE_MEMBER_COUNT": { + "selector": "p.freecompany__text:nth-child(12)" + }, + "CREST_LAYERS": { + "BOTTOM": { + "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > img:nth-child(1)", + "attribute": "src" + }, + "MIDDLE": { + "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > img:nth-child(2)", + "attribute": "src" + }, + "TOP": { + "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > img:nth-child(3)", + "attribute": "src" + } + }, + "ESTATE": { + "NO_ESTATE": { + "selector": ".freecompany__estate__none" + }, + "GREETING": { + "selector": ".freecompany__estate__greeting" + }, + "NAME": { + "selector": ".freecompany__estate__name" + }, + "PLOT": { + "selector": ".freecompany__estate__text" + } + }, + "FORMED": { + "selector": "p.freecompany__text:nth-child(10) > script", + "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)" + }, + "GRAND_COMPANY": { + "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(2) > p:nth-child(1)", + "regex": "(?P<Name>\\w.*)<(?P<Rank>\\w*)>" + }, + "ID": { + "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1)", + "attribute": "href", + "regex": "/lodestone/freecompany/(?P<ID>\\d*)/" + }, + "NAME": { + "selector": ".freecompany__text__name" + }, + "RANK": { + "selector": "p.freecompany__text:nth-child(14)" + }, + "RANKING": { + "WEEKLY": { + "selector": ".character__ranking__data tr:nth-child(1) > th:nth-child(1)", + "regex": "Weekly Rank:(?P<Rank>.+) \\(previous week\\)" + }, + "MONTHLY": { + "selector": ".character__ranking__data tr:nth-child(2) > th:nth-child(1)", + "regex": "Monthly Rank:(?P<Rank>.*) \\(previous month\\)" + } + }, + "RECRUITMENT": { + "selector": "p.freecompany__text:nth-child(5)", + "regex": "\\s*(?P<ActiveState>\\S*)" + }, + "SERVER": { + "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(2) > p:nth-child(3)", + "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]" + }, + "SLOGAN": { + "selector": ".freecompany__text__message" + }, + "TAG": { + "selector": ".freecompany__text.freecompany__text__tag" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/freecompany/members.json b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/members.json new file mode 100644 index 0000000..aa7c897 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/members.json @@ -0,0 +1,51 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "li.entry", + "multiple": true + }, + "AVATAR": { + "selector": ".entry__chara__face > img", + "attribute": "src" + }, + "ID": { + "selector": ".entry__bg", + "attribute": "href", + "regex": "/lodestone/character/(?P<ID>\\d*)/" + }, + "NAME": { + "selector": ".entry__name" + }, + "FC_RANK": { + "selector": ".entry__freecompany__info > li:nth-child(1) > span" + }, + "FC_RANK_ICON": { + "selector": ".entry__freecompany__info > li:nth-child(1) > img", + "attribute": "src" + }, + "RANK": { + "selector": ".entry__freecompany__info > .js__tooltip", + "attribute": "data-tooltip", + "regex": "/ (?P<RankName>.+)" + }, + "RANK_ICON": { + "selector": ".entry__freecompany__info > .js__tooltip > img", + "attribute": "src" + }, + "SERVER": { + "selector": ".entry__world", + "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(4) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager:nth-child(4) > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/freecompany/reputation.json b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/reputation.json new file mode 100644 index 0000000..c88df40 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/reputation.json @@ -0,0 +1,41 @@ +{ + "MAELSTROM": { + "NAME": { + "selector": "div.freecompany__reputation:nth-child(16) > div:nth-child(2) > p:nth-child(1)" + }, + "PROGRESS": { + "selector": "div.freecompany__reputation:nth-child(16) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)", + "attribute": "style", + "regex": "width:(?P<Progress>\\d+)%;" + }, + "RANK": { + "selector": "div.freecompany__reputation:nth-child(16) > div:nth-child(2) > p:nth-child(2)" + } + }, + "ADDERS": { + "NAME": { + "selector": "div.freecompany__reputation:nth-child(17) > div:nth-child(2) > p:nth-child(1)" + }, + "PROGRESS": { + "selector": "div.freecompany__reputation:nth-child(17) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)", + "attribute": "style", + "regex": "width:(?P<Progress>\\d+)%;" + }, + "RANK": { + "selector": "div.freecompany__reputation:nth-child(17) > div:nth-child(2) > p:nth-child(2)" + } + }, + "FLAMES": { + "NAME": { + "selector": "div.freecompany__reputation:nth-child(18) > div:nth-child(2) > p:nth-child(1)" + }, + "PROGRESS": { + "selector": "div.freecompany__reputation:nth-child(18) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)", + "attribute": "style", + "regex": "width:(?P<Progress>\\d+)%;" + }, + "RANK": { + "selector": "div.freecompany__reputation:nth-child(18) > div:nth-child(2) > p:nth-child(2)" + } + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.52.0/freecompany/seeking.json b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/seeking.json new file mode 100644 index 0000000..164c01a --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/seeking.json @@ -0,0 +1,75 @@ +{ + "NOT_SPECIFIED": { + "selector": "p.parts__text:nth-child(9)" + }, + "TANK": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(1) > p:nth-child(2)" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(1)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(1) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + } + }, + "HEALER": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(2) > p:nth-child(2)" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(2)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(2) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + } + }, + "DPS": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(3) > p:nth-child(2)" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(3)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(3) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + } + }, + "CRAFTER": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(4) > p:nth-child(2)" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(4)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(4) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + } + }, + "GATHERER": { + "NAME": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(5) > p:nth-child(2)" + }, + "STATUS": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(5)", + "attribute": "class", + "regex": "freecompany__focus_icon--(?P<Status>off)" + }, + "ICON": { + "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(5) > div:nth-child(1) > img:nth-child(1)", + "attribute": "src" + } + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.52.0/linkshell/ls.json b/ffxiv/lodestone-css-selectors-0.52.0/linkshell/ls.json new file mode 100644 index 0000000..c33ccb5 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/linkshell/ls.json @@ -0,0 +1,5 @@ +{ + "NAME": { + "selector": ".heading__linkshell__name" + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.52.0/linkshell/members.json b/ffxiv/lodestone-css-selectors-0.52.0/linkshell/members.json new file mode 100644 index 0000000..05e7e41 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/linkshell/members.json @@ -0,0 +1,51 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "AVATAR": { + "selector": ".entry__chara__face img", + "attribute": "src" + }, + "ID": { + "selector": ".entry__link", + "attribute": "href", + "regex": "/lodestone/character/(?P<ID>\\d*)/" + }, + "NAME": { + "selector": ".entry__name" + }, + "RANK": { + "selector": ".entry__chara_info > .js__tooltip", + "attribute": "data-tooltip", + "regex": "/ (?P<RankName>.+)" + }, + "RANK_ICON": { + "selector": ".entry__chara_info > .js__tooltip > img", + "attribute": "src" + }, + "LINKSHELL_RANK": { + "selector": ".entry__chara_info__linkshell > span" + }, + "LINKSHELL_RANK_ICON": { + "selector": ".entry__chara_info__linkshell > img", + "attribute": "src" + }, + "SERVER": { + "selector": ".entry__world", + "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(5) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager:nth-child(5) > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/meta.json b/ffxiv/lodestone-css-selectors-0.52.0/meta.json new file mode 100644 index 0000000..4b40bd8 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/meta.json @@ -0,0 +1,35 @@ +{ + "version": "0.45.0", + "userAgentDesktop": "curl/7.73.0", + "userAgentMobile": "Mozilla/5.0 (iPhone; CPU OS 10_15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Mobile/14E304 Safari/605.1.15", + "applicableUris": { + "freecompany/focus.json": "https://%s.finalfantasyxiv.com/lodestone/freecompany/%s/", + "freecompany/freecompany.json": "https://%s.finalfantasyxiv.com/lodestone/freecompany/%s/", + "freecompany/members.json": "https://%s.finalfantasyxiv.com/lodestone/freecompany/%s/member/", + "freecompany/reputation.json": "https://%s.finalfantasyxiv.com/lodestone/freecompany/%s/", + "freecompany/seeking.json": "https://%s.finalfantasyxiv.com/lodestone/freecompany/%s/", + + "cwls/cwls.json": "https://%s.finalfantasyxiv.com/lodestone/crossworld_linkshell/%s/", + "cwls/members.json": "https://%s.finalfantasyxiv.com/lodestone/crossworld_linkshell/%s/", + + "linkshell/ls.json": "https://%s.finalfantasyxiv.com/lodestone/linkshell/%s/", + "linkshell/members.json": "https://%s.finalfantasyxiv.com/lodestone/linkshell/%s/", + + "profile/achievements.json": "https://%s.finalfantasyxiv.com/lodestone/character/%d/achievement/", + "profile/attributes.json": "https://%s.finalfantasyxiv.com/lodestone/character/%d/", + "profile/character.json": "https://%s.finalfantasyxiv.com/lodestone/character/%d/", + "profile/classjob.json": "https://%s.finalfantasyxiv.com/lodestone/character/%d/class_job/", + "profile/gearset.json": "https://%s.finalfantasyxiv.com/lodestone/character/%d/", + "profile/minion.json": "https://%s.finalfantasyxiv.com/lodestone/character/%d/minion/", + "profile/mount.json": "https://%s.finalfantasyxiv.com/lodestone/character/%d/mount/", + + "pvpteam/members.json": "https://%s.finalfantasyxiv.com/lodestone/pvpteam/%s/", + "pvpteam/pvpteam.json": "https://%s.finalfantasyxiv.com/lodestone/pvpteam/%s/", + + "search/character.json": "https://%s.finalfantasyxiv.com/lodestone/character/", + "search/cwls.json": "https://%s.finalfantasyxiv.com/lodestone/crossworld_linkshell/", + "search/freecompany.json": "https://%s.finalfantasyxiv.com/lodestone/freecompany/", + "search/linkshell.json": "https://%s.finalfantasyxiv.com/lodestone/linkshell/", + "search/pvpteam.json": "https://%s.finalfantasyxiv.com/lodestone/pvpteam/" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/achievements.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/achievements.json new file mode 100644 index 0000000..5db2e02 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/achievements.json @@ -0,0 +1,45 @@ +{ + "ROOT": { + "selector": ".ldst__achievement" + }, + "ENTRY": { + "ROOT": { + "selector": ".entry", + "multiple": true + }, + "NAME": { + "selector": ".entry__activity__txt", + "regex": "(?P<NameEU>.*)" + }, + "ID": { + "selector": ".entry__achievement", + "attribute": "href", + "regex": "/lodestone/character/\\d*/achievement/detail/(?P<ID>\\d*)/" + }, + "TIME": { + "selector": ".entry__activity__time > script", + "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(2) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager:nth-child(2) > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + }, + "NO_RESULTS_FOUND": { + "selector": ".parts__zero" + }, + "TOTAL_ACHIEVEMENTS": { + "selector": ".parts__total", + "regex": "(?P<TotalAchievements>[0-9]*) \\D+" + }, + "ACHIEVEMENT_POINTS": { + "selector": ".achievement__point" + }, + "ACTIVITY_DESCRIPTION": { + "selector": ".entry__activity__txt" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/attributes.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/attributes.json new file mode 100644 index 0000000..c031c20 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/attributes.json @@ -0,0 +1,62 @@ +{ + "STRENGTH": { + "selector": "table.character__param__list:nth-child(2) tr:nth-child(1) > td:nth-child(2)" + }, + "DEXTERITY": { + "selector": "table.character__param__list:nth-child(2) tr:nth-child(2) > td:nth-child(2)" + }, + "VITALITY": { + "selector": "table.character__param__list:nth-child(2) tr:nth-child(3) > td:nth-child(2)" + }, + "INTELLIGENCE": { + "selector": "table.character__param__list:nth-child(2) tr:nth-child(4) > td:nth-child(2)" + }, + "MIND": { + "selector": "table.character__param__list:nth-child(2) tr:nth-child(5) > td:nth-child(2)" + }, + "CRITICAL_HIT_RATE": { + "selector": "table.character__param__list:nth-child(4) tr:nth-child(1) > td:nth-child(2)" + }, + "DETERMINATION": { + "selector": "table.character__param__list:nth-child(4) tr:nth-child(2) > td:nth-child(2)" + }, + "DIRECT_HIT_RATE": { + "selector": "table.character__param__list:nth-child(4) tr:nth-child(3) > td:nth-child(2)" + }, + "DEFENSE": { + "selector": "table.character__param__list:nth-child(6) tr:nth-child(1) > td:nth-child(2)" + }, + "MAGIC_DEFENSE": { + "selector": "table.character__param__list:nth-child(6) tr:nth-child(2) > td:nth-child(2)" + }, + "ATTACK_POWER": { + "selector": "table.character__param__list:nth-child(8) tr:nth-child(1) > td:nth-child(2)" + }, + "SKILL_SPEED": { + "selector": "table.character__param__list:nth-child(8) tr:nth-child(2) > td:nth-child(2)" + }, + "ATTACK_MAGIC_POTENCY": { + "selector": "table.character__param__list:nth-child(10) tr:nth-child(1) > td:nth-child(2)" + }, + "HEALING_MAGIC_POTENCY": { + "selector": "table.character__param__list:nth-child(10) tr:nth-child(2) > td:nth-child(2)" + }, + "SPELL_SPEED": { + "selector": "table.character__param__list:nth-child(10) tr:nth-child(3) > td:nth-child(2)" + }, + "TENACITY": { + "selector": "table.character__param__list:nth-child(12) tr:nth-child(1) > td:nth-child(2)" + }, + "PIETY": { + "selector": "table.character__param__list:nth-child(12) tr:nth-child(2) > td:nth-child(2)" + }, + "HP": { + "selector": ".character__param > ul:nth-child(1) > li:nth-child(1) > div:nth-child(1) > span:nth-child(2)" + }, + "MP_GP_CP": { + "selector": ".character__param > ul:nth-child(1) > li:nth-child(2) > div:nth-child(1) > span:nth-child(2)" + }, + "MP_GP_CP_PARAMETER_NAME": { + "selector": ".character__param > ul > li:nth-child(2) .character__param__text" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/character.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/character.json new file mode 100644 index 0000000..6d2ab92 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/character.json @@ -0,0 +1,110 @@ +{ + "ACTIVE_CLASSJOB": { + "selector": ".character__class_icon > img:nth-child(1)", + "attribute": "src" + }, + "ACTIVE_CLASSJOB_LEVEL": { + "selector": ".character__class__data > p:nth-child(1)", + "regex": "LEVEL (?P<Level>\\d*)" + }, + "AVATAR": { + "selector": ".frame__chara__face > img:nth-child(1)", + "attribute": "src" + }, + "BIO": { + "selector": ".character__selfintroduction" + }, + "CLASSJOB_ICONS": { + "ROOT": { + "selector": "li", + "multiple": true + } + }, + "FREE_COMPANY": { + "NAME": { + "selector": ".character__freecompany__name > h4:nth-child(2)" + }, + "ICON_LAYERS": { + "BOTTOM": { + "selector": "div.character__freecompany__crest > div > img:nth-child(1)", + "attribute": "src" + }, + "MIDDLE": { + "selector": "div.character__freecompany__crest > div > img:nth-child(1)", + "attribute": "src" + }, + "TOP": { + "selector": "div.character__freecompany__crest > div > img:nth-child(1)", + "attribute": "src" + } + } + }, + "GRAND_COMPANY": { + "selector": "div.character-block:nth-child(4) > div:nth-child(2) > p:nth-child(2)", + "regex": "(?P<Name>\\S*) \/ (?P<Rank>.*)" + }, + "GUARDIAN_DEITY": { + "NAME": { + "selector": "p.character-block__name:nth-child(4)" + }, + "ICON": { + "selector": "#character > div.character__content.selected > div.character__profile.clearfix > div.character__profile__data > div:nth-child(1) > div > div:nth-child(2) > img", + "attribute": "src" + } + }, + "GENDER": { + "selector": "p.character-block__name:nth-child(2)", + "regex": "(.$)" + }, + "NAME": { + "selector": "div.frame__chara__box:nth-child(2) > .frame__chara__name" + }, + "NAMEDAY": { + "selector": ".character-block__birth" + }, + "PORTRAIT": { + "selector": ".js__image_popup > img:nth-child(1)", + "attribute": "src" + }, + "PVP_TEAM": { + "NAME": { + "selector": ".character__pvpteam__name > h4:nth-child(2) > a:nth-child(1)", + "attribute": "href", + "regex": "/lodestone/pvpteam/(?P<ID>.+)/" + }, + "ICON_LAYERS": { + "BOTTOM": { + "selector": ".character__pvpteam__crest__image img:nth-child(1)", + "attribute": "src" + }, + "MIDDLE": { + "selector": ".character__pvpteam__crest__image img:nth-child(2)", + "attribute": "src" + }, + "TOP": { + "selector": ".character__pvpteam__crest__image img:nth-child(3)", + "attribute": "src" + } + } + }, + "RACE_CLAN_GENDER": { + "selector": "div.character-block:nth-child(1) > div:nth-child(2) > p:nth-child(2)", + "regex": "(?P<Race>.*)(?P<Tribe>.*) \\/ (?P<Gender>.)" + }, + "SERVER": { + "selector": "p.frame__chara__world:last-of-type", + "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]" + }, + "TITLE": { + "selector": ".frame__chara__title" + }, + "TOWN": { + "NAME": { + "selector": "div.character-block:nth-child(3) > div:nth-child(2) > p:nth-child(2)" + }, + "ICON": { + "selector": "#character > div.character__content.selected > div.character__profile.clearfix > div.character__profile__data > div:nth-child(1) > div > div:nth-child(3) > img", + "attribute": "src" + } + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/classjob.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/classjob.json new file mode 100644 index 0000000..9a0c80a --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/classjob.json @@ -0,0 +1,550 @@ +{ + "BOZJA": { + "LEVEL": { + "selector": "div.character__content > div:nth-child(7) > div.character__job__level" + }, + "NAME": { + "selector": "div.character__content > div:nth-child(7) > div.character__job__name" + }, + "METTLE": { + "selector": "div.character__content > div:nth-child(7) > div.character__job__exp", + "regex": "(?P<Mettle>\\S+) \\/" + } + }, + "EUREKA": { + "LEVEL": { + "selector": "div.character__content > div:nth-child(9) > div.character__job__level" + }, + "NAME": { + "selector": "div.character__content > div:nth-child(9) > div.character__job__name" + }, + "EXP": { + "selector": "div.character__content > div:nth-child(9) > div.character__job__exp", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.character__content > div:nth-child(9) > div.character__job__exp", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "PALADIN": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "WARRIOR": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "DARKKNIGHT": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "GUNBREAKER": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "MONK": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "DRAGOON": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "NINJA": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "SAMURAI": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "REAPER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "WHITEMAGE": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "SCHOLAR": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "ASTROLOGIAN": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "SAGE": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "BARD": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "MACHINIST": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "DANCER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "BLACKMAGE": { + "LEVEL": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "SUMMONER": { + "LEVEL": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "REDMAGE": { + "LEVEL": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "BLUEMAGE": { + "LEVEL": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "CARPENTER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3).character__job__name--meister" + } + }, + "BLACKSMITH": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3).character__job__name--meister" + } + }, + "ARMORER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3).character__job__name--meister" + } + }, + "GOLDSMITH": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3).character__job__name--meister" + } + }, + "LEATHERWORKER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3).character__job__name--meister" + } + }, + "WEAVER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(3).character__job__name--meister" + } + }, + "ALCHEMIST": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(3).character__job__name--meister" + } + }, + "CULINARIAN": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + }, + "SPECIALIST": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(3).character__job__name--meister" + } + }, + "MINER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "BOTANIST": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + }, + "FISHER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "EXP_MAX": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "\\/ (?P<MaxEXP>\\S+)" + } + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/classjob_original.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/classjob_original.json new file mode 100644 index 0000000..3c8f537 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/classjob_original.json @@ -0,0 +1,398 @@ +{ + "BOZJA": { + "LEVEL": { + "selector": "div.character__job__list:nth-child(7) > div:nth-child(2)" + }, + "METTLE": { + "selector": "div.character__job__list:nth-child(7) > div:nth-child(4)", + "regex": "(?P<Mettle>\\S+) \\/" + }, + "NAME": { + "selector": "div.character__job__list:nth-child(7) > div:nth-child(3)" + } + }, + "EUREKA": { + "EXP": { + "selector": "div.character__job__list:nth-child(9) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + }, + "LEVEL": { + "selector": "div.character__job__list:nth-child(9) > div:nth-child(2)" + }, + "NAME": { + "selector": "div.character__job__list:nth-child(9) > div:nth-child(3)" + } + }, + "PALADIN": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "WARRIOR": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "DARKKNIGHT": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "GUNBREAKER": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "WHITEMAGE": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "SCHOLAR": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "ASTROLOGIAN": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "SAGE": { + "LEVEL": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "MONK": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "DRAGOON": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "NINJA": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "SAMURAI": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "REAPER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "BARD": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "MACHINIST": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "DANCER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "BLACKMAGE": { + "LEVEL": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "SUMMONER": { + "LEVEL": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "REDMAGE": { + "LEVEL": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "BLUEMAGE": { + "LEVEL": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "CARPENTER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "BLACKSMITH": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "ARMORER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "GOLDSMITH": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "LEATHERWORKER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "WEAVER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "ALCHEMIST": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "CULINARIAN": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "MINER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "BOTANIST": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + }, + "FISHER": { + "LEVEL": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)" + }, + "UNLOCKSTATE": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)" + }, + "EXP": { + "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)", + "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)" + } + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/gearset.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/gearset.json new file mode 100644 index 0000000..9488f7d --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/gearset.json @@ -0,0 +1,527 @@ +{ + "MAINHAND": { + "NAME": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "OFFHAND": { + "NAME": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "HEAD": { + "NAME": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "BODY": { + "NAME": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "HANDS": { + "NAME": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "WAIST": { + "NAME": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "LEGS": { + "NAME": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "FEET": { + "NAME": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "EARRINGS": { + "NAME": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "NECKLACE": { + "NAME": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "BRACELETS": { + "NAME": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "RING1": { + "NAME": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "RING2": { + "NAME": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + }, + "DB_LINK": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" + }, + "MIRAGE_NAME": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)" + }, + "MIRAGE_DB_LINK": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)" + }, + "STAIN": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)" + }, + "MATERIA_1": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_2": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_3": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_4": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "MATERIA_5": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)", + "regex": "(?P<Name>.*)<br/>" + }, + "CREATOR_NAME": { + "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)" + } + }, + "SOULCRYSTAL": { + "NAME": { + "selector": ".icon-c--13 > div:nth-child(3) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)" + } + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/minion.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/minion.json new file mode 100644 index 0000000..05e22de --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/minion.json @@ -0,0 +1,18 @@ +{ + "MINIONS": { + "ROOT": { + "selector": ".minion__list__item", + "multiple": true + }, + "NAME": { + "selector": ".minion__name" + }, + "ICON": { + "selector": ".minion__list__icon__image", + "attribute": "src" + } + }, + "TOTAL": { + "selector": ".minion__sort__total > span:nth-child(1)" + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/mount.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/mount.json new file mode 100644 index 0000000..5bca606 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/mount.json @@ -0,0 +1,18 @@ +{ + "MOUNTS": { + "ROOT": { + "selector": ".mount__list__item", + "multiple": true + }, + "NAME": { + "selector": ".mount__name" + }, + "ICON": { + "selector": ".mount__list__icon__image", + "attribute": "src" + } + }, + "TOTAL": { + "selector": ".minion__sort__total > span:nth-child(1)" + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.52.0/pvpteam/members.json b/ffxiv/lodestone-css-selectors-0.52.0/pvpteam/members.json new file mode 100644 index 0000000..2dd507f --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/pvpteam/members.json @@ -0,0 +1,39 @@ +{ + "ROOT": { + "selector": ".pvpteam__member" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "AVATAR": { + "selector": ".entry__chara__face img", + "attribute": "src" + }, + "ID": { + "selector": ".entry__bg", + "attribute": "href", + "regex": "/lodestone/character/(?P<ID>\\d*)/" + }, + "NAME": { + "selector": ".entry__name" + }, + "MATCHES": { + "selector": ".entry__freecompany__info > li:last-of-type > span" + }, + "RANK": { + "selector": ".entry__freecompany__info > .js__tooltip", + "attribute": "data-tooltip", + "regex": "/ (?P<RankName>.+)" + }, + "RANK_ICON": { + "selector": ".entry__freecompany__info > .js__tooltip > img", + "attribute": "src" + }, + "SERVER": { + "selector": ".entry__world", + "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]" + } + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/pvpteam/pvpteam.json b/ffxiv/lodestone-css-selectors-0.52.0/pvpteam/pvpteam.json new file mode 100644 index 0000000..6bb7cf8 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/pvpteam/pvpteam.json @@ -0,0 +1,26 @@ +{ + "NAME": { + "selector": ".entry__pvpteam__name--team" + }, + "DC": { + "selector": ".entry__pvpteam__name--dc" + }, + "FORMED": { + "selector": ".entry__pvpteam__data--formed > script", + "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)" + }, + "CREST_LAYERS": { + "BOTTOM": { + "selector": ".entry__pvpteam__crest__image > img:nth-child(1)", + "attribute": "src" + }, + "MIDDLE": { + "selector": ".entry__pvpteam__crest__image > img:nth-child(2)", + "attribute": "src" + }, + "TOP": { + "selector": ".entry__pvpteam__crest__image > img:nth-child(3)", + "attribute": "src" + } + } +}
\ No newline at end of file diff --git a/ffxiv/lodestone-css-selectors-0.52.0/search/character.json b/ffxiv/lodestone-css-selectors-0.52.0/search/character.json new file mode 100644 index 0000000..7ae9c00 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/search/character.json @@ -0,0 +1,50 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "AVATAR": { + "selector": ".entry__chara__face > img", + "attribute": "src" + }, + "ID": { + "selector": ".entry__link", + "attribute": "href", + "regex": "/lodestone/character/(?P<ID>\\d*)/" + }, + "LANG": { + "selector": ".entry__chara__lang" + }, + "NAME": { + "selector": ".entry__name" + }, + "RANK": { + "selector": ".entry__chara_info > .js__tooltip", + "attribute": "data-tooltip", + "regex": "/ (?P<RankName>.+)" + }, + "RANK_ICON": { + "selector": ".entry__chara_info > .js__tooltip > img", + "attribute": "src" + }, + "SERVER": { + "selector": ".entry__world", + "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]" + } + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + }, + "PAGE_INFO": { + "selector": "ul.btn__pager > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "NO_RESULTS_FOUND": { + "selector": ".parts__zero" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/search/cwls.json b/ffxiv/lodestone-css-selectors-0.52.0/search/cwls.json new file mode 100644 index 0000000..7efe25a --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/search/cwls.json @@ -0,0 +1,36 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "ID": { + "selector": ".entry__link--line", + "attribute": "href", + "regex": "/lodestone/crossworld_linkshell/(?P<ID>\\w*)/" + }, + "NAME": { + "selector": ".entry__name" + }, + "DC": { + "selector": ".entry__world" + }, + "ACTIVE_MEMBERS": { + "selector": ".entry__linkshell__member > div > span" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + }, + "NO_RESULTS_FOUND": { + "selector": ".parts__zero" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/search/freecompany.json b/ffxiv/lodestone-css-selectors-0.52.0/search/freecompany.json new file mode 100644 index 0000000..90f0bbe --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/search/freecompany.json @@ -0,0 +1,69 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "CREST_LAYERS": { + "BOTTOM": { + "selector": ".entry__freecompany__crest__image > img:nth-child(1)", + "attribute": "src" + }, + "MIDDLE": { + "selector": ".entry__freecompany__crest__image > img:nth-child(2)", + "attribute": "src" + }, + "TOP": { + "selector": ".entry__freecompany__crest__image > img:nth-child(3)", + "attribute": "src" + } + }, + "ID": { + "selector": ".entry__block", + "attribute": "href", + "regex": "/lodestone/freecompany/(?P<ID>\\d*)/" + }, + "GRAND_COMPANY": { + "selector": ".entry__world:nth-child(1)" + }, + "NAME": { + "selector": ".entry__name" + }, + "SERVER": { + "selector": ".entry__world:nth-child(3)", + "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]" + }, + "ACTIVE": { + "selector": "li.entry__freecompany__fc-active:nth-child(4)", + "regex": "Active:\\s+(?P<State>\\w*)" + }, + "ACTIVE_MEMBERS": { + "selector": ".entry__freecompany__fc-member" + }, + "RECRUITMENT_OPEN": { + "selector": "li.entry__freecompany__fc-active:nth-child(5)", + "regex": "Recruitment:\\s+(?P<State>\\w*)" + }, + "ESTATE_BUILT": { + "selector": ".entry__freecompany__fc-housing" + }, + "FORMED": { + "selector": ".entry__freecompany__fc-day > script", + "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + }, + "NO_RESULTS_FOUND": { + "selector": ".parts__zero" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/search/linkshell.json b/ffxiv/lodestone-css-selectors-0.52.0/search/linkshell.json new file mode 100644 index 0000000..f9c6bc0 --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/search/linkshell.json @@ -0,0 +1,37 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "ID": { + "selector": ".entry__link--line", + "attribute": "href", + "regex": "/lodestone/linkshell/(?P<ID>\\d*)/" + }, + "NAME": { + "selector": ".entry__name" + }, + "SERVER": { + "selector": ".entry__world", + "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]" + }, + "ACTIVE_MEMBERS": { + "selector": ".entry__linkshell__member > div > span" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + }, + "NO_RESULTS_FOUND": { + "selector": ".parts__zero" + } +} diff --git a/ffxiv/lodestone-css-selectors-0.52.0/search/pvpteam.json b/ffxiv/lodestone-css-selectors-0.52.0/search/pvpteam.json new file mode 100644 index 0000000..ae1c51d --- /dev/null +++ b/ffxiv/lodestone-css-selectors-0.52.0/search/pvpteam.json @@ -0,0 +1,47 @@ +{ + "ROOT": { + "selector": ".ldst__window" + }, + "ENTRY": { + "ROOT": { + "selector": "div.entry", + "multiple": true + }, + "CREST_LAYERS": { + "BOTTOM": { + "selector": ".entry__pvpteam__search__crest__image > img:nth-child(1)", + "attribute": "src" + }, + "MIDDLE": { + "selector": ".entry__pvpteam__search__crest__image > img:nth-child(2)", + "attribute": "src" + }, + "TOP": { + "selector": ".entry__pvpteam__search__crest__image > img:nth-child(3)", + "attribute": "src" + } + }, + "ID": { + "selector": ".entry__block", + "attribute": "href", + "regex": "/lodestone/pvpteam/(?P<ID>\\w*)/" + }, + "NAME": { + "selector": ".entry__name" + }, + "DC": { + "selector": ".entry__world" + } + }, + "PAGE_INFO": { + "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)", + "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)" + }, + "LIST_NEXT_BUTTON": { + "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)", + "attribute": "href" + }, + "NO_RESULTS_FOUND": { + "selector": ".parts__zero" + } +} diff --git a/ffxiv/pystone/__init__.py b/ffxiv/pystone/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/ffxiv/pystone/__init__.py diff --git a/ffxiv/pystone/character.py b/ffxiv/pystone/character.py new file mode 100644 index 0000000..200baeb --- /dev/null +++ b/ffxiv/pystone/character.py @@ -0,0 +1,20 @@ +from typing import List, Optional, Tuple + +from requests import Session + +from pystone.definition import Definition + + +class Character: + def __init__(self, *, definitions: List[Definition]): + self.definitions = {(x.name): x for x in definitions} + + def __getattr__(self, name): + if name in self.definitions: + return self.definitions[name] + + def to_json(self): + json = {} + for definition in self.definitions.values(): + json.update(definition.to_json()) + return json diff --git a/ffxiv/pystone/cli/client.py b/ffxiv/pystone/cli/client.py new file mode 100644 index 0000000..1f31f58 --- /dev/null +++ b/ffxiv/pystone/cli/client.py @@ -0,0 +1,6 @@ +# from sys import argv + +import pystone + +if __name__ == '__main__': + print(dir(pystone)) diff --git a/ffxiv/pystone/definition.py b/ffxiv/pystone/definition.py new file mode 100644 index 0000000..3b4c5eb --- /dev/null +++ b/ffxiv/pystone/definition.py @@ -0,0 +1,161 @@ +from pathlib import Path +from typing import Dict, Union, Generic, TypeVar, Optional +from json import loads +from re import compile + +from bs4 import BeautifulSoup +from requests import Session + +T = TypeVar('T') + + +class Reference(Generic[T]): + """Represents a reference to something which may not exist yet.""" + def __init__(self, initial_value: Optional[T] = None): + self._value = initial_value + + @property + def value(self) -> Optional[T]: + return self._value + + @value.setter + def value(self, new_value: T): + self._value = new_value + + +class Element: + """An element is something that has a selector property with other optional properties that refine that selection""" + def __init__(self, name: str, data: Dict[str, str]): + self.name = name + self.selector = data['selector'] # I want this to error + self.regex = None + self.attribute = None + + if 'regex' in data: + self.regex = compile(data['regex']) + elif 'attribute' in data: + self.attribute = data['attribute'] + + def process(self, soup: BeautifulSoup) -> str: + selection = soup.select_one(self.selector) + if self.attribute is not None: + # TODO: this is fragile; fix + try: + text = selection[self.attribute] + except TypeError: # NoneType + text = '' + else: + try: + text = selection.text + except AttributeError: # NoneType + text = '' + + if self.regex is not None: + # TODO: this is fragile; fix + try: + return self.regex.search(text).group(1) + except AttributeError: # NoneType + return '' + else: + return text + + def __repr__(self): + return f'<Element:{self.name}>' + + +class Container: + """A container contains multiple elements or even other containers""" + def __init__(self, name: str, soup_ref: Reference[BeautifulSoup] = Reference()): + self.name = name + self.entries = {} + self.soup_ref = soup_ref + self.selector_root = None + + def add(self, name: str, data: Union['Container', Element]): + # TODO: raise error on overwriting key + self.entries[name] = data + + def __getattr__(self, name): + if name in self.entries: + entry = self.entries[name] + if isinstance(entry, Element): + return entry.process(self.soup_ref.value) + return self.entries[name] + + def __iter__(self): + def internal_iterator(): + for entry in self.entries: + yield entry + return internal_iterator() + + def to_json(self): + json = {self.name: {}} + for entry in self.entries.values(): + if isinstance(entry, Element): + json[self.name].update({entry.name: entry.process(self.soup_ref.value)}) + else: # container + json[self.name].update({entry.name: entry.to_json()}) + + return json + + def set_selector_root(self, root): + self.selector_root = root + + def contains(self): + """returns a list of everything this container contains""" + return self.entries.keys() + + def __dir__(self): + return self.entries.keys() + + def __repr__(self): + return f'<Container:{self.name}>' + + +class Definition: + """Takes in a json definition file and stores its name/definition""" + def __init__(self, path: Union[str, Path], fmt_url: str, *, session: Optional[Session] = Session()): + if isinstance(path, str): + path = Path(path) + if path.suffix != '.json': + raise Exception('something is wrong.. why is this loading a non-json file?') + self.fmt_url = fmt_url + self.name = path.stem + self.tree = Container(self.name) + self.session = session + + with open(path.expanduser()) as f: + json_data = loads(f.read()) + self._build_tree(json_data, self.tree) + + def _build_tree(self, json_data, root: Container): + for k, v in json_data.items(): + if 'selector' in v: + # we're making an element to add to our container + root.add(k.lower(), Element( + k.lower(), + v + )) + else: + # build a new Container and recurse + c = Container(k.lower()) + # if 'ROOT' in k: + # selector_root = k['ROOT']['selector'] + + self._build_tree(v, root=c) + root.add(k.lower(), c) + + def process(self, vars: Dict[str, str]): + response = self.session.get( + self.fmt_url % vars + ) + response.raise_for_status() + with open(self.name + '.html', 'w', encoding='utf-8') as f: + f.write(response.text) + self.tree.soup_ref.value = BeautifulSoup(response.text, features="html.parser") + + def to_json(self): + return self.tree.to_json() + + def __getattr__(self, name): + return getattr(self.tree, name) diff --git a/ffxiv/pystone/free_company.py b/ffxiv/pystone/free_company.py new file mode 100644 index 0000000..4560fb3 --- /dev/null +++ b/ffxiv/pystone/free_company.py @@ -0,0 +1,5 @@ +from pystone.definition import Definition + +class FCDefinition(Definition): + """FC-specific implementation of a definition""" + # don't make me do this Kara
\ No newline at end of file diff --git a/ffxiv/pystone/lodestone.py b/ffxiv/pystone/lodestone.py new file mode 100644 index 0000000..3f48c2b --- /dev/null +++ b/ffxiv/pystone/lodestone.py @@ -0,0 +1,39 @@ +from typing import Union, List +from pathlib import Path +from json import loads + +from requests_cache import CachedSession as Session +# from requests import Session + +from pystone.types import MetaDict +from pystone.definition import Definition +from pystone.character import Character + +LODESTONE_BASE_URL = 'finalfantasyxiv.com/lodestone' + + +class Lodestone: + def __init__(self, *, json_base: Union[str, Path]): + if isinstance(json_base, str): + json_base = Path(json_base) + self.json_base: Path = json_base + + # read meta.json + with open(json_base / 'meta.json') as f: + self.meta: MetaDict = loads(f.read()) + self.session = Session() + # self.session.headers.update({ + # 'User-Agent': self.meta['userAgentDesktop'] + # }) + + def get_character_by_id(self, id: Union[str, int]) -> None: + profile_json_files = (self.json_base / 'profile').expanduser().glob('*.json') + definitions: List[Definition] = [] + + for profile in profile_json_files: + url = self.meta['applicableUris'][f'profile/{profile.name}'] + d = Definition(profile, url, session=self.session) + d.process({'id': str(id)}) + definitions.append(d) + + return Character(definitions=definitions) diff --git a/ffxiv/pystone/types.py b/ffxiv/pystone/types.py new file mode 100644 index 0000000..5fa7da6 --- /dev/null +++ b/ffxiv/pystone/types.py @@ -0,0 +1,11 @@ +from typing import Dict, Literal, Union, TypedDict + +LangOptions = Literal['en'] +Definition = Dict[str, Union[str, Dict[str, str]]] + + +class MetaDict(TypedDict): + version: str + userAgentDesktop: str + userAgentMobile: str + applicableUris: Dict[str, str] diff --git a/ffxiv/roles/hand.png b/ffxiv/roles/hand.png Binary files differnew file mode 100644 index 0000000..db60614 --- /dev/null +++ b/ffxiv/roles/hand.png diff --git a/ffxiv/roles/healer.png b/ffxiv/roles/healer.png Binary files differnew file mode 100644 index 0000000..224a383 --- /dev/null +++ b/ffxiv/roles/healer.png diff --git a/ffxiv/roles/land.png b/ffxiv/roles/land.png Binary files differnew file mode 100644 index 0000000..d0c2b49 --- /dev/null +++ b/ffxiv/roles/land.png diff --git a/ffxiv/roles/magic.png b/ffxiv/roles/magic.png Binary files differnew file mode 100644 index 0000000..01cebf8 --- /dev/null +++ b/ffxiv/roles/magic.png diff --git a/ffxiv/roles/melee.png b/ffxiv/roles/melee.png Binary files differnew file mode 100644 index 0000000..3a4af90 --- /dev/null +++ b/ffxiv/roles/melee.png diff --git a/ffxiv/roles/ranged.png b/ffxiv/roles/ranged.png Binary files differnew file mode 100644 index 0000000..e331709 --- /dev/null +++ b/ffxiv/roles/ranged.png diff --git a/ffxiv/roles/tank.png b/ffxiv/roles/tank.png Binary files differnew file mode 100644 index 0000000..fd80c75 --- /dev/null +++ b/ffxiv/roles/tank.png |