diff --git a/Cartfile b/Cartfile deleted file mode 100644 index d4350f1..0000000 --- a/Cartfile +++ /dev/null @@ -1,2 +0,0 @@ -github "realm/realm-cocoa" -github "danielgindi/Charts" == 3.3.0 diff --git a/Cartfile.resolved b/Cartfile.resolved deleted file mode 100644 index 3829f5e..0000000 --- a/Cartfile.resolved +++ /dev/null @@ -1,2 +0,0 @@ -github "danielgindi/Charts" "v3.3.0" -github "realm/realm-cocoa" "v3.17.3" diff --git a/TournamentStats.xcodeproj/project.pbxproj b/TournamentStats.xcodeproj/project.pbxproj index 68546b0..712b3f8 100644 --- a/TournamentStats.xcodeproj/project.pbxproj +++ b/TournamentStats.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -45,8 +45,12 @@ 4D39B6F722F8573900625E31 /* StackTableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D39B6F622F8573900625E31 /* StackTableCell.swift */; }; 4D39B6FA22F85C3400625E31 /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D39B6F922F85C3400625E31 /* UIView+Extensions.swift */; }; 4D39B6FC22F8686300625E31 /* CumulatedWins.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D39B6FB22F8686300625E31 /* CumulatedWins.swift */; }; - 4D39B6FE22F87C3700625E31 /* Charts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D39B6FD22F87C3700625E31 /* Charts.framework */; }; 4D5425CA23190EA900B16ECF /* TableSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D5425C923190EA900B16ECF /* TableSize.swift */; }; + 4D96B6902707C71B00804F9A /* Realm in Frameworks */ = {isa = PBXBuildFile; productRef = 4D96B68F2707C71B00804F9A /* Realm */; }; + 4D96B6922707C71B00804F9A /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 4D96B6912707C71B00804F9A /* RealmSwift */; }; + 4D96B69A2707CBD600804F9A /* Charts in Frameworks */ = {isa = PBXBuildFile; productRef = 4D96B6992707CBD600804F9A /* Charts */; }; + 4D96B69D2708484500804F9A /* Downloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D96B69C2708484500804F9A /* Downloader.swift */; }; + 4D96B69F27084B9700804F9A /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D96B69E27084B9700804F9A /* String+Extension.swift */; }; 4DA5CA1E22AD078A00AC628E /* CountryCounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DA5CA1D22AD078A00AC628E /* CountryCounter.swift */; }; 4DB113D72305480600D0C671 /* InfographyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4DB113D62305480600D0C671 /* InfographyView.xib */; }; 4DB113D923054A4100D0C671 /* InfographyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DB113D823054A4100D0C671 /* InfographyView.swift */; }; @@ -62,8 +66,6 @@ 4DF7609022A3FB98004B0EF1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4DF7608E22A3FB98004B0EF1 /* LaunchScreen.storyboard */; }; 4DF7609B22A3FB98004B0EF1 /* TournamentStatsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF7609A22A3FB98004B0EF1 /* TournamentStatsTests.swift */; }; 4DF760A722A3FD12004B0EF1 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF760A622A3FD12004B0EF1 /* Model.swift */; }; - 4DF760AB22A3FDED004B0EF1 /* RealmSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DF760A922A3FDED004B0EF1 /* RealmSwift.framework */; }; - 4DF760AC22A3FDED004B0EF1 /* Realm.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DF760AA22A3FDED004B0EF1 /* Realm.framework */; }; 4DF760B022A47C74004B0EF1 /* RowImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF760AF22A47C74004B0EF1 /* RowImporter.swift */; }; 4DF760B322A47CAE004B0EF1 /* Realm+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF760B222A47CAE004B0EF1 /* Realm+Extensions.swift */; }; 4DF760B522A47F6D004B0EF1 /* event2 in Resources */ = {isa = PBXBuildFile; fileRef = 4DF760B422A47F6D004B0EF1 /* event2 */; }; @@ -196,8 +198,9 @@ 4D39B6F622F8573900625E31 /* StackTableCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackTableCell.swift; sourceTree = ""; }; 4D39B6F922F85C3400625E31 /* UIView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Extensions.swift"; sourceTree = ""; }; 4D39B6FB22F8686300625E31 /* CumulatedWins.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CumulatedWins.swift; sourceTree = ""; }; - 4D39B6FD22F87C3700625E31 /* Charts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Charts.framework; path = Carthage/Build/iOS/Charts.framework; sourceTree = ""; }; 4D5425C923190EA900B16ECF /* TableSize.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableSize.swift; sourceTree = ""; }; + 4D96B69C2708484500804F9A /* Downloader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Downloader.swift; sourceTree = ""; }; + 4D96B69E27084B9700804F9A /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; }; 4DA5CA1D22AD078A00AC628E /* CountryCounter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountryCounter.swift; sourceTree = ""; }; 4DB113D62305480600D0C671 /* InfographyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = InfographyView.xib; sourceTree = ""; }; 4DB113D823054A4100D0C671 /* InfographyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfographyView.swift; sourceTree = ""; }; @@ -217,8 +220,6 @@ 4DF7609A22A3FB98004B0EF1 /* TournamentStatsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TournamentStatsTests.swift; sourceTree = ""; }; 4DF7609C22A3FB98004B0EF1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4DF760A622A3FD12004B0EF1 /* Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = ""; }; - 4DF760A922A3FDED004B0EF1 /* RealmSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RealmSwift.framework; path = Carthage/Build/iOS/RealmSwift.framework; sourceTree = ""; }; - 4DF760AA22A3FDED004B0EF1 /* Realm.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Realm.framework; path = Carthage/Build/iOS/Realm.framework; sourceTree = ""; }; 4DF760AF22A47C74004B0EF1 /* RowImporter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RowImporter.swift; sourceTree = ""; }; 4DF760B222A47CAE004B0EF1 /* Realm+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Realm+Extensions.swift"; sourceTree = ""; }; 4DF760B422A47F6D004B0EF1 /* event2 */ = {isa = PBXFileReference; lastKnownFileType = text; path = event2; sourceTree = ""; }; @@ -307,9 +308,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4DF760AB22A3FDED004B0EF1 /* RealmSwift.framework in Frameworks */, - 4DF760AC22A3FDED004B0EF1 /* Realm.framework in Frameworks */, - 4D39B6FE22F87C3700625E31 /* Charts.framework in Frameworks */, + 4D96B6902707C71B00804F9A /* Realm in Frameworks */, + 4D96B69A2707CBD600804F9A /* Charts in Frameworks */, + 4D96B6922707C71B00804F9A /* RealmSwift in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -323,6 +324,14 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 4D96B69B2708482C00804F9A /* scrapper */ = { + isa = PBXGroup; + children = ( + 4D96B69C2708484500804F9A /* Downloader.swift */, + ); + path = scrapper; + sourceTree = ""; + }; 4D97941222F827A5004A2D7F /* reports */ = { isa = PBXGroup; children = ( @@ -357,11 +366,12 @@ isa = PBXGroup; children = ( 4DF7608322A3FB96004B0EF1 /* AppDelegate.swift */, - 4DF760B622A47F72004B0EF1 /* Events */, + 4DF760B622A47F72004B0EF1 /* 2019 */, 4DF760B122A47C9E004B0EF1 /* core */, 4DF760A522A3FCF7004B0EF1 /* realm */, 4DF760C322A56207004B0EF1 /* utils */, 4DF7614422A593FC004B0EF1 /* report */, + 4D96B69B2708482C00804F9A /* scrapper */, 4DF760AF22A47C74004B0EF1 /* RowImporter.swift */, 4D0F103822C4C1C4005F797A /* ChipCountParser.swift */, 4DF760C822A56497004B0EF1 /* Seed.swift */, @@ -395,9 +405,6 @@ 4DF760A822A3FDED004B0EF1 /* Frameworks */ = { isa = PBXGroup; children = ( - 4D39B6FD22F87C3700625E31 /* Charts.framework */, - 4DF760AA22A3FDED004B0EF1 /* Realm.framework */, - 4DF760A922A3FDED004B0EF1 /* RealmSwift.framework */, ); name = Frameworks; sourceTree = ""; @@ -407,11 +414,12 @@ children = ( 4DF760B222A47CAE004B0EF1 /* Realm+Extensions.swift */, 4DF760B922A524F4004B0EF1 /* Formatters.swift */, + 4D96B69E27084B9700804F9A /* String+Extension.swift */, ); path = core; sourceTree = ""; }; - 4DF760B622A47F72004B0EF1 /* Events */ = { + 4DF760B622A47F72004B0EF1 /* 2019 */ = { isa = PBXGroup; children = ( 4DF760C422A56451004B0EF1 /* event1 */, @@ -505,7 +513,7 @@ 4D2F1C3222CC92CF007C639E /* event89 */, 4D2F1C3422CC92CF007C639E /* event90 */, ); - path = Events; + path = 2019; sourceTree = ""; }; 4DF760C022A561A8004B0EF1 /* UI */ = { @@ -585,13 +593,17 @@ 4DF7607C22A3FB96004B0EF1 /* Sources */, 4DF7607D22A3FB96004B0EF1 /* Frameworks */, 4DF7607E22A3FB96004B0EF1 /* Resources */, - 4DF760AD22A3FE04004B0EF1 /* ShellScript */, ); buildRules = ( ); dependencies = ( ); name = TournamentStats; + packageProductDependencies = ( + 4D96B68F2707C71B00804F9A /* Realm */, + 4D96B6912707C71B00804F9A /* RealmSwift */, + 4D96B6992707CBD600804F9A /* Charts */, + ); productName = TournamentStats; productReference = 4DF7608022A3FB96004B0EF1 /* TournamentStats.app */; productType = "com.apple.product-type.application"; @@ -621,7 +633,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1020; - LastUpgradeCheck = 1020; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = "Stax River"; TargetAttributes = { 4DF7607F22A3FB96004B0EF1 = { @@ -642,6 +654,10 @@ Base, ); mainGroup = 4DF7607722A3FB96004B0EF1; + packageReferences = ( + 4D96B68E2707C71B00804F9A /* XCRemoteSwiftPackageReference "realm-cocoa" */, + 4D96B6982707CBD600804F9A /* XCRemoteSwiftPackageReference "Charts" */, + ); productRefGroup = 4DF7608122A3FB96004B0EF1 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -765,29 +781,6 @@ }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXShellScriptBuildPhase section */ - 4DF760AD22A3FE04004B0EF1 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "$(SRCROOT)/Carthage/Build/iOS/Realm.framework", - "$(SRCROOT)/Carthage/Build/iOS/RealmSwift.framework", - "$(SRCROOT)/Carthage/Build/iOS/Charts.framework", - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/usr/local/bin/carthage copy-frameworks\n"; - }; -/* End PBXShellScriptBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ 4DF7607C22A3FB96004B0EF1 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -801,6 +794,8 @@ 4DF760B022A47C74004B0EF1 /* RowImporter.swift in Sources */, 4DF7614A22A66675004B0EF1 /* TournamentWinner.swift in Sources */, 4D0F103722C4C08F005F797A /* ChipCount.swift in Sources */, + 4D96B69F27084B9700804F9A /* String+Extension.swift in Sources */, + 4D96B69D2708484500804F9A /* Downloader.swift in Sources */, 4DF760B322A47CAE004B0EF1 /* Realm+Extensions.swift in Sources */, 4DF7608822A3FB96004B0EF1 /* DetailViewController.swift in Sources */, 4D26A95423156F6F001C98D2 /* Game.swift in Sources */, @@ -898,6 +893,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -923,13 +919,13 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.2; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VALIDATE_WORKSPACE = YES; }; name = Debug; }; @@ -959,6 +955,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -978,13 +975,14 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.2; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; VALIDATE_PRODUCT = YES; + VALIDATE_WORKSPACE = YES; }; name = Release; }; @@ -992,19 +990,19 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 526E96RFNP; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); INFOPLIST_FILE = TournamentStats/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); + ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = net.pokeranalytics.TournamentStats; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1014,19 +1012,19 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 526E96RFNP; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); INFOPLIST_FILE = TournamentStats/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); + ONLY_ACTIVE_ARCH = NO; PRODUCT_BUNDLE_IDENTIFIER = net.pokeranalytics.TournamentStats; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1105,6 +1103,43 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 4D96B68E2707C71B00804F9A /* XCRemoteSwiftPackageReference "realm-cocoa" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/realm/realm-cocoa.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 5.0.0; + }; + }; + 4D96B6982707CBD600804F9A /* XCRemoteSwiftPackageReference "Charts" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/danielgindi/Charts.git"; + requirement = { + branch = master; + kind = branch; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 4D96B68F2707C71B00804F9A /* Realm */ = { + isa = XCSwiftPackageProductDependency; + package = 4D96B68E2707C71B00804F9A /* XCRemoteSwiftPackageReference "realm-cocoa" */; + productName = Realm; + }; + 4D96B6912707C71B00804F9A /* RealmSwift */ = { + isa = XCSwiftPackageProductDependency; + package = 4D96B68E2707C71B00804F9A /* XCRemoteSwiftPackageReference "realm-cocoa" */; + productName = RealmSwift; + }; + 4D96B6992707CBD600804F9A /* Charts */ = { + isa = XCSwiftPackageProductDependency; + package = 4D96B6982707CBD600804F9A /* XCRemoteSwiftPackageReference "Charts" */; + productName = Charts; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 4DF7607822A3FB96004B0EF1 /* Project object */; } diff --git a/TournamentStats.xcodeproj/xcuserdata/laurent.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/TournamentStats.xcodeproj/xcuserdata/laurent.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 2c111f2..95423a0 100644 --- a/TournamentStats.xcodeproj/xcuserdata/laurent.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/TournamentStats.xcodeproj/xcuserdata/laurent.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -1,11 +1,13 @@ @@ -14,6 +16,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TournamentStats.xcodeproj/xcuserdata/laurent.xcuserdatad/xcschemes/xcschememanagement.plist b/TournamentStats.xcodeproj/xcuserdata/laurent.xcuserdatad/xcschemes/xcschememanagement.plist index c671c5d..bd15700 100644 --- a/TournamentStats.xcodeproj/xcuserdata/laurent.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/TournamentStats.xcodeproj/xcuserdata/laurent.xcuserdatad/xcschemes/xcschememanagement.plist @@ -4,11 +4,87 @@ SchemeUserState - TournamentStats.xcscheme_^#shared#^_ + GettingStarted (Playground) 1.xcscheme + isShown + + orderHint + 2 + + GettingStarted (Playground) 2.xcscheme + + isShown + + orderHint + 3 + + GettingStarted (Playground).xcscheme + + isShown + orderHint 0 + PlaygroundChart (Playground) 1.xcscheme + + isShown + + orderHint + 5 + + PlaygroundChart (Playground) 2.xcscheme + + isShown + + orderHint + 6 + + PlaygroundChart (Playground) 3.xcscheme + + isShown + + orderHint + 7 + + PlaygroundChart (Playground) 4.xcscheme + + isShown + + orderHint + 8 + + PlaygroundChart (Playground) 5.xcscheme + + isShown + + orderHint + 9 + + PlaygroundChart (Playground).xcscheme + + isShown + + orderHint + 4 + + TournamentStats.xcscheme_^#shared#^_ + + orderHint + 1 + + + SuppressBuildableAutocreation + + 4DF7607F22A3FB96004B0EF1 + + primary + + + 4DF7609522A3FB98004B0EF1 + + primary + + diff --git a/TournamentStats/Events/event1 b/TournamentStats/2019/event1 similarity index 100% rename from TournamentStats/Events/event1 rename to TournamentStats/2019/event1 diff --git a/TournamentStats/Events/event10 b/TournamentStats/2019/event10 similarity index 100% rename from TournamentStats/Events/event10 rename to TournamentStats/2019/event10 diff --git a/TournamentStats/Events/event11 b/TournamentStats/2019/event11 similarity index 100% rename from TournamentStats/Events/event11 rename to TournamentStats/2019/event11 diff --git a/TournamentStats/Events/event12 b/TournamentStats/2019/event12 similarity index 100% rename from TournamentStats/Events/event12 rename to TournamentStats/2019/event12 diff --git a/TournamentStats/Events/event13 b/TournamentStats/2019/event13 similarity index 100% rename from TournamentStats/Events/event13 rename to TournamentStats/2019/event13 diff --git a/TournamentStats/Events/event14 b/TournamentStats/2019/event14 similarity index 100% rename from TournamentStats/Events/event14 rename to TournamentStats/2019/event14 diff --git a/TournamentStats/Events/event15 b/TournamentStats/2019/event15 similarity index 100% rename from TournamentStats/Events/event15 rename to TournamentStats/2019/event15 diff --git a/TournamentStats/Events/event16 b/TournamentStats/2019/event16 similarity index 100% rename from TournamentStats/Events/event16 rename to TournamentStats/2019/event16 diff --git a/TournamentStats/Events/event17 b/TournamentStats/2019/event17 similarity index 100% rename from TournamentStats/Events/event17 rename to TournamentStats/2019/event17 diff --git a/TournamentStats/Events/event18 b/TournamentStats/2019/event18 similarity index 100% rename from TournamentStats/Events/event18 rename to TournamentStats/2019/event18 diff --git a/TournamentStats/Events/event19 b/TournamentStats/2019/event19 similarity index 100% rename from TournamentStats/Events/event19 rename to TournamentStats/2019/event19 diff --git a/TournamentStats/Events/event2 b/TournamentStats/2019/event2 similarity index 100% rename from TournamentStats/Events/event2 rename to TournamentStats/2019/event2 diff --git a/TournamentStats/Events/event20 b/TournamentStats/2019/event20 similarity index 100% rename from TournamentStats/Events/event20 rename to TournamentStats/2019/event20 diff --git a/TournamentStats/Events/event21 b/TournamentStats/2019/event21 similarity index 100% rename from TournamentStats/Events/event21 rename to TournamentStats/2019/event21 diff --git a/TournamentStats/Events/event22 b/TournamentStats/2019/event22 similarity index 100% rename from TournamentStats/Events/event22 rename to TournamentStats/2019/event22 diff --git a/TournamentStats/Events/event23 b/TournamentStats/2019/event23 similarity index 100% rename from TournamentStats/Events/event23 rename to TournamentStats/2019/event23 diff --git a/TournamentStats/Events/event24 b/TournamentStats/2019/event24 similarity index 100% rename from TournamentStats/Events/event24 rename to TournamentStats/2019/event24 diff --git a/TournamentStats/Events/event25 b/TournamentStats/2019/event25 similarity index 100% rename from TournamentStats/Events/event25 rename to TournamentStats/2019/event25 diff --git a/TournamentStats/Events/event26 b/TournamentStats/2019/event26 similarity index 100% rename from TournamentStats/Events/event26 rename to TournamentStats/2019/event26 diff --git a/TournamentStats/Events/event27 b/TournamentStats/2019/event27 similarity index 100% rename from TournamentStats/Events/event27 rename to TournamentStats/2019/event27 diff --git a/TournamentStats/Events/event28 b/TournamentStats/2019/event28 similarity index 100% rename from TournamentStats/Events/event28 rename to TournamentStats/2019/event28 diff --git a/TournamentStats/Events/event29 b/TournamentStats/2019/event29 similarity index 100% rename from TournamentStats/Events/event29 rename to TournamentStats/2019/event29 diff --git a/TournamentStats/Events/event3 b/TournamentStats/2019/event3 similarity index 100% rename from TournamentStats/Events/event3 rename to TournamentStats/2019/event3 diff --git a/TournamentStats/Events/event30 b/TournamentStats/2019/event30 similarity index 100% rename from TournamentStats/Events/event30 rename to TournamentStats/2019/event30 diff --git a/TournamentStats/Events/event31 b/TournamentStats/2019/event31 similarity index 100% rename from TournamentStats/Events/event31 rename to TournamentStats/2019/event31 diff --git a/TournamentStats/Events/event32 b/TournamentStats/2019/event32 similarity index 100% rename from TournamentStats/Events/event32 rename to TournamentStats/2019/event32 diff --git a/TournamentStats/Events/event33 b/TournamentStats/2019/event33 similarity index 100% rename from TournamentStats/Events/event33 rename to TournamentStats/2019/event33 diff --git a/TournamentStats/Events/event34 b/TournamentStats/2019/event34 similarity index 100% rename from TournamentStats/Events/event34 rename to TournamentStats/2019/event34 diff --git a/TournamentStats/Events/event35 b/TournamentStats/2019/event35 similarity index 100% rename from TournamentStats/Events/event35 rename to TournamentStats/2019/event35 diff --git a/TournamentStats/Events/event36 b/TournamentStats/2019/event36 similarity index 100% rename from TournamentStats/Events/event36 rename to TournamentStats/2019/event36 diff --git a/TournamentStats/Events/event37 b/TournamentStats/2019/event37 similarity index 100% rename from TournamentStats/Events/event37 rename to TournamentStats/2019/event37 diff --git a/TournamentStats/Events/event38 b/TournamentStats/2019/event38 similarity index 100% rename from TournamentStats/Events/event38 rename to TournamentStats/2019/event38 diff --git a/TournamentStats/Events/event39 b/TournamentStats/2019/event39 similarity index 100% rename from TournamentStats/Events/event39 rename to TournamentStats/2019/event39 diff --git a/TournamentStats/Events/event4 b/TournamentStats/2019/event4 similarity index 100% rename from TournamentStats/Events/event4 rename to TournamentStats/2019/event4 diff --git a/TournamentStats/Events/event40 b/TournamentStats/2019/event40 similarity index 100% rename from TournamentStats/Events/event40 rename to TournamentStats/2019/event40 diff --git a/TournamentStats/Events/event41 b/TournamentStats/2019/event41 similarity index 100% rename from TournamentStats/Events/event41 rename to TournamentStats/2019/event41 diff --git a/TournamentStats/Events/event42 b/TournamentStats/2019/event42 similarity index 100% rename from TournamentStats/Events/event42 rename to TournamentStats/2019/event42 diff --git a/TournamentStats/Events/event43 b/TournamentStats/2019/event43 similarity index 100% rename from TournamentStats/Events/event43 rename to TournamentStats/2019/event43 diff --git a/TournamentStats/Events/event44 b/TournamentStats/2019/event44 similarity index 100% rename from TournamentStats/Events/event44 rename to TournamentStats/2019/event44 diff --git a/TournamentStats/Events/event45 b/TournamentStats/2019/event45 similarity index 100% rename from TournamentStats/Events/event45 rename to TournamentStats/2019/event45 diff --git a/TournamentStats/Events/event46 b/TournamentStats/2019/event46 similarity index 100% rename from TournamentStats/Events/event46 rename to TournamentStats/2019/event46 diff --git a/TournamentStats/Events/event47 b/TournamentStats/2019/event47 similarity index 100% rename from TournamentStats/Events/event47 rename to TournamentStats/2019/event47 diff --git a/TournamentStats/Events/event48 b/TournamentStats/2019/event48 similarity index 100% rename from TournamentStats/Events/event48 rename to TournamentStats/2019/event48 diff --git a/TournamentStats/Events/event49 b/TournamentStats/2019/event49 similarity index 100% rename from TournamentStats/Events/event49 rename to TournamentStats/2019/event49 diff --git a/TournamentStats/Events/event5 b/TournamentStats/2019/event5 similarity index 100% rename from TournamentStats/Events/event5 rename to TournamentStats/2019/event5 diff --git a/TournamentStats/Events/event50 b/TournamentStats/2019/event50 similarity index 100% rename from TournamentStats/Events/event50 rename to TournamentStats/2019/event50 diff --git a/TournamentStats/Events/event51 b/TournamentStats/2019/event51 similarity index 100% rename from TournamentStats/Events/event51 rename to TournamentStats/2019/event51 diff --git a/TournamentStats/Events/event52 b/TournamentStats/2019/event52 similarity index 100% rename from TournamentStats/Events/event52 rename to TournamentStats/2019/event52 diff --git a/TournamentStats/Events/event53 b/TournamentStats/2019/event53 similarity index 100% rename from TournamentStats/Events/event53 rename to TournamentStats/2019/event53 diff --git a/TournamentStats/Events/event54 b/TournamentStats/2019/event54 similarity index 100% rename from TournamentStats/Events/event54 rename to TournamentStats/2019/event54 diff --git a/TournamentStats/Events/event55 b/TournamentStats/2019/event55 similarity index 100% rename from TournamentStats/Events/event55 rename to TournamentStats/2019/event55 diff --git a/TournamentStats/Events/event56 b/TournamentStats/2019/event56 similarity index 100% rename from TournamentStats/Events/event56 rename to TournamentStats/2019/event56 diff --git a/TournamentStats/Events/event57 b/TournamentStats/2019/event57 similarity index 100% rename from TournamentStats/Events/event57 rename to TournamentStats/2019/event57 diff --git a/TournamentStats/Events/event58 b/TournamentStats/2019/event58 similarity index 100% rename from TournamentStats/Events/event58 rename to TournamentStats/2019/event58 diff --git a/TournamentStats/Events/event59 b/TournamentStats/2019/event59 similarity index 100% rename from TournamentStats/Events/event59 rename to TournamentStats/2019/event59 diff --git a/TournamentStats/Events/event6 b/TournamentStats/2019/event6 similarity index 100% rename from TournamentStats/Events/event6 rename to TournamentStats/2019/event6 diff --git a/TournamentStats/Events/event60 b/TournamentStats/2019/event60 similarity index 100% rename from TournamentStats/Events/event60 rename to TournamentStats/2019/event60 diff --git a/TournamentStats/Events/event61 b/TournamentStats/2019/event61 similarity index 100% rename from TournamentStats/Events/event61 rename to TournamentStats/2019/event61 diff --git a/TournamentStats/Events/event62 b/TournamentStats/2019/event62 similarity index 100% rename from TournamentStats/Events/event62 rename to TournamentStats/2019/event62 diff --git a/TournamentStats/Events/event63 b/TournamentStats/2019/event63 similarity index 100% rename from TournamentStats/Events/event63 rename to TournamentStats/2019/event63 diff --git a/TournamentStats/Events/event64 b/TournamentStats/2019/event64 similarity index 100% rename from TournamentStats/Events/event64 rename to TournamentStats/2019/event64 diff --git a/TournamentStats/Events/event65 b/TournamentStats/2019/event65 similarity index 100% rename from TournamentStats/Events/event65 rename to TournamentStats/2019/event65 diff --git a/TournamentStats/Events/event66 b/TournamentStats/2019/event66 similarity index 100% rename from TournamentStats/Events/event66 rename to TournamentStats/2019/event66 diff --git a/TournamentStats/Events/event67 b/TournamentStats/2019/event67 similarity index 100% rename from TournamentStats/Events/event67 rename to TournamentStats/2019/event67 diff --git a/TournamentStats/Events/event68 b/TournamentStats/2019/event68 similarity index 100% rename from TournamentStats/Events/event68 rename to TournamentStats/2019/event68 diff --git a/TournamentStats/Events/event69 b/TournamentStats/2019/event69 similarity index 100% rename from TournamentStats/Events/event69 rename to TournamentStats/2019/event69 diff --git a/TournamentStats/Events/event7 b/TournamentStats/2019/event7 similarity index 100% rename from TournamentStats/Events/event7 rename to TournamentStats/2019/event7 diff --git a/TournamentStats/Events/event70 b/TournamentStats/2019/event70 similarity index 100% rename from TournamentStats/Events/event70 rename to TournamentStats/2019/event70 diff --git a/TournamentStats/Events/event71 b/TournamentStats/2019/event71 similarity index 100% rename from TournamentStats/Events/event71 rename to TournamentStats/2019/event71 diff --git a/TournamentStats/Events/event72 b/TournamentStats/2019/event72 similarity index 100% rename from TournamentStats/Events/event72 rename to TournamentStats/2019/event72 diff --git a/TournamentStats/Events/event73 b/TournamentStats/2019/event73 similarity index 100% rename from TournamentStats/Events/event73 rename to TournamentStats/2019/event73 diff --git a/TournamentStats/Events/event74 b/TournamentStats/2019/event74 similarity index 100% rename from TournamentStats/Events/event74 rename to TournamentStats/2019/event74 diff --git a/TournamentStats/Events/event75 b/TournamentStats/2019/event75 similarity index 100% rename from TournamentStats/Events/event75 rename to TournamentStats/2019/event75 diff --git a/TournamentStats/Events/event76 b/TournamentStats/2019/event76 similarity index 100% rename from TournamentStats/Events/event76 rename to TournamentStats/2019/event76 diff --git a/TournamentStats/Events/event77 b/TournamentStats/2019/event77 similarity index 100% rename from TournamentStats/Events/event77 rename to TournamentStats/2019/event77 diff --git a/TournamentStats/Events/event78 b/TournamentStats/2019/event78 similarity index 100% rename from TournamentStats/Events/event78 rename to TournamentStats/2019/event78 diff --git a/TournamentStats/Events/event79 b/TournamentStats/2019/event79 similarity index 100% rename from TournamentStats/Events/event79 rename to TournamentStats/2019/event79 diff --git a/TournamentStats/Events/event8 b/TournamentStats/2019/event8 similarity index 100% rename from TournamentStats/Events/event8 rename to TournamentStats/2019/event8 diff --git a/TournamentStats/Events/event80 b/TournamentStats/2019/event80 similarity index 100% rename from TournamentStats/Events/event80 rename to TournamentStats/2019/event80 diff --git a/TournamentStats/Events/event81 b/TournamentStats/2019/event81 similarity index 100% rename from TournamentStats/Events/event81 rename to TournamentStats/2019/event81 diff --git a/TournamentStats/Events/event82 b/TournamentStats/2019/event82 similarity index 100% rename from TournamentStats/Events/event82 rename to TournamentStats/2019/event82 diff --git a/TournamentStats/Events/event83 b/TournamentStats/2019/event83 similarity index 100% rename from TournamentStats/Events/event83 rename to TournamentStats/2019/event83 diff --git a/TournamentStats/Events/event84 b/TournamentStats/2019/event84 similarity index 100% rename from TournamentStats/Events/event84 rename to TournamentStats/2019/event84 diff --git a/TournamentStats/Events/event85 b/TournamentStats/2019/event85 similarity index 100% rename from TournamentStats/Events/event85 rename to TournamentStats/2019/event85 diff --git a/TournamentStats/Events/event86 b/TournamentStats/2019/event86 similarity index 100% rename from TournamentStats/Events/event86 rename to TournamentStats/2019/event86 diff --git a/TournamentStats/Events/event87 b/TournamentStats/2019/event87 similarity index 100% rename from TournamentStats/Events/event87 rename to TournamentStats/2019/event87 diff --git a/TournamentStats/Events/event88 b/TournamentStats/2019/event88 similarity index 100% rename from TournamentStats/Events/event88 rename to TournamentStats/2019/event88 diff --git a/TournamentStats/Events/event89 b/TournamentStats/2019/event89 similarity index 100% rename from TournamentStats/Events/event89 rename to TournamentStats/2019/event89 diff --git a/TournamentStats/Events/event9 b/TournamentStats/2019/event9 similarity index 100% rename from TournamentStats/Events/event9 rename to TournamentStats/2019/event9 diff --git a/TournamentStats/Events/event90 b/TournamentStats/2019/event90 similarity index 100% rename from TournamentStats/Events/event90 rename to TournamentStats/2019/event90 diff --git a/TournamentStats/AppDelegate.swift b/TournamentStats/AppDelegate.swift index ff80ede..0e75cad 100644 --- a/TournamentStats/AppDelegate.swift +++ b/TournamentStats/AppDelegate.swift @@ -15,7 +15,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // for fontFamilyName in UIFont.familyNames { @@ -34,13 +33,29 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele // Data - let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] - print("documents = \(documentsPath)") - var config = Realm.Configuration() config.deleteRealmIfMigrationNeeded = true Realm.Configuration.defaultConfiguration = config +// launchReports() + + let realm = try! Realm() + try! realm.write { + realm.deleteAll() + } + + Downloader.downloadWSOPResults() + + let generator = ReportGenerator() + generator.generate() + + let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] + print("documents = \(documentsPath)") + + return true + } + + func launchReports() { print("start report generation...") let s = Date() let generator = ReportGenerator() @@ -76,6 +91,25 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele // } return true + if let infographyView = Bundle.main.loadNibNamed("InfographyView", owner: self, options: nil)?.first as? InfographyView { + infographyView.generator = generator + + if let imageData = infographyView.toImage()?.pngData() { + + guard let directory = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) as NSURL else { + return + } + + do { + try imageData.write(to: directory.appendingPathComponent("infography.png")!) + } catch { + print(error.localizedDescription) + } + + } + + } + } func applicationWillResignActive(_ application: UIApplication) { diff --git a/TournamentStats/ChipCountParser.swift b/TournamentStats/ChipCountParser.swift index a2fb1f4..9a34552 100644 --- a/TournamentStats/ChipCountParser.swift +++ b/TournamentStats/ChipCountParser.swift @@ -43,7 +43,6 @@ class ChipCountParser { print("could not find path for chipcount") } - } return ccm } diff --git a/TournamentStats/NotablePlayers.swift b/TournamentStats/NotablePlayers.swift index 4ab6673..46d4fd7 100644 --- a/TournamentStats/NotablePlayers.swift +++ b/TournamentStats/NotablePlayers.swift @@ -96,7 +96,15 @@ class NotablePlayers { "Mike Leah", "Joao Vieira", "Tony Dunst", - "Jonathan Little" + "Jonathan Little", + "Michael Addamo", + "Vanessa Kade", + "Marle Cordeiro", + "Jen Shahade", + "Jamie Kerstetter", + "Xuan Liu", + "Michael Gathy", + "Andrew Neeme" ] } diff --git a/TournamentStats/RowImporter.swift b/TournamentStats/RowImporter.swift index 917da40..b0604fd 100644 --- a/TournamentStats/RowImporter.swift +++ b/TournamentStats/RowImporter.swift @@ -112,8 +112,7 @@ class RowImporter { state = row case .country: country = row - let notable: Bool = NotablePlayers.all.contains(playerName) - player = realm.getOrCreatePlayer(name: playerName, city: city, state: state, country: country, notable: notable) + player = realm.getOrCreatePlayer(name: playerName, city: city, state: state, country: country) result?.player = player } diff --git a/TournamentStats/UI/MasterViewController.swift b/TournamentStats/UI/MasterViewController.swift index 71a40c1..ef12237 100644 --- a/TournamentStats/UI/MasterViewController.swift +++ b/TournamentStats/UI/MasterViewController.swift @@ -16,7 +16,7 @@ class MasterViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() - self.ccManager = ChipCountParser.start() +// self.ccManager = ChipCountParser.start() // Do any additional setup after loading the view. navigationItem.leftBarButtonItem = editButtonItem diff --git a/TournamentStats/UI/components/PieChart.swift b/TournamentStats/UI/components/PieChart.swift index 54c5d1f..3936903 100644 --- a/TournamentStats/UI/components/PieChart.swift +++ b/TournamentStats/UI/components/PieChart.swift @@ -7,6 +7,7 @@ // import Foundation +import UIKit import Charts class PieChart : PieChartView { diff --git a/TournamentStats/core/Formatters.swift b/TournamentStats/core/Formatters.swift index 1355bbc..bc14c32 100644 --- a/TournamentStats/core/Formatters.swift +++ b/TournamentStats/core/Formatters.swift @@ -17,6 +17,10 @@ extension Locale { } } + func validCountryCode(code: String) -> Bool { + return NSLocale.isoCountryCodes.contains(code) + } + func flagoji(from countryName: String) -> String? { var adaptedCountryName = countryName @@ -29,7 +33,12 @@ extension Locale { break } - if let countryCode = self.countryCode(from: adaptedCountryName) { + var code: String? = self.countryCode(from: adaptedCountryName) + if code == nil && self.validCountryCode(code: countryName) { + code = countryName + } + + if let countryCode = code { let base : UInt32 = 127397 var s = "" for v in countryCode.uppercased().unicodeScalars { diff --git a/TournamentStats/core/Realm+Extensions.swift b/TournamentStats/core/Realm+Extensions.swift index 8ea8fd7..1d5412e 100644 --- a/TournamentStats/core/Realm+Extensions.swift +++ b/TournamentStats/core/Realm+Extensions.swift @@ -26,7 +26,7 @@ extension Realm { return new } - func getOrCreatePlayer(name: String, city: String, state: String, country: String, notable: Bool = false) -> Player { + func getOrCreatePlayer(name: String, city: String, state: String, country: String) -> Player { let items = self.objects(Player.self).filter("name = %@ && state = %@ && country = %@", name, state, country) if let item = items.first { return item @@ -36,7 +36,7 @@ extension Realm { new.city = city new.country = country new.state = state - new.notable = notable + new.notable = NotablePlayers.all.contains(name) return new } diff --git a/TournamentStats/core/String+Extension.swift b/TournamentStats/core/String+Extension.swift new file mode 100644 index 0000000..a109eff --- /dev/null +++ b/TournamentStats/core/String+Extension.swift @@ -0,0 +1,22 @@ +// +// String+Extension.swift +// TournamentStats +// +// Created by Laurent Morvillier on 02/10/2021. +// Copyright © 2021 Stax River. All rights reserved. +// + +import Foundation + +extension String { + + func slice(from: String, to: String) -> String? { + + return (range(of: from)?.upperBound).flatMap { substringFrom in + (range(of: to, range: substringFrom..", to: "
") + ?? string.slice(from: "
", to: "eventinfo-progress") + ?? string.slice(from: "
", to: "eventstats") + + if let infos = infos { + + var tournament: Tournament? = currentTournament + + if tournament == nil { + let tour = realm.create(Tournament.self) + tournament = tour + + if let name = infos.slice(from: "

", to: "

") { + tour.name = name + tour.date = Formatter.basicDate.date(from: date) ?? Date() + + if let strNumber = name.slice(from: "Event #", to: ":"), let number = nf.number(from: strNumber) { + tour.number = number.intValue + } + + if name.contains("6-Handed") { + tour.tableSize = 6 + } else if name.contains("8-Handed") { + tour.tableSize = 8 + } else if name.contains("Heads-Up") { + tour.tableSize = 2 + } + + } else { + print("no name = \(infos)") + } + + if let stats = string.slice(from: "
    ", to: "
    ") { + + if let strBuyin = stats.slice(from: "Buy-in: $", to: ""), let buyin = nf.number(from: strBuyin) { + tour.buyin = buyin.intValue + } else { + print("no buyin = \(stats)") + } + + if let strprizepool = stats.slice(from: "Prizepool: $", to: " "), let pp = nf.number(from: strprizepool) { + tour.prizepool = pp.doubleValue + } else { + print("no prizepool = \(stats)") + } + + if let strentries = stats.slice(from: "Entries: ", to: " "), let entries = nf.number(from: strentries) { + tour.entries = entries.intValue + } else { + print("no entries = \(stats)") + } + } + + } + + if let strresultsblock = string.slice(from: "Country", to: "
    ").last { + name = nameraw.replacingOccurrences(of: "", with: "") + } + + if let earningsraw = cells[2].components(separatedBy: "$").last { + let strearnings = earningsraw.replacingOccurrences(of: "", with: "") + earnings = nf.number(from: strearnings)?.doubleValue + } + + if hasPOY, let poyraw = cells[3].components(separatedBy: "\'>").last { + let strpoy = poyraw.replacingOccurrences(of: "", with: "") + poy = nf.number(from: strpoy)?.doubleValue + } + + let cityIndex = hasPOY ? 4 : 3 + if let cityraw = cells[cityIndex].components(separatedBy: "\'>").last { + city = cityraw.replacingOccurrences(of: "", with: "") + } + + let stateIndex = hasPOY ? 5 : 4 + if let stateraw + = cells[stateIndex].components(separatedBy: "\'>").last { + state = stateraw.replacingOccurrences(of: "", with: "") + } + let countryIndex = hasPOY ? 6 : 5 + if let countryraw + = cells[countryIndex].components(separatedBy: "\'>").last { + country = String(countryraw.prefix(2)) + } + + guard let rank = rank, let name = name, let earnings = earnings else { + print("Missing data: R: \(rank), N: \(name), E: \(earnings)") + continue + } + + let player = realm.getOrCreatePlayer(name: name, city: city ?? "", state: state ?? "", country: country ?? "") + + let result = realm.create(Result.self) + result.player = player + result.earnings = earnings + result.rank = rank + + tournament?.results.append(result) + + } + + if currentTournament == nil, let paging = string.slice(from: "
    ") { + + let pages = paging.components(separatedBy: "